I2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8dS1ib290L3NoYTI1Ni5oPgoKCi8vI2RlZmluZSAgVVNFX0ZPUl9ORVdNQU4KLy8jZGVmaW5lIFVTRV9GT1JfVUJPT1RfMjAxOAojaWZkZWYgVVNFX0ZPUl9ORVdNQU4KCmludCBzZXRlbnYoY29uc3QgY2hhciAqdmFybmFtZSwgY29uc3QgY2hhciAqdmFydmFsdWUpCnsKcmV0dXJuIDE7Cn0KCmNoYXIgKmdldGVudihjb25zdCBjaGFyICpuYW1lKQp7CglyZXR1cm4gTlVMTDsKfQoKI2VuZGlmCiNkZWZpbmUgRFdDX0FDX1BJTk1VWF9UT1RBTAkJCQkJCTI4CiNkZWZpbmUgRFdDX0RGSV9QSU5NVVhfVE9UQUwJCQkJCTI2CgovLyNkZWZpbmUgRERSX1VTRV9ERUZJTkVfVEVNUExBVEVfQ09ORklHICAgMQojZGVmaW5lIEREUl9TVElDS1lfTUFHSUNfTlVNQkVSCQkJCQkweDIwMTgwMDAwCiNkZWZpbmUgRERSX0NISVBfSUQJCQkJCQkJCTB4MzAKI2RlZmluZSBERFJfU1RJQ0tZX1NPVVJDRV9ETUNfU1RJQ0tZCQkJMHgxCiNkZWZpbmUgRERSX1NUSUNLWV9TT1VSQ0VfU1JBTQkJCQkJMHgyCgojZGVmaW5lIEREUl9TVElDS1lfT1ZFUlJJREVfQ09ORklHX01FU1NBR0VfQ01ECTB4MSAvL292ZXJyaWRlIGNvbmZpZwojZGVmaW5lIEREUl9TVElDS1lfU1BFQ0lBTF9GVU5DVElPTl9DTUQJCQkweDIgLy9zcGVjaWFsIHRlc3Qgc3VjaCBhcyBzaGlmdCBzb21lIGJkbHIgb3IgcGFyYW1ldGVyIG9yIGludGVybGVhdmUgdGVzdAoKI2RlZmluZSBERFJfSU5JVF9DT05GSUdfU1RJQ0tZX01FU1NBR0VfU1JBTV9BRERSRVNTCTB4MDAwNDAwMDAKI2RlZmluZSBERFJfSU5JVF9DT05GSUdfR0xPQkFMX01FU1NBR0VfU1JBTV9BRERSRVNTCTB4MDAwNTAwMDAKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSMwkJCQkwCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0REUjQJCQkJMQojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjQJCQkJMgojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjMJCQkJMwojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjIJCQkJNAovLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNFgJCQkJNQojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9BVVRPCQkJCTB4ZgojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9BVVRPX0xJTUlUCQkJQ09ORklHX0REUl9UWVBFX0REUjQKCiNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfQ0gwCQkJCTB4MQojZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX1JBTkswMV9DSDAJCTB4NAojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMAkJCTB4MgojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAxCQkweDMKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMF9DSDAJMHg1CiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzAxX0NIMAkweDYKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwCQkweDcKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMF9DSDAxCQkweDgKCgpzdGF0aWMgdWludDMyX3QgZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4KQp7Cgl1aW50MzJfdCByZWFkX3ZhbHVlPTA7Cgl1aW50MzJfdCBhZGRyX3Q9MDsKCXVpbnQzMl90IG9mZnNldD0wOwoJaWYgKHNpemUgPT0gOCkgewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCU0KTw8Myk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjIpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJcmVhZF92YWx1ZT0ocmVhZF92YWx1ZT4+b2Zmc2V0KSYweGZmOwoKCX0KCWlmIChzaXplID09IDE2KSB7CgkJb2Zmc2V0PSgob2Zmc2V0X2luZGV4JTIpPDw0KTsKCQlhZGRyX3Q9KGJhc2VfYWRkcisoKG9mZnNldF9pbmRleD4+MSkgPDwgMikpOwoJCXJlYWRfdmFsdWU9ICgqKHZvbGF0aWxlIHVpbnQzMl90ICopKCggdW5zaWduZWQgbG9uZyApKGFkZHJfdCkpKTsKCQlyZWFkX3ZhbHVlPShyZWFkX3ZhbHVlPj5vZmZzZXQpJjB4ZmZmZjsKCX0KCXJldHVybiByZWFkX3ZhbHVlOwoKfQpzdGF0aWMgdWludDMyX3QgZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4LHVpbnQzMl90IHZhbHVlKQp7Cgl1aW50MzJfdCByZWFkX3ZhbHVlPTA7Cgl1aW50MzJfdCB3cml0ZV92YWx1ZT0wOwoJdWludDMyX3QgYWRkcl90PTA7Cgl1aW50MzJfdCBvZmZzZXQ9MDsKCWlmIChzaXplID09IDgpIHsKCQlvZmZzZXQ9KChvZmZzZXRfaW5kZXglNCk8PDMpOwoJCWFkZHJfdD0oYmFzZV9hZGRyKygob2Zmc2V0X2luZGV4Pj4yKSA8PCAyKSk7CgkJcmVhZF92YWx1ZT0gKCoodm9sYXRpbGUgdWludDMyX3QgKikoKCB1bnNpZ25lZCBsb25nICkoYWRkcl90KSkpOwoJCXdyaXRlX3ZhbHVlPSh2YWx1ZTw8b2Zmc2V0KXwocmVhZF92YWx1ZSYofigweGZmPDxvZmZzZXQpKSk7Cgl9CglpZiAoc2l6ZSA9PSAxNikgewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCUyKTw8NCk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjEpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJd3JpdGVfdmFsdWU9KHZhbHVlPDxvZmZzZXQpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8b2Zmc2V0KSkpOwoJfQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKT13cml0ZV92YWx1ZTsKCXJldHVybiB3cml0ZV92YWx1ZTsKfQp0eXBlZGVmIHN0cnVjdCBkZHJfc2V0ewoJdW5zaWduZWQJaW50CQltYWdpYzsKCXVuc2lnbmVkCWNoYXIJZmFzdF9ib290WzRdOy8vIDAgICBmYXN0Ym9vdCBlbmFibGUgIDEgd2luZG93IHRlc3QgbWFyZ2luICAyIGF1dG8gb2Zmc2V0IGFmdGVyIHdpbmRvdyB0ZXN0IDMgYXV0byB3aW5kb3cgdGVzdAovLwl1bnNpZ25lZAlpbnQJCXJzdl9pbnQwOwoJdW5zaWduZWQJY2hhcglib2FyZF9pZDsKCS8vYm9hcmQgaWQgcmVzZXJ2ZSwsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcgl2ZXJzaW9uOwoJLy8gZmlybXdhcmUgcmVzZXJ2ZSB2ZXJzaW9uLCxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCURyYW1UeXBlOwoJLy9zdXBwb3J0IERyYW1UeXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFIzCQkJCTAKCS8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSNAkJCQkxCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNAkJCQkyCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMwkJCQkzCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMgkJCQk0Cgl1bnNpZ25lZAljaGFyCURpc2FibGVkRGJ5dGU7CgkvL3VzZSBmb3IgZHJhbSBidXMgMTZiaXQgb3IgMzJiaXQsaWYgdXNlIDE2Yml0IG1vZGUgLHNob3VsZCBkaXNhYmxlIGJpdCAyLDMKCS8vYml0IDAgLS0tdXNlIGJ5dGUgMCAsMSBkaXNhYmxlIGJ5dGUgMCwKCS8vYml0IDEgLS0tdXNlIGJ5dGUgMSAsMSBkaXNhYmxlIGJ5dGUgMSwKCS8vYml0IDIgLS0tdXNlIGJ5dGUgMiAsMSBkaXNhYmxlIGJ5dGUgMiwKCS8vYml0IDMgLS0tdXNlIGJ5dGUgMyAsMSBkaXNhYmxlIGJ5dGUgMywKCXVuc2lnbmVkCWNoYXIJSXMyVHRpbWluZzsKCS8vZGRyMy9kZHIzIHVzZSAydCB0aW1pbmcsbm93IG9ubHkgc3VwcG9ydCAydCB0aW1taW5nCgl1bnNpZ25lZAljaGFyCUhkdEN0cmw7CgkvL3RyYWluaW5nIGluZm9ybWF0aW9uIGNvbnRyb2wsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkcmFtX3JhbmtfY29uZmlnOwoJLy9zdXBwb3J0IERyYW0gY29ubmVjdGlvbiB0eXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX0NIMAkJCQkweDEgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMTZiaXQgb25seSB1c2UgY3MwCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfUkFOSzAxX0NIMAkJMHg0ICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDE2Yml0ICB1c2UgY3MwIGNzMQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMAkJCTB4MiAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNzMAoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAxCQkweDMgICAgLy9vbmx5IGZvciBscGRkcjQsZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjaGFuZWwgYSBjczAgY3MxIGNoYW5lbCBiIGNzMCBjczEKCS8vI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMF9DSDAJCTB4NSAgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0IG9ubHkgdXNlIGNzMCxidXQgaGlnaCBhZGRyZXNzIHVzZSAxNmJpdCBtb2RlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzAxX0NIMAkweDYgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0ICB1c2UgY3MwIGNzMSxidXQgY3MxIHVzZSAxNmJpdCBtb2RlICxjdXJyZW50IHBoeSBub3Qgc3VwcG9ydCByZXNlcnZlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMAkJMHg3ICAgICAgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjczAgY3MxCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwMQkJMHg4ICAgICAvL29ubHkgZm9yIGxwZGRyNCxkcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNoYW5lbCBhIGNzMCAgY2hhbmVsIGIgY3MwCgoJLyogcnN2X2NoYXIwLiB1cGRhdGUgZm9yIGRpYWdub3NlIHR5cGUgZGVmaW5lICovCgl1bnNpZ25lZAljaGFyCWRpYWdub3NlOwoKCS8qIGltZW0vZG1lbSBkZWZpbmUgKi8KCXVuc2lnbmVkCWludAkJaW1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWludAkJZG1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CWltZW1fbG9hZF9zaXplOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAlkbWVtX2xvYWRfc2l6ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfYmFzZV9hZGRyOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlpbnQJCWRkcl9zdGFydF9vZmZzZXQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2NzMF9zaXplX01COwoJLy9jb25maWcgY3MwIGRyYW0gc2l6ZSAsbGlrZSAxRyBEUkFNICxzZXR0aW5nIDEwMjQKCXVuc2lnbmVkCXNob3J0CWRyYW1fY3MxX3NpemVfTUI7CgkvL2NvbmZpZyBjczEgZHJhbSBzaXplLGxpa2UgNTEyTSBEUkFNICxzZXR0aW5nIDUxMgoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJc2hvcnQJdHJhaW5pbmdfU2VxdWVuY2VDdHJsWzJdOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07Cgl1bnNpZ25lZAljaGFyCSByZXZlcjE7Cgl1bnNpZ25lZAljaGFyCSByZXZlcjI7CgkvL3RyYWluaW5nIG9kdCBjb25maWcgLG9ubHkgdXNlIGZvciB0cmFpbmluZwoJLy8gWzBdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDAuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJLy8gWzFdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDEuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJdW5zaWduZWQJaW50CQlkZmlfb2R0X2NvbmZpZzsKCS8vbm9ybWFsIGdvIHN0YXR1cyBvZCBjb25maWcsdXNlIGZvciBub3JtYWwgc3RhdHVzCgkvL2JpdCAxMi4gIHJhbmsxIE9EVCBkZWZhdWx0LiBkZWZhdWx0IHZ1bHVlIGZvciBPRFRbMV0gcGlucyBpZiB0aGVyZXMgbm8gcmVhZC93cml0ZSBhY3Rpdml0eS4KCS8vYml0IDExLiAgcmFuazEgT0RUIHdyaXRlIHNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEwLiAgcmFuazEgT0RUIHdyaXRlIG5zZWwuIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmVzJ3Mgd3JpdGUgb2NjdXIgaW4gcmFuazAuCgkvL2JpdCA5LiAgIHJhbmsxIG9kdCByZWFkIHNlbC4gICBlbmFibGUgT0RUWzFdIGlmIHRoZXJlJ3MgcmVhZCBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDguICAgcmFuazEgb2R0IHJlYWQgbnNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyByZWFkIG9jY3VyZSBpbiByYW5rMC4KCS8vYml0IDQuICAgcmFuazAgT0RUIGRlZmF1bHQuICAgIGRlZmF1bHQgdnVsdWUgZm9yIE9EVFswXSBwaW5zIGlmIHRoZXJlcyBubyByZWFkL3dyaXRlIGFjdGl2aXR5LgoJLy9iaXQgMy4gICByYW5rMCBPRFQgd3JpdGUgc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHdyaXRlIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMi4gICByYW5rMCBPRFQgd3JpdGUgbnNlbC4gZW5hYmxlIE9EVFswXSBpZiB0aGVyZXMncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEuICAgcmFuazAgb2R0IHJlYWQgc2VsLiAgIGVuYWJsZSBPRFRbMF0gaWYgdGhlcmUncyByZWFkIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMC4gICByYW5rMCBvZHQgcmVhZCBuc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHJlYWQgb2NjdXJlIGluIHJhbmsxLgoJdW5zaWduZWQJc2hvcnQJRFJBTUZyZXFbNF07CgkvL2NvbmZpZyBkcmFtIGZyZXF1ZW5jeSx1c2UgRFJBTUZyZXFbMF0sb2h0ZXIgcmVzZXJ2ZQoJdW5zaWduZWQJY2hhcglQbGxCeXBhc3NFbjsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkZHJfcmRiaV93cl9lbmFibGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJZGRyX3JmY190eXBlOwoJLy9jb25maWcgZHJhbSByZmMgdHlwZSxhY2NvcmRpbmcgZHJhbSB0eXBlLGFsc28gY2FuIHVzZSBzYW1lIGRyYW0gdHlwZSBtYXggY29uZmlnCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MQkJCQkwCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MgkJCQkxCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4NAkJCQkyCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4OAkJCQkzCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MTYJCQkJNAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYngxCQkJCQk1CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjRfMkdieDIJCQkJCTYKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSNF8yR2J4NAkJCQkJNwoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYng4CQkJCQk4CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8yR2J4MQkJCQk5CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8zR2J4MQkJCQkxMAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9MUEREUjRfNEdieDEJCQkJMTEKCXVuc2lnbmVkCWNoYXIJZW5hYmxlX2xwZGRyNHhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJaW50CQlwbGxfc3NjX21vZGU7CgkvLwoJLyogcGxsIHNzYyBjb25maWc6CgkgKgoJICogICBwbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKFtzdHJlbmd0aF0gPDwgNCkgfCBbbW9kZV0sCgkgKiAgICAgIHBwbSA9IHN0cmVuZ3RoICogNTAwCgkgKiAgICAgIG1vZGU6IDA9Y2VudGVyLCAxPXVwLCAyPWRvd24KCSAqCgkgKiAgIGVnOgoJICogICAgIDEuIGNvbmZpZyAxMDAwcHBtIGNlbnRlciBzcy4gdGhlbiBtb2RlPTAsIHN0cmVuZ3RoPTIKCSAqICAgICAgICAucGxsX3NzY19tb2RlID0gKDE8PDIwKSB8ICgxPDw4KSB8ICgyIDw8IDQpIHwgMCwKCSAqICAgICAyLiBjb25maWcgMzAwMHBwbSBkb3duIHNzLiB0aGVuIG1vZGU9Miwgc3RyZW5ndGg9NgoJICogICAgICAgIC5wbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKDYgPDwgNCkgfCAyLAoJICovCgl1bnNpZ25lZAlzaG9ydAljbGtfZHJ2X29obTsKCS8vY29uZmlnIHNvYyBjbGsgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAljc19kcnZfb2htOwoJLy9jb25maWcgc29jIGNzMCBjczEgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlhY19kcnZfb2htOwoJLy9jb25maWcgc29jICBub3JtYWwgYWRkcmVzcyBjb21tYW5kIHBpbiBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9kcnZfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gcHVsbCB1cCBkcml2ZXIgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX2Rydl9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9vZHRfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gb2R0IHB1bGwgdXAgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX29kdF9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCBkb3duIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfZHJ2X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gcHVsbCB1cCBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsZGRyMyBzZWxlY3QgMzQsNDBvaG0sZGRyNCBzZWxlY3QgMzQsNDhvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfb2R0X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLGRkcjMgc2VsZWN0IDQwLDYwLDEyMG9obSxkZHI0IHNlbGVjdCAzNCw0MCw0OCw2MCwxMjAsMjQwb2htLGxwZGRyNCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJZHJhbV9hY19vZHRfb2htOwoJLy9jb25maWcgZHJhbSBhYyBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLHVzZSBmb3IgbHBkZHI0LCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJc29jX2Nsa19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19jc19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19hY19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJdnJlZl9vdXRwdXRfcGVybWlsOyAvL3BoeQoJLy9zZXR0aW5nIHNhbWUgd2l0aCB2cmVmX2RyYW1fcGVybWlsCgl1bnNpZ25lZAlzaG9ydAl2cmVmX3JlY2VpdmVyX3Blcm1pbDsgLy9zb2MKCS8vc29jIGluaXQgU09DIHJlY2VpdmVyIHZyZWYgLGNvbmZpZyBsaWtlIDUwMCBtZWFucyAwLjVWRERRLHRha2UgY2FyZSAscGxlYXNlIGZvbGxvdyBTSQoJdW5zaWduZWQJc2hvcnQJdnJlZl9kcmFtX3Blcm1pbDsKCS8vc29jIGluaXQgRFJBTSByZWNlaXZlciB2cmVmICxjb25maWcgbGlrZSA1MDAgbWVhbnMgMC41VkREUSx0YWtlIGNhcmUgLHBsZWFzZSBmb2xsb3cgU0kKCXVuc2lnbmVkCXNob3J0CW1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeTsKCS8vdXNlIGZvciBsaW1pdGVkIGRkciBzcGVlZCBjb3JlIHRpbW1taW5nIHBhcmFtZXRlcixmb3Igc29tZSBvbGQgZHJhbSBtYXliZSBoYXZlIG5vIG92ZXIgc3BlZWQgcmVnaXN0ZXIKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWNoYXIJYWNfdHJhY2VfZGVsYXlbMTBdOwoJdW5zaWduZWQJY2hhcglscGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nOwoJdW5zaWduZWQJY2hhcglscGRkcjRfeDhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeSAsdGFrZSBjYXJlICxwbGVhc2UgZm9sbG93IFNJCgl1bnNpZ25lZAljaGFyCWFjX3Bpbm11eFtEV0NfQUNfUElOTVVYX1RPVEFMXTsKCS8vdXNlIGZvciBscGRkcjMgL2xwZGRyNCBjYSBwaW5tdXggcmVtYXAKCXVuc2lnbmVkCWNoYXIJZGZpX3Bpbm11eFtEV0NfREZJX1BJTk1VWF9UT1RBTF07Cgl1bnNpZ25lZAljaGFyCXNsdF90ZXN0X2Z1bmN0aW9uWzJdOyAgLy9bMF0gc2x0IHRlc3QgZnVuY3Rpb24gZW5hYmxlLGJpdCAwIGVuYWJsZSA0IGZyZXF1ZW5jeSBzY2FuLGJpdCAxIGVuYWJsZSBmb3JjZSBkZWxheSBsaW5lIG9mZnNldCAsYml0IDcgZW5hYmxlIHNraXAgdHJhaW5pbmcgZnVuY3Rpb24KCS8vWzFdLHNsdCB0ZXN0IHBhcmFtZXRlciAsdXNlIGZvciBmb3JjZSBkZWxheSBsaW5lIG9mZnNldAoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAl0ZHFzMmRxOy8vZHFfYmRscl9vcmc7Cgl1bnNpZ25lZAljaGFyICBkcmFtX2RhdGFfd3Jfb2R0X29obTsKCXVuc2lnbmVkCWNoYXIJYml0VGltZUNvbnRyb2xfMmQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWludAkJZGRyX2RtY19yZW1hcFs1XTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgl1bnNpZ25lZCBjaGFyCQlkZHJfbHBkZHIzNF9jYV9yZW1hcFs0XTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHRyYWluaW5nIGRhdGEgYnl0ZSBsYW5lIHJlbWFwCgl1bnNpZ25lZAljaGFyCWRkcl9scGRkcjM0X2RxX3JlbWFwWzMyXTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHBpbm11eCByZW1hcAoJdW5zaWduZWQJaW50CQlkcmFtX3J0dF9ub21fd3JfcGFya1syXTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfZnVuYzsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJLy91bnNpZ25lZAlsb25nCXJzdl9sb25nMFsyXTsKCS8qIHYxIGVuZCAqLwovLwkvKgoJdW5zaWduZWQJY2hhcglyZWFkX2Rxc19kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXJlYWRfZHFfYml0X2RlbGF5WzcyXTsKCXVuc2lnbmVkCXNob3J0CXdyaXRlX2Rxc19kZWxheVsxNl07Ci8vCSovCgl1bnNpZ25lZAlzaG9ydAl3cml0ZV9kcV9iaXRfZGVsYXlbNzJdOwoJdW5zaWduZWQJc2hvcnQJcmVhZF9kcXNfZ2F0ZV9kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXNvY19iaXRfdnJlZlszMl07Cgl1bnNpZ25lZAljaGFyCWRyYW1fYml0X3ZyZWZbMzJdOwoJLy8vKgoJdW5zaWduZWQJY2hhcglyZXZlcjM7Ly9yZWFkX2RxcyAgcmVhZF9kcSx3cml0ZV9kcXMsIHdyaXRlX2RxCgl1bnNpZ25lZAljaGFyCWRmaV9tcmw7Cgl1bnNpZ25lZAljaGFyCWRmaV9od3Rtcmw7Cgl1bnNpZ25lZAljaGFyCUFSZFB0ckluaXRWYWw7Cgl1bnNpZ25lZAljaGFyCXJldHJhaW5pbmdbMTZdOwoJLy9vdmVycmlkZSByZWFkIGJpdCBkZWxheQoJLy9leHRyYQovLwl1bnNpZ25lZAlzaG9ydAlkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg7Ci8vCXVuc2lnbmVkCXNob3J0CWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeDsKLy8JKi8KfWRkcl9zZXRfdDsKCmRkcl9zZXRfdCBwX2Rkcl9zZXRfdDsKCmNoYXIqIGl0b2FfZGRyX3Rlc3QoaW50IG51bSxjaGFyKnN0cixpbnQgcmFkaXgpCnsvKsv30v2x7SovCglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAxXG4iKTsKCWNoYXIgaW5kZXhbXT0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKCXVuc2lnbmVkIHVudW07LyrW0LzkseTBvyovCgljaGFyIHRlbXA7CglpbnQgaT0wLGosazsKCS8qyLe2qHVudW21xNa1Ki8KCWlmIChyYWRpeCA9PSAxMCAmJiBudW08MCkgLyrKrr341sa4usr9Ki8KCXsKCQl1bnVtID0gKHVuc2lnbmVkKS1udW07CgkJc3RyW2krK10gPSAnLSc7Cgl9CgllbHNlCgkJdW51bSA9ICh1bnNpZ25lZCludW07LyrG5Mv7x+m/9iovCgkvKtequ7sqLwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgMlxuIik7CglwcmludGYoIlxudW51bT0weCUwOHhcbiIsdW51bSk7CglwcmludGYoIlxudW51bTI9MHglMDh4XG4iLCh1bnVtJSh1bnNpZ25lZClyYWRpeCkpOwoJcHJpbnRmKCJcbnJhZGl4PTB4JTA4eFxuIixyYWRpeCk7CglzdHJbMF0gPSBpbmRleFswXTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDIyXG4iKTsKCXVudW0gLz0gcmFkaXg7CglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyM1xuIik7CglkbyB7CgkJc3RyW2krK10gPSBpbmRleFt1bnVtJSh1bnNpZ25lZClyYWRpeF07CgkJdW51bSAvPSByYWRpeDsKCX13aGlsZSh1bnVtKTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDNcbiIpOwoJc3RyW2ldID0gJ1wwJzsKCS8qxObQ8iovCglpZiAoc3RyWzBdID09ICctJykKCQlrID0gMTsvKsquvfjWxri6yv0qLwoJZWxzZQoJCWsgPSAwOwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgNFxuIik7Cglmb3IgKGogPSBrO2ogPD0gKGktMSkvMjtqKyspCgl7CgkJdGVtcCA9IHN0cltqXTsKCQlzdHJbal0gPSBzdHJbaS0xK2stal07CgkJc3RyW2ktMStrLWpdID0gdGVtcDsKCX0KCXJldHVybiBzdHI7Cn0KLy8jZW5kaWYKCi8qCmNoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCnsKICAgIGNoYXIgKnM7CiAgICBjb25zdCBjaGFyICpzcGFucDsKICAgIGludCBjLCBzYzsKICAgIGNoYXIgKnRvazsKICAgIGlmICgocyA9ICpzdHJpbmdwKT09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIGZvciAodG9rID0gczs7KSB7CiAgICAgICAgYyA9ICpzKys7CiAgICAgICAgc3BhbnAgPSBkZWxpbTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmICgoc2MgPSpzcGFucCsrKSA9PSBjKSB7CiAgICAgICAgICAgICAgICBpZiAoYyA9PSAwKQogICAgICAgICAgICAgICAgICAgIHMgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNbLTFdID0gMDsKICAgICAgICAgICAgICAgICpzdHJpbmdwID0gczsKICAgICAgICAgICAgICAgIHJldHVybiAodG9rKTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKHNjICE9IDApOwogICAgfQoKfQoqLwppbnQgVE9MT1dFUihpbnQgY2gpCnsKCiAgIGlmICgodW5zaWduZWQgaW50KShjaCAtICdBJykgPCAyNnUgKQogICAgICBjaCArPSAnYScgLSAnQSc7CgogICByZXR1cm4gY2g7Cn0vL7Tz0LTX1sS416q7u86q0KHQtNfWxLihowoKaW50IGlzeGRpZ2l0KGludCBjaCkKewogICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKCBjaCAgICAgICAgIC0gJzAnKSA8IDEwdSAgfHwKICAgICAgICAgICAodW5zaWduZWQgaW50KSgoY2ggfCAweDIwKSAtICdhJykgPCAgNnU7Cn0vL8XQts/X1rf7Y8rHt/HOqsquwfm9+NbGyv3X1qGjCi8vtbFjzqpBLUYsYS1mu/IwLTnWrrzktcTKrsH5vfjWxsr919bKsaOst7W72LfHwePWtaOst/HU8re1u9jB46GjCmludCBpc2RpZ2l0KGludCBjaCkKewogICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKGNoIC0gJzAnKSA8IDEwdTsKfS8vxdC2z9fWt/tjyse38c6qyv3X1gp1bnNpZ25lZCBpbnQgc2ltcGxlX2d1ZXNzX2Jhc2UoY29uc3QgY2hhciAqY3ApCnsKCWlmIChjcFswXSA9PSAnMCcpIHsKCQlpZiAoVE9MT1dFUihjcFsxXSkgPT0gJ3gnICYmIGlzeGRpZ2l0KGNwWzJdKSkKCQkJcmV0dXJuIDE2OwoJCWVsc2UKCQkJLy8gcmV0dXJuIDg7CgkJCXJldHVybiAxMDsKCX0gZWxzZSB7CgkJcmV0dXJuIDEwOwoJfQp9CnVuc2lnbmVkIGludCBzaW1wbGVfc3RydG91bGxfZGRyKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCnsKCXVuc2lnbmVkIGludCAgcmVzdWx0ID0gMDsKCS8vcHJpbnRmKCJ0ZXN0IHNpemVvZihzdHJfYnVmKT09JWRcbiIsMSk7CglpZiAoY3AgPT0gTlVMTCkgLy9qaWF4aW5nIGFkZCAyMDE3MDYxNgoJCXJldHVybiAwOwoJaWYgKCFiYXNlKQoJCWJhc2UgPSBzaW1wbGVfZ3Vlc3NfYmFzZShjcCk7CglpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgVE9MT1dFUihjcFsxXSkgPT0gJ3gnKQoJCWNwICs9IDI7CglpZiAoYmFzZSA9PSAxMCkgewoJCXdoaWxlICgoKmNwKT09ICcwJykKCQkJY3ArKzsKCX0KCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7Ly+87LLptbHHsGNwyse38crHuPbKrsH5vfjWxsr91rWjrLK7ysfWsb3Tt7W72DAKCQl1bnNpZ25lZCBpbnQgdmFsdWU7CgkJdmFsdWUgPSBpc2RpZ2l0KCpjcCkgPyAqY3AgLSAnMCcgOiBUT0xPV0VSKCpjcCkgLSAnYScgKyAxMDsKCQlpZiAodmFsdWUgPj0gYmFzZSkKCQkJYnJlYWs7CgkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwoJCWNwKys7Cgl9CglpZiAoZW5kcCkKCQkqZW5kcCA9IChjaGFyICopY3A7CglyZXR1cm4gcmVzdWx0Owp9CnVuc2lnbmVkIGludCBlbnZfdG9fYV9udW0oY29uc3QgY2hhciAqZW52X25hbWUpCnsKCWNoYXIgKnN0cl9idWYgPSBOVUxMOwoJY2hhciBidWZbNDhdOwoJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCXByaW50Zigic2l6ZW9mKHN0cl9idWYpPT0lZFxuIiwodW5zaWduZWQgaW50KShzaXplb2YoYnVmKSkpOwoJc3RyX2J1ZiA9IGdldGVudihlbnZfbmFtZSk7Cgl1bnNpZ25lZCBpbnQgYV9udW0gPSAwOwoJY2hhciAqZW5kcDsKCglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoJYV9udW09c2ltcGxlX3N0cnRvdWxsX2RkcihzdHJfYnVmLCAmZW5kcCwgMCk7CglwcmludGYoIiVzPT0weCUwOHhcbiIsc3RyX2J1ZixhX251bSk7CgoJcmV0dXJuIGFfbnVtOwp9CnVuc2lnbmVkIGludCBhX251bV90b19lbnYoY29uc3QgY2hhciAqZW52X25hbWUgLHVuc2lnbmVkIGludCAqYV9udW0pCnsKCWNoYXIgKnN0cl9idWY9TlVMTDsKCWNoYXIgYnVmWzEwMjRdOwoJLy91bnNpZ25lZCBpbnQgc3RyX3RvX251bWFycnlbNDhdOwoJLy9zdHJfYnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjEwMjQpOwoJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCXByaW50Zigic2l6ZW9mKHN0cl9idWYpPT0lZFxuIiwodW5zaWduZWQgaW50KShzaXplb2YoYnVmKSkpOwoJc3RyX2J1ZiA9IGdldGVudihlbnZfbmFtZSk7CgoJcHJpbnRmKCJzdHI9PSVzXG4iLHN0cl9idWYpOwoKCXNwcmludGYoYnVmLCAiMHglMDh4IiwgKmFfbnVtKTsKCglwcmludGYoICIlcz09MHglMDh4IiwgYnVmLCphX251bSk7CglzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgoJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJcmV0dXJuIDE7Cn0KdW5zaWduZWQgaW50IGVudl90b19udW0oY29uc3QgY2hhciAqZW52X25hbWUsdW5zaWduZWQgaW50ICpudW1fYXJyeSkKewoJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgljaGFyIGJ1ZlsxMDI0XTsKCXVuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CglzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJcHJpbnRmKCJzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVvZihidWYpKSk7CglzdHJfYnVmID0gZ2V0ZW52KGVudl9uYW1lKTsKCgljaGFyICogc3RyWzQ4XTsKCWNoYXIgKmVuZHA7CglpbnQgaTsKCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKQoJCXN0cl90b19udW1hcnJ5W2ldID0gMDsKCXByaW50Zigic3RyPT0lc1xuIixzdHJfYnVmKTsKCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgkJc3RyW2ldID0gc3Ryc2VwKCZzdHJfYnVmLCAiOyIpOwoJCS8vc3RyW2ldID0gc3Ryc2VwKCZzdHJfYnVmLCAiICIpOwoJCWlmIChzdHJbaV0gPT0gTlVMTCkKCQkJYnJlYWs7CgkJc3RyX3RvX251bWFycnlbaV0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHN0cltpXSwgJmVuZHAsIDApOwoJCS8vcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksc3RyX3RvX251bWFycnlbaV0pOwoJCS8vbnVtX2FycnlbaV09c3RyX3RvX251bWFycnlbaV07Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLHN0cl90b19udW1hcnJ5W2ldKTsKCQludW1fYXJyeVtpXSA9IHN0cl90b19udW1hcnJ5W2ldOwoJfQoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50IG51bV90b19lbnYoY29uc3QgY2hhciAqZW52X25hbWUsdW5zaWduZWQgaW50ICpudW1fYXJyeSkKewoJY2hhciAqc3RyX2J1Zj1OVUxMOwoJY2hhciBidWZbMTAyNF07CglpbnQgaTsKCS8vdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoKCS8vY2hhciAqIHN0cls0OF07CglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoKCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbnVtX2FycnlbMF0pOwoJZm9yIChpID0gMTsgaSA8IDQ4OyBpKyspIHsKCQkvL251bV9hcnJ5W2ldPTA7CgkJc3ByaW50ZihidWYsICIlczsweCUwOHgiLCBidWYsbnVtX2FycnlbaV0pOwoJCXByaW50ZigiJWQgICVkXG4iLCBpLG51bV9hcnJ5W2ldKTsKCX0KCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CglwcmludGYoICIlcyIsIGJ1Zik7CglzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgoJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKI2RlZmluZSBUREFUQTMyRiAweGZmZmZmZmZmCiNkZWZpbmUgVERBVEEzMkEgMHhhYWFhYWFhYQojZGVmaW5lIFREQVRBMzI1IDB4NTU1NTU1NTUKI2RlZmluZSAgICAgUFJFR19TVElDS1lfRzEyQV9SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDA3MCA8PCAyKSkKLy8jZGVmaW5lICBERFJfVEVTVF9BVVRPX1RFU1RfQ01EX01BR0lDICAgMHgwMTIzNDU2NwojZGVmaW5lIERNQ19TVElDS1lfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM5ODAwKQojZGVmaW5lIERNQ19TVElDS1lfRzEyQV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg4MDApCiNkZWZpbmUgRE1DX1NUSUNLWV9NQUdJQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAojZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJjZGJlYWQKI2RlZmluZSBETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMgojZGVmaW5lIERNQ19TVElDS1lfQVVUT19URVNUX0NNRF9JTkRFWF9NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMwp1bnNpZ25lZCBpbnQgZG1jX3N0aWNreVs2NF07CnVuc2lnbmVkIGludCBzdGlja3lfcmVnX2Jhc2VfYWRkPTA7CgovLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgp1bnNpZ25lZCBpbnQgICBnbG9iYWxfYm9vdF90aW1lcz0gMDsKdW5zaWduZWQgaW50ICAgd2F0Y2hkb2dfdGltZV9zPSAyMDsKdW5zaWduZWQgaW50IGdsb2JhbF9kZHJfY2xrPTE7CnVuc2lnbmVkIGludAliZGxyXzEwMHN0ZXA9MDsKdW5zaWduZWQgaW50ICAgICAgIHVpXzFfMzJfMTAwc3RlcD0wOwp1bnNpZ25lZCBpbnQgICBlcnJvcl9jb3VudCA9MDsKdW5zaWduZWQgaW50ICBlcnJvcl9vdXRvZl9jb3VudF9mbGFnPTA7CnVuc2lnbmVkIGludCAgY29weV90ZXN0X2ZsYWcgPSAwOwp1bnNpZ25lZCBpbnQgIHRyYWluaW5nX3BhdHRlcm5fZmxhZyA9IDA7CnVuc2lnbmVkIGludCB0ZXN0X3N0YXJ0X2FkZHI9MHgxMDgwMDAwOwoKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2I7Cgp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVs0XTsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19iWzRdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfb3JnWzEwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX21heFs0MF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lWzQwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVs0MF07Ci8vICAgIHVuc2lnbmVkIGludCAgZGF0YV9iZGxyMF81X3JlZ19vcmdbNl07CnVuc2lnbmVkIGludCAgZGF0YV9iZGxyMF81X3JlZ19vcmdbMjhdOy8vNC8vNGxhbmUKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19zZXR1cF9tYXhbMjQqNF07Ly80Ly80IGxhbmUgOTYgYmRscgp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX2hvbGRfbWF4WzI0KjRdOwp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX3NldHVwX3RpbWVbMjQqNF07CnVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfaG9sZF90aW1lWzI0KjRdOwoKCnVuc2lnbmVkIGludCAgcHJlX2ZldGNoX2VuYWJsZT0wOwoKI2RlZmluZSByZWFkbChhZGRyKSAgICAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKI2RlZmluZSB3cml0ZWwoZGF0YSAsYWRkcikgICgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKCiNkZWZpbmUgd3JfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZF9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCi8vI2RlZmluZSBDT05GSUdfRERSX0NNRF9CRExfVFVORQovLyNkZWZpbmUgIENPTkZJR19DTURfRERSX1RFU1QKCiNpZm5kZWYgQ09ORklHX0NISVAKLy8jZGVmaW5lIENPTkZJR19DSElQICAgIENISVBfT0xEIC8vQ0hJUF9PTEQvLyAvLyNkZWZpbmUgQ0hJUF9PTEQgICAgICAgICAgIDAgIC8vI2RlZmluZSBDSElQX1RYTFggICAgICAgICAgIDEKI2RlZmluZSBDSElQX09MRCAgICAgICAgICAgMAojZGVmaW5lIENISVBfVFhMWCAgICAgICAgICAgMQojZGVmaW5lIENISVBfQTExMyAgICAgICAgICAgMgojZGVmaW5lIENISVBfRzEyICAgICAgICAgMwojZGVmaW5lIENPTkZJR19DSElQICAgQ0hJUF9HMTIvLyBDSElQX09MRC8vCiNlbmRpZgoKI2RlZmluZSBQX0REUl9QSFlfREVGQVVMVCAgICAgICAgICAgMAojZGVmaW5lIFBfRERSX1BIWV9HWF9CQUJZICAgICAgICAgICAgIDEKI2RlZmluZSAgUF9ERFJfUEhZX0dYX1RWX0JBQlkgICAgIDIKI2RlZmluZSAgUF9ERFJfUEhZXzkwNVggICAgICAgIDMKCi8vI2RlZmluZSAgUF9ERFJfUEhZX09MRF9UQUcgICAgICAgICAwCiNkZWZpbmUgIFBfRERSX1BIWV9HMTIgICAgICAgIDQKI2RlZmluZSBDT05GSUdfRERSX1BIWSAgIFBfRERSX1BIWV9HMTIKCiNkZWZpbmUgRzEyX0FNX0REUl9QTExfQ05UTDAgICAweGZmNjM4YzAwCgojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCiNpbmNsdWRlIDxhc20vYXJjaC9zZWN1cmVfYXBiLmg+CiNlbmRpZgoKI2RlZmluZSBQQVRURVJOX1VTRV9ERFJfREVTCiNkZWZpbmUgIFVTRV82NEJJVF9QT0lOVEVSCi8vI2RlZmluZSAgVVNFXzMyQklUX1BPSU5URVIKI2lmZGVmIFVTRV82NEJJVF9QT0lOVEVSCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKSggdW5zaWduZWQgbG9uZyApKGEpCiNkZWZpbmUgaW50X2NvbnZ0ZXJfcChhKSAgKCB1bnNpZ25lZCBsb25nICkoYSkKCiNlbHNlCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKShhKQojZGVmaW5lIGludF9jb252dGVyX3AoYSkgICggdW5zaWduZWQgaW50ICkoYSkKI2VuZGlmCgojaWZkZWYgUEFUVEVSTl9VU0VfRERSX0RFUwojZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICAoZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgICggZGVzW2FdXih+KHBhdHRlcm5fIyNiW2NdW2RdKSkpCiNkZWZpbmUgZGVzX3hvcl9wYXR0ZXJuKGEsYikgICAoIGFeYikKLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCiNlbHNlCiNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrcGF0dGVybl8jI2JbY11bZF0KI2RlZmluZSBkZXNfaW52X3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrfihwYXR0ZXJuXyMjYltjXVtkXSkKI2RlZmluZSBkZXNfeG9yX3BhdHRlcm4oYSxiKSAgKGEmMCtiKQojZW5kaWYKCgojZGVmaW5lICBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCiNkZWZpbmUgIEREUl9QUkVGRVRDSF9DQUNIRQojZW5kaWYKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQojZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkgICBhc20gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAoUCkpCiNlbHNlCiNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKQojZW5kaWYKCgojZGVmaW5lIEREUl9URVNUX1NUQVJUX0FERFIgIDB4MTA4MDAwMC8vICAweDEwMDAwMDAwIC8vQ09ORklHX1NZU19NRU1URVNUX1NUQVJUCiNkZWZpbmUgRERSX1RFU1RfU0laRSAweDIwMDAwMDAKLy8jZGVmaW5lIEREUl9URVNUX1NJWkUgMHgyMDAwCgojaWYgKENPTkZJR19DSElQPj1DSElQX1RYTFgpCgojZGVmaW5lIFBfRUVfVElNRVJfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKQojZGVmaW5lIFBfUElOX01VWF9SRUcxICAgICAgICBQX1BFUklQSFNfUElOX01VWF8xLy8gKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJkIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzIgICAgICAgUF9QRVJJUEhTX1BJTl9NVVhfMi8vICAoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmUgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMwkJUF9QRVJJUEhTX1BJTl9NVVhfMy8vKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJmIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzcJCVBfUEVSSVBIU19QSU5fTVVYXzcvLygoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgzMyA8PCAyKSkpKQoKI2VuZGlmCgojZGVmaW5lIGdldF91c190aW1lKCkgICAgKCpQX0VFX1RJTUVSX0UpLy8gKHJlYWRsKFBfSVNBX1RJTUVSRSkpCgoKCiNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfd3IoYWRkciwgZGF0KSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKT0oKHVpbnQxNl90KWRhdCkKI2RlZmluZSBkd2NfZGRycGh5X2FwYl9yZChhZGRyKSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKQojZGVmaW5lIEFDWF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCgp2b2lkIGRkcl91ZGVsYXkodW5zaWduZWQgaW50IHVzKQp7CgoJdW5zaWduZWQgaW50IHQwID0gKCooKFBfRUVfVElNRVJfRSkpKTsKCgl3aGlsZSAoKCooKFBfRUVfVElNRVJfRSkpKSAtIHQwIDw9IHVzKQk7Cgp9CgojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSAgMQojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WICAgIDIKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0lETUUgIDMKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kgIDQKCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkJMQojZGVmaW5lIAlERFJfUEFSQU1FVEVSX1dSSVRFCQkyCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfTEVGVAkJMQojZGVmaW5lIAlERFJfUEFSQU1FVEVSX1JJR0hUCQkyCgp0eXBlZGVmIHN0cnVjdCBkZHJfdGVzdF9zdHJ1Y3QgewoJdW5zaWduZWQJaW50CWRkcl9kYXRhX3NvdXJjZQk7Cgl1bnNpZ25lZAlpbnQJZGRyX2RhdGFfdGVzdF9zaXplCTsKCXVuc2lnbmVkCWludAlkZHJfYWRkcmVzc190ZXN0X3NpemUJOwoJdW5zaWduZWQJaW50CWRkcl90ZXN0X3dhdGNoZG9nX3RpbWVzX3MJOwoJdW5zaWduZWQJaW50CWRkcl90ZXN0X2xhbmVfZGlzYWJsZQk7CgoJdW5zaWduZWQJaW50CWRkcl90ZXN0X3dpbmRvd19mbGFnWzhdCTsKCXVuc2lnbmVkCWludAlkZHJfdGVzdF93aW5kb3dfZGF0YVsxMDBdCTsKfSAgZGRyX3Rlc3Rfc3RydWN0X3Q7CmRkcl90ZXN0X3N0cnVjdF90ICpnX2Rkcl90ZXN0X3N0cnVjdDsKCnVuc2lnbmVkIGludCAgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIodW5zaWduZWQgaW50IHNvdXJjZV9pbmRleCwgdW5zaWduZWQgaW50IHBhcmFtZXRlcl9pbmRleCAsdW5zaWduZWQgaW50IHBhcmFtZXRlcl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoKCWlmIChzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9ETUNfU1RJQ0tZKQoJewoJCXN0aWNreV9yZWdfYmFzZV9hZGQgPSAoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWUgPSByZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WKQoJewoJCWNoYXIgKnByZV9lbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bSI7CgkJY2hhciAqZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW1fMDAwMCI7CgkJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgkJY2hhciAqdGVtcF9zID0gTlVMTDsKCQljaGFyICplbmRwID0gTlVMTDsKCQljaGFyIGJ1ZlsxMDI0XTsKCQlzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgkJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCQlzcHJpbnRmKGVudl9uYW1lLCIlc18lMDRkIixwcmVfZW52X25hbWUscGFyYW1ldGVyX2luZGV4KTsKCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIHBhcmFtZXRlcl92YWx1ZSk7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgkJCXRlbXBfcyA9IGdldGVudihlbnZfbmFtZSk7CgkJCWlmICh0ZW1wX3MpCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQllbHNlCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSAwOwoJCX0KCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSkKCXsKCQlzdGlja3lfcmVnX2Jhc2VfYWRkPShQUkVHX1NUSUNLWV9SRUcwKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWU9cmRfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSk7Cgl9CglyZXR1cm4gcGFyYW1ldGVyX3ZhbHVlOwp9CgoKdW5zaWduZWQgaW50ICByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcodW5zaWduZWQgaW50IHNvdXJjZV9pbmRleCwgdW5zaWduZWQgaW50IHBhcmFtZXRlcl9pbmRleCAsdW5zaWduZWQgaW50IHBhcmFtZXRlcl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoKCWlmIChzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZKQoJewoJCXN0aWNreV9yZWdfYmFzZV9hZGQgPSBQUkVHX1NUSUNLWV9SRUcwOwoKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgkJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSksIHBhcmFtZXRlcl92YWx1ZSk7CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJCXBhcmFtZXRlcl92YWx1ZSA9IHJkX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSkpOwoJfQoKCWlmIChzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9ETUNfU1RJQ0tZKQoJewoJCXN0aWNreV9yZWdfYmFzZV9hZGQgPSAoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWUgPSByZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WKQoJewoJCWNoYXIgKnByZV9lbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bSI7CgkJY2hhciAqZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW1fMDAwMCI7CgkJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgkJY2hhciAqdGVtcF9zID0gTlVMTDsKCQljaGFyICplbmRwID0gTlVMTDsKCQljaGFyIGJ1ZlsxMDI0XTsKCQlzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgkJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCQlzcHJpbnRmKGVudl9uYW1lLCIlc18lMDRkIixwcmVfZW52X25hbWUscGFyYW1ldGVyX2luZGV4KTsKCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIHBhcmFtZXRlcl92YWx1ZSk7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgkJCXRlbXBfcyA9IGdldGVudihlbnZfbmFtZSk7CgkJCWlmICh0ZW1wX3MpCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQllbHNlCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSAwOwoJCX0KCX0KCglyZXR1cm4gcGFyYW1ldGVyX3ZhbHVlOwp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2luaXQodWludDMyX3QgbXNlYykKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCSpQX1dBVENIRE9HX0NOVEwgPSAoMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMC0xKTsKCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vCXdyaXRlbChtc2VjLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7IC8vYml0MC0xNQoJKlBfV0FUQ0hET0dfVENOVCA9IG1zZWM7CgkvL3dyaXRlbCgwLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfUkVTRVQpOwoJKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqUF9XQVRDSERPR19DTlRMID0gKCpQX1dBVENIRE9HX0NOVEwpfCgxPDwxOCk7CgkvL3dyaXRlbCgocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSl8KDE8PDE4KSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMIHw9ICgxPDwxOCk7CiNlbHNlCgkqUF9XQVRDSERPR19DTlRMID0gKDA8PDI0KXwobXNlYyo4LTEpOwoJLy8qUF9XQVRDSERPR19UQ05UPW1zZWM7CiNlbmRpZgp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh1aW50MzJfdCBzZWMpCnsKCgkvLyBzcmM6IDI0TUh6CgkvLyBkaXY6IDI0MDAwIGZvciAxbXMKCS8vIHJlc2V0IGFvLTIyIGFuZCBlZS0yMQoJLy8Jd3JpdGVsKCAoMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMC0xKSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCgkqUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwMC0xKTsgLy8xMG1zCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vCXdyaXRlbChtc2VjLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7IC8vYml0MC0xNQoJaWYgKHNlYyoxMDA+MHhmZmZmKQoJCSpQX1dBVENIRE9HX1RDTlQ9MHhmZmZmOwoJZWxzZQoJCSpQX1dBVENIRE9HX1RDTlQ9c2VjKjEwMDsgIC8vbWF4IDY1NXMKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVD0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKXwoMTw8MTgpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwojZWxzZQoJLy8qUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDE5KXwoc2VjKjgwMDAtMSk7CgkqUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDE5KXwoMHhmZmZmKTsKCXByaW50ZigiXG5tOGJhYnlfd2F0Y2hkb2cgbWF4IG9ubHkgNXMscGxlYXNlIHRha2UgY2FyZSB0ZXN0IHNpemUgbm90IHRvbyBsb25nIGZvciBtOGJhYnlcbiIpOwojZW5kaWYKCXByaW50ZigiXG5QX1dBVENIRE9HX0VOQUJMRVxuIik7Cn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSh2b2lkICkKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCSpQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAwLTEpOyAvLzEwbXMKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CgkvLypQX1dBVENIRE9HX1RDTlQ9c2VjKjEwMDsKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVD0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKSYofigxPDwxOCkpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwojZWxzZQoJKlBfV0FUQ0hET0dfQ05UTD0oMDw8MjQpfCgwPDwxOSl8KDI0MDAwLTEpOwojZW5kaWYKCXByaW50ZigiXG5QX1dBVENIRE9HX0RJU0FCTEVcbiIpOwp9CgoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19jbGVhcih2b2lkICkKewoJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0odm9pZCkKewoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgMHhjMTEwOThkMAoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICAweGMxMTA5OGQ0CgkvLyNkZWZpbmUgUF9XQVRDSERPR19UQ05UICAgICAgICAgICAgIDB4YzExMDk4ZDgKCS8vI2RlZmluZSBQX1dBVENIRE9HX1JFU0VUICAgICAgICAgICAgMHhjMTEwOThkYwojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCglpbnQgaTsKCgl3aGlsZSAoMSkgewoJCS8qCgkJICAgd3JpdGVsKAkweDMJfCAoMSA8PCAyMSkgLy8gc3lzIHJlc2V0IGVuICBhbyBlZSAzCgkJICAgfCAoMSA8PCAyMykgLy8gaW50ZXJydXB0IGVuCgkJICAgfCAoMSA8PCAyNCkgLy8gY2xrIGVuCgkJICAgfCAoMSA8PCAyNSkgLy8gY2xrIGRpdiBlbgoJCSAgIHwgKDEgPDwgMjYpIC8vIHN5cyByZXNldCBub3cgIGFvIGVlIDMKCQkgICAsICh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkJICAgKi8KCQkqUF9XQVRDSERPR19DTlRMPQoJCQkweDMJfCAoMSA8PCAyMSkgLy8gc3lzIHJlc2V0IGVuICBhbyBlZSAzCgkJCXwgKDEgPDwgMjMpIC8vIGludGVycnVwdCBlbgoJCQl8ICgxIDw8IDI0KSAvLyBjbGsgZW4KCQkJfCAoMSA8PCAyNSkgLy8gY2xrIGRpdiBlbgoJCQl8ICgxIDw8IDI2KTsgLy8gc3lzIHJlc2V0IG5vdyAgYW8gZWUgMzsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEwgcmVnX2FkZF8leDA4PT0leDA4IiwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwscmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSk7CgkJLy9wcmludGYoIlxuUF9XQVRDSERPR19DTlRMPT0leDA4IixyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKTsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEw9PSV4MDgiLHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpOwoJCXByaW50ZigiXG5QX1dBVENIRE9HX0NOVExSRUdfQUREICV4MDg9PSV4MDgiLCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGxvbmcpUF9XQVRDSERPR19DTlRMLAoJCQkJKlBfV0FUQ0hET0dfQ05UTCk7CgkJLy93cml0ZWwoMCwgKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKCgkJLy8Jd3JpdGVsKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkgfCAoMTw8MTgpLCAvLyB3YXRjaGRvZyBlbgoJCS8vKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCQkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKXwoMTw8MTgpOwoJCWZvciAoaT0wOyBpPDEwMDsgaSsrKQoJCQkqUF9XQVRDSERPR19DTlRMOwoJCS8vcmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsvKkRlY2VpdmUgZ2NjIGZvciB3YWl0aW5nIHNvbWUgY3ljbGVzICovCgl9CgojZWxzZQoJLy9XUklURV9DQlVTX1JFRyhXQVRDSERPR19UQywgMHhmMDgwMDAwIHwgMjAwMCk7CgkqUF9XQVRDSERPR19DTlRMPSgweGYwODAwMDAgfCAyMDAwKTsKI2VuZGlmCgl3aGlsZSAoMSkgOwp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGUodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCWZvciAoaj0wO2o8MzI7aisrKQoJCXsKCgkJCWlmIChtX2xlbiA+PSAxMjgpCgkJCQluID0gMzI7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDIyOgoJCQkJCQkqKHAraSkgPSAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAzMToKCQkJCQkJKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjQ6CgkJCQkJCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyNzoKCQkJCQljYXNlIDI5OgoJCQkJCQkqKHAraSkgPSAxPDxqOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQkqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQlmb3IgKGo9MDtqPDMyO2orKykKCQl7CgoJCQlpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMzA6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAyMjoKCQkJCQkJaWYgKCoocCtpKSAhPSAwKSB7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDApOwoJCQkJCQl9YnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMzE6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkEpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkEpOwoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjQ6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMjUpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMjUpOwoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDI3OgoJCQkJCWNhc2UgMjk6CgkJCQkJCWlmICgqKHAraSkgIT0gMTw8aikge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAxPDxqKTsKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQlpZiAoKihwK2kpICE9IH4oMTw8aikpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfigxPDxqKSk7CgkJCQkJCX0gYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4OwoJCQkJcCArPSAzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgZGRyX3dyaXRlNCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCgkJCQkJCSoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJKihwK2kpID0gMHhhYTU1YWE1NTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJKihwK2kpID0gfjB4YWE1NWFhNTU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgoJCQkJCQkqKHAraSkgPSAxPDxqOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkNCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoKCQkJCQkJLy8gICAgICAqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vICAgICoocCtpKSA9IDB4YWE1NWFhNTU7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhhYTU1YWE1NSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJLy8gICAqKHAraSkgPSB+MHhhYTU1YWE1NTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhhYTU1YWE1NSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCgkJCQkJCS8vICAgKihwK2kpID0gMTw8ajsKCQkJCQkJaWYgKCoocCtpKSAhPSAoMTw8aikpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlpZiAoKihwK2kpICE9figgMTw8aikpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfZnVsbCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCx1bnNpZ25lZCBpbnQgIHN0YXJ0X3BhdHRlcm4sCgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fb2Zmc2V0KQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpPTA7Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGgmMHhmZmZmZmZmYzsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCS8vKihwKT1zdGFydF9wYXR0ZXJuOwoJd2hpbGUgKG1fbGVuKQoJewoJCW1fbGVuPW1fbGVuLTQ7CgoJCS8vCSoocCtpKSA9ICgqKHApKStwYXR0ZXJuX29mZnNldDsKCiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQlkZHJfcGxkX2NhY2hlKHAraSkgIDsKI2VuZGlmCgkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCXsKCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQltX2xlbj0wOwoJCQlicmVhazsKCQl9CgkJaWYgKCgqKHAraSkpICE9KHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaSkpCgkJe2Vycm9yX2NvdW50Kys7CgkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksCgkJCQkJKHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaSkpOwoJCX0KCQlicmVhazsKCgkJaSsrOwoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfZnVsbCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCx1bnNpZ25lZCBpbnQgIHN0YXJ0X3BhdHRlcm4sCgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fb2Zmc2V0KQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpPTA7Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGgmMHhmZmZmZmZmYzsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCS8vKihwKT1zdGFydF9wYXR0ZXJuOwoJd2hpbGUgKG1fbGVuKQoJewoJCW1fbGVuPW1fbGVuLTQ7CgkJKihwK2kpID0gc3RhcnRfcGF0dGVybitwYXR0ZXJuX29mZnNldCppOwoJCWkrKzsKCX0KfQoKLy8vKgpzdGF0aWMgdm9pZCBkZHJfdGVzdF9jb3B5KHZvaWQgKmFkZHJfZGVzdCx2b2lkICphZGRyX3NyYyx1bnNpZ25lZCBpbnQgbWVtY3B5X3NpemUpCnsKCXVuc2lnbmVkIGludCAgKnBfZGVzdDsKCXVuc2lnbmVkIGludCAgKnBfc3JjOwoKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtZW1jcHlfc2l6ZTsKCglwX2Rlc3QgPSAoIHVuc2lnbmVkIGludCAgKilhZGRyX2Rlc3Q7CglwX3NyYyA9ICggdW5zaWduZWQgaW50ICAqKWFkZHJfc3JjOwoJbV9sZW4gPSBtX2xlbi80OyAvL2Fzc3VtZSBpdCdzIG11bHRpcGxlIG9mIDQKCXdoaWxlIChtX2xlbi0tKSB7CgkJZGRyX3BsZF9jYWNoZShwX3NyYykgIDsvLyNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKSAgIGFzbSAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChQKSkKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCX0KfQovLyovCmludCBkb19kZHJfdGVzdF9jb3B5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGxvbmcgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIHByaW50X2ZsYWcgPTE7CgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgIGRlY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUisweDgwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoKCXByaW50X2ZsYWc9MTsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MSkgewoJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkJbG9vcCA9IDE7Cgl9CglpZiAoYXJnYyA+IDIpIHsKCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXNyY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCX0KCWlmIChhcmdjID4gMykgewoJCXNyY19hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCWRlY19hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCXRlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlsb29wID0gMTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CglpZiAoYXJnYyA+IDQpIHsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoJfQoJaWYgKGFyZ2MgPiA1KSB7CgkJcHJpbnRfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlwcmludF9mbGFnID0gMTsKCX0KCS8vQ09QWV9URVNUX1NUQVJUOgoKCS8vLyoKCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFydCwgdGltZV9lbmQsdGVzdF9sb29wczsKCXRlc3RfbG9vcHM9bG9vcDsKCXVuc2lnbmVkIGxvbmcgc2l6ZV9jb3VudD0wOwoJc2l6ZV9jb3VudD1sb29wKnRlc3Rfc2l6ZTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCglkbyB7CgkJLy8gICAgIGxvb3AgPSAxOwoJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChkZWNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCS8vYmNvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCS8vbWNvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKQoJCXsKCQkJcHJpbnRmKCJcbmxvb3A9PTB4JTA4eCIsICggdW5zaWduZWQgaW50IClsb29wKTsKCQkJcHJpbnRmKCJcbiAgICAgIFxuIik7CgkJfQoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgl0aW1lX2VuZCA9IGdldF91c190aW1lKCk7Ly91cwoJcHJpbnRmKCJcbmNvcHkgJWQgdGltZXMgdXNlICVkdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCggdW5zaWduZWQgaW50ICl0ZXN0X2xvb3BzLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoKCXByaW50ZigiXG5kZHIgY29weSBiYW5kd2lkdGg9PSVkIE1CWVRFL1MgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50Lyh0aW1lX2VuZC10aW1lX3N0YXJ0KSkpOwoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXVuc2lnbmVkIGludCBtX2xlbj0wLGNvdW50ZXI9MDsKCXVuc2lnbmVkIGludCAgKnBfZGVzdDsKCXBfZGVzdD0gICh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKTsKCW1fbGVuID0gdGVzdF9zaXplLzQ7IC8vYXNzdW1lIGl0J3MgbXVsdGlwbGUgb2YgNAoJY291bnRlcj0odW5zaWduZWQgaW50KXRlc3RfbG9vcHM7CglzaXplX2NvdW50PWNvdW50ZXIqdGVzdF9zaXplOwoJdGltZV9zdGFydCA9IGdldF91c190aW1lKCk7Ly91cwoJZG8gewoJCWxvb3AgPSAxOwoJCW1fbGVuID0gdGVzdF9zaXplLzQ7CgkJd2hpbGUgKG1fbGVuLS0pIHsKCQkJZGRyX3BsZF9jYWNoZShwX2Rlc3QpICA7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJfQoJfXdoaWxlKC0tY291bnRlcik7Cgl0aW1lX2VuZCA9IGdldF91c190aW1lKCk7Ly91cwoJcHJpbnRmKCJcbndyaXRlICVkIGJ5dGVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwoIHVuc2lnbmVkIGludCApdGVzdF9zaXplLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoKCXByaW50ZigiXG5kZHIgd3JpdGUgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCgl1bnNpZ25lZCBpbnQgICpwX3NyYzsKCXBfc3JjPSAgKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpOwoJbV9sZW4gPSB0ZXN0X3NpemUvNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0Cgl1bnNpZ25lZCBpbnQgdGVtcDA9MDsKCS8vdW5zaWduZWQgaW50IHRlbXAxPTA7CgkvL3Vuc2lnbmVkIGludCB0ZW1wMj0wOwoJLy91bnNpZ25lZCBpbnQgdGVtcDM9MDsKCWNvdW50ZXI9KHVuc2lnbmVkIGludCl0ZXN0X2xvb3BzOwoJc2l6ZV9jb3VudD1jb3VudGVyKnRlc3Rfc2l6ZTsKCgkvLyAgI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgwKSwgMHhjODgzNmMwMCkpCgkvL3dyaXRlbCgoMTAwMDAwMDw8MCksIERNQ19NT05fQ1RSTDEpOwoJLy93cml0ZWwoKDA8PDMxKXwoMTw8MzApfCgwPDwyMCl8KDE8PDE2KXwoMTw8MCksIERNQ19NT05fQ1RSTDIpOwoJLy93cml0ZWwoKDE8PDMxKXwoMDw8MzApfCgwPDwyMCl8KDE8PDE2KXwoMTw8MCksIERNQ19NT05fQ1RSTDIpOwoJdGltZV9zdGFydCA9IGdldF91c190aW1lKCk7Ly91cwoJZG8gewoJCWxvb3AgPSAxOwoJCW1fbGVuID0gdGVzdF9zaXplLzQ7CgkJd2hpbGUgKG1fbGVuLS0pIHsKCQkJLy8gIGRkcl9wbGRfY2FjaGUocF9zcmMrKykgIDsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChwX3NyYykpOwojZW5kaWYKCQkJcF9zcmMrKzsKCQkJdGVtcDAgPSggKnBfc3JjKTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQl9Cgl9d2hpbGUoLS1jb3VudGVyKTsKCSpwX2Rlc3QrKyA9IHRlbXAwOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCglwcmludGYoIlxucmVhZCAlZCBLYnl0ZXMgdXNlICVkdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvMTAwMCksKCB1bnNpZ25lZCBpbnQgKSh0aW1lX2VuZC10aW1lX3N0YXJ0KSk7CglwcmludGYoIlxuZGRyIHJlYWQgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCglyZXR1cm4gMDsKfQoKVV9CT09UX0NNRCgKCWRkcl90ZXN0X2NvcHksCTcsCTEsCWRvX2Rkcl90ZXN0X2NvcHksCgkiZGRyX3Rlc3RfY29weSBmdW5jdGlvbiIsCgkiZGRyX3Rlc3RfY29weSAgMHgwODAwMDAwMCAweDEwMDAwMDAwIDB4MDIwMDAwMDAgMSAwID8gXG4iCik7CgoKI2RlZmluZSBERFJfUEFUVEVSTl9MT09QXzEgMzIKI2RlZmluZSBERFJfUEFUVEVSTl9MT09QXzIgNjQKI2RlZmluZSBERFJfUEFUVEVSTl9MT09QXzMgOTYKCgoKCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3Aodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAgY2FzZSAyMjoKCQkJCQkJKihwK2kpID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCSoocCtpKSA9IFREQVRBMzI1OwoKCgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCSoocCtpKSA9MHhmZTAxZmUwMTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCSoocCtpKSA9MHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCSoocCtpKSA9MHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCSoocCtpKSA9MHg3ZjgwN2Y4MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPTB4MDAwMDAyMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID0weDAwMDAwNDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID0weDAwMDAwODAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID0weDAwMDAxMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID0weDAwMDAyMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID0weDAwMDA0MDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID0weDAwMDA4MDAwOwoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9IDB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPSAweGZiMDRmYjA0OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9IDB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID0gMHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgKihwK2kpID0gVERBVEEzMkY7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCS8vICAgKihwK2kpID0gMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDApOwoJCQkJCQkJYnJlYWs7fQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICAgKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkEpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCQkJLy8JKihwK2kpID0gVERBVEEzMjU7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMjUpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMjUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9MHhmZTAxZmUwMSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmQwMmZkMDI7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZDAyZmQwMikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZkMDJmZDAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJLy8JKihwK2kpID0weGZiMDRmYjA0OwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmIwNGZiMDQpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8JKihwK2kpID0weGY3YjA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGY3MDhmNzA4KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZjcwOGY3MDgpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCS8vCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGVmMTBlZjEwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZWYxMGVmMTApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCS8vCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZGYyMGRmMjApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4YmY0MGJmNDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhiZjQwYmY0MCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJLy8gICAJKihwK2kpID0weDdmODA3ZjgwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHg3ZjgwN2Y4MCk7CgkJCQkJCQlicmVhazsKCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDAxMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDEwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwMjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAyMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMDQwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwNDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMDgwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwODAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMTAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAxMDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkvLyAJKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDIwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMjAwMCk7CgoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwNDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDA0MDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwODAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDA4MDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQovLyovCnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmUwMWZlMDEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmQwMmZkMDIpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZiMDRmYjA0KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmIwNGZiMDQpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGY3MDhmNzA4KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZWYxMGVmMTApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhlZjEwZWYxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZGYyMGRmMjApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhkZjIwZGYyMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhiZjQwYmY0MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4YmY0MGJmNDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JICAgKihwK2kpID0gMHg3ZjgwN2Y4MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDdmODA3ZjgwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZjAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24odm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IH5UREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IH4wOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSB+VERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCSoocCtpKSA9flREQVRBMzI1OwoKCgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCSoocCtpKSA9fjB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCSoocCtpKSA9fjB4ZmQwMmZkMDI7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJKihwK2kpID1+MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCSoocCtpKSA9fjB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkqKHAraSkgPX4weGVmMTBlZjEwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJKihwK2kpID1+MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCSoocCtpKSA9fjB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkqKHAraSkgPX4weDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMTAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDA0MDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwODAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID1+MHgwMDAwMTAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDIwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weDAwMDA0MDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID1+MHgwMDAwODAwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPSB+MHhmZTAxZmUwMTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPSB+MHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPSB+MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9IH4weGY3MDhmNzA4OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID0gfjB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPSB+MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9fjB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9IH4weDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCgoJCQkJCWRlZmF1bHQ6CgoJCQkJCQkqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlpZiAoKihwK2kpICE9flREQVRBMzJGKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH5UREFUQTMyRik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAgY2FzZSAyMjoKCQkJCQkJLy8gICAqKHAraSkgPSAwOwoJCQkJCQlpZiAoKihwK2kpICE9fjApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgICAqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+VERBVEEzMkEpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSx+VERBVEEzMkEpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlpZiAoKihwK2kpICE9IH5UREFUQTMyNSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+VERBVEEzMjUpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCS8vICAgCSoocCtpKSA9MHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPX4weGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZlMDFmZTAxKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZkMDJmZDAyKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZkMDJmZDAyKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmIwNGZiMDQ7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmIwNGZiMDQpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmIwNGZiMDQpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkvLwkqKHAraSkgPTB4ZjdiMDhmNzA4OwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGY3MDhmNzA4KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGY3MDhmNzA4KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJLy8JKihwK2kpID0weGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGVmMTBlZjEwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGVmMTBlZjEwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJLy8JKihwK2kpID0weGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJLy8gIAkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4YmY0MGJmNDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4YmY0MGJmNDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4N2Y4MDdmODApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDAxMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDAxMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCS8vICAJKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDAwMjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDQwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDQwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDgwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDgwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCS8vCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMTAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMTAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDIwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDIwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDQwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDQwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDgwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDgwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCi8vKi8Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZDAyZmQwMikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmYjA0ZmIwNCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmNzA4ZjcwOCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhlZjEwZWYxMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhlZjEwZWYxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGJmNDBiZjQwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQkJKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQkJKihwK2kpID0gMHhmZjAwMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCSoocCtpKSA9IDB4MDBmZjAwZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQkJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQkJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJKihwK2kpID0weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJKihwK2kpID0weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJKihwK2kpID0weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJKihwK2kpID0weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPX4weGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7Cgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQkJLy8JICBpZigqKHAraSkgIT1+VERBVEEzMkYpCgoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vICoocCtpKSA9IDB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJLy8gKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQkJLy8JICoocCtpKSA9IDB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMDAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmZmZjAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmZmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAqKHAraSkgPSAweDAwZmYwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwZmYwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDBmZjAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJCS8vICAJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCS8vIAkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCQkvLyAJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMDAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCQkvLwkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLwkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vICAJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDBmZjAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMGZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkvLyAJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4MDAwMDAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDAwMDAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCS8vICAgCSoocCtpKSA9MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJLy8JKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCS8vCSAgIAkqKHAraSkgPTB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID1+MHgwMGZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDBmZjAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCS8vICAgCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDAwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDAwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAJKihwK2kpID1+MHgwMDAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDAwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHgwMDAwMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCS8vICAgCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwZmYwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8gICAJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCgppbnQgZG9fZGRyX3Rlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBsZmxhZyA9IDA7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50ICAgc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7Cgl1bnNpZ25lZCBpbnQgICBjcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7Cgl1bnNpZ25lZCBpbnQgICBvbGRfcGF0dGVybl9mbGFnID0gMTsKCgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0gMTsKCS8vCSAgY29weV90ZXN0X2ZsYWcgPSAwOwoJcHJpbnRfZmxhZyA9IDE7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJZXJyb3JfY291bnQgPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CglpZiAoIWFyZ2MpCgkJZ290byBERFJfVEVTVF9TVEFSVDsKCWlmIChhcmdjID4gMSkgewoJCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJCWxmbGFnID0gMTsKCQl9CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJoIikgPT0gMCl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJCWVsc2V7CgkJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQlsb29wID0gMTsKCQl9Cgl9CgkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0xKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoKCX0KCWlmIChhcmdjID4gMikgewoJCXN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgoJfQoJaWYgKGFyZ2MgPiAzKSB7CgkJdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJfQoJaWYgKHRlc3Rfc2l6ZTwweDEwMDApCgkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCglvbGRfcGF0dGVybl9mbGFnID0gMTsKCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAxOwoJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJLy9wcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0yKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkpCgkJewoJCQllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgkJfQoJfQoJaWYgKGFyZ2MgPjIpIHsKCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgIm4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJuIikgPT0gMCkpCgkJewoJCQlwcmludF9mbGFnID0gMDsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicCIpID09IDApKQoJCXsKCQkJY29weV90ZXN0X2ZsYWcgPSAxOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDA7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJCX0KCQllbHNlICBpZiAoIChzdHJjbXAoYXJndlsxXSwgImUiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApKQoJCXsKCQkJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCX0KCX0KCS8vcHJpbnRmKCJcbkxJTkUxPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CglpZiAoYXJnYyA+IDMpIHsKCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicCIpID09IDApKQoJCXsKCQkJY29weV90ZXN0X2ZsYWcgPSAxOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgIm4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAibiIpID09IDApKQoJCXsKCQkJcHJpbnRfZmxhZyA9IDA7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicyIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgImUiKSA9PSAwKSkKCQl7CgkJCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCQl9Cgl9CgoJLy8gICAgcHJpbnRmKCJcbkxJTkUyPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkvLwlwcmludGYoIlxuTElORTM9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgpERFJfVEVTVF9TVEFSVDoKCgkvLy8qCglkbyB7CgkJaWYgKGxmbGFnKQoJCQlsb29wID0gODg4OwoKCQlpZiAob2xkX3BhdHRlcm5fZmxhZyA9PSAxKQoJCXsKCQkJewoJCQkJLy8JcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCWlmIChwcmludF9mbGFnKQoJCQkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJLy8JIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQl9CgkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxuRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCQkJe2lmKHByaW50X2ZsYWcpCgkJCQkJcHJpbnRmKCJcbiBjb3B5X3Rlc3RfZmxhZyA9IDEsc3RhcnQgY29weSB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplLzIgKTsKCQkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQl9CgoJCQl9CgkJCXsKCQkJCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5TdGFydCAqNCBub3JtYWwgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCX0KCQkJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJCQlpZiAoY29weV90ZXN0X2ZsYWcpCgkJCQl7CgoJCQkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CgkJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQl9CgoKCQkJfQoJCX0KCgkJaWYgKHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPT0gMSkKCQl7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCX0KCQkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKQoJCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCQl7CgkJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQl9CgoJCX0KCgkJaWYgKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID09IDEpCgkJe2lmKHByaW50X2ZsYWcpewoJCQkJCQkgICBwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCQkgICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCQkgICB9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTt9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkvLy8qCgkJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTt9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbjIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpO30KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQlpZiAoY29weV90ZXN0X2ZsYWcpCgkJewoJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQl9CgkJLy8gICAgKi8KCgkJfQoKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcbkVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KClVfQk9PVF9DTUQoCglkZHJ0ZXN0LAk1LAkxLAlkb19kZHJfdGVzdCwKCSJERFIgdGVzdCBmdW5jdGlvbiIsCgkiZGRydGVzdCBbTE9PUF0gW0FERFJdLkRlZmF1bHQgYWRkcmVzcyBpcyAweDhkMDAwMDAwXG4iCik7CgppbnQgZG9fZGRyX3NwZWNpYWxfdGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIGxmbGFnID0gMDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHdyaXRlX3RpbWVzID0gMTsKCXVuc2lnbmVkIGludCAgcmVhZF90aW1lcyA9IDM7CgkvLyAgdW5zaWduZWQgaW50ICAgb2xkX3BhdHRlcm5fZmxhZyA9IDE7CgoJdW5zaWduZWQgaW50ICAgcHJpbnRfZmxhZyA9IDE7CgkvLwkgIGNvcHlfdGVzdF9mbGFnID0gMDsKCXByaW50X2ZsYWcgPSAxOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MDsKCWVycm9yX2NvdW50ID0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJbGZsYWcgPSAxOwoJfQoJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJoIikgPT0gMCl7CgkJZ290byB1c2FnZTsKCX0KCWVsc2V7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDEwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KCgkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0xKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoKCX0KCWlmIChhcmdjID4gMikgewoJCXN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgoJfQoJaWYgKGFyZ2MgPiAzKSB7CgkJdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJfQoJaWYgKHRlc3Rfc2l6ZTwweDEwMDApCgkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCWlmIChhcmdjID4gNCkgewoJCXdyaXRlX3RpbWVzID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXdyaXRlX3RpbWVzID0gMDsKCgl9CglpZiAoYXJnYyA+IDUpIHsKCQlyZWFkX3RpbWVzID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXJlYWRfdGltZXMgPSAwOwoKCX0KCXVuc2lnbmVkIGludCAgYmFzZV9wYXR0ZXJuID0gMTsKCXVuc2lnbmVkIGludCAgaW5jX2ZsYWcgPSAxOwoJaWYgKGFyZ2MgPiA2KSB7CgkJYmFzZV9wYXR0ZXJuID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWJhc2VfcGF0dGVybiA9IDA7CgoJfQoJaWYgKGFyZ2MgPiA3KSB7CgkJaW5jX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJaW5jX2ZsYWcgPSAwOwoKCX0KCgoJdW5zaWduZWQgaW50ICBjb3VudCAgICA9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3ZhbCA9IDE7CgoJLy8vKgoJZG8gewoJCWlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJaWYgKDEpCgkJewoKCQkJZm9yIChpPTA7aTx3cml0ZV90aW1lczspCgkJCXtpKys7CgkJCQlwcmludGYoIlxud3JpdGVfdGltZXM9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpaSkpOwoJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHI7CgkJCQl0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CgkJCQljb3VudD0odGVzdF9zaXplPj4yKTsKCQkJCWRvCgkJCQl7CgkJCQkJd3JpdGVsKHRlc3RfdmFsLCh1bnNpZ25lZCBsb25nKXRlc3RfYWRkcik7CgkJCQkJdGVzdF9hZGRyPXRlc3RfYWRkcis0OwoJCQkJCWlmIChpbmNfZmxhZykKCQkJCQkJdGVzdF92YWw9dGVzdF92YWwrMTsKCgkJCQl9CgkJCQl3aGlsZSAoY291bnQtLSkgOwoJCQl9CgoJCQlmb3IgKGk9MDtpPHJlYWRfdGltZXM7KQoJCQl7aSsrOwoJCQkJcHJpbnRmKCJcbnJlYWRfdGltZXM9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpaSkpOwoJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHI7CgkJCQl0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CgkJCQljb3VudD0odGVzdF9zaXplPj4yKTsKCgkJCQlkbwoJCQkJewoKCQkJCQkvL3dyaXRlbCh2YWwsKHVuc2lnbmVkIGxvbmcpcmVnKTsKCQkJCQlpZiAodGVzdF92YWwgIT0gKHJlYWRsKCh1bnNpZ25lZCBsb25nKXRlc3RfYWRkcikpKSB7CgoJCQkJCQlwcmludGYoIlxuYWRkPT0weCUwOHgscGF0dGVybj09MHglMDh4LHJlYWQ9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSwoKHVuc2lnbmVkIGludCl0ZXN0X3ZhbCksKHJlYWRsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSkpOwoJCQkJCX0KCQkJCQl0ZXN0X2FkZHI9dGVzdF9hZGRyKzQ7CgkJCQkJaWYgKGluY19mbGFnKQoJCQkJCQl0ZXN0X3ZhbD10ZXN0X3ZhbCsxOwoJCQkJfQoJCQkJd2hpbGUgKGNvdW50LS0pIDsKCQkJfQoJCX0KCgoKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcbkVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9zcGVjX3Rlc3QsCTgsCTEsCWRvX2Rkcl9zcGVjaWFsX3Rlc3QsCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXSBbc2l6ZV0gW3dyaXRlX3RpbWVzXSBbcmVhZCB0aW1lc10gW3BhdHRlcm5dIFtpbmNdLmRkcl9zcGVjX3Rlc3QgMSAweDEwODAwMDAgMHgyMDAwMDAgMSAgMyAxIDEgXG4iCik7CgppbnQgZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKI2RlZmluZSBURVNUX09GRlNFVCAgMC8vMFg0MDAwMDAwMAoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoKCWVycm9yX2NvdW50PTA7CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCXRyYWluaW5nX3BhdHRlcm5fZmxhZz0wOwojZW5kaWYKCS8vLyoKCWlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgl7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCWlmIChlcnJvcl9jb3VudCkKCQkJcmV0dXJuIDE7CgkJZWxzZQoJCQlyZXR1cm4gMDsKCX0KCWVsc2UKCXsKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgkJZGRyX3Rlc3RfZ3hfdHJhaW5pbmdfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgoJfQoKCXsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7Cgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7Cgl9CglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIGVycm9yX2NvdW50OwoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCQkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCXsKCQkJaWYgKGVycm9yX2NvdW50KQoJCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJCXByaW50ZigiXG4gc3RhcnQgY29weSB0ZXN0ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLzIgKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCX0KCX0KCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cgl9CgoKCmludCBkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybl9xdWlja19yZXRydW4oaW50IGRkcl90ZXN0X3NpemUpCnsKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7CgkjZGVmaW5lIFRFU1RfT0ZGU0VUICAwLy8wWDQwMDAwMDAwCgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSK1RFU1RfT0ZGU0VUOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgoJZXJyb3JfY291bnQ9MDsKCgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQl0cmFpbmluZ19wYXR0ZXJuX2ZsYWc9MDsKCSNlbmRpZgoJLy8vKgoJaWYgKHRyYWluaW5nX3BhdHRlcm5fZmxhZykKCXsKCSNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkjZW5kaWYKCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gMTsKCWVsc2UKCQlyZXR1cm4gMDsKCX0KCWVsc2UKCXsKCSNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkjZW5kaWYKCX0KCS8vCQkJKi8KCS8qCglkZHJfdGVzdF9neF9jcm9zc190YWxrX3BhdHRlcm4oIGRkcl90ZXN0X3NpemUpOwoJaWYgKGVycm9yX2NvdW50KQoJcmV0dXJuIDE7CgllbHNlCglyZXR1cm4gMDsKCSovCgoJewoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGUoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgcGF0dGVybjQgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKCQlwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCX0KCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCgl9CgoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCQkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkgLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCXsKCQkJcHJpbnRmKCJcbiBzdGFydCBjb3B5IHRlc3QgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUvMiApOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwgZGRyX3Rlc3Rfc2l6ZS8yKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJfQoKCX0KCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCgppbnQgZG9fZGRyMnBsbF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJZXh0ZXJuIGludCBkb19kZHIycGxsX2cxMl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKCWRvX2RkcjJwbGxfZzEyX2NtZChjbWR0cCxmbGFnLGFyZ2MsIGFyZ3YpOwoJcmV0dXJuIDE7CiNlbmRpZgp9CgppbnQgZG9fZGRyX3Vib290X25ld19jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL2Rkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIGNtZF9vZmZzZXQgY21kX3ZhbHVlIHZhbHVlX3NpemUgcmVzZXRfZW5hYmxlCiNpZiAxCgojZGVmaW5lIEREUl9TVElDS1lfT1ZFUlJJREVfQ09ORklHX01FU1NBR0VfQ01ECTB4MSAvL292ZXJyaWRlIGNvbmZpZwojZGVmaW5lIEREUl9TVElDS1lfU1BFQ0lBTF9GVU5DVElPTl9DTUQJCQkweDIgLy9zcGVjaWFsIHRlc3Qgc3VjaCBhcyBzaGlmdCBzb21lIGJkbHIgb3IgcGFyYW1ldGVyIG9yIGludGVybGVhdmUgdGVzdAojZGVmaW5lIEcxMl9ETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODgwMCkKCXVpbnQzMl90IG1hZ2ljX2NoaXBpZD0gMDsvL3JkX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzApOwoJdWludDMyX3Qgc3RpY2t5X2NtZCA9IDA7Ly9yZF9yZWcoUF9QUkVHX1NUSUNLWV9SRUcxKTsKCXVpbnQzMl90IGNtZF9vZmZzZXQgPSAwOwoJdWludDMyX3QgY21kX3ZhbHVlID0gMDsKCXVpbnQzMl90IHJlc2V0X2VuYWJsZSA9IDA7Cgl1aW50MzJfdCB2YWx1ZV9zaXplID0gNDsKCWNoYXIgKmVuZHA7CgkvL2JpdCAwIHRyaWdnZXIgZWZmZWN0IHJlc2V0LgoJaWYgKChtYWdpY19jaGlwaWQpICE9ICgoRERSX1NUSUNLWV9NQUdJQ19OVU1CRVIrRERSX0NISVBfSUQpJjB4ZmZmZjAwMDApKSB7CgkJLy9tYWdpYyBudW1iZXIgbm90IG1hdGNoCgkJLy8JbWFnaWNfY2hpcGlkPUREUl9TVElDS1lfTUFHSUNfTlVNQkVSK0REUl9DSElQX0lEOwoJCS8vCXN0aWNreV9jbWQ9RERSX1NUSUNLWV9PVkVSUklERV9DT05GSUdfTUVTU0FHRV9DTUQ7CgkJcHJpbnRmKCJzdGlja3kwIG1hZ2ljIG5vdCBtYXRjaFxuIik7CgoJfQoKCgkvLwl3cl9yZWcoUF9QUkVHX1NUSUNLWV9SRUcwLCAwKTsKCS8vCXdyX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzEsIDApOwoKCgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCgoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CgoJbWFnaWNfY2hpcGlkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IVxuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoYXJnYyA+MikKCXsKCQlzdGlja3lfY21kID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja3lfY21kID0gMDsKCQl9Cgl9CgoJaWYgKGFyZ2MgPjMpCgl7CgkJY21kX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJY21kX29mZnNldCA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjQpCgl7CgkJY21kX3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWNtZF92YWx1ZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjUpCgl7CgkJdmFsdWVfc2l6ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQl2YWx1ZV9zaXplID0gNDsKCQl9Cgl9CglpZiAoYXJnYyA+NikKCXsKCQlyZXNldF9lbmFibGU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJcmVzZXRfZW5hYmxlID0gMDsKCQl9Cgl9CglwcmludGYoImNtZF9vZmZzZXRbMHglMDh4fT09Y21kX3ZhbHVlIFsweCUwOHhdXG4iLCBjbWRfb2Zmc2V0LGNtZF92YWx1ZSk7Cgl3cml0ZWwoKG1hZ2ljX2NoaXBpZCYweGZmZmYwMDAwKXwocmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzApKSwgUFJFR19TVElDS1lfUkVHMCk7Cgl3cml0ZWwoc3RpY2t5X2NtZCwgUFJFR19TVElDS1lfUkVHMSk7CgoJdWludDMyX3QgcmVhZF92YWx1ZSA9IDA7CglpZiAodmFsdWVfc2l6ZSkKCXsKCQlyZWFkX3ZhbHVlPXJkX3JlZyhHMTJfRE1DX1NUSUNLWV8wKygoY21kX29mZnNldC80KTw8MikpOwoJCWlmICh2YWx1ZV9zaXplID09IDEpIHsKCQkJd3JfcmVnKChHMTJfRE1DX1NUSUNLWV8wKygoY21kX29mZnNldC80KTw8MikpLCAoKGNtZF92YWx1ZTw8KChjbWRfb2Zmc2V0JTQpKjgpKXwocmVhZF92YWx1ZSYofigweGZmPDwoKGNtZF9vZmZzZXQlNCkqOCkpKSkpKTsKCQl9CgkJaWYgKHZhbHVlX3NpemUgPT0gMikgewoJCQl3cl9yZWcoKEcxMl9ETUNfU1RJQ0tZXzArKChjbWRfb2Zmc2V0LzQpPDwyKSksICgoY21kX3ZhbHVlPDwoKGNtZF9vZmZzZXQlNCkqOCkpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8KChjbWRfb2Zmc2V0JTQpKjgpKSkpKSk7CgkJfQoJCWlmICh2YWx1ZV9zaXplID09IDQpIHsKCQkJLy8Jd3JfcmVnKChHMTJfRE1DX1NUSUNLWV8wK2NtZF9vZmZzZXQvNCksICgoY21kX3ZhbHVlPDwoKGNtZF9vZmZzZXQlNCkqOCkpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8KChjbWRfb2Zmc2V0JTQpKjgpKSkpKSk7CgkJCXdyX3JlZygoRzEyX0RNQ19TVElDS1lfMCsoKGNtZF9vZmZzZXQvNCk8PDIpKSwgY21kX3ZhbHVlKTsKCQl9CgoKCgoJCXByaW50ZigiRE1DX1NUSUNLWV8wXyBvZmZzZXRbMHglMDh4fT09IFsweCUwOHhdXG4iLCBjbWRfb2Zmc2V0LHJlYWRsKChHMTJfRE1DX1NUSUNLWV8wKygoY21kX29mZnNldC80KTw8MikpKSk7Cgl9CgoKCXByaW50ZigiUFJFR19TVElDS1lfUkVHMD09IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcwKSk7CgoJaWYgKHJlc2V0X2VuYWJsZSkKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCgkJd2hpbGUgKDEpIDsKCX0KCXJldHVybiAwOwoKdXNhZ2U6CgoKCgoKCWNtZF91c2FnZShjbWR0cCk7CgojZW5kaWYKCXJldHVybiAxOwp9CgoKdW5zaWduZWQgaW50CmRvX3Rlc3RfYWRkcmVzc19idXModm9sYXRpbGUgdW5zaWduZWQgaW50ICogYmFzZUFkZHJlc3MsIHVuc2lnbmVkIGludCBuQnl0ZXMpCnsKCXVuc2lnbmVkIGludCBhZGRyZXNzTWFzayA9IChuQnl0ZXMvc2l6ZW9mKHVuc2lnbmVkIGludCkgLSAxKTsKCXVuc2lnbmVkIGludCBvZmZzZXQ7Cgl1bnNpZ25lZCBpbnQgdGVzdE9mZnNldDsKCgl1bnNpZ25lZCBpbnQgcGF0dGVybgkgPSAodW5zaWduZWQgaW50KSAweEFBQUFBQUFBOwoJdW5zaWduZWQgaW50IGFudGlwYXR0ZXJuID0gKHVuc2lnbmVkIGludCkgMHg1NTU1NTU1NTsKCgl1bnNpZ25lZCBpbnQgZGF0YTEsIGRhdGEyOwoKCXVuc2lnbmVkIGludCByZXQgPSAwOwoKCS8qCgkgKiBXcml0ZSB0aGUgZGVmYXVsdCBwYXR0ZXJuIGF0IGVhY2ggb2YgdGhlIHBvd2VyLW9mLXR3byBvZmZzZXRzLgoJICovCglmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJewoJCWJhc2VBZGRyZXNzW29mZnNldF0gPSBwYXR0ZXJuOwoJfQoKCS8qCgkgKiBDaGVjayBmb3IgYWRkcmVzcyBiaXRzIHN0dWNrIGhpZ2guCgkgKi8KCXRlc3RPZmZzZXQgPSAwOwoJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBhbnRpcGF0dGVybjsKCglmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJewoJCWRhdGExID0gYmFzZUFkZHJlc3Nbb2Zmc2V0XTsKCQlkYXRhMiA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJaWYgKGRhdGExICE9IGRhdGEyKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzIC0gcmVhZCB0d2ljZSBkaWZmZXJlbnRbb2Zmc2V0XTogMHglOHgtMHglOHhcbiIsIGRhdGExLCBkYXRhMik7CgkJCXJldCA9IDE7CgkJfQoJCWlmIChkYXRhMSAhPSBwYXR0ZXJuKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzIC0gd3JpdGVbMHglOHhdOiAweCU4eCwgcmVhZFsweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJb2Zmc2V0LCBwYXR0ZXJuLCBvZmZzZXQsIGRhdGExKTsKCQkJcmV0ID0gMTsKCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQl9Cgl9CgoJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBwYXR0ZXJuOwoKCS8qCgkgKiBDaGVjayBmb3IgYWRkcmVzcyBiaXRzIHN0dWNrIGxvdyBvciBzaG9ydGVkLgoJICovCglmb3IgKHRlc3RPZmZzZXQgPSAxOyAodGVzdE9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyB0ZXN0T2Zmc2V0IDw8PSAxKQoJewoJCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gYW50aXBhdHRlcm47CgoJCWlmIChiYXNlQWRkcmVzc1swXSAhPSBwYXR0ZXJuKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzMiAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMF06IDB4JTh4XG4iLCBcCgkJCQkJdGVzdE9mZnNldCwgYW50aXBhdHRlcm4sIGJhc2VBZGRyZXNzWzBdKTsKCQkJcmV0ID0gMTsKCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSk7CgkJfQoKCQlmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJCXsKCQkJZGF0YTEgPSBiYXNlQWRkcmVzc1tvZmZzZXRdOwoJCQlpZiAoKGRhdGExICE9IHBhdHRlcm4pICYmIChvZmZzZXQgIT0gdGVzdE9mZnNldCkpCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czMgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJdGVzdE9mZnNldCwgYW50aXBhdHRlcm4sIHRlc3RPZmZzZXQsIGRhdGExKTsKCQkJCXJldCA9IDE7CgkJCQkvL3JldHVybiAoKHVuc2lnbmVkIGludCkgJmJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdKTsKCQkJfQoJCX0KCgkJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBwYXR0ZXJuOwoJfQoKCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoJCWlmICgoKH5vZmZzZXQpIDw9IGFkZHJlc3NNYXNrKSApCgkJewoJCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCQkJYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKTsgb2Zmc2V0KyspCgl7CgkJaWYgKCgofm9mZnNldCkgPD0gYWRkcmVzc01hc2spICkKCQl7CgkJCWlmIChiYXNlQWRkcmVzc1tvZmZzZXRdICE9IHBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czQgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJb2Zmc2V0LCBwYXR0ZXJuLCBvZmZzZXQsIGJhc2VBZGRyZXNzW29mZnNldF0pOwoKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKGJhc2VBZGRyZXNzWyh+b2Zmc2V0KV0gIT0gYW50aXBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czUgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJKCh+b2Zmc2V0KSksIGFudGlwYXR0ZXJuLCAoKH5vZmZzZXQpKSwgYmFzZUFkZHJlc3NbKCh+b2Zmc2V0KSldKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglpZiAocmV0KQoJe3JldHVybiAocmV0KTsKCX0KCS8vdW5zaWduZWQgaW50IHN1cV92YWx1ZTsKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spIDsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj0oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJCS8vYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKTsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj0oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNiAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQlvZmZzZXQscGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCgkJfQoJfQoJaWYgKHJldCkKCXtyZXR1cm4gKHJldCk7Cgl9Cglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoKCQl7CgkJCXBhdHRlcm49figob2Zmc2V0PDwyKS1vZmZzZXQpOwoJCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCQkJLy9iYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spOyBvZmZzZXQrKykKCXsKCgkJewoJCQlwYXR0ZXJuPX4oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNyAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQlvZmZzZXQscGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCgkJfQoJfQoKCglyZXR1cm4gKHJldCk7Cn0gICAvKiBtZW1UZXN0QWRkcmVzc0J1cygpICovCgppbnQgZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCWVycm9yX2NvdW50PTA7CgkvLy8qCglwcmludGYoIlxyU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGUoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vKi8KCS8qCgkgICBwcmludGYoIlxyU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBkZHJfd3JpdGU0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICovCglkZHJfd3JpdGVfZnVsbCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSwweDAsMHgzKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfZnVsbCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSwwLDMpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9mdWxsKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLDAsMyk7CgoKCXByaW50ZigiXHJTdGFydCB3cml0aW5nIGFkZCBwYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglpZiAoZG9fdGVzdF9hZGRyZXNzX2J1cygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSkpCgkJZXJyb3JfY291bnQrKzsKCgoJLyoKCSAgIHByaW50ZigiXG5TdGFydCAqNCBubyBjcm9zcyB0YWxrIHBhdHRlcm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIGRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkvL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQoJewoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCgl9CgoJewoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgp9CgkqLwppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKCWVsc2UKCXJldHVybiAwOwoJfQoKaW50IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYSh1bnNpZ25lZCBpbnQgZGRyX3BsbCkKewoJdW5zaWduZWQgaW50IGRkcl9jbGs9MDsKCXVuc2lnbmVkIGludCBvZF9kaXY9MHhmZmY7CglkZHJfcGxsPWRkcl9wbGwmMHhmZmZmZjsKI2lmIDEvLyAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJLy91bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpLygoKGRkcl9wbGw+PjIpJjB4MykrMSkpOyAgLy9vZDEgIG9kCglpZiAoKChkZHJfcGxsPj4xNikmNykgPT0gMCkKCQlvZF9kaXY9MjsKCWlmICgoKGRkcl9wbGw+PjE2KSY3KSA9PSAxKQoJCW9kX2Rpdj0zOwoKCWlmICgoKGRkcl9wbGw+PjE2KSY3KSA9PSAyKQoJCW9kX2Rpdj00OwoKCWlmICgoKGRkcl9wbGw+PjE2KSY3KSA9PSAzKQoJCW9kX2Rpdj02OwoKCWlmICgoKGRkcl9wbGw+PjE2KSY3KSA9PSA0KQoJCW9kX2Rpdj04OwoKCWlmICgoKGRkcl9wbGw+PjEwKSYweDFmKSkKCQlkZHJfY2xrID0gMiooKCgoMjQgKiAoKGRkcl9wbGw+PjApJjB4MWZmKSkvKChkZHJfcGxsPj4xMCkmMHgxZikpPj4oKCgoZGRyX3BsbD4+MTkpJjB4MSk9PTEpPygyKTooMSkpKSkvb2RfZGl2OwoKI2Vsc2UKCWRkcl9jbGsgPSAyKigoKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKSk7CgojZW5kaWYKCgoJcmV0dXJuIGRkcl9jbGs7Cn0KCgppbnQgZGRyX2Nsa19jb252ZXJ0X3RvX3BsbF9nMTJhKHVuc2lnbmVkIGludCBkZHJfY2xrLCB1bnNpZ25lZCBjaGFyIHBsbF9ieXBhc3NfZW4pCnsKCXVpbnQzMl90IGRkcl9wbGxfdmNvX2N0cmw9MDsKCXVpbnQzMl90IGRkcl9wbGxfdmNvX209MDsKCXVpbnQzMl90IGRkcl9wbGxfdmNvX249MDsKCXVpbnQzMl90IGRkcl9wbGxfdmNvX2N0cmxfb2Q9MDsKCXVpbnQzMl90IGRkcl9wbGxfdmNvX2N0cmxfb2QxPTA7CglkZHJfcGxsX3Zjb19uPTE7CglpZiAocGxsX2J5cGFzc19lbiA9PSAwKSB7CgkJaWYgKChkZHJfY2xrID49NDgwMC80KSkgewoJCQkvL2RhdGFyYXRlPT12Y28gc2hvdWxkIDMtNC44ZwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTE7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MjsgLy8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMykvMjQ7IC8vNgoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+NDgwMC82KSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTI7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MjsgLy8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqNCkvMjQ7IC8vOAoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+IDQ4MDAvOCkpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0zOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjYpLzI0OyAvLzEyCgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrID4gNDgwMC8xMikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD00OwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjgpLzI0OyAvLzE2CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrID4gMzYwKSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTM7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MzsgLy8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMTIpLzI0OwoJCX0KCQllbHNlIHsKCQkJLy8zMiAgIHNob3VsZCA+MjAwTQoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTQ7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MzsvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoxNikvMjQ7CgkJfQoJfQoJaWYgKHBsbF9ieXBhc3NfZW4gPT0gMSkgewoJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MzsvLzAKCQlpZiAoKGRkcl9jbGsgPj04MDApKSB7CgkJCS8vZGF0YXJhdGU9PXZjbyBzaG91bGQgMi40LTQuOGcKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0wOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjQpLzI0OwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA8IDQ4MDAvNikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0xOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqMykvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC84KSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTI7CgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMio0KS8yNDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPCA0ODAwLzEyKSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTM7CgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMio2KS8yNDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPCA0ODAwLzE2KSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTQ7CgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMio4KS8yNDsKCQl9Cgl9CglkZHJfcGxsX3Zjb19jdHJsPWRkcl9wbGxfdmNvX218KGRkcl9wbGxfdmNvX248PDEwKXwoZGRyX3BsbF92Y29fY3RybF9vZDw8MTYpfChkZHJfcGxsX3Zjb19jdHJsX29kMTw8MTkpOwoJcmV0dXJuIGRkcl9wbGxfdmNvX2N0cmw7CgoJLy9yZXR1cm4gZGRyX3BsbF92Y29fY3RybDsKfQppbnQgcGxsX2NvbnZlcnRfdG9fZGRyX2Nsayh1bnNpZ25lZCBpbnQgZGRyX3BsbCkKewoJdW5zaWduZWQgaW50IGRkcl9jbGs9MDsKCWRkcl9wbGw9ZGRyX3BsbCYweGZmZmZmOwoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCS8vICAgcHJpbnRmKCJcbmcxMiBkZHJfcGxsPT0gJTA4eCBcbiIsIGRkcl9wbGwpOwoJZGRyX2Nsaz1wbGxfY29udmVydF90b19kZHJfY2xrX2cxMmEoICBkZHJfcGxsKTsKCXJldHVybiBkZHJfY2xrOwojZW5kaWYKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkvL3Vuc2lnbmVkIGludCBkZHJfY2xrID0gMiooKCgoMjQgKiAoKGRkcl9wbGw+PjQpJjB4MWZmKSkvKChkZHJfcGxsPj4xNikmMHgxZikpPj4oKCgoZGRyX3BsbD4+MCkmMHgzKT09Myk/KDIpOigoKGRkcl9wbGw+PjApJjB4MykpKSkvKCgoZGRyX3BsbD4+MikmMHgzKSsxKSk7CglpZiAoKChkZHJfcGxsPj4xNikmMHgxZikpCgoJCWRkcl9jbGsgPSAyKigoKCgyNCAqICgoZGRyX3BsbD4+NCkmMHgxZmYpKS8oKGRkcl9wbGw+PjE2KSYweDFmKSk+PigoKChkZHJfcGxsPj4wKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MCkmMHgzKSkpKT4+KCgoKGRkcl9wbGw+PjIpJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4yKSYweDMpKSkpOwoKI2Vsc2UKCWlmICgoZGRyX3BsbD4+OSkmMHgxZikKCQlkZHJfY2xrID0gMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09IFBfRERSX1BIWV9ERUZBVUxUKQoJaWYgKChkZHJfcGxsPj45KSYweDFmKQoJCWRkcl9jbGsgPSAyKigoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpOwojZW5kaWYKCglyZXR1cm4gZGRyX2NsazsKfQoKaW50IGRkcl9jbGtfY29udmVydF90b19wbGwodW5zaWduZWQgaW50IGRkcl9jbGspCnsKCXVuc2lnbmVkIGludCBkZHJfcGxsPTB4MTAyMjE7CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJZGRyX3BsbD1kZHJfY2xrX2NvbnZlcnRfdG9fcGxsX2cxMmEoICBkZHJfY2xrLDApOwoJcmV0dXJuIGRkcl9wbGw7CiNlbmRpZgoKCS8qIHNldCBkZHIgcGxsIHJlZyAqLwoJaWYgKChkZHJfY2xrID49IDQwKSAmJiAoZGRyX2NsayA8IDc1MCkpIHsKCQkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMiA8PCAxNikgfCAoMSA8PCA5KSB8ICgoKChkZHJfY2xrLzYpKjYpLzEyKSA8PCAwKTsKCX0KCWVsc2UgaWYoKGRkcl9jbGsgPj0gNzUwKSAmJiAoZGRyX2NsayA8IDIwMDApKSB7CgkJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDEgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKCgoZGRyX2Nsay8xMikqMTIpLzI0KSA8PCAwKTsKCX0KCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJZGRyX3BsbD0weDAwMTA0YzU7CgkvKiBzZXQgZGRyIHBsbCByZWcgKi8KCS8qCgkgICBpZiAoKGRkcl9jbGsgPj0gNDApICYmIChkZHJfY2xrIDwgNzUwKSkgewoJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCglkZHJfcGxsPSAoMiA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrLzYpKjYpLzEyKSA8PCA0KTsKCX0KCWVsc2UgaWYoKGRkcl9jbGsgPj0gNzUwKSAmJiAoZGRyX2NsayA8IDIwMDApKSB7CgkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCWRkcl9wbGw9ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsvMTIpKjEyKS8yNCkgPDwgNCk7Cgl9CgkqLwoJaWYgKChkZHJfY2xrIDwgMjAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDApIHwgKDMgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsayo2KS82KS8zKSA8PCA0KTsKCX0KCWVsc2UgaWYgKChkZHJfY2xrPj0gMjAwKSAmJiAoZGRyX2NsazwgNDAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDApIHwgKDEgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsayo2KS82KS82KSA8PCA0KTsKCX0KCWVsc2UgaWYgKChkZHJfY2xrPj0gNDAwKSAmJiAoZGRyX2NsayA8IDgwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMSA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqMTIpLzEyKS8xMikgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2NsayA+PSA4MDApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMCA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqMTIpLzEyKS8yNCkgPDwgNCk7Cgl9CiNlbmRpZgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSBQX0REUl9QSFlfREVGQVVMVCkKCXsKCgoJCWlmICgoZGRyX2NsayA8IDc1MCkpIHsKCQkJLy8JCU9ECQkJTgkJTQoJCQlkZHJfcGxsPSAoMiA8PCAxNikgfCAoMSA8PCA5KSB8ICgoKGRkcl9jbGsvMjQpKjIpPDwgMCkgOwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+PSA3NTApKSB7CgkJCS8vCQlPRAkJCU4JCU0KCQkJZGRyX3BsbD0gKDEgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKGRkcl9jbGsvMjQpPDwgMCkgOwoJCX0KCgl9CiNlbmRpZgoKCXJldHVybiBkZHJfcGxsOwp9Cgp2b2lkIGRkcl9tZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVpbnQzMl90IGxlbikKewoJLy9lbmFibGVfbW11X2VsMV9zKCk7CgkvL3ByaW50ZigiXG5sZW49PSVkLCIsbGVuKTsKCS8vcHJpbnRmKGxlbik7CgkvL3NlcmlhbF9wdXRzKCJcbiIpOwoJLy91aW50MzJfdCBkZHJfdGVzdF9zdGFydF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCS8vY29uc3QgY2hhciAqcyA9IHNyYzsKCS8vY2hhciAqZCA9IGRzdDsKCWxlbj0obGVuPj4zKTsKCWNvbnN0IGxvbmcgbG9uZyAqcyA9IHNyYzsKCWxvbmcgbG9uZyAqZCA9IGRzdDsKCSNpZmRlZiBURVNUX0wxX0NBQ0hFCgl2b2lkICpib3VuZD0odm9pZCAqKXNyYysxNioxMDI0OyAvL2RlYnVnIGZvciB0ZXN0IEwxIGNhY2hlICxpZiBvbmx5IHJlYWQgd3JpdGUgc21hbGwgYXJlYWQKCSNlbmRpZgoJCWlmIChwcmVfZmV0Y2hfZW5hYmxlKQoJCQl7Cgl3aGlsZSAobGVuKQoJewoJLy9pZihwcmVfZmV0Y2hfZW5hYmxlKQoJCS8vZm9yIGJlc3QgdGVzdCBlZmZpY2llbmN5ICBub3QgaW5jbHVlZCBtdWNoIG1vcmUgY29kZSBpbiB0aGUgd2hpbGUgbG9vcAoJCWRkcl9wbGRfY2FjaGUocykgOwoJCS8vLzEgdGltZXMgICBsZW49PTMzNTU0NDMyICAgY29weSB0aW1lPT0xODE5MiB1cyAgIDEuMmcgIGJhbmR3aWR0aCAzNjg4TS9TCgkJLy8gNHRpbWVzICAgbGVuPT0zMzU1NDQzMiAgIGNvcHkgdGltZT09MTE4NDQgdXMgICAxLjJnICBiYW5kd2lkdGggNTY2Nk0vUwoJCS8vIDh0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQlsZW49bGVuLTQ7CgkJI2lmZGVmIFRFU1RfTDFfQ0FDSEUKCQlpZiAoKHZvaWQgKilzID49Ym91bmQpCgkJCXsKCQkJICBzPXNyYzsKCQkgICAgICAgICBkPWRzdDsKCQkJIH0KCQkjZW5kaWYKCX0KCQkJfQoJZWxzZQoJCXsKCXdoaWxlIChsZW4pCgl7ICAvL2ZvciBiZXN0IHRlc3QgZWZmaWNpZW5jeSAgbm90IGluY2x1ZWQgbXVjaCBtb3JlIGNvZGUgaW4gdGhlIHdoaWxlIGxvb3AKCS8vaWYocHJlX2ZldGNoX2VuYWJsZSkKCgkvLwlkZHJfcGxkX2NhY2hlKHMpIDsKCQkvLy8xIHRpbWVzICAgbGVuPT0zMzU1NDQzMiAgIGNvcHkgdGltZT09MTgxOTIgdXMgICAxLjJnICBiYW5kd2lkdGggMzY4OE0vUwoJCS8vIDR0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCQkvLyA4dGltZXMgICBsZW49PTMzNTU0NDMyICAgY29weSB0aW1lPT0xMTg0NCB1cyAgIDEuMmcgIGJhbmR3aWR0aCA1NjY2TS9TCgkJKmQrKyA9ICpzKys7CgkJKmQrKyA9ICpzKys7CgkJKmQrKyA9ICpzKys7CgkJKmQrKyA9ICpzKys7CgkJbGVuPWxlbi00OwoJCSNpZmRlZiBURVNUX0wxX0NBQ0hFCgkJaWYgKCh2b2lkICopcyA+PWJvdW5kKQoJCQl7CgkJCSAgcz1zcmM7CgkJICAgICAgICAgZD1kc3Q7CgkJCSB9CgkJI2VuZGlmCgl9CgkJCX0KCS8vCXVpbnQzMl90IGRkcl90ZXN0X2VuZF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCS8vCXNlcmlhbF9wdXRzKCJcbmNvcHkgdGltZT09Iik7CgkvLwlzZXJpYWxfcHV0X2RlYyhkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKTsKCS8vCXNlcmlhbF9wdXRzKCJcbiIpOwoJLy9wcmludGYoIlxuY29weSB0aW1lPT0lZCB1cywiLChkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKSk7Cn0KCiNkZWZpbmUgUEFUVEVSTl9NQVRSSVhfWCAgICgzKzMyKzE2KzE3KSAgICAgLy82OCozMj09MjE3NiAvLy8yLjJrIC0weDg4MC0xIGxvb3AKI2RlZmluZSBQQVRURVJOX01BVFJJWF9ZICAoMzIpCiNkZWZpbmUgUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFICAgKChQQVRURVJOX01BVFJJWF9YKSooUEFUVEVSTl9NQVRSSVhfWSkqNCkKCnVuc2lnbmVkIGludCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcih1bnNpZ25lZCBpbnQgYWRkX29mZnNldCApCnsKCgl1bnNpZ25lZCBpbnQgcGF0dGVybl9zZWxlY3Q9MDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX3ZhbHVlPTA7CgkvL3Rlc3Rfc2l6ZT0odGVzdF9zaXplPjB4MTAwMDApP3Rlc3Rfc2l6ZToweDEwMDAwOwoJLy8JdWludDMyX3Qgd3JpdGVfYWRkciA9IHN0YXJ0X2FkZDsKCXVpbnQzMl90IG1hcnRpeF94X3NlbGVjdD0gMDsKCXVpbnQzMl90IG1hcnRpeF95X3NlbGVjdD0gMDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX3ZhbHVlX3RlbXBfMTY9MDsKCXsKCQkvLwl1aW50MzJfdCB0ZXN0X2VuZF9hZGQgPSBzdGFydF9hZGQrdGVzdF9zaXplOwoJCS8vCWZvcigod3JpdGVfYWRkcj1zdGFydF9hZGQpOyh3cml0ZV9hZGRyPHRlc3RfZW5kX2FkZCk7KQoJCXsKCQkJcGF0dGVybl9zZWxlY3Q9KChhZGRfb2Zmc2V0KSUoKFBBVFRFUk5fTUFUUklYX1kpKihQQVRURVJOX01BVFJJWF9YKSkpOwoJCQltYXJ0aXhfeF9zZWxlY3Q9cGF0dGVybl9zZWxlY3QvKFBBVFRFUk5fTUFUUklYX1kpOwoJCQltYXJ0aXhfeV9zZWxlY3Q9cGF0dGVybl9zZWxlY3QlKFBBVFRFUk5fTUFUUklYX1kpOwoJCQkvL3dyaXRlX2FkZHJfbmliYmxlX3N0YXJ0PSgoKChhZGRfb2Zmc2V0L1BBVFRFUk5fTUFUUklYX1kpL1BBVFRFUk5fTUFUUklYX1gpKSoKCQkJLy8JKCgoUEFUVEVSTl9NQVRSSVhfWSkqUEFUVEVSTl9NQVRSSVhfWCkpKTsKCQkJLy93cml0ZV9hZGRyX25pYmJsZV9zdGFydD0oKChhZGRfb2Zmc2V0KSVQQVRURVJOX01BVFJJWF9ZKSVQQVRURVJOX01BVFJJWF9YKQoJCQl7CgkJCQlpZiAobWFydGl4X3hfc2VsZWN0ID09IDApCgkJCQkJcGF0dGVybl92YWx1ZT0weGFhYWE1NTU1OyAgLy9mb3IgMTYgYml0IGJ1cyBwYXR0ZXJuCgoJCQkJaWYgKG1hcnRpeF94X3NlbGVjdCA9PSAxKQoJCQkJCXBhdHRlcm5fdmFsdWU9MHgwMDAwZmZmZjsgLy9mb3IgMTYgYml0IGJ1cyBwYXR0ZXJuCgoJCQkJaWYgKG1hcnRpeF94X3NlbGVjdCA9PSAyKQoJCQkJCXBhdHRlcm5fdmFsdWU9MDsKCgkJCQlpZiAoKG1hcnRpeF94X3NlbGVjdD4yKSAmJiAobWFydGl4X3hfc2VsZWN0PCgzKzMyKSkpCgkJCQl7CgkJCQkJcGF0dGVybl92YWx1ZT0xPDwobWFydGl4X3hfc2VsZWN0LTMpOwoJCQkJfQoJCQkJaWYgKChtYXJ0aXhfeF9zZWxlY3Q+KDIrMzIpKSAmJiAobWFydGl4X3hfc2VsZWN0PCgzKzMyKzE2KSkpICAgLy9mb3IgMTYgYml0IGJ1cyBwYXR0ZXJuCgkJCQl7CgkJCQkJcGF0dGVybl92YWx1ZV90ZW1wXzE2PSgxPDwobWFydGl4X3hfc2VsZWN0LTMtMzIpKTsKCQkJCQlwYXR0ZXJuX3ZhbHVlPXBhdHRlcm5fdmFsdWVfdGVtcF8xNnwoKH5wYXR0ZXJuX3ZhbHVlX3RlbXBfMTYpPDwxNik7CgkJCQl9CgkJCQlpZiAoKG1hcnRpeF94X3NlbGVjdD4oMiszMisxNikpICYmIChtYXJ0aXhfeF9zZWxlY3Q8KDMrMzIrMTYrMTcpKSkgICAvL2ZvciBkYmkgYnVzIHBhdHRlcm4gIDE3IGdyb3VwCgkJCQl7CgkJCQkJcGF0dGVybl92YWx1ZV90ZW1wXzE2PSgweDBmMGYrMHhmMGYqKG1hcnRpeF94X3NlbGVjdC0zLTMyLTE2KSk7CgkJCQkJcGF0dGVybl92YWx1ZT1wYXR0ZXJuX3ZhbHVlX3RlbXBfMTZ8KCh+cGF0dGVybl92YWx1ZV90ZW1wXzE2KTw8MTYpOwoJCQkJfQoJCQl9CgkJCWlmIChtYXJ0aXhfeV9zZWxlY3QlMikKCQkJcGF0dGVybl92YWx1ZT1+cGF0dGVybl92YWx1ZTsKCQl9Cgl9CgkvLwlzZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc0Iik7CglyZXR1cm4gcGF0dGVybl92YWx1ZTsKfQoKdm9pZCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEodW5zaWduZWQgaW50IHRlc3RfaW5pdF9zdGFydCx1bnNpZ25lZCBpbnQgdGVzdF9zaXplLHVuc2lnbmVkIGludCBwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyApCnsKCS8vCXByaW50ZigiXG4gMTExIik7CglpZiAocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcgPT0gMCkKCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPTE7ICAvL2ZvciBkaWZmZXJlbnQgIGZyZXF1ZW5jeSBwYXR0ZXJuCgl0ZXN0X3NpemU9KHRlc3Rfc2l6ZT4oKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpP3Rlc3Rfc2l6ZTooKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkvL3Vuc2lnbmVkIGludCB0ZXN0X3N0YXJ0PTB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCB3cml0ZV9hZGQ9dGVzdF9pbml0X3N0YXJ0OwoJdW5zaWduZWQgaW50IHNpemVfbG9vcD0wOwoJdW5zaWduZWQgaW50IHNpemVfbG9vcF9tYXg9MDsKCS8vdW5zaWduZWQgaW50IGNvdW50PTA7Cglmb3IgKDsoc2l6ZV9sb29wPCgoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKSk7KQoJewoJCS8vc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNSIpOwoKCQkvLwlmb3IoICBjb3VudD0wO2NvdW50PChwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyk7KQoJCXsKCQkJd3JpdGVfYWRkID0gKHVpbnQzMl90KShzaXplX2xvb3AgKyB0ZXN0X2luaXRfc3RhcnQpOwoJCQl3cl9yZWcoKHVuc2lnbmVkIGxvbmcpd3JpdGVfYWRkLCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcigoc2l6ZV9sb29wPj4yKS9wYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpOwoJCQlzaXplX2xvb3A9c2l6ZV9sb29wKzQ7CgkJfQoJCS8vCXNlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzYiKTsKCgkJLy8Jc2VyaWFsX3B1dHMoIiAiKTsKCQkjaWYgMAoJCXNlcmlhbF9wdXRfaGV4KHNpemVfbG9vcCwzMik7CgkJc2VyaWFsX3B1dHMoIiAiKTsKCQlzZXJpYWxfcHV0X2hleChjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcihzaXplX2xvb3A+PjIpLDMyKTsKCQkjZW5kaWYKCX0KCXNpemVfbG9vcD0xOwoJc2l6ZV9sb29wX21heD0oKHRlc3Rfc2l6ZS8oKChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKSkrMSk7Cglmb3IgKDsoc2l6ZV9sb29wPHNpemVfbG9vcF9tYXgpOykKCXsKCQkvLwlzZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc0MSIpOwoJCWRkcl9tZW1jcHkoKHZvaWQgKikodWludDY0X3QpKHRlc3RfaW5pdF9zdGFydCsoKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkqKHNpemVfbG9vcCkpLCAodm9pZCAqKSh1aW50NjRfdCl0ZXN0X2luaXRfc3RhcnQsICgoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKSk7CgkJLy9zZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc0MiIpOwoJCXNpemVfbG9vcCsrOwoJfQp9Cgp1bnNpZ25lZCBpbnQgY3B1X2Rkcl90ZXN0KHVuc2lnbmVkIHRlc3RfaW5pdF9zdGFydCx1bnNpZ25lZCBpbnQgc3RhcnRfYWRkLCB1bnNpZ25lZCBpbnQgdGVzdF9zaXplLCB1bnNpZ25lZCBpbnQgdGVzdF9kYXRhX2JpdF9lbmFibGUsdW5zaWduZWQgaW50IHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKQp7CgkvL3ByaW50ZigiXG4gMTExMiIpOwoKCXVuc2lnbmVkIGludCBzcmNfYWRkPXRlc3RfaW5pdF9zdGFydDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX3ZhbHVlPTA7Cgl1bnNpZ25lZCBpbnQgc2l6ZV9sb29wPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCByZWFkX2FkZD0wOwoJdW5zaWduZWQgaW50IHJlYWRfdmFsdWU9MDsKCXRlc3Rfc2l6ZT0odGVzdF9zaXplPjB4MjAwMCk/KHRlc3Rfc2l6ZSk6KDB4MjAwMCk7CgkvL2NwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fYXJlYSh0ZXN0X3NpemUpOwoJdWludDMyX3QgZGRyX3Rlc3Rfc3RhcnRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCglkZHJfbWVtY3B5KCh2b2lkICopKHVpbnQ2NF90KXN0YXJ0X2FkZCwgKHZvaWQgKikodWludDY0X3Qpc3JjX2FkZCwgdGVzdF9zaXplKTsKCXVpbnQzMl90IGRkcl90ZXN0X2VuZF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCXByaW50ZigiXG5jcHVfZGRyX3Rlc3RfdGVzdF9jb3B5X2JhbmR3aWR0aD09JWQgTWJ5dGUvc1xuIiwoMSp0ZXN0X3NpemUqMikvKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpKTsKCglmb3IgKDtzaXplX2xvb3A8KHRlc3Rfc2l6ZSk7KQoJewoJCXJlYWRfYWRkID0gKHVpbnQzMl90KShzaXplX2xvb3AgKyBzdGFydF9hZGQpOwoJCXJlYWRfdmFsdWU9KHJkX3JlZygodW5zaWduZWQgbG9uZylyZWFkX2FkZCkpOwoJCXBhdHRlcm5fdmFsdWU9KCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcigoc2l6ZV9sb29wPj4yKS9wYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpOwoJCWlmICgoKHRlc3RfZGF0YV9iaXRfZW5hYmxlKSZyZWFkX3ZhbHVlKSAhPSAoKHRlc3RfZGF0YV9iaXRfZW5hYmxlKSZwYXR0ZXJuX3ZhbHVlKSkKCQl7CgkJCSNpZiAxCgkJCXByaW50ZigiZXJyb3IgZGF0YSAgZW5hYmxlICUwOHggcmVhZF92YWx1ZSAlMDh4ICBwYXR0ZXJuX3ZhbHVlICUwOHgiLHRlc3RfZGF0YV9iaXRfZW5hYmxlLHJlYWRfdmFsdWUscGF0dGVybl92YWx1ZSk7CgkJCSNpZiAwCgkJCXNlcmlhbF9wdXRzKCJcbmVycm9yIGRhdGEgIik7CgkJCXNlcmlhbF9wdXRfaGV4KHRlc3RfZGF0YV9iaXRfZW5hYmxlLDMyKTsKCQkJc2VyaWFsX3B1dHMoIiAiKTsKCQkJc2VyaWFsX3B1dF9oZXgocmVhZF92YWx1ZSwzMik7CgkJCXNlcmlhbF9wdXRzKCIgIik7CgkJCXNlcmlhbF9wdXRfaGV4KHBhdHRlcm5fdmFsdWUsMzIpOwoJCQlzZXJpYWxfcHV0cygiXG4iKTsKCQkJI2VuZGlmCgkJCSNlbmRpZgoJCQlkZHJfdGVzdF9lcnJvcisrOwoJCQlyZXR1cm4gZGRyX3Rlc3RfZXJyb3I7CgkJfQoJCXNpemVfbG9vcD1zaXplX2xvb3ArKDE8PDIpOy8vIHVzZSBiaWcgc3RlcCB3aWxsIGZhc3QgdGVzdCAsYnV0IGxvc2UgYWNjdXJhY3kuCgl9CgkvL3ByaW50ZigiXG4gMTExNCIpOwoJcmV0dXJuIGRkcl90ZXN0X2Vycm9yOwp9CgppbnQgZG9fY3B1X2Rkcl90ZXN0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vZGRyX2NwdV90ZXN0IDB4MTA4MDAwMCAweDEwMDAwMDAwIDB4MjAwMDAwMCAweGZmZmZmZmZmIDEwICAvL3NpemUgZG8gbm90IG92ZXJsYXAKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9Cgl1bnNpZ25lZCBpbnQgaW5pdF9zdGFydF9hZGQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FkZD0wOwoJdW5zaWduZWQgaW50IHRlc3Rfc2l6ZT0wOwoJdW5zaWduZWQgaW50IHRlc3RfZGF0YV9iaXRfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sb29wcz0wOwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcD0wOwoJdW5zaWduZWQgaW50IHRlc3RfZXJyb3JzPTA7Cgl1bnNpZ25lZCBpbnQgcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcgPTE7CgljaGFyICplbmRwOwoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgllbHNlCgl7CgkJaWYgKGFyZ2MgPj0gMikKCQl7CgkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCWluaXRfc3RhcnRfYWRkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X2FkZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoJCWlmIChhcmdjID49IDQpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X3NpemU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCX0KCQlpZiAoYXJnYyA+PSA1KQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9kYXRhX2JpdF9lbmFibGU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCX0KCQlpZiAoYXJnYyA+PSA2KQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9sb29wcz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICh0ZXN0X2xvb3BzID09IDApCgkJCXRlc3RfbG9vcHM9MTsKCQl9CgkJaWYgKGFyZ2MgPj0gNykKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJaWYgKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nID09IDApCgkJCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPTE7CgkJfQoJCWlmIChhcmdjID49IDgpCgkJewoJCQlwcmVfZmV0Y2hfZW5hYmxlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCgkJfQoJfQoJdWludDMyX3QgZGRyX3Rlc3Rfc3RhcnRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCgljcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEoaW5pdF9zdGFydF9hZGQsdGVzdF9zaXplLHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTsKCWZvciAodGVzdF9sb29wPTA7dGVzdF9sb29wPHRlc3RfbG9vcHM7KQoJewoJCXRlc3RfZXJyb3JzPXRlc3RfZXJyb3JzK2NwdV9kZHJfdGVzdChpbml0X3N0YXJ0X2FkZCx0ZXN0X2FkZCx0ZXN0X3NpemUsdGVzdF9kYXRhX2JpdF9lbmFibGUscGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpOwoJCXRlc3RfbG9vcCsrOwoJCXByaW50ZigiXG5jcHVfZGRyX3Rlc3RfdGVzdF90aW1lcz09JWQgIHRlc3RfZXJyb3JzPT0lZCIsdGVzdF9sb29wLHRlc3RfZXJyb3JzKTsKCX0KCXVpbnQzMl90IGRkcl90ZXN0X2VuZF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCXByaW50ZigiXG5jcHVfZGRyX3Rlc3RfdGVzdF9hbmQgY29tcGFyZV9iYW5kd2lkdGg9PSVkIE1ieXRlL3NcbiIsKHRlc3RfbG9vcHMqdGVzdF9zaXplKjIpLyhkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKSk7CglyZXR1cm4gdGVzdF9lcnJvcnM7Cn0KVV9CT09UX0NNRCgKCWRkcl9jcHVfdGVzdCwJMzAsCTEsCWRvX2NwdV9kZHJfdGVzdCwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7CgppbnQgZG9fZGRyX3Rlc3Rfd3JpdGVfcmVhZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLy8qCgl7CgkJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl90ZXN0X2Rkcl93cml0ZV9yZWFkX2N1cnJlbnRcbiIpOwoJCS8vICAgaWYoIWFyZ2MpCgkJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CgkJaW50IGk9MDsKCQlwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXsKCQkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQoKCQljaGFyICplbmRwOwoKCQl1bnNpZ25lZCBpbnQgcGF0dGVybl9pZD0xOwoJCXVuc2lnbmVkIGludCBwYXR0ZXJuWzRdID17MH07CgkJdW5zaWduZWQgaW50IHdyaXRlX3JlYWQ9MDsKCQl1bnNpZ25lZCBpbnQgcmVhZF9wYXR0ZXJuWzRdPXswfSA7CgkJdW5zaWduZWQgaW50IGxvb3A9MTsKCQl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCQl1bnNpZ25lZCBpbnQgIGNvcHlfb2Zmc2V0PSBERFJfVEVTVF9TSVpFOwoJCXVuc2lnbmVkIGludCAgbm9fc2hvd19pbmZvPSAwOwoJCXVuc2lnbmVkIGludCAgdXNfZGVsYXlfY291bnRlcj0gMDsKCgoJCWlmIChhcmdjID09IDEpCgkJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQllbHNlIHsKCQkJaWYgKGFyZ2MgPj0gMikKCQkJewoJCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJCXdyaXRlX3JlYWQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCQl9CgoJCQlpZiAoYXJnYyA+PSAzKQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJcGF0dGVybl9pZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCWxvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NSkKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXN0YXJ0X2FkZHI9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NikKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXRlc3Rfc2l6ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj03KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJbm9fc2hvd19pbmZvPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTgpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQl1c19kZWxheV9jb3VudGVyPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQkJfQoJCX0KCQlwcmludGYoIlxud3JpdGVfcmVhZD09IDB4JTA4ZFxuIiwgd3JpdGVfcmVhZCk7CgkJcHJpbnRmKCJcbnBhdHRlcm5faWQ9PSAweCUwOGRcbiIsIHBhdHRlcm5faWQpOwoJCXByaW50ZigiXG5sb29wPT0gMHglMDhkXG4iLCBsb29wKTsKCQlwcmludGYoIlxuc3RhcnRfYWRkcj09IDB4JTA4eFxuIiwgc3RhcnRfYWRkcik7CgkJcHJpbnRmKCJcbnRlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgdGVzdF9zaXplKTsKCQlwcmludGYoIlxudXNfZGVsYXlfY291bnRlcj09ICVkXG4iLCB1c19kZWxheV9jb3VudGVyKTsKCQljb3B5X29mZnNldD10ZXN0X3NpemU7CgoJCXVuc2lnbmVkIGludCAgKnA7CgkJdW5zaWduZWQgaW50ICAgajsKCgoJCXAgPSAodW5zaWduZWQgaW50ICAqICkoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSk7CgoJCWlmIChwYXR0ZXJuX2lkID09IDApCgkJewoJCQlwYXR0ZXJuWzBdPTA7CgkJCXBhdHRlcm5bMV09MDsKCQkJcGF0dGVyblsyXT0wOwoJCQlwYXR0ZXJuWzNdPTA7CgkJfQoJCWlmIChwYXR0ZXJuX2lkID09IDEpCgkJewoJCQlwYXR0ZXJuWzBdPTB4ZmZmZmZmZmY7CgkJCXBhdHRlcm5bMV09MHhmZmZmZmZmZjsKCQkJcGF0dGVyblsyXT0weGZmZmZmZmZmOwoJCQlwYXR0ZXJuWzNdPTB4ZmZmZmZmZmY7CgkJfQoKCgkJZG8KCQl7CgkJCWlmICh3cml0ZV9yZWFkID09IDApCgkJCXsKCQkJCWlmICghbm9fc2hvd19pbmZvKQoJCQkJCXByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQlmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQkJCXsKCQkJCQkqKHAraik9KHBhdHRlcm5bMF0pOwoJCQkJCSoocCtqKzEpPShwYXR0ZXJuWzFdKTsKCQkJCQkqKHAraisyKT0ocGF0dGVyblsyXSk7CgkJCQkJKihwK2orMyk9KHBhdHRlcm5bM10pOwoJCQkJCWo9ais0OwoJCQkJfQoJCQl9CgkJCWlmICh3cml0ZV9yZWFkID09IDEpCgkJCXsKCQkJCWlmICghbm9fc2hvd19pbmZvKQoJCQkJCXByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCByZWFkaW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQlmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQkJCXsKCQkJCQlyZWFkX3BhdHRlcm5bMF09ICoocCtqKTsKCQkJCQlyZWFkX3BhdHRlcm5bMV09ICoocCtqKzEpOwoJCQkJCXJlYWRfcGF0dGVyblsyXT0qKHAraisyKTsKCQkJCQlyZWFkX3BhdHRlcm5bM109ICoocCtqKzMpOwoJCQkJCWo9ais0OwoJCQkJfQoJCQkJaWYgKGxvb3AgPT0gMSkgewoJCQkJCWlmICghbm9fc2hvd19pbmZvKQoJCQkJCQlwcmludGYoIiBcbmxvb3A6MHglMDh4OlN0YXJ0IHJlYWRpbmcgcmVhZF9wYXR0ZXJuWzBdIDB4JTA4eCwgcGF0dGVyblsxXSAweCUwOHgscGF0dGVyblsyXSAweCUwOHgscGF0dGVyblszXSAweCUwOHgiLAoJCQkJCQkJCWxvb3AscmVhZF9wYXR0ZXJuWzBdLCByZWFkX3BhdHRlcm5bMV0scmVhZF9wYXR0ZXJuWzJdLHJlYWRfcGF0dGVyblszXQoJCQkJCQkJICApOyAgfQoJCQl9CgkJCWlmICh3cml0ZV9yZWFkID09IDIpCgkJCXsKCQkJCWlmICghbm9fc2hvd19pbmZvKQoJCQkJCXByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCBjb3B5aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQlmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQkJCXsKCQkJCQkqKHAraitjb3B5X29mZnNldC80KT0gKihwK2opOwoJCQkJCSoocCtqKzErY29weV9vZmZzZXQvNCk9ICoocCtqKzEpOwoJCQkJCSoocCtqKzIrY29weV9vZmZzZXQvNCk9ICoocCtqKzIpOwoJCQkJCSoocCtqKzMrY29weV9vZmZzZXQvNCk9ICoocCtqKzMpOwoJCQkJCWo9ais0OwoJCQkJfQoJCQl9CgkJCWlmICh1c19kZWxheV9jb3VudGVyKQoJCQl7CgkJCQlkZHJfdWRlbGF5KHVzX2RlbGF5X2NvdW50ZXIpOwoJCQl9CgkJfXdoaWxlKGxvb3AtLSk7CgoJCXByaW50ZigiXG50ZXN0IGVuZFxuIik7CgoJCXJldHVybiAxOwoJfQoJLy8qLwp9CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoKI2RlZmluZSBURVNUX01JTl9ERFJfRUVfVk9MVEFHRSAgNjgxCiNkZWZpbmUgVEVTVF9NQVhfRERSX0VFX1ZPTFRBR0UgIDk2MgojZGVmaW5lICAgIEcxMl9BT19QV01fUFdNX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjgwNzAwMCArICgweDAwMSA8PCAyKSkKc3RhdGljIGludCBwd21fdm9sdGFnZV90YWJsZV9lZVtdWzJdID0KewoJeyAweDFjMDAwMCwgIDY4MX0sCgl7IDB4MWIwMDAxLCAgNjkxfSwKCXsgMHgxYTAwMDIsICA3MDF9LAoJeyAweDE5MDAwMywgIDcxMX0sCgl7IDB4MTgwMDA0LCAgNzIxfSwKCXsgMHgxNzAwMDUsICA3MzF9LAoJeyAweDE2MDAwNiwgIDc0MX0sCgl7IDB4MTUwMDA3LCAgNzUxfSwKCXsgMHgxNDAwMDgsICA3NjF9LAoJeyAweDEzMDAwOSwgIDc3Mn0sCgl7IDB4MTIwMDBhLCAgNzgyfSwKCXsgMHgxMTAwMGIsICA3OTJ9LAoJeyAweDEwMDAwYywgIDgwMn0sCgl7IDB4MGYwMDBkLCAgODEyfSwKCXsgMHgwZTAwMGUsICA4MjJ9LAoJeyAweDBkMDAwZiwgIDgzMn0sCgl7IDB4MGMwMDEwLCAgODQyfSwKCXsgMHgwYjAwMTEsICA4NTJ9LAoJeyAweDBhMDAxMiwgIDg2Mn0sCgl7IDB4MDkwMDEzLCAgODcyfSwKCXsgMHgwODAwMTQsICA4ODJ9LAoJeyAweDA3MDAxNSwgIDg5Mn0sCgl7IDB4MDYwMDE2LCAgOTAyfSwKCXsgMHgwNTAwMTcsICA5MTJ9LAoJeyAweDA0MDAxOCwgIDkyMn0sCgl7IDB4MDMwMDE5LCAgOTMyfSwKCXsgMHgwMjAwMWEsICA5NDJ9LAoJeyAweDAxMDAxYiwgIDk1Mn0sCgl7IDB4MDAwMDFjLCAgOTYyfQp9Owp1aW50MzJfdCBmaW5kX3ZkZGVlX3ZvbHRhZ2VfaW5kZXgodW5zaWduZWQgaW50IHRhcmdldF92b2x0YWdlKQp7Cgl1bnNpZ25lZCBpbnQgdG87Cglmb3IgKHRvID0gMDsgdG8gPCBBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKTsgdG8rKykgewoJCWlmIChwd21fdm9sdGFnZV90YWJsZV9lZVt0b11bMV0gPj0gdGFyZ2V0X3ZvbHRhZ2UpIHsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKHRvID49IEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpKSB7CgkJdG8gPSBBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKSAtIDE7Cgl9CglyZXR1cm4gdG87Cn0KCnZvaWQgc2V0X2VlX3ZvbHRhZ2UodWludDMyX3QgZWVfb3Zlcl9yaWRlX3ZvbHRhZ2UpCnsKCXVuc2lnbmVkIGludCB0bzsKCWZvciAodG8gPSAgKEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpKTsoIHRvID4wKTsgdG8tLSkgewoJCWlmICgocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMV08ZWVfb3Zlcl9yaWRlX3ZvbHRhZ2UpICYmIChwd21fdm9sdGFnZV90YWJsZV9lZVt0b11bMV0gPj0gZWVfb3Zlcl9yaWRlX3ZvbHRhZ2UpKSB7CgkJCWJyZWFrOwoJCX0KCX0KCWlmIChlZV9vdmVyX3JpZGVfdm9sdGFnZSkgewoJCXdyaXRlbChwd21fdm9sdGFnZV90YWJsZV9lZVt0b11bMF0sRzEyX0FPX1BXTV9QV01fQik7CgkJcHJpbnRmICgiXG5ERFJfb3ZlcmlkZV9FRV92b2x0YWdlID09JWQgbXYgL24iLHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvLTFdWzFdKTsKCX0KfQoKdW5zaWduZWQgaW50IHJlYWRfZWVfdm9sdGFnZSh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgdG87Cgl1bnNpZ25lZCBpbnQgcmVnX3ZhbHVlPTA7CglyZWdfdmFsdWU9cmVhZGwoRzEyX0FPX1BXTV9QV01fQik7Cgl0bz1yZWdfdmFsdWUmMHhmZjsKCXJldHVybiBwd21fdm9sdGFnZV90YWJsZV9lZVt0b11bMV07Cn0KdWludDMyX3QgZ2V0X2JkbHJfMTAwc3RlcCh1aW50MzJfdCBkZHJfZnJlcXVlbmN5KQp7Cgl1aW50MzJfdCBiZGxyXzEwMHN0ZXA9MDsKCS8vdWludDMyX3QgcHM9MDsKCS8vcHM9KHJkX3JlZyhETUNfRFJBTV9GUkVRX0NUUkwpKSYxOwoJZHdjX2RkcnBoeV9hcGJfd3IoKCgoKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4ZTMpKSkpLDB4YzAwKTsKCWJkbHJfMTAwc3RlcD0oMTAwMDAwMDAwLygyKmRkcl9mcmVxdWVuY3kpKS8oKGR3Y19kZHJwaHlfYXBiX3JkKCgoKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4ZTQpKSkpKSYweDNmZik7CglyZXR1cm4gYmRscl8xMDBzdGVwOwp9CgppbnQgZG9fZGRyX3Rlc3RfcHdtX2JkbHIgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXByaW50ZigiXG5FbnRlciBnMTIgZG9fZGRyX3Rlc3RfcHdtX2JkbCBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCS8vaWYgKGFyZ2MgPCAyKQoJLy8JZ290byB1c2FnZTsKCgoJdW5zaWduZWQgaW50IGFyZ2NfY291bnQ9MTsKCXVuc2lnbmVkIGludCAgcGFyYV9tZXRlclszMF09ezAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsfTsKCXdoaWxlIChhcmdjX2NvdW50PGFyZ2MpCgl7cGFyYV9tZXRlclthcmdjX2NvdW50LTFdPSBzaW1wbGVfc3RydG91bChhcmd2W2FyZ2NfY291bnRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2W2FyZ2NfY291bnRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0gPSAwOwoJCX0KCQlhcmdjX2NvdW50Kys7Cgl9CgoJLy91aW50MzJfdCBpZD1wYXJhX21ldGVyWzBdOwoJLy91aW50MzJfdCB2b2x0YWdlPXBhcmFfbWV0ZXJbMV07Cgl1aW50MzJfdCBsb29wPXBhcmFfbWV0ZXJbMF07Cgl1aW50MzJfdCB2b2x0YWdlX21pbj1wYXJhX21ldGVyWzFdOwoJdWludDMyX3Qgdm9sdGFnZV9tYXg9cGFyYV9tZXRlclsyXTsKCXVpbnQzMl90IHNob3dfY291bnRfbWVzc2FnZT1wYXJhX21ldGVyWzNdOwoKCS8vI2RlZmluZSBQV01fSURfREVGQVVMVCAgIDA8PDAKCS8vI2RlZmluZSBQV01fVk9MVEFHRV9ERUZBVUxUICAgODAwPDwwCgkjZGVmaW5lIFBXTV9MT09QX0RFRkFVTFQgICAxMDw8MAoJI2RlZmluZSBQV01fVk9MVEFHRV9NSU5fREVGQVVMVCAgIFRFU1RfTUlOX0REUl9FRV9WT0xUQUdFCgkjZGVmaW5lIFBXTV9WT0xUQUdFX01BWF9ERUZBVUxUICAgVEVTVF9NQVhfRERSX0VFX1ZPTFRBR0UKCgoJLy9pZD1pZD9pZDpQV01fSURfREVGQVVMVDsKCS8vdm9sdGFnZT12b2x0YWdlP3ZvbHRhZ2U6UFdNX1ZPTFRBR0VfREVGQVVMVDsKCWxvb3A9bG9vcD9sb29wOlBXTV9MT09QX0RFRkFVTFQ7Cgl2b2x0YWdlX21pbj0odm9sdGFnZV9taW48UFdNX1ZPTFRBR0VfTUlOX0RFRkFVTFQpP1BXTV9WT0xUQUdFX01JTl9ERUZBVUxUOnZvbHRhZ2VfbWluOwoJdm9sdGFnZV9tYXg9KHZvbHRhZ2VfbWF4PlBXTV9WT0xUQUdFX01BWF9ERUZBVUxUKT9QV01fVk9MVEFHRV9NQVhfREVGQVVMVDp2b2x0YWdlX21heDsKCXZvbHRhZ2VfbWF4PSh2b2x0YWdlX21heDxQV01fVk9MVEFHRV9NSU5fREVGQVVMVCk/UFdNX1ZPTFRBR0VfTUFYX0RFRkFVTFQ6dm9sdGFnZV9tYXg7CgoJLy8JICBwcmludGYoIlxudm9sdGFnZV9taW49JWRcbiIsdm9sdGFnZV9taW4pOwoJLy8JICAJCSAgcHJpbnRmKCJcbnZvbHRhZ2VfbWF4PSVkXG4iLHZvbHRhZ2VfbWF4KTsKCXVpbnQxNl90IGJkbHJfMTAwX21pbj0wOwoJdWludDE2X3QgYmRscl8xMDBfYXZlcmFnZT0wOwoJdWludDE2X3QgYmRscl8xMDBfbWF4PTA7Cgl1aW50MTZfdCBiZGxyXzEwMF9jdXI9MDsKCS8vdWludDE2X3QgY3VyX2Rkcl9mcmVxdWVuY3k9MDsKCXVpbnQzMl90IGNvdW50PTE7CgoJYmRscl8xMDBfY3VyPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJYmRscl8xMDBfbWluPWJkbHJfMTAwX2N1cjsKCWJkbHJfMTAwX21heD1iZGxyXzEwMF9jdXI7CgliZGxyXzEwMF9hdmVyYWdlPWJkbHJfMTAwX2N1cjsKCgl1bnNpZ25lZCBpbnQgdG89MDsKCXVuc2lnbmVkIGludCB0b19taW49MDsKCXVuc2lnbmVkIGludCB0b19tYXg9KEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpKS0xOwoJLy91bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJcHJpbnRmKCJcbnJlYWQgb3JnX0VFX3ZvbHRhZ2UgJWQgbXYgXG4iLHJlYWRfZWVfdm9sdGFnZSgpKTsKCXRvX21pbj1maW5kX3ZkZGVlX3ZvbHRhZ2VfaW5kZXgodm9sdGFnZV9taW4pOwoJdG9fbWF4PWZpbmRfdmRkZWVfdm9sdGFnZV9pbmRleCh2b2x0YWdlX21heCk7Cglmb3IgKHRvID0odG9fbWF4KzEpICA7KCB0byA+dG9fbWluKTsgdG8tLSkgewoJCS8vICBwcmludGYoIlxuVE89JWRcbiIsdG8pOwoJCXdyaXRlbChwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVswXSxHMTJfQU9fUFdNX1BXTV9CKTsKCQl1ZGVsYXkoMTAwMCk7CgkJYmRscl8xMDBfY3VyPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJCWJkbHJfMTAwX21pbj1iZGxyXzEwMF9jdXI7CgkJYmRscl8xMDBfbWF4PWJkbHJfMTAwX2N1cjsKCQliZGxyXzEwMF9hdmVyYWdlPWJkbHJfMTAwX2N1cjsKCQljb3VudD0xOwoKCQkvLwlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkLGJkbHJfMTAwX2N1ciAlZCBcbiIscHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMV0sCgkJLy9iZGxyXzEwMF9hdmVyYWdlLGJkbHJfMTAwX21pbixiZGxyXzEwMF9tYXgsY291bnQsYmRscl8xMDBfY3VyKTsKCgkJZG8gewoJCQliZGxyXzEwMF9jdXI9KDEwMDAwMDAwMC8oMipnbG9iYWxfZGRyX2NsaykpLygoZHdjX2RkcnBoeV9hcGJfcmQoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlNCkpKSkpJjB4M2ZmKTsKCQkJYmRscl8xMDBfbWluPShiZGxyXzEwMF9jdXI8YmRscl8xMDBfbWluKT9iZGxyXzEwMF9jdXI6YmRscl8xMDBfbWluOwoJCQliZGxyXzEwMF9tYXg9KGJkbHJfMTAwX2N1cj5iZGxyXzEwMF9tYXgpP2JkbHJfMTAwX2N1cjpiZGxyXzEwMF9tYXg7CgkJCWJkbHJfMTAwX2F2ZXJhZ2U9KGJkbHJfMTAwX2N1citiZGxyXzEwMF9hdmVyYWdlKmNvdW50KS8oY291bnQrMSk7CgkJCWNvdW50Kys7CgkJCWlmIChzaG93X2NvdW50X21lc3NhZ2UpCgkJCQlwcmludGYoIiVkXG4iLGJkbHJfMTAwX2N1cik7CgoJCX13aGlsZShjb3VudDxsb29wKTsKCQlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkIixwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXSwKCQkJCWJkbHJfMTAwX2F2ZXJhZ2UsYmRscl8xMDBfbWluLGJkbHJfMTAwX21heCxjb3VudCk7CgoKCX0KCgoKCglyZXR1cm4gMTsKCn0KCnR5cGVkZWYgc3RydWN0IGRkcl9zaGFfcyB7Cgl1bnNpZ25lZCBjaGFyIHNoYTJbU0hBMjU2X1NVTV9MRU5dOwoJZGRyX3NldF90IGRkcnM7Cn0gZGRyX3NoYV90OwoKZGRyX3NoYV90IGRkcl9zaGEgPSB7ezB9fTsKZGRyX3NldF90ICpkZHJfc2V0X3RfcF9hcnJhcnkgPSAmZGRyX3NoYS5kZHJzOwppbnQgcHJpbnRmX2xvZyhjaGFyIGxvZ19sZXZlbCxjb25zdCBjaGFyICogZm10LC4uLikKewppZiAobG9nX2xldmVsPDEpCnsKdmFfbGlzdCBhcmdzOwp2YV9zdGFydChhcmdzLGZtdCk7CnZwcmludGYoZm10LGFyZ3MpOyAgLy8KdmFfZW5kKGFyZ3MpOwoJcmV0dXJuIDA7Cn0KZWxzZQoJcmV0dXJuIDE7Cn0KaW50IGRvX3JlYWRfZGRyX3RyYWluaW5nX2RhdGEoY2hhciBsb2dfbGV2ZWwsZGRyX3NldF90ICpkZHJfc2V0X3RfcCkKewoJI2RlZmluZSBHMTJfRE1DX1NUSUNLWV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg4MDApCi8vCWRkcl9zZXRfdCAqZGRyX3NldF90X3A9TlVMTDsKLy8JZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuZGRyX3NldF90X3A9PTB4JTA4eFxuIiwodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkpOwoJdWludDMyX3QgbG9vcD0wOwoJdWludDMyX3QgbG9vcF9tYXggPSAoNCsoMHgzZjw8MikpOy8vKChETUNfU1RJQ0tZXzYzLURNQ19TVElDS1lfMCkpOwoJLy8JbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7Cglmb3IgKGxvb3AgPSAwOyBsb29wIDxsb29wX21heDsgbG9vcCs9NCkgewoJCXdyX3JlZygoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBsb29wKSwgcmRfcmVnKEcxMl9ETUNfU1RJQ0tZXzAgKyBsb29wKSk7Cgl9Cgp7CgkJdWludDE2X3QJZHFfYml0X2RlbGF5WzcyXTsKCQl1bnNpZ25lZAljaGFyIHRfY291bnQ9MDsKCQl1aW50MTZfdCAgZGVsYXlfb3JnPTA7CgkJdWludDE2X3QgIGRlbGF5X3RlbXA9MDsKCQl1aW50MzJfdCAgYWRkX29mZnNldD0wOwoJCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMHgwKTsKCQliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCQl7CgkJZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWw9MDsKCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gQVJkUHRySW5pdFZhbCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwoMDw8MTIpfCgweDJlKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5BUmRQdHJJbml0VmFsPWRlbGF5X29yZzsKCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGRmaW1ybDAgZGZpbXJsMSBkZmltcmwyIGRmaW1ybDMgSHd0TVJMIik7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZGRyX3NldF90X3AtPmRmaV9tcmw9ZGVsYXlfb3JnOwoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMTw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMSxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMixkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMzw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMyxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoKCQlkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybD1kZWxheV9vcmc7CgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJfQoJewoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiBjb3VudF9pbmRleCAgICAgZGVsYXlfdmFsdWUgICAgIHJlZ2lzdGVyX2FkZCAgICAgcmVnaXN0ZXJfdmFsdWUgXG4gIik7CgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGFkZHJlc3MgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lICAtLXN0ZXA9PTEvMzJVSSAsYml0IDYgaXMgY29hcnNlICAtLXN0ZXA9PTFVSSIsdWlfMV8zMl8xMDBzdGVwKTsKCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDEwO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwodF9jb3VudDw8MTIpfCgweDgwKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCWRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOSBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvciAodF9jb3VudD0wO3RfY291bnQ8MTY7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlOCk+PjEpPDwxMil8KDB4ZDArKHRfY291bnQvOCkrKCh0X2NvdW50JTIpPDw4KSkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJZGRyX3NldF90X3AtPndyaXRlX2Rxc19kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCX0KCXsKCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gcnhkcXMgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJLG5vIGNvYXJzZSIsdWlfMV8zMl8xMDBzdGVwKTsKCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHdyaXRlIGRxX2JpdCBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLS1zdGVwPT0xLzMyVUkgLGJpdCA2LTggaXMgY29hcnNlICAtLXN0ZXA9PTFVIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQkJewoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4YzArKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCgkJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCX0KCXsKCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gcmVhZCBkcV9iaXQgZGVsYXkgKiBCRExSeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PWJkbHIgc3RlcCBzaXplIGFib3V0IDVwcyxubyBjb2Fyc2UiLGJkbHJfMTAwc3RlcCk7CgkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoMHg2OCsoKHRfY291bnQlOSk8PDgpKyh0X2NvdW50LzM2KSkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KChkZWxheV9vcmcmMHgzZikpOwoKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHJlYWQgZHFzIGdhdGUgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lICxiaXQgNi0xMCBpcyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yICh0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoKCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gc29jIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4wNDcgKyBWcmVmREFDMFs2OjBdKjAuMDAzNjcgICBERFI0IC0tVlJFRiA9IFZERFEqKDAuNTEwICsgVnJlZkRBQzBbNjowXSowLjAwMzQ1Iik7CgkJLy8oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpCgkJdWludDMyX3QgdnJlZl90X2NvdW50PTA7CgkJZm9yICh0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoKCh0X2NvdW50JTM2KSU5KTw8OCl8KDB4NDApKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnKSk7CgkJCWlmICh0X2NvdW50PDM1KQoJCQl7CgkJCQl2cmVmX3RfY291bnQ9KCgoKHRfY291bnQlMzYpLzkpKjgpKyh0X2NvdW50JTkpKTsKCQkJCWRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdnJlZl90X2NvdW50XT1kZWxheV90ZW1wOwoJCQl9CgkJCXByaW50Zl9sb2cobG9nX2xldmVsLCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgkJcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIGRyYW0gdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4gICBERFI0IC0tVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDA4MikpOwoJCWRlbGF5X3RlbXA9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZm9yICh0X2NvdW50PTA7dF9jb3VudDwzMjt0X2NvdW50KyspCgkJewoJCQlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJLy8JcHJpbnRmX2xvZyhsb2dfbGV2ZWwsIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCQlwcmludGZfbG9nKGxvZ19sZXZlbCwiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X3RlbXApOwoJfQoKCS8vCWlmKG92ZXJfcmlkZV9pbmRleCA9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SRVRSQUlOSU5HKQoJewkvLwlpZiAocmVhZF93cml0ZT09UkVHSVNURVJfUkVBRCkKCQlmb3IgKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCQl7CWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCswXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSkmMHhmZjsgIC8vUHB0Q3RsU3RhdGljCgkJCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMV09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpPj44OyAgLy9QcHRDdGxTdGF0aWMKCQkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCsyXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhZSkpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMCBsYW5lIDAtMwoJCQkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzNdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxIGxhbmUgMC0zCgkJCX0KCX0KfQoKCXJldHVybiAxOwp9CmludCBkb19kZHJfZGlzcGxheV9nMTJfZGRyX2luZm9ybWF0aW9uKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CglkZHJfc2V0X3QgKmRkcl9zZXRfdF9wPU5VTEw7CglkZHJfc2V0X3RfcD0oZGRyX3NldF90ICopKGRkcl9zZXRfdF9wX2FycmFyeSk7Cglkb19yZWFkX2Rkcl90cmFpbmluZ19kYXRhKDAsZGRyX3NldF90X3ApOwoKewoJCXVpbnQzMl90ICBjb3VudD0wOwoJCXVpbnQzMl90ICByZWdfYWRkX29mZnNldD0wOwoJCXVpbnQxNl90ICByZWdfdmFsdWU9MDsKCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxucGN0bCB0aW1taW5nOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCSNkZWZpbmUgRE1DX0RSQU1fVERQRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDFkICA8PCAyKSArIDB4ZmY2Mzg0MDApCgkJI2RlZmluZSBETUNfRFJBTV9UTVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODQwMCkKCQkjZGVmaW5lIEcxMl9ETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODgwMCkKCgkJcHJpbnRmKCJcbiBQQ1RMIHRpbW1pbmc6IDB4Iik7CgoJCWZvciAoY291bnQ9MDtjb3VudDwoRE1DX0RSQU1fVERQRC1ETUNfRFJBTV9UTVJEKTspIHsKCQkJcmVnX2FkZF9vZmZzZXQ9KERNQ19EUkFNX1RNUkQrKGNvdW50KSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfYWRkX29mZnNldCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgocmVhZGwocmVnX2FkZF9vZmZzZXQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4ICIscmVnX2FkZF9vZmZzZXQscmVhZGwocmVnX2FkZF9vZmZzZXQpLHJlZ19hZGRfb2Zmc2V0KTsKCQkJY291bnQ9Y291bnQrNDsKCQl9CgkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbm1ycyByZWdpc3RlcjogYmFzZSAoMHg1NDAwMDw8MSkrZmUwMDAwMDAsYnl0ZSBvZmZzZXRcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQlwcmludGYoIlxuIG1ycyByZWdpc3RlcjogIik7CgkJcHJpbnRmKCJcbiBtcnMgcmVnaXN0ZXI6IGJhc2UgKDB4NTQwMDA8PDEpK2ZlMDAwMDAwLCUwOHggIGJ5dGUgb2Zmc2V0XG4iLCgweDU0MDAwPDwxKSsweGZlMDAwMDAwKTsKCQlmb3IgKGNvdW50PTA7Y291bnQ8MHg4MDspIHsKCQkJcmVnX2FkZF9vZmZzZXQ9MHg1NDAwMCtjb3VudDsvL2R3Y19kZHJwaHlfYXBiX3dyKDB4NTQwMDgsMHgxMDAxKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRfaGV4KGNvdW50LDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiOiAiLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCXJlZ192YWx1ZT0gKCgqKHZvbGF0aWxlIHVpbnQxNl90ICopKCh1aW50NjRfdCkoKCgweDU0MDAwKyhjb3VudD4+MSkpKSA8PCAxKSsweGZlMDAwMDAwKSk+PigoKGNvdW50KSUyKT84OjApKTsvL2R3Y19kZHJwaHlfYXBiX3JkKDB4NTQwMDArYWRkX29mZnNldCsxKTsKCQkJcmVnX3ZhbHVlPXJlZ192YWx1ZSYweGZmOwoJCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgocmVnX3ZhbHVlLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4IixyZWdfYWRkX29mZnNldCxyZWdfdmFsdWUsKCgoKDB4NTQwMDArKGNvdW50Pj4xKSkpIDw8IDEpKzB4ZmUwMDAwMDApKTsKCQkJY291bnQ9Y291bnQrMTsKCQl9CgkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCJcbnRpbW1pbmcuYzpcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCgoJCXByaW50ZigiXG4gc3RpY2t5IHJlZ2lzdGVyOiAiKTsKCQl7CgkJCXVpbnQzMl90IGxvb3BfbWF4ID0gMDsKCQkJbG9vcF9tYXg9NjQ8PDI7Ly9zaXplb2YoZGRyX3NldF90KTsKCQkJLy91aW50MzJfdCBsb29wID0gMDsKCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbG9vcF9tYXg7IGNvdW50Kz00KSB7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRzKCJcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dF9oZXgoY291bnQsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZF9yZWcoKHVpbnQ2NF90KShwX2Rldi0+cF9kZHJzKSArIGNvdW50KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JY291bnQ9Y291bnQrNDsKCQkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShHMTJfRE1DX1NUSUNLWV8wKSArIGNvdW50KSwoKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpKTsKCQkJfQoJCX0KCgkJewoJCQl1aW50MzJfdCBsb29wX21heCA9IDA7CgkJCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3QpOwoJCQl1aW50MzJfdCBjb3VudCA9IDA7CgkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BfbWF4OyApIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiOiAiLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJkX3JlZygodWludDY0X3QpKHBfZGV2LT5wX2RkcnMpICsgY291bnQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQlwcmludGYoIlxuJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBjb3VudCkpOwoJCQkJY291bnQ9Y291bnQrNDsKCQkJCS8vcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLGNvdW50LHJkX3JlZygodWludDY0X3QpKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpLCgoRzEyX0RNQ19TVElDS1lfMCkgKyBjb3VudCkpOwoJCQl9CgkJfQoJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwp9CgoJcHJpbnRmKCJcbiAiKTsKCgoJdWludDMyX3QgdGVtcF9jb3VudD0wOwoJewoJCXByaW50ZigiXG4ubWFnaWM9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bWFnaWMsZGRyX3NldF90X3AtPm1hZ2ljKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKCQkJcHJpbnRmKCJcbi5mYXN0X2Jvb3RbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZmFzdF9ib290W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbdGVtcF9jb3VudF0pOwoJCS8vcHJpbnRmKCJcbi5yc3ZfaW50MD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yc3ZfaW50MCxkZHJfc2V0X3RfcC0+cnN2X2ludDApOwoJCXByaW50ZigiXG4uYm9hcmRfaWQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Ym9hcmRfaWQsZGRyX3NldF90X3AtPmJvYXJkX2lkKTsKCQlwcmludGYoIlxuLnZlcnNpb249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dmVyc2lvbixkZHJfc2V0X3RfcC0+dmVyc2lvbik7CgkJcHJpbnRmKCJcbi5EcmFtVHlwZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EcmFtVHlwZSxkZHJfc2V0X3RfcC0+RHJhbVR5cGUpOwoJCXByaW50ZigiXG4uRGlzYWJsZWREYnl0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlLGRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlKTsKCQlwcmludGYoIlxuLklzMlR0aW1pbmc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyxkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyk7CgkJcHJpbnRmKCJcbi5IZHRDdHJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkhkdEN0cmwsZGRyX3NldF90X3AtPkhkdEN0cmwpOwoJCXByaW50ZigiXG4uZHJhbV9yYW5rX2NvbmZpZz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnLGRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnKTsKCQlwcmludGYoIlxuLmRpYWdub3NlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRpYWdub3NlLGRkcl9zZXRfdF9wLT5kaWFnbm9zZSk7CgkJcHJpbnRmKCJcbi5pbWVtX2xvYWRfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfYWRkcixkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX2FkZHIpOwoJCXByaW50ZigiXG4uZG1lbV9sb2FkX2FkZHI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX2FkZHIsZGRyX3NldF90X3AtPmRtZW1fbG9hZF9hZGRyKTsKCQlwcmludGYoIlxuLmltZW1fbG9hZF9zaXplPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmltZW1fbG9hZF9zaXplLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfc2l6ZSk7CgkJcHJpbnRmKCJcbi5kbWVtX2xvYWRfc2l6ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kbWVtX2xvYWRfc2l6ZSxkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX3NpemUpOwoJCXByaW50ZigiXG4uZGRyX2Jhc2VfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfYmFzZV9hZGRyLGRkcl9zZXRfdF9wLT5kZHJfYmFzZV9hZGRyKTsKCQlwcmludGYoIlxuLmRkcl9zdGFydF9vZmZzZXQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCxkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCk7CgkJcHJpbnRmKCJcbi5kcmFtX2NzMF9zaXplX01CPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUIsZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUIpOwoJCXByaW50ZigiXG4uZHJhbV9jczFfc2l6ZV9NQj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2NzMV9zaXplX01CLGRkcl9zZXRfdF9wLT5kcmFtX2NzMV9zaXplX01CKTsKCQlwcmludGYoIlxuLnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF0sZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXSk7CgkJcHJpbnRmKCJcbi50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMV0pOwoJCXByaW50ZigiXG4ucGh5X29kdF9jb25maWdfcmFua1swXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdKTsKCQlwcmludGYoIlxuLnBoeV9vZHRfY29uZmlnX3JhbmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSxkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSk7CgkJcHJpbnRmKCJcbi5yZXZlcjE9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIxLGRkcl9zZXRfdF9wLT5yZXZlcjEpOwoJCXByaW50ZigiXG4ucmV2ZXIyPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJldmVyMixkZHJfc2V0X3RfcC0+cmV2ZXIyKTsKCQkvLwl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07CgkJLy8JdW5zaWduZWQJY2hhcgkgZGRyX2Zhc3RfYm9vdF9mdW5jdGlvbjsKCQkvLwl1bnNpZ25lZAljaGFyCSBkcXNfb2Zmc2V0X3ZhbHVlOwoJCXByaW50ZigiXG4uZGZpX29kdF9jb25maWc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX29kdF9jb25maWcsZGRyX3NldF90X3AtPmRmaV9vZHRfY29uZmlnKTsKCQlwcmludGYoIlxuLkRSQU1GcmVxWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzBdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXSk7CgkJcHJpbnRmKCJcbi5EUkFNRnJlcVsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVsxXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMV0pOwoJCXByaW50ZigiXG4uRFJBTUZyZXFbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMl0sZGRyX3NldF90X3AtPkRSQU1GcmVxWzJdKTsKCQlwcmludGYoIlxuLkRSQU1GcmVxWzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzNdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVszXSk7CgkJcHJpbnRmKCJcbi5QbGxCeXBhc3NFbj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5QbGxCeXBhc3NFbixkZHJfc2V0X3RfcC0+UGxsQnlwYXNzRW4pOwoJCXByaW50ZigiXG4uZGRyX3JkYmlfd3JfZW5hYmxlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9yZGJpX3dyX2VuYWJsZSxkZHJfc2V0X3RfcC0+ZGRyX3JkYmlfd3JfZW5hYmxlKTsKCQlwcmludGYoIlxuLmRkcl9yZmNfdHlwZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfcmZjX3R5cGUsZGRyX3NldF90X3AtPmRkcl9yZmNfdHlwZSk7CgkJcHJpbnRmKCJcbi5lbmFibGVfbHBkZHI0eF9tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGUsZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGUpOwoJCXByaW50ZigiXG4ucGxsX3NzY19tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnBsbF9zc2NfbW9kZSxkZHJfc2V0X3RfcC0+cGxsX3NzY19tb2RlKTsKCQlwcmludGYoIlxuLmNsa19kcnZfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNsa19kcnZfb2htLGRkcl9zZXRfdF9wLT5jbGtfZHJ2X29obSk7CgkJcHJpbnRmKCJcbi5jc19kcnZfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNzX2Rydl9vaG0sZGRyX3NldF90X3AtPmNzX2Rydl9vaG0pOwoJCXByaW50ZigiXG4uYWNfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htKTsKCQlwcmludGYoIlxuLnNvY19kYXRhX2Rydl9vaG1fcD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX3AsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fcCk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9kcnZfb2htX249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9uLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX24pOwoJCXByaW50ZigiXG4uc29jX2RhdGFfb2R0X29obV9wPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fcCxkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9wKTsKCQlwcmludGYoIlxuLnNvY19kYXRhX29kdF9vaG1fbj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX24sZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fbik7CgkJcHJpbnRmKCJcbi5kcmFtX2RhdGFfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfZHJ2X29obSxkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX2Rydl9vaG0pOwoJCXByaW50ZigiXG4uZHJhbV9kYXRhX29kdF9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX29kdF9vaG0sZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htKTsKCQlwcmludGYoIlxuLmRyYW1fYWNfb2R0X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2FjX29kdF9vaG0sZGRyX3NldF90X3AtPmRyYW1fYWNfb2R0X29obSk7CgkJcHJpbnRmKCJcbi5zb2NfY2xrX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfY2xrX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2Nsa19zbGV3X3JhdGUpOwoJCXByaW50ZigiXG4uc29jX2NzX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlKTsKCQlwcmludGYoIlxuLnNvY19hY19zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2FjX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2FjX3NsZXdfcmF0ZSk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9zbGV3X3JhdGUpOwoJCXByaW50ZigiXG4udnJlZl9vdXRwdXRfcGVybWlsID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgKTsKCQlwcmludGYoIlxuLnZyZWZfcmVjZWl2ZXJfcGVybWlsID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX3JlY2VpdmVyX3Blcm1pbCAsZGRyX3NldF90X3AtPnZyZWZfcmVjZWl2ZXJfcGVybWlsICk7CgkJcHJpbnRmKCJcbi52cmVmX2RyYW1fcGVybWlsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWwsZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWwpOwoJCXByaW50ZigiXG4ubWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5PTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeSxkZHJfc2V0X3RfcC0+bWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5KTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzBdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVswXSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsxXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMV0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMl0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzJdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzNdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVszXSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs0XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNF0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNV0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzVdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzZdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs2XSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs3XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbN10pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOF0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzhdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzldLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs5XSk7CgkJcHJpbnRmKCJcbi5scGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmcsZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmcpOwoJCXByaW50ZigiXG4ubHBkZHI0X3g4X21vZGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bHBkZHI0X3g4X21vZGUsZGRyX3NldF90X3AtPmxwZGRyNF94OF9tb2RlKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFswXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzFdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzJdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbM10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFszXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzRdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzVdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs2XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzddLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbN10pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs4XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzhdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbOV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs5XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEyXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxM10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxM10pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE1XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE4XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE4XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIxXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIxXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI0XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI0XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzI2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI3XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI3XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbM10sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbM10pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs1XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs1XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNl0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs4XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs4XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTBdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzExXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzEyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzEyXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMl0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxM10sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTNdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE0XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE1XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTZdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTddLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE3XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE4XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTldKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjBdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIwXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIxXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjJdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjNdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIzXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzI0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzI0XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjVdKTsKCQlwcmludGYoIlxuLnNsdF90ZXN0X2Z1bmN0aW9uWzBdICA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMF0gICxkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMF0gICk7CgkJcHJpbnRmKCJcbi5zbHRfdGVzdF9mdW5jdGlvblsxXSAgPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzFdICAsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzFdICApOwoJCXByaW50ZigiXG4udGRxczJkcT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50ZHFzMmRxLGRkcl9zZXRfdF9wLT50ZHFzMmRxKTsKCQlwcmludGYoIlxuLmRyYW1fZGF0YV93cl9vZHRfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV93cl9vZHRfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfd3Jfb2R0X29obSk7CgkJcHJpbnRmKCJcbi5iaXRUaW1lQ29udHJvbF8yZD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5iaXRUaW1lQ29udHJvbF8yZCxkZHJfc2V0X3RfcC0+Yml0VGltZUNvbnRyb2xfMmQpOwoJCXByaW50ZigiXG4uZGRyX2RtY19yZW1hcFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsxXSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMl0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMl0pOwoJCXByaW50ZigiXG4uZGRyX2RtY19yZW1hcFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFs0XSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFs0XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFswXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2NhX3JlbWFwWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzJdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFszXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbM10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzRdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs1XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzddLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs4XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzldKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzEwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEwXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzEzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEzXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTRdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE2XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTddLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE5XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzIyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIyXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI1XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjZdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI4XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjldLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzMxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMxXSk7CgkJcHJpbnRmKCJcbi5kcmFtX3J0dF9ub21fd3JfcGFya1swXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX3J0dF9ub21fd3JfcGFya1swXSxkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMF0pOwoJCXByaW50ZigiXG4uZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV0sZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzFdKTsKCQlwcmludGYoIlxuLmRkcl9mdW5jPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9mdW5jLGRkcl9zZXRfdF9wLT5kZHJfZnVuYyk7CgoJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDE2O3RlbXBfY291bnQrKykKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVt0ZW1wX2NvdW50XSk7CgkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NzI7dGVtcF9jb3VudCsrKQoJCXByaW50ZigiXG4ucmVhZF9kcV9iaXRfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCgkJLy9wcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4ud3JpdGVfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw3Mjt0ZW1wX2NvdW50KyspCgkJLy9wcmludGYoIlxuLndyaXRlX2RxX2JpdF9kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4ud3JpdGVfZHFfYml0X2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCgkJLy9wcmludGYoIlxuLnJlYWRfZHFzX2dhdGVfZGVsYXlbJWRdPSVkLCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0ZW1wX2NvdW50XSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19nYXRlX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbdGVtcF9jb3VudF0pOwoJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDMyO3RlbXBfY291bnQrKykKCQkvL3ByaW50ZigiXG4uc29jX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgkJcHJpbnRmKCJcbi5zb2NfYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDMyO3RlbXBfY291bnQrKykKCQkvL3ByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCQlwcmludGYoIlxuLmRyYW1fYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgoJCS8vZGRyX3NldF90X3AtPmRxX2Rxc19kZWxheV9mbGFnPTB4ZmY7CgkJcHJpbnRmKCJcbi5yZXZlcjM9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIzLGRkcl9zZXRfdF9wLT5yZXZlcjMpOwoJCXByaW50ZigiXG4uZGZpX21ybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfbXJsLGRkcl9zZXRfdF9wLT5kZmlfbXJsKTsKCQlwcmludGYoIlxuLmRmaV9od3Rtcmw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybCxkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybCk7CgkJcHJpbnRmKCJcbi5BUmRQdHJJbml0VmFsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWwsZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWwpOwoKCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCgkJCS8vcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmRyYW1fYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCQlwcmludGYoIlxuLnJldHJhaW5pbmdbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1t0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1t0ZW1wX2NvdW50XSk7CgoJCXByaW50ZigiXG4iKTsKCgl9CglyZXR1cm4gMTsKfQoKCmludCBkb19kZHJfZmFzdGJvb3RfY29uZmlnKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCWludCBpPTA7CglpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9MDsgIC8vIDAgcGF1c2UgMSxyZXN1bWUKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CglpZiAoYXJnYyA9PSAxKQoJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCWVsc2UgaWYgKGFyZ2MgPiAxKQoJewoJCWNvdW50PTA7CgkJZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllbmFibGVfZGRyX2Zhc3RfYm9vdCA9IDA7CgkJfQoJCS8vCWNvdW50Kys7Cgl9CglpZiAoIWVuYWJsZV9kZHJfZmFzdF9ib290KQoJCXJldHVybiAxOwoKCWRkcl9zZXRfdCAqZGRyX3NldF90X3A9TlVMTDsKCWRkcl9zZXRfdF9wPShkZHJfc2V0X3QgKikoZGRyX3NldF90X3BfYXJyYXJ5KTsKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoJdWludDMyX3QgIGRkcl9zZXRfc2l6ZT0wOwoJZGRyX3NldF9hZGQ9KHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApOwoJZGRyX3NldF9zaXplPXNpemVvZihkZHJfc2V0X3QpOwoJZG9fcmVhZF9kZHJfdHJhaW5pbmdfZGF0YSgxLGRkcl9zZXRfdF9wKTsKCnsKCglkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDB4MCk7CgoJY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MDsKCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTA7CgoJewoJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMHhkPDwxNil8KDA8PDEyKXwoMHgwKSwwKTsgLy8gRFdDX0REUlBIWUFfQVBCT05MWTBfTWljcm9Db250TXV4U2VsCgoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMikpOwoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMykpOwoJaWYgKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD4zMCkKCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD0zMDsKCWlmIChkbWNfdGVzdF93b3JzdF93aW5kb3dfcng+MzApCglkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MzA7Ci8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMiksdDRfd3JpdGVfd29yc3RfbWFyZ2luX3JhbmsxKTsKLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMzKSx0NF9yZWFkX3dvcnN0X21hcmdpbl9yYW5rMSk7CglkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzFdPSgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eC8yKTw8NCkpfCgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeC8yKSkpOwoJCQkJfQoKfQoKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy9zdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4NzdmODFjZjAgMHgzMDAKCS8vcHJpbnRmKCJcbiAiKTsKCglpZiAoZW5hYmxlX2Rkcl9mYXN0X2Jvb3QgPT0gMSkKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmY7CgoJaWYgKGVuYWJsZV9kZHJfZmFzdF9ib290ID09IDIpCgkJZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXT0wOwoKCXsKCQkjaWYgMQoJCXByaW50ZigiJmRkcl9zaGEuZGRycyA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpJmRkcl9zaGEuZGRycyk7CgkJcHJpbnRmKCImZGRyX3NoYS5zaGEyIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5zaGEyKTsKCQlwcmludGYoImRkcl9zZXRfYWRkIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdClkZHJfc2V0X2FkZCk7CgoJCXNoYTI1Nl9jc3VtX3dkKCh1bnNpZ25lZCBjaGFyICopKHVpbnQ2NF90KWRkcl9zZXRfYWRkLCBzaXplb2YoZGRyX3NldF90KSwgZGRyX3NoYS5zaGEyLCAwKTsKCQkvL3NoYTIoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCXByaW50ZigicHJpbnQgc2hhXG4iKTsKCQkvL3NwcmludGYoc3RyLCJtZCAlMDh4IDB4MTAwIiwgKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF9hZGQtMzIpKTsKCQkvL3J1bl9jb21tYW5kKHN0ciwwKTsKCQkjZW5kaWYKCQkjaWZkZWYgVVNFX0ZPUl9VQk9PVF8yMDE4CgkJc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCSNlbHNlCgkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTik7CgkJI2VuZGlmCgkJLy8Jc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7CgkJLy8Jc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZCxkZHJfc2V0X3NpemUpOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CgoJcmV0dXJuIDE7Cn0KCiNlbmRpZgppbnQgZG9fZGRyX3NldF93YXRjaGRvZ192YWx1ZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCWlmIChhcmdjID09IDEpCgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCWVsc2UgaWYgIChhcmdjID4gMSkKCXsKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQkJd2F0Y2hkb2dfdGltZV9zPSAyMDsKCQl9CgkJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl9CgoJcmV0dXJuIDE7Cn0KCgovLyNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgkjZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKCSNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSAgNgoKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UgIDB4MTEKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGICAweDEyCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9EUkFNX1ZSRUYgICAgMHgxMwoKCXR5cGVkZWYgc3RydWN0IHRyYWluaW5nX2RlbGF5X2luZm9ybWF0aW9uewoJdWludDE2X3QgYWNfZGVsYXlbMTBdOwoJdWludDE2X3QgdHhkcXNfZGVsYXlbMTZdOwoJdWludDE2X3QgcnhkcXNfZGVsYXlbMTZdOwoJdWludDE2X3QgdHhkcV9kZWxheVs3Ml07Cgl1aW50MTZfdCByeGRxX2RlbGF5WzcyXTsKCXVpbnQxNl90IGdhdGVfcnhkcV9kZWxheVs3Ml07CgoJfSB0cmFpbmluZ19kZWxheV90OwoJdHJhaW5pbmdfZGVsYXlfdCAgdHJhaW5pbmdfZGVsYXlfdF9wOwoKCXVpbnQxNl90ICBsY2RfYmRsX3ZhbHVlWzcyXVs0XTsgLy9vcmcgbWluIG1heCBzdGF0dXMKCS8vICAjZGVmaW5lIExDRF9CRExSX09SRyAgIDAKCSNkZWZpbmUgTENEX0JETFJfTUlOICAwCgkjZGVmaW5lIExDRF9CRExSX01BWCAgIDEKCSNkZWZpbmUgTENEX0JETFJfU1RBVFVTICAyCgoJLy9CWVRFMC0zCgkjZGVmaW5lICBURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUMgIDAKCSNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMCAgMQoJI2RlZmluZSAgVEVTVF9BUkdfMl9TVEVQICAyICAgLy8gMCBpbml0ICAgMSB0ZXN0IGFjICAyIHRlc3QgdGRxc193cml0ZQoJI2RlZmluZSAgVEVTVF9BUkdfM19BTExfVE9HSFRFUiAgMwoKCS8vQllURTQtNwoJI2RlZmluZSAgVEVTVF9BUkdfRlJFUV9OSUJCTEVfTCAgNAoJI2RlZmluZSAgVEVTVF9BUkdfRlJFUV9OSUJCTEVfSCAgNQoKCS8vQllURTgtMTEKCSNkZWZpbmUgIFRFU1RfQVJHX0JPT1RfVElNRVNfTCA2CgkjZGVmaW5lICBURVNUX0FSR19CT09UX1RJTUVTX0ggNwoKCS8vQllURTEyLTE1CgkjZGVmaW5lICBURVNUX0FSR19FUlJPUl9GTEFHIDggICAvL3Rha2UgNCBieXRlIGZvciBrZXJuZWwgdGVzdCBmbGFnCgkvLyNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUcgNjMqNCAgIC8vdGFrZSA0IGJ5dGUgZm9yIGtlcm5lbCB0ZXN0IGZsYWcKCgkvL0JZVEUxNi0xOQoJLy8jZGVmaW5lICBURVNUX0FSR18xNl9MQ0RMUl9URU1QX0NPVU5UIDE2CgkjZGVmaW5lICBURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCAgMTIKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVggIDE2CgkjZGVmaW5lICBURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCAgMjAKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVggIDI0CgoJI2RlZmluZSAgVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYICAyOAoJI2RlZmluZSAgVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVggIDMwCgkvLyNkZWZpbmUgIFRFU1RfQVJHX05JQkJMRV9NQVNLMF9FTkFMQkVfSU5ERVggIDMyCgoJI2RlZmluZSAgVEVTVF9BUkdfRVJST1JfRkxBR19OVUxMIDAKCSNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTCAxCgkjZGVmaW5lICBURVNUX0FSR19FUlJPUl9GTEFHX1BBU1MgMgoKCSNkZWZpbmUgIFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFICAzMiAgLy8gMzJCWVRFCgkjZGVmaW5lICBURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSAgMyAgLy8zLy8vQllURQoKaW50IGRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfc3RpY2t5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfZHFzX3dpbmRvdyBmdW5jdGlvbiAgZGRyX3Rlc3RfY21kIDB4MjcgMHgxMDgwMDAwIDB4ODAwMDAwICAweDQwMDAwMDAwIDB4ODAwMDAwIDE1IDB4NiAgMCAwIDAgMCAwIDAgMS9jb25maWdcbiIpOwoJcHJpbnRmKCJcbmRkcl90ZXN0X2NtZCAweDI3IGNzMF90ZXN0X3N0YXJ0ICBjczBfdGVzdF9zaXplICBjczFfdGVzdF9zdGFydCAgY3MxX3Rlc3Rfc2l6ZSAgbnMgdGVzdF9pbmRleF9lbmFibGUgIG5pYmJsZV9tYXNrMCBuaWJibGVfbWFzazEgbmliYmxlX21hc2syIGRyYW1fdHlwZSBjaGFubmVsX21vZGUgIGNvbmZpZ19yZWdpc3RlciBhbGxfdG9ndGhlci0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7CglwcmludGYoIlxuIGFjIHdyaXRlX2RxcyByZWFkX2RxcyBjYW4gdGVzdCB0b2d0aGVyIHRlc3RfaW5kZXhfZW5hYmxlIGNhbiBlbmFibGUga2VybmVsIHRlc3QgXG4iKTsKCS8vICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPTA7Cgl1bnNpZ25lZCBpbnQgIG5pYmJsZV9zYXZlX29mZnNldD0gMDsKCXVuc2lnbmVkIGludCAgbmliYmxlX3N0ZXA9IDA7Cgl1bnNpZ25lZCBpbnQgIG5pYmJsZV9tYXg9IDE2OwoJdW5zaWduZWQgaW50ICB0ZXN0X2luZGV4X2VuYWJsZT0gMDsKCXVuc2lnbmVkIGludCAgdGVzdF9pbmRleD0gMDsKCXVuc2lnbmVkIGludCAgdGVzdF9pbmRleF9tYXg9IDY7Cgl1bnNpZ25lZCBpbnQgICByZWdfdmFsdWU9IDA7Cgl1bnNpZ25lZCBpbnQgIGRyYW1fdHlwZT0gMDsKCXVuc2lnbmVkIGludCAgY2hhbm5lbF9tb2RlPSAwOwoJdW5zaWduZWQgaW50ICBrZXJuZWxfd2F0Y2hkb2dfcz0gMjA7Ly8yNDA7CgkvLwkgIHVuc2lnbmVkIGludCAgZmluaXNoX2NsZWFyX2ZsYWc9IDA7Cgl1bnNpZ25lZCBpbnQgIGNvbmZpZ19yZWdpc3Rlcj0gMDsKCXVuc2lnbmVkIGludCAgIGFsbF90b2dodGVyX2VuYWJsZT0wOwoJdW5zaWduZWQgaW50ICAgZXJyb3JfZmxhZ19yZWdfYWRkPTA7CgljaGFyICpzdHJpbmdfcHJpbnRfZmxhZz0gICAiIHVib290LXdpbmRvdy1sb29wIFxuIjsKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgljaGFyICplbmRwOwoJY2hhciAqYnVmOwoJYnVmPSIiOwoKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3N0YXJ0PSAweDEwODAwMDA7Cgl1bnNpZ25lZCBpbnQgICBjczBfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7Cgl1bnNpZ25lZCBpbnQgICBjczFfdGVzdF9zdGFydD0gMDsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3NpemU9IDA7Cgl1bnNpZ25lZCBpbnQgICBlbmFibGVfa2VybmVsX3Rlc3Q9MDsKCWlmIChhcmdjID4xKSB7CgkJY3MwX3Rlc3Rfc3RhcnQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWNzMF90ZXN0X3N0YXJ0ID0gMHgxMDgwMDAwOwoJCX0KCX0KCglpZiAoYXJnYyA+MikgewoJCWNzMF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWNzMF90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoJfQoKCWlmIChhcmdjID4zKSB7CgkJY3MxX3Rlc3Rfc3RhcnQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWNzMV90ZXN0X3N0YXJ0ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NCkgewoJCWNzMV90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWNzMV90ZXN0X3NpemUgPSAwOwoJCX0KCX0KCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglkZHJfdGVzdF9zaXplID0gY3MwX3Rlc3Rfc2l6ZTsKCWlmIChhcmdjID41KSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMjA7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgoJaWYgKGFyZ2MgPjYpIHsKCQl0ZXN0X2luZGV4X2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2luZGV4X2VuYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoInRlc3RfaW5kZXhfZW5hYmxlPT0weCUwOHhcbiIsdGVzdF9pbmRleF9lbmFibGUpOwoJZW5hYmxlX2tlcm5lbF90ZXN0PSh0ZXN0X2luZGV4X2VuYWJsZT4+NykmMTsKCWlmIChlbmFibGVfa2VybmVsX3Rlc3QpIHsKCQlwcmludGYoImVuYWJsZSBrZXJuZWwgd2luZG93IHRlc3RcbiIpOwoJfQoKCXVuc2lnbmVkIGludCAgIG5pYmJsZV9tYXNrWzNdPSB7MCwwLDB9OwoJaWYgKGFyZ2MgPjcpIHsKCQluaWJibGVfbWFza1swXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1swXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzBdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMF0pOwoJaWYgKGFyZ2MgPjgpIHsKCQluaWJibGVfbWFza1sxXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1sxXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzFdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMV0pOwoJaWYgKGFyZ2MgPjkpIHsKCQluaWJibGVfbWFza1syXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1syXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzJdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMl0pOwoKCWlmIChhcmdjID4xMCkgewoJCWRyYW1fdHlwZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRyYW1fdHlwZT0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTEpIHsKCQljaGFubmVsX21vZGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQljaGFubmVsX21vZGU9IDA7CgkJfQoJfQoJLy8vKgoJaWYgKGFyZ2MgPjEyKSB7CgkJY29uZmlnX3JlZ2lzdGVyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY29uZmlnX3JlZ2lzdGVyPSAwOwoJCX0KCX0vLyovCgkvLy8qCglpZiAoYXJnYyA+MTMpIHsKCQlhbGxfdG9naHRlcl9lbmFibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEzXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlhbGxfdG9naHRlcl9lbmFibGU9IDA7CgkJfQoJfS8vKi8KCXByaW50ZigiYWxsX3RvZ2h0ZXJfZW5hYmxlPT0weCUwOHhcbiIsYWxsX3RvZ2h0ZXJfZW5hYmxlKTsKCglpZiAoYXJnYyA+MTQpIHsKCQllcnJvcl9mbGFnX3JlZ19hZGQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzE0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllcnJvcl9mbGFnX3JlZ19hZGQ9IDA7CgkJfQoJfQoJcHJpbnRmKCJlcnJvcl9mbGFnX3JlZ19hZGQ9PTB4JTA4eFxuIixlcnJvcl9mbGFnX3JlZ19hZGQpOwoJcHJpbnRmKCJcbnRlc3QgdXNlIHVib290IHN0aWNreSByZWdpc3RlclxuIik7CgoJLy9ETUNfU1RJQ0tZXzAKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy9jaGFyIHN0cl90ZW1wMVsxMDI0XT0iIjsKCS8vY2hhciBzdHJfdGVtcDJbMTAyNF09IiI7Cgl2b2xhdGlsZSB1aW50MTZfdCAgKm51bV9hcnJ5PU5VTEw7CgkvL3ZvbGF0aWxlIHVpbnQxNl90ICAqcF9udW1fYXJyeTsKCWludCBpOwoJLy91bnNpZ25lZCBpbnQgc3RpY2tfYmFzZV9hZGQ9MDsKCS8vdWludDMyX3QgZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4LHVpbnQzMl90IHZhbHVlKQoKCXN0aWNreV9yZWdfYmFzZV9hZGQ9KChETUNfU1RJQ0tZX0cxMkFfMCkmMHhmZmZmKTsKCS8vbnVtX2FycnkgPSAodWludDE2X3QgKikodWludDY0X3QgKShzdGlja3lfcmVnX2Jhc2VfYWRkKTsKCS8vbnVtX2Fycnk9cF9udW1fYXJyeTsKCWZvciAoaSA9IDA7IGkgPCA2NCo0OyBpKyspIHsKCQludW1fYXJyeVtpXT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsaSk7CgkJaWYgKChpID09IDApIHx8IChpID09IDMyKSB8fCAoaSA9PSAoMzIrMTAqMykpIHx8IChpID09ICgzMisxMCozKzE2KjMpKSB8fCAoaSA9PSAoMzIrMTAqMysxNiozKzE2KjMpKSkKCQl7CgkJCXByaW50ZigiXG4gbnVtYXJyeVslZF0iICxpKTsKCQl9CgkJcHJpbnRmKCIgJWQgIixudW1fYXJyeVtpXSk7Cgl9CgoJLyoKCSNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMCAgMQoJLy8jZGVmaW5lICBURVNUX0FSR18xX0NNRDEgIDEKCSNkZWZpbmUgIFRFU1RfQVJHXzJfU1RFUCAgMgoJI2RlZmluZSAgVEVTVF9BUkdfM19GUkVRICAzCgkjZGVmaW5lICBURVNUX0FSR180X1NURVBfU1RBVFVTICA0CgkjZGVmaW5lICBURVNUX0FSR181X0JPT1RfVElNRVMgIDUKCSNkZWZpbmUgIFRFU1RfQVJHXzZfTENETFJfVEVNUF9DT1VOVCA2CgkjZGVmaW5lICBURVNUX0FSR183X0RNQ19TVElDS1lfTUFHSUMgIDcKCSovCgoJdWludDE2X3QgdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlID0zMjsKCXVpbnQxNl90IHRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWUgPTMyOwoJdWludDE2X3QgdGVzdF9ib290X3RpbWVzID0wOwoJdWludDE2X3QgdGVzdF9kZHJfZnJlcXVlbmN5ID0wOwoJLy91aW50MTZfdCB0ZW1wX3N1Yl92YWx1ZV9hID0wOwoJLyoKCXVpbnQxNl90IHRlc3RfYXJnXzFfY21kMCA9MTsgIC8vbWFzdGVyIGNtZAoJdWludDE2X3QgdGVzdF9hcmdfMV9jbWQxID0wOyAgLy9taW4gY21kCgl1aW50MTZfdCB0ZXN0X2FyZ18yX3N0ZXAgPTA7IC8vc3RlcCAwICBpbml0ICAtMSBsYW5lMCB3IG1pbiAgLTIgbGFuZTAgdyBtYXggLTMgbGFuZTAgciBtaW4gICAgNCBsYW5lMCByIG1heCAtLS0tLTUgbGFuZTEgdyBtaW4gLi4uCgl1aW50MTZfdCB0ZXN0X2FyZ18zX2ZyZXEgPTA7Cgl1aW50MTZfdCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgl0ZXN0X2FyZ18wX2NtZDA9bnVtX2FycnlbMF07Cgl0ZXN0X2FyZ18xX2NtZDE9bnVtX2FycnlbMV07Cgl0ZXN0X2FyZ18yX3N0ZXA9bnVtX2FycnlbMl07Cgl0ZXN0X2FyZ18zX2ZyZXE9bnVtX2FycnlbM107Cgl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPW51bV9hcnJ5WzRdOwoJLy9ib290X3RpbWVzPW51bV9hcnJ5WzVdOwoJLy9sY2Rscl90ZW1wX2NvdW50PW51bV9hcnJ5WzZdOwoJKi8KCXByaW50ZigiXG5URVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUM9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUNdKTsKCXByaW50ZigiXG5URVNUX0FSR18xX0NNRDA9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdKTsKCXByaW50ZigiVEVTVF9BUkdfMl9TVEVQPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CglwcmludGYoIlRFU1RfQVJHXzNfQUxMX1RPR0hURVI9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR18zX0FMTF9UT0dIVEVSXSk7CglwcmludGYoIlRFU1RfQVJHX0ZSRVFfTklCQkxFX0w9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9MXSk7CglwcmludGYoIlRFU1RfQVJHX0ZSRVFfTklCQkxFX0g9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXSk7CglwcmludGYoIlRFU1RfQVJHX0JPT1RfVElNRVNfTD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF0pOwoJcHJpbnRmKCJURVNUX0FSR19CT09UX1RJTUVTX0g9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdKTsKCXByaW50ZigiVEVTVF9BUkdfRVJST1JfRkxBRz09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCglwcmludGYoIlRFU1RfQVJHX0ZSRVE9PSVkTVxuIiwobnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF08PDgpfChudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9MXTw8MCkpOwoJcHJpbnRmKCJURVNUX0FSR19CT09UX1RJTUVTPT0lZFxuIiwobnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXTw8OCl8KG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF08PDApKTsKCXRlc3RfYm9vdF90aW1lcz0obnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXTw8OCl8KG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF08PDApOwoJdGVzdF9kZHJfZnJlcXVlbmN5PShudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXTw8OCl8KG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdPDwwKTsKCWlmICgobnVtX2FycnlbVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDXSA9PSAoRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSYweGZmKSkgJiYKCShudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdPT0oRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSYweGZmKSkgKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJewoJCS8vbnVtX2FycnlbVEVTVF9BUkdfNV9CT09UX1RJTUVTXSsrOwoJCXRlc3RfYm9vdF90aW1lcysrOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF09dGVzdF9ib290X3RpbWVzJjB4ZmY7CgkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXT0odGVzdF9ib290X3RpbWVzPj44KSYweGZmOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0wsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfSCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdKTsKCgkJaWYgKCB0ZXN0X2Rkcl9mcmVxdWVuY3kgIT0gZ2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2Rkcl9mcmVxdWVuY3kpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2Rkcl9mcmVxdWVuY3kpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUgKDEpIDsKCQl9Cgl9CgllbHNlCgl7CgkJdGVzdF9ib290X3RpbWVzPTA7CgkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXT10ZXN0X2Jvb3RfdGltZXMmMHhmZjsKCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPSh0ZXN0X2Jvb3RfdGltZXM+PjgpJjB4ZmY7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfTCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdKTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19ILG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MDsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJfQoJcHJpbnRmKCJ0ZXN0X3N0aWNreSBpcyBub3QgbWFnaWMgbnVtbWJlcixib290IHRpbWVzPT0lZFxuIix0ZXN0X2Jvb3RfdGltZXMpOwoKCS8vaWYoY29uZmlnX3JlZ2lzdGVyPT0xKQoJewoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCksIGNzMF90ZXN0X3N0YXJ0KTsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCksIGNzMF90ZXN0X3NpemUpOwoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCksIGNzMV90ZXN0X3N0YXJ0KTsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCksIGNzMV90ZXN0X3NpemUpOwoJCXsKCQkJbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXT13YXRjaGRvZ190aW1lX3MmMHhmZjsKCQkJbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzFdPSh3YXRjaGRvZ190aW1lX3M+PjgpJjB4ZmY7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgsbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXSk7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwoVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzEpLG51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCsxXSk7CgkJfQoJCW51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYXT10ZXN0X2luZGV4X2VuYWJsZTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVgsbnVtX2FycnlbVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVhdKTsKCQlpZiAoY29uZmlnX3JlZ2lzdGVyID09IDEpCgkJCXsKCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTA7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCxudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCQkJfQoJCW51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdPWFsbF90b2dodGVyX2VuYWJsZTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfM19BTExfVE9HSFRFUixudW1fYXJyeVtURVNUX0FSR18zX0FMTF9UT0dIVEVSXSk7Cgl9CgoJaWYgKCggbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSkgPT0gMCkKCXsKCQl7CgkJCW51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ109RE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQyxudW1fYXJyeVtURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUNdKTsKCQkJbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXT1ETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMV9DTUQwLG51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF0pOwoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJCXsKCQkJCXRlc3RfYm9vdF90aW1lcz0wOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXT10ZXN0X2Jvb3RfdGltZXMmMHhmZjsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF09KHRlc3RfYm9vdF90aW1lcz4+OCkmMHhmZjsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0wsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19ILG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoJCQl9CgkJCXsKCQkJCXRlc3RfZGRyX2ZyZXF1ZW5jeT1nbG9iYWxfZGRyX2NsazsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdPXRlc3RfZGRyX2ZyZXF1ZW5jeSYweGZmOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF09KHRlc3RfZGRyX2ZyZXF1ZW5jeT4+OCkmMHhmZjsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19GUkVRX05JQkJMRV9MLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdKTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19GUkVRX05JQkJMRV9ILG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdKTsKCQkJfQoKCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19OVUxMOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfRVJST1JfRkxBRyxudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJfQoKCgkJZm9yIChuaWJibGVfc3RlcCA9IDA7IG5pYmJsZV9zdGVwIDwgNzI7IG5pYmJsZV9zdGVwKyspCgkJewoJCQkvL2lmKGxhbmVfc3RlcCUyKQoJCQl7CgkJCQkvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfT1JHXT0weGZmZmY7CgkJCQl0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU9MTY7CgkJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCQkJaWYgKG5pYmJsZV9zdGVwPDEwKQoJCQkJewoJCQkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0zMjsKCQkJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTMyOwoJCQkJfQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOXT10ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVhdPXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVNdPTA7Ly8wCgkJCQkJLy9kZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsaSxudW1fYXJyeVtpXSk7CgkJCX0KCgkJCXsKCQkJCWlmIChuaWJibGVfc3RlcDwzMikKCQkJCXsKCQkJCQlpZiAoKChuaWJibGVfbWFza1swXSk+Pm5pYmJsZV9zdGVwKSYxKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCQllbHNlIGlmIChuaWJibGVfc3RlcDw2NCkKCQkJCXsKCQkJCQlpZiAoKChuaWJibGVfbWFza1sxXSk+PihuaWJibGVfc3RlcC0zMikpJjEpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDk2KQoJCQkJewoJCQkJCWlmICgoKG5pYmJsZV9tYXNrWzJdKT4+KG5pYmJsZV9zdGVwLTY0KSkmMSkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQkJfQoJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKCQkJCXsKCQkJCQlpZiAoKG5pYmJsZV9zdGVwID09IDApIHx8IChuaWJibGVfc3RlcCA9PSAxMCkgfHwgKG5pYmJsZV9zdGVwID09ICgxMCsxNikpKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTA7CgkJCQkJZWxzZQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCX0KCQkvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTXT0weGZmZmY7Ly8wCgkJfQoKCQl7CgkJCS8vcHJpbnRmKCIuLm51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXSk7CgkJCWZvciAoaSA9IFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFOyBpIDwgNzIqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEU7IGkrKykgewoJCQkJLy8JbnVtX2FycnlbaV09MDsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxpLG51bV9hcnJ5W2ldKTsKCQkJCS8vCWRkcl93cl8xNmJpdF9vbl8zMnJlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MSkpLG51bV9hcnJ5W2ldKTsKCQkJCS8vCXByaW50ZigibnVtX2FycnlbMHglMDh4XSA9PTB4JTA4eFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCQl9CgoJfQoKaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKewoJZm9yIChuaWJibGVfc3RlcCA9IDA7IG5pYmJsZV9zdGVwIDwgNzI7IG5pYmJsZV9zdGVwKyspCgkJCQl7CgkJCQkJaWYgKChuaWJibGVfc3RlcCA9PSAwKSB8fCAobmliYmxlX3N0ZXAgPT0gMTApIHx8IChuaWJibGVfc3RlcCA9PSAoMTArMTYpKSkKCQkJCQkJewoJCQkJCS8vCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109MDsKCQkJCQkJfQoJCQkJCWVsc2UKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQkJfQp9CgppZiAoY29uZmlnX3JlZ2lzdGVyID09IDEpCnsKCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MDsKCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwp9CgppZiAoKCBudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSkKewpmb3IgKHRlc3RfaW5kZXg9bnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXTt0ZXN0X2luZGV4PHRlc3RfaW5kZXhfbWF4IDt0ZXN0X2luZGV4KysgKQp7CglwcmludGYoIlxudGVzdF9pbmRleD0lZFxuIix0ZXN0X2luZGV4KTsKCWlmICgoKCh0ZXN0X2luZGV4X2VuYWJsZSk+Pih0ZXN0X2luZGV4LTEpKSYxKSA9PSAwKQoJewoJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09KChudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSsxKTsvL3doeSBjYW4gbm90IHVzZSArKwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCWNvbnRpbnVlOwoJfQoJewoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9MDsKCQkJbmliYmxlX21heD0xMDsKCQkJbmliYmxlX21hc2tbMF09IDB4MzA7CgkJCWlmICgoZHJhbV90eXBlID09IENPTkZJR19ERFJfVFlQRV9MUEREUjMpKQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0gMHgzZTM7CgkJCX0KCQkJaWYgKChkcmFtX3R5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSNCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDI3MzsKCQkJCWlmICgoY2hhbm5lbF9tb2RlID09IENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDApKQoJCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNmMzsKCQkJfQoJCQl0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU9NjQ7CgkJCXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU9NjQ7CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0xMDsKCQkJbmliYmxlX21heD0xNjsKCQkJaWYgKChjczFfdGVzdF9zaXplID09IDApKQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0gMHhmZjAwOwoJCQl9CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0xNjsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT0xNjsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQoJCXsKCQkJbmliYmxlX3NhdmVfb2Zmc2V0PSgxMCkrKDE2KTsKCQkJaWYgKChjczFfdGVzdF9zaXplID09IDApKQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0gMHhmZjAwOwoJCQl9CgkJCW5pYmJsZV9tYXg9MTY7CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0xNjsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT0xNjsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9MDsKCQkJbmliYmxlX21heD03MjsKCQkJaWYgKChjczFfdGVzdF9zaXplID09IDApKQoJCQl7CgkJCQluaWJibGVfbWFza1sxXT0gMHhmZmZmZmZmMDsKCQkJCW5pYmJsZV9tYXNrWzJdPSAweGZmZmZmZmZmOwoJCQl9CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0xNjsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT0xNjsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9MDsKCQkJbmliYmxlX21heD03MjsKCQkJaWYgKChjczFfdGVzdF9zaXplID09IDApKQoJCQl7CgkJCQluaWJibGVfbWFza1sxXT0gMHhmZmZmZmZmMDsKCQkJCW5pYmJsZV9tYXNrWzJdPSAweGZmZmZmZmZmOwoJCQl9CgoJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT02NDsKCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTY0O30KCQkvL25pYmJsZV9tYXg9ODsvLwoJCS8vIGlmKG5pYmJsZV9tYXg+MzApICBjYW4gbm90IG92ZXIgc3RpY2t5IHJlZ2lzdGVyIHNpemUKCQkvLyAJbmliYmxlX21heD0zMDsKCQlmb3IgKChuaWJibGVfc3RlcD0wKTsobmliYmxlX3N0ZXA8bmliYmxlX21heCk7KG5pYmJsZV9zdGVwKyspKQoJCXsKCQkJaWYgKG5pYmJsZV9zdGVwPDMyKQoJCQl7CgkJCQlpZiAoKChuaWJibGVfbWFza1swXSk+Pm5pYmJsZV9zdGVwKSYxKQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw2NCkKCQkJewoJCQkJaWYgKCgobmliYmxlX21hc2tbMV0pPj4obmliYmxlX3N0ZXAtMzIpKSYxKQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw5NikKCQkJewoJCQkJaWYgKCgobmliYmxlX21hc2tbMl0pPj4obmliYmxlX3N0ZXAtNjQpKSYxKQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJfQoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQl9Cgl9Cgp7Cglmb3IgKChuaWJibGVfc3RlcD0wKTsobmliYmxlX3N0ZXA8bmliYmxlX21heCk7KG5pYmJsZV9zdGVwKyspKQoJewoJCWlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSA9PSA0KQoJCQljb250aW51ZTsKCQlwcmludGYoIm5pYmJsZV9zdGVwID09JWRcbiIsbmliYmxlX3N0ZXApOwoKCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJewoJCQlpZiAobmliYmxlX3N0ZXAlMikKCQkJewoJCQkJLy9uaWJibGVfc2F2ZV9vZmZzZXQKCQkJCS8vbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0xOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKSwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwLTErbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKSwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwLTErbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwLTErbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJLy9uaWJibGVfc3RlcCsrOwoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJCXsKCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJfQoKCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJewoJCQlpZiAobmliYmxlX3N0ZXA+NykKCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQl9CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCQl7CgkJCWlmIChuaWJibGVfc3RlcD43KQoJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCX0KCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJewoJCQlpZiAobmliYmxlX3N0ZXA+MzUpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCQl7CgkJCWlmIChuaWJibGVfc3RlcD4zNSkKCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQl9CgkJfQoJCXsKCQkJaWYgKG5pYmJsZV9zdGVwPDMyKQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0oKDB4ZmZmZmZmZmYpJih+KDE8PG5pYmJsZV9zdGVwKSkpOwoJCQkJbmliYmxlX21hc2tbMV09KCgweGZmZmZmZmZmKSk7CgkJCQluaWJibGVfbWFza1syXT0oKDB4ZmZmZmZmZmYpKTsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw2NCkKCQkJewoJCQkJbmliYmxlX21hc2tbMF09KCgweGZmZmZmZmZmKSk7CgkJCQluaWJibGVfbWFza1sxXT0oKDB4ZmZmZmZmZmYpJih+KDE8PChuaWJibGVfc3RlcC0zMikpKSk7CgkJCQluaWJibGVfbWFza1syXT0oKDB4ZmZmZmZmZmYpKTsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw5NikKCQkJewoJCQkJbmliYmxlX21hc2tbMF09KCgweGZmZmZmZmZmKSk7CgkJCQluaWJibGVfbWFza1sxXT0oKDB4ZmZmZmZmZmYpKTsKCQkJCW5pYmJsZV9tYXNrWzJdPSgoMHhmZmZmZmZmZikmKH4oMTw8KG5pYmJsZV9zdGVwLTY0KSkpKTsKCQkJfQoJCX0KCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKCQkJCXsKCQkJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9MDsKCQkJbmliYmxlX21heD0xMDsKCQkJbmliYmxlX21hc2tbMF09IDB4MzA7CgkJCW5pYmJsZV9tYXNrWzFdPSAwOwoJCQluaWJibGVfbWFza1syXT0gMDsKCQkJaWYgKChkcmFtX3R5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSMykpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNlMzsKCQkJfQoJCQlpZiAoKGRyYW1fdHlwZSA9PSBDT05GSUdfRERSX1RZUEVfTFBERFI0KSkKCQkJewoJCQkJbmliYmxlX21hc2tbMF09IDB4MjczOwoJCQkJaWYgKChjaGFubmVsX21vZGUgPT0gQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMCkpCgkJCQkJbmliYmxlX21hc2tbMF09IDB4M2YzOwoJCQl9CgoJCX0KCQkJCWVsc2UKCQkJCQl7CgkJCQluaWJibGVfbWFza1swXT0gMDsKCQkJCW5pYmJsZV9tYXNrWzFdPSAwOwoJCQkJbmliYmxlX21hc2tbMl09IDA7CgkJCQkJfQoKCQkJCX0KCgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHdhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix3YXRjaGRvZ190aW1lX3MpOwoJCWlmICgobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0gPT0gMHhmZmZmKQoJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0wKQoJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0xKSApCgkJewoJCQlwcmludGYoIlxubmliYmxlX3N0ZXAgID09JWQgIiwgbmliYmxlX3N0ZXApOwoJCQlpZiAoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldID09IDB4ZmZmZikKCQkJfHwobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTApKQoJCQl7CgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0xOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCgkJCQlpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0gPT0gMCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildPQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildLTE7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTiksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJfQoKCQkJCXsKCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUw7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJfQoKCQkJCS8vaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJLy8Jc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCS8vCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCS8vZWxzZQoJCQkJCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhICAlZCAgMHglMDh4IDB4JTA4eCAgMHglMDh4ICAlZCAlZCIsdGVzdF9pbmRleCxuaWJibGVfbWFza1swXSxuaWJibGVfbWFza1sxXSxuaWJibGVfbWFza1syXSxERFJfUEFSQU1FVEVSX0xFRlQsCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczBfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJfQoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8vCgkJCQkJaWYgKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3dhdGNoZG9nX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCX0KCQkJCQkvKgoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJKi8KCQkJCX0KCQkJfQoJCQllbHNlIGlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MSkKCQkJey8vZ28gb24gZmluZCBsZWZ0IGVkZ2UKCgkJCQlpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0gPT0gMCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJCWlmICgobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pID09IFRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUykKCQkJCXsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfTlVMTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgkJCQlpZiAoKG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKSA9PSBURVNUX0FSR19FUlJPUl9GTEFHX0ZBSUwpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXT0KCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0tMTsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQl9CgkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCAoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJLy8JaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJLy8JCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhICAlZCAgMHglMDh4IDB4JTA4eCAgMHglMDh4ICAlZCAlZCIsdGVzdF9pbmRleCwwLDAsMCxERFJfUEFSQU1FVEVSX0xFRlQsCgkJCQkvLwkJKCBudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXSkpOwoJCQkJLy8JZWxzZQoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9MRUZULAoJCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmIChhbGxfdG9naHRlcl9lbmFibGUgJiYgY3MxX3Rlc3Rfc2l6ZSkKCQkJCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCX0KCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy8KCQkJCQkJaWYgKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUzsKCQkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsa2VybmVsX3dhdGNoZG9nX3MpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQl9CgkJCQkJCS8qCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkqLwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLwlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCX0KCgkJaWYgKChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSA9PSAyKSB8fAoJCShudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MykpCgkJewoJCQlwcmludGYoIlxubmliYmxlX3N0ZXAgID09JWQgIiwgbmliYmxlX3N0ZXApOwoJCQlpZiAoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldID09IDIpCgkJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0yKSkKCQkJewoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MzsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgoJCQkJaWYgKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldID09IDApCgkJCQl7CgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09NDsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT0KCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXS0xOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJCX0KCgkJCQl7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCX0KCQkJLy8JaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkvLwlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsMCwwLDAsRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJLy8JbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pOwoJCQkvLwllbHNlCgkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczBfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJfQoJCQkvLwl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkvLwl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8vCgkJCQkJaWYgKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3dhdGNoZG9nX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCX0KCQkJCQkvKgoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJKi8KCQkJCX0KCQkJfQoJCQllbHNlIGlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MykKCQkJey8vZ28gb24gZmluZCBsZWZ0IGVkZ2UKCQkJCWlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSA9PSAwKQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTQ7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgoJCQkJaWYgKChudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSkgPT0gVEVTVF9BUkdfRVJST1JfRkxBR19QQVNTKQoJCQkJewoJCQkJCXsKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09NDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19OVUxMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWlmICgobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pID09IFRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTCkKCQkJCXsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldPQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXS0xOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCksCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJCQl9CgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUw7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCX0KCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsICggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pKTsKCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkvLwlpZihhbGxfdG9naHRlcl9lbmFibGUpCgkJCQkvLwlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsMCwwLDAsRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCS8vCSggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pKTsKCQkJCS8vCWVsc2UKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczBfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJfQoJCQkJLy8JdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCS8vICAgICAgdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUzsKCQkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCgkJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsa2VybmVsX3dhdGNoZG9nX3MpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQl9CgoJCQkJCQkvKgoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJKi8KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8JcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl9CgoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJewoJCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgkJfQoJfQoKCXByaW50ZigiMTFudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09KG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKzE7CglkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCXByaW50ZigiMjJudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCS8vfQoKCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCglwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgkvL30KCS8vZm9yKHRlc3RfaW5kZXg9MTt0ZXN0X2luZGV4PHRlc3RfaW5kZXhfbWF4IDt0ZXN0X2luZGV4KysgKQoJewoJCXVuc2lnbmVkIGludCAgdWlfMV8zMl8xMDBzdGVwPSAwOwoJCXVuc2lnbmVkIGludCAgYmRscl8xMDBzdGVwPSAwOwoJCXVpXzFfMzJfMTAwc3RlcD0oMTAwMDAwMCoxMDAvKGdsb2JhbF9kZHJfY2xrKjIqMzIpKTsKCQliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkJLy9pZigoKCh0ZXN0X2luZGV4X2VuYWJsZSk+Pih0ZXN0X2luZGV4LTEpKSYxKT09MCkKCgkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsYmRscl8xMDBzdGVwPSVkIHBzLHVpXzFfMzJfMTAwc3RlcD0lZCBwcyxcbiIsMCwwLGdsb2JhbF9kZHJfY2xrLAoJCWJkbHJfMTAwc3RlcCx1aV8xXzMyXzEwMHN0ZXApOwoKCQlwcmludGYoIlxuIHRlc3QgcmVzdWx0IGluZGV4PT0iKTsKCQlwcmludGYoIiUwOGQiLHRlc3RfaW5kZXgpOwoKCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJCXByaW50ZigiIGFjIHdpbmRvdzoiKTsKCQkJcHJpbnRmKCIgc3RlcF9zaXplIHBzPT0iKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCQlwcmludGYoIiB0eGRxcyB3aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQkJcHJpbnRmKCIgcnhfY2xrX3dpbmRvdzoiKTsKCQkJcHJpbnRmKCIgc3RlcF9zaXplIHBzPT0iKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJCXByaW50ZigiIHR4X2JpdF9kcV93aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCQlwcmludGYoIiByeF9iaXRfZHFfd2luZG93Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsYmRscl8xMDBzdGVwKTsvLzQ4MHBzCgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJcHJpbnRmKCJkZHIgY2xrIGZyZXF1ZW5jeSA6ICIpOwoJCXByaW50ZigiJTA4ZCIsKGdsb2JhbF9kZHJfY2xrKSk7CgkJcHJpbnRmKCJNaHogIik7CgkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoImluZGV4ICAgIG9yZyAgICAgIG1pbiAgICAgIG1heCAgICAgIGxlZnQgICAgIHJpZ2h0ICAgIGRlYyB2cmVmX3JhbmdlIHZyZWZfY291bnQiKTsKCQlwcmludGYoc3RyaW5nX3ByaW50X2ZsYWcpOwoKCQljaGFyIGRlbGF5X2xlZnRfbWFyZ2luPTA7CgkJY2hhciBkZWxheV9yaWdodF9tYXJnaW49MDsKCQlpZiAoYWxsX3RvZ2h0ZXJfZW5hYmxlID09IDEpCnsKCW5pYmJsZV9tYXg9MTsKfQoJCWZvciAoIG5pYmJsZV9zdGVwPTA7bmliYmxlX3N0ZXA8bmliYmxlX21heDtuaWJibGVfc3RlcCsrKQoJCXsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oZGVsYXlfbWFydGl4W2NvdW50XS5hZGRfaW5kZXgsOCk7CgkJCXByaW50ZigiJTA4ZCIsbmliYmxlX3N0ZXApOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIiwwKTsKCQkJLy9zZXJpYWxfcHV0cygiICIpOwoJCQkvL2lmICgodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpICkKCQkJewoJCQkJewoJCQkJCXByaW50ZigiICIpOwoJCQkJCXByaW50ZigiJTA4ZCIsMC8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NSU5dCgkJCQkJCSk7CgkJCQl9CgkJCX0KCQkJewoJCQkJewoJCQkJCXByaW50ZigiICIpOwoJCQkJCXByaW50ZigiJTA4ZCIsMC8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NQVhdCgkJCQkJCSk7CgkJCQl9CgkJCX0KCgkJCS8vCWRlbGF5X2xlZnRfbWFyZ2luPSgobnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddPm51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUlOXSk/CgkJCS8vCQkobnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddLW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUlOXSk6MCk7CgkJCS8vCWRlbGF5X3JpZ2h0X21hcmdpbj0oKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUFYXT5udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX09SR10pPwoJCQkvLwkJKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUFYXS1udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX09SR10pOjApOwoJCQlkZWxheV9sZWZ0X21hcmdpbj1udW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXTsKCQkJZGVsYXlfcmlnaHRfbWFyZ2luPW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIixkZWxheV9sZWZ0X21hcmdpbik7CgoJCQkvL3NlcmlhbF9wdXRfZGVjX291dF9hbGlnbigoZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9vcmc+ZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9taW4pPyhkZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X29yZy1kZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X21pbik6MCw4KTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsZGVsYXlfcmlnaHRfbWFyZ2luKTsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oKGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWF4PmRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnKT8oZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9tYXgtZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9vcmcpOjAsOCk7CgkJCXByaW50ZigiICAgICAiKTsKCQkJcHJpbnRmKCIlMDhkIiwwKTsKCQkJcHJpbnRmKCIgICAiKTsKCQkJcHJpbnRmKCIlMDhkIiwwKTsKCQkJcHJpbnRmKCIgICAyZC1leWUiKTsgLy9wX2Rldi0+Y3VyX3R5cGUKCQkJcHJpbnRmKCIgZHJhbXR5cGUgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCXByaW50ZigiICIpOwoJCQlwcmludGYoIiUwOGQiLChnbG9iYWxfZGRyX2NsaykpOwoJCQlwcmludGYoIiBNIGJkbCAiKTsKCQkJcHJpbnRmKCIlMDhkIixiZGxyXzEwMHN0ZXApOy8vNDgwcHMKCQkJcHJpbnRmKCIgLzEwMCBwcyAiKTsKCQkJcHJpbnRmKCIxLzMyc3RlcD09ICIpOwoJCQlwcmludGYoIiUwOGQiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCXByaW50ZigiIC8xMDAgcHMgIik7CgkJCS8vc2VyaWFsX3B1dHMoImJpdF9pbml0X3ZhbHVlICIpOwoJCQkvL3NlcmlhbF9wdXRfZGVjX291dF9hbGlnbigocF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfcGVyX2JpdF9pbml0X3ZhbHVlKSw0KTsKCQkJLy9pZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpewoJCQkvL3NlcmlhbF9wdXRzKCJ0eGRxc2RseV9zZWNvbmRfdHVuZV9taW5fdmFsdWUgIik7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKHR4ZHFzZGx5X3NlY29uZF90dW5lX3ZhbHVlW2NvdW50XSw0KTsKCQkJCS8vfQoJCQlwcmludGYoc3RyaW5nX3ByaW50X2ZsYWcpOwoJCQkvL3NlcmlhbF9wdXRzKCJcbiIpOwoJCX0KCX0KfQp9Cn0KCglpZiAoY29uZmlnX3JlZ2lzdGVyID09IDEpCgl7CgkJaWYgKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0gPT0gMCkKCQl7CgkJCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09MTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJfQoJfQoKCQlpZiAoKGVuYWJsZV9rZXJuZWxfdGVzdCkgJiYgKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0+MSkpCgkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJcmV0dXJuIHJlZ192YWx1ZTsKfQovL291eWFuZwoKI2RlZmluZSBkd2NfZGRycGh5X2FwYl93cihhZGRyLCBkYXQpICAgKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrMHhmZTAwMDAwMCkpPSgodWludDE2X3QpZGF0KQojZGVmaW5lIGR3Y19kZHJwaHlfYXBiX3JkKGFkZHIpICAgKih2b2xhdGlsZSB1aW50MTZfdCAqKShpbnRfY29udnRlcl9wKCgoYWRkcikgPDwgMSkrMHhmZTAwMDAwMCkpCiNkZWZpbmUgQUNYX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKCi8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4YjApLDApOwovL2R3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMCk7Ci8vZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwxKTsKCi8vKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOwovL2R3Y19kZHJwaHlfYXBiX3dyKChwczw8MjApfCgwPDwxNil8KGluc3RhbmNlX251bTw8MTIpfCgweDgwKSwpOwoKLy9kZHJfdGVzdF9hY3hfZzEyYSBhIGxlbmd0aCBzdGVwIHRlc3RfbW9kZSBBQ3gKLy9kZHJfdGVzdF9hY3hfZzEyYSAgYSAgICAgICAweDgwMDAwMDAgIDEgICAgICAgICAgMCAgICAgICAgIDB4MQovL2FyZ3ZbMF0gICAgICAgICAgIGFyZ3ZbMV0gIGFyZ3ZbMl0gICAgYXJndlszXSAgICBhcmd2WzRdICAgYXJndls1XQovL2FyZ3ZbMV0sYQovL2FyZ3ZbMl0sdGVzdCBsZW5ndGgKLy9hcmd2WzNdLHRlc3Qgc3RlcAovL2FyZ3ZbNF0sdGVzdF9tb2RlLGRpcmVjdGlvbiwwLHVwOyAgICAxLGRvd247ICAgIDIsZG93biBmaXJzdCx1cCBmb2xsb3c7Ci8vYXJndls1XSxBQ3g7MC1BQzAsMS1BQzEsMi1BQzIuLi4sOS1BQzkKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCiNkZWZpbmUgIEcxMl9EQVRBX1JFQURfT0ZGU0VUX01BWCAgICgwWDNGKQojZGVmaW5lICBHMTJfREFUQV9XUklURV9PRkZTRVRfTUFYICAgKDBYM0YrNyozMikKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkgIDYKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UgIDB4MTEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYgIDB4MTIKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRFJBTV9WUkVGICAgIDB4MTMKCnVpbnQzMl90ICBkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAoY2hhciB0ZXN0X2luZGV4LHVpbnQzMl90IHZhbHVlKQp7CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1Cgl1aW50MzJfdCByZXN1bHQ9MDsKCS8qCgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkgICByZXN1bHQ9MzIqKCgodmFsdWU+PjYpJjEpKygodmFsdWU+PjUpJjEpKSt2YWx1ZSYweDFmOwoJICAgfQoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkgICByZXN1bHQ9MzIqKCgodmFsdWU+PjYpJjB4ZikrKCh2YWx1ZT4+NSkmMSkpK3ZhbHVlJjB4MWY7CgkgICB9CgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCSAgIHJlc3VsdD0zMiooKCh2YWx1ZT4+NikmMHhmKSsoKHZhbHVlPj41KSYxKSkrdmFsdWUmMHgxZjsKCSAgIH0KCSAgICovCiNpZiAwCglpZiAoKHRlc3RfaW5kZXggPD0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpICkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4ZikrKCh2YWx1ZT4+NSkmMSkpKyh2YWx1ZSYweDFmKSk7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSYweGYpKygoKHZhbHVlPj41KSYxKSoxKSkrKHZhbHVlJjB4MWYpKTsgLy9iaXQgNSBjaGFuZ2UgdG8gMSBVSSAyMDE4MDcxMQoJCS8vcmVzdWx0PSgzMiooKCgodmFsdWU+PjUpJjEpKjEpKSsodmFsdWUmMHgxZikpOyAvL2JpdCA1IGNoYW5nZSB0byAxIFVJIDIwMTgwNzExCgl9CgoJaWYgKCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKSkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4MWYpKygoKHZhbHVlPj41KSYxKSoxKSkrKHZhbHVlJjB4MWYpKTsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVzdWx0PXZhbHVlJjB4M2Y7Cgl9CgojZWxzZQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjEpKygodmFsdWU+PjUpJjEpKSkrKHZhbHVlJjB4MWYpOwoJfQoJLy91c2UgZm9yIHR4ZHFkbHkgcmVnaXN0ZXIgLGJlY2F1c2Ugb2YgdGhpcyByZWdpc3RlciBiaXQgNSBpcyBubyB1c2UgamlheGluZyAyMDE4MDgxNAoJCWVsc2UJaWYoICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKXx8KHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSkgIHsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSY3KSkpKyh2YWx1ZSYweDNmKTsKCX0KCWVsc2UgIC8vb3RoZXIgcmVnaXN0ZXIgYml0NSBpcyBlZmZlY3QgLGJ1dCBjYW4gbm90IG1vZGlmeSBjb2Fyc2UgZGVsYXkgd2h5ICA/ICBqaWF4aW5nIDIwMTgwODE0CgkJcmVzdWx0PXZhbHVlJjB4M2Y7CiNlbmRpZgoJaWYgKHRlc3RfaW5kZXggPj0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UpIHsKCQlyZXN1bHQ9dmFsdWU7Cgl9CglyZXR1cm4gcmVzdWx0Owp9Cgp1aW50MzJfdCBkZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKGNoYXIgdGVzdF9pbmRleCx1aW50MzJfdCB2YWx1ZSApCnsKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1Cgl1aW50MzJfdCByZXN1bHQ9MDsKCWlmICgodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSApIHsKCQlpZiAodmFsdWU8NjQpIHsKCQkJcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSUzMjsKCQl9CgkJZWxzZSB7CgkJCXJlc3VsdD0oMzw8NSkrKHZhbHVlJTMyKTsKCQl9Cgl9CgkvKgoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkgICByZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJICAgfQoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkgICByZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJICAgfQoJICAgKi8KCSAgIGVsc2UgaWYoKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKQoJCQkgICB8fCh0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJCSAgIHx8KHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKSkgewoJCSAgIC8vcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSU2NDsKCQkgICByZXN1bHQ9dmFsdWUlNjQ7CgkJCWlmICgodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgfHwgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKSB7ICAvL3VzZSBmb3IgdHhkcWRseSByZWdpc3RlciAsYmVjYXVzZSBvZiB0aGlzIHJlZ2lzdGVyIGJpdCA1IGlzIG5vIHVzZSBqaWF4aW5nIDIwMTgwODE0CgkJCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkJICAgfQoJICAgfQoJICAgZWxzZSBpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCSAgIHJlc3VsdD12YWx1ZSYweDNmOwoJICAgfQoJICAgZWxzZSBpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKI2lmIDEKCQkgICByZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJCS8qCgkJICAgaWYgKGVuYWJsZV9iaXQ1KQoJCSAgIHsKCQkJICAgaWYgKChyZXN1bHQ+PjYpJjEpCgkJCSAgIHtyZXN1bHQ9KHJlc3VsdCYweGZmYmYpfCgxPDw1KTsKCQkJICAgfQoJCSAgIH0KCQkqLwojZWxzZQoJCSAgIHJlc3VsdD12YWx1ZSU2NDsKI2VuZGlmCgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg+RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQkgICByZXN1bHQ9dmFsdWU7CgkgICB9CgoJICAgcmV0dXJuIHJlc3VsdDsKfQoKdW5zaWduZWQgaW50IGRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2Rscih1bnNpZ25lZCBpbnQgcmFua19pbmRleCx1bnNpZ25lZCBpbnQgYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwwKTsvL213IGZlMWEwMDAwICAwCgkvLyAgcmVnX2Jhc2VfYWRqPTB4ZmUwMDAwMDA7CgkvLyByZWdfYWRkPSgoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSk8PDEpICsgcmVnX2Jhc2VfYWRqOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCXsKCgkJCWxjZGxyX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwoYWRkX2luZGV4PDwxMil8KDB4ODApKTsKCQl9CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsKCgkJCWR3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgwPDwxNil8KGFkZF9pbmRleDw8MTIpfCgweDgwKSksIGxjZGxyX3ZhbHVlKTsKCQl9CgoJcHJpbnRmKCJyYW5rX2luZGV4ICVkICAgYWRkX2luZGV4ICVkICBsY2Rscj09ICVkIFxuIiwgcmFua19pbmRleCxhZGRfaW5kZXgsbGNkbHJfdmFsdWUpOwoJcmV0dXJuIGxjZGxyX3ZhbHVlOwp9Cgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX2RxKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLAoJdWludDMyX3Qgc3RlcF92YWx1ZSkKewoJdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7Cgl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWU9MDsKCgl1aW50NjRfdCByZWdfYWRkPTA7CglpZiAoIW92ZXJfcmlkZV9pbmRleCkKCQlyZXR1cm47CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT4yNTUpCgkJCQlkZWxheV9yZWdfdmFsdWU9MjU1OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoKCX0KCnByaW50ZigicmVnX2FkZCAlMDh4IG9sZF92YWx1ZSAlMDh4IHVwZGF0ZV90byAlMDh4IGRlYyAlZCB0byAlZCBcbiIsKCh1bnNpZ25lZCBpbnQpKCgocmVnX2FkZCkgPDwgMSkrMHhmZTAwMDAwMCkpLAoJCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkJKHVuc2lnbmVkIGludClkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSkpOwoKfQoKdm9pZCBkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGUoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfdmFsdWUpCnsKCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZT0wOwoJdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlPTA7Cgl1aW50NjRfdCByZWdfYWRkPTA7CgkvLwlpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkvL3BfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbD0wOwoJLy9zZXJpYWxfcHV0cygiXG5zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmc9PSIpOwoJLy9zZXJpYWxfcHV0X2RlYyhwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZyk7CgkvL3NlcmlhbF9wdXRzKCJcbiIpOwoKCWlmICghb3Zlcl9yaWRlX2luZGV4KSB7CgkJcmV0dXJuOwoJfQoJLy9kZHJfZG1jX3VwZGF0ZV9kZWxheV9yZWdpc3Rlcl9iZWZvcmUoKTsKCS8vY2hhciBlbmFibGVfYml0NT0wOwoJLy8JaWYgKChwX2Rldi0+cF9kZHJzLT5EcmFtVHlwZSA9PSBDT05GSUdfRERSX1RZUEVfTFBERFI0KSAmJiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkpCgkvLwkJe2VuYWJsZV9iaXQ1PTE7fQoJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUpOwoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMDw8MTYpfChvdmVyX3JpZGVfc3ViX2luZGV4PDwxMil8KDB4ODApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDFkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoKCQkvLwl7ZW5hYmxlX2JpdDU9KGRlbGF5X29sZF92YWx1ZT4+NSkmMTt9CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSxlbmFibGVfYml0NSk7CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweDhjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZSk7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MThjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSwoZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSktcF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19waHlfcmVhZF9kcXNfbmliYmxlX29mZnNldCk7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg5MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSwoZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSkpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDE5MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksKGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpLXBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfcGh5X3JlYWRfZHFzX25pYmJsZV9vZmZzZXQpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweDY4Kygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDgwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MTgwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJLy8JZGVsYXlfb2xkX3ZhbHVlPSBpbml0X3NvY192cmVmKHBfZGV2LT5jdXJfdHlwZSAgLChvdmVyX3JpZGVfdmFsdWU+PjgpJjB4ZmYsIG92ZXJfcmlkZV92YWx1ZSwgb3Zlcl9yaWRlX3N1Yl9pbmRleCAscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkvLwlzZXRfc29jX3ZyZWYoIHBfZGV2LT5jdXJfdHlwZSAsICAob3Zlcl9yaWRlX3ZhbHVlPj44KSYweGZmLCBvdmVyX3JpZGVfdmFsdWUsIG92ZXJfcmlkZV9zdWJfaW5kZXggKTsKCQlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7Cgl9CgoJcHJpbnRmKCJyZWdfYWRkICUwOHggb2xkX3ZhbHVlICUwOHggdXBkYXRlX3RvICUwOHggZGVjICVkIHRvICVkIFxuIiwoKHVuc2lnbmVkIGludCkoKChyZWdfYWRkKSA8PCAxKSsweGZlMDAwMDAwKSksCgkJCWRlbGF5X29sZF92YWx1ZSxkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSxkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpLAoJCQkodW5zaWduZWQgaW50KWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSkpOwp9Cgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihjaGFyIG92ZXJfcmlkZV9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfc3ViX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwKCXVpbnQzMl90IHN0ZXBfdmFsdWUpCnsKCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZT0wOwoJdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlPTA7CgoJdWludDY0X3QgcmVnX2FkZD0wOwoJaWYgKCFvdmVyX3JpZGVfaW5kZXgpCgkJcmV0dXJuOwoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgoJCXJlZ19hZGQ9KCgwPDwyMCl8KDA8PDE2KXwob3Zlcl9yaWRlX3N1Yl9pbmRleDw8MTIpfCgweDgwKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT45NSkKCQkJZGVsYXlfcmVnX3ZhbHVlPTk1OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IHN0ZXBfdmFsdWUpCgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cigocmVnX2FkZCksZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgoKLy9zb21lIGNhc2Ugd2lsbCBoYXBwZW4gdGRxcyBmcm9tIDB4MWYgdG8gMHgwIG9yIDB4MCB0byAweDFmICx0aGVuIGZhc3QgYm9vdCB3cml0ZSBiYWNrIHdpbGwgaGFwcGVuIGVycm9yICxiZWNhdXNlCi8vIGZhc3QgYm9vdCB3cml0ZSBiYWNrIHdpbGwgcmUtY2FsY3VsYXRlIGNvYXJzZSBVSSx0aGVuIHJlc3VsdCBkcSBwaGFzZSBmYWlsLgovKgoJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQogICAgLy8gIGlmKG92ZXJfcmlkZV92YWx1ZT5kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSkpCgkJe2R3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCWlmICgoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKT4weDNmKQoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsMHgzZnwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCWVsc2UKCQl7Ly9kd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpLXN0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJaWYgKCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpPHN0ZXBfdmFsdWUpKQoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQllbHNlCgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKS1zdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCiovCglpZiAoKG92ZXJfcmlkZV9zdWJfaW5kZXglMikgPT0gMCkKCXsKCQljaGFyCXRlbXBfdGVzdF9pbmRleD1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWTsKCQljaGFyIHRlbXBfY291bnQ9MDsKCQkvLwlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw5O3RlbXBfY291bnQrKykKCQkJewoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfZHEodGVtcF90ZXN0X2luZGV4CgkJCQksKCgob3Zlcl9yaWRlX3N1Yl9pbmRleCk+PjEpKjkrdGVtcF9jb3VudCksCQkoIW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSksc3RlcF92YWx1ZSkgOwoJCQl9CgkJfQoJfQoKCgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCgkJLy8Je2VuYWJsZV9iaXQ1PShkZWxheV9vbGRfdmFsdWU+PjUpJjE7fQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUsZW5hYmxlX2JpdDUpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT4yNTUpCgkJCQlkZWxheV9yZWdfdmFsdWU9MjU1OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+OTUpCgkJCQlkZWxheV9yZWdfdmFsdWU9OTU7CgkJfQoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgIT0gMCkKCQl7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+c3RlcF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZSk7CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweDY4Kygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT42MykKCQkJCWRlbGF5X3JlZ192YWx1ZT02MzsKCQl9CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSAhPSAwKQoJCXsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpIHsKCQkvLy8qCgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDgwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKICAgIC8vICBpZihvdmVyX3JpZGVfdmFsdWU+ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpKQoJCXsKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCQlpZiAoKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSk+MHgzZikKCQkJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsMHgzZnwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJICAgIH0KCQllbHNlCgkJewoJCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpLXN0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJCWlmICgoKGRlbGF5X29sZF92YWx1ZSYweDNmKTxzdGVwX3ZhbHVlKSkKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCS8vCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJLy8qLwoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7CgkJLy9yZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYgKGRlbGF5X3JlZ192YWx1ZT4xMjcpCgkJCQlkZWxheV9yZWdfdmFsdWU9MTI3OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlICE9IDApCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IHN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKzB4ZmUwMDAwMDApKSwKCQkJZGVsYXlfb2xkX3ZhbHVlLGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpLGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSksCgkJCSh1bnNpZ25lZCBpbnQpZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCkpKTsKCn0KCgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLAoJdWludDMyX3Qgb2Zmc2V0X3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCS8vdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlPTA7Cgl1aW50MzJfdCB0ZW1wX2NvdW50XzM9MDsKCS8vCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZV9jYWNsPTA7CgkvLwl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWVfY2FjbD0wOwoJLy91aW50MzJfdCBvdmVyX3JpZGVfdmFsdWU9MDsKCS8vCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCS8vcF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsPTA7CgkvL3NlcmlhbF9wdXRzKCJcbnN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZz09Iik7CgkvL3NlcmlhbF9wdXRfZGVjKHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nKTsKCS8vc2VyaWFsX3B1dHMoIlxuIik7Cgl1aW50NjRfdCByZWdfYWRkPTA7CglpZiAoIW92ZXJfcmlkZV9pbmRleCkgewoJCXJldHVybjsKCX0KCgkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDA8PDE2KXwob3Zlcl9yaWRlX3N1Yl9pbmRleDw8MTIpfCgweDgwKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWZvciAoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrb2Zmc2V0X3ZhbHVlOwoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTk2OwoJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDEpCgkJewoJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJLy9kd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgoJCS8vCXtlbmFibGVfYml0NT0oZGVsYXlfb2xkX3ZhbHVlPj41KSYxO30KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlLGVuYWJsZV9iaXQ1KTsKCSovCglmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJewoJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJfQoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAwKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJCWlmIChkZWxheV9yZWdfdmFsdWU+OTYpCgkJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJfQoJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMSkKCQl7CgkJCQlpZiAoZGVsYXlfb2xkX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJKi8KCQkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9CgoJCS8qCgkJICAgZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHgxOGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQkgICBpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJICAgZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZSsxOwoJCSAgIGlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMSkKCQkgICBkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlLTE7CgkJICAgZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDE4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJICAgZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDE5MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJICAgKi8KCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJCX0KCQkJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMSkKCQl7CgkJCQlpZiAoZGVsYXlfcmVnX3ZhbHVlID49IG9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJCX0KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSkrMTsKCQkvL2lmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSktMTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwpkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCSovCgkJCQkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweDY4Kygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZTsKCQkJCWlmIChvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UgPT0gMCkKCQkJewoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrb2Zmc2V0X3ZhbHVlOwoJCWlmIChkZWxheV9yZWdfdmFsdWU+OTYpCgkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQkJfQoJCQkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQkJCWlmIChkZWxheV9yZWdfdmFsdWUgPj0gb2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQpkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCSovCgkJCQkJZm9yICggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkgewoKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4ODArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJCX0KCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDEpCgkJewoJCQkJaWYgKGRlbGF5X3JlZ192YWx1ZSA+PSBvZmZzZXRfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJKi8KCQkJCQlmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCQl9CgoKaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpIHsKCgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7CgkJLy9yZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWU7CgkJCQlpZiAob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlID09IDApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZiAoZGVsYXlfcmVnX3ZhbHVlPjEyNykKCQkJZGVsYXlfcmVnX3ZhbHVlPTEyNzsKCQkJfQoJCQkJaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQoJCXsKCQkJCWlmIChkZWxheV9yZWdfdmFsdWUgPj0gb2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQovL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CiovCglmb3IgKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCnByaW50Zigib3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0lZFxuIixvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UpOwoKaWYgKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSA9PSAxKQp7CnVuc2lnbmVkIGludCBvcmdfY2FjbF92YWx1ZT0oZGVsYXlfb2xkX3ZhbHVlKSYweDNmOwpwcmludGYoIm9yZ19jYWNsX3ZhbHVlPT0lZFxuIixvcmdfY2FjbF92YWx1ZSk7CnByaW50Zigib2Zmc2V0X3ZhbHVlPT0lZFxuIixvZmZzZXRfdmFsdWUpOwoJaWYgKChvcmdfY2FjbF92YWx1ZSYweDNmKTxvZmZzZXRfdmFsdWUpIHsKCgljaGFyIHRlbXBfdGVzdF9pbmRleF8yPTA7CgljaGFyIHRlbXBfY291bnRfND0wOwoJY2hhciB0ZW1wX2NvdW50XzI9MDsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCXsKCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZOwoJaWYgKG92ZXJfcmlkZV9zdWJfaW5kZXglMiA9PSAwKSB7Cglmb3IgKHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw5O3RlbXBfY291bnRfMisrKQoJCXtmb3IodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpO3RlbXBfY291bnRfNCsrKQp7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4Pj4xKSo5K3RlbXBfY291bnRfMiksCQkwLDEpIDsKCQl9CgkJfQoJCX0KLyoKCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWTsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCSwoKG92ZXJfcmlkZV9pbmRleCUyKT8KCQkob3Zlcl9yaWRlX2luZGV4LTEpOgoJCShvdmVyX3JpZGVfaW5kZXgrMSkpLAkJMCkgOwoJCX0KKi8KCQl9CmlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQp7Cgl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWTsKCmZvciAoIHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw0O3RlbXBfY291bnRfMisrKQoJZm9yICh0ZW1wX2NvdW50XzQ9MDt0ZW1wX2NvdW50XzQ8KCgob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKSp1aV8xXzMyXzEwMHN0ZXApL2JkbHJfMTAwc3RlcCk7dGVtcF9jb3VudF80KyspCgkJewp7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4LzIpKjkrCgkJdGVtcF9jb3VudF8yKyhvdmVyX3JpZGVfc3ViX2luZGV4JTIpKjQpLAkJMCwxKSA7CgoJCQkJfQoJCX0KfQoKCQkJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCQkJewoJCQkJdGVtcF90ZXN0X2luZGV4XzI9RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFk7CgoJCQkJZm9yICggdGVtcF9jb3VudF8yPTA7dGVtcF9jb3VudF8yPDQ7dGVtcF9jb3VudF8yKyspCgkJCQl7CgkJCQkJaWYgKHRlbXBfY291bnRfMiA9PSAoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSklNCkpCgkJCQkJCXRlbXBfY291bnRfMisrOwpmb3IgKHRlbXBfY291bnRfND0wO3RlbXBfY291bnRfNDwob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKTt0ZW1wX2NvdW50XzQrKykKCQkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQkJCQkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgvOSkqOSsKCQl0ZW1wX2NvdW50XzIrKCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KT4zKT80OjApKSwJCTAsMSkgOwoKCQkJCX0KCQkJCS8vYmRscl8xMDBzdGVwICAob3JnX2NhY2xfdmFsdWU8b2Zmc2V0X3ZhbHVlKQoJCQkJaWYgKCgoKG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSkqYmRscl8xMDBzdGVwKS91aV8xXzMyXzEwMHN0ZXApKQoJCQkJewoJCQkJCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWTsKCWZvciAodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PCgoKG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSkqYmRscl8xMDBzdGVwKS91aV8xXzMyXzEwMHN0ZXApO3RlbXBfY291bnRfNCsrKQoJCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCQkJCQkJLCgoKG92ZXJfcmlkZV9zdWJfaW5kZXgvOSk8PDEpKwoJCQkJCQkJCSgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk+Myk/MTowKQoJCSksCQkwLDEpIDsKCQkJCX0KCQkJfQoJCX0KfQoJcHJpbnRmKCJyZWdfYWRkICUwOHggb2xkX3ZhbHVlICUwOHggdXBkYXRlX3RvICUwOHggZGVjICVkIHRvICVkIFxuIiwoKHVuc2lnbmVkIGludCkoKChyZWdfYWRkKSA8PCAxKSsweGZlMDAwMDAwKSksCgkJCWRlbGF5X29sZF92YWx1ZSxkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSxkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpLAoJZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCkpKTsKCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiICIsMCk7CgkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgoZGVsYXlfcmVnX3ZhbHVlLDE2LDApOwoJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCIgIiwwKTsKCS8vCWRkcl9kbWNfdXBkYXRlX2RlbGF5X3JlZ2lzdGVyX2FmdGVyKCk7Cn0KCmludCBkb19kZHIycGxsX2cxMl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiNkZWZpbmUgRE1DX1dJTkRPV19DTUQgICAyMDE4MDAxMCAgLy9nMTJfZDJwbGwgMTU4NCAwIDAgMCAwIDB4OAoJLy9nMTJfZDJwbGwgMTYwMCA1IDAgMHgxMCAxCgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMHgxMCAwIDEKCS8vZzEyX2QycGxsIDE0MDAgMCAwIDAgMCAwIDAgMCAwIDEgMTIwMCAgMTkwMCAgICB0ZXN0IGRkciBmcmVxdWVuY3kKCS8vZzEyX2QycGxsIDE0MDAgMCAwIDAgMCAwIDAgMCAwIDMgMTIwMCAgMTkwMCAgICB0ZXN0IGRkciBmcmVxdWVuY3kgd2l0aCBFRSB2b2x0YWdlCgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMCAwIDAgMSAgLy9mdWxsIHRlc3QKCS8vZzEyX2QycGxsIDE2MDAgMCAwIDAgMCAwIDAgMCAxICAwIDAgMCA4NzIgLy9mdWxsIHRlc3Qgd2l0aCA4NzJtdiBFRQoJLy9nMTJfZDJwbGwgMTYwMCAwIDAgMCAwIDB4MTAgMCAzICAvL29ubHkgdGVzdCBzcGVjIHN1Yl9pbmRleCBkZWxheSB3aW5kb3cKCS8vZzEyX2QycGxsIDE2MDAgIGNtZF9pbmRleCBjbWRfcGFyYTEgY21kX3BhcmEyLi4uLgoJLy9nMTJfZDJwbGwgMTYwMCAgMHgxICAgIG92ZXJyaWRlX29wdGlvbl9hY19kYXRhX2RlbGF5X3ZyZWYgIG92ZXJyaWRlX2luZGV4ICAgb3Zlcl9yaWRlX3ZhbHVlCgkvL2cxMl9kMnBsbCAxNjAwICAweDIgICAgb3ZlcnJpZGUgcGx1cyBmdWxsdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAgMHgzICAgIG92ZXJyaWRlIHBsdXMuLi5vdGhlciBmdW5jdGlvbgoJLy9nMTJfZDJwbGwgMTYwMCAgMHgxMSAgIHdpbmRvd190ZXN0CgkvL2cxMl9kMnBsbCAxNjAwICAweDIxICAgZnJlcXVlbmN5IHRhYmxlIHRlc3QKCS8vZzEyX2QycGxsIDE2MDAgIDB4MzEgICBzd2VlcF9lZV92b2x0YWdlX2ZyZXF1ZW5jeSB0YWJsZSB0ZXN0CgoKCS8vZzEyX2QycGxsIDE4MDAgIDEgIC8vZG1jIGZ1bGx0ZXN0CgkvL2cxMl9kMnBsbCAxODAwICAyIDEgMSAxIDAzICAyIDIgMTQyICAweDExIDAgOTUwICAgb3ZlcnJpZGUgYWZ0ZXJfdHJhaW5pbmdfZmxhZyAgb3ZlcnJpZGVfaW5kZXggc3ViX2luZGV4IHZhbHVlIG92ZXJyaWRlX2luZGV4MiBzdWJfaW5kZXgyIHZhbHVlMiBvdmVycmlkZV9pbmRleDMgc3ViX2luZGV4MyB2YWx1ZTMKCS8vb3ZlcnJpZGUgMSAyIDMgNCA1IDB4MTEKCS8vZzEyX2QycGxsIDE4MDAgMiAxIDB4MTIgIDB4MSAweDBmNiAgIG92ZXJyaWRlX3NvY192cmVmICAgcGluX2luZGV4ICAodnJlZl9yYW5nZTw8OCl8KHZyZWZfdmFsdWUpCgoJLy9nMTJfZDJwbGwgMTgwMCAgNCAgNC81L2EgICAvL292ZXJyaWRlX3RyYWluaW5nX2hkdGxfY3RsIHZhbHVlCgoJLy9nMTJfZDJwbGwgMTgwMCAgMHgyMSAgIC8vZG1jIHN1c3BlbmQgdGVzdAoJLy9nMTJfZDJwbGwgMTgwMCAgMHgxMSAgMHgxZiAwIDAgMCAxMCAgMHgyMCAvL2RtYyB3aW5kb3cgdGVzdCAgbWFzazEgbWFzazIgbWFzazMgc3ViX2luZGV4IHJlYWRfYml0X2luaXRfdmFsdWUodXNlIGZvciB2ZXJ5IGhpZ2ggc3BlZWQpCgkvL2cxMl9kMnBsbCAxODAwICAweDMyICAxMzAwIDE1MDAgIDc5MCAgODIwICAvL2RtYyBzd2VlcCBmcmVxIGFuZCBlZSB2b2x0YWdlIHRlc3QgIGZyZXF1ZW5jeV9taW4gZnJlcXVlbmN5X21heCBlZV92b2x0YWdlX21pbiAgZWVfdm9sdGFnZV9tYXgKCS8vZzEyX2QycGxsIDE4MDAgIDB4NDEgMiAwIDB4ZmUgIDAgMCAgMSAweDAxICAwICAwIDEgMiAgMHgxMDAwMDAgLy9kbWMgIGV5ZV90ZXN0X2VuYWJsZSBpbml0X3JhbmdlXzAgcmFuZ2UwIF92YWx1ZSAgdnJlZl9zdGFydCB2cmVmX2VuZAoJLy9pbml0X3JhbmdlXzIgIHJhbmdlMl92YWx1ZSB2cmVmX3N0YXJ0MiB2cmVmX2VuZDIgcGluX2luZGV4X21pbiBwaW5faW5kZXhfbWF4ICB0ZXN0X3NpemUKCgojZGVmaW5lIEcxMl9EMlBMTF9DTURfRE1DX0ZVTExfVEVTVCAgIDB4MDEKI2RlZmluZSBHMTJfRDJQTExfQ01EX09WRVJfUklERSAgIDB4MDIKI2RlZmluZSBHMTJfRDJQTExfQ01EX09WRVJfUklERV9QTFVTX0ZVTExURVNUICAweDAzCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9PVkVSX1JJREVfVFJBSU5JTkdfSERUTCAgMHgwNAojZGVmaW5lIEcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1QgIDB4MTEKI2RlZmluZSBHMTJfRDJQTExfQ01EX1dJTkRPV19URVNUX0FORF9TVElDS1lfT1ZFUlJJREUgIDB4MTIKI2RlZmluZSBHMTJfRDJQTExfQ01EX1NVU1BFTkRfVEVTVCAgMHgyMQoJLy8jZGVmaW5lIEcxMl9EMlBMTF9DTURfRlJFUVVFTkNZX1RBQkxFX1RFU1QgIDB4MzEKI2RlZmluZSBHMTJfRDJQTExfQ01EX1NXRUVQX0VFX1ZPTFRBR0VfRlJFUVVFTkNZX1RBQkxFX1RFU1QgIDB4MzIKI2RlZmluZSBHMTJfRDJQTExfQ01EX0REUl9FWUVfVEVTVCAgMHg0MQojZGVmaW5lIEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUX0FORF9TVElDS1lfT1ZFUlJJREUgICAgMHg0MgoKCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRFZGU19URVNUICAweDUxCgoJLy9PVkVSUklERV9PUFRJT04KI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZIDEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UgIDB4MTEKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50IHBsbDsKCXVuc2lnbmVkIGludCAgd2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPTA7CiNpZiAwCgl1bnNpZ25lZCBpbnQgc3RpY2tfdGVzdF9jbWRfaW5kZXg9MDsgIC8vICAxICBvdmVycmlkZV9jbWQgICAyCgl1bnNpZ25lZCBpbnQgc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0wOyAvLyBiaXQgMCBhYyAgMSAgZGF0YSBkcXMgd3JpdGUgICAyIGRhdGEgZHFzIHJlYWQgIDMgZGF0YSBiaXQgd3JpdGUgICA0IGRhdGEgYml0IHJlYWQgIDUvL2RhdGEgd3JpdGUgdnJlZiAgIDYgLy9kYXRhIHJlYWQgdnJlZgoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0wOwoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT0wOwoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZz0wOyAgLy8wICBiZWZvcmUgICwxIGFmdGVyIHRyYWluaW5nCgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfc3BlY19zdWJfaW5kZXg9MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlPTA7CgoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW49MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4PTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZT0wOwojZW5kaWYKCS8vaWYod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWUpCgl7CgkJLy9zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPSgod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWU+PjI0KSYweGYpOy8vYml0IDAgYWMgIGJpdDEgd3JpdGUgZHEgYml0IDIgcmVhZCBkcQoJCS8vc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4PSgod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWU+PjE2KSYweGZmKTsKCQkvL3N0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT0od2luZG93X3Rlc3Rfc3RpY2tfdmFsdWUmMHhmZik7Cgl9CgkvKiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KCWlmIChhcmdjIDwgMikKCQlnb3RvIHVzYWdlOwoKCXBsbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLDApOwoJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXByaW50ZiAoIkVycm9yOiBXcm9uZyBmb3JtYXQgcGFyYW1lbnQhcGxsPTB4JTA4eFxuIixwbGwpOwoJCXJldHVybiAxOwoJfQoJdW5zaWduZWQgaW50IGFyZ2NfY291bnQ9MTsKCXVuc2lnbmVkIGludCAgcGFyYV9tZXRlclszMF09ezAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsfTsKCXdoaWxlIChhcmdjX2NvdW50PGFyZ2MpCgl7cGFyYV9tZXRlclthcmdjX2NvdW50LTFdPSBzaW1wbGVfc3RydG91bChhcmd2W2FyZ2NfY291bnRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2W2FyZ2NfY291bnRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0gPSAwOwoJCX0KCQlhcmdjX2NvdW50Kys7Cgl9CgoJLy9pZihzdGlja190ZXN0X2NtZF9pbmRleD09KQojaWYgMAoJaWYgKGFyZ2MgPjQpCgl7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0wOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGUgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlID0gMDsKCQl9CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4ID0gMDsKCQl9CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gMDsKCQl9Cgl9CgllbHNlCgl7CXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGU9MDsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSAwOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZSA9IDA7Cgl9CgoJaWYgKGFyZ2MgPjUpCgl7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nID0gc2ltcGxlX3N0cnRvdWwoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NikKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NykKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrID0gc2ltcGxlX3N0cnRvdWwoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzayA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjgpCgl7CgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfc3BlY19zdWJfaW5kZXggPSBzaW1wbGVfc3RydG91bChhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjkpCgl7CgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGUgPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMCkKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfZWVfdm9sdGFnZV9lbmFibGUgPSBzaW1wbGVfc3RydG91bChhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjExKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW4gPSBzaW1wbGVfc3RydG91bChhcmd2WzExXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW4gPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMikKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTMpCgl7CgkJc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEzXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZSA9IDA7CgkJfQoJfQoKCiNpZiBkZWZpbmVkKENPTkZJR19NNlRWKSB8fCBkZWZpbmVkKENPTkZJR19NNlRWRCkKCXdyX3JlZyggUFJFR19TVElDS1lfUkVHMCwwIHwgKDB4M2MgPDwgMjQpKTsKI2Vsc2UKCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcwLDAgfCAoMHhmMTMgPDwgMjApKTsKI2VuZGlmCgoJaWYgKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcwLCgoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfc3BlY19zdWJfaW5kZXgmMHhmZik8PDgpfChzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZSYweGZmKSB8ICgweGYxMjw8IDIwKSk7Cgl9CgkvL3dyX3JlZyhQUkVHX1NUSUNLWV9SRUcxLHBsbCB8IChyZF9yZWcoUFJFR19TVElDS1lfUkVHMSkpKTsKCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcxLHBsbCApOwoJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzIsKHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZSYweGZmZmYpIHwoKHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCYweGZmKTw8MTYpCgkJCXwoKHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGUmMHg3KTw8MjkpCgkJCXwoKHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZyYweDEpPDwyOCkpOwoJaWYgKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2spCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzMsKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2spKTsKCX0KCS8vCWlmKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGUpCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzQsKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGU8PDMxKXwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlPDwyOSkpOwoJfQoJaWYgKHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHNSwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbjw8MCl8KHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXg8PDE2KSk7Cgl9CglpZiAoc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZSkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHNiwoc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZTw8MCkpOwoJfQojZW5kaWYKCWFyZ2NfY291bnQ9MjsKCXdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT1wYXJhX21ldGVyW2FyZ2NfY291bnQtMV07CglpZiAoKHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZSA9PSBHMTJfRDJQTExfQ01EX09WRVJfUklERSkgfHwgKHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZSA9PSBHMTJfRDJQTExfQ01EX09WRVJfUklERV9QTFVTX0ZVTExURVNUKSkKCXsKCQlwYXJhX21ldGVyWzNdPShwYXJhX21ldGVyWzNdPDwyNCl8KHBhcmFfbWV0ZXJbNF08PDE2KXwocGFyYV9tZXRlcls1XTw8MCk7CgkJcGFyYV9tZXRlcls0XT0ocGFyYV9tZXRlcls2XTw8MjQpfChwYXJhX21ldGVyWzddPDwxNil8KHBhcmFfbWV0ZXJbOF08PDApOwoJCXBhcmFfbWV0ZXJbNV09KHBhcmFfbWV0ZXJbOV08PDI0KXwocGFyYV9tZXRlclsxMF08PDE2KXwocGFyYV9tZXRlclsxMV08PDApOwoKCX0KCWlmICgod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1QpIHx8ICh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWUgPT0gRzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVF9BTkRfU1RJQ0tZX09WRVJSSURFKSkKCXsKCQkvL3BhcmFfbWV0ZXJbOF0gIHNpemUgICA5ICBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X25vX3VzZV9kcXNfZHFfY29ycmVjdGlvbiAgIDEwIGRpc2FibGVfc2NyYW1ibGVfdXNlX2RlZmluZV9wYXR0ZXJuICAxMSBzdGlja19kbWNfd2luZG93X3Rlc3RfbG9vcF9mbGFnIHdpbmRvdyBsb29wIHRlc3QKCQkvLzEyIGlmIHJlaW5pdCB3aGVuIHRlc3QgZHEgIDEzIHBhc3NfdG9fZmFpbF9mbGFnICAgIDE0ICB0ZXN0X2RtY19vcl9jcHUKCQlwYXJhX21ldGVyWzVdPShwYXJhX21ldGVyWzldPDwyOCl8KHBhcmFfbWV0ZXJbMTBdPDwyNCl8KHBhcmFfbWV0ZXJbMTFdPDwyMCl8KHBhcmFfbWV0ZXJbMTJdPDwyMSl8KHBhcmFfbWV0ZXJbMTNdPDwyMil8KHBhcmFfbWV0ZXJbMTRdPDwyNSl8KHBhcmFfbWV0ZXJbNV08PDApOwoKCX0KCWlmICgod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUKSB8fCAod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlID09IEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUX0FORF9TVElDS1lfT1ZFUlJJREUpKQoJewoKCQlwYXJhX21ldGVyWzNdPShwYXJhX21ldGVyWzNdPDwwKXwocGFyYV9tZXRlcls0XTw8OCl8KHBhcmFfbWV0ZXJbNV08PDE2KXwocGFyYV9tZXRlcls2XTw8MjQpOwoJCXBhcmFfbWV0ZXJbNF09KHBhcmFfbWV0ZXJbN108PDApfChwYXJhX21ldGVyWzhdPDw4KXwocGFyYV9tZXRlcls5XTw8MTYpfChwYXJhX21ldGVyWzEwXTw8MjQpOwoJCXBhcmFfbWV0ZXJbNV09cGFyYV9tZXRlclsxMV07Ly8ocGFyYV9tZXRlclsxMV08PDApfChwYXJhX21ldGVyWzEyXTw8OCl8KHBhcmFfbWV0ZXJbMTNdPDwxNil8KHBhcmFfbWV0ZXJbMTRdPDwyNCk7CgkJcGFyYV9tZXRlcls2XT1wYXJhX21ldGVyWzEyXTsvL3BhcmFfbWV0ZXJbMTVdOwoJCXBhcmFfbWV0ZXJbN109cGFyYV9tZXRlclsxM107Ly9wYXJhX21ldGVyWzE2XTsKCQlwYXJhX21ldGVyWzhdPXBhcmFfbWV0ZXJbMTRdOy8vcGFyYV9tZXRlclsxN107Cgl9Cgl3cl9yZWcoUFJFR19TVElDS1lfUkVHMCwocmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzApJjB4ZmZmZikgfCAoMHhmMTMgPDwgMjApKTsKCWFyZ2NfY291bnQ9MDsKCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcgWzB4JTA4eF0gIFsweCUwOHhdPT1bMHglMDh4XVxuIiwgYXJnY19jb3VudCwoUFJFR19TVElDS1lfUkVHMCsoYXJnY19jb3VudDw8MikpLHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSkpOwoJYXJnY19jb3VudD0xOwoJLy93aGlsZShhcmdjX2NvdW50PGFyZ2MpCgl3aGlsZSAoYXJnY19jb3VudDwxMCkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHMCsoYXJnY19jb3VudDw8MikscGFyYV9tZXRlclthcmdjX2NvdW50LTFdKTsKCQlwcmludGYoIlBfUFJFR19TVElDS1lfUkVHIFsweCUwOHhdICBbMHglMDh4XT09WzB4JTA4eF1cbiIsIGFyZ2NfY291bnQsKFBSRUdfU1RJQ0tZX1JFRzArKGFyZ2NfY291bnQ8PDIpKSxyZF9yZWcoUFJFR19TVElDS1lfUkVHMCsoYXJnY19jb3VudDw8MikpKTsKCQlhcmdjX2NvdW50Kys7Cgl9CgkvKgoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcwIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMCkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcxIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMSkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcyIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMikpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUczIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMykpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc0IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNCkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc1IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNSkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc2IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNikpOwoJCSovCglwcmludGYoInJlc2V0Li4uXG4iKTsKCglkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKClVfQk9PVF9DTUQoCglnMTJfZDJwbGwsCTE4LAkxLAlkb19kZHIycGxsX2cxMl9jbWQsCgkiZzEyX2QycGxsIDEzMDAgIDEgMHgxMCAwIiwKCSJnMTJfZDJwbGwgIGNsayBkZWxheV9pbmRleCBkZWxheV92YWx1ZSBiZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZ1xuIgopOwoKCiNlbmRpZgoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCmludCBkb19kZHJfZzEyX292ZXJyaWRlX2RhdGEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJLy9kZHJfdGVzdF9jbWQgMHgyNSAxIDEgIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwCgoJcHJpbnRmKCJcMTJubSBwaHkgcmVhZCB3cml0ZSByZWdpc3RlciBzaG91bGQgY2xvc2QgYXBkIGFuZCBhc3IgZnVuY2l0b25cbiIpOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzMCk7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjM0KTsKI2RlZmluZSAgRzEyX0RBVEFfUkVBRF9PRkZTRVRfTUFYICAgKDBYM0YpCiNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoKI2lmIDEKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgljaGFyICplbmRwOwoJLy9yYW5rX2luZGV4ICBkcV9pbmRleCAgd3JpdGVfcmVhZCBsZWZ0L3JpZ2h0ICBvZmZzZXRfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2luZGV4PTA7IC8vIDEgYWMgLDB4Miwgd3JpdGUgZHFzICwweDQscmVhZCBkcXMsMHg4LHdyaXRlIGRxLDB4MTAgcmVhZCBkcQoJdW5zaWduZWQgaW50IGRxX2luZGV4PTA7ICAvLzAtOCByYW5rMCBsYW5lMCAscmFuazAgOS0xNyBsYW5lMSxyYW5rMCAxOC0yNiBsYW5lMiwgcmFuazAgMjctMzUgbGFuZTMsICAzNiswLTggcmFuazEgbGFuZTAgLHJhbmsxICAzNis5LTE3IGxhbmUxLHJhbmsxICAzNisxOC0yNiBsYW5lMiwgcmFuazEgIDM2KzI3LTM1IGxhbmUzCgkvLwl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzE9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCS8vCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMj0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy8JdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18zPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4CgkvL3Vuc2lnbmVkIGludCB3cml0ZV9yZWFkX2ZsYWc9MDsvLyAyIHdyaXRlICwxIHJlYWQgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SRUFECTEgICAgICAjZGVmaW5lIAlERFJfUEFSQU1FVEVSX1dSSVRFCQkyCgkvLyAgICB1bnNpZ25lZCBpbnQgbGVmdF9yaWdodF9mbGFnPTA7Ly8gIDEgbGVmdCAsMiByaWdodCAgICNkZWZpbmUgIEREUl9QQVJBTUVURVJfTEVGVAkJMSAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SSUdIVAkJMgoJdW5zaWduZWQgaW50IG92cnJpZGVfdmFsdWU9MDsvLwoKCS8vICAgdW5zaWduZWQgaW50IG9mZnNldF9lbmFibGU9MDsvLwoKCS8vCSB1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZT0wOy8vCgl1bnNpZ25lZCBpbnQgY291bnQ9MDsKCS8vCXVuc2lnbmVkIGludCBjb3VudDE9MDsKCS8vCXVuc2lnbmVkIGludCBjb3VudF9tYXg9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCS8vCXVuc2lnbmVkIGludCByZWdfYWRkPTA7CgkvLwl1bnNpZ25lZCBpbnQgcmVnX3ZhbHVlPTA7CgoJaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CgllbHNlIGlmICAoYXJnYyA+NCkKCXsvL29mZnNldF9lbmFibGU9MTsKCgkJewoJCQljb3VudD0wOwoJCQl0ZXN0X2luZGV4PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9pbmRleCA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJZHFfaW5kZXg9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlkcV9pbmRleCA9IDA7CgkJCX0KCgkJfQoKCgoJCXsKCQkJY291bnQrKzsKCQkJb3ZycmlkZV92YWx1ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCW92cnJpZGVfdmFsdWUgPSAwOwoJCQl9CgoJCX0KCgoJfQoJZWxzZSB7CgkJcmV0dXJuIDE7Cgl9CglwcmludGYoImxjZGxyX21heCAlZCxcbiIsbGNkbHJfbWF4KTsKCgl7CgoKCQl7CgoJCQl7CgkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGUodGVzdF9pbmRleCwKCQkJCQkJZHFfaW5kZXgsCgkJCQkJCW92cnJpZGVfdmFsdWUpOwoJCQl9CgoJCX0KCX0KCgojZW5kaWYKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfZzEyX292ZXJyaWRlX2RhdGEsCTIwLAkxLAlkb19kZHJfZzEyX292ZXJyaWRlX2RhdGEsCgkiZGRyX2cxMl9vdmVycmlkZV9kYXRhICAxIDAgIDAgMCAgMSAzIiwKCSJkZHJfZzEyX292ZXJyaWRlX2RhdGEgIHRlc3RfaW5kZXggIGRxX2luZGV4IG92cnJpZGVfdmFsdWUgICBcbiIKKTsKaW50IGRvX2Rkcl9nMTJfb2Zmc2V0X2RhdGEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJLy9kZHJfdGVzdF9jbWQgMHgyNSAxIDEgIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwCgoKI2RlZmluZSAgRzEyX0RBVEFfUkVBRF9PRkZTRVRfTUFYICAgKDBYM0YpCiNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoJcHJpbnRmKCJcMTJubSBwaHkgcmVhZCB3cml0ZSByZWdpc3RlciBzaG91bGQgY2xvc2QgYXBkIGFuZCBhc3IgZnVuY2l0b25cbiIpOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzMCk7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjM0KTsKI2lmIDEKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgljaGFyICplbmRwOwoJLy9yYW5rX2luZGV4ICBkcV9pbmRleCAgd3JpdGVfcmVhZCBsZWZ0L3JpZ2h0ICBvZmZzZXRfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2luZGV4PTA7IC8vIDEgYWMgLDB4Miwgd3JpdGUgZHFzICwweDQscmVhZCBkcXMsMHg4LHdyaXRlIGRxLDB4MTAgcmVhZCBkcQoJLy8gIHVuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4Cgl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvZmZzZXRfdmFsdWU9MDsvLwoKCS8vICAgdW5zaWduZWQgaW50IG9mZnNldF9lbmFibGU9MDsvLwoKCS8vCSB1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZT0wOy8vCgl1bnNpZ25lZCBpbnQgY291bnQ9MDsKCS8vdW5zaWduZWQgaW50IGNvdW50MT0wOwoJdW5zaWduZWQgaW50IGNvdW50X21heD0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCXVuc2lnbmVkIGludCByZWdfdmFsdWU9MDsKCgoJYmRscl8xMDBzdGVwPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJfQoJZWxzZSBpZiAgKGFyZ2MgPjYpCgl7Ly9vZmZzZXRfZW5hYmxlPTE7CgoJCXsKCQkJY291bnQ9MDsKCQkJdGVzdF9pbmRleD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfaW5kZXggPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18xPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzEgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18yPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzIgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18zPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzMgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCWxlZnRfcmlnaHRfZmxhZz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWxlZnRfcmlnaHRfZmxhZyA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJb2Zmc2V0X3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJb2Zmc2V0X3ZhbHVlID0gMDsKCQkJfQoKCQl9CgoKCX0KCWVsc2UgewoJCXJldHVybiAxOwoJfQoJcHJpbnRmKCJsY2Rscl9tYXggJWQsXG4iLGxjZGxyX21heCk7CglpZiAobGVmdF9yaWdodF9mbGFnID09IEREUl9QQVJBTUVURVJfUklHSFQpCgkJcHJpbnRmKCJvZmZzZXQgcmlnaHQgKysgIGxlZnRfcmlnaHRfZmxhZyAlZCxcbiIsbGVmdF9yaWdodF9mbGFnKTsKCWlmIChsZWZ0X3JpZ2h0X2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9MRUZUKQoJCXByaW50Zigib2Zmc2V0IGxlZnQgLS1sZWZ0X3JpZ2h0X2ZsYWcgJWQsXG4iLGxlZnRfcmlnaHRfZmxhZyk7CgoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCWNvdW50X21heD0xMDsKCgkJbGNkbHJfbWF4PTMqMzI7Ly8weDNmZjsKCX0KCglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQljb3VudF9tYXg9MTY7CgoJCWxjZGxyX21heD0xNiozMjsvLzB4M2ZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJY291bnRfbWF4PTE2OwoJCWxjZGxyX21heD05NjsvLzB4M2Y7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCWNvdW50X21heD0zNioyOwoJCWxjZGxyX21heD04KjMyOy8vMHgxZmY7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCWNvdW50X21heD0zNioyOwoJCWxjZGxyX21heD0weDNmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJY291bnRfbWF4PTM2KjE7CgkJbGNkbHJfbWF4PTB4M2Y7CgkJcHJpbnRmKCIgc29jIHZyZWYgcmFuazAgYW5kIHJhbmsxIHNoYXJlIHZyZWYgZGFjXG4iKTsKCX0KCgoKCWNvdW50PTA7Cglmb3IgKDtjb3VudDxjb3VudF9tYXg7Y291bnQrKykgewoJCWlmICgoY291bnQ8MzIpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMSYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgoY291bnQ+MzEpICYmIChjb3VudDw2MykpIHsKCQkJaWYgKHRlc3RfZHFfbWFza18yJigxPDwoY291bnQlMzIpKSkgewoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJaWYgKChjb3VudD42MykpIHsKCQkJaWYgKHRlc3RfZHFfbWFza18zJigxPDwoY291bnQlMzIpKSkgewoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJCS8vCWZvciAoY291bnQxPTA7Y291bnQxPG9mZnNldF92YWx1ZTtjb3VudDErKykKCQl7CgkJCWlmIChsZWZ0X3JpZ2h0X2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SSUdIVCkKCQkJewoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXModGVzdF9pbmRleCwKCQkJCQkJY291bnQsCgkJCQkJCTAsb2Zmc2V0X3ZhbHVlKTsKCQkJfQoJCQlpZiAobGVmdF9yaWdodF9mbGFnID09IEREUl9QQVJBTUVURVJfTEVGVCkKCQkJewoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXModGVzdF9pbmRleCwKCQkJCQkJY291bnQsCgkJCQkJCTEsb2Zmc2V0X3ZhbHVlKTsKCQkJfQoJCX0KCX0KCgojZW5kaWYKCXJldHVybiAxOwp9CgoKVV9CT09UX0NNRCgKCWRkcl9nMTJfb2Zmc2V0X2RhdGEsCTIwLAkxLAlkb19kZHJfZzEyX29mZnNldF9kYXRhLAoJImRkcl9nMTJfb2Zmc2V0X2RhdGEgIDEgMCAgMCAwICAxIDMiLAoJImRkcl9nMTJfb2Zmc2V0X2RhdGEgIHRlc3RfaW5kZXggIG1hc2sxIG1hc2syIG1hc2szICBsZWZ0L3JpZ2h0ICBvZmZzZXRfdmFsdWUgXG4iCik7CgojZW5kaWYKCgpjaGFyIENNRF9WRVJbXSA9ICJWZXJfMTAiOwppbnQgZG9fZGRyX3Rlc3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy9kZHJfdGVzdF93YXRjaGRvZ19pbml0KDQwMDApOwoJLy9wcmludGYoIlxub3BlbiB3YXRjaGRvZyAlZG1zXG4iLDQwMDApOwoJcHJpbnRmKCJcbiBkZHIgdGVzdCBjbWQgdmVyc2lvbj09ICVzXG4iLCBDTURfVkVSKTsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCgkvKiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KCWlmIChhcmdjIDwgMikKCQlnb3RvIHVzYWdlOwoJaWYgKChzdHJjbXAoYXJndlsxXSwgImgiKSA9PSAwKSkKCQlnb3RvIHVzYWdlOwoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCXByaW50ZigiXDEybm0gcGh5IHJlYWQgd3JpdGUgcmVnaXN0ZXIgc2hvdWxkIGNsb3NkIGFwZCBhbmQgYXNyIGZ1bmNpdG9uXG4iKTsKCXdyaXRlbCgoMCksIDB4ZmY2Mzg2MzApOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzNCk7CiNlbHNlCglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgoJdW5zaWduZWQgaW50IGRkcl9wbGwgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMMCk7Cgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9MDsKCS8vI2lmKCBDT05GSUdfRERSX1BIWSAgID49UF9ERFJfUEhZX0cxMikKCS8vZGRyX2Nsaz1wbGxfY29udmVydF90b19kZHJfY2xrX2cxMmEoZGRyX3BsbCk7CgkvLyNlbHNlCglkZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CgkvLyNlbmRpZgoJLy8vMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKCXByaW50ZigiXG5kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJZ2xvYmFsX2Rkcl9jbGs9ZGRyX2NsazsKCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CglwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CgojZW5kaWYKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCXVuc2lnbmVkIGludCBkZHJfcGxsID0gcmRfcmVnKEcxMl9BTV9ERFJfUExMX0NOVEwwKTsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0wOwoJLy8jaWYoIENPTkZJR19ERFJfUEhZICAgPj1QX0REUl9QSFlfRzEyKQoJLy9kZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYShkZHJfcGxsKTsKCS8vI2Vsc2UKCWRkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCS8vI2VuZGlmCgkvLy8yKigoKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKSk7CgoJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CglnbG9iYWxfZGRyX2Nsaz1kZHJfY2xrOwoJLy8JdW5zaWduZWQgaW50IHpxMHByID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCS8vCXByaW50ZigiXG5kZHJfenEwcHI9PSAweCUwOHhcbiIsIHpxMHByKTsKI2VuZGlmCgojZGVmaW5lICBERFJfVEVTVF9DTURfX05PTkUgICAwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1QgICAgICAgICAxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUiAgICAgICAgMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX01BWF9DTEsgICAgIDMgICAvL2Rkcl90ZXN0X2NtZCAzIDB4ODAwMDAwMCAzIDEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9aUSAgICAgNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX1ZSRUYgICAgNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9HWFRWQkJfQ1JPU1NUQUxLICAgIDYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfQkFORFdJRFRIX1RFU1QgICA3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0xDRExSX0VOVl9UVU5FICAgOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9NT0RJRllfUkVHX1VTRV9NQVNLICAgOQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9ERFJfVFVORV9BQ19DTEsgICAweGEKCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVFpRICAgMHgxMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0RRUyAgMHgxMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVEVTVF9TVEFSVF9BREQgIDB4MTIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19CSVRfU0VUVVBfSE9MRF9NQVJHSU4gIDB4MTMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EQVRBX0JJVF9TRVRVUF9IT0xEX01BUkdJTiAgMHgxNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0xBTkVfQklUX01BUkdJTiAgMHgxNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1ZPTFRBR0VfTURMUl9TVEVQICAweDE2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRDJQTExfQ01EICAweDE3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9MQU5FX0JJVF9NQVJHSU4gIDB4MTgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfUEhZX1ZSRUYgICAweDE5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0RSQU1fVlJFRiAgIDB4MUEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfQUNfVlJFRiAgIDB4MWIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1NXRUVQX0RSQU1fQ0xLX1VTRV9EMlBMTCAgIDB4MWMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfU0hJRlRfRERSX0ZSRVFVRU5DWSAgMHgxZAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQgIDB4MWUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9QV01fQ01EICAgICAgICAgICAgICAweDFmCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfU0kgICAgICAgICAgICAgMHgyMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX1ZERFFfU0kgICAgICAgICAgICAgMHgyMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0REUl9EQVRBX1dJTkRPV19FTlYgICAgICAgICAgICAweDIyCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9URVNUX1NISUZUX0REUl9GUkVRVUVOQ1lfVFhMICAweDIzCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRElTUExBWV9ERFJfSU5GT1JNQVRJT04gIDB4MjQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19PRkZTRVRfTENETFIgIDB4MjUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19TRVRfV0FUQ0hfRE9HX1ZBTFVFICAweDI2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfRERSX0RBVEFfV0lORE9XX1NUSUNLWSAgMHgyNwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMX1NUSUNLWSAgMHgyOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfRERSX0JJU1RfVEVTVF9VU0VfRDJQTExfU1RJQ0tZICAweDI5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9CSVNUX1RFU1RfU0laRV9TVElDS1lfNiAgMHgzMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfU1RPUkVfV0lORE9XICAweDMxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9TVE9SRV9RVUlDS19XSU5ET1cgIDB4MzIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1cgIDB4MzMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1dfTVVMVEkgIDB4MzQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9XSU5ET1dfU0FNRV9DSEFOR0UgIDB4MzUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0cxMl9SRUNPTkZJR19DTUQgIDB4MzYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ESVNQTEFZX0cxMl9ERFJfSU5GT1JNQVRJT04gIDB4MzcKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfRzEyX0RNQ19URVNUICAweDM4CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0cxMl9FRV9CRExSX1RFU1QgIDB4MzkKCgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJdW5zaWduZWQgaW50ICBhcmdbMzBdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9OwoJY2hhciAqZW5kcDsKCWRkcl90ZXN0X2NtZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJZm9yIChpID0gMjtpPGFyZ2M7aSsrKQoJCWFyZ1tpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDApOwoJcHJpbnRmKCJcbmRkcl90ZXN0X2NtZD09IDB4JTA4eFxuIiwgZGRyX3Rlc3RfY21kKTsKCglmb3IgKGkgPSAwO2k8KGFyZ2MtMik7aSsrKQoJCXByaW50ZigiXG5hcmdbJTA4eF09JTA4eFxuIixpLGFyZ1tpXSk7CgkvL2ludCBhcmdjMl9sZW5ndGg7CgkvL2FyZ2MyX2xlbmd0aD0oYXJnYy0yKTsKCS8vY21kX3RibF90ICpjbWR0cDI7CgkvL2ludCBmbGFnMjsKCWludCBhcmdjMjsKCWNoYXIqIGFyZ3YyWzMwXTsKCglhcmdjMj1hcmdjLTE7Cglmb3IgKGkgPSAxO2k8KGFyZ2MpO2krKykKCQlhcmd2MltpLTFdPWFyZ3ZbaV07CgkvL2FyZ3YyPShjaGFyICAgICopYXJndisrOwoJewoJCXJ1bl9jb21tYW5kKCJkY2FjaGUgb2ZmIiwwKTsKCQlydW5fY29tbWFuZCgiZGNhY2hlIG9uIiwwKTsKCQlwcmludGYoIlxuIGNhY2hlIG9mZiBvbiIpOwoJCXN3aXRjaCAoZGRyX3Rlc3RfY21kKQoJCXtjYXNlKEREUl9URVNUX0NNRF9fTk9ORSk6CgkJCXsKCQkJCXByaW50ZigiXG4gIDB4MCBoZWxwXG4iKTsKCQkJCXByaW50ZigiXG4gIDB4MSBkZHJ0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxIHN0YXJ0X2FkZCB0ZXN0X3NpemUgbG9vcHMgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyIHRlc3QgYWNsY2RsciAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgICBkZHJfdGVzdF9jbWQgMHgyIGEgMCAweDgwMDAwMDAgIDEiKTsKCQkJCXByaW50ZigiXG4gIDB4MyB0ZXN0IG1heF9wbGxjbGsgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgzICB0ZXN0X3NpemUgbG9vcHMgYWRkX2ZyZXEgc3ViX2ZyZXEgIik7CgkJCQlwcmludGYoIlxuICAweDQgdGVzdCB6cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDQgIHRlc3Rfc2l6ZSBsb29wcyBhZGRfZnJlcSBzdWJfZnJlcSBkcnZfb2R0X2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDUgdGVzdCB2cmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDUgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4NiB0ZXN0IGd4dHZiYl9jcm9zc3RhbGsgICAgICAgICBkZHJfdGVzdF9jbWQgMHg2ICBsb29wcyBwYXR0ZXJuX2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDcgdGVzdCBiYW5kd2lkdGggICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NyBzaXplIGxvb3BzIHBvcnQgc3ViX2lkIHRpbWVyX21zICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg4IHRlc3QgbGNkbHJfdXNlX2Vudl91YXJ0ICAgICAgZGRyX3Rlc3RfY21kIDB4OCBpbnB1dF9zcmMgd3JfYWRqX3BlcltdIHJkX2Fkal9wZXJbXVtdICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg5IHRlc3RfcmVnX3VzZV9tYXNrICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4OSByZWdfYWRkIHZhbHVlIG1hc2sgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhhIHRlc3QgYWNfY2xrICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4YSBzdGFydF9hZGQgdGVzdF9zaXplIGxvb3BzICAgZGRyX3Rlc3RfY21kIDB4YSBhIDAgMHg4MDAwMDAwICAxICAiKTsKCQkJCXByaW50ZigiXG4gIDB4YiAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhjIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweGQgLi4uICAiKTsKCQkJCXByaW50ZigiXG4gIDB4ZSAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhmIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweDEwIHRlc3Qgc2V0IHpxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTAgenEwcHIwIHpxMXByMCB6cTJwcjAgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTEgdGVzdCB0dW5lIGRxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTEgYSAwIHRlc3Rfc2l6ZSAgIGRkcl90ZXN0X2NtZCAweDExIGEgMCAweDgwMDAwIik7CgkJCQlwcmludGYoIlxuICAweDEyIHRlc3Qgc2V0IHN0YXJ0X2FkZCAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTIgc3RhcnRfYWRkICAgIik7CgkJCQlwcmludGYoIlxuICAweDEzIHRlc3QgYWNfYml0X3NldHVwX2hvbGQgdGltZSAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTMgYSAwIHNpemUgbWV0aG9kICBwaW5faWQgICBkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDAgIDB4YyIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNCB0ZXN0IGRhdGFfYml0X3NldHVwX2hvbGQgdGltZSAgICAgIGRkcl90ZXN0X2NtZCAweDE0IGEgMCBzaXplIHNldHVwL2hvbGQgcGluX2lkICAgZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNSB0ZXN0IGFjX2xhbmVfc2V0dXBfaG9sZCAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNSBhIDAgc2l6ZSAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNiB0ZXN0IGVlIG1kbHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNiAgdm9sdGFnZSBwd21faWQgbG9vcHMgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTcgZDJwbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTcgY2xrIHpxX2FjIHpxX3NvY19kcmFtIHNvY192cmVmIGRyYW1fdnJlZiBkZWNfaGV4IHpxX3ZyZWYgMFxuIFwKCQkJCQkJZXhhbXBsZSBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCA1MCA4MSAxIDUwIFxuIFwKCQkJCQkJb3IgIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDB4MDkgMHgyMCAwIDUwIFxuIik7CgkJCQlwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDYwMzQgNjAzNDYwMzQgMCAwIDAgMCAxIFxuIik7CgkJCQlwcmludGYoIlxuICAweDE4IHRlc3QgZGF0YV9sYW5lX3NldHVwX2hvbGQgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTggYSAwIHNpemUgcmFuZ2Ugc3RhcnRfcGluX2lkIGVuZF9waW5faWQgIGRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDEgMCA5NiAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTkgdGVzdCBwaHkgdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHNlZWRfaGV4X2RlYyAgXAoJCQkJCQlkZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHgxMDAwMDAwICAxICA2MyAgMSAxICAweDggMCAxICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYSB0ZXN0IGRyYW0gdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFBIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgdGVzdF9kb3duX3VwX3N0ZXAgdnJlZl9yYW5nZSBzZWVkX2hleF9kZWMgXAoJCQkJCQlcbiBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiBkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHgwODAwMDAwICAwICAweDE0IDEgIDAgIDB4OCAwIDAgMCA7IHNldGVudiAgc3RvcmVib290ICBydW4gZGRyX3Rlc3RfZGRyNHJhbV92cmVmIDtzYXZlO3Jlc2V0ICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYiB0ZXN0IGFjIHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCBzZWVkX2hleF9kZWMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWMgc3dlZXAgZHJhbSBjbGsgdXNlIGQycGxsX2VudiAgICAgZGRyX3Rlc3RfY21kIDB4MWMgIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMgIGRkcl90ZXN0X2NtZCAweDFjIDB4ODAwMDAwMCA4MDAgMTUwMCAxIik7CgkJCQlwcmludGYoIlxuICAweDFkIHRlc3Qgc2hpZnQgY2xrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFkIHR5cGUgZGVsYXlfbXMgdGltZXMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWUgdGVzdCB3cml0ZV9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZSB3cml0ZV9yZWFkIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGQgdGVzdF9zaXplIik7CgkJCQlwcmludGYoIlxuICAweDFmIHRlc3QgcHdtX2NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFmIHB3bWlkICAgcHdtX2xvdyBwd21faGlnaCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyMiB0ZXN0IGRkcl93aW5kb3cgdXNlIGVudiAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIHRlc3Rfc2l6ZSB3YXRjaGRvZ190aW1lIFwKCQkJCQkJbGFuZV9kaXNhYmxlX21hc3JrIGFkZF90ZXN0X3NpemUgIHNldGVudiBib290Y21kICBkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMDAgMTUgMCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gZGVmZW52O3NhdmU7c2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAwIDE4IDB4MCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gc2V0ZW52IGVudl9kZHJ0ZXN0X2RhdGFfbGFuZSAgMHgyMjtzYXZlO3Jlc2V0Iik7CgkJCQlwcmludGYoIlxuICAweDIzIHRlc3Qgc2hpZnQgZGRyIGZyZXF1ZW5jeSAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgyMyIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNCBkaXNwbGF5IGRkcl9pbmZvcm1hdGlvbiAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgyNCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNSBvZmZzZXQgZGRyX2xjZGxyICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDI1Iik7CgkJCQlwcmludGYoIlxuICAweDI2IHNldCB3YXRjaGRvZ192YWx1ZSAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjYgMzAiKTsKCQkJCXByaW50ZigiXG4gIDB4MjcgdGVzdCBkZHJfd2luZG93IHVzZSBzdGlja3kgcmVnaXN0ZXIgICAgICAgIGRkcl90ZXN0X2NtZCAweDI3IGEgMCB0ZXN0X3NpemUgd2F0Y2hkb2dfdGltZSBcCgkJCQkJCWxhbmVfZGlzYWJsZV9tYXNyayBhZGRfdGVzdF9zaXplICBzZXRlbnYgYm9vdGNtZCAgZGRyX3Rlc3RfY21kIDB4MjcgYSAwIDB4ODAwMDAwIDE1IDAgMHg4MDAwMDAwIik7CgkJCQlwcmludGYoIlxuICAweDI4ICBzd2VlcCBkcmFtIGNsayB1c2UgZDJwbGxfc3RpY2t5ICAgICBkZHJfdGVzdF9jbWQgMHgyOCAgdGVzdF9zaXplIHN0YXJ0X2ZyZXEgZW5kX2ZyZXEgdGVzdF9sb29wcyAgZGRyX3Rlc3RfY21kIDB4MjggMHg4MDAwMDAwIDgwMCAxNTAwIDEiKTsKCgkJCQkvKgoJCQkJICAgZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAgMHg4MDAwMDAgMSAyCWxhbmUwLTcJbWluCgkJCQkgICBkZHJfdHVuZV9kcXNfc3RlcCAgYSAwICAweDgwMDAwMCAxIDEJbGFuZTAtNwltYXgKCgkJCQkgICBkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweDgwMDAwMDAgMSAyCWxhbmUwLTEJbWluCgkJCQkgICBkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweDgwMDAwMDAgMSAxCWxhbmUwLTEJbWF4CgoJCQkJICAgc2V0ZW52IGJvb3RjbWQgICJkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMDAgMTggMCAweDgwMDAwMDAiCQkgd2F0Y2hkb2dfdGltZSCjrGxhbmVfZGlzYWJsZV9tYXNrLGFkZF90ZXN0X3NpemUKCQkJCSAgIHNldGVudiBlbnZfZGRydGVzdF9kYXRhX2xhbmUgIDB4MjIJyejWw8P8we6/qsq8serWvgoJCQkJICAgc2F2ZQkgd2F0Y2hkb2dfdGltZSCjrGxhbmVfZGlzYWJsZV9tYXNrLGFkZF90ZXN0X3NpemUKCQkJCSAgIGQycGxsIDEyMDAKCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfdGVzdF9kZHJfY2xrICIweDAwMDAwMDAiOwoJCQkJICAgc2V0ZW52IGRkcl9zb2NfaW92cmVmX2xlZiAiMHgwMDAwMDAwIjsKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl9vcmcgIjB4MCI7CgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfcmlnICAiMHgwMDAwMDAgIjsKCQkJCSAgIHNhdmUKCQkJCSAgIGQycGxsIDExMDQKCQkJCSAgIGRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDgwMDAwICAxICA3MCAgMSAxICAweDggMCAxCgoKCgkJCQkgICDW2LLi0qq19LXno6zK/b7dtObU2nN0aWNrILzEtObG98HLCgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayAiMHgwMDAwMDAwIjsKCQkJCSAgIHNldGVudiBkZHJfZHJhbV9pb3ZyZWZfbGVmICIweDAwMDAwMDAiOwoJCQkJICAgc2V0ZW52IGRkcl9kcmFtX2lvdnJlZl9vcmcgIjB4MCI7CgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3JpZyAgIjB4MDAwMDAwICI7CgkJCQkgICBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiAiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwICAwICA3MCAwICAwICAweDA4IDAgMCAxIgoJCQkJICAgc2V0ZW52IGJvb3RjbWQgICAicnVuIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiIKCQkJCSAgIHNhdmUKCQkJCSAgILX0tefJz7XnCgkJCQkgICBkMnBsbCAxMTA0CgkJCQkgICAqLwoKCgkJCX0KCQkJcmV0dXJuIDE7CgoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcnRlc3QgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDEgc3Rhcl9hZGQgdGVzdF9zaXplIGxvb3BzCgkJCQkvLyBkb19kZHJfdGVzdChjbWR0cCwgIGZsYWcsIGFyZ2MyLGFyZ3YpOwoJCQkJZG9fZGRyX3Rlc3QoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsKGFyZ3YyKSk7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUik6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9ERFJfVFVORV9BQ19DTEspOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9aUSk6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9HWFRWQkJfQ1JPU1NUQUxLKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0JBTkRXSURUSF9URVNUKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0xDRExSX0VOVl9UVU5FKToKCQkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX01PRElGWV9SRUdfVVNFX01BU0spOgoJCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUWlEpOgoJCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfRERSX0RBVEFfV0lORE9XX1NUSUNLWSk6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWUgIHdyaXRlX3JlYWQgIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGRyIHRlc3Rfc2l6ZSBkZWxheV91cyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDFlIDEgMiAxMCAweDQwMDAwMDAwIDB4MTAwMDAwMDAKCQkJCS8vdGltZXMgPTB4ZmZmZmZmZmYgd2lsbCBhdXRvIGxvb3AKCQkJCXByaW50ZigiXG50ZXN0IGRkciB3cml0ZSByZWFkICBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3dyaXRlX3JlYWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQkvL0REUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9HMTJfUkVDT05GSUdfQ01ECgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0cxMl9SRUNPTkZJR19DTUQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzYKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X3JlY29uZmlnIGNtZFxuIik7CgoJCQkJZG9fZGRyX3Vib290X25ld19jbWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0RJU1BMQVlfRzEyX0REUl9JTkZPUk1BVElPTik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzNwoJCQkJcHJpbnRmKCJcbnNob3cgZzEyIGRkciBpbmZvcm1hdGlvblxuIik7CgoJCQkJZG9fZGRyX2Rpc3BsYXlfZzEyX2Rkcl9pbmZvcm1hdGlvbigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0cxMl9ETUNfVEVTVCk6CgkJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9HMTJfRUVfQkRMUl9URVNUKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDM5CgkJCQlwcmludGYoIlxuVWJvb3QgQkRMUiB0ZXN0IFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfcHdtX2JkbHIoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gMTsvL3Rlc3Rfc3RhcnRfYWRkcgoJfQoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9ClVfQk9PVF9DTUQoCglkZHJfdGVzdF9jbWQsCTMwLAkxLAlkb19kZHJfdGVzdF9jbWQsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoKaW50IGRvX2Rkcl9hdXRvX3Rlc3Rfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJZ2xvYmFsX2Jvb3RfdGltZXM9cmRfcmVnKFBSRUdfU1RJQ0tZX0cxMkFfUkVHMCk7CglwcmludGYoIlxuZ2xvYmFsX2Jvb3RfdGltZXM9PSAlZFxuIiwgZ2xvYmFsX2Jvb3RfdGltZXMpOwoKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgljaGFyIHN0clsxMDI0XT0iIjsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfY21kPTA7Cgl1bnNpZ25lZCBpbnQgIHRlbXBfcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICBudW1fYXJyeVszMl09ezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CgoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCgl0ZW1wX3JlZ19hZGQ9KChETUNfU1RJQ0tZX0cxMkFfMCkpOwoJLy9udW1fYXJyeSA9ICh1aW50MTZfdCAqKSh1aW50NjRfdCApKHN0aWNreV9yZWdfYmFzZV9hZGQpOwoJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKCQkJbnVtX2FycnlbaV09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDgsaSk7CgkJCWlmICgoaSA9PSAwKSB8fCAoaSA9PSAxNikpIHsKCQkJCXByaW50ZigiXG4gbnVtYXJyeVslZF0iICxpKTsKCQkJfQoJCXByaW50ZigiICVkICIsbnVtX2FycnlbaV0pOwoJfQoKCWRkcl90ZXN0X2NtZD1udW1fYXJyeVswXTsKCgl1bnNpZ25lZCBpbnQgICBjczBfdGVzdF9zdGFydD0gMHgxMDgwMDAwOwoJdW5zaWduZWQgaW50ICAgY3MwX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50ICAgY3MxX3Rlc3Rfc3RhcnQ9IDA7Cgl1bnNpZ25lZCBpbnQgICBjczFfdGVzdF9zaXplPSAwOwoJdW5zaWduZWQgaW50ICAgd2F0Y2hkb2dfdGltZV9zPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2luZGV4X2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IGFsbF90b2dodGVyX2VuYWJsZT0wOwoJLy91bnNpZ25lZCBpbnQgICBuaWJibGVfbWFza1szXT17MCwwLDB9OwoJY3MwX3Rlc3Rfc3RhcnQ9KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVgrMV0pPDw4KXwKCQkoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKzJdKTw8MTYpfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVgrM10pPDwyNCkpOwoJY3MwX3Rlc3Rfc2l6ZT0oKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVgrMV0pPDw4KXwKCQkoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVgrMl0pPDwxNil8KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKzNdKTw8MjQpKTsKCWNzMV90ZXN0X3N0YXJ0PSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYKzNdKTw8MjQpKTsKCWNzMV90ZXN0X3NpemU9KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TSVpFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TSVpFX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TSVpFX0lOREVYKzJdKTw8MTYpfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCszXSk8PDI0KSk7Cgl3YXRjaGRvZ190aW1lX3M9KChudW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCsxXSk8PDgpKTsKCXRlc3RfaW5kZXhfZW5hYmxlPSgobnVtX2FycnlbVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYKzFdKTw8OCkpOwoJYWxsX3RvZ2h0ZXJfZW5hYmxlPShudW1fYXJyeVtURVNUX0FSR18zX0FMTF9UT0dIVEVSXSk7Cglzd2l0Y2ggKGRkcl90ZXN0X2NtZCkKCXsKCQljYXNlKERNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzEpOgoJCWlmIChudW1fYXJyeVsxXSA9PSBETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xKQoJCXsKCQkJLy9hcmdjMj0xMDsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDI3IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IFwKCQkJMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggIDB4JTA4eCIsY3MwX3Rlc3Rfc3RhcnQsY3MwX3Rlc3Rfc2l6ZSxjczFfdGVzdF9zdGFydCxjczFfdGVzdF9zaXplLAoJCQl3YXRjaGRvZ190aW1lX3MsdGVzdF9pbmRleF9lbmFibGUsMCwwLDAsMCwwLDAsYWxsX3RvZ2h0ZXJfZW5hYmxlCSk7CgkJCS8vCWZvciAoaSA9IDE7aTwoYXJnYzIpO2krKykKCQkJLy8JewoJCQkvLwlhcmd2MltpXT0oYXJnW2ldKTsKCQkJLy8Jc3ByaW50ZihzdHIsIiAweCUwOHggIiwoYXJnW2ldKSk7CgkJCS8vCX0KCgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJLy8gZGRyX3Rlc3RfY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLChhcmd2MikpOwoJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9hdXRvX3Rlc3Rfd2luZG93LAkzMCwJMSwJZG9fZGRyX2F1dG9fdGVzdF93aW5kb3csCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoKaW50IGRvX2Rkcl9hdXRvX3NjYW5fZHJ2KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8gZGRyX3R5cGUgMiBscGRkcjQgICByYW5rX2NvbmZpZwoJI2RlZmluZSAgQVVUT19TQ0FOX0REUjMgIDAKCSNkZWZpbmUgIEFVVE9fU0NBTl9ERFI0ICAxCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFIzICAyCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFI0ICAzCgoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMCAgMAoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMDEgIDEKCgljaGFyICpzdHJpbmdfcHJpbnRfZmxhZz0gICAiIHdpbmRvdy1sb29wIFxuIjsKCWdsb2JhbF9ib290X3RpbWVzPXJkX3JlZyhQUkVHX1NUSUNLWV9HMTJBX1JFRzApOwoKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgl1bnNpZ25lZCBpbnQgIGRkcl90eXBlPTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9jaGFubmVsX3JhbmtfY29uZmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGxvb3A9MDsKCWNoYXIgKmVuZHA7CglpZiAoYXJnYz4xKQoJewoJCWRkcl90eXBlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJZGRyX3R5cGU9MDsKCX0KCWlmIChhcmdjPjIpCgl7CgkJZGRyX2NoYW5uZWxfcmFua19jb25maWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZz0wOwoJfQogICAgaWYgKGFyZ2M+MykKCXsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcD0wOwoJfQoJdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCXsKCQl0ZW1wX3JlZ19hZGQ9KChETUNfU1RJQ0tZX0cxMkFfMCkpOwoJfQoKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy8gdW5zaWduZWQgaW50ICBkZHJfdGVzdF9jbWQ9MDsKCS8vIHVuc2lnbmVkIGludCAgdGVtcF9yZWdfYWRkPTA7CgkvLyB1bnNpZ25lZCBpbnQgIG51bV9hcnJ5WzMyXT17MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKCgl1bnNpZ25lZCBpbnQgY291bnRlcl9sb29wPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX2ZyZXF1ZW5jeT0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fcD0wOy8vNzQgIC8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIHVwIGRyaXZlciBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fbj0wOy8vNzYKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX3A9MDsvLzc4ICAvL2NvbmZpZyBzb2MgZGF0YSBwaW4gb2R0IHB1bGwgdXAgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX249MDsvLzgwCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG09MDsvLzgyICAvL2NvbmZpZyBkcmFtIGRhdGEgcGluIHB1bGwgdXAgcHVsbCBkb3duIGRyaXZlciBzdGVuZ3RoLGRkcjMgc2VsZWN0IDM0LDQwb2htLGRkcjQgc2VsZWN0IDM0LDQ4b2htLGxwZGRyNCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htPTA7Ly84NCAgLy9jb25maWcgZHJhbSBkYXRhIHBpbiBvZHQgcHVsbCB1cCBkb3duIHN0ZW5ndGgsZGRyMyBzZWxlY3QgNDAsNjAsMTIwb2htLGRkcjQgc2VsZWN0IDM0LDQwLDQ4LDYwLDEyMCwyNDBvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG09MDsgLy8xNzQgY2hhciAxCglpPTc0LzI7Cglzb2NfZGF0YV9kcnZfb2htX3A9ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT03Ni8yOwoJc29jX2RhdGFfZHJ2X29obV9uPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCWk9NzgvMjsKCXNvY19kYXRhX29kdF9vaG1fcD1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTgwLzI7Cglzb2NfZGF0YV9vZHRfb2htX249ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT04Mi8yOwoJZHJhbV9kYXRhX2Rydl9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT04NC8yOwoJZHJhbV9kYXRhX29kdF9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT0xNzQvMTsKCWRyYW1fZGF0YV93cl9vZHRfb2htPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCw4LGkpOwoJaT01Mi8yOwoJZGRyX2ZyZXF1ZW5jeT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CgkvL2Rkcl9mcmVxdWVuY3k9Z2xvYmFsX2Rkcl9jbGs7CglpZiAoZ2xvYmFsX2Jvb3RfdGltZXMgPT0gMSkKCXsKCQlwcmludGYoIlxub3JnX2dsb2JhbF9ib290X3RpbWVzPT0gJWQgJXMiLCBnbG9iYWxfYm9vdF90aW1lcyxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJLy9wcmludGYoIlxubWF4X2NvdW50ZXI9JWQgICVkICVzIixtYXhfY291bnRlcl90b3RhbCxtYXhfY291bnRlcl90b3RhbCoyLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9wPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX249JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbnNvY19kYXRhX29kdF9vaG1fcD0lZCAlcyIsc29jX2RhdGFfb2R0X29obV9wLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9uPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfZHJ2X29obT0lZCAlcyIsZHJhbV9kYXRhX2Rydl9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfd3Jfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX3dyX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJfQoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fcF90W109ezM0LDQwLDQ4LDYwfTsKCS8vIHVuc2lnbmVkIGludCBzb2NfZGF0YV9kcnZfb2htX25fdFtdPXszNCw0MCw0OCw2MH07CgoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyM1tdPXs0MCw2MCwxMjB9OwkvL2RkcjMKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfb2R0X29obV90X2RkcjRbXT17NDAsNDgsNjAsMTIwfTsJLy9kZHI0Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjRbXT17NDAsNDgsNjAsMTIwfTsJLy9scGRkcjQKCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzW109ezM0LDQwfTsJLy9kZHIzCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0W109ezM0LDQ4fTsJLy9kZHI0Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9scGRkcjRbXT17NDAsNDgsNjB9OwkvL2xwZGRyNAoKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX3BfdFtdPXs0MCw0OCw2MCw4MCwxMjB9OwoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fbl90W109ezQwLDQ4LDYwLDgwLDEyMH07CgoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyM1tdPXs2MCwxMjAsMH07CS8vZGRyMwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyNFtdPXs4MCwxMjAsMH07CS8vZGRyNAoKCXVuc2lnbmVkIGludCAgKnBfc29jX2RhdGFfZHJ2X29obV9wPU5VTEw7CgkvLyAgdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9kcnZfb2htX249TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfc29jX2RhdGFfb2R0X29obV9wPU5VTEw7Cgl1bnNpZ25lZCBpbnQgICpwX3NvY19kYXRhX29kdF9vaG1fbj1OVUxMOwoKCgl1bnNpZ25lZCBpbnQgICpwX2RyYW1fZGF0YV9kcnZfb2htPU5VTEw7Cgl1bnNpZ25lZCBpbnQgICpwX2RyYW1fZGF0YV9vZHRfb2htPU5VTEw7Cgl1bnNpZ25lZCBpbnQgICpwX2RyYW1fZGF0YV93cl9vZHRfb2htPU5VTEw7CgoJcF9zb2NfZGF0YV9kcnZfb2htX3A9c29jX2RhdGFfZHJ2X29obV9wX3Q7CgkvLyBwX3NvY19kYXRhX2Rydl9vaG1fbj1zb2NfZGF0YV9kcnZfb2htX25fdDsKCXBfc29jX2RhdGFfb2R0X29obV9wPXNvY19kYXRhX29kdF9vaG1fcF90OwoJcF9zb2NfZGF0YV9vZHRfb2htX249c29jX2RhdGFfb2R0X29obV9uX3Q7CgoKCXBfZHJhbV9kYXRhX2Rydl9vaG09ZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzOwoJcF9kcmFtX2RhdGFfb2R0X29obT1kcmFtX2RhdGFfb2R0X29obV90X2RkcjM7CglwX2RyYW1fZGF0YV93cl9vZHRfb2htPWRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyMzsKCgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF93MT0oc2l6ZW9mKHNvY19kYXRhX2Rydl9vaG1fcF90KSkvKHNpemVvZihzb2NfZGF0YV9kcnZfb2htX3BfdFswXSkpOwoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3BfdzI9KHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2RkcjMpKS8oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyM1swXSkpOwoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3BfcjE9KHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2RkcjMpKS8oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyM1swXSkpOwoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3BfcjI9KHNpemVvZihzb2NfZGF0YV9vZHRfb2htX3BfdCkpLyhzaXplb2Yoc29jX2RhdGFfb2R0X29obV9wX3RbMF0pKTsKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3dyMT0xOwoJaWYgKGRkcl9jaGFubmVsX3JhbmtfY29uZmlnKQoJewoJCW1heF9jb3VudGVyX2xvb3Bfd3IxPShzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzKSkvKHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjNbMF0pKTsKCX0KCS8vZGRyX2NoYW5uZWxfcmFua19jb25maWdDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwCglpZiAoZGRyX3R5cGUgPT0gQVVUT19TQ0FOX0REUjQpCgl7CgkJcF9kcmFtX2RhdGFfZHJ2X29obT1kcmFtX2RhdGFfZHJ2X29obV90X2RkcjQ7CgkJcF9kcmFtX2RhdGFfb2R0X29obT1kcmFtX2RhdGFfb2R0X29obV90X2RkcjQ7CgkJcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjQ7CgkJbWF4X2NvdW50ZXJfbG9vcF93Mj0oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyNCkpLyhzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHI0WzBdKSk7CgkJbWF4X2NvdW50ZXJfbG9vcF9yMT0oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyNCkpLyhzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0WzBdKSk7CgoJCWlmIChkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZykKCQl7CgkJCW1heF9jb3VudGVyX2xvb3Bfd3IxPShzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjRbMF0pKTsKCQl9Cgl9CglpZiAoZGRyX3R5cGUgPT0gQVVUT19TQ0FOX0xQRERSNCkKCXsKCQlwX2RyYW1fZGF0YV9kcnZfb2htPWRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0OwoJCXBfZHJhbV9kYXRhX29kdF9vaG09ZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjQ7CgkJLy8JcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2xwZGRyNDsKCQltYXhfY291bnRlcl9sb29wX3cyPShzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfbHBkZHI0WzBdKSk7CgkJbWF4X2NvdW50ZXJfbG9vcF9yMT0oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2xwZGRyNFswXSkpOwoJCW1heF9jb3VudGVyX2xvb3BfcjI9KHNpemVvZihzb2NfZGF0YV9vZHRfb2htX25fdCkpLyhzaXplb2Yoc29jX2RhdGFfb2R0X29obV9uX3RbMF0pKTsKCgkJLy8JdW5zaWduZWQgaW50ICAqcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2xwZGRyNDsKCQlpZiAoZGRyX2NoYW5uZWxfcmFua19jb25maWcpCgkJewoJCQltYXhfY291bnRlcl9sb29wX3dyMT0xOwoJCX0KCX0KCiAgICB1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfdG90YWw9KG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikqbWF4X2NvdW50ZXJfbG9vcF93cjE7CgkvL2FkZCAyIHRpbWVzIHJlY292ZXIKCS8qCglzd2l0Y2ggKGdsb2JhbF9ib290X3RpbWVzKQoJewoJCWNhc2UoMSk6CgkJewoJCQlicmVhazsKCQl9Cgl9CgkqLwoJLy9lYWNoIGFycmFyeSB0ZXN0IDIgdGltZXMgLGZvciBtYXliZSAxdGltZXMgd2lsbCBmYWlsLHRoZW4gbmV4dCB0aW1lIHdpbGwgcmVjb3ZlcnkgLy9qaWF4aW5nIDIwMTgxMTE0Cgljb3VudGVyX2xvb3A9KCgoZ2xvYmFsX2Jvb3RfdGltZXMtMSkvMiklbWF4X2NvdW50ZXJfdG90YWwpOwoJZHJhbV9kYXRhX3dyX29kdF9vaG09MDsKCWlmIChtYXhfY291bnRlcl9sb29wX3dyMT4xKQoJewoJCWRyYW1fZGF0YV93cl9vZHRfb2htPXBfZHJhbV9kYXRhX3dyX29kdF9vaG1bKGNvdW50ZXJfbG9vcC8obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSldOwoJfQoJaWYgKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPChtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIpKQoJewoJCXNvY19kYXRhX2Rydl9vaG1fcD1wX3NvY19kYXRhX2Rydl9vaG1fcFsoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKSVtYXhfY291bnRlcl9sb29wX3cxKV07CgkJc29jX2RhdGFfZHJ2X29obV9uPXNvY19kYXRhX2Rydl9vaG1fcDsKCQlkcmFtX2RhdGFfb2R0X29obT1wX2RyYW1fZGF0YV9vZHRfb2htWyAgKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSkvbWF4X2NvdW50ZXJfbG9vcF93MSldOwoJfQoJZWxzZSBpZigoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKT09KChtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIpKzApKQoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwoJCS8vCXNwcmludGYoc3RyLCJnMTJfZDJwbGwgMTIwMCAgMHgxMSAgMHg2IDAgMHgwIDAgMCAwIDB4ODAwMDAwICAgIDAgMSAgICIKCQkvLwlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJLy8JcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJZWxzZSBpZigoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKTwobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyLTEpKQoJewoJCWRyYW1fZGF0YV9kcnZfb2htPXBfZHJhbV9kYXRhX2Rydl9vaG1bKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpJW1heF9jb3VudGVyX2xvb3BfcjEpXTsKCQlzb2NfZGF0YV9vZHRfb2htX3A9cF9zb2NfZGF0YV9vZHRfb2htX3BbKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpL21heF9jb3VudGVyX2xvb3BfcjEpXTsKCQlzb2NfZGF0YV9vZHRfb2htX249MDsKCQlpZiAoZGRyX3R5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSNCkKCQl7CgkJCXNvY19kYXRhX29kdF9vaG1fcD0wOwoJCQlzb2NfZGF0YV9vZHRfb2htX249cF9zb2NfZGF0YV9vZHRfb2htX25bKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpL21heF9jb3VudGVyX2xvb3BfcjEpXTsKCQl9Cgl9CgllbHNlIGlmKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPT0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyLTEpKQoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwoJfQoJcHJpbnRmKCJcbmdsb2JhbF9ib290X3RpbWVzPT0gJWQgJXMiLCBnbG9iYWxfYm9vdF90aW1lcyxzdHJpbmdfcHJpbnRfZmxhZyk7CglpZiAobG9vcCkKCXsKCQlpZiAoKChnbG9iYWxfYm9vdF90aW1lcy0xKS8yKT5tYXhfY291bnRlcl90b3RhbCkKCQkJcmV0dXJuIDE7Cgl9CglwcmludGYoIlxubWF4X2NvdW50ZXI9JWQgICVkICVzIixtYXhfY291bnRlcl90b3RhbCxtYXhfY291bnRlcl90b3RhbCoyLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX3A9JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9uPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbnNvY19kYXRhX29kdF9vaG1fcD0lZCAlcyIsc29jX2RhdGFfb2R0X29obV9wLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX249JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuZHJhbV9kYXRhX2Rydl9vaG09JWQgJXMiLGRyYW1fZGF0YV9kcnZfb2htLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5kcmFtX2RhdGFfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbmRyYW1fZGF0YV93cl9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfd3Jfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CnsKCWlmIChzb2NfZGF0YV9kcnZfb2htX3ApCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDc0ICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX2Rydl9vaG1fcCk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmIChzb2NfZGF0YV9kcnZfb2htX24pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDc2ICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX2Rydl9vaG1fbik7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmIChzb2NfZGF0YV9vZHRfb2htX3ApCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDc4ICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX29kdF9vaG1fcCk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmIChzb2NfZGF0YV9vZHRfb2htX24pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDgwICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX29kdF9vaG1fbik7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmIChkcmFtX2RhdGFfZHJ2X29obSkKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgODIgJWQgMiAgMCAgICIsCgkJZHJhbV9kYXRhX2Rydl9vaG0pOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZiAoZHJhbV9kYXRhX29kdF9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDg0ICVkIDIgIDAgICAiLAoJCWRyYW1fZGF0YV9vZHRfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJLy9pZihkcmFtX2RhdGFfd3Jfb2R0X29obSkKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgMTc0ICVkIDEgIDAgICAiLAoJCWRyYW1fZGF0YV93cl9vZHRfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoKCXNwcmludGYoc3RyLCJnMTJfZDJwbGwgJWQgIDB4MTIgIDB4NiAwIDB4MCAwIDAgMCAweDgwMDAwMCAgICAwIDEgICAiLGRkcl9mcmVxdWVuY3kpOwoJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJcnVuX2NvbW1hbmQoc3RyLDApOwp9CgpyZXR1cm4gMTsKfQoKaW50IGRvX2Rkcl9hdXRvX2Zhc3Rib290X2NoZWNrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJI2RlZmluZSBETUNfVEVTVF9TTFRfRU5BQkxFX0REUl9BVVRPX0ZBU1RfQk9PVCAoMTw8NSkKCSNkZWZpbmUgIEFVVE9fV0lORE9XX1RFU1RfRU5BQkxFX0lURU0gICAoKDE8PDEpfCgxPDwyKSkKCS8vCWludCBpPTA7CgkvLwlpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7CgkvL3Vuc2lnbmVkIGludCBlbmFibGVfZGRyX2Zhc3RfYm9vdD0wOyAgLy8gMCBwYXVzZSAxLHJlc3VtZQoJY2hhciBhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJdWludDMyX3QgYXV0b193aW5kb3dfdGVzdF9kcV9zaXplPTA7CgljaGFyIHBhdHRlcm5fZGlzX3NjcmFtYmxlPTA7Cgl1aW50MzJfdCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWU9MDsKCWlmIChhcmdjPjEpCgl7CgkJYXV0b193aW5kb3dfdGVzdF9lbmFibGVfaXRlbSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW09RE1DX1RFU1RfU0xUX0VOQUJMRV9ERFJfQVVUT19GQVNUX0JPT1Q7Cgl9CglpZiAoYXJnYz4yKQoJewoJCWF1dG9fd2luZG93X3Rlc3RfZHFfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWF1dG9fd2luZG93X3Rlc3RfZHFfc2l6ZT0wOwoJfQoJaWYgKGFyZ2M+MykKCXsKCQlwYXR0ZXJuX2Rpc19zY3JhbWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJcGF0dGVybl9kaXNfc2NyYW1ibGU9MDsKCX0KCQlpZiAoYXJnYz40KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfcmVhZF92cmVmX29mZnNldF92YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3ZyZWZfb2Zmc2V0X3ZhbHVlPTA7Cgl9CgljaGFyIHN0clsxMDI0XT0iIjsKCWRkcl9zZXRfdCAqZGRyX3NldF90X3A9TlVMTDsKCWRkcl9zZXRfdF9wPShkZHJfc2V0X3QgKikoZGRyX3NldF90X3BfYXJyYXJ5KTsKCS8vZGRyX3NldF90X3A9IChkZHJfc2V0X3QgKilHMTJfRE1DX1NUSUNLWV8wOwoJLy9pZiAoc2l6ZW9mKGRkcl9zZXRfdCk8bG9vcF9tYXgpCgl1aW50MzJfdCAgZGRyX3NldF9hZGQ9MDsKCXVpbnQzMl90ICBkZHJfc2V0X3NpemU9MDsKCWRkcl9zZXRfYWRkPSh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfdF9wKTsKCWRkcl9zZXRfc2l6ZT1zaXplb2YoZGRyX3NldF90KTsKCXByaW50ZigiXG5kZHJfc2V0X3RfcD09MHglMDh4XG4iLGRkcl9zZXRfYWRkKTsKCglkb19yZWFkX2Rkcl90cmFpbmluZ19kYXRhKDEsZGRyX3NldF90X3ApOwoKCWlmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSkpCgl7CgkJcHJpbnRmKCJcbnVib290IGVuYWJsZSBhdXRvIGZhc3QgYm9vdCBmdW5jaXRvbiBcbiIpOwoJfQoJZWxzZQoJCXJldHVybiAxIDsKCglpZiAoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pID09IDB4ZmYpCgl7CgkJcHJpbnRmKCJcbnVib290ICBhdXRvIGZhc3QgYm9vdCAgYXV0byB3aW5kb3cgdGVzdCBpcyBkb25lIFxuIik7CgkJcmV0dXJuIDEgOwoJfQoKCXByaW50ZigiXG4oZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk9PTB4JTA4eFxuIiwoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSkpOwoKCWlmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk8MHhmZSkKCXsKCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290ICBhdXRvIHdpbmRvdyB0ZXN0IGJlZ2luIFxuIik7CgkJewoJCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmU7CgkJLy8jaWYgMQoJCS8vcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQkvL3ByaW50ZigiJmRkcl9zaGEuc2hhMiA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpJmRkcl9zaGEuc2hhMik7CgkJLy9wcmludGYoImRkcl9zZXRfYWRkIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdClkZHJfc2V0X2FkZCk7CgoJCXNoYTI1Nl9jc3VtX3dkKCh1bnNpZ25lZCBjaGFyICopKHVpbnQ2NF90KWRkcl9zZXRfYWRkLCBzaXplb2YoZGRyX3NldF90KSwgZGRyX3NoYS5zaGEyLCAwKTsKCQkvL3NoYTIoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCS8vcHJpbnRmKCJwcmludCBzaGFcbiIpOwoJCS8vc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X2FkZC0zMikpOwoJCS8vcnVuX2NvbW1hbmQoc3RyLDApOwoJCS8vI2VuZGlmCgoJCXsKCQkjaWZkZWYgVVNFX0ZPUl9VQk9PVF8yMDE4CgkJc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCSNlbHNlCgkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTik7CgkJI2VuZGlmCgkJCQkvLwkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7CgkJCQkvLwlzcHJpbnRmKHN0ciwic3RvcmUgcnN2IHdyaXRlIGRkci1wYXJhbWV0ZXIgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQl9CgkJc3ByaW50ZihzdHIsImcxMl9kMnBsbCAlZCAweDExICVkIDAgMCAwIDAgJWQgMHglMDh4ICAwICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMF0sYXV0b193aW5kb3dfdGVzdF9lbmFibGVfaXRlbSxzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWUsYXV0b193aW5kb3dfdGVzdF9kcV9zaXplLHBhdHRlcm5fZGlzX3NjcmFtYmxlKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCX0KCQlyZXR1cm4gMSA7Cgl9CgoJaWYgKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSA9PSAweGZlKQoJewoJCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTA7CgkJY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg9MDsKCgkJewoJCQlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgweGQ8PDE2KXwoMDw8MTIpfCgweDApLDApOyAvLyBEV0NfRERSUEhZQV9BUEJPTkxZMF9NaWNyb0NvbnRNdXhTZWwKCgkJCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzIpKTsKCQkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMykpOwoJCQlwcmludGYoIlxuZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4ID0lZCBcbiIsZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4KTsKCQkJcHJpbnRmKCJcbmRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD0lZCBcbiIsZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4KTsKCQkJaWYgKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD4zMCkKCQkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTMwOwoJCQlpZiAoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PjMwKQoJCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MzA7CgkJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMiksdDRfd3JpdGVfd29yc3RfbWFyZ2luX3JhbmsxKTsKCQkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMzKSx0NF9yZWFkX3dvcnN0X21hcmdpbl9yYW5rMSk7CgkJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMV09KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4LzIpPDw0KSl8KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4LzIpKSk7CgkJfQoKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmY7CgkJewoJCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290ICBhdXRvIHdpbmRvdyB0ZXN0IGZpbmlzaCBcbiIpOwoKCQkJaWYgKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pCgkJCXsKCQkJCWlmICgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3KQoJCQkJewoJCQkJCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4OCkpCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhIDMgMHgwICAwIDAgMSAlZCAiLChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcpOwoJCQkJCWVsc2UKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMyAweDAgIDAgMCAyICVkICIsKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4Nyk7CgoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJfQoJCQkJaWYgKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcwKQoJCQkJewoJCQkJCWlmICgoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4ODApKQoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAyIDB4MCAgMCAwIDEgJWQgIiwoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pPj40KSYweDcpOwoJCQkJCWVsc2UKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMiAweDAgIDAgMCAyICVkICIsKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKT4+NCkmMHg3KTsKCgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl9CgoJCQkJc3ByaW50ZihzdHIsImRkcl9mYXN0X2Jvb3QgMSAiKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCS8vCSNpZiAxCgkvLwlwcmludGYoIiZkZHJfc2hhLmRkcnMgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLmRkcnMpOwoJLy8JcHJpbnRmKCImZGRyX3NoYS5zaGEyIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5zaGEyKTsKCS8vCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCgkJc2hhMjU2X2NzdW1fd2QoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJLy8JcHJpbnRmKCJwcmludCBzaGFcbiIpOwoJLy8Jc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X2FkZC0zMikpOwoJLy8JcnVuX2NvbW1hbmQoc3RyLDApOwoJLy8JI2VuZGlmCgoJCXsKCQkjaWZkZWYgVVNFX0ZPUl9VQk9PVF8yMDE4CgkJc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCSNlbHNlCgkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTik7CgkJI2VuZGlmCgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQl9CgoJCQl9CgkJCXJldHVybiAxOwoJCX0KCX0KCglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX2F1dG9fc2Nhbl9kcnYsCTMwLAkxLAlkb19kZHJfYXV0b19zY2FuX2RydiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7ClVfQk9PVF9DTUQoCglkZHJfZmFzdF9ib290LAkzMCwJMSwJZG9fZGRyX2Zhc3Rib290X2NvbmZpZywKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKVV9CT09UX0NNRCgKCWRkcl9hdXRvX2Zhc3RfYm9vdF9jaGVjaywJMzAsCTEsCWRvX2Rkcl9hdXRvX2Zhc3Rib290X2NoZWNrLAoJImRkcl9mYXN0Ym9vdF9jb25maWcgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoK