LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogQXV0aG9yczoKICogICAgVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICovCgojaW5jbHVkZSAiZHJtUC5oIgojaW5jbHVkZSAic2lzX2RybS5oIgojaW5jbHVkZSAic2lzX2Rydi5oIgoKI2luY2x1ZGUgPHZpZGVvL3Npc2ZiLmg+CgojZGVmaW5lIFZJREVPX1RZUEUgMAojZGVmaW5lIEFHUF9UWVBFIDEKCgojaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQovKiBmYiBtYW5hZ2VtZW50IHZpYSBmYiBkZXZpY2UgKi8KCiNkZWZpbmUgU0lTX01NX0FMSUdOX1NISUZUIDAKI2RlZmluZSBTSVNfTU1fQUxJR05fTUFTSyAwCgpzdGF0aWMgdm9pZCAqc2lzX3NtYW5fbW1fYWxsb2NhdGUodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQpCnsKCXN0cnVjdCBzaXNfbWVtcmVxIHJlcTsKCglyZXEuc2l6ZSA9IHNpemU7CglzaXNfbWFsbG9jKCZyZXEpOwoJaWYgKHJlcS5zaXplID09IDApCgkJcmV0dXJuIE5VTEw7CgllbHNlCgkJcmV0dXJuICh2b2lkICopfnJlcS5vZmZzZXQ7Cn0KCnN0YXRpYyB2b2lkIHNpc19zbWFuX21tX2ZyZWUodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKQp7CglzaXNfZnJlZSh+KCh1bnNpZ25lZCBsb25nKXJlZikpOwp9CgpzdGF0aWMgdm9pZCBzaXNfc21hbl9tbV9kZXN0cm95KHZvaWQgKnByaXZhdGUpCnsKCTsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lzX3NtYW5fbW1fb2Zmc2V0KHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZikKewoJcmV0dXJuIH4oKHVuc2lnbmVkIGxvbmcpcmVmKTsKfQoKI2Vsc2UgLyogQ09ORklHX0ZCX1NJUyAqLwoKI2RlZmluZSBTSVNfTU1fQUxJR05fU0hJRlQgNAojZGVmaW5lIFNJU19NTV9BTElHTl9NQVNLICggKDEgPDwgU0lTX01NX0FMSUdOX1NISUZUKSAtIDEpCgojZW5kaWYgLyogQ09ORklHX0ZCX1NJUyAqLwoKc3RhdGljIGludCBzaXNfZmJfaW5pdChEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2lzX2ZiX3QgZmI7CglpbnQgcmV0OwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgKGRybV9zaXNfZmJfdCBfX3VzZXIgKikgZGF0YSwgc2l6ZW9mKGZiKSk7CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwojaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQoJewoJCXN0cnVjdCBkcm1fc21hbl9tbSBzbWFuX21tOwoJCXNtYW5fbW0ucHJpdmF0ZSA9ICh2b2lkICopMHhGRkZGRkZGRjsKCQlzbWFuX21tLmFsbG9jYXRlID0gc2lzX3NtYW5fbW1fYWxsb2NhdGU7CgkJc21hbl9tbS5mcmVlID0gc2lzX3NtYW5fbW1fZnJlZTsKCQlzbWFuX21tLmRlc3Ryb3kgPSBzaXNfc21hbl9tbV9kZXN0cm95OwoJCXNtYW5fbW0ub2Zmc2V0ID0gc2lzX3NtYW5fbW1fb2Zmc2V0OwoJCXJldCA9CgkJICAgIGRybV9zbWFuX3NldF9tYW5hZ2VyKCZkZXZfcHJpdi0+c21hbiwgVklERU9fVFlQRSwgJnNtYW5fbW0pOwoJfQojZWxzZQoJcmV0ID0gZHJtX3NtYW5fc2V0X3JhbmdlKCZkZXZfcHJpdi0+c21hbiwgVklERU9fVFlQRSwgMCwKCQkJCSBmYi5zaXplID4+IFNJU19NTV9BTElHTl9TSElGVCk7CiNlbmRpZgoKCWlmIChyZXQpIHsKCQlEUk1fRVJST1IoIlZSQU0gbWVtb3J5IG1hbmFnZXIgaW5pdGlhbGlzYXRpb24gZXJyb3JcbiIpOwoJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJCXJldHVybiByZXQ7Cgl9CgoJZGV2X3ByaXYtPnZyYW1faW5pdGlhbGl6ZWQgPSAxOwoJZGV2X3ByaXYtPnZyYW1fb2Zmc2V0ID0gZmIub2Zmc2V0OwoKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1IiwgZmIub2Zmc2V0LCBmYi5zaXplKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzaXNfZHJtX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIHByaXYsCgkJCSB1bnNpZ25lZCBsb25nIGRhdGEsIGludCBwb29sKQp7Cglkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3Npc19tZW1fdCBfX3VzZXIgKmFyZ3AgPSAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKikgZGF0YTsKCWRybV9zaXNfbWVtX3QgbWVtOwoJaW50IHJldHZhbCA9IDA7CglzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKml0ZW07CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgYXJncCwgc2l6ZW9mKG1lbSkpOwoKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCglpZiAoMCA9PSAoKHBvb2wgPT0gMCkgPyBkZXZfcHJpdi0+dnJhbV9pbml0aWFsaXplZCA6CgkJICAgICAgZGV2X3ByaXYtPmFncF9pbml0aWFsaXplZCkpIHsKCQlEUk1fRVJST1IKCQkgICAgKCJBdHRlbXB0IHRvIGFsbG9jYXRlIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkgbWFuYWdlci5cbiIpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJbWVtLnNpemUgPSAobWVtLnNpemUgKyBTSVNfTU1fQUxJR05fTUFTSykgPj4gU0lTX01NX0FMSUdOX1NISUZUOwoJaXRlbSA9IGRybV9zbWFuX2FsbG9jKCZkZXZfcHJpdi0+c21hbiwgcG9vbCwgbWVtLnNpemUsIDAsCgkJCSAgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOwoKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJaWYgKGl0ZW0pIHsKCQltZW0ub2Zmc2V0ID0gKChwb29sID09IDApID8KCQkJICAgICAgZGV2X3ByaXYtPnZyYW1fb2Zmc2V0IDogZGV2X3ByaXYtPmFncF9vZmZzZXQpICsKCQkgICAgKGl0ZW0tPm1tLT4KCQkgICAgIG9mZnNldChpdGVtLT5tbSwgaXRlbS0+bW1faW5mbykgPDwgU0lTX01NX0FMSUdOX1NISUZUKTsKCQltZW0uZnJlZSA9IGl0ZW0tPnVzZXJfaGFzaC5rZXk7CgkJbWVtLnNpemUgPSBtZW0uc2l6ZSA8PCBTSVNfTU1fQUxJR05fU0hJRlQ7Cgl9IGVsc2UgewoJCW1lbS5vZmZzZXQgPSAwOwoJCW1lbS5zaXplID0gMDsKCQltZW0uZnJlZSA9IDA7CgkJcmV0dmFsID0gRFJNX0VSUihFTk9NRU0pOwoJfQoKCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgbWVtLCBzaXplb2YobWVtKSk7CgoJRFJNX0RFQlVHKCJhbGxvYyAlZCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZFxuIiwgcG9vbCwgbWVtLnNpemUsCgkJICBtZW0ub2Zmc2V0KTsKCglyZXR1cm4gcmV0dmFsOwp9CgpzdGF0aWMgaW50IHNpc19kcm1fZnJlZShEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2lzX21lbV90IG1lbTsKCWludCByZXQ7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbSwgKGRybV9zaXNfbWVtX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKG1lbSkpOwoKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCXJldCA9IGRybV9zbWFuX2ZyZWVfa2V5KCZkZXZfcHJpdi0+c21hbiwgbWVtLmZyZWUpOwoJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CglEUk1fREVCVUcoImZyZWUgPSAweCVseFxuIiwgbWVtLmZyZWUpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgc2lzX2ZiX2FsbG9jKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJcmV0dXJuIHNpc19kcm1fYWxsb2MoZGV2LCBwcml2LCBkYXRhLCBWSURFT19UWVBFKTsKfQoKc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2luaXQoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3Npc19hZ3BfdCBhZ3A7CglpbnQgcmV0OwoJZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhZ3AsIChkcm1fc2lzX2FncF90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZihhZ3ApKTsKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCXJldCA9IGRybV9zbWFuX3NldF9yYW5nZSgmZGV2X3ByaXYtPnNtYW4sIEFHUF9UWVBFLCAwLAoJCQkJIGFncC5zaXplID4+IFNJU19NTV9BTElHTl9TSElGVCk7CgoJaWYgKHJldCkgewoJCURSTV9FUlJPUigiQUdQIG1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpc2F0aW9uIGVycm9yXG4iKTsKCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCQlyZXR1cm4gcmV0OwoJfQoKCWRldl9wcml2LT5hZ3BfaW5pdGlhbGl6ZWQgPSAxOwoJZGV2X3ByaXYtPmFncF9vZmZzZXQgPSBhZ3Aub2Zmc2V0OwoJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CgoJRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1IiwgYWdwLm9mZnNldCwgYWdwLnNpemUpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2lzX2lvY3RsX2FncF9hbGxvYyhEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCglyZXR1cm4gc2lzX2RybV9hbGxvYyhkZXYsIHByaXYsIGRhdGEsIEFHUF9UWVBFKTsKfQoKc3RhdGljIGRybV9sb2NhbF9tYXBfdCAqc2lzX3JlZ19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmVudHJ5OwoJZHJtX2xvY2FsX21hcF90ICptYXA7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewoJCW1hcCA9IGVudHJ5LT5tYXA7CgkJaWYgKCFtYXApCgkJCWNvbnRpbnVlOwoJCWlmIChtYXAtPnR5cGUgPT0gX0RSTV9SRUdJU1RFUlMpIHsKCQkJcmV0dXJuIG1hcDsKCQl9Cgl9CglyZXR1cm4gTlVMTDsKfQoKaW50IHNpc19pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1aW50MzJfdCBpZGxlX3JlZzsKCXVuc2lnbmVkIGxvbmcgZW5kOwoJaW50IGk7CgoJaWYgKGRldl9wcml2LT5pZGxlX2ZhdWx0KQoJCXJldHVybiAwOwoKCWlmIChkZXZfcHJpdi0+bW1pbyA9PSBOVUxMKSB7CgkJZGV2X3ByaXYtPm1taW8gPSBzaXNfcmVnX2luaXQoZGV2KTsKCQlpZiAoZGV2X3ByaXYtPm1taW8gPT0gTlVMTCkgewoJCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBmaW5kIHJlZ2lzdGVyIG1hcC5cbiIpOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CgkKCS8qCgkgKiBJbXBsZW1lbnQgYSBkZXZpY2Ugc3dpdGNoIGhlcmUgaWYgbmVlZGVkCgkgKi8KCglpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gU0lTX0NISVBfMzE1KQoJCXJldHVybiAwOwoKCS8qCgkgKiBUaW1lb3V0IGFmdGVyIDMgc2Vjb25kcy4gV2UgY2Fubm90IHVzZSBEUk1fV0FJVF9PTiBoZXJlCgkgKiBiZWNhdXNlIGl0cyBwb2xsaW5nIGZyZXF1ZW5jeSBpcyB0b28gbG93LgoJICovCgoJZW5kID0gamlmZmllcyArIChEUk1fSFogKiAzKTsKCglmb3IgKGk9MDsgaTw0OyArK2kpIHsKCQlkbyB7CgkJCWlkbGVfcmVnID0gU0lTX1JFQUQoMHg4NWNjKTsKCQl9IHdoaWxlICggIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSAmJgoJCQkgICgoaWRsZV9yZWcgJiAweDgwMDAwMDAwKSAhPSAweDgwMDAwMDAwKSk7Cgl9CgoJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSkgewoJCURSTV9FUlJPUigiR3JhcGhpY3MgZW5naW5lIGlkbGUgdGltZW91dC4gIgoJCQkgICJEaXNhYmxpbmcgaWRsZSBjaGVja1xuIik7CgkJZGV2X3ByaXYtPmlkbGVfZmF1bHQgPSAxOwoJfQoKCS8qCgkgKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgYW4gZXJyb3IgY29kZS4gSXQgZ2V0cyB0cmFwcGVkCgkgKiBpbiBsaWJkcm0uCgkgKi8KCglyZXR1cm4gMDsKfQoKCnZvaWQgc2lzX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7Cglkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCWlmICghZGV2X3ByaXYpCgkJcmV0dXJuOwoKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCWRybV9zbWFuX2NsZWFudXAoJmRldl9wcml2LT5zbWFuKTsKCWRldl9wcml2LT52cmFtX2luaXRpYWxpemVkID0gMDsKCWRldl9wcml2LT5hZ3BfaW5pdGlhbGl6ZWQgPSAwOwoJZGV2X3ByaXYtPm1taW8gPSBOVUxMOwoJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Cn0KCnZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQp7Cglkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwoKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCWlmIChkcm1fc21hbl9vd25lcl9jbGVhbigmZGV2X3ByaXYtPnNtYW4sICh1bnNpZ25lZCBsb25nKXByaXYpKSB7CgkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CgkJcmV0dXJuOwoJfQoKCWlmIChkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudCkgewoJCWRldi0+ZHJpdmVyLT5kbWFfcXVpZXNjZW50KGRldik7Cgl9CgoJZHJtX3NtYW5fb3duZXJfY2xlYW51cCgmZGV2X3ByaXYtPnNtYW4sICh1bnNpZ25lZCBsb25nKXByaXYpOwoJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CglyZXR1cm47Cn0KCmRybV9pb2N0bF9kZXNjX3Qgc2lzX2lvY3Rsc1tdID0gewoJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0FMTE9DKV0gPSB7c2lzX2ZiX2FsbG9jLCBEUk1fQVVUSH0sCglbRFJNX0lPQ1RMX05SKERSTV9TSVNfRkJfRlJFRSldID0ge3Npc19kcm1fZnJlZSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9JTklUKV0gPQoJICAgIHtzaXNfaW9jdGxfYWdwX2luaXQsIERSTV9BVVRIIHwgRFJNX01BU1RFUiB8IERSTV9ST09UX09OTFl9LAoJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0FHUF9BTExPQyldID0ge3Npc19pb2N0bF9hZ3BfYWxsb2MsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfRlJFRSldID0ge3Npc19kcm1fZnJlZSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0lOSVQpXSA9CgkgICAge3Npc19mYl9pbml0LCBEUk1fQVVUSCB8IERSTV9NQVNURVIgfCBEUk1fUk9PVF9PTkxZfQp9OwoKaW50IHNpc19tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShzaXNfaW9jdGxzKTsK