ZGlmZiAtLWdpdCBhL01ha2VmaWxlLnRhcmdldCBiL01ha2VmaWxlLnRhcmdldAppbmRleCA1MjkyZWU3Li44MTc3ZTdkIDEwMDY0NAotLS0gYS9NYWtlZmlsZS50YXJnZXQKKysrIGIvTWFrZWZpbGUudGFyZ2V0CkBAIC01NTksNyArNTU5LDcgQEAKIE9CSlMrPSBwZmxhc2hfY2ZpMDIubyBwcGM0eHhfZGV2cy5vIHBwYzQwNV91Yy5vIHBwYzQwNV9ib2FyZHMubwogZW5kaWYKIGlmZXEgKCQoVEFSR0VUX0JBU0VfQVJDSCksIG1pcHMpCi1PQkpTKz0gbWlwc19yNGsubyBtaXBzX2phenoubyBtaXBzX21hbHRhLm8gbWlwc19waWNhNjEubyBtaXBzX21pcHNzaW0ubworT0JKUys9IG1pcHNfcjRrLm8gbWlwc19qYXp6Lm8gbWlwc19tYWx0YS5vIG1pcHNfbWlwc3NpbS5vCiBPQkpTKz0gbWlwc190aW1lci5vIG1pcHNfaW50Lm8gZG1hLm8gdmdhLm8gc2VyaWFsLm8gaTgyNTQubyBpODI1OS5vIHJjNDAzMC5vCiBPQkpTKz0gZzM2NGZiLm8gamF6el9sZWQubwogT0JKUys9IGlkZS5vIGd0NjR4eHgubyBwY2tiZC5vIHBzMi5vIGZkYy5vIG1jMTQ2ODE4cnRjLm8gdXNiLXVoY2kubyBhY3BpLm8gZHMxMjI1eS5vCmRpZmYgLS1naXQgYS9ody9ib2FyZHMuaCBiL2h3L2JvYXJkcy5oCmluZGV4IDUwOWJkZWEuLjNhNTQyNDUgMTAwNjQ0Ci0tLSBhL2h3L2JvYXJkcy5oCisrKyBiL2h3L2JvYXJkcy5oCkBAIC0zOCwxMyArMzgsMTEgQEAKIAogLyogbWlwc19qYXp6LmMgKi8KIGV4dGVybiBRRU1VTWFjaGluZSBtaXBzX21hZ251bV9tYWNoaW5lOworZXh0ZXJuIFFFTVVNYWNoaW5lIG1pcHNfcGljYTYxX21hY2hpbmU7CiAKIC8qIG1pcHNfbWFsdGEuYyAqLwogZXh0ZXJuIFFFTVVNYWNoaW5lIG1pcHNfbWFsdGFfbWFjaGluZTsKIAotLyogbWlwc19waWNhNjEuYyAqLwotZXh0ZXJuIFFFTVVNYWNoaW5lIG1pcHNfcGljYTYxX21hY2hpbmU7Ci0KIC8qIG1pcHNfbWlwc3NpbS5jICovCiBleHRlcm4gUUVNVU1hY2hpbmUgbWlwc19taXBzc2ltX21hY2hpbmU7CiAKZGlmZiAtLWdpdCBhL2h3L21pcHNfamF6ei5jIGIvaHcvbWlwc19qYXp6LmMKaW5kZXggOTEwZGRiOS4uMGZhZGQ5MSAxMDA2NDQKLS0tIGEvaHcvbWlwc19qYXp6LmMKKysrIGIvaHcvbWlwc19qYXp6LmMKQEAgLTMzLDI0ICszMywxNiBAQAogI2luY2x1ZGUgIm5ldC5oIgogI2luY2x1ZGUgInNjc2kuaCIKIAotZXh0ZXJuIGludCBub2dyYXBoaWM7Ci0KICNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCiAjZGVmaW5lIEJJT1NfRklMRU5BTUUgIm1pcHNfYmlvcy5iaW4iCiAjZWxzZQogI2RlZmluZSBCSU9TX0ZJTEVOQU1FICJtaXBzZWxfYmlvcy5iaW4iCiAjZW5kaWYKIAotI2lmZGVmIFRBUkdFVF9NSVBTNjQKLSNkZWZpbmUgUEhZU19UT19WSVJUKHgpICgoeCkgfCB+MHg3ZmZmZmZmZlVMTCkKLSNlbHNlCi0jZGVmaW5lIFBIWVNfVE9fVklSVCh4KSAoKHgpIHwgfjB4N2ZmZmZmZmZVKQotI2VuZGlmCi0jZGVmaW5lIFZJUlRfVE9fUEhZU19BRERFTkQgKC0oKGludDY0X3QpKGludDMyX3QpMHg4MDAwMDAwMCkpCi0KIGVudW0gamF6el9tb2RlbF9lCiB7CiAgICAgSkFaWl9NQUdOVU0sCisgICAgSkFaWl9QSUNBNjEsCiB9OwogCiBzdGF0aWMgdm9pZCBtYWluX2NwdV9yZXNldCh2b2lkICpvcGFxdWUpCkBAIC0xOTYsNiArMTg4LDEwIEBACiAgICAgY2FzZSBKQVpaX01BR05VTToKICAgICAgICAgZzM2NGZiX21tX2luaXQoZHMsIHZnYV9yYW1fc2l6ZSwgMCwgMHg0MDAwMDAwMCwgMHg2MDAwMDAwMCk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgSkFaWl9QSUNBNjE6CisgICAgICAgIGlzYV92Z2FfbW1faW5pdChkcywgcGh5c19yYW1fYmFzZSArIHJhbV9zaXplLCByYW1fc2l6ZSwgdmdhX3JhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMCwgMHg2MDAwMDAwMCwgMCk7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTI2OCw4ICsyNjQsMjMgQEAKICAgICBtaXBzX2phenpfaW5pdChyYW1fc2l6ZSwgdmdhX3JhbV9zaXplLCBkcywgY3B1X21vZGVsLCBKQVpaX01BR05VTSk7CiB9CiAKK3N0YXRpYwordm9pZCBtaXBzX3BpY2E2MV9pbml0IChpbnQgcmFtX3NpemUsIGludCB2Z2FfcmFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJvb3RfZGV2aWNlLCBEaXNwbGF5U3RhdGUgKmRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0cmRfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKK3sKKyAgICBtaXBzX2phenpfaW5pdChyYW1fc2l6ZSwgdmdhX3JhbV9zaXplLCBkcywgY3B1X21vZGVsLCBKQVpaX1BJQ0E2MSk7Cit9CisKIFFFTVVNYWNoaW5lIG1pcHNfbWFnbnVtX21hY2hpbmUgPSB7CiAgICAgIm1hZ251bSIsCiAgICAgIk1JUFMgTWFnbnVtIiwKICAgICBtaXBzX21hZ251bV9pbml0LAogfTsKKworUUVNVU1hY2hpbmUgbWlwc19waWNhNjFfbWFjaGluZSA9IHsKKyAgICAicGljYTYxIiwKKyAgICAiQWNlciBQaWNhIDYxIiwKKyAgICBtaXBzX3BpY2E2MV9pbml0LAorfTsKZGlmZiAtLWdpdCBhL2h3L21pcHNfcGljYTYxLmMgYi9ody9taXBzX3BpY2E2MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmJjMmYwLi4wMDAwMDAwCi0tLSBhL2h3L21pcHNfcGljYTYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIFFFTVUgQWNlciBQaWNhIE1hY2hpbmUgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNyBIZXJ26SBQb3Vzc2luZWF1Ci0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLSAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLSAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLSAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi0gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotICogVEhFIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJody5oIgotI2luY2x1ZGUgIm1pcHMuaCIKLSNpbmNsdWRlICJpc2EuaCIKLSNpbmNsdWRlICJwYy5oIgotI2luY2x1ZGUgImZkYy5oIgotI2luY2x1ZGUgInN5c2VtdS5oIgotI2luY2x1ZGUgImJvYXJkcy5oIgotCi0jaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgotI2RlZmluZSBCSU9TX0ZJTEVOQU1FICJtaXBzX2Jpb3MuYmluIgotI2Vsc2UKLSNkZWZpbmUgQklPU19GSUxFTkFNRSAibWlwc2VsX2Jpb3MuYmluIgotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTUlQUzY0Ci0jZGVmaW5lIFBIWVNfVE9fVklSVCh4KSAoKHgpIHwgfjB4N2ZmZmZmZmZVTEwpCi0jZWxzZQotI2RlZmluZSBQSFlTX1RPX1ZJUlQoeCkgKCh4KSB8IH4weDdmZmZmZmZmVSkKLSNlbmRpZgotCi0jZGVmaW5lIFZJUlRfVE9fUEhZU19BRERFTkQgKC0oKGludDY0X3QpKGludDMyX3QpMHg4MDAwMDAwMCkpCi0KLSNkZWZpbmUgTUFYX0lERV9CVVMgMgotI2RlZmluZSBNQVhfRkQgMgotCi1zdGF0aWMgY29uc3QgaW50IGlkZV9pb2Jhc2VbMl0gPSB7IDB4MWYwLCAweDE3MCB9Owotc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlMlsyXSA9IHsgMHgzZjYsIDB4Mzc2IH07Ci1zdGF0aWMgY29uc3QgaW50IGlkZV9pcnFbMl0gPSB7IDE0LCAxNSB9OwotCi1zdGF0aWMgdWludDMyX3Qgc2VyaWFsX2Jhc2VbTUFYX1NFUklBTF9QT1JUU10gPSB7IDB4ODAwMDYwMDAsIDB4ODAwMDcwMDAgfTsKLXN0YXRpYyBpbnQgc2VyaWFsX2lycVtNQVhfU0VSSUFMX1BPUlRTXSA9IHsgOCwgOSB9OwotCi1leHRlcm4gRklMRSAqbG9nZmlsZTsKLQotc3RhdGljIHZvaWQgbWFpbl9jcHVfcmVzZXQodm9pZCAqb3BhcXVlKQotewotICAgIENQVVN0YXRlICplbnYgPSBvcGFxdWU7Ci0gICAgY3B1X3Jlc2V0KGVudik7Ci19Ci0KLXN0YXRpYwotdm9pZCBtaXBzX3BpY2E2MV9pbml0IChpbnQgcmFtX3NpemUsIGludCB2Z2FfcmFtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJvb3RfZGV2aWNlLCBEaXNwbGF5U3RhdGUgKmRzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0cmRfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKLXsKLSAgICBjaGFyIGJ1ZlsxMDI0XTsKLSAgICB1bnNpZ25lZCBsb25nIGJpb3Nfb2Zmc2V0OwotICAgIGludCBiaW9zX3NpemU7Ci0gICAgQ1BVU3RhdGUgKmVudjsKLSAgICBpbnQgaTsKLSAgICBpbnQgYXZhaWxhYmxlX3JhbTsKLSAgICBxZW11X2lycSAqaTgyNTk7Ci0gICAgaW50IGluZGV4OwotICAgIEJsb2NrRHJpdmVyU3RhdGUgKmZkW01BWF9GRF07Ci0KLSAgICAvKiBpbml0IENQVXMgKi8KLSAgICBpZiAoY3B1X21vZGVsID09IE5VTEwpIHsKLSNpZmRlZiBUQVJHRVRfTUlQUzY0Ci0gICAgICAgIGNwdV9tb2RlbCA9ICJSNDAwMCI7Ci0jZWxzZQotICAgICAgICAvKiBGSVhNRTogQWxsIHdyb25nLCB0aGlzIG1heWJlIHNob3VsZCBiZSBSMzAwMCBmb3IgdGhlIG9sZGVyIFBJQ0FzLiAqLwotICAgICAgICBjcHVfbW9kZWwgPSAiMjRLZiI7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZW52ID0gY3B1X2luaXQoY3B1X21vZGVsKTsKLSAgICBpZiAoIWVudikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBmaW5kIENQVSBkZWZpbml0aW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgcmVnaXN0ZXJfc2F2ZXZtKCJjcHUiLCAwLCAzLCBjcHVfc2F2ZSwgY3B1X2xvYWQsIGVudik7Ci0gICAgcWVtdV9yZWdpc3Rlcl9yZXNldChtYWluX2NwdV9yZXNldCwgZW52KTsKLQotICAgIC8qIGFsbG9jYXRlIFJBTSAobGltaXRlZCB0byAyNTYgTUIpICovCi0gICAgaWYgKHJhbV9zaXplIDwgMjU2ICogMTAyNCAqIDEwMjQpCi0gICAgICAgIGF2YWlsYWJsZV9yYW0gPSByYW1fc2l6ZTsKLSAgICBlbHNlCi0gICAgICAgIGF2YWlsYWJsZV9yYW0gPSAyNTYgKiAxMDI0ICogMTAyNDsKLSAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDAsIGF2YWlsYWJsZV9yYW0sIElPX01FTV9SQU0pOwotCi0gICAgLyogbG9hZCBhIEJJT1MgaW1hZ2UgKi8KLSAgICBiaW9zX29mZnNldCA9IHJhbV9zaXplICsgdmdhX3JhbV9zaXplOwotICAgIGlmIChiaW9zX25hbWUgPT0gTlVMTCkKLSAgICAgICAgYmlvc19uYW1lID0gQklPU19GSUxFTkFNRTsKLSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvJXMiLCBiaW9zX2RpciwgYmlvc19uYW1lKTsKLSAgICBiaW9zX3NpemUgPSBsb2FkX2ltYWdlKGJ1ZiwgcGh5c19yYW1fYmFzZSArIGJpb3Nfb2Zmc2V0KTsKLSAgICBpZiAoKGJpb3Nfc2l6ZSA8PSAwKSB8fCAoYmlvc19zaXplID4gQklPU19TSVpFKSkgewotICAgICAgICAvKiBmYXRhbCAqLwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IEVycm9yLCBjb3VsZCBub3QgbG9hZCBNSVBTIGJpb3MgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICBidWYpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4MWZjMDAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklPU19TSVpFLCBiaW9zX29mZnNldCB8IElPX01FTV9ST00pOwotCi0gICAgLyogRGV2aWNlIG1hcAotICAgICAqCi0gICAgICogYWRkciAweGUwMDA0MDAwOiBtYzE0NjgxOAotICAgICAqIGFkZHIgMHhlMDAwNTAwMCBpbnRyIDY6IHBzMiBrZXlib2FyZAotICAgICAqIGFkZHIgMHhlMDAwNTAwMCBpbnRyIDc6IHBzMiBtb3VzZQotICAgICAqIGFkZHIgMHhlMDAwNjAwMCBpbnRyIDg6IG5zMTY1NTBhLAotICAgICAqIGFkZHIgMHhlMDAwNzAwMCBpbnRyIDk6IG5zMTY1NTBhCi0gICAgICogaXNhX2lvX2Jhc2UgMHhlMjAwMDAwMCBpc2FfbWVtX2Jhc2UgMHhlMzAwMDAwMAotICAgICAqLwotCi0gICAgLyogSW5pdCBDUFUgaW50ZXJuYWwgZGV2aWNlcyAqLwotICAgIGNwdV9taXBzX2lycV9pbml0X2NwdShlbnYpOwotICAgIGNwdV9taXBzX2Nsb2NrX2luaXQoZW52KTsKLSAgICBjcHVfbWlwc19pcnFjdHJsX2luaXQoKTsKLQotICAgIC8qIFJlZ2lzdGVyIDY0IEtCIG9mIElTQSBJTyBzcGFjZSBhdCAweDEwMDAwMDAwICovCi0gICAgaXNhX21taW9faW5pdCgweDEwMDAwMDAwLCAweDAwMDEwMDAwKTsKLSAgICBpc2FfbWVtX2Jhc2UgPSAweDExMDAwMDAwOwotCi0gICAgLyogUEMgc3R5bGUgSVJRIChpODI1OS9pODI1NCkgYW5kIERNQSAoaTgyNTcpICovCi0gICAgLyogVGhlIFBJQyBpcyBhdHRhY2hlZCB0byB0aGUgTUlQUyBDUFUgSU5UMCBwaW4gKi8KLSAgICBpODI1OSA9IGk4MjU5X2luaXQoZW52LT5pcnFbMl0pOwotICAgIHJ0Y19tbV9pbml0KDB4ODAwMDQwNzAsIDEsIGk4MjU5WzE0XSk7Ci0gICAgcGl0X2luaXQoMHg0MCwgMCk7Ci0KLSAgICAvKiBLZXlib2FyZCAoaTgwNDIpICovCi0gICAgaTgwNDJfbW1faW5pdChpODI1OVs2XSwgaTgyNTlbN10sIDB4ODAwMDUwNjAsIDApOwotCi0gICAgLyogSURFIGNvbnRyb2xsZXIgKi8KLQotICAgIGlmIChkcml2ZV9nZXRfbWF4X2J1cyhJRl9JREUpID49IE1BWF9JREVfQlVTKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogdG9vIG1hbnkgSURFIGJ1c1xuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZm9yKGkgPSAwOyBpIDwgTUFYX0lERV9CVVM7IGkrKykgewotICAgICAgICBpbnQgaGQwLCBoZDE7Ci0gICAgICAgIGhkMCA9IGRyaXZlX2dldF9pbmRleChJRl9JREUsIGksIDApOwotICAgICAgICBoZDEgPSBkcml2ZV9nZXRfaW5kZXgoSUZfSURFLCBpLCAxKTsKLSAgICAgICAgaXNhX2lkZV9pbml0KGlkZV9pb2Jhc2VbaV0sIGlkZV9pb2Jhc2UyW2ldLCBpODI1OVtpZGVfaXJxW2ldXSwKLSAgICAgICAgICAgICAgICAgICAgIGhkMCA9PSAtMSA/IE5VTEwgOiBkcml2ZXNfdGFibGVbaGQwXS5iZHJ2LAotICAgICAgICAgICAgICAgICAgICAgaGQxID09IC0xID8gTlVMTCA6IGRyaXZlc190YWJsZVtoZDFdLmJkcnYpOwotICAgIH0KLQotICAgIC8qIE5ldHdvcmsgY29udHJvbGxlciAqLwotICAgIC8qIEZJWE1FOiBtaXNzaW5nIE5TIFNPTklDIERQODM5MzIgKi8KLQotICAgIC8qIFNDU0kgYWRhcHRlciAqLwotICAgIC8qIEZJWE1FOiBtaXNzaW5nIE5DUiA1M0M5NCAqLwotCi0gICAgLyogSVNBIGRldmljZXMgKGZsb3BweSwgc2VyaWFsLCBwYXJhbGxlbCkgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRkQ7IGkrKykgewotICAgICAgICBpbmRleCA9IGRyaXZlX2dldF9pbmRleChJRl9GTE9QUFksIDAsIGkpOwotICAgICAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICAgICAgICBmZFtpXSA9IE5VTEw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZkW2ldID0gZHJpdmVzX3RhYmxlW2luZGV4XS5iZHJ2OwotICAgIH0KLSAgICBmZGN0cmxfaW5pdChpODI1OVsxXSwgMSwgMSwgMHg4MDAwMzAwMCwgZmQpOwotICAgIGZvcihpID0gMDsgaSA8IE1BWF9TRVJJQUxfUE9SVFM7IGkrKykgewotICAgICAgICBpZiAoc2VyaWFsX2hkc1tpXSkgewotICAgICAgICAgICAgc2VyaWFsX21tX2luaXQoc2VyaWFsX2Jhc2VbaV0sIDAsIGk4MjU5W3NlcmlhbF9pcnFbaV1dLCBzZXJpYWxfaGRzW2ldLCAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBQYXJhbGxlbCBwb3J0ICovCi0gICAgaWYgKHBhcmFsbGVsX2hkc1swXSkgcGFyYWxsZWxfbW1faW5pdCgweDgwMDA4MDAwLCAwLCBpODI1OVsxXSwgcGFyYWxsZWxfaGRzWzBdKTsKLQotICAgIC8qIFNvdW5kIGNhcmQgKi8KLSAgICAvKiBGSVhNRTogbWlzc2luZyBKYXp6IHNvdW5kLCBJUlEgMTggKi8KLQotICAgIC8qIExFRCBpbmRpY2F0b3IgKi8KLSAgICAvKiBGSVhNRTogbWlzc2luZyBMRUQgaW5kaWNhdG9yICovCi0KLSAgICAvKiBOVlJBTSAqLwotICAgIGRzMTIyNXlfaW5pdCgweDgwMDA5MDAwLCAibnZyYW0iKTsKLQotICAgIC8qIFZpZGVvIGNhcmQgKi8KLSAgICAvKiBGSVhNRTogVGhpcyBjYXJkIGlzIG5vdCB0aGUgcmVhbCBvbmUgd2hpY2ggd2FzIGluIHRoZSBvcmlnaW5hbCBQSUNBLAotICAgICAqIGJ1dCBsZXQncyBkbyB3aXRoIHdoYXQgUWVtdSBjdXJyZW5seSBlbXVsYXRlcy4uLiAqLwotICAgIGlzYV92Z2FfbW1faW5pdChkcywgcGh5c19yYW1fYmFzZSArIHJhbV9zaXplLCByYW1fc2l6ZSwgdmdhX3JhbV9zaXplLAotICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwLCAweDYwMDAwMDAwLCAwKTsKLQotICAgIC8qIExFRCBpbmRpY2F0b3IgKi8KLSAgICBqYXp6X2xlZF9pbml0KGRzLCAweDgwMDBmMDAwKTsKLX0KLQotUUVNVU1hY2hpbmUgbWlwc19waWNhNjFfbWFjaGluZSA9IHsKLSAgICAicGljYTYxIiwKLSAgICAiQWNlciBQaWNhIDYxIiwKLSAgICBtaXBzX3BpY2E2MV9pbml0LAotfTsK