ZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvTWFrZWZpbGUgYi9saWJ1cGdyYWRlL01ha2VmaWxlCmluZGV4IDJkMjFlYTguLjhjMjhkYjkgMTAwNjQ0Ci0tLSBhL2xpYnVwZ3JhZGUvTWFrZWZpbGUKKysrIGIvbGlidXBncmFkZS9NYWtlZmlsZQpAQCAtMTEsOSArMTEsOCBAQAogCiBDRkxBR1MgPSAtZyAtT3MKIAotIyB1dGlsLmMgaW5jbHVkZXMgaHR5cGUuaCwgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4gU2tpcCBpdCwgd2UgZG9uJ3QgbmVlZCBpdCByaWdodCBub3cuCi1TUkNTID0gaG14X3VwZ3JhZGUuYyBobXhfdXBncmFkZV9mbGFzaC5jIGhteF91cGdyYWRlX252cmFtLmMgaG14X3VwZ3JhZGVfc3lzdGVtLmMgbGliX3F1ZXVlLmMKLUlOQ1MgPSBobXhfdXBncmFkZS5oIGhteF91cGdyYWRlX2ZsYXNoLmggaG14X3VwZ3JhZGVfbnZyYW0uaCBobXhfdXBncmFkZV9zeXN0ZW0uaCBsaWJfcXVldWUuaCB1dGlsLmgKK1NSQ1MgPSBobXhfdXBncmFkZV9mbGFzaC5jIGhteF91cGdyYWRlX252cmFtLmMKK0lOQ1MgPSBobXhfdXBncmFkZV9udnJhbS5oIGhudnJhbV9kbGlzdC5oCiBPQkpTID0gJChTUkNTOi5jPS5vKQogCiBhbGw6IGxpYmhteHVwZ3JhZGUuYQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZS5jIGIvbGlidXBncmFkZS9obXhfdXBncmFkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVlNDE3Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZS5jICAkDQotICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQotICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCi0gKiBGaWxlIERlc2NyaXB0aW9uOglIVFRQIExpdmUgU3RyZWFtaW5nDQotICogTW9kdWxlOg0KLSAqIFJlbWFya3M6DQotICovDQotDQotLyoqDQotICoNCi0gKiBAZGVmZ3JvdXAgVVBHUkFERSBVcGdyYWRlIEFQSXMNCi0gKg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQotICogQGRhdGUgMzAgU2VwdCAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZS5jDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlICJobXhfdXBncmFkZS5oIg0KLSNpbmNsdWRlICJ1dGlsLmgiDQotLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2RlZmluZSAgCUhNWF9VUEdSQURFX05VTUJFUl9PRl9RVUVVRQk2NA0KLSNkZWZpbmUJSE1YX1VQR1JBREVfVEFTS19QUklPUklUWQkJCQkxMA0KLSNkZWZpbmUJSE1YX1VQR1JBREVfVEFTS19TVEFDS19TSVpFCQkJCSgxMDI0KjEyOCkNCi0NCi0vKiBFbmQgI2RlZmluZSAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHR5cGVkZWYgKi8NCi0vKiBFbmQgdHlwZWRlZiAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLw0KLQ0KLS8qKg0KLSAqIFVwZ3JhZGUgU3RhdHVzIENhbGxiYWNrIG5vdGlmaWVzIHN0YXR1cyB0byBBUFANCi0gKi8NCi1ITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrID0gTlVMTDsNCi1ITVhfVVBHUkFERV9DT01NQU5EX3QgZ190VXBncmFkZUNvbW1hbmQ7DQotLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCQlzX3VsVXBncmFkZVRhc2tJZCA9IDA7DQotc3RhdGljIHVuc2lnbmVkIGxvbmcgCQlzX3VsVXBncmFkZU1lc3Nnc2VJZD0wOw0KLS8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8NCi0NCi1zdGF0aWMgdm9pZCBQX0hNWF9VcGdyYWRlX1Rhc2sodm9pZCogcGFyYW0pOw0KLQ0KLQ0KLS8qKg0KLSAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4NCi0gKiBTdGFydCBIdW1heCBVcGdyYWRlIE1vZHVsZS4gaXQgY3JlYXRlcyBhIHRocmVhZCBmb3IgVXBncmFkaW5nLiA8YnI+DQotICoNCi0gKiBAcGFyYW1baW5dIGNhbGxiYWNrIDogc3BlY2lmeSBhIGNhbGxiYWNrIHRvIGdldCBVcGdyYWRlIFN0YXR1cy4gaWYgTlVMTCwgVXBncmFkZSBNb2R1bGUgY2FuJ3QgYmUgc3RhcnRlZC4NCi0gKiBAcGFyYW1baW5dIGZpbGUgOiBzcGVjaWZ5IGEgZmlsZSBwYXRoLiBhbHNvIGh0dHAgYWRkcmVzcyB3aWxsIGJlIHBvc3NpYmxlLiBpZiBOVUxMLCBVcGdyYWRlIE1vZHVsZSBjYW4ndCBiZSBzdGFydGVkLg0KLSAqDQotICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPg0KLSAqICAgICAgICAgICMgIDEgOiBmYWlsZWQgPGJyPg0KLSAqDQotICovDQotaW50IEhNWF9VUEdSQURFX1N0YXJ0KCBITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgY2FsbGJhY2ssICB1bnNpZ25lZCBjaGFyICogZmlsZSkNCi17DQotCWludCBlcnI7DQotCUhNWF9VUEdSQURFX0NPTU1BTkRfdCB1cGdyYWRlX21zZzsNCi0NCi0JLyogQWRkIENhbGxiYWNrICovDQotCWlmKCBjYWxsYmFjayA9PSBOVUxMICkNCi0Jew0KLQkJcHJpbnRmKCJbJXNdIEVSUk9SIGNhbGxiYWNrIHBvcmludGVyIGlzIE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOw0KLQkJcmV0dXJuIDE7DQotCX0NCi0JZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7DQotDQotCWlmICggZmlsZSA9PSBOVUxMICkNCi0Jew0KLQkJcHJpbnRmKCJbJXNdIEVSUk9SIGZpbGUgcGF0aCBpcyBuVUxMXG4iLCBfX0ZVTkNUSU9OX18pOw0KLQkJcmV0dXJuIDE7DQotCX0NCi0NCi0JZXJyID0gSE1YX01TR19DcmVhdGUoSE1YX1VQR1JBREVfTlVNQkVSX09GX1FVRVVFLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwJICJVcGdyYWRlTXNnUSIsICZzX3VsVXBncmFkZU1lc3Nnc2VJZCwgSE1YX1NVU1BFTkRUWVBFX0ZJRk8pOw0KLQlpZihlcnIgIT0gSE1YX09LKQ0KLQl7DQotCQlwcmludGYoIlslc10gWyVkXSBFcnJvcigweCV4KSBcblxyIixfX0ZVTkNUSU9OX18sX19MSU5FX18sIGVycik7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCWVyciA9IEhNWF9UQVNLX0NyZWF0ZSggUF9ITVhfVXBncmFkZV9UYXNrLCBITVhfVVBHUkFERV9UQVNLX1BSSU9SSVRZLCBITVhfVVBHUkFERV9UQVNLX1NUQUNLX1NJWkUsICJVcGdyYWRlVGFzayIsIE5VTEwsICZzX3VsVXBncmFkZVRhc2tJZCwgMCk7DQotCWlmKCBlcnIgIT0gSE1YX09LICkNCi0Jew0KLQkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOw0KLQkJcmV0dXJuIEhNWF9FUlJPUjsNCi0JfQ0KLQ0KLQlITVhfVEFTS19TdGFydChzX3VsVXBncmFkZVRhc2tJZCk7DQotDQotCXVwZ3JhZGVfbXNnLmNvbW1hbmQgPSBITVhfVVBHUkFERV9GRVRDSDsNCi0JLyogdGhpcyBzaG91bGQgYmUgZnJlZWQgYXQgUmVjaWV2ZXIgKi8NCi0JdXBncmFkZV9tc2cuZmlsZV9wYXRoID0gc3RyZHVwKGZpbGUpOw0KLQ0KLQllcnIgPSBITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZ1cGdyYWRlX21zZywgc2l6ZW9mKEhNWF9VUEdSQURFX0NPTU1BTkRfdCksMCk7DQotCWlmKGVyciAhPSBITVhfT0spDQotCXsNCi0JCXByaW50ZiggIltITVhfVVBHUkFERV9TdGFydF0gSE1YX01TR19TZW5kIGVycm9yIDogZXJyIGlzIDB4JXhcbiIsIGVycik7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLS8qKg0KLSAqIEBiIEZ1bmN0aW9uIEBiIERlc2NyaXB0aW9uIDxicj4NCi0gKiBTdG9wIEh1bWF4IFVwZ3JhZGUgTW9kdWxlLiBldmVuIGl0IGNhbiBiZSBzdG9wZWQgd2hpbGUgaXQgaXMgUmVhZGluZyBvciBGbGFzaGluZy4gPGJyPg0KLSAqDQotICogQHJldHVybiAgIyAgMCA6IHN1Y2Nlc3MgPGJyPg0KLSAqICAgICAgICAgICMgIDEgOiBmYWlsZWQgPGJyPg0KLSAqDQotICovDQotaW50IEhNWF9VUEdSQURFX1N0b3Aodm9pZCkNCi17DQotCWludCBlcnI7DQotCUhNWF9VUEdSQURFX0NPTU1BTkRfdCB1cGdyYWRlX21zZzsNCi0JdXBncmFkZV9tc2cuY29tbWFuZCA9IEhNWF9VUEdSQURFX1NUT1A7DQotDQotCWVyciA9IEhNWF9NU0dfU2VuZFVyZ2VudChzX3VsVXBncmFkZU1lc3Nnc2VJZCwgJnVwZ3JhZGVfbXNnLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsNCi0JaWYoZXJyICE9IEhNWF9PSykNCi0Jew0KLQkJcHJpbnRmKCAiW0hNWF9VUEdSQURFX1N0b3BdIEhNWF9NU0dfU2VuZCBlcnJvciA6IGVyciBpcyAweCV4XG4iLCBlcnIpOw0KLQkJcmV0dXJuIEhNWF9FUlJPUjsNCi0JfQ0KLQ0KLQlITVhfVEFTS19TdG9wKHNfdWxVcGdyYWRlVGFza0lkKTsNCi0NCi0JZXJyID0gSE1YX1RBU0tfRGVzdHJveShzX3VsVXBncmFkZVRhc2tJZCk7DQotCWlmKCBlcnIgIT0gSE1YX09LICkNCi0Jew0KLQkJcHJpbnRmKCJbJXNdIFslZF0gRXJyb3IoMHgleCkgXG5cciIsX19GVU5DVElPTl9fLF9fTElORV9fLCBlcnIpOw0KLQkJcmV0dXJuIEhNWF9FUlJPUjsNCi0JfQ0KLQ0KLQllcnIgPSBITVhfTVNHX0Rlc3Ryb3koc191bFVwZ3JhZGVNZXNzZ3NlSWQpOw0KLQlpZihlcnIgIT0gSE1YX09LKQ0KLQl7DQotCQlwcmludGYoIlslc10gWyVkXSBFcnJvcigweCV4KSBcblxyIixfX0ZVTkNUSU9OX18sX19MSU5FX18sIGVycik7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLSNpZiAwDQotLyoqDQotICogQGIgRnVuY3Rpb24gQGIgRGVzY3JpcHRpb24gPGJyPg0KLSAqIFNwZWNpZnkgYSBmaWxlIHRvIHVwZ3JhZGUgPGJyPg0KLSAqDQotICogQHBhcmFtW2luXSBmaWxlIDogc3BlY2lmeSBmdWxsIGZpbGUgcGF0aC4NCi0gKg0KLSAqIEByZXR1cm4gICMgIDAgOiBzdWNjZXNzIDxicj4NCi0gKiAgICAgICAgICAjICAxIDogZmFpbGVkIDxicj4NCi0gKg0KLSAqLw0KLWludCBITVhfVVBHUkFERV9GZXRjaEZpbGVUb1VwZ3JhZGUodW5zaWduZWQgY2hhciAqIGZpbGUpDQotew0KLQlpbnQgbkVycjsNCi0JSE1YX1VQR1JBREVfQ09NTUFORF90IHVwZ3JhZGVfbXNnOw0KLQ0KLQlpZiAoIGZpbGUgPT0gTlVMTCApDQotCXsNCi0JCXByaW50ZigiWyVzXSBmaWxlIHBhdGggaXMgblVMTFxuIiwgX19GVU5DVElPTl9fKTsNCi0JfQ0KLQ0KLQl1cGdyYWRlX21zZy5jb21tYW5kID0gSE1YX1VQR1JBREVfRkVUQ0g7DQotCS8qIHRoaXMgc2hvdWxkIGJlIGZyZWVkIGF0IFJlY2lldmVyICovDQotCXVwZ3JhZGVfbXNnLmZpbGVfcGF0aCA9IHN0cmR1cChmaWxlKTsNCi0NCi0JcHJpbnRmKCJbJXNdIGZpbGUgcGF0aCBpcyAlc1xuIiwgX19GVU5DVElPTl9fLCB1cGdyYWRlX21zZy5maWxlX3BhdGgpOw0KLQ0KLQ0KLQluRXJyID0gSE1YX01TR19TZW5kVGltZW91dChzX3VsVXBncmFkZU1lc3Nnc2VJZCwgJnVwZ3JhZGVfbXNnLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSwwKTsNCi0JaWYobkVyciAhPSBITVhfT0spDQotCXsNCi0JCXByaW50ZiggIltITVhfVVBHUkFERV9GZXRjaEZpbGVUb1VwZ3JhZGVdIEhNWF9NU0dfU2VuZCBlcnJvciA6IGVyciBpcyAweCV4XG4iLCBuRXJyKTsNCi0JCXJldHVybiBITVhfRVJSOw0KLQl9DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLSNlbmRpZg0KLQ0KLXZvaWQgSE1YX1VQR1JBREVfQ2FsbF9DYWxsYmFjayhITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QgKiB1cGdyYWRlX3N0YXR1c19tc2cgKQ0KLXsNCi0JaWYgKCBnX2ZVcGdyYWRlU3RhdHVzQ2FsbGJhY2sgIT0gTlVMTCApDQotCXsNCi0JCWdfZlVwZ3JhZGVTdGF0dXNDYWxsYmFjayh1cGdyYWRlX3N0YXR1c19tc2cpOw0KLQl9DQotDQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXN0YXRpYyBITVhfVVBHUkFERV9FVkVOVF9lIFBfSE1YX1VQR1JBREVfRklMRSh1bnNpZ25lZCBjaGFyICogcGF0aCkNCi17DQotCUhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdCAqIHVwZ3JhZGVfc3RhdHVzX21zZzsNCi0JaW50IHJldDsNCi0JdXBncmFkZV9zdGF0dXNfbXNnID0gbWFsbG9jKHNpemVvZihITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QpKTsNCi0NCi0JcHJpbnRmICgiWyVzXSBcbiIsIF9fRlVOQ1RJT05fXyApOw0KLQ0KLQ0KLQlyZXQgPSBITVhfVVBHUkFERV9IREZfRG9fRmxhc2goIHBhdGggKTsNCi0JaWYgKCByZXQgIT0gSE1YX09LICkNCi0Jew0KLQkJcHJpbnRmICgiWyVzXSBITVhfVVBHUkFERV9IREZfRG9fRmxhc2ggcmV0ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCApOw0KLQkJdXBncmFkZV9zdGF0dXNfbXNnLT5ldmVudCA9IHJldDsNCi0JCUhNWF9VUEdSQURFX0NhbGxfQ2FsbGJhY2sodXBncmFkZV9zdGF0dXNfbXNnKTsNCi0JCXJldHVybiBITVhfVVBHUkFERV9GSUxFX05PVF9FWElTVDsNCi0JfQ0KLQ0KLQlmcmVlKHVwZ3JhZGVfc3RhdHVzX21zZyk7DQotCXJldHVybiBITVhfVVBHUkFERV9ET05FOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBQX0hNWF9VcGdyYWRlX1Rhc2sodm9pZCogcGFyYW0pDQotew0KLQlITVhfVVBHUkFERV9FVkVOVF9lIG5FcnI7DQotCWludCB1cGdyYWRlX2lzX2RvbmUgPSAwOw0KLQlITVhfVVBHUkFERV9DT01NQU5EX3QgcmVjaWV2ZWRfY29tbWFuZDsNCi0JdW5zaWduZWQgY2hhciAqIGZpbGVfcGF0aD1OVUxMOw0KLQlITVhfVVBHUkFERV9DT01NQU5EX3Qgc2VuZF9jb21tYW5kOw0KLQ0KLQlITVhfVVBHUkFERV9TVEFUVVNfTXNnX3QgKiB1cGdyYWRlX3N0YXR1c19tc2c7DQotCXVwZ3JhZGVfc3RhdHVzX21zZyA9IG1hbGxvYyhzaXplb2YodXBncmFkZV9zdGF0dXNfbXNnKSk7DQotDQotCXdoaWxlKDEpDQotCXsNCi0JCW5FcnIgPSBITVhfTVNHX1JlY2VpdmUoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZyZWNpZXZlZF9jb21tYW5kLCBzaXplb2YoSE1YX1VQR1JBREVfQ09NTUFORF90KSk7DQotCQlpZihuRXJyICE9IEhNWF9PSykNCi0JCXsNCi0JCQlwcmludGYgKCIlcyAoJWQpIEVycm9yPiAgRXJyb3IgVktfTVNHX1JlY2VpdmVUaW1lb3V0XG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJc3dpdGNoKCByZWNpZXZlZF9jb21tYW5kLmNvbW1hbmQpDQotCQkJew0KLQkJCQljYXNlIEhNWF9VUEdSQURFX1NUQVJUOg0KLQkJCQkJew0KLQkJCQkJCXByaW50ZigiWyVzXSBSZWNlaXZlIEhNWF9VUEdSQURFX1NUQVJUIGNvbW1hbmQgXG4iLF9fRlVOQ1RJT05fXyk7DQotDQotCQkJCQkJLyogRE8gVXBncmFkZSAuLi4uLi4uLiBoZXJlICovDQotCQkJCQkJbkVyciA9IFBfSE1YX1VQR1JBREVfRklMRShmaWxlX3BhdGgpOw0KLQ0KLQkJCQkJCXNlbmRfY29tbWFuZC5jb21tYW5kID0gSE1YX1VQR1JBREVfU1RPUDsNCi0JCQkJCQkodm9pZClITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZzZW5kX2NvbW1hbmQsIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQljYXNlIEhNWF9VUEdSQURFX1NUT1A6DQotCQkJCQl7DQotCQkJCQkJcHJpbnRmKCJbJXNdIEhNWF9VUEdSQURFX1NUT1AgXHJcbiIsX19GVU5DVElPTl9fKTsNCi0NCi0JCQkJCQlmcmVlKHVwZ3JhZGVfc3RhdHVzX21zZyk7DQotCQkJCQkJZnJlZShmaWxlX3BhdGgpOw0KLQ0KLQkJCQkJCS8qIE5vdGlmeSB0byBhcHAsIFVQZ3JlYWRlIGlzIGRvbmUuICovDQotCQkJCQkJdXBncmFkZV9zdGF0dXNfbXNnLT5ldmVudCA9IEhNWF9VUEdSQURFX0RPTkU7DQotCQkJCQkJSE1YX1VQR1JBREVfQ2FsbF9DYWxsYmFjayh1cGdyYWRlX3N0YXR1c19tc2cpOw0KLQ0KLQkJCQkJCS8qIFRBU0sga2lsbHMgaXRzZWxmLiAqLw0KLQkJCQkJCXJldHVybiAwOw0KLQkJCQkJfQ0KLQkJCQljYXNlIEhNWF9VUEdSQURFX0ZFVENIOg0KLQkJCQkJew0KLQkJCQkJCXByaW50ZigiWyVzXSBITVhfVVBHUkFERV9GRVRDSCBcclxuIixfX0ZVTkNUSU9OX18pOw0KLQkJCQkJCWZpbGVfcGF0aCA9IHN0cmR1cChyZWNpZXZlZF9jb21tYW5kLmZpbGVfcGF0aCk7DQotDQotCQkJCQkJcHJpbnRmKCJbJXNdIGZpbGUgcGF0aCA9ICVzIFxyXG4iLF9fRlVOQ1RJT05fXywgZmlsZV9wYXRoKTsNCi0NCi0JCQkJCQkvKiBjb21tYW5kIGZpbGVfcGF0aCBmcmVlICovDQotCQkJCQkJZnJlZShyZWNpZXZlZF9jb21tYW5kLmZpbGVfcGF0aCk7DQotDQotCQkJCQkJc2VuZF9jb21tYW5kLmNvbW1hbmQgPSBITVhfVVBHUkFERV9TVEFSVDsNCi0JCQkJCQkodm9pZClITVhfTVNHX1NlbmQoc191bFVwZ3JhZGVNZXNzZ3NlSWQsICZzZW5kX2NvbW1hbmQsIHNpemVvZihITVhfVVBHUkFERV9DT01NQU5EX3QpLDApOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQ0KLQkJCQlkZWZhdWx0Og0KLQkJCQkJcHJpbnRmKCJbJXNdIFJlY2VpdmUgVW5rbm93biBDb21tYW5kIFxyXG4iLF9fRlVOQ1RJT05fXyk7DQotCQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCX0NCi19DQotDQotLypAfSovDQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZS5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY2YzQ1Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZS5oICAkDQotICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQotICogT3JpZ2luYWwgQXV0aG9yOiBZYW5nIEh5dW4gVWsgJA0KLSAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkDQotICogRGF0ZToJCQkkRGF0ZTogMjAxMS4wOS4zMA0KLSAqIEZpbGUgRGVzY3JpcHRpb246CVVwZ3JhZGUgQVBJcw0KLSAqIE1vZHVsZToNCi0gKiBSZW1hcmtzOg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBkZWZncm91cCBVUEdSQURFIFVwZ3JhZGUgQVBJcw0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQotICogQGRhdGUgMzAgU2VwdCAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZS5oDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHB0aHJlYWQuaD4NCi0jaW5jbHVkZSA8ZXJybm8uaD4NCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+DQotI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPg0KLSNpbmNsdWRlIDx1bmlzdGQuaD4NCi0jaW5jbHVkZSA8ZmNudGwuaD4NCi0jaW5jbHVkZSAiaG14X3VwZ3JhZGVfc3lzdGVtLmgiDQotI2luY2x1ZGUgImhteF91cGdyYWRlX2ZsYXNoLmgiDQotLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIEV4dGVybiB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBFeHRlcm4gdmFyaWFibGVlICovDQotDQotLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm8gRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8NCi0vKiBFbmQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KLQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHR5cGVkZWYgKi8NCi0NCi10eXBlZGVmIGVudW0NCi17DQotCUhNWF9VUEdSQURFX1NUQVJULCAJCS8qKjwgKi8NCi0JSE1YX1VQR1JBREVfU1RPUCwgCQkvKio8ICAqLw0KLQlITVhfVVBHUkFERV9GRVRDSCwgCQkvKio8ICAqLw0KLX1ITVhfVVBHUkFERV9DT01NQU5EX2U7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotCUhNWF9VUEdSQURFX0NPTU1BTkRfZSBjb21tYW5kOw0KLQl1bnNpZ25lZCBjaGFyICogZmlsZV9wYXRoOw0KLX1ITVhfVVBHUkFERV9DT01NQU5EX3Q7DQotDQotLyoqDQotICogSE1YX1VQR1JBREUgU3RhdHVzIGNhc2VzLg0KLSAqLw0KLXR5cGVkZWYgZW51bQ0KLXsNCi0JSE1YX1VQR1JBREVfU1RBUlRFRCwgCQkJCQkJLyoqPCBVcGdyYWRlIE1vZHVsZSBpcyBqdXN0IHN0YXJ0ZWQgKi8NCi0JSE1YX1VQR1JBREVfR0VUX1ZFUlNJT04sIAkJCQkvKio8IHRoaXMgY29tZXMgd2l0aCB2ZXJzaW9uIGluZm9ybWF0aW9uICovDQotCUhNWF9VUEdSQURFX1JFQURJTkcsIAkJCQkJCS8qKjwgcmVhZGluZyBmaWxlLiBVcGdyYWRlIGlzIGluIHByb2dyZXNzLiAqLw0KLQlITVhfVVBHUkFERV9GTEFTSElORywgCQkJCQkvKio8IEZsYXNoaW5nLiBVcGdyYWRlIGlzIGluIHByb2dyZXNzLiAgKi8NCi0JSE1YX1VQR1JBREVfRE9ORSwgCQkJCQkJLyoqPCBVcGdyYWRlIGlzIGRvbmUgd2l0aG91dCBhbnkgZXJyb3IsIEFmdGVyIHRoaXMgbWVzc2FnZSwgVXBncmFkZSBtb2R1bGUgd2lsbCBiZSBkZXN0cm95IGl0c2VsZi4gKi8NCi0JSE1YX1VQR1JBREVfU1RPUEVEX0JZX1VTRVIsIAkJCQkvKio8IFVwZ3JhZGUgaXMgc3RvcHBlZCBieSB1c2VyLiBBZnRlciB0aGlzIG1lc3NhZ2UsIFVwZ3JhZGUgbW9kdWxlIHdpbGwgYmUgZGVzdHJveSBpdHNlbGYuICovDQotCUhNWF9VUEdSQURFX0ZBSUxFRCwgCQkJCQkJLyoqPCBVcGdyYWRlIGlzIGZhaWxlZCwgaXQgc2hvdWxkbid0IGhhcHBlbi4gQWZ0ZXIgdGhpcyBtZXNzYWdlLCBVcGdyYWRlIG1vZHVsZSB3aWxsIGJlIGRlc3Ryb3kgaXRzZWxmLiovDQotCUhNWF9VUEdSQURFX1ZFUlNJT05fRkFJTEVELCAJCQkJLyoqPCBVcGdyYWRlIGlzIGZhaWxlZCwgdmVyc2lvbiBwcm9ibGVtLiAqLw0KLQlITVhfVVBHUkFERV9GSUxFX05PVF9FWElTVCwgCQkJCS8qKjwgVXBncmFkZSBpcyBmYWlsZWQsIHRoZXJlIGlzIG5vIGZpbGUgZXhpc3QgICovDQotCUhNWF9VUEdSQURFX0ZJTEVfRk9STUFUX0VSUk9SLCAJCQkvKio8IFVwZ3JhZGUgaXMgZmFpbGVkLCBmaWxlIGlzIG5vdCBIREYgRm9ybWF0ICAgKi8NCi0NCi19SE1YX1VQR1JBREVfRVZFTlRfZTsNCi0NCi0NCi0vKioNCi0gKiBITVhfVVBHUkFERV9TdGF0dXNfTWVzc2FnZXMNCi0gKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0JSE1YX1VQR1JBREVfRVZFTlRfZSBldmVudDsJCS8qKjwgZXZlbnQgZnJvbSBVcGdyYWRlIG1vZHVsZSAqLw0KLQl1bnNpZ25lZCBpbnQgcGVyY2VudGFnZTsJCS8qKjwgcGVyY2VudGFnZSBwcm9ncmVzcyAqLw0KLQl1bnNpZ25lZCBpbnQgY3VycmVudF92ZXJzaW9uOwkJLyoqPCB2ZXJzaW9uIGN1cnJlbnQgKi8NCi0JdW5zaWduZWQgaW50IHZlcnNpb25fdG9fdXBncmFkZTsJCS8qKjwgdmVyc2lvbiB0byB1cGdyYWRlICovDQotfSBITVhfVVBHUkFERV9TVEFUVVNfTXNnX3Q7DQotDQotLyoqDQotICogIFByb3RvdHlwZSBvZiB1cGdyYWRlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uIDxicj4NCi0gKiAgQ2FsbGJhY2sgY2FuIGJlIGFkZGVkIGJ5IEhNWF9VUEdSQURFX1N0YXJ0IDxicj48YnI+DQotICogIEhNWF9VUEdSQURFX1JFQURJTkcsIEhNWF9VUEdSQURFX0ZMQVNISU5HIGV2ZW50cyBhbHdheXMgY29tZXMgd2l0aCB2YWx1ZSBvZiBwZXJjZW50YWdlLg0KLSAqLw0KLXR5cGVkZWYgdm9pZCAoKkhNWF9VcGdyYWRlRXZlbnRDYWxsYmFjaykgKEhNWF9VUEdSQURFX1NUQVRVU19Nc2dfdCAqIFVwZ3JhZGVTdGF0dXNNZXNzYWdlcyk7DQotDQotLyogRW5kIHR5cGVkZWYgKi8NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZSAqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLw0KLWV4dGVybiBITVhfVXBncmFkZUV2ZW50Q2FsbGJhY2sgZ19mVXBncmFkZVN0YXR1c0NhbGxiYWNrOw0KLS8qIEVuZCBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLw0KLQ0KLWludCBITVhfVVBHUkFERV9TdGFydCggSE1YX1VwZ3JhZGVFdmVudENhbGxiYWNrIGNhbGxiYWNrLCAgdW5zaWduZWQgY2hhciAqIGZpbGUpOw0KLWludCBITVhfVVBHUkFERV9TdG9wKCB2b2lkKTsNCi0NCi0vKkB9Ki8NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmMgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmMKaW5kZXggMjAwMjM3Ny4uMzJkYjc5MiAxMDA2NDQKLS0tIGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5jCisrKyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfZmxhc2guYwpAQCAtMSw0NDAgKzEsMjI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBGaWxlIE5hbWU6CQkkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9mbGFzaC5jICAkDQotICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQotICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCi0gKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMNCi0gKiBNb2R1bGU6DQotICogUmVtYXJrczoNCi0gKi8NCi0NCi0vKioNCi0gKiBAZGVmZ3JvdXAgVVBHUkFERV9GTEFTSCBGbGFzaGluZyBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQ0KLSAqIEBpbmdyb3VwIFVQR1JBREUNCi0gKg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQotICogQGRhdGUgMzAgU2VwdCAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZV9mbGFzaC5jDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotI2luY2x1ZGUgPGZjbnRsLmg+DQotI2luY2x1ZGUgPHVuaXN0ZC5oPg0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4NCi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+DQotI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPg0KLSNpbmNsdWRlICJobXhfdXBncmFkZV9mbGFzaC5oIg0KLS8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIEVuZCAjZGVmaW5lICovDQotLyogdGhpcyBpcyBmb3IgdGVzdCAqLw0KLSNkZWZpbmUgVEFSR0VUX0JPT1RfTE9BREVSX01URAkiL2Rldi9tdGRibG9jazAiDQotDQotI2RlZmluZSBUQVJHRVRfTlZSQU1fTVRECSIvZGV2L210ZGJsb2NrMSINCi0jZGVmaW5lIFRBUkdFVF9OVlJBTV9NVERDCSIvZGV2L210ZDEiDQotDQotLyogdGhpcyBpcyBmb3IgdGVzdCAqLw0KLSNkZWZpbmUgVEFSR0VUX0tFUk5FTF9NVEQJIi9kZXYvbXRkYmxvY2sxMCINCi0NCi0vKiB0aGlzIGlzIGZvciB0ZXN0IHViaSBtYXBwZWQgKi8NCi0jZGVmaW5lIFRBUkdFVF9ST09URlNfVUJJX01URAkiL2Rldi9tdGRibG9jazExIg0KLQ0KLQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHR5cGVkZWYgKi8NCi0vKiBFbmQgdHlwZWRlZiAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLw0KLWludCBsaWJ1cGdyYWRlX3ZlcmJvc2UgPSAxOw0KLS8qIEVuZCBnbG9iYWwgdmFyaWFibGUgKi8NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBzdGF0aWMgdmFyaWFibGUgKi8NCi1pbnQgZmRfa2VybmVsID0gMDsNCi1pbnQgZmRfcm9vdGZzID0gMDsNCi1pbnQgZmRfYm9vcmxvYWRlciA9IDA7DQotaW50IGZkX252cmFtID0gMDsNCi1pbnQgZmRfbnZyYW1fYyA9IC0xOw0KLQ0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCXNfRmxhc2hUb3RhbFNpemU7DQotc3RhdGljIHVuc2lnbmVkIGxvbmcJc19GbGFzaEJsb2NrU2l6ZTsNCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqc19CbG9ja0J1ZmY7DQotDQotLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLw0KLWludCBITVhfVVBHUkFERV9GbGFzaF9LZXJuZWwodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KLWludCBITVhfVVBHUkFERV9GbGFzaF9Sb290ZnModW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KLWludCBITVhfVVBHUkFERV9GbGFzaF9Cb290TG9hZGVyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsNCi0NCi0NCi0NCi11bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX0tlcm5lbF9NVEQodm9pZCkNCi17DQotCXJldHVybiBUQVJHRVRfS0VSTkVMX01URDsNCi19DQotDQotdW5zaWduZWQgY2hhciAqIEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKHZvaWQpDQotew0KLQlyZXR1cm4gVEFSR0VUX1JPT1RGU19VQklfTVREOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1pbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApDQotew0KLQlpbnQgcmV0Ow0KLQlzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KLQl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7DQotCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7DQotDQotCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCi0NCi0JLyogKi8NCi0JaWYgKCBmZF9udnJhbSA9PSAwICkNCi0Jew0KLQkJZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQotCQlpZiggZmRfbnZyYW0gPCAwICkNCi0JCXsNCi0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotCX0NCi0NCi0JaWYgKCBmZF9udnJhbV9jIDwgMCApDQotCXsNCi0JCWZkX252cmFtX2MgPSBvcGVuKFRBUkdFVF9OVlJBTV9NVERDLCAoT19SRFdSIHwgT19TWU5DKSApOw0KLQkJaWYoIGZkX252cmFtX2MgPCAwICkNCi0JCXsNCi0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotCX0NCi0NCi0JcmV0ID0gaW9jdGwoZmRfbnZyYW1fYywgTUVNR0VUSU5GTywodm9pZCAqKSZpbmZvKTsNCi0JaWYocmV0IDwgMCkNCi0Jew0KLQkJcHJpbnRmKCJjYW4ndCBnZXQgaW5mbyBkYXRhISAoJWQpXG4iLCByZXQpOw0KLQkJcmV0dXJuIC0xOw0KLQl9DQotDQotCXJlbWFpbl9zaXplID0gc2l6ZTsNCi0JbW92X29mZnNldCA9IG9mZnNldDsNCi0NCi0Jd2hpbGUocmVtYWluX3NpemUgPiAwKQ0KLQl7DQotCQkvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLw0KLQkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOw0KLQkJd3JpdGVfc2l6ZSAtPSAoKG1vdl9vZmZzZXQgKyBpbmZvLmVyYXNlc2l6ZSklaW5mby5lcmFzZXNpemUpOw0KLQ0KLQkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLw0KLQkJaWYoIHJlbWFpbl9zaXplIDwgd3JpdGVfc2l6ZSkNCi0JCXsNCi0JCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7DQotCQl9DQotDQotCQlpZiAobGlidXBncmFkZV92ZXJib3NlKSBwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOw0KLQ0KLQkJcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG1vdl9vZmZzZXQsIFNFRUtfU0VUKTsNCi0JCWlmKHJldCA8IDApDQotCQl7DQotCQkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0NCi0JCXJldCA9IHdyaXRlKGZkX252cmFtLCBkYXRhKyhtb3Zfb2Zmc2V0LW9mZnNldCksIHdyaXRlX3NpemUpOw0KLQkJaWYocmV0IDwgMCkNCi0JCXsNCi0JCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQotCQkJcmV0dXJuIC0xOw0KLQkJfQ0KLQ0KLQkJbW92X29mZnNldCArPSB3cml0ZV9zaXplOw0KLQkJcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IEhNWF9VUEdSQURFX05WUkFNX1JlYWQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApDQotew0KLQlpbnQgcmV0Ow0KLQlzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KLQl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7DQotCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7DQotDQotCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCi0NCi0JLyogKi8NCi0JaWYgKCBmZF9udnJhbSA9PSAwICkNCi0Jew0KLQkJZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQotCQlpZiggZmRfbnZyYW0gPCAwICkNCi0JCXsNCi0JCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotCX0NCi0NCi0NCi0JcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7DQotCWlmKHJldCA8IDApDQotCXsNCi0JCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQlyZXR1cm4gMDsNCi19DQotDQotDQotDQotaW50IEhNWF9VUEdSQURFX0ZsYXNoX0tlcm5lbCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCi17DQotCWludCByZXQ7DQotCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOw0KLQ0KLQlwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQotCS8qICovDQotCWlmICggZmRfa2VybmVsID09IDAgKQ0KLQl7DQotCQlmZF9rZXJuZWwgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9LZXJuZWxfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7DQotCQlpZiggZmRfa2VybmVsIDwgMCApDQotCQl7DQotCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOw0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXQgPSBsc2VlayhmZF9rZXJuZWwsIG9mZnNldCwgU0VFS19TRVQpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQlyZXQgPSB3cml0ZShmZF9rZXJuZWwsIGRhdGEsIHNpemUpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQotCQlyZXR1cm4gcmV0Ow0KLQl9DQotDQotCS8qIFJlYWQgYW5kIENvbXBhcmUgKi8NCi0JcmV0ID0gbHNlZWsoZmRfa2VybmVsLCBvZmZzZXQsIFNFRUtfU0VUKTsNCi0JaWYocmV0IDwgMCkNCi0Jew0KLQkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsNCi0JaWYgKGNvbV9idWYgPT0gTlVMTCApDQotCXsNCi0JCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JcmV0ID0gcmVhZChmZF9rZXJuZWwsIGNvbV9idWYsIHNpemUpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IHJlYWQgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApDQotCXsNCi0JCXByaW50ZigiV3JpdHRlbiBkYXRhIGlzIGRpZmZlcm5ldCEhIFxuIik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JZnJlZShjb21fYnVmKTsNCi0NCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLWludCBITVhfVVBHUkFERV9GbGFzaF9Cb290TG9hZGVyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKQ0KLXsNCi0JaW50IHJldDsNCi0Jc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsNCi0JdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOw0KLQl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOw0KLQ0KLQlwcmludGYgKCAiU0tJUCBCT09UIExPQURFUi4uLiBcbiIpOw0KLQlwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQotDQotCXJldHVybiAwOw0KLQ0KLQkvKiAqLw0KLQlpZiAoIGZkX2Jvb3Jsb2FkZXIgPT0gMCApDQotCXsNCi0JCWZkX2Jvb3Jsb2FkZXIgPSBvcGVuKFRBUkdFVF9CT09UX0xPQURFUl9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQotCQlpZiggZmRfYm9vcmxvYWRlciA8IDAgKQ0KLQkJew0KLQkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOw0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXQgPSBpb2N0bChmZF9ib29ybG9hZGVyLCBNRU1HRVRJTkZPLCh2b2lkICopJmluZm8pOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IGdldCBpbmZvIGRhdGEhICglZClcbiIsIHJldCk7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JcmVtYWluX3NpemUgPSBzaXplOw0KLQltb3Zfb2Zmc2V0ID0gb2Zmc2V0Ow0KLQ0KLQl3aGlsZShyZW1haW5fc2l6ZSA+IDApDQotCXsNCi0JCS8qIG9mZnNldMDMIGJsb2NrILPRvu68rbjpIL7Itci02S4uICovDQotCQl3cml0ZV9zaXplID0gaW5mby5lcmFzZXNpemU7DQotCQl3cml0ZV9zaXplIC09ICgobW92X29mZnNldCArIGluZm8uZXJhc2VzaXplKSVpbmZvLmVyYXNlc2l6ZSk7DQotDQotCQkvKiC4tsH2uLfAuiCzqrjTwfYguLjFrS4uICovDQotCQlpZiggcmVtYWluX3NpemUgPCB3cml0ZV9zaXplKQ0KLQkJew0KLQkJCXdyaXRlX3NpemUgPSByZW1haW5fc2l6ZTsNCi0JCX0NCi0NCi0JCXByaW50ZigiIHdyaXRlIDogb2Zmc2V0IC0gMHgleCwgc2l6ZSAlZFxuIiwgbW92X29mZnNldCwgd3JpdGVfc2l6ZSk7DQotDQotCQlyZXQgPSBsc2VlayhmZF9ib29ybG9hZGVyLCBtb3Zfb2Zmc2V0LCBTRUVLX1NFVCk7DQotCQlpZihyZXQgPCAwKQ0KLQkJew0KLQkJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotDQotCQlyZXQgPSB3cml0ZShmZF9ib29ybG9hZGVyLCBkYXRhKyhtb3Zfb2Zmc2V0LW9mZnNldCksIHdyaXRlX3NpemUpOw0KLQkJaWYocmV0IDwgMCkNCi0JCXsNCi0JCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQotCQkJcmV0dXJuIC0xOw0KLQkJfQ0KLQ0KLQkJbW92X29mZnNldCArPSB3cml0ZV9zaXplOw0KLQkJcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gMDsNCi19DQotDQotaW50IEhNWF9VUEdSQURFX0ZsYXNoX1Jvb3Rmcyh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCi17DQotCWludCByZXQ7DQotCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOw0KLQlwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQotDQotCS8qICovDQotCWlmICggZmRfcm9vdGZzID09IDAgKQ0KLQl7DQotCQlmZF9yb290ZnMgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7DQotCQlpZiggZmRfcm9vdGZzIDwgMCApDQotCQl7DQotCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOw0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXQgPSBsc2VlayhmZF9yb290ZnMsIG9mZnNldCwgU0VFS19TRVQpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQlyZXQgPSB3cml0ZShmZF9yb290ZnMsIGRhdGEsIHNpemUpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQotCQlyZXR1cm4gcmV0Ow0KLQl9DQotDQotCS8qIFJlYWQgYW5kIENvbXBhcmUgKi8NCi0JcmV0ID0gbHNlZWsoZmRfcm9vdGZzLCBvZmZzZXQsIFNFRUtfU0VUKTsNCi0JaWYocmV0IDwgMCkNCi0Jew0KLQkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsNCi0JaWYgKGNvbV9idWYgPT0gTlVMTCApDQotCXsNCi0JCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JcmV0ID0gcmVhZChmZF9yb290ZnMsIGNvbV9idWYsIHNpemUpOw0KLQlpZihyZXQgPCAwKQ0KLQl7DQotCQlwcmludGYoImNhbid0IHJlYWQgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApDQotCXsNCi0JCXByaW50ZigiV3JpdHRlbiBkYXRhIGlzIGRpZmZlcm5ldCEhIFxuIik7DQotCQlyZXR1cm4gLTE7DQotCX0NCi0NCi0JZnJlZShjb21fYnVmKTsNCi0NCi0JcmV0dXJuIDA7DQotDQotDQotfQ0KLQ0KLQ0KLQ0KLS8qQH0qLw0KKy8qIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEh1bWF4IENvLiwgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEh1bWF4IENvLiwgTHRkLiAoIkh1bWF4IikgaGVyZWJ5IHByb3ZpZGVzIHBlcm1pc3Npb24sIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkKKyAqIHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc291cmNlIGNvZGUsIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMKKyAqIHNvdXJjZSBjb2RlIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24gc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCBwZXJtaXNzaW9uIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSFVNQVggIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBQ0NVUkFDWSwgQ09NUExFVEVORVNTLAorICogQ1VSUkVOQ1ksIEFWQUlMQUJJTElUWSwgVElUTEUgT1IgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgSFVNQVggT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisgKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGUgdmlld3MgYW5kIGNvbmNsdXNpb24gY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcmUKKyAqIHRob3NlIG9mIHRoZSBhdXRob3JzIGFuZCBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIHJlcHJlc2VudGluZyBvZmZpY2lhbAorICogcG9saWNpZXMsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgb2YgSHVtYXguCisgKgorICogTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUgdGhpcworICogc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBIdW1heL9zIHNvZnR3YXJlIHByb3ZpZGVkIHVuZGVyIGEgbGljZW5zZQorICogb3RoZXIgdGhhbiB0aGUgYWJvdmUgbGljZW5zZSwgd2l0aG91dCBIdW1heCdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbiBjb25zZW50LgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGaWxlIE5hbWU6ICAgICAgICAgICAkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9mbGFzaC5jICAkCisgKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCisgKiBPcmlnaW5hbCBBdXRob3I6ICAgICBZYW5nIEh5dW4gVWsgJAorICogQ3VycmVudCBBdXRob3I6ICAgICAgJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJAorICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMDkuMzAKKyAqIEZpbGUgRGVzY3JpcHRpb246ICAgIEh1bWF4IFVwZ3JhZGUgQVBJcworICogTW9kdWxlOgorICogUmVtYXJrczoKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBVUEdSQURFX0ZMQVNIIEZsYXNoaW5nIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlCisgKiBAaW5ncm91cCBVUEdSQURFCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkKKyAqIEBkYXRlIDMwIFNlcHQgMjAxMQorICovCisKKyAvKkB7Ki8KKworLyoqCisgKiBAZmlsZSBobXhfdXBncmFkZV9mbGFzaC5jCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKy8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YXJ0ICNkZWZpbmUgKi8KKy8qIHRoaXMgaXMgZm9yIHRlc3QgKi8KKyNkZWZpbmUgVEFSR0VUX05WUkFNX01URCAgICAgICAgIi9kZXYvbXRkYmxvY2sxIgorI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREQyAgICAgICAiL2Rldi9tdGQxIgorLyogRW5kICNkZWZpbmUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgdHlwZWRlZiAqLworLyogRW5kIHR5cGVkZWYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8KK2ludCBsaWJ1cGdyYWRlX3ZlcmJvc2UgPSAxOworLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLworaW50IGZkX252cmFtID0gMDsKK2ludCBmZF9udnJhbV9jID0gLTE7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nICAgIHNfRmxhc2hUb3RhbFNpemU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBzX0ZsYXNoQmxvY2tTaXplOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNfQmxvY2tCdWZmOworLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplICkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOworICB1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOworCisgIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOworCisgIC8qICovCisgIGlmICggZmRfbnZyYW0gPT0gMCApIHsKKyAgICBmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKKyAgICBpZiggZmRfbnZyYW0gPCAwICkgeworICAgICAgcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaWYgKCBmZF9udnJhbV9jIDwgMCApIHsKKyAgICBmZF9udnJhbV9jID0gb3BlbihUQVJHRVRfTlZSQU1fTVREQywgKE9fUkRXUiB8IE9fU1lOQykgKTsKKyAgICBpZiggZmRfbnZyYW1fYyA8IDAgKSB7CisgICAgICBwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICByZXQgPSBpb2N0bChmZF9udnJhbV9jLCBNRU1HRVRJTkZPLCh2b2lkICopJmluZm8pOworICBpZihyZXQgPCAwKSB7CisgICAgcHJpbnRmKCJjYW4ndCBnZXQgaW5mbyBkYXRhISAoJWQpXG4iLCByZXQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJlbWFpbl9zaXplID0gc2l6ZTsKKyAgbW92X29mZnNldCA9IG9mZnNldDsKKworICB3aGlsZShyZW1haW5fc2l6ZSA+IDApIHsKKyAgICAvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLworICAgIHdyaXRlX3NpemUgPSBpbmZvLmVyYXNlc2l6ZTsKKyAgICB3cml0ZV9zaXplIC09ICgobW92X29mZnNldCArIGluZm8uZXJhc2VzaXplKSVpbmZvLmVyYXNlc2l6ZSk7CisKKyAgICAvKiC4tsH2uLfAuiCzqrjTwfYguLjFrS4uICovCisgICAgaWYoIHJlbWFpbl9zaXplIDwgd3JpdGVfc2l6ZSkgeworICAgICAgd3JpdGVfc2l6ZSA9IHJlbWFpbl9zaXplOworICAgIH0KKworICAgIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHsKKyAgICAgIHByaW50ZigiIHdyaXRlIDogb2Zmc2V0IC0gMHgleCwgc2l6ZSAlZFxuIiwgbW92X29mZnNldCwgd3JpdGVfc2l6ZSk7CisgICAgfQorCisgICAgcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG1vdl9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZihyZXQgPCAwKSB7CisgICAgICBwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0ID0gd3JpdGUoZmRfbnZyYW0sIGRhdGErKG1vdl9vZmZzZXQtb2Zmc2V0KSwgd3JpdGVfc2l6ZSk7CisgICAgaWYocmV0IDwgMCkgeworICAgICAgcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsKKyAgICByZW1haW5fc2l6ZSAtPSB3cml0ZV9zaXplOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplICkKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOworICB1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOworCisgIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOworCisgIC8qICovCisgIGlmICggZmRfbnZyYW0gPT0gMCApIHsKKyAgICBmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKKyAgICBpZiggZmRfbnZyYW0gPCAwICkgeworICAgICAgcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKworICByZXQgPSBsc2VlayhmZF9udnJhbSwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgIGlmKHJldCA8IDApIHsKKyAgICBwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7CisgIGlmKHJldCA8IDApIHsKKyAgICBwcmludGYoImNhbid0IHJlYWQgZGF0YSEgKCVkKVxuIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLypAfSovCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmggYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX2ZsYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NGYwNWIuLjAwMDAwMDAKLS0tIGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9mbGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guaCAgJA0KLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJA0KLSAqIE9yaWdpbmFsIEF1dGhvcjogWWFuZyBIeXVuIFVrICQNCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCi0gKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMNCi0gKiBNb2R1bGU6DQotICogUmVtYXJrczoNCi0gKi8NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KLSAqIEBkYXRlIDMwIFNlcHQgMjAxMQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBub3RlDQotICogQ29weXJpZ2h0IChDKSAyMDExIEh1bWF4IENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiA8YnI+DQotICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbg0KLSAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlDQotICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IGFwcGxpY2FibGUgbGljZW5zZQ0KLSAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4NCi0gKi8NCi0NCi0gLypAeyovDQotDQotLyoqDQotICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guaA0KLSAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8NCi0NCi0vKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8NCi0NCi0vKiBFbmQgRXh0ZXJuIHZhcmlhYmxlICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KLQ0KLS8qIEVuZCBNYWNybyBkZWZpbml0aW9uICovDQotDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgdHlwZWRlZiAqLw0KLQ0KLQ0KLS8qIEVuZCB0eXBlZGVmICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCi0NCi0vKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCi0NCi0vKkB9Ki8NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL2hteF91cGdyYWRlX252cmFtLmMgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX252cmFtLmMKaW5kZXggOTFjZjMzZi4uOWU4YmI1NyAxMDA2NDQKLS0tIGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5jCisrKyBiL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uYwpAQCAtMSwxMDk1ICsxLDEwMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX252cmFtLmMgICQNCi0gKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQNCi0gKiBPcmlnaW5hbCBBdXRob3I6CQlZYW5nIEh5dW4gVWsgJA0KLSAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkDQotICogRGF0ZToJCQkkRGF0ZTogMjAxMS4xMS4wNw0KLSAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcw0KLSAqIE1vZHVsZToNCi0gKiBSZW1hcmtzOg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBkZWZncm91cCBOVlJBTSBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQ0KLSAqIEBpbmdyb3VwIFVQR1JBREUNCi0gKi8NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KLSAqIEBkYXRlIDA3IE5vdiAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZV9udnJhbS5jDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotDQotI2luY2x1ZGUgImxpYl9xdWV1ZS5oIg0KLSNpbmNsdWRlICJobXhfdXBncmFkZV9udnJhbS5oIg0KLS8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgTlZSQU1fVFlQRV9MRU4JCQkxDQotI2RlZmluZSBOVlJBTV9SRUNPUkRfTEVOR19MRU4JNA0KLSNkZWZpbmUgTlZSQU1fTkFNRV9MRU5HX0xFTgkJMQ0KLSNkZWZpbmUgTlZSQU1fREFUQV9MRU5HX0xFTgkJNA0KLQ0KLSNkZWZpbmUgTUFYX05BTUVfTEVOCQkoMjU2KQ0KLSNkZWZpbmUgTUFYX0RBVEFfTEVOCQkoMjU2KjEwMjQpDQotI2RlZmluZSBNQVhfRklFTERfTEVOCQkoTUFYX0RBVEFfTEVOK01BWF9OQU1FX0xFTioyKQ0KLQ0KLSNkZWZpbmUgTlZSQU1fVExWX1RZUEVfRU5ECTB4MDANCi0jZGVmaW5lIE5WUkFNX1RMVl9UWVBFX0VOVgkweDAxDQotDQotI2RlZmluZSBnZXQ4Yml0KHEpICh1bnNpZ25lZCBjaGFyKSgocSlbMF0pDQotI2RlZmluZSBnZXQzMmJpdChxKSAodW5zaWduZWQgaW50KSgoKCoodW5zaWduZWQgY2hhciAqKShxKSkgPDwgMjQpIHwgKCooKHVuc2lnbmVkIGNoYXIgKikocSkrMSkgPDwgMTYpIHwgKCooKHVuc2lnbmVkIGNoYXIgKikocSkrMikgPDwgOCkgfCAoKigodW5zaWduZWQgY2hhciAqKShxKSszKSkgKQ0KLQ0KLSNkZWZpbmUgREVCVUdfRVJSKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgI2FyZ3MpDQotI2RlZmluZSBERUJVR19JTkZPKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgI2FyZ3MpDQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpDQotDQotI2RlZmluZSBNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RICTMyDQotDQotI2RlZmluZSBTRU1fR2V0KHgpCSh2b2lkKSh4KQ0KLSNkZWZpbmUgU0VNX1JlbGVhc2UoeCkJKHZvaWQpKHgpDQotDQotI2RlZmluZSBOVlJBTV9ST19PRkZTRVQJMHgwDQotI2RlZmluZSBOVlJBTV9ST19TSVpFCQkweDAwMTAwMDAwDQotI2RlZmluZSBOVlJBTV9SV19PRkZTRVQJKCBOVlJBTV9ST19PRkZTRVQgKyBOVlJBTV9ST19TSVpFICkNCi0jZGVmaW5lIE5WUkFNX1JXX1NJWkUJCTB4MDAwNDAwMDANCi0jZGVmaW5lIE5WUkFNX1JXQl9PRkZTRVQJKCBOVlJBTV9SV19PRkZTRVQgKyBOVlJBTV9SV19TSVpFKQ0KLSNkZWZpbmUgTlZSQU1fUldCX1NJWkUJCTB4MDAwMjAwMDANCi0jZGVmaW5lIFJBV19GU19PRkZTRVQJCSggTlZSQU1fUldCX09GRlNFVCArIE5WUkFNX1JXQl9TSVpFKQ0KLSNkZWZpbmUgUkFXX0ZTX1NJWkUJCTB4MDAwMjAwMDANCi0NCi0vKiBFbmQgI2RlZmluZSAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHR5cGVkZWYgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9FVk5WQVJfdHsNCi0gICAgcXVldWVfdCBxYjsNCi0JdW5zaWduZWQgaW50IHJlY0xlbjsNCi0JdW5zaWduZWQgY2hhciAqbmFtZTsNCi0JdW5zaWduZWQgY2hhciBuYW1lTGVuOw0KLQl1bnNpZ25lZCBjaGFyICp2YWx1ZTsNCi0JdW5zaWduZWQgaW50IHZhbHVlTGVuOw0KLX0gTlZSQU1fRVZOVkFSX1Q7DQotDQotDQotDQotdHlwZWRlZiBzdHJ1Y3QgSE1YX05WUkFNX01BUF90DQotew0KLQlOVlJBTV9GSUVMRF9UCQl0eXBlOw0KLQl1bnNpZ25lZCBjaGFyCQkJCQlzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOw0KLQlITVhfTlZSQU1fUEFSVElUSU9OX0UJc3RvcmVQYXJ0aXRpb247DQotCXVuc2lnbmVkIGludAkJCQkJZGVmYXVsdFNpemU7DQotfSBITVhfTlZSQU1fRklFTERfSU5GT19UOw0KLQ0KLUhNWF9OVlJBTV9GSUVMRF9JTkZPX1Qgc19udnJhbUZpZWxkSW5mb1tdID0NCi17DQotCXtOVlJBTV9GSUVMRF9TWVNURU1fSUQJCQkgLCAiU1lTVEVNX0lEIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KLQl7TlZSQU1fRklFTERfU0ZMQVNICQkJCSAsICJTRkxBU0giIAkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9TRVJJQUxfTk8gICAgICAgICAgICAsICJTRVJJQUxfTk8iICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9EVENQX0tFWSAgICAgICAgICAgICAsICJEVENQX0tFWSIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9DSV9QTFVTX0tFWSAgICAgICAgICAsICJDSV9QTFVTX0tFWSIgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9NQUNfQUREUiAgICAgICAgICAgICAsICJNQUNfQUREUiIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9IRENQX0tFWSAgICAgICAgICAgICAsICJIRENQX0tFWSIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9QQVJJTkdfREFUQSAgICAgICAgICAsICJQQVJJTkdfREFUQSIgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9DTV9TRVJJQUxfTk8gICAgICAgICAsICJDTV9TRVJJQUxfTk8iICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9DTV9NQUNfQUREUiAgICAgICAgICAsICJDTV9NQUNfQUREUiIgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9DTV9NQUNfQUREUl9BTk9USEVSICAsICJDTV9NQUNfQUREUl9BTk9USEVSIiAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9JUkRFVE9fQkJDQiAgICAgICAgICAsICJJUkRFVE9fQkJDQiIgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQiAJCSAsICJJUkRFVE9fQ1BDQiIJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9JUkRFVE9fQ1BDQl9FTkNSWVBURUQsICJJUkRFVE9fQ1BDQl9FTkNSWVBURUQiICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9QUklWQVRFICAgICAgICAgICAgICAsICJQUkFWQVRFIiAgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9DU0NfS0VZICAgICAgICAgICAgICAsICJDU0NfS0VZIiAgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF8xU1RfU0VSSUFMX05VTUJFUgkJCSwgIjFTVF9TRVJJQUxfTlVNQkVSIgkJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwNCi0Je05WUkFNX0ZJRUxEXzJORF9TRVJJQUxfTlVNQkVSCQkJLCAiMk5EX1NFUklBTF9OVU1CRVIiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KLQl7TlZSQU1fRklFTERfR1BOCQkJLCAiR1BOIgkJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwNCi0Je05WUkFNX0ZJRUxEX01BQ19BRERSX01PQ0EJCSwgIk1BQ19BRERSX01PQ0EiCSwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9NQUNfQUREUl9CVAkJLCAiTUFDX0FERFJfQlQiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LA0KLQl7TlZSQU1fRklFTERfR09PR0xFX1NTTF9QRU0JLCAiR09PR0xFX1NTTF9QRU0iCSwgSE1YX05WUkFNX1BBUlRJVElPTl9STywgMH0sDQotCXtOVlJBTV9GSUVMRF9HT09HTEVfU1NMX0NSVAksICJHT09HTEVfU1NMX0NSVCIJLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0xPQURFUl9WRVIJCQkgLCAiTE9BREVSX1ZFUiIgCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQVBQX1ZFUiAJCQkgLCAiQVBQX1ZFUiIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfTEFOR1VBR0UJCQkgLCAiTEFOR1VBR0UiICAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfVFZfU1RBTkRBUkQJCQkgLCAiVFZfU1RBTkRBUkQiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfU0NBUlRfUkdCCQkJICwgIlNDQVJUX1JHQiIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0hEX1JFU09VTFRJT04JCSAsICJIRF9SRVNPVUxUSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0ZJRUxEX1JBVEUJCSAgICAgLCAiRklFTERfUkFURSIJCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfT1RBX0ZMQUcxCQkJICwgIk9UQV9GTEFHMSIgCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX09UQV9GTEFHMgkJCSAsICJPVEFfRkxBRzIiIAkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9PVEFfRkxBRzMJCQkgLCAiT1RBX0ZMQUczIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfT1RBX1RZUEUxCQkJICwgIk9UQV9UWVBFMSIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfT1RBX1RZUEUyCQkJICwgIk9UQV9UWVBFMiIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfT1RBX1RZUEUzCQkJICwgIk9UQV9UWVBFMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQ0hfVFlQRTEgCQkJICwgIkNIX1RZUEUxIgkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9DSF9UWVBFMiAJCQkgLCAiQ0hfVFlQRTIiCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0NIX1RZUEUzIAkJCSAsICJDSF9UWVBFMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfVFVORVJfSUQxCQkJICwgIlRVTkVSX0lEMSIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfVFVORVJfSUQyCQkJICwgIlRVTkVSX0lEMiIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfVFVORVJfSUQzCQkJICwgIlRVTkVSX0lEMyIJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQU5URU5BX1BPV0VSMQkJICwgIkFOVEVOQV9QT1dFUjEiCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQU5URU5BX1BPV0VSMgkJICwgIkFOVEVOQV9QT1dFUjIiCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQU5URU5BX1BPV0VSMwkJICwgIkFOVEVOQV9QT1dFUjMiCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfRVNfUElEMQkJCQkgLCAiRVNfUElEMSIgCQkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0VTX1BJRDIJCQkJICwgIkVTX1BJRDIiIAkJCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9FU19QSUQzCQkJCSAsICJFU19QSUQzIiAJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfVFJBTlNBQ1RJT05fSUQxCQkgLCAiVFJBTlNBQ1RJT05fSUQxIiAJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMgkJICwgIlRSQU5TQUNUSU9OX0lEMiIgCSAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDMJCSAsICJUUkFOU0FDVElPTl9JRDMiICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9BUFBfVkVSU0lPTgkJCSAsICJBUFBfVkVSU0lPTiIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9PVEFMRFJfVkVSU0lPTgkJICwgIk9UQUxEUl9WRVJTSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0NVUl9PVEFJTUFHRV9WRVJTSU9OICwgIkNVUl9PVEFJTUFHRV9WRVJTSU9OIiAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX09BRF9WRVJTSU9OCQkJICwgIk9BRF9WRVJTSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX05FVF9JUF9DT05GSUcgCQkgLCAiTkVUX0lQX0NPTkZJRyIgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfTkVUX0lQX1NFVFRJTkcJCSAsICJORVRfSVBfU0VUVElORyIgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUJCSAsICJSQ1VfQ1VTVE9NX0NPREUiICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUyCSAsICJSQ1VfQ1VTVE9NX0NPREUyIiAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9QQU5FTF9ESVNQTEFZCQkgLCAiUEFORUxfRElTUExBWSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9QQU5FTF9ESU1NSU5HIAkJICwgIlBBTkVMX0RJTU1JTkciIAkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0FTUEVDVF9SQVRJTyAJCSAsICJBU1BFQ1RfUkFUSU8iIAkJICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0NPVU5UUllfQ09ERQkJICwgIkNPVU5UUllfQ09ERSIJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9VU0FHRV9JRAkJCSAsICJVU0FHRV9JRCIgICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9DSF9JTkZPX1MJCQkgLCAiQ0hfSU5GT19TIiAgICAgICAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfQ0hfSU5GT19UCQkJICwgIkNIX0lORk9fVCIgICAgICAgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0NIX0lORk9fQwkJCSAsICJDSF9JTkZPX0MiICAgICAgICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9PVEFfRlRQX0lORk8JCSAsICJGVFBfT1RBX0lORk8iCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfTkVUX1BPUlRBTF9JUAkJICwgIk5FVF9QT1JUQUxfSVAiCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfTkVUX0RPV05fUEFUSCAJCSAsICJORVRfRE9XTl9QQVRIIiAJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sDQotCXtOVlJBTV9GSUVMRF9MT0FERVJfVkVSU0lPTgkJICwgIkxPQURFUl9WRVJTSU9OIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX09TRF9ESVNQTEFZCQkJICwgIk9TRF9ESVNQTEFZIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTlVNLCAiQUNUSVZBVEVEX0tFUk5FTF9OVU0iCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfTVREX1RZUEVfRk9SX0tFUk5FTAkJCSAsICJNVERfVFlQRV9GT1JfS0VSTkVMIgkgICAgICAgLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwNCi0Je05WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRQkJLCAiQUNUSVZBVEVEX0tFUk5FTF9OQU1FIgksIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfRVhUUkFfS0VSTkVMX09QVAkJCSwgIkVYVFJBX0tFUk5FTF9PUFQiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQl7TlZSQU1fRklFTERfUExBVEZPUk1fTkFNRQkJCSwgIlBMQVRGT1JNX05BTUUiCQksIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LA0KLQ0KLQl7TlZSQU1fRklFTERfQklOOEsJCQkJICwgIkJJTjhLIgkJCQkgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB4MjAwMH0sDQotCXtOVlJBTV9GSUVMRF9SQVdGUwkJCQkgLCAiUkFXRlMiIAkJCSAgICAgICAsIEhNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGUywgUkFXX0ZTX1NJWkV9LA0KLQl7TlZSQU1fRklFTERfRFVNTVkgCQkJCSAsICJEVU1NWSIgCQkJICAgICAgICwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0NCi19Ow0KLQ0KLS8qIEVuZCB0eXBlZGVmICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovDQotc3RhdGljIHF1ZXVlX3Qgc19udnJhbV9lbnZ2YXJzW0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsNCi0JCQkJCQkJeyZzX252cmFtX2VudnZhcnNbMF0sJnNfbnZyYW1fZW52dmFyc1swXX0sDQotCQkJCQkJCXsmc19udnJhbV9lbnZ2YXJzWzFdLCZzX252cmFtX2VudnZhcnNbMV19LA0KLQkJCQkJCQl7JnNfbnZyYW1fZW52dmFyc1syXSwmc19udnJhbV9lbnZ2YXJzWzJdfSwNCi0JCQkJCQkJfTsNCi0NCi1zdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fb2Zmc2V0W0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsNCi0JCQkJCQkJTlZSQU1fUk9fT0ZGU0VULA0KLQkJCQkJCQlOVlJBTV9SV19PRkZTRVQsDQotCQkJCQkJCVJBV19GU19PRkZTRVQNCi0JCQkJCQkJfTsNCi0NCi1zdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fYmFja3VwX29mZnNldFtITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7DQotCQkJCQkJCTAsDQotCQkJCQkJCU5WUkFNX1JXQl9PRkZTRVQsDQotCQkJCQkJCTANCi0JCQkJCQkJfTsNCi0NCi1zdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fc2l6ZVtITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7DQotCQkJCQkJCU5WUkFNX1JPX1NJWkUsDQotCQkJCQkJCU5WUkFNX1JXX1NJWkUsDQotCQkJCQkJCVJBV19GU19TSVpFDQotCQkJCQkJCX07DQotDQotLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNfbnZyYW1TZW1hOw0KLQ0KLQ0KLS8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqMA0KLSAgICAqICBITVhfTlZSQU1fUmVhZChidWZmZXIsb2Zmc2V0LGxlbmd0aCkwDQotICAgICogIDANCi0gICAgKiAgUmVhZCBkYXRhIGZyb20gdGhlIE5WUkFNIGRldmljZTANCi0gICAgKg0KLSAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOg0KLSAgICAqICAJICAgYnVmZmVyIC0gZGVzdGluYXRpb24gYnVmZmVyDQotICAgICogIAkgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byByZWFkDQotICAgICogIAkgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZA0KLSAgICAqDQotICAgICogIFJldHVybiB2YWx1ZToNCi0gICAgKiAgCSAgIG51bWJlciBvZiBieXRlcyByZWFkLCBvciA8MCBpZiBlcnJvciBvY2N1cmVkDQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLXN0YXRpYyBpbnQgZHJ2X05WUkFNX1JlYWQodW5zaWduZWQgY2hhciAqYnVmZmVyLHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IGxlbmd0aCkNCi17DQotCURSVl9FcnJvcglkcnZfZXJyb3I7DQotDQotCWRydl9lcnJvciA9IEhNWF9VUEdSQURFX05WUkFNX1JlYWQob2Zmc2V0LCBidWZmZXIsIGxlbmd0aCk7DQotCWlmIChkcnZfZXJyb3IgIT0gMCkNCi0Jew0KLQkJcmV0dXJuIC0xOw0KLQl9DQotDQotCXJldHVybiBsZW5ndGg7DQotfQ0KLQ0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAgKiAgSE1YX05WUkFNX1dyaXRlKGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKQ0KLSAgICAqDQotICAgICogIFdyaXRlIGRhdGEgdG8gdGhlIE5WUkFNIGRldmljZQ0KLSAgICAqDQotICAgICogIElucHV0IHBhcmFtZXRlcnM6DQotICAgICogIAkgICBidWZmZXIgLSBzb3VyY2UgYnVmZmVyDQotICAgICogIAkgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byB3cml0ZQ0KLSAgICAqICAJICAgbGVuZ3RoIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlDQotICAgICoNCi0gICAgKiAgUmV0dXJuIHZhbHVlOg0KLSAgICAqICAJICAgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIC0xIGlmIGVycm9yIG9jY3VyZWQNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotc3RhdGljIGludCBkcnZfTlZSQU1fV3JpdGUodW5zaWduZWQgY2hhciAqYnVmZmVyLHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IGxlbmd0aCkNCi17DQotCURSVl9FcnJvcglkcnZfZXJyb3I7DQotDQotCWRydl9lcnJvciA9IEhNWF9VUEdSQURFX05WUkFNX1dyaXRlKG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpOw0KLQlpZiAoZHJ2X2Vycm9yICE9IDApDQotCXsNCi0JCXJldHVybiAtMTsNCi0JfQ0KLQ0KLQlyZXR1cm4gbGVuZ3RoOw0KLX0NCi0NCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICogIEhNWF9OVlJBTV9GaW5kRW52KG5hbWUpDQotICAgICoNCi0gICAgKiAgTG9jYXRlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBpbi1tZW1vcnkgbGlzdA0KLSAgICAqDQotICAgICogIElucHV0IHBhcmFtZXRlcnM6DQotICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiBlbnYgdmFyIHRvIGZpbmQNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICBOVlJBTV9FVk5WQVJfVCBwb2ludGVyLCBvciBOVUxMIGlmIG5vdCBmb3VuZA0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi0NCi1zdGF0aWMgTlZSQU1fRVZOVkFSX1QgKmRydl9OVlJBTV9GaW5kRW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpDQotew0KLSAgICBxdWV1ZV90ICpxYjsNCi0gICAgTlZSQU1fRVZOVkFSX1QgKmVudjsNCi0NCi0gICAgZm9yIChxYiA9IHNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLnFfbmV4dDsgcWIgIT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dOyBxYiA9IHFiLT5xX25leHQpDQotICAgIHsNCi0JCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsNCi0JCWlmIChzdHJjbXAoKGNoYXIqKWVudi0+bmFtZSwgKGNoYXIqKW5hbWUpID09IDApDQotCQkJYnJlYWs7DQotCX0NCi0NCi0gICAgaWYgKHFiID09ICZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSkNCi0gICAgCXJldHVybiBOVUxMOw0KLQ0KLSAgICByZXR1cm4gKE5WUkFNX0VWTlZBUl9UICopIHFiOw0KLQ0KLX0NCi0NCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICogIEhNWF9OVlJBTV9TY2FuRGlyKGlkeCxuYW1lLG5hbWVsZW4sdmFsLHZhbGxlbikNCi0gICAgKg0KLSAgICAqICBFbnVtZXJhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgVGhpcyByb3V0aW5lIGxvY2F0ZXMNCi0gICAgKiAgdGhlIG50aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgY29waWVzIGl0cyBuYW1lIGFuZCB2YWx1ZQ0KLSAgICAqICB0byB1c2VyIGJ1ZmZlcnMuDQotICAgICoNCi0gICAgKiAgVGhlIG5hbWVsZW4gYW5kIHZhbGxlbiB2YXJpYWJsZXMgbXVzdCBiZSBwcmVpbml0aWFsaXplZCB0bw0KLSAgICAqICB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLg0KLSAgICAqDQotICAgICogIElucHV0IHBhcmFtZXRlcnM6DQotICAgICogIAkgICBpZHggLSB2YXJpYWJsZSBpbmRleCB0byBmaW5kIChzdGFydGluZyB3aXRoIHplcm8pDQotICAgICogIAkgICBuYW1lLG5hbWVsZW4gLSBuYW1lIGJ1ZmZlciBhbmQgbGVuZ3RoDQotICAgICogIAkgICB2YWwsdmFsbGVuIC0gdmFsdWUgYnVmZmVyIGFuZCBsZW5ndGgNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICAwIGlmIG9rDQotICAgICogIAkgICBlbHNlIGVycm9yIGNvZGUNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgKm5hbWVsZW4sIHVuc2lnbmVkIGNoYXIgKnZhbCwgdW5zaWduZWQgaW50ICp2YWxsZW4pDQotew0KLQlxdWV1ZV90ICpxYjsNCi0JTlZSQU1fRVZOVkFSX1QgKmVudjsNCi0NCi0JZm9yIChxYiA9IHNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dLnFfbmV4dDsgcWIgIT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dOyBxYiA9IHFiLT5xX25leHQpIHsNCi0JCWlmIChpZHggPT0gMCkNCi0JCQlicmVhazsNCi0JCWlkeC0tOw0KLQl9DQotDQotCWlmIChxYiA9PSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0pDQotCXsNCi0JCXJldHVybiBEUlZfRVJSOw0KLQl9DQotCWVudiA9IChOVlJBTV9FVk5WQVJfVCAqKSBxYjsNCi0NCi0JaWYgKG5hbWUgIT0gTlVMTCkNCi0Jew0KLQkJc3RybmNweSgoY2hhciopbmFtZSwgKGNoYXIqKWVudi0+bmFtZSwgZW52LT5uYW1lTGVuKTsNCi0JCW5hbWVbZW52LT5uYW1lTGVuXSA9IDA7DQotCX0NCi0JKm5hbWVsZW4gPSBlbnYtPm5hbWVMZW47DQotCWlmICh2YWwgIT0gTlVMTCkNCi0Jew0KLQkJbWVtY3B5KHZhbCwgZW52LT52YWx1ZSwgZW52LT52YWx1ZUxlbik7DQotCX0NCi0JKnZhbGxlbiAgPSBlbnYtPnZhbHVlTGVuOw0KLQ0KLQlyZXR1cm4gRFJWX09LOw0KLX0NCi0NCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICogIEhNWF9OVlJBTV9EZWxldGUobmFtZSkNCi0gICAgKg0KLSAgICAqICBEZWxldGUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUNCi0gICAgKg0KLSAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOg0KLSAgICAqICAJICAgbmFtZSAtIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRlbGV0ZQ0KLSAgICAqDQotICAgICogIFJldHVybiB2YWx1ZToNCi0gICAgKiAgCSAgIDAgaWYgb2sNCi0gICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQ0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi0NCi1zdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9EZWxldGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkNCi17DQotICAgIE5WUkFNX0VWTlZBUl9UICplbnY7DQotDQotICAgIGVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQotICAgIGlmIChlbnYgPT0gTlVMTCkNCi0gICAgew0KLSAgICAJcmV0dXJuIERSVl9FUlI7DQotICAgIH0NCi0NCi0JcV9kZXF1ZXVlKChxdWV1ZV90ICopIGVudik7DQotCWZyZWUoZW52KTsNCi0JcmV0dXJuIERSVl9PSzsNCi19DQotDQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAqICBITVhfTlZSQU1fR2V0RW52KG5hbWUpDQotICAgICoNCi0gICAgKiAgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlDQotICAgICoNCi0gICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCi0gICAgKiAgCSAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0RW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgcmVhZExlbikNCi17DQotCU5WUkFNX0VWTlZBUl9UCSplbnY7DQotCXVuc2lnbmVkIGludAlsZW47DQotDQotCW1lbXNldCh2YWx1ZSwgMCwgcmVhZExlbik7DQotCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQotCWlmIChlbnYgIT0gTlVMTCkNCi0Jew0KLQkJaWYgKHJlYWRMZW4gPiBlbnYtPnZhbHVlTGVuIC0gb2Zmc2V0KQ0KLQkJCWxlbiA9IGVudi0+dmFsdWVMZW4gLSBvZmZzZXQ7DQotCQllbHNlDQotCQkJbGVuID0gcmVhZExlbjsNCi0NCi0JCW1lbWNweSh2YWx1ZSwgZW52LT52YWx1ZStvZmZzZXQsIGxlbik7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9PSzsNCi19DQotDQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAqICBITVhfTlZSQU1fR2V0TGVuZ3RoKG5hbWUpDQotICAgICoNCi0gICAgKiAgUmV0cmlldmUgdGhlIHZhbHVlIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlDQotICAgICoNCi0gICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCi0gICAgKiAgCSAgIG5hbWUgLSBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGZpbmQNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICB2YWx1ZSwgb3IgTlVMTCBpZiB2YXJpYWJsZSBpcyBub3QgZm91bmQNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0TGVuZ3RoKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCAqcExlbikNCi17DQotCU5WUkFNX0VWTlZBUl9UCSplbnY7DQotDQotCWVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7DQotCWlmIChlbnYgIT0gTlVMTCkNCi0Jew0KLQkJKnBMZW4gPSBlbnYtPnZhbHVlTGVuOw0KLQkJcmV0dXJuIERSVl9PSzsNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsNCi19DQotDQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAqICBITVhfTlZSQU1fU2V0RW52KG5hbWUsdmFsdWUsZmxhZ3MpDQotICAgICoNCi0gICAgKiAgU2V0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLSAgICAqDQotICAgICogIElucHV0IHBhcmFtZXRlcnM6DQotICAgICogIAkgICBuYW1lIC0gbmFtZSBvZiB2YXJpYWJsZQ0KLSAgICAqICAJICAgdmFsdWUgLSB2YWx1ZSBvZiB2YXJpYWJsZQ0KLSAgICAqICAJICAgZmxhZ3MgLSBmbGFncyBmb3IgdmFyaWFibGUgKEVOVl9GTEdfeHh4KQ0KLSAgICAqDQotICAgICogIFJldHVybiB2YWx1ZToNCi0gICAgKiAgCSAgIDAgaWYgb2sNCi0gICAgKiAgCSAgIGVsc2UgZXJyb3IgY29kZQ0KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi0NCi1zdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9TZXRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCB2YWx1ZUxlbikNCi17DQotCU5WUkFNX0VWTlZBUl9UICplbnY7DQotCXVuc2lnbmVkIGludCBuYW1lbGVuOw0KLQ0KLQllbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOw0KLQlpZiAoZW52KQ0KLQl7DQotCQlxX2RlcXVldWUoKHF1ZXVlX3QgKikgZW52KTsNCi0JCWZyZWUoZW52KTsNCi0JfQ0KLQ0KLQluYW1lbGVuID0gc3RybGVuKChjaGFyKiluYW1lKTsNCi0JZW52ID0gbWFsbG9jKHNpemVvZihOVlJBTV9FVk5WQVJfVCkgKyBuYW1lbGVuICsgMSArIHZhbHVlTGVuKTsNCi0JaWYgKCFlbnYpDQotCXsNCi0JCXJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOw0KLQl9DQotCWVudi0+bmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIChlbnYrMSk7DQotCWVudi0+dmFsdWUgPSBlbnYtPm5hbWUgKyBuYW1lbGVuICsgMTsNCi0JZW52LT5uYW1lTGVuID0gbmFtZWxlbjsNCi0JZW52LT52YWx1ZUxlbiA9IHZhbHVlTGVuOw0KLQllbnYtPnJlY0xlbiA9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZWxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKyB2YWx1ZUxlbik7DQotDQotCXN0cm5jcHkoKGNoYXIqKWVudi0+bmFtZSwgKGNoYXIqKW5hbWUsIG5hbWVsZW4pOw0KLQllbnYtPm5hbWVbbmFtZWxlbl0gPSAwOw0KLQltZW1jcHkoZW52LT52YWx1ZSwgdmFsdWUsIHZhbHVlTGVuKTsNCi0NCi0JcV9lbnF1ZXVlKCZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSwocXVldWVfdCAqKSBlbnYpOw0KLQ0KLQlyZXR1cm4gRFJWX09LOw0KLX0NCi0NCi0NCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICogIEhNWF9OVlJBTV9Mb2FkKCkNCi0gICAgKg0KLSAgICAqICBMb2FkIHRoZSBlbnZpcm9ubWVudCBmcm9tIHRoZSBOVlJBTSBkZXZpY2UuDQotICAgICoNCi0gICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCi0gICAgKiAgCSAgIG5vdGhpbmcNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICAwIGlmIG9rDQotICAgICogIAkgICBlbHNlIGVycm9yIGNvZGUNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotDQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBpbnQgYWRkcmVzcywgdW5zaWduZWQgaW50IHNpemUpDQotew0KLQl1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsNCi0JdW5zaWduZWQgY2hhciAqYnVmZmVyOw0KLQl1bnNpZ25lZCBjaGFyICpwdHI7DQotCXVuc2lnbmVkIGludCByZWNMZW47DQotCXVuc2lnbmVkIGludCByZWNUeXBlOw0KLQl1bnNpZ25lZCBpbnQgb2Zmc2V0Ow0KLQl1bnNpZ25lZCBpbnQgcmV0dmFsOw0KLQl1bnNpZ25lZCBjaGFyIGZpbGVOYW1lW01BWF9OQU1FX0xFTl07DQotCXVuc2lnbmVkIGNoYXIgbmFtZUxlbjsNCi0JdW5zaWduZWQgaW50IGRhdGFMZW47DQotDQotICAgIG52cmFtX3NpemUgPSBzaXplOw0KLSAgICBidWZmZXIgPSBtYWxsb2MoTUFYX0ZJRUxEX0xFTik7DQotICAgIGlmIChidWZmZXIgPT0gTlVMTCkNCi0gICAgew0KLSAgICAJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7DQotICAgIH0NCi0NCi0gICAgcHRyID0gYnVmZmVyOw0KLSAgICBvZmZzZXQgPSAwOw0KLQ0KLSAgICByZXR2YWwgPSBEUlZfT0s7DQotICAgIC8qIFJlYWQgdGhlIHJlY29yZCB0eXBlIGFuZCBsZW5ndGggKi8NCi0gICAgaWYgKGRydl9OVlJBTV9SZWFkKHB0cixvZmZzZXQrYWRkcmVzcyxOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pDQotICAgIHsNCi0JCXJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7DQotCQlnb3RvIGVycm9yOw0KLQl9DQotDQotICAgIHdoaWxlICgoKnB0ciAhPSBOVlJBTV9UTFZfVFlQRV9FTkQpICAmJiAobnZyYW1fc2l6ZSA+IE5WUkFNX1RZUEVfTEVOKSkNCi0gICAgew0KLQkJLyogQWRqdXN0IHBvaW50ZXIgZm9yIFRMViB0eXBlICovDQotCQlyZWNUeXBlID0gZ2V0OGJpdChwdHIpOw0KLQkJbnZyYW1fc2l6ZSAtPSBOVlJBTV9UWVBFX0xFTjsNCi0JCW9mZnNldCArPSBOVlJBTV9UWVBFX0xFTjsNCi0NCi0JCWlmIChyZWNUeXBlICE9IE5WUkFNX1RMVl9UWVBFX0VOVikNCi0JCXsNCi0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KLQkJCWdvdG8gZXJyb3I7DQotCQl9DQotDQotCQkvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSBhbmQgbGVuZ3RoIC0gMTYgYml0cywgTVNCIGZpcnN0ICovDQotCQlpZiAoZHJ2X05WUkFNX1JlYWQocHRyLCBvZmZzZXQrYWRkcmVzcywgTlZSQU1fUkVDT1JEX0xFTkdfTEVOKSAhPSBOVlJBTV9SRUNPUkRfTEVOR19MRU4pDQotCQl7DQotCQkJcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsNCi0JCQlnb3RvIGVycm9yOw0KLQkJfQ0KLQkJcmVjTGVuID0gZ2V0MzJiaXQocHRyKTsNCi0JCW52cmFtX3NpemUgLT0gTlZSQU1fUkVDT1JEX0xFTkdfTEVOOw0KLQkJb2Zmc2V0ICs9IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsNCi0NCi0JCWlmIChyZWNMZW4gPiBNQVhfRklFTERfTEVOKQ0KLQkJew0KLQkJCXJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047DQotCQkJZ290byBlcnJvcjsNCi0JCX0NCi0JCWlmIChyZWNMZW4gPiBudnJhbV9zaXplKQ0KLQkJew0KLQkJCXJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047DQotCQkJZ290byBlcnJvcjsgLyogc2hvdWxkIG5vdCBoYXBwZW4sIGJhZCBOVlJBTSAqLw0KLQkJfQ0KLQ0KLQkJLyogUmVhZCB0aGUgVExWIGRhdGEgKi8NCi0JCWlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MscmVjTGVuKSAhPSAoaW50KXJlY0xlbikNCi0JCXsNCi0JCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOw0KLQkJCWdvdG8gZXJyb3I7DQotCQl9DQotDQotCQluYW1lTGVuID0gZ2V0OGJpdChwdHIpOw0KLQkJcHRyICs9IE5WUkFNX05BTUVfTEVOR19MRU47DQotCQlpZiAobmFtZUxlbikNCi0JCXsNCi0JCSAgICBtZW1jcHkoZmlsZU5hbWUsIHB0ciwgbmFtZUxlbik7DQotCQl9DQotCQlmaWxlTmFtZVtuYW1lTGVuXSA9IDA7DQotCQlwdHIgKz0gbmFtZUxlbjsNCi0NCi0JCWRhdGFMZW4gPSBnZXQzMmJpdChwdHIpOw0KLQkJcHRyICs9IE5WUkFNX0RBVEFfTEVOR19MRU47DQotCQlpZiAoZGF0YUxlbiA+IE1BWF9EQVRBX0xFTikNCi0JCXsNCi0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KLQkJCWdvdG8gZXJyb3I7DQotCQl9DQotDQotCQlpZiAocmVjTGVuICE9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZUxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKyBkYXRhTGVuKSkNCi0JCXsNCi0JCQlyZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOw0KLQkJCWdvdG8gZXJyb3I7DQotCQl9DQotDQotCQlkcnZfTlZSQU1fU2V0RW52KHBhcnRpdGlvbiwgZmlsZU5hbWUsIHB0ciwgZGF0YUxlbik7DQotDQotCQludnJhbV9zaXplIC09ICh1bnNpZ25lZCBpbnQpcmVjTGVuOw0KLQkJb2Zmc2V0ICs9IHJlY0xlbjsNCi0NCi0JCS8qIFJlYWQgdGhlIG5leHQgcmVjb3JkIHR5cGUgKi8NCi0JCXB0ciA9IGJ1ZmZlcjsNCi0JCWlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MsIE5WUkFNX1RZUEVfTEVOKSAhPSBOVlJBTV9UWVBFX0xFTikNCi0JCXsNCi0JCQlyZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOw0KLQkJCWdvdG8gZXJyb3I7DQotCQl9DQotCX0NCi0NCi1lcnJvcjoNCi0gICAgZnJlZShidWZmZXIpOw0KLQ0KLSAgICByZXR1cm4gcmV0dmFsOw0KLQ0KLX0NCi0NCi1zdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9Mb2FkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24pDQotew0KLQlEUlZfRXJyb3IJZHJ2X2Vycm9yOw0KLQ0KLQlkcnZfZXJyb3IgID0gZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MocGFydGl0aW9uLCBzX252cmFtX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7DQotCWlmIChkcnZfZXJyb3IgIT0gRFJWX09LKQ0KLQl7DQotCQlERUJVR19FUlIoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgcGFydGl0aW9uICglZClcbiIsIGRydl9lcnJvciwgcGFydGl0aW9uKTsNCi0JCWlmIChzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSAhPSAwKQ0KLQkJew0KLQkJCWRydl9lcnJvciAgPSBkcnZfTlZSQU1fTG9hZEJ5QWRkcmVzcyhwYXJ0aXRpb24sIHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dLCBzX252cmFtX3NpemVbcGFydGl0aW9uXSk7DQotCQkJaWYgKGRydl9lcnJvciAhPSBEUlZfT0spDQotCQkJew0KLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fTG9hZF0gZXJyb3IoJWQpIGxvYWRpbmcgYmFja3VwIHBhcnRpdGlvbiAoJWQpXG4iLCBkcnZfZXJyb3IsIHBhcnRpdGlvbik7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCURFQlVHX0lORk8oIltITVhfTlZSQU1fTG9hZF0gbG9hZCBPSyBsb2FkaW5nIGJhY2t1cCBwYXJ0aXRpb24gKCVkKVxuIiwgcGFydGl0aW9uKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcmV0dXJuIGRydl9lcnJvcjsNCi19DQotDQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAqICBITVhfTlZSQU1fU2F2ZSgpDQotICAgICoNCi0gICAgKiAgV3JpdGUgdGhlIGVudmlyb25tZW50IHRvIHRoZSBOVlJBTSBkZXZpY2UuDQotICAgICoNCi0gICAgKiAgSW5wdXQgcGFyYW1ldGVyczoNCi0gICAgKiAgCSAgIG5vdGhpbmcNCi0gICAgKg0KLSAgICAqICBSZXR1cm4gdmFsdWU6DQotICAgICogIAkgICAwIGlmIG9rLCBlbHNlIGVycm9yIGNvZGUNCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2F2ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uKQ0KLXsNCi0gICAgdW5zaWduZWQgaW50IG52cmFtX3NpemU7DQotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsNCi0gICAgdW5zaWduZWQgY2hhciAqYnVmZmVyX2VuZDsNCi0gICAgdW5zaWduZWQgY2hhciAqcHRyOw0KLSAgICBxdWV1ZV90ICpxYjsNCi0gICAgTlZSQU1fRVZOVkFSX1QgKmVudjsNCi0gICAgdW5zaWduZWQgY2hhciBuYW1lbGVuOw0KLSAgICB1bnNpZ25lZCBpbnQgdmFsdWVsZW47DQotICAgIHVuc2lnbmVkIGludCByZWNMZW47DQotDQotICAgIG52cmFtX3NpemUgPSBzX252cmFtX3NpemVbcGFydGl0aW9uXTsNCi0gICAgYnVmZmVyID0gbWFsbG9jKG52cmFtX3NpemUpOw0KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpDQotICAgIHsNCi0gICAgCXJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOw0KLQl9DQotICAgIGJ1ZmZlcl9lbmQgPSBidWZmZXIgKyBudnJhbV9zaXplIC0gMTsNCi0NCi0gICAgcHRyID0gYnVmZmVyOw0KLQ0KLSAgICBmb3IgKHFiID0gc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0ucV9uZXh0OyBxYiAhPSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl07IHFiID0gcWItPnFfbmV4dCkNCi0gICAgew0KLQkJZW52ID0gKE5WUkFNX0VWTlZBUl9UICopIHFiOw0KLQ0KLQkJbmFtZWxlbiA9IGVudi0+bmFtZUxlbjsNCi0JCXZhbHVlbGVuID0gZW52LT52YWx1ZUxlbjsNCi0JCXJlY0xlbiA9IGVudi0+cmVjTGVuOw0KLQ0KLQkJaWYgKChwdHIgKyBOVlJBTV9UWVBFX0xFTiArIE5WUkFNX1JFQ09SRF9MRU5HX0xFTiArIHJlY0xlbikgPiBidWZmZXJfZW5kKQ0KLQkJew0KLQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJKnB0cisrID0gTlZSQU1fVExWX1RZUEVfRU5WOwkJLyogVExWIHJlY29yZCB0eXBlICovDQotDQotCQkqcHRyKysgPSAocmVjTGVuPj4yNCkgJiAweEZGOwkJCS8qIFRMViByZWNvcmQgbGVuZ3RoICovDQotCQkqcHRyKysgPSAocmVjTGVuPj4xNikgJiAweEZGOwkJCS8qIFRMViByZWNvcmQgbGVuZ3RoICovDQotCQkqcHRyKysgPSAocmVjTGVuPj44KSAmIDB4RkY7CQkJLyogVExWIHJlY29yZCBsZW5ndGggKi8NCi0JCSpwdHIrKyA9IChyZWNMZW4+PjApICYgMHhGRjsJCQkvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLw0KLQ0KLQkJKnB0cisrID0gKG5hbWVsZW4+PjApICYgMHhGRjsJCQkvKiBOQU1FIHJlY29yZCBsZW5ndGggKi8NCi0NCi0JCW1lbWNweShwdHIsIGVudi0+bmFtZSwgbmFtZWxlbik7CQkvKiBOQU1FIHJlY29yZCBkYXRhICovDQotCQlwdHIgKz0gbmFtZWxlbjsNCi0NCi0JCSpwdHIrKyA9ICh2YWx1ZWxlbj4+MjQpICYgMHhGRjsJCQkvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovDQotCQkqcHRyKysgPSAodmFsdWVsZW4+PjE2KSAmIDB4RkY7CQkJLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLw0KLQkJKnB0cisrID0gKHZhbHVlbGVuPj44KSAmIDB4RkY7CQkJLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLw0KLQkJKnB0cisrID0gKHZhbHVlbGVuPj4wKSAmIDB4RkY7CQkJLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLw0KLQ0KLQkJbWVtY3B5KHB0cixlbnYtPnZhbHVlLCB2YWx1ZWxlbik7DQotCQlwdHIgKz0gdmFsdWVsZW47DQotDQotCX0NCi0NCi0gICAgKnB0cisrID0gTlZSQU1fVExWX1RZUEVfRU5EOw0KLQ0KLSAgICBudnJhbV9zaXplID0gZHJ2X05WUkFNX1dyaXRlKGJ1ZmZlciwwK3NfbnZyYW1fb2Zmc2V0W3BhcnRpdGlvbl0scHRyLWJ1ZmZlcik7DQotCWlmIChzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSAhPSAwKQ0KLQl7DQotCQlkcnZfTlZSQU1fV3JpdGUoYnVmZmVyLDArc19udnJhbV9iYWNrdXBfb2Zmc2V0W3BhcnRpdGlvbl0scHRyLWJ1ZmZlcik7DQotCX0NCi0NCi0gICAgZnJlZShidWZmZXIpOw0KLQ0KLSAgICByZXR1cm4gKG52cmFtX3NpemUgPT0gKHVuc2lnbmVkIGludCkocHRyLWJ1ZmZlcikpID8gRFJWX09LIDogRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsNCi19DQotDQotc3RhdGljIHVuc2lnbmVkIGludCBOVlJBTV9TV0FQMzIodW5zaWduZWQgaW50IEEpDQotew0KLQlyZXR1cm4gKChBIDw8IDI0KSB8ICgoQSA8PCA4KSAmICAweEZGMDAwMCkgfCAoKEEgPj4gOCkgJiAgMHhGRjAwKSB8KEEgPj4gMjQpKTsNCi19DQotDQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc19udnJhbVNlbWE7DQotDQotc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGNvbnN0IE5WUkFNX0ZJRUxEX1QgdHlwZSwgSE1YX05WUkFNX1BBUlRJVElPTl9FICpwUGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwc3pGaWxlTmFtZSwgdW5zaWduZWQgaW50ICpkZWZhdWx0U2l6ZSkNCi17DQotCWludAlpOw0KLQ0KLQlTRU1fR2V0KHNfbnZyYW1TZW1hKTsNCi0JZm9yIChpPTA7O2krKykNCi0Jew0KLQkJaWYgKE5WUkFNX0ZJRUxEX0RVTU1ZID09IHNfbnZyYW1GaWVsZEluZm9baV0udHlwZSkNCi0JCQlicmVhazsNCi0JCWlmICh0eXBlICE9IHNfbnZyYW1GaWVsZEluZm9baV0udHlwZSkNCi0JCQljb250aW51ZTsNCi0JCXN0cm5jcHkoKGNoYXIqKXBzekZpbGVOYW1lLCAoY2hhciopKHNfbnZyYW1GaWVsZEluZm9baV0uc3pGaWxlTmFtZSksIE1BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEgpOw0KLQkJKnBQYXJ0aXRpb24gPSBzX252cmFtRmllbGRJbmZvW2ldLnN0b3JlUGFydGl0aW9uOw0KLQkJKmRlZmF1bHRTaXplID0gc19udnJhbUZpZWxkSW5mb1tpXS5kZWZhdWx0U2l6ZTsNCi0JCVNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsNCi0JCXJldHVybiBEUlZfT0s7DQotCX0NCi0JU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KLQlyZXR1cm4gMTsNCi19DQotDQotDQotRFJWX0Vycm9yCUhNWF9OVlJBTV9Jbml0KHZvaWQpDQotew0KLQlkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JPKTsNCi0JZHJ2X05WUkFNX0xvYWQoSE1YX05WUkFNX1BBUlRJVElPTl9SVyk7DQotCXJldHVybiBEUlZfT0s7DQotfQ0KLQ0KLURSVl9FcnJvcglITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSkNCi17DQotCURSVl9FcnJvcglkcnZfZXJyb3I7DQotDQotCVVOVVNFRChvZmZzZXQpOw0KLQ0KLQlTRU1fR2V0KHNfbnZyYW1TZW1hKTsNCi0JZHJ2X2Vycm9yID0gZHJ2X05WUkFNX1NldEVudihwYXJ0aXRpb24sIHBOYW1lLCBwVmFsdWUsIHVsU2l6ZSk7DQotCWRydl9lcnJvciA9IGRydl9OVlJBTV9TYXZlKHBhcnRpdGlvbik7DQotCVNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsNCi0JcmV0dXJuIGRydl9lcnJvcjsNCi19DQotDQotRFJWX0Vycm9yCUhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpDQotew0KLQlEUlZfRXJyb3IJZHJ2X2Vycm9yOw0KLQ0KLQlTRU1fR2V0KHNfbnZyYW1TZW1hKTsNCi0JbWVtc2V0KHBWYWx1ZSwgMCwgdWxTaXplKTsNCi0JZHJ2X2Vycm9yID0gZHJ2X05WUkFNX0dldEVudihwYXJ0aXRpb24sIHBOYW1lLCBvZmZzZXQsIHBWYWx1ZSwgdWxTaXplKTsNCi0JU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KLQlyZXR1cm4gZHJ2X2Vycm9yOw0KLX0NCi0NCi1EUlZfRXJyb3IgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpDQotew0KLQlEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7DQotCXVuc2lnbmVkIGNoYXIJCXN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07DQotCUhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb247DQotCWludAkJCQkJbnZyYW1IYW5kbGU7DQotCXVuc2lnbmVkIGludAkJCQlkZWZhdWx0U2l6ZTsNCi0NCi0JaWYoIGRhdGEgPT0gTlVMTCB8fCBmaWVsZCA9PSBOVlJBTV9GSUVMRF9EVU1NWSApDQotCXsNCi0JCXJldHVybiAyOw0KLQl9DQotDQotCWVyckNvZGUgPSBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGZpZWxkLCAmcGFydGl0aW9uLCBzekZpbGVOYW1lLCAmZGVmYXVsdFNpemUpOw0KLQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQotCXsNCi0JCURFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gZmllbGQoJWQpIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX0dldEZpZWxkSW5mb1xuIiwgZmllbGQsIGVyckNvZGUpOw0KLQkJcmV0dXJuIGVyckNvZGU7DQotCX0NCi0NCi0Jc3dpdGNoIChwYXJ0aXRpb24pDQotCXsNCi0JY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMgOg0KLQkJYnJlYWs7DQotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9STyA6DQotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9SVyA6DQotCQlpZiAoZGVmYXVsdFNpemUgPT0gMCkNCi0JCXsNCi0JCQllcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCBvZmZzZXQsIGRhdGEsIG5EYXRhU2l6ZSk7DQotCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KLQkJCXsNCi0JCQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fUmVhZFxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOw0KLQkJCQlyZXR1cm4gZXJyQ29kZTsNCi0JCQl9DQotCQkJaWYgKGZpZWxkID09IE5WUkFNX0ZJRUxEX1NZU1RFTV9JRCAmJiBlcnJDb2RlID09IDApDQotCQkJew0KLQkJCQkqKCh1bnNpZ25lZCBpbnQqKWRhdGEpID0gTlZSQU1fU1dBUDMyKCh1bnNpZ25lZCBpbnQpKih1bnNpZ25lZCBpbnQqKWRhdGEpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl1bnNpZ25lZCBjaGFyICpwQnVmOw0KLQ0KLQkJCXBCdWYgPSBtYWxsb2MoZGVmYXVsdFNpemUpOw0KLQkJCWlmIChwQnVmID09IE5VTEwpDQotCQkJew0KLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIG1hbGxvY1xuIik7DQotCQkJCXJldHVybiAzOw0KLQkJCX0NCi0JCQllcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7DQotCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KLQkJCXsNCi0JCQkJbWVtc2V0KHBCdWYsIDAsIGRlZmF1bHRTaXplKTsNCi0JCQl9DQotCQkJbWVtY3B5KGRhdGEsIHBCdWYgKyBvZmZzZXQsIG5EYXRhU2l6ZSk7DQotCQkJZnJlZShwQnVmKTsNCi0JCX0NCi0JCWJyZWFrOw0KLQlkZWZhdWx0IDoNCi0JCURFQlVHX0VSUigiW0hNWF9OVlJBTV9HZXRGaWVsZF0gRElfRVJSX0lOVkFMSURfUEFSQU0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7DQotCQlyZXR1cm4gMjsNCi0JfQ0KLQ0KLQlyZXR1cm4gZXJyQ29kZTsNCi19DQotDQotRFJWX0Vycm9yIEhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKQ0KLXsNCi0JRFJWX0Vycm9yIGVyckNvZGUgPSBEUlZfRVJSOw0KLQl1bnNpZ25lZCBjaGFyCQlzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOw0KLQlITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOw0KLQlpbnQJCQkJCW52cmFtSGFuZGxlOw0KLQl1bnNpZ25lZCBpbnQJCQkJZGVmYXVsdFNpemU7DQotCXVuc2lnbmVkIGNoYXIJCQkJKnBCdWY7DQotCXVuc2lnbmVkIGludAkJCQlzeXN0ZW1JZDsNCi0NCi0JaWYoIGRhdGEgPT0gTlVMTCB8fCBmaWVsZCA9PSBOVlJBTV9GSUVMRF9EVU1NWSApDQotCXsNCi0JCXJldHVybiAyOw0KLQl9DQotDQotCXBCdWYgPSBtYWxsb2MobkRhdGFTaXplKTsNCi0JaWYgKHBCdWYgPT0gTlVMTCkNCi0Jew0KLQkJcmV0dXJuIDU7DQotCX0NCi0NCi0JZXJyQ29kZSA9IEhNWF9OVlJBTV9HZXRGaWVsZChmaWVsZCwgb2Zmc2V0LCBwQnVmLCBuRGF0YVNpemUpOw0KLQlpZiAoZXJyQ29kZSA9PSBEUlZfT0spDQotCXsNCi0JCWlmIChtZW1jbXAocEJ1ZiwgZGF0YSwgbkRhdGFTaXplKSA9PSAwKQ0KLQkJew0KLQkJCWZyZWUocEJ1Zik7DQotCQkJcmV0dXJuIDA7DQotCQl9DQotCX0NCi0JZnJlZShwQnVmKTsNCi0NCi0JZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRGaWVsZEluZm8oZmllbGQsICZwYXJ0aXRpb24sIHN6RmlsZU5hbWUsICZkZWZhdWx0U2l6ZSk7DQotCWlmIChlcnJDb2RlICE9IERSVl9PSykNCi0Jew0KLQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sIGZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsNCi0JCXJldHVybiBlcnJDb2RlOw0KLQl9DQotDQotCXN3aXRjaCAocGFydGl0aW9uKQ0KLQl7DQotCWNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTIDoNCi0JCWVyckNvZGUgPSBEUlZfTkFOREZMQVNIX0dldE52cmFtSGFuZGxlKCZudnJhbUhhbmRsZSk7DQotCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQotCQl7DQotCQkJcmV0dXJuIGVyckNvZGU7DQotCQl9DQotDQotCQllcnJDb2RlID0gRFJWX0ZMQVNIX1dyaXRlKHNfbnZyYW1fb2Zmc2V0W0hNWF9OVlJBTV9QQVJUSVRJT05fV19SQVdGU10gKyBvZmZzZXQsIGRhdGEsIG5EYXRhU2l6ZSk7DQotCQlpZiAoZXJyQ29kZSAhPSBEUlZfT0spDQotCQl7DQotCQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBmaWVsZCglZCktJXMgZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fV3JpdGVcbiIsIGZpZWxkLCBzekZpbGVOYW1lLCBlcnJDb2RlKTsNCi0JCQlyZXR1cm4gZXJyQ29kZTsNCi0JCX0NCi0JCWJyZWFrOw0KLQljYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8gOg0KLQljYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcgOg0KLQkJaWYgKGRlZmF1bHRTaXplID09IDApDQotCQl7DQotCQkJaWYgKGZpZWxkID09IE5WUkFNX0ZJRUxEX1NZU1RFTV9JRCAmJiBlcnJDb2RlID09IDApDQotCQkJew0KLQkJCQlzeXN0ZW1JZCA9IE5WUkFNX1NXQVAzMigodW5zaWduZWQgaW50KSoodW5zaWduZWQgaW50KilkYXRhKTsNCi0JCQkJZGF0YSA9ICh2b2lkKikmc3lzdGVtSWQ7DQotCQkJfQ0KLQkJCWVyckNvZGUgPSBITVhfTlZSQU1fV3JpdGUocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBkYXRhLCBuRGF0YVNpemUpOw0KLQkJCWlmIChlcnJDb2RlICE9IERSVl9PSykNCi0JCQl7DQotCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7DQotCQkJCXJldHVybiBlcnJDb2RlOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl1bnNpZ25lZCBjaGFyICpwQnVmOw0KLQ0KLQkJCXBCdWYgPSBtYWxsb2MoZGVmYXVsdFNpemUpOw0KLQkJCWlmIChwQnVmID09IE5VTEwpDQotCQkJew0KLQkJCQlERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIG1hbGxvY1xuIik7DQotCQkJCXJldHVybiAzOw0KLQkJCX0NCi0JCQllcnJDb2RlID0gSE1YX05WUkFNX1JlYWQocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7DQotCQkJaWYgKGVyckNvZGUgIT0gRFJWX09LKQ0KLQkJCXsNCi0JCQkJbWVtc2V0KHBCdWYsIDAsIGRlZmF1bHRTaXplKTsNCi0JCQl9DQotCQkJbWVtY3B5KHBCdWYgKyBvZmZzZXQsIGRhdGEsIG5EYXRhU2l6ZSk7DQotDQotCQkJZXJyQ29kZSA9IEhNWF9OVlJBTV9Xcml0ZShwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIHBCdWYsIGRlZmF1bHRTaXplKTsNCi0JCQlmcmVlKHBCdWYpOw0KLQkJCWlmIChlcnJDb2RlICE9IERSVl9PSykNCi0JCQl7DQotCQkJCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7DQotCQkJCXJldHVybiBlcnJDb2RlOw0KLQkJCX0NCi0JCX0NCi0JCWJyZWFrOw0KLQlkZWZhdWx0IDoNCi0JCURFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gRElfRVJSX0lOVkFMSURfUEFSQU0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7DQotCQlyZXR1cm4gMTsNCi0JfQ0KLQ0KLQlyZXR1cm4gZXJyQ29kZTsNCi19DQotDQotRFJWX0Vycm9yIEhNWF9OVlJBTV9HZXRMZW5ndGgoTlZSQU1fRklFTERfVCBmaWVsZCwgaW50ICpwTGVuKQ0KLXsNCi0JRFJWX0Vycm9yIGVyckNvZGUgPSBEUlZfRVJSOw0KLQl1bnNpZ25lZCBjaGFyCQlzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOw0KLQlITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOw0KLQlpbnQJCQkJCW52cmFtSGFuZGxlOw0KLQl1bnNpZ25lZCBpbnQJCQkJZGVmYXVsdFNpemU7DQotCXVuc2lnbmVkIGNoYXIJCQkJKnBCdWY7DQotDQotCWlmKCBwTGVuID09IE5VTEwpDQotCXsNCi0JCXJldHVybiAyOw0KLQl9DQotDQotCSpwTGVuID0gMDsNCi0NCi0JZXJyQ29kZSA9IGRydl9OVlJBTV9HZXRGaWVsZEluZm8oZmllbGQsICZwYXJ0aXRpb24sIHN6RmlsZU5hbWUsICZkZWZhdWx0U2l6ZSk7DQotCWlmIChlcnJDb2RlICE9IERSVl9PSykNCi0Jew0KLQkJREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldExlbmd0aF0gZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fR2V0RmllbGRJbmZvLCBmaWVsZCAoJWQpXG4iLCBlcnJDb2RlLCBmaWVsZCk7DQotCQlyZXR1cm4gZXJyQ29kZTsNCi0JfQ0KLQ0KLQllcnJDb2RlID0gZHJ2X05WUkFNX0dldExlbmd0aChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIHBMZW4pOw0KLQ0KLQlyZXR1cm4gRFJWX09LOw0KLX0NCi0NCi1EUlZfRXJyb3IJSE1YX05WUkFNX1JlbW92ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLCB1bnNpZ25lZCBjaGFyICpwTmFtZSkNCi17DQotCWludAlyZXN1bHQ7DQotDQotCVNFTV9HZXQoc19udnJhbVNlbWEpOw0KLQlyZXN1bHQgPSBkcnZfTlZSQU1fRGVsZXRlKHBhcnRpdGlvbiwgcE5hbWUpOw0KLQlpZiAocmVzdWx0ID09IDApDQotCXsNCi0JCXJlc3VsdCA9IGRydl9OVlJBTV9TYXZlKHBhcnRpdGlvbik7DQotCX0NCi0JU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi1EUlZfRXJyb3IgSE1YX05WUkFNX0R1bXAodW5zaWduZWQgY2hhciogcHVjQnVmZmVyLCB1bnNpZ25lZCBpbnQgdWlMZW4sIHVuc2lnbmVkIGludCB1aUFsaWduKQ0KLXsNCi0JdW5zaWduZWQgaW50IHVpSW5kZXg7DQotCXVuc2lnbmVkIGludCBza2lwOw0KLQ0KLQlza2lwID0gMTsNCi0JZm9yICh1aUluZGV4PTAgOyB1aUluZGV4PHVpTGVuIDsgdWlJbmRleCsrKQ0KLQl7DQotCQlpZiAodWlBbGlnbiE9MCAmJiAodWlJbmRleCV1aUFsaWduKT09MCkNCi0JCXsNCi0JCQlpZiAoc2tpcCA9PSAwKQ0KLQkJCXsNCi0JCQkJcHJpbnRmKCJcbiIpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJCXNraXAgPSAwOw0KLQkJfQ0KLQkJcHJpbnRmKCIlMDJYICIsICoocHVjQnVmZmVyK3VpSW5kZXgpKTsNCi0JfQ0KLQlwcmludGYoIlxuIik7DQotCXJldHVybiBEUlZfT0s7DQotfQ0KLQ0KLURSVl9FcnJvciBITVhfTlZSQU1fRGlyKHZvaWQpDQotew0KLSAgICBjaGFyIG5hbWVbODBdOw0KLSAgICBjaGFyICp2YWx1ZTsNCi0gICAgaW50IG5hbWVMZW4sIHZhbHVlTGVuOw0KLSAgICBpbnQgaWR4Ow0KLQ0KLQl2YWx1ZSA9IG1hbGxvYyhNQVhfREFUQV9MRU4pOw0KLQlpZiAodmFsdWUgPT0gTlVMTCkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7DQotCX0NCi0NCi0JU0VNX0dldChzX252cmFtU2VtYSk7DQotDQotICAgIHByaW50ZigiUk9NIE5hbWUgICAgICAgIFZhbHVlXG4iKTsNCi0gICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7DQotDQotICAgIGZvciAoaWR4PTA7O2lkeCsrKQ0KLQl7DQotCQlpZiAoZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9STywgaWR4LCAodW5zaWduZWQgY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCopJm5hbWVMZW4sICh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgKHVuc2lnbmVkIGludCopJnZhbHVlTGVuKSAhPSBEUlZfT0spDQotCQkJYnJlYWs7DQotCQlwcmludGYoIiUyMHMgIiwgbmFtZSk7DQotCQkodm9pZClITVhfTlZSQU1fRHVtcCgodW5zaWduZWQgY2hhciopdmFsdWUsIHZhbHVlTGVuLCAxNik7DQotCX0NCi0gICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7DQotDQotICAgIHByaW50ZigiXG4iKTsNCi0NCi0gICAgcHJpbnRmKCJWYXJpYWJsZSBOYW1lICAgICAgICBWYWx1ZVxuIik7DQotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOw0KLQ0KLSAgICBmb3IgKGlkeD0wOztpZHgrKykNCi0Jew0KLQkJaWYgKGRydl9OVlJBTV9TY2FuRGlyKEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIGlkeCwgKHVuc2lnbmVkIGNoYXIqKW5hbWUsICh1bnNpZ25lZCBpbnQqKSZuYW1lTGVuLCAodW5zaWduZWQgY2hhciopdmFsdWUsICh1bnNpZ25lZCBpbnQqKSZ2YWx1ZUxlbikgIT0gRFJWX09LKQ0KLQkJCWJyZWFrOw0KLQkJcHJpbnRmKCIlMjBzICIsIG5hbWUpOw0KLQkJKHZvaWQpSE1YX05WUkFNX0R1bXAoKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCB2YWx1ZUxlbiwgMTYpOw0KLQl9DQotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOw0KLQ0KLQlmcmVlKHZhbHVlKTsNCi0NCi0JU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOw0KLSAgICByZXR1cm4gRFJWX09LOw0KLX0NCi0NCi0vKkB9Ki8NCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBIdW1heCBDby4sIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBIdW1heCBDby4sIEx0ZC4gKCJIdW1heCIpIGhlcmVieSBwcm92aWRlcyBwZXJtaXNzaW9uLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55CisgKiBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvdXJjZSBjb2RlLCB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSB0aGlzCisgKiBzb3VyY2UgY29kZSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHBlcm1pc3Npb24gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEhVTUFYICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywKKyAqIENVUlJFTkNZLCBBVkFJTEFCSUxJVFksIFRJVExFIE9SIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIEhVTUFYIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhlIHZpZXdzIGFuZCBjb25jbHVzaW9uIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gYXJlCisgKiB0aG9zZSBvZiB0aGUgYXV0aG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyByZXByZXNlbnRpbmcgb2ZmaWNpYWwKKyAqIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIG9mIEh1bWF4LgorICoKKyAqIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lIHRoaXMKKyAqIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgSHVtYXjigJlzIHNvZnR3YXJlIHByb3ZpZGVkIHVuZGVyIGEgbGljZW5zZQorICogb3RoZXIgdGhhbiB0aGUgYWJvdmUgbGljZW5zZSwgd2l0aG91dCBIdW1heCdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbiBjb25zZW50LgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGaWxlIE5hbWU6ICAgICAgICAgICAkV29ya2ZpbGU6ICAgaG14X3VwcmFkZV9udnJhbS5jICAkCisgKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCisgKiBPcmlnaW5hbCBBdXRob3I6ICAgICBZYW5nIEh5dW4gVWsgJAorICogQ3VycmVudCBBdXRob3I6ICAgICAgJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJAorICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMTEuMDcKKyAqIEZpbGUgRGVzY3JpcHRpb246ICAgIEh1bWF4IFVwZ3JhZGUgQVBJcworICogTW9kdWxlOgorICogUmVtYXJrczoKKyAqLworCisvKioKKyAqIEBkZWZncm91cCBOVlJBTSBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQorICogQGluZ3JvdXAgVVBHUkFERQorICovCisKKy8qKgorICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkKKyAqIEBkYXRlIDA3IE5vdiAyMDExCisgKi8KKworIC8qQHsqLworCisvKioKKyAqIEBmaWxlIGhteF91cGdyYWRlX252cmFtLmMKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImhudnJhbV9kbGlzdC5oIgorI2luY2x1ZGUgImhteF91cGdyYWRlX252cmFtLmgiCisvKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFydCAjZGVmaW5lICovCisjZGVmaW5lIE5WUkFNX1RZUEVfTEVOICAgICAgICAgIDEKKyNkZWZpbmUgTlZSQU1fUkVDT1JEX0xFTkdfTEVOICAgNAorI2RlZmluZSBOVlJBTV9OQU1FX0xFTkdfTEVOICAgICAxCisjZGVmaW5lIE5WUkFNX0RBVEFfTEVOR19MRU4gICAgIDQKKworI2RlZmluZSBNQVhfTkFNRV9MRU4gICAgICAgICAgICAoMjU2KQorI2RlZmluZSBNQVhfREFUQV9MRU4gICAgICAgICAgICAoMjU2KjEwMjQpCisjZGVmaW5lIE1BWF9GSUVMRF9MRU4gICAgICAgICAgIChNQVhfREFUQV9MRU4rTUFYX05BTUVfTEVOKjIpCisKKyNkZWZpbmUgTlZSQU1fVExWX1RZUEVfRU5EICAgICAgMHgwMAorI2RlZmluZSBOVlJBTV9UTFZfVFlQRV9FTlYgICAgICAweDAxCisKKyNkZWZpbmUgZ2V0OGJpdChxKSAodW5zaWduZWQgY2hhcikoKHEpWzBdKQorI2RlZmluZSBnZXQzMmJpdChxKSAodW5zaWduZWQgaW50KSgoKCoodW5zaWduZWQgY2hhciAqKShxKSkgPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigodW5zaWduZWQgY2hhciAqKShxKSsxKSA8PCAxNikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKCh1bnNpZ25lZCBjaGFyICopKHEpKzIpIDw8IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKigodW5zaWduZWQgY2hhciAqKShxKSszKSkgKQorCisjZGVmaW5lIERFQlVHX0VSUihmbXQsIGFyZ3MuLi4pIGZwcmludGYoc3RkZXJyLCBmbXQsICNhcmdzKQorI2RlZmluZSBERUJVR19JTkZPKGZtdCwgYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgI2FyZ3MpCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKworI2RlZmluZSBNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIICAgICAgIDMyCisKKyNkZWZpbmUgU0VNX0dldCh4KSAgICAgICh2b2lkKSh4KQorI2RlZmluZSBTRU1fUmVsZWFzZSh4KSAgKHZvaWQpKHgpCisKKyNkZWZpbmUgTlZSQU1fUk9fT0ZGU0VUICAgICAgICAgMHgwCisjZGVmaW5lIE5WUkFNX1JPX1NJWkUgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgTlZSQU1fUldfT0ZGU0VUICggTlZSQU1fUk9fT0ZGU0VUICsgTlZSQU1fUk9fU0laRSApCisjZGVmaW5lIE5WUkFNX1JXX1NJWkUgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgTlZSQU1fUldCX09GRlNFVCAgICAgICAgKCBOVlJBTV9SV19PRkZTRVQgKyBOVlJBTV9SV19TSVpFKQorI2RlZmluZSBOVlJBTV9SV0JfU0laRSAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFJBV19GU19PRkZTRVQgICAgICAgICAgICggTlZSQU1fUldCX09GRlNFVCArIE5WUkFNX1JXQl9TSVpFKQorI2RlZmluZSBSQVdfRlNfU0laRSAgICAgICAgICAgICAweDAwMDIwMDAwCisvKiBFbmQgI2RlZmluZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFydCB0eXBlZGVmICovCit0eXBlZGVmIHN0cnVjdCBOVlJBTV9FVk5WQVJfdCB7CisgIGRsaXN0X2hkcl90IGRsaXN0X2hkcjsKKyAgdW5zaWduZWQgaW50IHJlY0xlbjsKKyAgdW5zaWduZWQgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgY2hhciBuYW1lTGVuOworICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsKKyAgdW5zaWduZWQgaW50IHZhbHVlTGVuOworfSBOVlJBTV9FVk5WQVJfVDsKKwordHlwZWRlZiBzdHJ1Y3QgSE1YX05WUkFNX01BUF90IHsKKyAgTlZSQU1fRklFTERfVCAgICAgICAgIHR5cGU7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOworICBITVhfTlZSQU1fUEFSVElUSU9OX0Ugc3RvcmVQYXJ0aXRpb247CisgIHVuc2lnbmVkIGludCAgICAgICAgICBkZWZhdWx0U2l6ZTsKK30gSE1YX05WUkFNX0ZJRUxEX0lORk9fVDsKKworSE1YX05WUkFNX0ZJRUxEX0lORk9fVCBzX252cmFtRmllbGRJbmZvW10gPSB7CisgIHtOVlJBTV9GSUVMRF9TWVNURU1fSUQsICJTWVNURU1fSUQiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX1NFUklBTF9OTywgIlNFUklBTF9OTyIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfTUFDX0FERFIsICJNQUNfQUREUiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfSERDUF9LRVksICJIRENQX0tFWSIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfRFRDUF9LRVksICJEVENQX0tFWSIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfMVNUX1NFUklBTF9OVU1CRVIsICIxU1RfU0VSSUFMX05VTUJFUiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sCisgICAgMH0sCisgIHtOVlJBTV9GSUVMRF8yTkRfU0VSSUFMX05VTUJFUiwgIjJORF9TRVJJQUxfTlVNQkVSIiwgSE1YX05WUkFNX1BBUlRJVElPTl9STywKKyAgICAwfSwKKyAge05WUkFNX0ZJRUxEX0dQTiwgIkdQTiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfTUFDX0FERFJfTU9DQSwgIk1BQ19BRERSX01PQ0EiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX01BQ19BRERSX0JULCAiTUFDX0FERFJfQlQiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfUEVNLCAiR09PR0xFX1NTTF9QRU0iLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfQ1JULCAiR09PR0xFX1NTTF9DUlQiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JPLCAwfSwKKyAge05WUkFNX0ZJRUxEX0hXX1ZFUiwgIkhXX1ZFUiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIDB9LAorICB7TlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04sICJMT0FERVJfVkVSU0lPTiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAorICB7TlZSQU1fRklFTERfQUNUSVZBVEVEX0tFUk5FTF9OVU0sICJBQ1RJVkFURURfS0VSTkVMX05VTSIsCisgICAgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9NVERfVFlQRV9GT1JfS0VSTkVMLCAiTVREX1RZUEVfRk9SX0tFUk5FTCIsCisgICAgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9BQ1RJVkFURURfS0VSTkVMX05BTUUsICJBQ1RJVkFURURfS0VSTkVMX05BTUUiLAorICAgIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAorICB7TlZSQU1fRklFTERfRVhUUkFfS0VSTkVMX09QVCwgIkVYVFJBX0tFUk5FTF9PUFQiLCBITVhfTlZSQU1fUEFSVElUSU9OX1JXLCAwfSwKKyAge05WUkFNX0ZJRUxEX1BMQVRGT1JNX05BTUUsICJQTEFURk9STV9OQU1FIiwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9QQUlSRURfRElTSywgIlBBSVJFRF9ESVNLIiwgSE1YX05WUkFNX1BBUlRJVElPTl9SVywgMH0sCisgIHtOVlJBTV9GSUVMRF9QQVJUSVRJT05fVkVSLCAiUEFSVElUSU9OX1ZFUiIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9LAorICB7TlZSQU1fRklFTERfRFVNTVksICJEVU1NWSIsIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcsIDB9Cit9OworLyogRW5kIHR5cGVkZWYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovCitzdGF0aWMgZGxpc3RfaGRyX3Qgc19udnJhbV9lbnZ2YXJzW0hNWF9OVlJBTV9QQVJUSVRJT05fTUFYXSA9IHsKKyAgRExJU1RfSU5JVChzX252cmFtX2VudnZhcnNbMF0pLAorICBETElTVF9JTklUKHNfbnZyYW1fZW52dmFyc1sxXSksCisgIERMSVNUX0lOSVQoc19udnJhbV9lbnZ2YXJzWzJdKSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc19udnJhbV9vZmZzZXRbSE1YX05WUkFNX1BBUlRJVElPTl9NQVhdID0geworICBOVlJBTV9ST19PRkZTRVQsCisgIE5WUkFNX1JXX09GRlNFVCwKKyAgUkFXX0ZTX09GRlNFVAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzX252cmFtX2JhY2t1cF9vZmZzZXRbSE1YX05WUkFNX1BBUlRJVElPTl9NQVhdID0geworICAwLAorICBOVlJBTV9SV0JfT0ZGU0VULAorICAwCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHNfbnZyYW1fc2l6ZVtITVhfTlZSQU1fUEFSVElUSU9OX01BWF0gPSB7CisgIE5WUkFNX1JPX1NJWkUsCisgIE5WUkFNX1JXX1NJWkUsCisgIFJBV19GU19TSVpFCit9OworLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc19udnJhbVNlbWE7CisvKiBFbmQgc3RhdGljIHZhcmlhYmxlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjAKKyAgICAqICBITVhfTlZSQU1fUmVhZChidWZmZXIsb2Zmc2V0LGxlbmd0aCkwCisgICAgKiAgMAorICAgICogIFJlYWQgZGF0YSBmcm9tIHRoZSBOVlJBTSBkZXZpY2UwCisgICAgKgorICAgICogIElucHV0IHBhcmFtZXRlcnM6CisgICAgKiAgICAgIGJ1ZmZlciAtIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICogICAgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byByZWFkCisgICAgKiAgICAgIGxlbmd0aCAtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgKgorICAgICogIFJldHVybiB2YWx1ZToKKyAgICAqICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIDwwIGlmIGVycm9yIG9jY3VyZWQKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBpbnQgZHJ2X05WUkFNX1JlYWQodW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICBEUlZfRXJyb3IgICAgIGRydl9lcnJvcjsKKworICBkcnZfZXJyb3IgPSBITVhfVVBHUkFERV9OVlJBTV9SZWFkKG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpOworICBpZiAoZHJ2X2Vycm9yICE9IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByZXR1cm4gbGVuZ3RoOworfQorCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgSE1YX05WUkFNX1dyaXRlKGJ1ZmZlcixvZmZzZXQsbGVuZ3RoKQorICAgICoKKyAgICAqICBXcml0ZSBkYXRhIHRvIHRoZSBOVlJBTSBkZXZpY2UKKyAgICAqCisgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoKKyAgICAqICAgICAgYnVmZmVyIC0gc291cmNlIGJ1ZmZlcgorICAgICogICAgICBvZmZzZXQgLSBvZmZzZXQgb2YgZGF0YSB0byB3cml0ZQorICAgICogICAgICBsZW5ndGggLSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAqCisgICAgKiAgUmV0dXJuIHZhbHVlOgorICAgICogICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgaWYgZXJyb3Igb2NjdXJlZAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGludCBkcnZfTlZSQU1fV3JpdGUodW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgRFJWX0Vycm9yICAgICBkcnZfZXJyb3I7CisKKyAgZHJ2X2Vycm9yID0gSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUob2Zmc2V0LCBidWZmZXIsIGxlbmd0aCk7CisgIGlmIChkcnZfZXJyb3IgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBITVhfTlZSQU1fRmluZEVudihuYW1lKQorICAgICoKKyAgICAqICBMb2NhdGUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGluLW1lbW9yeSBsaXN0CisgICAgKgorICAgICogIElucHV0IHBhcmFtZXRlcnM6CisgICAgKiAgICAgIG5hbWUgLSBuYW1lIG9mIGVudiB2YXIgdG8gZmluZAorICAgICoKKyAgICAqICBSZXR1cm4gdmFsdWU6CisgICAgKiAgICAgIE5WUkFNX0VWTlZBUl9UIHBvaW50ZXIsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgTlZSQU1fRVZOVkFSX1QgKmRydl9OVlJBTV9GaW5kRW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisgIGRsaXN0X2hkcl90ICplbnRyeTsKKyAgTlZSQU1fRVZOVkFSX1QgKmVudjsKKworICBETElTVF9GT1JfRUFDSCgmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0sIGVudHJ5KSB7CisgICAgZW52ID0gKE5WUkFNX0VWTlZBUl9UICopIGVudHJ5OworICAgIGlmIChzdHJjbXAoKGNoYXIqKWVudi0+bmFtZSwgKGNoYXIqKW5hbWUpID09IDApCisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChlbnRyeSA9PSAmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dXJuIChOVlJBTV9FVk5WQVJfVCAqKSBlbnRyeTsKK30KKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEhNWF9OVlJBTV9TY2FuRGlyKGlkeCxuYW1lLG5hbWVsZW4sdmFsLHZhbGxlbikKKyAgICAqCisgICAgKiAgRW51bWVyYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIFRoaXMgcm91dGluZSBsb2NhdGVzCisgICAgKiAgdGhlIG50aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgY29waWVzIGl0cyBuYW1lIGFuZCB2YWx1ZQorICAgICogIHRvIHVzZXIgYnVmZmVycy4KKyAgICAqCisgICAgKiAgVGhlIG5hbWVsZW4gYW5kIHZhbGxlbiB2YXJpYWJsZXMgbXVzdCBiZSBwcmVpbml0aWFsaXplZCB0bworICAgICogIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgKgorICAgICogIElucHV0IHBhcmFtZXRlcnM6CisgICAgKiAgICAgIGlkeCAtIHZhcmlhYmxlIGluZGV4IHRvIGZpbmQgKHN0YXJ0aW5nIHdpdGggemVybykKKyAgICAqICAgICAgbmFtZSxuYW1lbGVuIC0gbmFtZSBidWZmZXIgYW5kIGxlbmd0aAorICAgICogICAgICB2YWwsdmFsbGVuIC0gdmFsdWUgYnVmZmVyIGFuZCBsZW5ndGgKKyAgICAqCisgICAgKiAgUmV0dXJuIHZhbHVlOgorICAgICogICAgICAwIGlmIG9rCisgICAgKiAgICAgIGVsc2UgZXJyb3IgY29kZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2NhbkRpcihITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm5hbWVsZW4sIHVuc2lnbmVkIGNoYXIgKnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICp2YWxsZW4pCit7CisgIGRsaXN0X2hkcl90ICplbnRyeTsKKyAgTlZSQU1fRVZOVkFSX1QgKmVudjsKKworICBETElTVF9GT1JfRUFDSCgmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0sIGVudHJ5KSB7CisgICAgaWYgKGlkeCA9PSAwKQorICAgICAgYnJlYWs7CisgICAgaWR4LS07CisgIH0KKworICBpZiAoZW50cnkgPT0gJnNfbnZyYW1fZW52dmFyc1twYXJ0aXRpb25dKSB7CisgICAgcmV0dXJuIERSVl9FUlI7CisgIH0KKyAgZW52ID0gKE5WUkFNX0VWTlZBUl9UICopIGVudHJ5OworCisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzdHJuY3B5KChjaGFyKiluYW1lLCAoY2hhciopZW52LT5uYW1lLCBlbnYtPm5hbWVMZW4pOworICAgIG5hbWVbZW52LT5uYW1lTGVuXSA9IDA7CisgIH0KKyAgKm5hbWVsZW4gPSBlbnYtPm5hbWVMZW47CisgIGlmICh2YWwgIT0gTlVMTCkgeworICAgIG1lbWNweSh2YWwsIGVudi0+dmFsdWUsIGVudi0+dmFsdWVMZW4pOworICB9CisgICp2YWxsZW4gID0gZW52LT52YWx1ZUxlbjsKKworICByZXR1cm4gRFJWX09LOworfQorCisvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiAgSE1YX05WUkFNX0RlbGV0ZShuYW1lKQorICAgICoKKyAgICAqICBEZWxldGUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAqCisgICAgKiAgSW5wdXQgcGFyYW1ldGVyczoKKyAgICAqICAgICAgbmFtZSAtIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRlbGV0ZQorICAgICoKKyAgICAqICBSZXR1cm4gdmFsdWU6CisgICAgKiAgICAgIDAgaWYgb2sKKyAgICAqICAgICAgZWxzZSBlcnJvciBjb2RlCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9EZWxldGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQoreworICBOVlJBTV9FVk5WQVJfVCAqZW52OworCisgIGVudiA9IGRydl9OVlJBTV9GaW5kRW52KHBhcnRpdGlvbiwgbmFtZSk7CisgIGlmIChlbnYgPT0gTlVMTCkgeworICAgIHJldHVybiBEUlZfRVJSOworICB9CisKKyAgZGxpc3RfZGVsKChkbGlzdF9oZHJfdCAqKSBlbnYpOworICBmcmVlKGVudik7CisgIHJldHVybiBEUlZfT0s7Cit9CisKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBITVhfTlZSQU1fR2V0RW52KG5hbWUpCisgICAgKgorICAgICogIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICoKKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgorICAgICogICAgICBuYW1lIC0gbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBmaW5kCisgICAgKgorICAgICogIFJldHVybiB2YWx1ZToKKyAgICAqICAgICAgdmFsdWUsIG9yIE5VTEwgaWYgdmFyaWFibGUgaXMgbm90IGZvdW5kCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9HZXRFbnYoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGludCByZWFkTGVuKQoreworICBOVlJBTV9FVk5WQVJfVCAgICAgICAgKmVudjsKKyAgdW5zaWduZWQgaW50ICBsZW47CisKKyAgbWVtc2V0KHZhbHVlLCAwLCByZWFkTGVuKTsKKyAgZW52ID0gZHJ2X05WUkFNX0ZpbmRFbnYocGFydGl0aW9uLCBuYW1lKTsKKyAgaWYgKGVudiAhPSBOVUxMKSB7CisgICAgaWYgKHJlYWRMZW4gPiBlbnYtPnZhbHVlTGVuIC0gb2Zmc2V0KQorICAgICAgbGVuID0gZW52LT52YWx1ZUxlbiAtIG9mZnNldDsKKyAgICBlbHNlCisgICAgICBsZW4gPSByZWFkTGVuOworCisgICAgbWVtY3B5KHZhbHVlLCBlbnYtPnZhbHVlK29mZnNldCwgbGVuKTsKKyAgfQorCisgIHJldHVybiBEUlZfT0s7Cit9CisKKy8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqICBITVhfTlZSQU1fR2V0TGVuZ3RoKG5hbWUpCisgICAgKgorICAgICogIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICoKKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgorICAgICogICAgICBuYW1lIC0gbmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBmaW5kCisgICAgKgorICAgICogIFJldHVybiB2YWx1ZToKKyAgICAqICAgICAgdmFsdWUsIG9yIE5VTEwgaWYgdmFyaWFibGUgaXMgbm90IGZvdW5kCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzdGF0aWMgRFJWX0Vycm9yIGRydl9OVlJBTV9HZXRMZW5ndGgoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcExlbikKK3sKKyAgTlZSQU1fRVZOVkFSX1QgICAgICAgICplbnY7CisKKyAgZW52ID0gZHJ2X05WUkFNX0ZpbmRFbnYocGFydGl0aW9uLCBuYW1lKTsKKyAgaWYgKGVudiAhPSBOVUxMKSB7CisgICAgKnBMZW4gPSBlbnYtPnZhbHVlTGVuOworICAgIHJldHVybiBEUlZfT0s7CisgIH0KKworICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKK30KKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEhNWF9OVlJBTV9TZXRFbnYobmFtZSx2YWx1ZSxmbGFncykKKyAgICAqCisgICAgKiAgU2V0IHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICoKKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgorICAgICogICAgICBuYW1lIC0gbmFtZSBvZiB2YXJpYWJsZQorICAgICogICAgICB2YWx1ZSAtIHZhbHVlIG9mIHZhcmlhYmxlCisgICAgKiAgICAgIGZsYWdzIC0gZmxhZ3MgZm9yIHZhcmlhYmxlIChFTlZfRkxHX3h4eCkKKyAgICAqCisgICAgKiAgUmV0dXJuIHZhbHVlOgorICAgICogICAgICAwIGlmIG9rCisgICAgKiAgICAgIGVsc2UgZXJyb3IgY29kZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fU2V0RW52KEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgaW50IHZhbHVlTGVuKQoreworICBOVlJBTV9FVk5WQVJfVCAqZW52OworICB1bnNpZ25lZCBpbnQgbmFtZWxlbjsKKworICBlbnYgPSBkcnZfTlZSQU1fRmluZEVudihwYXJ0aXRpb24sIG5hbWUpOworICBpZiAoZW52KSB7CisgICAgZGxpc3RfZGVsKChkbGlzdF9oZHJfdCAqKSBlbnYpOworICAgIGZyZWUoZW52KTsKKyAgfQorCisgIG5hbWVsZW4gPSBzdHJsZW4oKGNoYXIqKW5hbWUpOworICBlbnYgPSBtYWxsb2Moc2l6ZW9mKE5WUkFNX0VWTlZBUl9UKSArIG5hbWVsZW4gKyAxICsgdmFsdWVMZW4pOworICBpZiAoIWVudikgeworICAgIHJldHVybiBEUlZfRVJSX09VVE9GTUVNT1JZOworICB9CisgIGVudi0+bmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIChlbnYrMSk7CisgIGVudi0+dmFsdWUgPSBlbnYtPm5hbWUgKyBuYW1lbGVuICsgMTsKKyAgZW52LT5uYW1lTGVuID0gbmFtZWxlbjsKKyAgZW52LT52YWx1ZUxlbiA9IHZhbHVlTGVuOworICBlbnYtPnJlY0xlbiA9IChOVlJBTV9OQU1FX0xFTkdfTEVOICsgbmFtZWxlbiArIE5WUkFNX0RBVEFfTEVOR19MRU4gKworICAgICAgICAgICAgICAgICB2YWx1ZUxlbik7CisKKyAgc3RybmNweSgoY2hhciopZW52LT5uYW1lLCAoY2hhciopbmFtZSwgbmFtZWxlbik7CisgIGVudi0+bmFtZVtuYW1lbGVuXSA9IDA7CisgIG1lbWNweShlbnYtPnZhbHVlLCB2YWx1ZSwgdmFsdWVMZW4pOworCisgIGRsaXN0X2FkZCgmc19udnJhbV9lbnZ2YXJzW3BhcnRpdGlvbl0sIChkbGlzdF9oZHJfdCAqKSBlbnYpOworCisgIHJldHVybiBEUlZfT0s7Cit9CisKKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEhNWF9OVlJBTV9Mb2FkKCkKKyAgICAqCisgICAgKiAgTG9hZCB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgTlZSQU0gZGV2aWNlLgorICAgICoKKyAgICAqICBJbnB1dCBwYXJhbWV0ZXJzOgorICAgICogICAgICBub3RoaW5nCisgICAgKgorICAgICogIFJldHVybiB2YWx1ZToKKyAgICAqICAgICAgMCBpZiBvaworICAgICogICAgICBlbHNlIGVycm9yIGNvZGUKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworICB1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICB1bnNpZ25lZCBjaGFyICpwdHI7CisgIHVuc2lnbmVkIGludCByZWNMZW47CisgIHVuc2lnbmVkIGludCByZWNUeXBlOworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgcmV0dmFsOworICB1bnNpZ25lZCBjaGFyIGZpbGVOYW1lW01BWF9OQU1FX0xFTl07CisgIHVuc2lnbmVkIGNoYXIgbmFtZUxlbjsKKyAgdW5zaWduZWQgaW50IGRhdGFMZW47CisKKyAgbnZyYW1fc2l6ZSA9IHNpemU7CisgIGJ1ZmZlciA9IG1hbGxvYyhNQVhfRklFTERfTEVOKTsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICB7CisgICAgcmV0dXJuIERSVl9FUlJfT1VUT0ZNRU1PUlk7CisgIH0KKworICBwdHIgPSBidWZmZXI7CisgIG9mZnNldCA9IDA7CisKKyAgcmV0dmFsID0gRFJWX09LOworICAvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSBhbmQgbGVuZ3RoICovCisgIGlmIChkcnZfTlZSQU1fUmVhZChwdHIsIG9mZnNldCthZGRyZXNzLCBOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pIHsKKyAgICByZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICB3aGlsZSAoKCpwdHIgIT0gTlZSQU1fVExWX1RZUEVfRU5EKSAgJiYgKG52cmFtX3NpemUgPiBOVlJBTV9UWVBFX0xFTikpIHsKKyAgICAvKiBBZGp1c3QgcG9pbnRlciBmb3IgVExWIHR5cGUgKi8KKyAgICByZWNUeXBlID0gZ2V0OGJpdChwdHIpOworICAgIG52cmFtX3NpemUgLT0gTlZSQU1fVFlQRV9MRU47CisgICAgb2Zmc2V0ICs9IE5WUkFNX1RZUEVfTEVOOworCisgICAgaWYgKHJlY1R5cGUgIT0gTlZSQU1fVExWX1RZUEVfRU5WKSB7CisgICAgICByZXR2YWwgPSBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSBhbmQgbGVuZ3RoIC0gMTYgYml0cywgTVNCIGZpcnN0ICovCisgICAgaWYgKGRydl9OVlJBTV9SZWFkKHB0ciwgb2Zmc2V0K2FkZHJlc3MsIE5WUkFNX1JFQ09SRF9MRU5HX0xFTikgIT0KKyAgICAgICAgTlZSQU1fUkVDT1JEX0xFTkdfTEVOKSB7CisgICAgICByZXR2YWwgPSBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVjTGVuID0gZ2V0MzJiaXQocHRyKTsKKyAgICBudnJhbV9zaXplIC09IE5WUkFNX1JFQ09SRF9MRU5HX0xFTjsKKyAgICBvZmZzZXQgKz0gTlZSQU1fUkVDT1JEX0xFTkdfTEVOOworCisgICAgaWYgKHJlY0xlbiA+IE1BWF9GSUVMRF9MRU4pIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVZFTlRfSU5JVElBTElaQVRJT047CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAocmVjTGVuID4gbnZyYW1fc2l6ZSkgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTjsKKyAgICAgIGdvdG8gZXJyb3I7IC8qIHNob3VsZCBub3QgaGFwcGVuLCBiYWQgTlZSQU0gKi8KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBUTFYgZGF0YSAqLworICAgIGlmIChkcnZfTlZSQU1fUmVhZChwdHIsb2Zmc2V0K2FkZHJlc3MscmVjTGVuKSAhPSAoaW50KXJlY0xlbikgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbmFtZUxlbiA9IGdldDhiaXQocHRyKTsKKyAgICBwdHIgKz0gTlZSQU1fTkFNRV9MRU5HX0xFTjsKKyAgICBpZiAobmFtZUxlbikgeworICAgICAgbWVtY3B5KGZpbGVOYW1lLCBwdHIsIG5hbWVMZW4pOworICAgIH0KKyAgICBmaWxlTmFtZVtuYW1lTGVuXSA9IDA7CisgICAgcHRyICs9IG5hbWVMZW47CisKKyAgICBkYXRhTGVuID0gZ2V0MzJiaXQocHRyKTsKKyAgICBwdHIgKz0gTlZSQU1fREFUQV9MRU5HX0xFTjsKKyAgICBpZiAoZGF0YUxlbiA+IE1BWF9EQVRBX0xFTikgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHJlY0xlbiAhPSAoTlZSQU1fTkFNRV9MRU5HX0xFTiArIG5hbWVMZW4gKyBOVlJBTV9EQVRBX0xFTkdfTEVOICsKKyAgICAgICAgICAgICAgICAgICBkYXRhTGVuKSkgeworICAgICAgcmV0dmFsID0gRFJWX0VSUl9FVkVOVF9JTklUSUFMSVpBVElPTjsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZHJ2X05WUkFNX1NldEVudihwYXJ0aXRpb24sIGZpbGVOYW1lLCBwdHIsIGRhdGFMZW4pOworCisgICAgbnZyYW1fc2l6ZSAtPSAodW5zaWduZWQgaW50KXJlY0xlbjsKKyAgICBvZmZzZXQgKz0gcmVjTGVuOworCisgICAgLyogUmVhZCB0aGUgbmV4dCByZWNvcmQgdHlwZSAqLworICAgIHB0ciA9IGJ1ZmZlcjsKKyAgICBpZiAoZHJ2X05WUkFNX1JlYWQocHRyLG9mZnNldCthZGRyZXNzLCBOVlJBTV9UWVBFX0xFTikgIT0gTlZSQU1fVFlQRV9MRU4pIHsKKyAgICAgIHJldHZhbCA9IERSVl9FUlJfRVhURVJOQUxfRVJST1I7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgfQorCitlcnJvcjoKKyAgZnJlZShidWZmZXIpOworCisgIHJldHVybiByZXR2YWw7CisKK30KKworc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uKQoreworICBEUlZfRXJyb3IgICAgIGRydl9lcnJvcjsKKworICBkcnZfZXJyb3IgID0gZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MocGFydGl0aW9uLCBzX252cmFtX29mZnNldFtwYXJ0aXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19udnJhbV9zaXplW3BhcnRpdGlvbl0pOworICBpZiAoZHJ2X2Vycm9yICE9IERSVl9PSykgeworICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9Mb2FkXSBlcnJvciglZCkgbG9hZGluZyBwYXJ0aXRpb24gKCVkKVxuIiwgZHJ2X2Vycm9yLCBwYXJ0aXRpb24pOworICAgIGlmIChzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSAhPSAwKSB7CisgICAgICBkcnZfZXJyb3IgID0gZHJ2X05WUkFNX0xvYWRCeUFkZHJlc3MocGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfbnZyYW1fc2l6ZVtwYXJ0aXRpb25dKTsKKyAgICAgIGlmIChkcnZfZXJyb3IgIT0gRFJWX09LKSB7CisgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9Mb2FkXSBlcnJvciglZCkgbG9hZGluZyBiYWNrdXAgcGFydGl0aW9uICglZClcbiIsCisgICAgICAgICAgICAgICAgICBkcnZfZXJyb3IsIHBhcnRpdGlvbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBERUJVR19JTkZPKCJbSE1YX05WUkFNX0xvYWRdIGxvYWQgT0sgbG9hZGluZyBiYWNrdXAgcGFydGl0aW9uICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGRydl9lcnJvcjsKK30KKworLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICogIEhNWF9OVlJBTV9TYXZlKCkKKyAgICAqCisgICAgKiAgV3JpdGUgdGhlIGVudmlyb25tZW50IHRvIHRoZSBOVlJBTSBkZXZpY2UuCisgICAgKgorICAgICogIElucHV0IHBhcmFtZXRlcnM6CisgICAgKiAgICAgIG5vdGhpbmcKKyAgICAqCisgICAgKiAgUmV0dXJuIHZhbHVlOgorICAgICogICAgICAwIGlmIG9rLCBlbHNlIGVycm9yIGNvZGUKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBEUlZfRXJyb3IgZHJ2X05WUkFNX1NhdmUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbikKK3sKKyAgdW5zaWduZWQgaW50IG52cmFtX3NpemU7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyX2VuZDsKKyAgdW5zaWduZWQgY2hhciAqcHRyOworICBkbGlzdF9oZHJfdCAqZW50cnk7CisgIE5WUkFNX0VWTlZBUl9UICplbnY7CisgIHVuc2lnbmVkIGNoYXIgbmFtZWxlbjsKKyAgdW5zaWduZWQgaW50IHZhbHVlbGVuOworICB1bnNpZ25lZCBpbnQgcmVjTGVuOworCisgIG52cmFtX3NpemUgPSBzX252cmFtX3NpemVbcGFydGl0aW9uXTsKKyAgYnVmZmVyID0gbWFsbG9jKG52cmFtX3NpemUpOworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gRFJWX0VSUl9PVVRPRk1FTU9SWTsKKyAgfQorICBidWZmZXJfZW5kID0gYnVmZmVyICsgbnZyYW1fc2l6ZSAtIDE7CisKKyAgcHRyID0gYnVmZmVyOworCisgIERMSVNUX0ZPUl9FQUNIKCZzX252cmFtX2VudnZhcnNbcGFydGl0aW9uXSwgZW50cnkpIHsKKyAgICBlbnYgPSAoTlZSQU1fRVZOVkFSX1QgKikgZW50cnk7CisKKyAgICBuYW1lbGVuID0gZW52LT5uYW1lTGVuOworICAgIHZhbHVlbGVuID0gZW52LT52YWx1ZUxlbjsKKyAgICByZWNMZW4gPSBlbnYtPnJlY0xlbjsKKworICAgIGlmICgocHRyICsgTlZSQU1fVFlQRV9MRU4gKyBOVlJBTV9SRUNPUkRfTEVOR19MRU4gKyByZWNMZW4pID4gYnVmZmVyX2VuZCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKnB0cisrID0gTlZSQU1fVExWX1RZUEVfRU5WOyAgICAgICAgLyogVExWIHJlY29yZCB0eXBlICovCisKKyAgICAqcHRyKysgPSAocmVjTGVuPj4yNCkgJiAweEZGOyAgICAgICAvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLworICAgICpwdHIrKyA9IChyZWNMZW4+PjE2KSAmIDB4RkY7ICAgICAgIC8qIFRMViByZWNvcmQgbGVuZ3RoICovCisgICAgKnB0cisrID0gKHJlY0xlbj4+OCkgJiAweEZGOyAgICAgICAgLyogVExWIHJlY29yZCBsZW5ndGggKi8KKyAgICAqcHRyKysgPSAocmVjTGVuPj4wKSAmIDB4RkY7ICAgICAgICAvKiBUTFYgcmVjb3JkIGxlbmd0aCAqLworCisgICAgKnB0cisrID0gKG5hbWVsZW4+PjApICYgMHhGRjsgICAgICAgLyogTkFNRSByZWNvcmQgbGVuZ3RoICovCisKKyAgICBtZW1jcHkocHRyLCBlbnYtPm5hbWUsIG5hbWVsZW4pOyAgICAvKiBOQU1FIHJlY29yZCBkYXRhICovCisgICAgcHRyICs9IG5hbWVsZW47CisKKyAgICAqcHRyKysgPSAodmFsdWVsZW4+PjI0KSAmIDB4RkY7ICAgICAvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovCisgICAgKnB0cisrID0gKHZhbHVlbGVuPj4xNikgJiAweEZGOyAgICAgLyogVkFMVUUgcmVjb3JkIGxlbmd0aCAqLworICAgICpwdHIrKyA9ICh2YWx1ZWxlbj4+OCkgJiAweEZGOyAgICAgIC8qIFZBTFVFIHJlY29yZCBsZW5ndGggKi8KKyAgICAqcHRyKysgPSAodmFsdWVsZW4+PjApICYgMHhGRjsgICAgICAvKiBWQUxVRSByZWNvcmQgbGVuZ3RoICovCisKKyAgICBtZW1jcHkocHRyLGVudi0+dmFsdWUsIHZhbHVlbGVuKTsKKyAgICBwdHIgKz0gdmFsdWVsZW47CisKKyAgfQorCisgICpwdHIrKyA9IE5WUkFNX1RMVl9UWVBFX0VORDsKKworICBudnJhbV9zaXplID0gZHJ2X05WUkFNX1dyaXRlKGJ1ZmZlciwwK3NfbnZyYW1fb2Zmc2V0W3BhcnRpdGlvbl0scHRyLWJ1ZmZlcik7CisgIGlmIChzX252cmFtX2JhY2t1cF9vZmZzZXRbcGFydGl0aW9uXSAhPSAwKSB7CisgICAgZHJ2X05WUkFNX1dyaXRlKGJ1ZmZlciwwK3NfbnZyYW1fYmFja3VwX29mZnNldFtwYXJ0aXRpb25dLHB0ci1idWZmZXIpOworICB9CisKKyAgZnJlZShidWZmZXIpOworCisgIHJldHVybiAobnZyYW1fc2l6ZSA9PSAodW5zaWduZWQgaW50KShwdHItYnVmZmVyKSkgPyBEUlZfT0sgOgorICAgICAgRFJWX0VSUl9FWFRFUk5BTF9FUlJPUjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBOVlJBTV9TV0FQMzIodW5zaWduZWQgaW50IEEpCit7CisgIHJldHVybiAoKEEgPDwgMjQpIHwgKChBIDw8IDgpICYgIDB4RkYwMDAwKSB8ICgoQSA+PiA4KSAmICAweEZGMDApIHwoQSA+PiAyNCkpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzX252cmFtU2VtYTsKKworc3RhdGljIERSVl9FcnJvciBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGNvbnN0IE5WUkFNX0ZJRUxEX1QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITVhfTlZSQU1fUEFSVElUSU9OX0UgKnBQYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHN6RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpkZWZhdWx0U2l6ZSkKK3sKKyAgaW50IGk7CisKKyAgU0VNX0dldChzX252cmFtU2VtYSk7CisgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisgICAgaWYgKE5WUkFNX0ZJRUxEX0RVTU1ZID09IHNfbnZyYW1GaWVsZEluZm9baV0udHlwZSkKKyAgICAgIGJyZWFrOworICAgIGlmICh0eXBlICE9IHNfbnZyYW1GaWVsZEluZm9baV0udHlwZSkKKyAgICAgIGNvbnRpbnVlOworICAgIHN0cm5jcHkoKGNoYXIqKXBzekZpbGVOYW1lLCAoY2hhciopKHNfbnZyYW1GaWVsZEluZm9baV0uc3pGaWxlTmFtZSksCisgICAgICAgICAgICBNQVhfTlZSQU1fRklMRU5BTUVfTEVOR1RIKTsKKyAgICAqcFBhcnRpdGlvbiA9IHNfbnZyYW1GaWVsZEluZm9baV0uc3RvcmVQYXJ0aXRpb247CisgICAgKmRlZmF1bHRTaXplID0gc19udnJhbUZpZWxkSW5mb1tpXS5kZWZhdWx0U2l6ZTsKKyAgICBTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7CisgICAgcmV0dXJuIERSVl9PSzsKKyAgfQorICBTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7CisgIHJldHVybiAxOworfQorCisKK0RSVl9FcnJvciBITVhfTlZSQU1fSW5pdCh2b2lkKQoreworICBkcnZfTlZSQU1fTG9hZChITVhfTlZSQU1fUEFSVElUSU9OX1JPKTsKKyAgZHJ2X05WUkFNX0xvYWQoSE1YX05WUkFNX1BBUlRJVElPTl9SVyk7CisgIHJldHVybiBEUlZfT0s7Cit9CisKK0RSVl9FcnJvciBITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSkKK3sKKyAgRFJWX0Vycm9yIGRydl9lcnJvcjsKKworICBVTlVTRUQob2Zmc2V0KTsKKworICBTRU1fR2V0KHNfbnZyYW1TZW1hKTsKKyAgZHJ2X2Vycm9yID0gZHJ2X05WUkFNX1NldEVudihwYXJ0aXRpb24sIHBOYW1lLCBwVmFsdWUsIHVsU2l6ZSk7CisgIGRydl9lcnJvciA9IGRydl9OVlJBTV9TYXZlKHBhcnRpdGlvbik7CisgIFNFTV9SZWxlYXNlKHNfbnZyYW1TZW1hKTsKKyAgcmV0dXJuIGRydl9lcnJvcjsKK30KKworRFJWX0Vycm9yIEhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWxTaXplKQoreworICBEUlZfRXJyb3IgICAgIGRydl9lcnJvcjsKKworICBTRU1fR2V0KHNfbnZyYW1TZW1hKTsKKyAgbWVtc2V0KHBWYWx1ZSwgMCwgdWxTaXplKTsKKyAgZHJ2X2Vycm9yID0gZHJ2X05WUkFNX0dldEVudihwYXJ0aXRpb24sIHBOYW1lLCBvZmZzZXQsIHBWYWx1ZSwgdWxTaXplKTsKKyAgU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOworICByZXR1cm4gZHJ2X2Vycm9yOworfQorCitEUlZfRXJyb3IgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpCit7CisgIERSVl9FcnJvciBlcnJDb2RlID0gRFJWX0VSUjsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgIHN6RmlsZU5hbWVbTUFYX05WUkFNX0ZJTEVOQU1FX0xFTkdUSF07CisgIEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb247CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZyYW1IYW5kbGU7CisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNpemU7CisKKyAgaWYoIGRhdGEgPT0gTlVMTCB8fCBmaWVsZCA9PSBOVlJBTV9GSUVMRF9EVU1NWSApIHsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIGVyckNvZGUgPSBkcnZfTlZSQU1fR2V0RmllbGRJbmZvKGZpZWxkLCAmcGFydGl0aW9uLCBzekZpbGVOYW1lLCAmZGVmYXVsdFNpemUpOworICBpZiAoZXJyQ29kZSAhPSBEUlZfT0spIHsKKyAgICBERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIGZpZWxkKCVkKSBlcnJvciglMDhYKSA6ICIKKyAgICAgICAgICAgICAgIkhNWF9OVlJBTV9HZXRGaWVsZEluZm9cbiIsIGZpZWxkLCBlcnJDb2RlKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQorCisgIHN3aXRjaCAocGFydGl0aW9uKSB7CisgICAgY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMgOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JPIDoKKyAgICBjYXNlIEhNWF9OVlJBTV9QQVJUSVRJT05fUlcgOgorICAgICAgaWYgKGRlZmF1bHRTaXplID09IDApIHsKKyAgICAgICAgZXJyQ29kZSA9IEhNWF9OVlJBTV9SZWFkKHBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOworICAgICAgICBpZiAoZXJyQ29kZSAhPSBEUlZfT0spIHsKKyAgICAgICAgICBERUJVR19FUlIoIltITVhfTlZSQU1fR2V0RmllbGRdIGZpZWxkKCVkKS0lcyBlcnJvciglMDhYKSA6ICIKKyAgICAgICAgICAgICAgICAgICAgIkhNWF9OVlJBTV9SZWFkXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7CisgICAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkID09IE5WUkFNX0ZJRUxEX1NZU1RFTV9JRCAmJiBlcnJDb2RlID09IDApIHsKKyAgICAgICAgICAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpID0gTlZSQU1fU1dBUDMyKCh1bnNpZ25lZCBpbnQpKih1bnNpZ25lZCBpbnQqKWRhdGEpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpwQnVmOworCisgICAgICAgIHBCdWYgPSBtYWxsb2MoZGVmYXVsdFNpemUpOworICAgICAgICBpZiAocEJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBtYWxsb2NcbiIpOworICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGVyckNvZGUgPSBITVhfTlZSQU1fUmVhZChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIHBCdWYsIGRlZmF1bHRTaXplKTsKKyAgICAgICAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgICAgICAgbWVtc2V0KHBCdWYsIDAsIGRlZmF1bHRTaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZGF0YSwgcEJ1ZiArIG9mZnNldCwgbkRhdGFTaXplKTsKKyAgICAgICAgZnJlZShwQnVmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldEZpZWxkXSBESV9FUlJfSU5WQUxJRF9QQVJBTSBmaWVsZCglZCktJXMgIgorICAgICAgICAgICAgICAgICJlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9Xcml0ZVxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOworICAgICAgcmV0dXJuIDI7CisgIH0KKworICByZXR1cm4gZXJyQ29kZTsKK30KKworRFJWX0Vycm9yIEhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKQoreworICBEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOworICBITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52cmFtSGFuZGxlOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaXplOworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkOworCisgIGlmKCBkYXRhID09IE5VTEwgfHwgZmllbGQgPT0gTlZSQU1fRklFTERfRFVNTVkgKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKworICBwQnVmID0gbWFsbG9jKG5EYXRhU2l6ZSk7CisgIGlmIChwQnVmID09IE5VTEwpIHsKKyAgICByZXR1cm4gNTsKKyAgfQorCisgIGVyckNvZGUgPSBITVhfTlZSQU1fR2V0RmllbGQoZmllbGQsIG9mZnNldCwgcEJ1ZiwgbkRhdGFTaXplKTsKKyAgaWYgKGVyckNvZGUgPT0gRFJWX09LKSB7CisgICAgaWYgKG1lbWNtcChwQnVmLCBkYXRhLCBuRGF0YVNpemUpID09IDApIHsKKyAgICAgIGZyZWUocEJ1Zik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZnJlZShwQnVmKTsKKworICBlcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsKKyAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9HZXRGaWVsZEluZm8sICIKKyAgICAgICAgICAgICAgImZpZWxkICglZClcbiIsIGVyckNvZGUsIGZpZWxkKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQorCisgIHN3aXRjaCAocGFydGl0aW9uKSB7CisgICAgY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMgOgorICAgICAgZXJyQ29kZSA9IERSVl9OQU5ERkxBU0hfR2V0TnZyYW1IYW5kbGUoJm52cmFtSGFuZGxlKTsKKyAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgIH0KKworICAgICAgZXJyQ29kZSA9IERSVl9GTEFTSF9Xcml0ZShzX252cmFtX29mZnNldFtITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOworICAgICAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgIkhNWF9OVlJBTV9Xcml0ZVxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOworICAgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgSE1YX05WUkFNX1BBUlRJVElPTl9STyA6CisgICAgY2FzZSBITVhfTlZSQU1fUEFSVElUSU9OX1JXIDoKKyAgICAgIGlmIChkZWZhdWx0U2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChmaWVsZCA9PSBOVlJBTV9GSUVMRF9TWVNURU1fSUQgJiYgZXJyQ29kZSA9PSAwKSB7CisgICAgICAgICAgc3lzdGVtSWQgPSBOVlJBTV9TV0FQMzIoKHVuc2lnbmVkIGludCkqKHVuc2lnbmVkIGludCopZGF0YSk7CisgICAgICAgICAgZGF0YSA9ICh2b2lkKikmc3lzdGVtSWQ7CisgICAgICAgIH0KKyAgICAgICAgZXJyQ29kZSA9IEhNWF9OVlJBTV9Xcml0ZShwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIDAsIGRhdGEsIG5EYXRhU2l6ZSk7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgICAiSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7CisgICAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBCdWY7CisKKyAgICAgICAgcEJ1ZiA9IG1hbGxvYyhkZWZhdWx0U2l6ZSk7CisgICAgICAgIGlmIChwQnVmID09IE5VTEwpIHsKKyAgICAgICAgICBERUJVR19FUlIoIltITVhfTlZSQU1fU2V0RmllbGRdIG1hbGxvY1xuIik7CisgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgZXJyQ29kZSA9IEhNWF9OVlJBTV9SZWFkKHBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgMCwgcEJ1ZiwgZGVmYXVsdFNpemUpOworICAgICAgICBpZiAoZXJyQ29kZSAhPSBEUlZfT0spIHsKKyAgICAgICAgICBtZW1zZXQocEJ1ZiwgMCwgZGVmYXVsdFNpemUpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwQnVmICsgb2Zmc2V0LCBkYXRhLCBuRGF0YVNpemUpOworCisgICAgICAgIGVyckNvZGUgPSBITVhfTlZSQU1fV3JpdGUocGFydGl0aW9uLCBzekZpbGVOYW1lLCAwLCBwQnVmLCBkZWZhdWx0U2l6ZSk7CisgICAgICAgIGZyZWUocEJ1Zik7CisgICAgICAgIGlmIChlcnJDb2RlICE9IERSVl9PSykgeworICAgICAgICAgIERFQlVHX0VSUigiW0hNWF9OVlJBTV9TZXRGaWVsZF0gZmllbGQoJWQpLSVzIGVycm9yKCUwOFgpIDogIgorICAgICAgICAgICAgICAgICAgICAiSE1YX05WUkFNX1dyaXRlXG4iLCBmaWVsZCwgc3pGaWxlTmFtZSwgZXJyQ29kZSk7CisgICAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX1NldEZpZWxkXSBESV9FUlJfSU5WQUxJRF9QQVJBTSBmaWVsZCglZCktJXMgIgorICAgICAgICAgICAgICAgICJlcnJvciglMDhYKSA6IEhNWF9OVlJBTV9Xcml0ZVxuIiwgZmllbGQsIHN6RmlsZU5hbWUsIGVyckNvZGUpOworICAgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gZXJyQ29kZTsKK30KKworRFJWX0Vycm9yIEhNWF9OVlJBTV9HZXRMZW5ndGgoTlZSQU1fRklFTERfVCBmaWVsZCwgaW50ICpwTGVuKQoreworICBEUlZfRXJyb3IgZXJyQ29kZSA9IERSVl9FUlI7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICBzekZpbGVOYW1lW01BWF9OVlJBTV9GSUxFTkFNRV9MRU5HVEhdOworICBITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uOworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52cmFtSGFuZGxlOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaXplOworICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpwQnVmOworCisgIGlmKCBwTGVuID09IE5VTEwpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgICpwTGVuID0gMDsKKworICBlcnJDb2RlID0gZHJ2X05WUkFNX0dldEZpZWxkSW5mbyhmaWVsZCwgJnBhcnRpdGlvbiwgc3pGaWxlTmFtZSwgJmRlZmF1bHRTaXplKTsKKyAgaWYgKGVyckNvZGUgIT0gRFJWX09LKSB7CisgICAgREVCVUdfRVJSKCJbSE1YX05WUkFNX0dldExlbmd0aF0gZXJyb3IoJTA4WCkgOiBITVhfTlZSQU1fR2V0RmllbGRJbmZvLCAiCisgICAgICAgICAgICAgICJmaWVsZCAoJWQpXG4iLCBlcnJDb2RlLCBmaWVsZCk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBlcnJDb2RlID0gZHJ2X05WUkFNX0dldExlbmd0aChwYXJ0aXRpb24sIHN6RmlsZU5hbWUsIHBMZW4pOworCisgIHJldHVybiBEUlZfT0s7Cit9CisKK0RSVl9FcnJvciAgICAgICBITVhfTlZSQU1fUmVtb3ZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lKQoreworICBpbnQgICByZXN1bHQ7CisKKyAgU0VNX0dldChzX252cmFtU2VtYSk7CisgIHJlc3VsdCA9IGRydl9OVlJBTV9EZWxldGUocGFydGl0aW9uLCBwTmFtZSk7CisgIGlmIChyZXN1bHQgPT0gMCkgeworICAgIHJlc3VsdCA9IGRydl9OVlJBTV9TYXZlKHBhcnRpdGlvbik7CisgIH0KKyAgU0VNX1JlbGVhc2Uoc19udnJhbVNlbWEpOworICByZXR1cm4gcmVzdWx0OworfQorCitEUlZfRXJyb3IgSE1YX05WUkFNX0R1bXAodW5zaWduZWQgY2hhciogcHVjQnVmZmVyLCB1bnNpZ25lZCBpbnQgdWlMZW4sIHVuc2lnbmVkIGludCB1aUFsaWduKQoreworICB1bnNpZ25lZCBpbnQgdWlJbmRleDsKKyAgdW5zaWduZWQgaW50IHNraXA7CisKKyAgc2tpcCA9IDE7CisgIGZvciAodWlJbmRleD0wIDsgdWlJbmRleDx1aUxlbiA7IHVpSW5kZXgrKykgeworICAgIGlmICh1aUFsaWduIT0wICYmICh1aUluZGV4JXVpQWxpZ24pPT0wKSB7CisgICAgICBpZiAoc2tpcCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgc2tpcCA9IDA7CisgICAgfQorICAgIHByaW50ZigiJTAyWCAiLCAqKHB1Y0J1ZmZlcit1aUluZGV4KSk7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICByZXR1cm4gRFJWX09LOworfQorCit2b2lkIEhNWF9OVlJBTV9QcmludF9TZXBhcmF0b3Iodm9pZCkgeworICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tICIKKyAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CisKK0RSVl9FcnJvciBITVhfTlZSQU1fRGlyKHZvaWQpCit7CisgIGNoYXIgbmFtZVs4MF07CisgIGNoYXIgKnZhbHVlOworICBpbnQgbmFtZUxlbiwgdmFsdWVMZW47CisgIGludCBpZHg7CisKKyAgdmFsdWUgPSBtYWxsb2MoTUFYX0RBVEFfTEVOKTsKKyAgaWYgKHZhbHVlID09IE5VTEwpCisgIHsKKyAgICByZXR1cm4gRFJWX0VSUl9PVVRPRk1FTU9SWTsKKyAgfQorCisgIFNFTV9HZXQoc19udnJhbVNlbWEpOworCisgIHByaW50ZigiUk9NIE5hbWUgICAgICAgIFZhbHVlXG4iKTsKKyAgSE1YX05WUkFNX1ByaW50X1NlcGFyYXRvcigpOworCisgIGZvciAoaWR4PTA7O2lkeCsrKSB7CisgICAgaWYgKGRydl9OVlJBTV9TY2FuRGlyKEhNWF9OVlJBTV9QQVJUSVRJT05fUk8sIGlkeCwgKHVuc2lnbmVkIGNoYXIqKW5hbWUsICh1bnNpZ25lZCBpbnQqKSZuYW1lTGVuLCAodW5zaWduZWQgY2hhciopdmFsdWUsICh1bnNpZ25lZCBpbnQqKSZ2YWx1ZUxlbikgIT0gRFJWX09LKQorICAgICAgYnJlYWs7CisgICAgcHJpbnRmKCIlMjBzICIsIG5hbWUpOworICAgICh2b2lkKUhNWF9OVlJBTV9EdW1wKCh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgdmFsdWVMZW4sIDE2KTsKKyAgfQorICBITVhfTlZSQU1fUHJpbnRfU2VwYXJhdG9yKCk7CisKKyAgcHJpbnRmKCJcbiIpOworCisgIHByaW50ZigiVmFyaWFibGUgTmFtZSAgICAgICAgVmFsdWVcbiIpOworICBITVhfTlZSQU1fUHJpbnRfU2VwYXJhdG9yKCk7CisKKyAgZm9yIChpZHg9MDs7aWR4KyspIHsKKyAgICBpZiAoZHJ2X05WUkFNX1NjYW5EaXIoSE1YX05WUkFNX1BBUlRJVElPTl9SVywgaWR4LCAodW5zaWduZWQgY2hhciopbmFtZSwgKHVuc2lnbmVkIGludCopJm5hbWVMZW4sICh1bnNpZ25lZCBjaGFyKil2YWx1ZSwgKHVuc2lnbmVkIGludCopJnZhbHVlTGVuKSAhPSBEUlZfT0spCisgICAgICBicmVhazsKKyAgICBwcmludGYoIiUyMHMgIiwgbmFtZSk7CisgICAgKHZvaWQpSE1YX05WUkFNX0R1bXAoKHVuc2lnbmVkIGNoYXIqKXZhbHVlLCB2YWx1ZUxlbiwgMTYpOworICB9CisgIEhNWF9OVlJBTV9QcmludF9TZXBhcmF0b3IoKTsKKworICBmcmVlKHZhbHVlKTsKKworICBTRU1fUmVsZWFzZShzX252cmFtU2VtYSk7CisgIHJldHVybiBEUlZfT0s7Cit9CisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5oIGIvbGlidXBncmFkZS9obXhfdXBncmFkZV9udnJhbS5oCmluZGV4IGIwZjg1ODguLjllNzdmNWEgMTAwNjQ0Ci0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfbnZyYW0uaAorKysgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX252cmFtLmgKQEAgLTEsMzQ1ICsxLDE2NiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uaCAgJA0KLSAqIFZlcnNpb246CQkJJFJldmlzaW9uOiAgIDEuMCAgJA0KLSAqIE9yaWdpbmFsIEF1dGhvcjogWWFuZyBIeXVuIFVrICQNCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMTEuMDcNCi0gKiBGaWxlIERlc2NyaXB0aW9uOglVcGdyYWRlIEFQSXMNCi0gKiBNb2R1bGU6DQotICogUmVtYXJrczoNCi0gKi8NCi0NCi0NCi0vKioNCi0gKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KLSAqIEBkYXRlIDA3IE5vdiAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZV9udnJhbS5oDQotICovDQotDQotI2lmbmRlZiBITVhfVVBHUkFERV9OVlJBTV9IXw0KLSNkZWZpbmUgSE1YX1VQR1JBREVfTlZSQU1fSF8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQotLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIEV4dGVybiB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBFeHRlcm4gdmFyaWFibGVlICovDQotZXh0ZXJuIGludCBsaWJ1cGdyYWRlX3ZlcmJvc2U7DQotDQotLyogRW5kIEV4dGVybiB2YXJpYWJsZSAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm8gRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IE1hY3JvIGRlZmluaXRpb24gKi8NCi0NCi0vKiBFbmQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IHR5cGVkZWYgKi8NCi0NCi10eXBlZGVmIGVudW0NCi17DQotCU5WUkFNX09TRF9PTiA9IDAsDQotCU5WUkFNX09TRF9PRkYNCi19TlZSQU1fT1NEX0RJU1BMQVlfRTsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PTiA9IDAsDQotCU5WUkFNX0ZST05UUEFORUxfRElTUExBWV9PRkYNCi19TlZSQU1fRlJPTlRQQU5FTF9ESVNQTEFZX0U7DQotDQotdHlwZWRlZiBlbnVtDQotew0KLQlOVlJBTV9BU1BFQ1RfUkFUSU9fNF8zID0gMCwNCi0JTlZSQU1fQVNQRUNUX1JBVElPXzE2XzkNCi19TlZSQU1fQVNQRUNUX1JBVElPX0U7DQotDQotdHlwZWRlZiBlbnVtDQotew0KLQlOVlJBTV9PVEFfU1NVID0gMSwNCi0JTlZSQU1fT1RBX0RURyA9IDIsDQotCU5WUkFNX09UQV9IVU1BWCA9IDMsDQotCU5WUkFNX09UQV9OT1JESUcgPSA0LA0KLQlOVlJBTV9PVEFfRklMRSA9IDUsDQotCU5WUkFNX09UQV9TS1lEID0gNiwNCi0JTlZSQU1fT1RBX01BWA0KLX1OVlJBTV9PVEFfVFlQRV9FOw0KLQ0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0JTlZSQU1fT1RBX0NIQU5ORUxfU0FUCQk9IDEsDQotCU5WUkFNX09UQV9DSEFOTkVMX0NBQgkJPSAyLA0KLQlOVlJBTV9PVEFfQ0hBTk5FTF9URVIJCT0gMywNCi0JTlZSQU1fT1RBX0NIQU5ORUxfRkxBU0gJCT0gNCwNCi0JTlZSQU1fT1RBX0NIQU5ORUxfRlRQCQk9IDUNCi19TlZSQU1fT1RBX0NIQU5ORUxfRTsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotCU5WUkFNX1JFU09MVVRJT05fVW5rbm93bgkJCT0weDAwMDAwMDAwLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzcyMHgyNDBQCQk9MHgwMDAwMDAwMSwNCi0JTlZSQU1fUkVTT0xVVElPTl8yODgweDI0MFAJCT0weDAwMDAwMDAyLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzY0MHg0ODBQCQk9MHgwMDAwMDAwNCwNCi0JTlZSQU1fUkVTT0xVVElPTl83MjB4NDgwSQkJPTB4MDAwMDAwMDgsDQotCU5WUkFNX1JFU09MVVRJT05fNzIweDQ4MFAJCT0weDAwMDAwMDEwLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NDgwUAkJPTB4MDAwMDAwMjAsDQotCU5WUkFNX1JFU09MVVRJT05fMjg4MHg0ODBJCQk9MHgwMDAwMDA0MCwNCi0JTlZSQU1fUkVTT0xVVElPTl8yODgweDQ4MFAJCT0weDAwMDAwMDgwLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzcyMHgyODhQCQk9MHgwMDAwMDEwMCwNCi0JTlZSQU1fUkVTT0xVVElPTl8yODgweDI4OFAgCQk9MHgwMDAwMDIwMCwNCi0JTlZSQU1fUkVTT0xVVElPTl83MjB4NTc2SQkJPTB4MDAwMDA0MDAsDQotCU5WUkFNX1JFU09MVVRJT05fNzIweDU3NlAJCT0weDAwMDAwODAwLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzE0NDB4NTc2UAkJPTB4MDAwMDEwMDAsDQotCU5WUkFNX1JFU09MVVRJT05fMjg4MHg1NzZJIAkJPTB4MDAwMDIwMDAsDQotCU5WUkFNX1JFU09MVVRJT05fMjg4MHg1NzZQCQk9MHgwMDAwNDAwMCwNCi0JTlZSQU1fUkVTT0xVVElPTl8xMDgweDcyMFAJCT0weDAwMDA4MDAwLA0KLQlOVlJBTV9SRVNPTFVUSU9OXzEyODB4NzIwUAkJPTB4MDAwMTAwMDAsDQotCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwSQkJPTB4MDAwMjAwMDAsDQotCU5WUkFNX1JFU09MVVRJT05fMTkyMHgxMDgwUAkJPTB4MDAwNDAwMDAsDQotCU5WUkFNX1JFU09MVVRJT05fRFVNTVkJCQk9MHgwMDBGRkZGRg0KLX0gTlZSQU1fVklERU9fUkVTT0xVVElPTl9FOw0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFX1Vua25vd24JPTB4MDAwMCwNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzI0SFoJCT0weDAwMDEsDQotCU5WUkFNX0hETUlfRklFTERfUkFURV8yNUhaIAkJPTB4MDAwMiwNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzMwSFogCQk9MHgwMDA0LA0KLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfNTBIWiAJCT0weDAwMDgsDQotCU5WUkFNX0hETUlfRklFTERfUkFURV82MEhaIAkJPTB4MDAxMCwNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEwMEhaIAkJPTB4MDAyMCwNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEyMEhaIAkJPTB4MDA0MCwNCi0JTlZSQU1fSERNSV9GSUVMRF9SQVRFXzIwMEhaCQk9MHgwMDgwLA0KLQlOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjQwSFoJCT0weDAxMDAsDQotCU5WUkFNX0hETUlfRklFTERfUkFURV9EVU1NWQkJPTB4RkZGRg0KLX0gTlZSQU1fSERNSV9WSURFT19GSUVMRF9SQVRFX0U7DQotDQotDQotdHlwZWRlZiBlbnVtDQotew0KLQlOVlJBTV9IRE1JX1ZJREVPX0FSX2VOb0RhdGEgPSAwLA0KLQlOVlJBTV9IRE1JX1ZJREVPX0FSX2U0XzMsDQotCU5WUkFNX0hETUlfVklERU9fQVJfZTE2XzkNCi19TlZSQU1fSERNSV9WSURFT19BUl9FOw0KLQ0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0JTlZSQU1fU0NBUlRfT1VUUFVUX0NWQlM9MywNCi0JTlZSQU1fU0NBUlRfT1VUUFVUX1JHQiwNCi0JTlZSQU1fU0NBUlRfT1VUUFVUX1NWSURFTywNCi0NCi0JTlZSQU1fU0NBUlRfTUFYDQotfSBOVlJBTV9TQ0FSVF9TRVRUSU5HX1ZBTFVFOw0KLQ0KLXR5cGVkZWYgZW51bSB0YWdOVlJBTV9GSUVMRA0KLXsNCi0JTlZSQU1fRklFTERfU1lTVEVNX0lEID0gMCwJCQkJCS8vIHVuc2lnbmVkIGludAkJCQkvLyA0CQkJCS8vIFN5c3RlbSBJZA0KLQlOVlJBTV9GSUVMRF9TRkxBU0gsDQotCU5WUkFNX0ZJRUxEX1NFUklBTF9OTywNCi0JTlZSQU1fRklFTERfTUFDX0FERFIsDQotCU5WUkFNX0ZJRUxEX0hEQ1BfS0VZLA0KLQlOVlJBTV9GSUVMRF9EVENQX0tFWSwNCi0JTlZSQU1fRklFTERfQ0lfUExVU19LRVksDQotCU5WUkFNX0ZJRUxEX1BBUklOR19EQVRBLA0KLQlOVlJBTV9GSUVMRF9QUklWQVRFLA0KLQlOVlJBTV9GSUVMRF9DU0NfS0VZLA0KLQlOVlJBTV9GSUVMRF8xU1RfU0VSSUFMX05VTUJFUiwNCi0JTlZSQU1fRklFTERfMk5EX1NFUklBTF9OVU1CRVIsDQotCU5WUkFNX0ZJRUxEX0dQTiwNCi0JTlZSQU1fRklFTERfTUFDX0FERFJfTU9DQSwNCi0JTlZSQU1fRklFTERfTUFDX0FERFJfQlQsDQotCU5WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfUEVNLA0KLQlOVlJBTV9GSUVMRF9HT09HTEVfU1NMX0NSVCwNCi0JTlZSQU1fRklFTERfQ01fU0VSSUFMX05PLA0KLQlOVlJBTV9GSUVMRF9DTV9NQUNfQUREUiwNCi0JTlZSQU1fRklFTERfQ01fTUFDX0FERFJfQU5PVEhFUiwNCi0JTlZSQU1fRklFTERfSVJERVRPX0JCQ0IsDQotDQotCU5WUkFNX0ZJRUxEX09UQV9UWVBFMSA9IDB4MTAwLAkJCQkvLyBOVlJBTV9PVEFfVFlQRV9FDQotCU5WUkFNX0ZJRUxEX09UQV9UWVBFMiwgCQkJCQkJLy8gTlZSQU1fT1RBX1RZUEVfRQ0KLQlOVlJBTV9GSUVMRF9PVEFfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX1RZUEVfRQ0KLQlOVlJBTV9GSUVMRF9DSF9UWVBFMSwJCQkJCQkvLyBOVlJBTV9PVEFfQ0hBTk5FTF9FDQotCU5WUkFNX0ZJRUxEX0NIX1RZUEUyLAkJCQkJCS8vIE5WUkFNX09UQV9DSEFOTkVMX0UNCi0JTlZSQU1fRklFTERfQ0hfVFlQRTMsCQkJCQkJLy8gTlZSQU1fT1RBX0NIQU5ORUxfRQ0KLQlOVlJBTV9GSUVMRF9PVEFfRkxBRzEsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQ0KLQlOVlJBTV9GSUVMRF9PVEFfRkxBRzIsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQ0KLQlOVlJBTV9GSUVMRF9PVEFfRkxBRzMsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQ0KLQlOVlJBTV9GSUVMRF9UVU5FUl9JRDEsCQkJCQkJLy8gVHVuZXIgSWQNCi0JTlZSQU1fRklFTERfVFVORVJfSUQyLAkJCQkJCS8vIFR1bmVyIElkDQotCU5WUkFNX0ZJRUxEX1RVTkVSX0lEMywJCQkJCQkvLyBUdW5lciBJZA0KLQlOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIxLAkJCQkJLy8gRXh0ZXJuYWwgQW50ZW5hIFBvd2VyIGZvciBUZXIsIDA6T2ZmLzE6T24NCi0JTlZSQU1fRklFTERfQU5URU5BX1BPV0VSMiwJCQkJCS8vIEV4dGVybmFsIEFudGVuYSBQb3dlciBmb3IgVGVyLCAwOk9mZi8xOk9uDQotCU5WUkFNX0ZJRUxEX0FOVEVOQV9QT1dFUjMsCQkJCQkvLyBFeHRlcm5hbCBBbnRlbmEgUG93ZXIgZm9yIFRlciwgMDpPZmYvMTpPbg0KLQlOVlJBTV9GSUVMRF9FU19QSUQxLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQ0KLQlOVlJBTV9GSUVMRF9FU19QSUQyLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQ0KLQlOVlJBTV9GSUVMRF9FU19QSUQzLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQ0KLQlOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDEsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQ0KLQlOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDIsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQ0KLQlOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDMsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQ0KLQlOVlJBTV9GSUVMRF9DSF9JTkZPX1MsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQ0KLQlOVlJBTV9GSUVMRF9DSF9JTkZPX1QsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQ0KLQlOVlJBTV9GSUVMRF9DSF9JTkZPX0MsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQ0KLQlOVlJBTV9GSUVMRF9ORVRfUE9SVEFMX0lQLAkJCQkJLy8gcG9ydGFsIGlwIGFkZHJlc3MNCi0JTlZSQU1fRklFTERfTkVUX0RPV05fUEFUSCwJCQkJCS8vIE5ldHdvcmsgRG93bmxvYWQgUGF0aA0KLQlOVlJBTV9GSUVMRF9ORVRfREVWSUNFX0lELAkJCQkJLy8gZXRoZXJuZXQgZGV2aWNlIGlkIDAgPSBldGgwDQotCU5WUkFNX0ZJRUxEX05FVF9JUF9DT05GSUcsCQkJCQkvLyBESENQL01hbnVhbA0KLQlOVlJBTV9GSUVMRF9ORVRfSVBfU0VUVElORywJCQkJCS8vIE1hbnVhbCBJUCBzZXR0aW5nDQotCU5WUkFNX0ZJRUxEX09UQV9GVFBfSU5GTywJCQkJCS8vIE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UDQotCU5WUkFNX0ZJRUxEX0ZJTEVfU0laRSwJCQkJCQkvLyBmaWxlIHNpemUgb2YgYmFja2dyb3VsZCBvdGENCi0NCi0JTlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04sCQkJCQkvLyBWZXJzaW9uIG9mIGJvb3QgTG9hZGVyDQotCU5WUkFNX0ZJRUxEX0FQUF9WRVJTSU9OLAkJCQkJCS8vIFZlcnNpb24gbnVtYmVyIG9mIEFwcGxpY2F0aW9uDQotCU5WUkFNX0ZJRUxEX09UQUxEUl9WRVJTSU9OLAkJCQkJLy8gVmVyc2lvbiBvZiBPVEEgTG9hZGVyDQotCU5WUkFNX0ZJRUxEX0NVUl9PVEFJTUFHRV9WRVJTSU9OLAkJCS8vIFZlcnNpb24gbnVtYmVyIG9mIE9UQSBpbWFnZQ0KLQlOVlJBTV9GSUVMRF9MT0FERVJfVkVSLA0KLQlOVlJBTV9GSUVMRF9BUFBfVkVSLA0KLQ0KLQlOVlJBTV9GSUVMRF9MQU5HVUFHRSwJCQkJCQkvLyBPU0QgbGFuZ3VhZ2UgY29kZSBpbiBJU08gNjM5IGNvZGUNCi0JTlZSQU1fRklFTERfQ09VTlRSWV9DT0RFLAkJCQkJLy8gdW5zaWduZWQgY2hhciBhWzNdDQotCU5WUkFNX0ZJRUxEX1RWX1NUQU5EQVJELAkJCQkJCS8vIERJX1ZJREVPX1NEX1NUQU5EQVJEDQotCU5WUkFNX0ZJRUxEX1NDQVJUX1JHQiwJCQkJCQkvLyBOVlJBTV9TQ0FSVF9TRVRUSU5HX1ZBTFVFDQotCU5WUkFNX0ZJRUxEX0hEX1JFU09VTFRJT04sCQkJCQkvLyBOVlJBTV9WSURFT19SRVNPTFVUSU9OX0UNCi0JTlZSQU1fRklFTERfRklFTERfUkFURSwJCQkJCQkvLyBOVlJBTV9IRE1JX1ZJREVPX0ZJRUxEX1JBVEVfRQ0KLQlOVlJBTV9GSUVMRF9PQURfVkVSU0lPTiwJCQkJCQkvLyBmb3IgTUhFRyA/Pz8NCi0JTlZSQU1fRklFTERfUkNVX0NVU1RPTV9DT0RFLAkJCQkJLy8gZm9yIFJDVSBjdXN0b20gY29kZQ0KLQlOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUyLAkJCQkvLyBmb3IgYWx0ZXJuYXRpdmUgUkNVIGN1c3RvbSBjb2RlDQotCU5WUkFNX0ZJRUxEX1BBTkVMX0RJU1BMQVksCQkJCQkvLyBESV9PVEFfUEFORUxESVNQTEFZX3QNCi0JTlZSQU1fRklFTERfUEFORUxfRElNTUlORywJCQkJCS8vIHVuc2lnbmVkIGNoYXINCi0JTlZSQU1fRklFTERfT1NEX0RJU1BMQVksCQkJCQkJLy8gTlZSQU1fT1NEX0RJU1BMQVlfRQ0KLQlOVlJBTV9GSUVMRF9TVEFSVF9CQU5LX0ZMQUcsCQkJCQkvLyC1ziCws8DHIGJhbmvB3yC+7rXwt84gus7GwyDH0iDB9iCw4cGkDQotCU5WUkFNX0ZJRUxEX0NIRUNLX1VTQiwJCQkJCQkvLyC6zsbDIL3DIFVTQiC4tr/uxq7H2LytIGhkZrimILDLu+fH0sH2ILi7wfYgsOHBpA0KLQlOVlJBTV9GSUVMRF9DSEVDS19VU0JfQ09VTlQsCQkJCQkvLyDApyC1v8DbIL3HxtAgvcMguO4gufggwOcgvcO1tSDH0sH2IGNvdW50uKYgwPrA5Q0KLQlOVlJBTV9GSUVMRF9BU1BFQ1RfUkFUSU8sCQkJCQkvLyBOVlJBTV9BU1BFQ1RfUkFUSU9fRQ0KLQlOVlJBTV9GSUVMRF9VU0FHRV9JRCwJCQkJCQkvLyBmb3IgVVBDIE9UQQ0KLQlOVlJBTV9GSUVMRF9CSU44SywJCQkJCQkJLy8gZm9yIGVlcHJvbSBlbXVsYXRpb24NCi0JTlZSQU1fRklFTERfSVJERVRPX0NQQ0IsCQkJCQkJLy8gZm9yIElSREVUTyBDUENCDQotCU5WUkFNX0ZJRUxEX0lSREVUT19DUENCX0VOQ1JZUFRFRCwgCQkJLy8gZm9yIElSREVUTyBDUENCIChlbmNyeXB0ZWQpDQotDQotCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTlVNLCAJCQkvLyBBQ1RJVkFURURfS0VSTkVMX05VTQ0KLQlOVlJBTV9GSUVMRF9NVERfVFlQRV9GT1JfS0VSTkVMLCAJCQkvLyBNVERfVFlQRV9GT1JfS0VSTkVMDQotCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRSwJCQkvLyAia2VybmVsMCIsIGxvb2t1cCBtdGQgcGFydGl0aW9uDQotCU5WUkFNX0ZJRUxEX1BMQVRGT1JNX05BTUUsCQkJICAgICAgICAvLyBQbGF0Zm9ybSBuYW1lLCBlLmcuICJnZmhkMTAwIg0KLQlOVlJBTV9GSUVMRF9FWFRSQV9LRVJORUxfT1BULAkJICAgICAgICAJLy8gc3RyaW5nIHRvIGFwcGVuZCB0byBjbWRsaW5lDQotDQotCU5WUkFNX0ZJRUxEX1JBV0ZTID0gMHgxMDAwLA0KLQlOVlJBTV9GSUVMRF9EVU1NWSA9IDB4RkZGRg0KLX0gTlZSQU1fRklFTERfVDsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotCU5WUkFNX09UQV9GTEFHX05PX09UQQkJCT0gMHgwMCwNCi0JTlZSQU1fT1RBX0ZMQUdfREVURUNURUQJCQk9IDB4MDEsDQotCU5WUkFNX09UQV9GTEFHX0NPTVBMRVRFRAkJCT0gMHgwMiwNCi0JTlZSQU1fT1RBX0ZMQUdfRk9SQ0VfVVBHUkFERQkJPSAweDA0LA0KLQlOVlJBTV9PVEFfRkxBR19OQUdSQV9SRUNPVkVSWQk9IDB4MDgsDQotCU5WUkFNX09UQV9GTEFHX0RPV05MT0FESU5HCQk9IDB4MTAsDQotCU5WUkFNX09UQV9GTEFHX1dSSVRJTkcJCQk9IDB4MjAsDQotCU5WUkFNX09UQV9GTEFHX0VSUk9SCQkJCT0gMHg4MA0KLX0gTlZSQU1fT1RBX0ZMQUdfRTsNCi0NCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9ORVRfSVBfU0VUVElOR19UYWcNCi17DQotI2RlZmluZSBORVRfQUREUl9MRU5HVEggNA0KLQl1bnNpZ25lZCBjaGFyCQlpcFtORVRfQUREUl9MRU5HVEhdOw0KLQl1bnNpZ25lZCBjaGFyCQltYXNrW05FVF9BRERSX0xFTkdUSF07DQotCXVuc2lnbmVkIGNoYXIgCQlnYXRld2F5W05FVF9BRERSX0xFTkdUSF07DQotCXVuc2lnbmVkIGNoYXIJCWRuc1tORVRfQUREUl9MRU5HVEhdOw0KLX0gTlZSQU1fTkVUX0lQX1NFVFRJTkdfVDsNCi0NCi10eXBlZGVmIHN0cnVjdCBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVGFnDQotew0KLSNkZWZpbmUgTlZSQU1fRlRQX1VTRVJfTEVOR1RIIAkJMjANCi0jZGVmaW5lIE5WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIIAkJMjANCi0jZGVmaW5lIE5WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEggCTIwMA0KLSNkZWZpbmUgTlZSQU1fRlRQX0ZJTEVfTkFNRV9MRU5HVEggCTUwDQotCXVuc2lnbmVkIGNoYXIJCWFTZXJ2ZXJJcFtORVRfQUREUl9MRU5HVEhdOw0KLQl1bnNpZ25lZCBjaGFyIAkJYVVzZXJOYW1lW05WUkFNX0ZUUF9VU0VSX0xFTkdUSF07DQotCXVuc2lnbmVkIGNoYXIgCQlhUGFzc3dkW05WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIXTsNCi0JdW5zaWduZWQgY2hhciAJCWFEaXJQYXRoW05WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEhdOw0KLQl1bnNpZ25lZCBjaGFyIAkJYUZpbGVOYW1lW05WUkFNX0ZUUF9GSUxFX05BTUVfTEVOR1RIXTsNCi19IE5WUkFNX0ZUUF9PVEFfU0VUVElOR19UOw0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0JTlZSQU1fSVBfREhDUCA9IDAsDQotCU5WUkFNX0lQX01BTlVBTA0KLX0gTlZSQU1fTkVUX0lQX0NPTkZJR19FOw0KLQ0KLS8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQotdHlwZWRlZiBlbnVtIEhNWF9OVlJBTV9QQVJUSVRJT05fZQ0KLXsNCi0JSE1YX05WUkFNX1BBUlRJVElPTl9STywNCi0JSE1YX05WUkFNX1BBUlRJVElPTl9SVywNCi0JSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTLA0KLQlITVhfTlZSQU1fUEFSVElUSU9OX01BWA0KLX1ITVhfTlZSQU1fUEFSVElUSU9OX0U7DQotDQotDQotdHlwZWRlZiBlbnVtDQotew0KLQlEUlZfT0sJCQk9CTAsDQotIAlEUlZfRVJSLA0KLQ0KLQlEUlZfRVJSX0lOVkFMSURfUEFSQU1FVEVSLA0KLQlEUlZfRVJSX0lOSVRJQUxJWkFUSU9OLA0KLQlEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OLA0KLQlEUlZfRVJSX09VVE9GTUVNT1JZLA0KLQlEUlZfRVJSX0VYVEVSTkFMX0VSUk9SDQotDQotfURSVl9FcnJvcjsNCi0NCi0vKiBFbmQgdHlwZWRlZiAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLWV4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApOw0KLWV4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICk7DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotRFJWX0Vycm9yCUhNWF9OVlJBTV9Jbml0KHZvaWQpOw0KLURSVl9FcnJvcglITVhfTlZSQU1fV3JpdGUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7DQotRFJWX0Vycm9yCUhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOw0KLURSVl9FcnJvcglITVhfTlZSQU1fR2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSk7DQotRFJWX0Vycm9yCUhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsNCi1EUlZfRXJyb3IJSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pOw0KLURSVl9FcnJvcglITVhfTlZSQU1fUmVtb3ZlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lKTsNCi1EUlZfRXJyb3IJSE1YX05WUkFNX0Rpcih2b2lkKTsNCi0NCi0NCi0vKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCi0NCi0NCi0jZW5kaWYgIC8vIEhNWF9VUEdSQURFX05WUkFNX0hfDQotLypAfSovDQorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgSHVtYXggQ28uLCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogSHVtYXggQ28uLCBMdGQuICgiSHVtYXgiKSBoZXJlYnkgcHJvdmlkZXMgcGVybWlzc2lvbiwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueQorICogcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb3VyY2UgY29kZSwgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcworICogc291cmNlIGNvZGUgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHBlcm1pc3Npb24gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiBwZXJtaXNzaW9uIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBIVU1BWCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFDQ1VSQUNZLCBDT01QTEVURU5FU1MsCisgKiBDVVJSRU5DWSwgQVZBSUxBQklMSVRZLCBUSVRMRSBPUiBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBIVU1BWCBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIE9SIE9USEVSIERFQUxJTkdTIElOIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSB2aWV3cyBhbmQgY29uY2x1c2lvbiBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIGFyZQorICogdGhvc2Ugb2YgdGhlIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsCisgKiBwb2xpY2llcywgZWl0aGVyIGV4cHJlc3NlZCBvciBpbXBsaWVkLCBvZiBIdW1heC4KKyAqCisgKiBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZSB0aGlzCisgKiBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEh1bWF44oCZcyBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhIGxpY2Vuc2UKKyAqIG90aGVyIHRoYW4gdGhlIGFib3ZlIGxpY2Vuc2UsIHdpdGhvdXQgSHVtYXgncyBleHByZXNzIHByaW9yIHdyaXR0ZW4gY29uc2VudC4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmlsZSBOYW1lOiAgICAgICAgICAgJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uaCAgJAorICogVmVyc2lvbjogICAgICAgICAgICAgJFJldmlzaW9uOiAgIDEuMCAgJAorICogT3JpZ2luYWwgQXV0aG9yOiAgICAgWWFuZyBIeXVuIFVrICQKKyAqIEN1cnJlbnQgQXV0aG9yOiAgICAgICRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKKyAqIERhdGU6ICAgICAgICAgICAgICAgICREYXRlOiAyMDExLjExLjA3CisgKiBGaWxlIERlc2NyaXB0aW9uOiAgICBVcGdyYWRlIEFQSXMKKyAqIE1vZHVsZToKKyAqIFJlbWFya3M6CisgKi8KKworCisvKioKKyAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCisgKiBAZGF0ZSAwNyBOb3YgMjAxMQorICovCisKKyAvKkB7Ki8KKworLyoqCisgKiBAZmlsZSBobXhfdXBncmFkZV9udnJhbS5oCisgKi8KKworI2lmbmRlZiBITVhfVVBHUkFERV9OVlJBTV9IXworI2RlZmluZSBITVhfVVBHUkFERV9OVlJBTV9IXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLworLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqIEV4dGVybiB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU3RhcnQgRXh0ZXJuIHZhcmlhYmxlZSAqLworZXh0ZXJuIGludCBsaWJ1cGdyYWRlX3ZlcmJvc2U7CisKKy8qIEVuZCBFeHRlcm4gdmFyaWFibGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm8gRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFydCBNYWNybyBkZWZpbml0aW9uICovCisKKy8qIEVuZCBNYWNybyBkZWZpbml0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFN0YXJ0IHR5cGVkZWYgKi8KKwordHlwZWRlZiBlbnVtIHRhZ05WUkFNX0ZJRUxEIHsKKyAgTlZSQU1fRklFTERfU1lTVEVNX0lEID0gMCwgICAgICAgICAgICAvLyBTeXN0ZW0gSWQKKyAgTlZSQU1fRklFTERfU0VSSUFMX05PLAorICBOVlJBTV9GSUVMRF9NQUNfQUREUiwKKyAgTlZSQU1fRklFTERfSERDUF9LRVksCisgIE5WUkFNX0ZJRUxEX0RUQ1BfS0VZLAorICBOVlJBTV9GSUVMRF8xU1RfU0VSSUFMX05VTUJFUiwKKyAgTlZSQU1fRklFTERfMk5EX1NFUklBTF9OVU1CRVIsCisgIE5WUkFNX0ZJRUxEX0dQTiwKKyAgTlZSQU1fRklFTERfTUFDX0FERFJfTU9DQSwKKyAgTlZSQU1fRklFTERfTUFDX0FERFJfQlQsCisgIE5WUkFNX0ZJRUxEX0dPT0dMRV9TU0xfUEVNLAorICBOVlJBTV9GSUVMRF9HT09HTEVfU1NMX0NSVCwKKyAgTlZSQU1fRklFTERfTE9BREVSX1ZFUlNJT04sICAgICAgICAgICAvLyBWZXJzaW9uIG9mIGJvb3QgTG9hZGVyCisgIE5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTlVNLCAgICAgLy8gQUNUSVZBVEVEX0tFUk5FTF9OVU0KKyAgTlZSQU1fRklFTERfTVREX1RZUEVfRk9SX0tFUk5FTCwgICAgICAvLyBNVERfVFlQRV9GT1JfS0VSTkVMCisgIE5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTkFNRSwgICAgLy8gImtlcm5lbDAiLCBsb29rdXAgbXRkIHBhcnRpdGlvbgorICBOVlJBTV9GSUVMRF9QTEFURk9STV9OQU1FLCAgICAgICAgICAgIC8vIFBsYXRmb3JtIG5hbWUsIGUuZy4gImdmaGQxMDAiCisgIE5WUkFNX0ZJRUxEX0VYVFJBX0tFUk5FTF9PUFQsICAgICAgICAgLy8gc3RyaW5nIHRvIGFwcGVuZCB0byBjbWRsaW5lCisgIE5WUkFNX0ZJRUxEX1BBSVJFRF9ESVNLLCAgICAgICAgICAgICAgLy8gc2VyaWFsIG51bWJlciBvZiB0aGUgZGlzaworICBOVlJBTV9GSUVMRF9QQVJUSVRJT05fVkVSLCAgICAgICAgICAgIC8vIHBhcnRpdGlvbiB2ZXJzaW9uCisgIE5WUkFNX0ZJRUxEX0hXX1ZFUiwgICAgICAgICAgICAgICAgICAgLy8gaGFyZHdhcmUgcmV2aXNpb24KKyAgTlZSQU1fRklFTERfRFVNTVkgPSAweEZGRkYKK30gTlZSQU1fRklFTERfVDsKKworLyogU3RhcnQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgZW51bSBITVhfTlZSQU1fUEFSVElUSU9OX2UgeworICBITVhfTlZSQU1fUEFSVElUSU9OX1JPLAorICBITVhfTlZSQU1fUEFSVElUSU9OX1JXLAorICBITVhfTlZSQU1fUEFSVElUSU9OX1dfUkFXRlMsCisgIEhNWF9OVlJBTV9QQVJUSVRJT05fTUFYCit9IEhNWF9OVlJBTV9QQVJUSVRJT05fRTsKKworCit0eXBlZGVmIGVudW0geworICBEUlZfT0sgPSAwLAorICBEUlZfRVJSLAorICBEUlZfRVJSX0lOVkFMSURfUEFSQU1FVEVSLAorICBEUlZfRVJSX0lOSVRJQUxJWkFUSU9OLAorICBEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OLAorICBEUlZfRVJSX09VVE9GTUVNT1JZLAorICBEUlZfRVJSX0VYVEVSTkFMX0VSUk9SCit9IERSVl9FcnJvcjsKKworLyogRW5kIHR5cGVkZWYgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gaW50IEhNWF9VUEdSQURFX05WUkFNX1dyaXRlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKTsKK2V4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZSAqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9Jbml0KHZvaWQpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9Xcml0ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwTmFtZSwgdW5zaWduZWQgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcFZhbHVlLCB1bnNpZ25lZCBpbnQgdWxTaXplKTsKK0RSVl9FcnJvciAgICAgICBITVhfTlZSQU1fUmVhZChITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwgdW5zaWduZWQgaW50IHVsU2l6ZSk7CitEUlZfRXJyb3IgICAgICAgSE1YX05WUkFNX0dldEZpZWxkKE5WUkFNX0ZJRUxEX1QgZmllbGQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCBuRGF0YVNpemUpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9TZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsKK0RSVl9FcnJvciAgICAgICBITVhfTlZSQU1fR2V0TGVuZ3RoKE5WUkFNX0ZJRUxEX1QgZmllbGQsIGludCAqcExlbik7CitEUlZfRXJyb3IgICAgICAgSE1YX05WUkFNX1JlbW92ZShITVhfTlZSQU1fUEFSVElUSU9OX0UgcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE5hbWUpOworRFJWX0Vycm9yICAgICAgIEhNWF9OVlJBTV9EaXIodm9pZCk7CisvKiBFbmQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworCisjZW5kaWYgIC8vIEhNWF9VUEdSQURFX05WUkFNX0hfCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfc3lzdGVtLmMgYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQ0MmQ3Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfc3lzdGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIEZpbGUgTmFtZToJCSRXb3JrZmlsZTogICBobXhfdXByYWRlX3N5c3RlbS5jICAkDQotICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQotICogT3JpZ2luYWwgQXV0aG9yOgkJWWFuZyBIeXVuIFVrICQNCi0gKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KLSAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCi0gKiBGaWxlIERlc2NyaXB0aW9uOglIdW1heCBVcGdyYWRlIEFQSXMNCi0gKiBNb2R1bGU6DQotICogUmVtYXJrczoNCi0gKi8NCi0NCi0vKioNCi0gKiBAZGVmZ3JvdXAgVVBHUkFERV9TWVNURU0gU3lzdGVtIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlDQotICogQGluZ3JvdXAgVVBHUkFERQ0KLSAqLw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pDQotICogQGRhdGUgMzAgU2VwdCAyMDExDQotICovDQotDQotLyoqDQotICogQG5vdGUNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQotICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCi0gKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQotICogYWdyZWVtZW50IGluIHdyaXRpbmcgYmV0d2VlbiBIdW1heCBDb3Jwb3JhdGlvbiBhbmQgeW91Lg0KLSAqLw0KLQ0KLSAvKkB7Ki8NCi0NCi0vKioNCi0gKiBAZmlsZSBobXhfdXBncmFkZV9zeXN0ZW0uYw0KLSAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8NCi0jaW5jbHVkZSAiaG14X3VwZ3JhZGVfc3lzdGVtLmgiDQotLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmZGVmIFRBU0tfREVCVUcNCi0jZGVmaW5lIFByaW50RGVidWcoZm10LCAuLi4pIAkJcHJpbnRmIChmbXQsICMjIF9fVkFfQVJHU19fKQ0KLSNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikgICAgCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIFByaW50RW50ZXIoLi4uKQkJCXByaW50ZigiKCspJXNcbiIsIF9fRlVOQ1RJT05fXykNCi0jZGVmaW5lIFByaW50RXhpdCguLi4pCQkJCXByaW50ZigiKC0pJXNcbiIsIF9fRlVOQ1RJT05fXykNCi0jZWxzZQ0KLSNkZWZpbmUgUHJpbnREZWJ1ZyhmbXQsIC4uLikgICAgCXdoaWxlICgwKSAoKGludCAoKikoY2hhciAqLCAuLi4pKSAwKQ0KLSNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikJCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykNCi0jZGVmaW5lIFByaW50RW50ZXIoLi4uKSAJCQl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkNCi0jZGVmaW5lIFByaW50RXhpdCguLi4pCQkJCXdoaWxlICgwKSAoKGludCAoKikoY2hhciAqLCAuLi4pKSAwKQ0KLSNlbmRpZg0KLQ0KLQ0KLSNkZWZpbmUgbGlzdF9zaXplKGxpc3QpICgobGlzdCktPmN1cnJfbXNnX2NvdW50XykNCi0NCi0jZGVmaW5lIGxpc3RfYml0bWFwX3NpemUobGlzdCwgaSkgKChsaXN0KS0+Yml0bWFwX2NvdW50WyhpKV0pDQotDQotI2RlZmluZSBsaXN0X2hlYWQobGlzdCwgaSkgKChsaXN0KS0+aGVhZFtpXSkNCi0NCi0jZGVmaW5lIGxpc3RfdGFpbChsaXN0LCBpKSAoKGxpc3QpLT50YWlsW2ldKQ0KLQ0KLSNkZWZpbmUgbGlzdF9pc19oZWFkKGxpc3QsIGVsZW1lbnQpICgoZWxlbWVudCkgPT0gKGxpc3QpLT5oZWFkID8gMSA6IDApDQotDQotI2RlZmluZSBsaXN0X2lzX3RhaWwoZWxlbWVudCkgKChlbGVtZW50KS0+bmV4dCA9PSBOVUxMID8gMSA6IDApDQotDQotI2RlZmluZSBsaXN0X2RhdGEoZWxlbWVudCkgKChlbGVtZW50KS0+ZGF0YSkNCi0NCi0jZGVmaW5lIGxpc3RfbmV4dChlbGVtZW50KSAoKGVsZW1lbnQpLT5uZXh0KQ0KLQ0KLSNkZWZpbmUgSEFQUFkoYSkgKHZvaWQpKGEpDQotDQotLyogRW5kICNkZWZpbmUgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCB0eXBlZGVmICovDQotLyogRW5kIHR5cGVkZWYgKi8NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8NCi0NCi0vKiBFbmQgZ2xvYmFsIHZhcmlhYmxlICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgc3RhdGljIHZhcmlhYmxlICovDQotLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXN0YXRpYyBpbnQgUF9NU0dfQ2hlY2soc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIHVuc2lnbmVkIGxvbmcgcV9pZCk7DQotDQotDQotLyoNCi0gICAgbGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwDQotICAgIGJpdG1hcL+hvK0gsKHA5SCz9MC6IL/svLG8+MCnuKYgw6O0wrTZLg0KLSovDQotdW5zaWduZWQgbG9uZyBsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QpDQotew0KLSAgICBpbnQgaTsNCi0NCi0gICAgZm9yKGk9TVNHX1BSSU9SSVRZX01BWC0xOyBpPj0wOyBpLS0pDQotICAgIHsNCi0gICAgICAgIGlmKGxpc3QtPmJpdG1hcFtpXSA9PSAxKQ0KLSAgICAgICAgICAgIHJldHVybiBpOw0KLSAgICB9DQotDQotICAgIHJldHVybiAwOw0KLX0NCi0NCi0NCi0NCi0vKg0KLSAgICBwcmludF9saXN0DQotICAgIEhNWF9NU0dfcXVldWUgsbjBtsO8IMD8w7y4piBQcmludMfRtNkuDQotKi8NCi12b2lkIHByaW50X2xpc3QoY29uc3Qgc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QpDQotew0KLSAgICBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAgICAgICAgICAqZWxlbWVudDsNCi0gICAgaW50ICAgICAgICAgICAgICAgICpkYXRhLCBpLCBjb3VudDsNCi0NCi0gICAgZnByaW50ZihzdGRvdXQsICJNc2cgUXVldWUgQ3VycmVudCB0b3RhbCBzaXplIGlzICVsZFxuIiwgbGlzdF9zaXplKGxpc3QpKTsNCi0NCi0gICAgZm9yKGNvdW50PTA7IGNvdW50PE1TR19QUklPUklUWV9NQVg7IGNvdW50KyspDQotICAgIHsNCi0gICAgICAgIGkgPSAwOw0KLQ0KLSAgICAgICAgaWYoIGxpc3QtPmJpdG1hcFtjb3VudF0gIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBlbGVtZW50ID0gbGlzdF9oZWFkKGxpc3QsIGNvdW50KTsNCi0NCi0gICAgICAgICAgICB3aGlsZSAoMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgZGF0YSA9IGxpc3RfZGF0YShlbGVtZW50KTsNCi0gICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInByaW9yaXR5WyVkXSA6IHFsaXN0WyUwM2RdPSUwM2RcbiIsIGNvdW50LCBpLCAqZGF0YSk7DQotDQotICAgICAgICAgICAgICAgaSsrOw0KLQ0KLSAgICAgICAgICAgICAgIGlmIChsaXN0X2lzX3RhaWwoZWxlbWVudCkpDQotICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0X25leHQoZWxlbWVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3Rfc2V0X2JpdG1hcA0KLSAgICC/7LyxvPjAp7+hIMfYtOfHz7TCILrxxq64ysC7IHNldCDH0bTZLg0KLSovDQotdm9pZCBsaXN0X3NldF9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCi17DQotICAgIGxpc3QtPmJpdG1hcFtwcmlvXSA9IDE7DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfY2xlYXJfYml0bWFwDQotICAgIL/svLG8+MCnv6Egx9i058fPtMIguvHGrrjKwLsgY2xlYXIgx9G02S4NCi0qLw0KLXZvaWQgbGlzdF9jbGVhcl9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCi17DQotICAgIGxpc3QtPmJpdG1hcFtwcmlvXSA9IDA7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfYml0bWFwX2NvdW50X2luY3JlYXNlDQotICAgIMfYtOfHz7TCIL/svLG8+MCnwMcgYml0bWFwIENvdW50uKYgwfWwoSC9w8WytNkuDQotKi8NCi12b2lkIGxpc3RfYml0bWFwX2NvdW50X2luY3JlYXNlKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8pDQotew0KLSAgICBsaXN0LT5iaXRtYXBfY291bnRbcHJpb10rKzsNCi19DQotDQotDQotDQotLyoNCi0gICAgbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UNCi0gICAgx9i058fPtMIgv+y8sbz4wKfAxyBiaXRtYXAgQ291bnS4piCwqLzSIL3DxbK02S4NCi0qLw0KLXZvaWQgbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2Uoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykNCi17DQotICAgIGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXS0tOw0KLX0NCi0NCi0NCi0vKg0KLSAgICBsaXN0X21hcHBpbmdfdGFza19wcmlvcml0eV90b19tc2dxDQotICAgIMXCvbrFqSC/7LyxvPjAp7imILHiwdjAuLfOILjevLzB9sWlIL/svLG8+MCnuKYgsOHBpMfRtNkuDQotKi8NCi1pbnQgbGlzdF9maW5kX21zZ19xX3ByaW9yaXR5X2Zyb21fdGFza19wcmlvcml0eSh1bnNpZ25lZCBsb25nICpwcmlvKQ0KLXsNCi0gICAgc3RydWN0IHNjaGVkX3BhcmFtCXBhcmFtOw0KLSAgICBpbnQgcG9saWN5ID0gMDsNCi0gICAgaW50IHJjOw0KLQ0KLSAgICByYyA9IHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSggcHRocmVhZF9zZWxmKCksICZwb2xpY3ksICZwYXJhbSk7DQotICAgIGlmKHJjICE9IEhNWF9PSykNCi0gICAgew0KLQkJKnByaW8gPSBNU0dfUFJJT1JJVFkwOw0KLQkJcmV0dXJuIEhNWF9PSzsNCi0gICAgfQ0KLSAgICBQcmludERlYnVnKCJwb2xpY3kgPSAlZFxuIiwgcG9saWN5KTsNCi0gICAgUHJpbnREZWJ1ZygicGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAlZFxuIiwgcGFyYW0uc2NoZWRfcHJpb3JpdHkpOw0KLQ0KLSAgICBzd2l0Y2gocGFyYW0uc2NoZWRfcHJpb3JpdHkpDQotICAgIHsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTA6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkwOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMToNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkyOg0KLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTM6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkzOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNDoNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk1Og0KLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZNTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTY6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk2Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNzoNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTc7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk4Og0KLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZODsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTk6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk5Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTA6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTExOg0KLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTE7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxMjoNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTEyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTM6DQotICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTE0Og0KLSAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTQ7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxNToNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE1Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTE1Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotICAgIHJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLS8qDQotCXFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50DQotCXRlbXAgUWV1Zb+hIGVsZW1lbnS4piC/rLDhIMfRtNkuDQotKi8NCi12b2lkIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxLCBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICplbGVtZW50KQ0KLXsNCi0JaWYocS0+dGVtcF90YWlsID09IE5VTEwpDQotCXsNCi0JCXEtPnRlbXBfaGVhZCA9IGVsZW1lbnQ7DQotCQllbGVtZW50LT5uZXh0ID0gTlVMTDsNCi0JCWVsZW1lbnQtPnByZXYgPSBOVUxMOw0KLQkJcS0+dGVtcF90YWlsID0gZWxlbWVudDsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCXEtPnRlbXBfdGFpbC0+bmV4dCA9IGVsZW1lbnQ7DQotCQllbGVtZW50LT5uZXh0ID0gTlVMTDsNCi0JCWVsZW1lbnQtPnByZXYgPSBxLT50ZW1wX3RhaWw7DQotCQlxLT50ZW1wX3RhaWwgPSBlbGVtZW50Ow0KLQl9DQotfQ0KLQ0KLS8qDQotCXFfcmVtb3ZlX3RlbXBfdGFpbF9lbGVtZW50DQotCXRlbXAgUWV1Zb+hvK0guLbB9ri3IGVsZW1lbnS4piDBprDFx8+/qSCz0bDcwdi02S4NCi0qLw0KLXZvaWQgcV9yZW1vdmVfdGVtcF90YWlsX2VsZW1lbnQoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIAlzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICoqZWxlbWVudCkNCi17DQotCVByaW50RW50ZXIoKTsNCi0NCi0gICAgICAJKmVsZW1lbnQgPSBxLT50ZW1wX3RhaWw7DQotDQotCWlmKHEtPnRlbXBfaGVhZC0+bmV4dCA9PSBOVUxMKSAvL2VsZW1lbnQgMbCzILOywLogsOa/7C4NCi0Jew0KLQkJcS0+dGVtcF9oZWFkID0gTlVMTDsNCi0JCXEtPnRlbXBfdGFpbCA9IE5VTEw7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlxLT50ZW1wX3RhaWwtPnByZXYtPm5leHQgPSBOVUxMOw0KLQkJcS0+dGVtcF90YWlsID0gcS0+dGVtcF90YWlsLT5wcmV2Ow0KLQl9DQotCVByaW50RXhpdCgpOw0KLX0NCi0NCi0vKg0KLQlxX2Rlc3RvcnlfdGVtcF90YWlsDQotCXRlbXAgUWV1ZcDHIGVsZW1lbnQgbWVtb3J5uKYgvNK46r3DxbK02S4NCi0qLw0KLXZvaWQgcV9kZXN0b3J5X3RlbXBfdGFpbChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSkNCi17DQotCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgKnFfZWxlbWVudDsNCi0NCi0JUHJpbnRFbnRlcigpOw0KLQ0KLQlkbw0KLQl7DQotCQlxX2VsZW1lbnQgPSBxLT50ZW1wX3RhaWw7DQotCQlxLT50ZW1wX3RhaWwgPSBxLT50ZW1wX3RhaWwtPnByZXY7DQotDQotDQotCX0gd2hpbGUocS0+dGVtcF90YWlsICE9IE5VTEwpOw0KLQlpZiAocS0+cFBvb2wpDQotCXsNCi0JCWZyZWUocS0+cFBvb2wpOw0KLQkJcS0+cFBvb2wgPSBOVUxMOw0KLQl9DQotCWlmIChxLT5wRGF0YVBvb2wpDQotCXsNCi0JCWZyZWUocS0+cERhdGFQb29sKTsNCi0JCXEtPnBEYXRhUG9vbCA9IE5VTEw7DQotCX0NCi0NCi0JUHJpbnRFeGl0KCk7DQotfQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfcmVtX25leHQNCi0gICAgZWxlbWVudL+hvK0gZGF0YbimILvowabH0bTZLg0KLSovDQotaW50IGxpc3RfcmVtX25leHQoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciB0aW1lb3V0ZmxhZywgc3RydWN0IHRpbWVzcGVjICp0aW1lbykNCi17DQotCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpvbGRfZWxlbWVudDsNCi0JdW5zaWduZWQgbG9uZyBwcmlvOw0KLQlpbnQgcmMgPSAwOw0KLQ0KLQlQcmludEVudGVyKCk7DQotDQotCWxpc3QtPnJlYWRlcl9jb3VudF8rKzsNCi0NCi0JaWYgKChsaXN0X3NpemUobGlzdCkgPT0gMCB8fCBsaXN0LT5yZWFkZXJfY291bnRfID4gMSkgJiYgMCA9PSByYykNCi0Jew0KLQkJaWYoVFJVRSA9PSB0aW1lb3V0ZmxhZykNCi0JCXsNCi0JCQlyYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmxpc3QtPnFfbm90X2VtcHR5XywgJmxpc3QtPnFfbG9ja18sIHRpbWVvKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZsaXN0LT5xX25vdF9lbXB0eV8sICZsaXN0LT5xX2xvY2tfKTsNCi0JCX0NCi0JfQ0KLQ0KLQlsaXN0LT5yZWFkZXJfY291bnRfLS07DQotDQotCWlmKHJjICE9IDApDQotCXsNCi0JCVByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCi0JCXJldHVybiByYzsNCi0JfQ0KLQ0KLQlwcmlvID0gbGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwKGxpc3QpOw0KLQlQcmludERlYnVnKCJsaXN0X2ZpbmRfaGlnaGVzdF9wcmlvcml0eV9iaXRtYXAgOiBwcmlvID0gJWRcbiIsIHByaW8pOw0KLQ0KLQltZW1jcHkoZGF0YSwgbGlzdC0+aGVhZFtwcmlvXS0+ZGF0YSwgc2l6ZSk7DQotCW9sZF9lbGVtZW50ID0gbGlzdC0+aGVhZFtwcmlvXTsNCi0JaWYoTlVMTCA9PSBsaXN0LT5oZWFkW3ByaW9dLT5uZXh0KQ0KLQl7DQotCQlsaXN0LT5oZWFkW3ByaW9dID0gTlVMTDsNCi0JCWxpc3QtPnRhaWxbcHJpb10gPSBOVUxMOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJbGlzdC0+aGVhZFtwcmlvXSA9IGxpc3QtPmhlYWRbcHJpb10tPm5leHQ7DQotCX0NCi0NCi0JcV9pbnNlcnRfdGVtcF90YWlsX2VsZW1lbnQobGlzdCwgb2xkX2VsZW1lbnQpOw0KLQlsaXN0LT5jdXJyX21zZ19jb3VudF8tLTsNCi0JbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UobGlzdCwgcHJpbyk7DQotDQotCWlmKGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXSA9PSAwKQ0KLQkgICAgbGlzdF9jbGVhcl9iaXRtYXAobGlzdCwgcHJpbyk7DQotDQotCWlmIChsaXN0LT53cml0ZXJfY291bnRfID4gMCkNCi0JICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxpc3QtPnFfbm90X2Z1bGxfKTsNCi0NCi0JUHJpbnRFeGl0KCk7DQotDQotCXJldHVybiByYzsNCi19DQotDQotDQotc3RhdGljIHZvaWQgKnRocmVhZF9mdW5jXyh2b2lkICphcmcpDQotew0KLQlzdHJ1Y3QgSE1YX1RBU0tfYXJnICpwID0gKHN0cnVjdCBITVhfVEFTS19hcmcgKilhcmc7DQotCWludCByYyA9IDA7DQotDQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQlwLT5waWQgPSBnZXRwaWQoKTsNCi0JcC0+dGlkID0gKGxvbmcgaW50KXN5c2NhbGwoNDIyMik7DQotI2VuZGlmDQotDQotCXB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bG9ja18pOw0KLQ0KLQl3aGlsZSAocC0+c3RhcnQgPT0gMCAmJiAwID09IHJjKSAvL3dhaXQgc2lnbmFsDQotCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZwLT5jb25kXywgJnAtPmxvY2tfKTsNCi0NCi0JcHRocmVhZF9tdXRleF91bmxvY2soJnAtPmxvY2tfKTsNCi0NCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQotDQotCXAtPnRocmVhZF9pZCA9IHB0aHJlYWRfc2VsZigpOw0KLQlQcmludERlYnVnKCJbJXNdIHRhc2sgc3RhcnRlZC4uLlxuIiwgcC0+bmFtZSk7DQotI2VuZGlmDQotDQotCSgqcC0+c3RhcnRfZnVuY18pKHAtPmFyZ18pOw0KLQ0KLQlyZXR1cm4gTlVMTDsNCi19DQotDQotDQotLyoNCi0gICAgSE1YX1RBU0tfQ3JlYXRlDQotICAgIMXCvbrFqbimILv9vLrH0bTZLg0KLSovDQotaW50IEhNWF9UQVNLX0NyZWF0ZSh2b2lkICgqc3RhcnRfZnVuYykodm9pZCAqKSwgdW5zaWduZWQgbG9uZyBwcmlvLHVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nICp0YXNrSWQsIGludCBJc0pvaW5hYmxlKQ0KLXsNCi0gICAgaW50IHJjOw0KLSAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2s7DQotICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOw0KLSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0Jc2NoUGFyYW07DQotICAgIHVuc2lnbmVkIGNoYXIgKnB1Y0RzdFN0YWNrQWRkciA9IE5VTEw7DQotCXVuc2lnbmVkIGNoYXIgKnB1Y1Rhc2tTdGFjazsNCi0NCi0gICAgcmMgPSBwdGhyZWFkX2F0dHJfaW5pdCAoJnRocmVhZF9hdHRyKTsNCi0gICAgaWYgKHJjKSB7DQotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KLSAgICB9DQotDQotCXJjID0gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5ICgmdGhyZWFkX2F0dHIsIEhNWF9UQVNLX1BUSFJFQURfREVGQVVMVF9QUklPKTsNCi0JaWYgKHJjKSB7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaFBhcmFtKTsNCi0Jc2NoUGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvOw0KLQlyYyA9IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtICgmdGhyZWFkX2F0dHIsICZzY2hQYXJhbSk7DQotCWlmIChyYykgew0KLQkJcmV0dXJuIEhNWF9FUlJPUjsNCi0JfQ0KLQ0KLSAgICBpZiAoc3RhY2tfc2l6ZSA8IEhNWF9UQVNLX1BUSFJFQURfU1RBQ0tfTUlOKQ0KLSAgICAgICAgc3RhY2tfc2l6ZSA9IEhNWF9UQVNLX1BUSFJFQURfU1RBQ0tfTUlOOw0KLQ0KLQlwdWNUYXNrU3RhY2sgPSBtYWxsb2Moc3RhY2tfc2l6ZStITVhfVEFTS19TVEFDS19PVkVSSEVBRF9TSVpFK0hNWF9UQVNLX0dVQVJEX1NJWkUpOw0KLQlpZiAocHVjVGFza1N0YWNrID09IE5VTEwpDQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLSAgICBtZW1zZXQocHVjVGFza1N0YWNrLCAweEE1LCBzdGFja19zaXplK0hNWF9UQVNLX1NUQUNLX09WRVJIRUFEX1NJWkUrSE1YX1RBU0tfR1VBUkRfU0laRSApOw0KLQ0KLSAgICBQcmludERlYnVnKCIlcyglZCkgOiBwdWNUYXNrU3RhY2sgPSAlcCwgc3RhY2tfc2l6ZT0gJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHB1Y1Rhc2tTdGFjaywgc3RhY2tfc2l6ZSk7DQotICAgIHJjID0gcHRocmVhZF9hdHRyX3NldHN0YWNrKCZ0aHJlYWRfYXR0ciwgKHZvaWQgKilwdWNUYXNrU3RhY2ssIHN0YWNrX3NpemUgKTsNCi0gICAgaWYgKHJjKSB7DQotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHJjID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCZ0aHJlYWRfYXR0ciwodm9pZCAqKSZwdWNEc3RTdGFja0FkZHIsIChzaXplX3QgKikmc3RhY2tfc2l6ZSApOw0KLSAgICBpZiAocmMpIHsNCi0gICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgIH0NCi0gICAgUHJpbnREZWJ1ZygiJXMoJWQpIDogcHVjRHN0U3RhY2tBZGRyID0gJXAsIHN0YWNrX3NpemU9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwdWNEc3RTdGFja0FkZHIsIHN0YWNrX3NpemUpOw0KLQ0KLSAgICBpZiAoSXNKb2luYWJsZSA9PSBUUlVFKQ0KLSAgICB7DQotICAgICAgICByYyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKElzSm9pbmFibGUgPT0gRkFMU0UpDQotICAgIHsNCi0gICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgUHJpbnRFcnJvcigiJXMoJXMpIDogSXNKb2luYWJsZSBQYXJhbWV0ZXIgRXJyb3IhIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsNCi0gICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaWYgKHJjKSB7DQotICAgICAgICBQcmludEVycm9yICgiJXMoJWQpIDogRmFpbGVkIHRvIElzSm9pbmFibGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yIChyYykpOw0KLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBpZiAodGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBITVhfVEFTSykpLCBOVUxMID09IHRhc2spIHsNCi0gICAgICAgICp0YXNrSWQgPSAwOw0KLSAgICAgICAgZnJlZShwdWNUYXNrU3RhY2spOw0KLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICB0YXNrLT50YXJnXy5zdGFydF9mdW5jXwk9IHN0YXJ0X2Z1bmM7DQotICAgIHRhc2stPnRhcmdfLmFyZ18gCQk9IGFyZzsNCi0gICAgdGFzay0+dGFyZ18ucHJpb3JpdHlfCT0gcHJpbzsNCi0gICAgdGFzay0+dGFyZ18uc3RhY2tTaXplXwk9IHN0YWNrX3NpemU7DQotICAgIHRhc2stPnRhcmdfLklzSm9pbmFibGUJPSBJc0pvaW5hYmxlOw0KLSAgICB0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXB1Y1Rhc2tTdGFjazsNCi0gICAgdGFzay0+dGFyZ18ucHVsU3RhY2tTdGFydEFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyAqKXB1Y0RzdFN0YWNrQWRkcjsNCi0NCi0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ0YXNrLT50YXJnXy5sb2NrXywgTlVMTCk7DQotICAgIHB0aHJlYWRfY29uZF9pbml0KCZ0YXNrLT50YXJnXy5jb25kXywgTlVMTCk7DQotICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsNCi0NCi0gICAgc3RybmNweSh0YXNrLT50YXJnXy5uYW1lLCBuYW1lLCBzaXplb2YodGFzay0+dGFyZ18ubmFtZSktMSk7DQotDQotICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJnRhc2stPnRhc2tfLCAmdGhyZWFkX2F0dHIsIHRocmVhZF9mdW5jXywgJnRhc2stPnRhcmdfKTsNCi0gICAgaWYgKHJjKSB7DQotICAgICAgICBmcmVlKHB1Y1Rhc2tTdGFjayk7DQotICAgICAgICBmcmVlKHRhc2spOw0KLSAgICAgICAgKnRhc2tJZCA9IDA7DQotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KLSAgICB9DQotDQotICAgICp0YXNrSWQgPSAodW5zaWduZWQgbG9uZyl0YXNrOw0KLQ0KLSNpZiBkZWZpbmVkKENPTkZJR19UQVNLX1BSSU9SSVRZKQ0KLQlwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIEhNWF9UQVNLX1BUSFJFQURfREVGQVVMVF9QUklPLCAmc2NoUGFyYW0pOw0KLSNlbmRpZg0KLQ0KLSAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOw0KLSAgICBQcmludERlYnVnKCIlcyglZCkgOiBzX3VjVGFza0NvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc191Y1Rhc2tDb3VudCk7DQotICAgIHJldHVybiBITVhfT0s7DQotfQ0KLQ0KLWludCBITVhfVEFTS19TdGFydCh1bnNpZ25lZCBsb25nIHRhc2tJZCkNCi17DQotICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7DQotICAgIFByaW50RW50ZXIoKTsNCi0NCi0gICAgaWYoTlVMTCA9PSB0YXNrKQ0KLSAgICB7DQotICAgICAgICBQcmludEVycm9yKCIlcyglZCkgOiB0YXNrIGlzIE5VTEwhIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsNCi0gICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgIH0NCi0NCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7DQotICAgIGlmICh0YXNrLT50YXJnXy5zdGFydCA9PSAwKSB7DQotICAgIAl0YXNrLT50YXJnXy5zdGFydCA9IDE7DQotICAgIAlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0YXNrLT50YXJnXy5jb25kXyk7DQotICAgIH0NCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCi0gICAgUHJpbnRFeGl0KCk7DQotICAgIHJldHVybiBITVhfT0s7DQotfQ0KLQ0KLS8qDQotICAgIEhNWF9UQVNLX1N0b3ANCi0gICAgVGFza7imILz2x+C1yCDAzMjEv6EgwMwgx9S89rimIMijw+LH2LW1IFNUT1DAuiC1x8H2IL7KtMK02S4NCi0gICAgtNzB9iBjb3VudLi4IDDAuLfOILi4tee02S4NCi0qLw0KLWludCBITVhfVEFTS19TdG9wKHVuc2lnbmVkIGxvbmcgdGFza0lkKQ0KLXsNCi0gICAgc3RydWN0IEhNWF9UQVNLICp0YXNrID0gKHN0cnVjdCBITVhfVEFTSyAqKXRhc2tJZDsNCi0NCi0gICAgUHJpbnRFbnRlcigpOw0KLQ0KLSAgICBpZiAodGFzayA9PSBOVUxMKSB7DQotICAgICAgICByZXR1cm4gSE1YX09LOw0KLSAgICB9DQotDQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOw0KLSAgICBpZiAodGFzay0+dGFyZ18uc3RhcnQgIT0gMCkNCi0gICAgICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsNCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCi0NCi0gICAgcmV0dXJuIEhNWF9PSzsNCi19DQotDQotLyoNCi0gICAgc2xlZXANCi0gICAgxcK9usWpuKYgwOHA57/utNkuDQotKi8NCi1pbnQgSE1YX1NsZWVwKHVuc2lnbmVkIGxvbmcgdWx0aW1lKQ0KLXsNCi0Jc3RydWN0IHRpbWVzcGVjIGRlbGF5Ow0KLQlzdHJ1Y3QgdGltZXNwZWMgcmVtOw0KLQlpbnQgcmM7DQotDQotCWlmICh1bHRpbWUgIT0gMCkNCi0Jew0KLQkJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOw0KLQl9DQotCWRlbGF5LnR2X3NlYyA9IHVsdGltZSAvIDEwMDA7DQotCWRlbGF5LnR2X25zZWMgPSAodWx0aW1lICUgMTAwMCkgKiAxMDAwMDAwOw0KLQ0KLQlmb3IgKDs7KSB7DQotCQlyYyA9IG5hbm9zbGVlcCgmZGVsYXksICZyZW0pOw0KLQkJaWYgKDAgIT0gcmMpIHsNCi0JCQlpZiAoRUlOVFIgPT0gZXJybm8pIHsNCi0JCQkJZGVsYXkgPSByZW07DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQkJfQ0KLQkJYnJlYWs7DQotCX0NCi0NCi0JcmV0dXJuIEhNWF9PSzsNCi19DQotDQotLyoNCi0gICAgSE1YX1RBU0tfRGVzdHJveQ0KLSAgICDFwr26xam4piC80rjqx9G02S4NCi0qLw0KLWludCBITVhfVEFTS19EZXN0cm95KHVuc2lnbmVkIGxvbmcgdGFza0lkKQ0KLXsNCi0gICAgaW50IHJjOw0KLSAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOw0KLQ0KLSAgICBpZiggdGFza0lkID09ICh1bnNpZ25lZCBsb25nKU5VTEwgKQ0KLSAgICB7DQotICAgICAgICBQcmludERlYnVnKCIlcyglZCkgdGFza0lkID09IE5VTExcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOw0KLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0JCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOw0KLQkJaWYgKHRhc2stPnRhcmdfLnN0YXJ0ID09IDEpDQotCQl7DQotCQkJdGFzay0+dGFyZ18uc3RhcnQgPSAwOw0KLQkJfQ0KLQkJcmMgPSBwdGhyZWFkX2NhbmNlbCh0YXNrLT50YXNrXyk7DQotCQlpZiAocmMpDQotCQl7DQotCQkJUHJpbnRFcnJvcigiW0hNWF9UQVNLX0Rlc3Ryb3ldIHdhcm5pbmcgOiB0aGVyZSBpcyBubyB0aHJlYWQgaW4gcHRocmVhZCB0YXNrSWQoJTA4WCkgcHRocmVhZElkKCUwOFgpXG4iLCB0YXNrSWQsIHRhc2stPnRhc2tfKTsNCi0JCX0NCi0JCUhNWF9TbGVlcCgxKTsNCi0jaWYgZGVmaW5lZChDT05GSUdfVEhSRUFEX0pPSU5fVEVNUE9SQVJZKQ0KLSNlbHNlDQotCQlpZiAodGFzay0+dGFyZ18uSXNKb2luYWJsZSkNCi0jZW5kaWYNCi0JCQlwdGhyZWFkX2pvaW4odGFzay0+dGFza18sIE5VTEwpOw0KLQ0KLQkJZnJlZSh0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2spOw0KLQkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCi0gICAgfQ0KLQ0KLSAgICBmcmVlKHRhc2spOw0KLQ0KLSAgICByZXR1cm4gSE1YX09LOw0KLX0NCi0NCi0vKg0KLSAgICBITVhfVEFTS19TZXRDdXJyZW50UHJpb3JpdHkNCi0gICAgu/W3zr/uIL/svLG8+MCnuKYgvLzGw8fRtNkuDQotKi8NCi1pbnQgSE1YX1RBU0tfU2V0Q3VycmVudFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgdGFza0lkLCB1bnNpZ25lZCBsb25nIG5ld3ByaW9yaXR5KQ0KLXsNCi0JaW50IHJjOw0KLQlpbnQgcG9saWN5Ow0KLQlzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOw0KLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0Jc2NoUGFyYW07DQotDQotCWlmICh0YXNrID09IE5VTEwpDQotCXsNCi0JCXJldHVybiBITVhfRVJST1I7DQotCX0NCi0NCi0JcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGFzay0+dGFza18sICZwb2xpY3ksICZzY2hQYXJhbSk7DQotCWlmIChzY2hQYXJhbS5zY2hlZF9wcmlvcml0eSA9PSAoaW50KW5ld3ByaW9yaXR5KQ0KLQl7DQotCQlyZXR1cm4gSE1YX09LOw0KLQl9DQotDQotCXNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5IAk9IG5ld3ByaW9yaXR5Ow0KLQ0KLQlwdGhyZWFkX211dGV4X2xvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCi0JcmMgPSBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIHBvbGljeSwgJnNjaFBhcmFtKTsNCi0JcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsNCi0NCi0JaWYgKHJjKSB7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfaW5pdA0KLSAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimIMPKseLIrSDH0bTZLg0KLSovDQotdm9pZCBsaXN0X2luaXQoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgdWxTaXplLCB1bnNpZ25lZCBsb25nIHVsQ291bnQsIHVuc2lnbmVkIGNoYXIgdWNTdXNwZW5kVHlwZSkNCi17DQotICAgIGludCBpOw0KLQ0KLSAgICBsaXN0LT5jdXJyX21zZ19jb3VudF8gPSAwOw0KLSAgICBsaXN0LT5tc2dfc2l6ZV8gPSB1bFNpemU7DQotICAgIGxpc3QtPm1zZ19jb3VudF8gPSB1bENvdW50Ow0KLSAgICBsaXN0LT53cml0ZXJfY291bnRfID0gMDsNCi0gICAgbGlzdC0+cmVhZGVyX2NvdW50XyA9IDA7DQotICAgIGxpc3QtPnN1c3BlbmRfdHlwZV8gPSB1Y1N1c3BlbmRUeXBlOw0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpc3QtPnFfbG9ja18sIE5VTEwpOw0KLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbGlzdC0+cV9ub3RfZW1wdHlfLCBOVUxMKTsNCi0gICAgcHRocmVhZF9jb25kX2luaXQoJmxpc3QtPnFfbm90X2Z1bGxfLCBOVUxMKTsNCi0NCi0gICAgbGlzdC0+dGVtcF9oZWFkID0gTlVMTDsNCi0gICAgbGlzdC0+dGVtcF90YWlsID0gTlVMTDsNCi0NCi0gICAgZm9yKGk9MDsgaTxNU0dfUFJJT1JJVFlfTUFYOyBpKyspDQotICAgIHsNCi0gICAgICAgIGxpc3QtPmhlYWRbaV0gPSBOVUxMOw0KLSAgICAgICAgbGlzdC0+dGFpbFtpXSA9IE5VTEw7DQotICAgICAgICBsaXN0LT5iaXRtYXBfY291bnRbaV0gPSAwOw0KLSAgICAgICAgbGlzdC0+Yml0bWFwW2ldID0gMDsNCi0gICAgfQ0KLQ0KLSNpZmRlZiBITVhfTVNHX0RFQlVHDQotICAgIGxpc3QtPnNlbmRUaWNrID0gMDsNCi0gICAgbGlzdC0+cmVjZWl2ZVRpY2sgPSAwOw0KLSAgICBsaXN0LT5sYXN0U2VuZFRpY2sgPSAwOw0KLSAgICBsaXN0LT5sYXN0UmVjZWl2ZVRpY2sgPSAwOw0KLSNlbmRpZg0KLSAgICByZXR1cm47DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfZGVzdHJveQ0KLSAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimILzSuOq9w8WytNkuDQotKi8NCi12b2lkIGxpc3RfZGVzdHJveShzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCkNCi17DQotCXZvaWQgICAgICAgICAgICAgICAqZGF0YTsNCi0NCi0JZGF0YSA9IChjaGFyICopbWFsbG9jKGxpc3QtPm1zZ19zaXplXyk7DQotDQotCXdoaWxlIChsaXN0X3NpemUobGlzdCkgPiAwKQ0KLQl7DQotCQlpZiAoIGxpc3RfcmVtX25leHQobGlzdCwgKHZvaWQgKilkYXRhLCBsaXN0LT5tc2dfc2l6ZV8sIEZBTFNFLCBGQUxTRSkgIT0gMCApDQotCQl7DQotCQkJUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0IEVycm9yISFcbiIsIF9fZnVuY19fKTsNCi0JCX0NCi0JfQ0KLQ0KLQlmcmVlKGRhdGEpOw0KLQlyZXR1cm47DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIGxpc3RfaW5zX25leHQNCi0gICAgZWxlbWVudL+hIGRhdGG4piDD37Chx9G02S4NCi0qLw0KLWludCBsaXN0X2luc19uZXh0KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8sIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciB0aW1lb3V0ZmxhZywgc3RydWN0IHRpbWVzcGVjICp0aW1lbykNCi17DQotCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpuZXdfZWxlbWVudDsNCi0JaW50IHJjID0gMDsNCi0NCi0JUHJpbnRFbnRlcigpOw0KLQ0KLQlsaXN0LT53cml0ZXJfY291bnRfKys7DQotDQotCXdoaWxlIChsaXN0LT5tc2dfY291bnRfID09IGxpc3QtPmN1cnJfbXNnX2NvdW50XyAmJiAwID09IHJjKQ0KLQl7DQotCSAgICBpZihUUlVFID09IHRpbWVvdXRmbGFnKQ0KLQkgICAgew0KLQkgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfLCB0aW1lbyk7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfKTsNCi0JICAgIH0NCi0JfQ0KLQ0KLQlsaXN0LT53cml0ZXJfY291bnRfLS07DQotDQotCWlmKHJjICE9IDApDQotCXsNCi0JICAgIFByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCi0JICAgIHJldHVybiByYzsNCi0JfQ0KLQ0KLQlxX3JlbW92ZV90ZW1wX3RhaWxfZWxlbWVudChsaXN0LCAmbmV3X2VsZW1lbnQpOw0KLQ0KLQltZW1jcHkobmV3X2VsZW1lbnQtPmRhdGEsIGRhdGEsIHNpemUpOw0KLQ0KLQlpZihsaXN0LT50YWlsW3ByaW9dID09IE5VTEwpDQotCXsNCi0JCWxpc3QtPmhlYWRbcHJpb10gPSBuZXdfZWxlbWVudDsNCi0JCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsNCi0JCW5ld19lbGVtZW50LT5wcmV2ID0gTlVMTDsNCi0JCWxpc3QtPnRhaWxbcHJpb10gPSBuZXdfZWxlbWVudDsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWxpc3QtPnRhaWxbcHJpb10tPm5leHQgPSBuZXdfZWxlbWVudDsNCi0JCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsNCi0JCW5ld19lbGVtZW50LT5wcmV2ID0gbGlzdC0+dGFpbFtwcmlvXTsNCi0JCWxpc3QtPnRhaWxbcHJpb10gPSBuZXdfZWxlbWVudDsNCi0JfQ0KLQ0KLQlsaXN0LT5jdXJyX21zZ19jb3VudF8rKzsNCi0JbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2UobGlzdCwgcHJpbyk7DQotCWxpc3Rfc2V0X2JpdG1hcChsaXN0LCBwcmlvKTsNCi0NCi0JaWYgKGxpc3QtPnJlYWRlcl9jb3VudF8gPiAwKQ0KLQkJcHRocmVhZF9jb25kX3NpZ25hbCgmbGlzdC0+cV9ub3RfZW1wdHlfKTsNCi0NCi0JUHJpbnRFeGl0KCk7DQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLS8qDQotICAgIEhNWF9NU0dfSW5pdA0KLSAgICC43ry8wfYgxaW4piDDyrHiyK0gx9G02S4NCi0qLw0KLWludCBITVhfTVNHX0luaXQodm9pZCkNCi17DQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCi0JVEFJTFFfSU5JVCgmbXNnX3FfbGlzdF9oZWFkKTsNCi0jZW5kaWYNCi0gICAgcmV0dXJuIEhNWF9PSzsNCi19DQotDQotDQotLyoNCi0gICAgSE1YX01TR19DcmVhdGUNCi0gICAguN68vMH2IMWluKYgu/28usfRtNkuDQotKi8NCi1pbnQgSE1YX01TR19DcmVhdGUodW5zaWduZWQgbG9uZyBxX2NvdW50LCB1bnNpZ25lZCBsb25nIG1zZ19zaXplLA0KLQljb25zdCBjaGFyICpxX25hbWUsIHVuc2lnbmVkIGxvbmcgKnFfaWQsIEhNWF9TVVNQRU5EVFlQRSBzdXNwZW5kVHlwZSkNCi17DQotICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7DQotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnQ7DQotICAgIHVuc2lnbmVkIGxvbmcJCQkJCWk7DQotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnRfcG9vbDsNCi0JdW5zaWduZWQgY2hhcgkJCQkJKmRhdGFfcG9vbDsNCi0JSEFQUFkocV9uYW1lKTsNCi0NCi0gICAgUHJpbnRFbnRlcigpOw0KLQ0KLSAgICBpZihzdXNwZW5kVHlwZSA+PSBITVhfU1VTUEVORFRZUEVfTUFYKQ0KLSAgICB7DQotICAgICAgICBQcmludEVycm9yKCIlc1slZF0gOiB1bFN1c3BlbmRUeXBlICVkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAgc3VzcGVuZFR5cGUpOw0KLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBpZigocSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfcXVldWUpKSkgPT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogbWFsbG9jIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsNCi0gICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgIH0NCi0NCi0JbWVtc2V0KHEsIDAsIHNpemVvZihzdHJ1Y3QgSE1YX01TR19xdWV1ZSkpOw0KLQ0KLSAgICBsaXN0X2luaXQocSwgbXNnX3NpemUsIHFfY291bnQsIHN1c3BlbmRUeXBlKTsNCi0JcV9lbGVtZW50X3Bvb2wgPSAoc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfZWxlbWVudCkqcV9jb3VudCk7DQotCWRhdGFfcG9vbCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG1zZ19zaXplKnFfY291bnQpOw0KLSAgICBmb3IoaT0wOyBpPHFfY291bnQ7IGkrKykNCi0gICAgew0KLQkJcV9lbGVtZW50ID0gJnFfZWxlbWVudF9wb29sW2ldOw0KLQkJcV9lbGVtZW50LT5kYXRhID0gJmRhdGFfcG9vbFtpKm1zZ19zaXplXTsNCi0gICAgICAgIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHEsIHFfZWxlbWVudCk7DQotICAgIH0NCi0JcS0+cERhdGFQb29sID0gZGF0YV9wb29sOw0KLQlxLT5wUG9vbCA9IHFfZWxlbWVudF9wb29sOw0KLQ0KLSAgICAqcV9pZCA9ICh1bnNpZ25lZCBsb25nKXE7DQotDQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCi0JVEFJTFFfSU5TRVJUX1RBSUwoJm1zZ19xX2xpc3RfaGVhZCwgcSwgZW50cmllcyk7DQotI2VuZGlmDQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQlpZiAocV9uYW1lKQ0KLQkJc3RybmNweShxLT5uYW1lLCBxX25hbWUsIHNpemVvZihxLT5uYW1lKS0xKTsNCi0JZWxzZQ0KLQkJcS0+bmFtZVswXSA9IDA7DQotI2VuZGlmDQotCVByaW50RXhpdCgpOw0KLQ0KLSAgICByZXR1cm4gSE1YX09LOw0KLX0NCi0NCi0NCi0vKg0KLSAgICBITVhfTVNHX0Rlc3Ryb3kNCi0gICAguN68vMH2xaW4piC80rjqvcPFsrTZLg0KLSovDQotaW50IEhNWF9NU0dfRGVzdHJveSh1bnNpZ25lZCBsb25nIHFfaWQpDQotew0KLQlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsNCi0NCi0JUHJpbnRFbnRlcigpOw0KLQ0KLQlxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsNCi0NCi0JaWYocSA9PSBOVUxMKQ0KLQl7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9mdWxsXyk7DQotCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9lbXB0eV8pOw0KLQlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnEtPnFfbG9ja18pOw0KLQ0KLQlsaXN0X2Rlc3Ryb3kocSk7DQotCXFfZGVzdG9yeV90ZW1wX3RhaWwocSk7DQotDQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCi0JVEFJTFFfUkVNT1ZFKCZtc2dfcV9saXN0X2hlYWQsIHEsIGVudHJpZXMpOw0KLSNlbmRpZg0KLQ0KLQlpZihxICE9IE5VTEwpDQotCXsNCi0JCWZyZWUocSk7DQotCX0NCi0NCi0JUHJpbnRFeGl0KCk7DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLWludCBITVhfTVNHX0NsZWFyKHVuc2lnbmVkIGxvbmcgcV9pZCkNCi17DQotCXN0cnVjdCBITVhfTVNHX3F1ZXVlIAkJCSAgKnE7DQotCWludCByYyA9IEhNWF9PSzsNCi0JLy8JICBzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7DQotCWxvbmcgbG9uZyBleHBfbnNlYzsNCi0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvLCBjdXJfdGltZTsNCi0JdW5zaWduZWQgbG9uZyBzaXplOw0KLQl2b2lkCQkJKnBCdWY7DQotDQotDQotCVByaW50RW50ZXIoKTsNCi0NCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQotDQotCXNpemUgPSBxLT5tc2dfc2l6ZV87DQotCXBCdWYgPSBtYWxsb2Moc2l6ZSk7DQotCWlmIChwQnVmID09IE5VTEwpDQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQ0KLQkodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KLQlkbw0KLQl7DQotDQotCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOw0KLQkJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCArIChsb25nIGxvbmcpY3VyX3RpbWUudHZfbnNlYzsNCi0JCXRpbWVvLnR2X3NlYyA9IGV4cF9uc2VjIC8gKDEwMDAgKiAxMDAwICogMTAwMCk7DQotCQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCi0NCi0JCXJjID0gbGlzdF9yZW1fbmV4dChxLCBwQnVmLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KLQkJaWYoSE1YX09LICE9IHJjKQ0KLQkJew0KLQkJCWlmKEVUSU1FRE9VVCA9PSByYykNCi0JCQl7DQotCQkJCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCi0JCQkJZnJlZShwQnVmKTsNCi0JCQkJcmV0dXJuIEhNWF9PSzsNCi0JCQl9DQotCQl9DQotCX13aGlsZSAoMSk7DQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQotCXByaW50X2xpc3QocSk7DQotI2VuZGlmDQotDQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCi0NCi0JZnJlZShwQnVmKTsNCi0JUHJpbnRFeGl0KCk7DQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLS8qDQotICAgIEhNWF9NU0dfU2VuZA0KLSAgICC43ry8wfa4piC6uLO9tNkuDQotKi8NCi1pbnQgSE1YX01TR19TZW5kKHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpDQotew0KLSAgICBzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsNCi0gICAgaW50IHJjID0gSE1YX09LOw0KLSAgICB1bnNpZ25lZCBsb25nIHByaW87DQotDQotICAgIFByaW50RW50ZXIoKTsNCi0NCi0gICAgcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQotDQotICAgIGlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQotICAgIHsNCi0gICAgICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsNCi0gICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgIH0NCi0NCi0JSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOw0KLQ0KLQlyYyA9IFBfTVNHX0NoZWNrKHEsIHFfaWQpOw0KLQlpZiAoSE1YX09LICE9IHJjKQ0KLQl7DQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQotI2VuZGlmDQotCQlyZXR1cm4gcmM7DQotCX0NCi0NCi0gICAgaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQotICAgIHsNCi0gICAgICAgIHJjID0gbGlzdF9maW5kX21zZ19xX3ByaW9yaXR5X2Zyb21fdGFza19wcmlvcml0eSgmcHJpbyk7DQotICAgICAgICBpZihyYyAhPSBITVhfT0spDQotICAgICAgICB7DQotCQkJcHJpbyA9IE1TR19QUklPUklUWTA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsNCi0gICAgfQ0KLQ0KLSAgICAodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KLQ0KLSAgICByYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7DQotDQotICAgIGlmKEhNWF9PSyAhPSByYykNCi0gICAgew0KLSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KLSAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLSAgICAgICAgcmV0dXJuIHJjOw0KLSAgICB9DQotDQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQotICAgIHByaW50X2xpc3QocSk7DQotI2VuZGlmDQotDQotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCi0NCi0jaWZkZWYgSE1YX01TR19ERUJVRw0KLSAgICBxLT5sYXN0U2VuZFRpY2sgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQotI2VuZGlmDQotDQotICAgIFByaW50RXhpdCgpOw0KLQ0KLSAgICByZXR1cm4gSE1YX09LOw0KLX0NCi0NCi0NCi0NCi0vKg0KLSAgICBITVhfTVNHX1NlbmRUaW1lb3V0DQotICAgILjevLzB9rimIFRpbWVvdXSzu7+hILq4s7202S4NCi0qLw0KLWludCBITVhfTVNHX1NlbmRUaW1lb3V0KHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkNCi17DQotCXN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOw0KLQlpbnQgcmMgPSBITVhfT0s7DQotCXVuc2lnbmVkIGxvbmcgcHJpbyA9IDA7DQotCXN0cnVjdCB0aW1lc3BlYyB0aW1lbzsNCi0Jc3RydWN0IHRpbWVzcGVjIGN1cl90aW1lOw0KLQlsb25nIGxvbmcgZXhwX25zZWM7DQotDQotCVByaW50RW50ZXIoKTsNCi0NCi0JaWYgKHRpbWVvdXQgIT0gMCkNCi0Jew0KLS8vCQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7DQotCX0NCi0JaWYgKHRpbWVvdXQgPT0gMHhGRkZGRkZGRikNCi0Jew0KLQkJcmV0dXJuIEhNWF9NU0dfU2VuZChxX2lkLCBtc2csIHNpemUpOw0KLQl9DQotDQotCXEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOw0KLQ0KLQlpZihzaXplID4gcS0+bXNnX3NpemVfKQ0KLQl7DQotCQlQcmludEVycm9yKCIlc1slZF0gOiBzaXplICVsZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7DQotCQlyZXR1cm4gSE1YX0VSUk9SOw0KLQl9DQotDQotCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7DQotCWlmIChITVhfT0sgIT0gcmMpDQotCXsNCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQotCQlQcmludEVycm9yKCIlcyglZCkgOiBQX01TR19DaGVjayA6IEhNWF9NU0dfRlVMTCEhIHF1ZXVlIG5hbWUgOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBxLT5uYW1lKTsNCi0jZW5kaWYNCi0JCXJldHVybiByYzsNCi0JfQ0KLQ0KLQlpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykNCi0Jew0KLQkJcmMgPSBsaXN0X2ZpbmRfbXNnX3FfcHJpb3JpdHlfZnJvbV90YXNrX3ByaW9yaXR5KCZwcmlvKTsNCi0JCWlmKHJjICE9IEhNWF9PSykNCi0JCXsNCi0JCQlwcmlvID0gTVNHX1BSSU9SSVRZMDsNCi0JCX0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXByaW8gPSBNU0dfUFJJT1JJVFkwOw0KLQl9DQotDQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZjdXJfdGltZSk7DQotCWV4cF9uc2VjID0gKGxvbmcgbG9uZyljdXJfdGltZS50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDAgKyBjdXJfdGltZS50dl9uc2VjOw0KLQlpZiAodGltZW91dCAhPSAwKQ0KLQkJZXhwX25zZWMgKz0gKHRpbWVvdXQgKiAxMDAwIC0gOTk5KSAqIDEwMDA7DQotCXRpbWVvLnR2X3NlYyA9IGV4cF9uc2VjIC8gKDEwMDAgKiAxMDAwICogMTAwMCk7DQotCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOw0KLQ0KLQkodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOw0KLQ0KLQlyYyA9IGxpc3RfaW5zX25leHQocSwgcHJpbywgbXNnLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KLQlpZihITVhfT0sgIT0gcmMpDQotCXsNCi0JICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCi0NCi0JICAgIGlmKEVUSU1FRE9VVCA9PSByYykNCi0JICAgIHsNCi0JICAgICAgICBQcmludERlYnVnKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gSE1YX1RJTUVPVVQhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQotCSAgICAgICAgcmV0dXJuIEhNWF9USU1FT1VUOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICAgIFByaW50RXJyb3IoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCi0JICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KLQkgICAgfQ0KLQl9DQotDQotI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UDQotCXByaW50X2xpc3QocSk7DQotI2VuZGlmDQotDQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsNCi0NCi0JUHJpbnRFeGl0KCk7DQotDQotCXJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLS8qDQotICAgIEhNWF9NU0dfU2VuZFVyZ2VudA0KLSAgICCx5LHeILjevLzB9rimILq4s7202S4NCi0qLw0KLWludCBITVhfTVNHX1NlbmRVcmdlbnQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCi17DQotICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOw0KLSAgICBpbnQgcmMgPSBITVhfT0s7DQotICAgIHVuc2lnbmVkIGxvbmcgcHJpbzsNCi0NCi0gICAgUHJpbnRFbnRlcigpOw0KLQ0KLSAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsNCi0NCi0gICAgaWYoc2l6ZSA+IHEtPm1zZ19zaXplXykNCi0gICAgew0KLSAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogc2l6ZSAlbGQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNpemUpOw0KLSAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsNCi0gICAgfQ0KLQ0KLQlyYyA9IFBfTVNHX0NoZWNrKHEsIHFfaWQpOw0KLQlpZiAoSE1YX09LICE9IHJjKQ0KLQl7DQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQotI2VuZGlmDQotCQlyZXR1cm4gcmM7DQotCX0NCi0NCi0gICAgaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQotICAgIHsNCi0gICAgICAgIHByaW8gPSBNU0dfUFJJT1JJVFlfTUFYLTE7IC8vsKHA5SCz9MC6IL/svLG8+MCnt84gurizvbTZLg0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcHJpbyA9IE1TR19QUklPUklUWTA7DQotICAgIH0NCi0NCi0gICAgKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsNCi0NCi0gICAgcmMgPSBsaXN0X2luc19uZXh0KHEsIHByaW8sIG1zZywgc2l6ZSwgRkFMU0UsIEZBTFNFKTsNCi0gICAgaWYoSE1YX09LICE9IHJjKQ0KLSAgICB7DQotICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQotICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7DQotICAgICAgICByZXR1cm4gcmM7DQotICAgIH0NCi0NCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCi0gICAgcHJpbnRfbGlzdChxKTsNCi0jZW5kaWYNCi0NCi0gICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLSNpZmRlZiBITVhfTVNHX0RFQlVHDQotICAgIHEtPmxhc3RTZW5kVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCi0jZW5kaWYNCi0NCi0gICAgUHJpbnRFeGl0KCk7DQotDQotICAgIHJldHVybiBITVhfT0s7DQotfQ0KLQ0KLQ0KLS8qDQotICAgIEhNWF9NU0dfU2VuZFVyZ2VudFRpbWVvdXQNCi0gICAgseSx3iC43ry8wfa4piBUaW1lb3V0ILO7v6EgurizvbTZLg0KLSovDQotaW50IEhNWF9NU0dfU2VuZFVyZ2VudFRpbWVvdXQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQ0KLXsNCi0Jc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7DQotCWludCByYyA9IEhNWF9PSzsNCi0JdW5zaWduZWQgbG9uZyBwcmlvID0gMDsNCi0Jc3RydWN0IHRpbWVzcGVjIHRpbWVvOw0KLQlzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7DQotCWxvbmcgbG9uZyBleHBfbnNlYzsNCi0NCi0JUHJpbnRFbnRlcigpOw0KLQ0KLQlpZiAodGltZW91dCA9PSAweEZGRkZGRkZGKQ0KLQl7DQotCQlyZXR1cm4gSE1YX01TR19TZW5kVXJnZW50KHFfaWQsIG1zZywgc2l6ZSk7DQotCX0NCi0NCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQotDQotCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQotCXsNCi0JICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsNCi0JICAgIHJldHVybiBITVhfRVJST1I7DQotCX0NCi0NCi0JcmMgPSBQX01TR19DaGVjayhxLCBxX2lkKTsNCi0JaWYgKEhNWF9PSyAhPSByYykNCi0Jew0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCi0JCVByaW50RXJyb3IoIiVzKCVkKSA6IFBfTVNHX0NoZWNrIDogSE1YX01TR19GVUxMISEgcXVldWUgbmFtZSglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7DQotI2VuZGlmDQotCQlyZXR1cm4gcmM7DQotCX0NCi0NCi0JaWYoSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZID09IHEtPnN1c3BlbmRfdHlwZV8pDQotCXsNCi0JICAgIHByaW8gPSBNU0dfUFJJT1JJVFlfTUFYLTE7IC8vsKHA5SCz9MC6IL/svLG8+MCnt84gurizvbTZLg0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgcHJpbyA9IE1TR19QUklPUklUWTA7DQotCX0NCi0NCi0JY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsNCi0JZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIGN1cl90aW1lLnR2X25zZWM7DQotCWlmICh0aW1lb3V0ICE9IDApDQotCQlleHBfbnNlYyArPSAodGltZW91dCAqIDEwMDAgLSA5OTkpICogMTAwMDsNCi0JdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCi0JdGltZW8udHZfbnNlYyA9IGV4cF9uc2VjICUgKDEwMDAgKiAxMDAwICogMTAwMCk7DQotDQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQotDQotCXJjID0gbGlzdF9pbnNfbmV4dChxLCBwcmlvLCBtc2csIHNpemUsIFRSVUUsICZ0aW1lbyk7DQotDQotCWlmKEhNWF9PSyAhPSByYykNCi0Jew0KLQkgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLQkgICAgaWYoRVRJTUVET1VUID09IHJjKQ0KLQkgICAgew0KLQkgICAgICAgIFByaW50RGVidWcoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBITVhfVElNRU9VVCEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCi0JICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7DQotCSAgICB9DQotCSAgICBlbHNlDQotCSAgICB7DQotCSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KLQkgICAgICAgIHJldHVybiBITVhfRVJST1I7DQotCSAgICB9DQotCX0NCi0NCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCi0JcHJpbnRfbGlzdChxKTsNCi0jZW5kaWYNCi0NCi0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLQlQcmludEV4aXQoKTsNCi0NCi0JcmV0dXJuIEhNWF9PSzsNCi19DQotDQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KLSNkZWZpbmUgSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLCTIwDQotI2RlZmluZSBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLCTIwMA0KLSNlbmRpZg0KLS8qDQotICAgIEhNWF9NU0dfUmVjZWl2ZQ0KLSAgICC43ry8wfa4piC53rTCtNkuDQotKi8NCi1pbnQgSE1YX01TR19SZWNlaXZlKHVuc2lnbmVkIGxvbmcgcV9pZCwgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpDQotew0KLSAgICBzdHJ1Y3QgSE1YX01TR19xdWV1ZSAgICAgICAgICAgICAgICpxOw0KLS8vICB1bnNpZ25lZCBsb25nIHByaW87DQotICAgIGludCByYyA9IEhNWF9PSzsNCi0NCi0gICAgUHJpbnRFbnRlcigpOw0KLQ0KLQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7DQotDQotICAgIHEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOw0KLQ0KLSAgICBpZihzaXplID4gcS0+bXNnX3NpemVfKQ0KLSAgICB7DQotICAgICAgICBQcmludEVycm9yKCIlcyA6IHNpemUgJWxkIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgc2l6ZSk7DQotICAgICAgICByZXR1cm4gSE1YX0VSUk9SOw0KLSAgICB9DQotDQotICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQotDQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KLQlxLT5yZWNlaXZlVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCi0JaWYgKHEtPmxhc3RSZWNlaXZlVGljayAhPSAwICYmIChxLT5yZWNlaXZlVGljayAtIHEtPmxhc3RSZWNlaXZlVGljayA+IEhNWF9NU0dfTk9STUFMX0RFTEFZX1RJQ0spKQ0KLQl7DQotCQlpZiAoKHEtPnJlY2VpdmVUaWNrIC0gdGlja0ZvclZrRGVidWcpID4gSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLKQ0KLQkJew0KLQkJCVByaW50RXJyb3IoIkhNWF9NU0dfUmVjZWl2ZSA6IEl0IGhhcyBleGN1dGVkIHRvbyBsb25nIHRpbWUgKCVkKSBxdWV1ZSglcylcbiIsIHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrLCBxLT5uYW1lKTsNCi0JCX0NCi0JfQ0KLSNlbmRpZg0KLSAgICByYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7DQotI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KLQlxLT5sYXN0UmVjZWl2ZVRpY2sgPSB0aWNrRm9yVmtEZWJ1ZyA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsNCi0jZW5kaWYNCi0gICAgaWYoSE1YX09LICE9IHJjKQ0KLSAgICB7DQotICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7DQotICAgICAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7DQotICAgICAgICByZXR1cm4gcmM7DQotICAgIH0NCi0NCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCi0gICAgcHJpbnRfbGlzdChxKTsNCi0jZW5kaWYNCi0gICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLSAgICBQcmludEV4aXQoKTsNCi0gICAgcmV0dXJuIEhNWF9PSzsNCi19DQotDQotLyoNCi0gICAgSE1YX01TR19SZWNlaXZlVGltZW91dA0KLSAgICC43ry8wfa4piBUaW1lb3V0s7u/oSC53rTCtNkuDQotKi8NCi1pbnQgSE1YX01TR19SZWNlaXZlVGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpDQotew0KLQlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAgICAgICAgICAgICAgICpxOw0KLQlpbnQgcmMgPSBITVhfT0s7DQotCS8vICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsNCi0JbG9uZyBsb25nIGV4cF9uc2VjOw0KLQlzdHJ1Y3QgdGltZXNwZWMgdGltZW8sIGN1cl90aW1lOw0KLQ0KLQlQcmludEVudGVyKCk7DQotCWlmICh0aW1lb3V0ICE9IDApDQotCXsNCi0JCUhNWF9UQVNLX0NoZWNrQ2FsbGJhY2soKTsNCi0JfQ0KLQ0KLQlpZiAodGltZW91dCA9PSAweEZGRkZGRkZGKQ0KLQl7DQotCQlyZXR1cm4gSE1YX01TR19SZWNlaXZlKHFfaWQsIG1zZywgc2l6ZSk7DQotCX0NCi0NCi0JcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQotDQotCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pDQotCXsNCi0JCVByaW50RXJyb3IoIiVzIDogc2l6ZSAlbGQgRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCBzaXplKTsNCi0JCXJldHVybiBITVhfRVJST1I7DQotCX0NCi0NCi0JY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsNCi0JZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCAqIChsb25nIGxvbmcpMTAwMCArIChsb25nIGxvbmcpY3VyX3RpbWUudHZfbnNlYzsNCi0JaWYgKHRpbWVvdXQgIT0gMCkNCi0JCWV4cF9uc2VjICs9IChsb25nIGxvbmcpKHRpbWVvdXQgKiAobG9uZyBsb25nKTEwMDAgLSA5OTkpICogKGxvbmcgbG9uZykxMDAwOw0KLQl0aW1lby50dl9zZWMgPSBleHBfbnNlYyAvICgxMDAwICogMTAwMCAqIDEwMDApOw0KLQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsNCi0NCi0JKHZvaWQpcHRocmVhZF9tdXRleF9sb2NrKCZxLT5xX2xvY2tfKTsNCi0jaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpDQotCXEtPnJlY2VpdmVUaWNrID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOw0KLQlpZiAocS0+bGFzdFJlY2VpdmVUaWNrICE9IDAgJiYgKHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrID4gSE1YX01TR19OT1JNQUxfREVMQVlfVElDSykpDQotCXsNCi0JCWlmICgocS0+cmVjZWl2ZVRpY2sgLSB0aWNrRm9yVmtEZWJ1ZykgPiBITVhfTVNHX0NSSVRJQ0FMX0RFTEFZX1RJQ0spDQotCQl7DQotCQkJUHJpbnRFcnJvcigiSE1YX01TR19SZWNlaXZlVGltZW91dCA6IEl0IGhhcyBleGN1dGVkIHRvbyBsb25nIHRpbWUgKCVkKSBxdWV1ZSglcylcbiIsIHEtPnJlY2VpdmVUaWNrIC0gcS0+bGFzdFJlY2VpdmVUaWNrLCBxLT5uYW1lKTsNCi0JCX0NCi0JfQ0KLSNlbmRpZg0KLQ0KLQlyYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBUUlVFLCAmdGltZW8pOw0KLSNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykNCi0JcS0+bGFzdFJlY2VpdmVUaWNrID0gdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQotI2VuZGlmDQotCWlmKEhNWF9PSyAhPSByYykNCi0Jew0KLSAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLSAgICAgICAgaWYoRVRJTUVET1VUID09IHJjKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFByaW50RGVidWcoIiVzIDogbGlzdF9yZW1fbmV4dCgpIHJjWyVkXSBITVhfVElNRU9VVCEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsNCi0gICAgICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOw0KLSAgICAgICAgICAgIHJldHVybiBITVhfRVJST1I7DQotICAgICAgICB9DQotCX0NCi0NCi0jaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQNCi0JcHJpbnRfbGlzdChxKTsNCi0jZW5kaWYNCi0NCi0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLQlQcmludEV4aXQoKTsNCi0JcmV0dXJuIEhNWF9PSzsNCi19DQotDQotaW50CUhNWF9NU0dfR2V0TWVzc2FnZUNvdW50KHVuc2lnbmVkIGxvbmcgcV9pZCwgdW5zaWduZWQgbG9uZyAqcHVsTXNnQ291bnQsIHVuc2lnbmVkIGxvbmcgKnB1bE1heE1zZ0NvdW50KQ0KLXsNCi0gICAgc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7DQotDQotICAgIFByaW50RW50ZXIoKTsNCi0NCi0gICAgcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7DQotDQotCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7DQotCSpwdWxNc2dDb3VudCA9IHEtPmN1cnJfbXNnX2NvdW50XzsNCi0JKnB1bE1heE1zZ0NvdW50ID0gcS0+bXNnX2NvdW50XzsNCi0JKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOw0KLQ0KLQlQcmludEV4aXQoKTsNCi0JcmV0dXJuIEhNWF9PSzsNCi19DQotDQotc3RhdGljIGludCBQX01TR19DaGVjayhzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyBxX2lkKQ0KLXsNCi0JdW5zaWduZWQgbG9uZyB1bE5lYXJseUZ1bGxDb3VudDsNCi0jaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQlVTlVTRUQocV9pZCk7DQotI2VuZGlmDQotDQotCXVsTmVhcmx5RnVsbENvdW50ID0gKHEtPm1zZ19jb3VudF8gKiAzKTsNCi0JdWxOZWFybHlGdWxsQ291bnQgPSB1bE5lYXJseUZ1bGxDb3VudC80Ow0KLQ0KLQlpZihxLT5tc2dfY291bnRfID09IHEtPmN1cnJfbXNnX2NvdW50XykNCi0Jew0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCi0JCWlmIChWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCkgLSB0aWNrRm9yVmtEZWJ1ZyA+IDUwMDApDQotCQl7DQotCQkJdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7DQotCQkJLy8gcXVldWUgaXMgZnVsbC4NCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQotCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIG5hbWU6JXMgZnVsbCAhISElY1xuISEhXG4iLCBfX0ZVTkNUSU9OX18sIHFfaWQsIHEtPm5hbWUsIDcpOw0KLQkjaWYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQ0KLQkJCVZLX1RBU0tfUHJpbnRUYXNrTGlzdCgpOw0KLQkjZW5kaWYNCi0JI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykNCi0JCQlITVhfTVNHX1ByaW50TXNnUUxpc3QoKTsNCi0JI2VuZGlmDQotCSNpZiBkZWZpbmVkKFZLX1NFTV9ERUJVRykNCi0JCQlWS19TRU1fUHJpbnRTZW1MaXN0KCk7DQotCSNlbmRpZg0KLSNlbHNlDQotCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIGZ1bGwgISEhJWNcbiEhIVxuIiwgX19GVU5DVElPTl9fLCBxX2lkLCA3KTsNCi0jZW5kaWYNCi0JCX0NCi0jZW5kaWYNCi0JCXJldHVybiBITVhfTVNHX0ZVTEw7DQotCX0NCi0JZWxzZSBpZiggcS0+Y3Vycl9tc2dfY291bnRfID4gdWxOZWFybHlGdWxsQ291bnQgKQ0KLQl7DQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLQkJUHJpbnRFcnJvcigiW0hNWF9NU0dfU2VuZF0gTXNnUXVlIGlzIG5lYXJseSBmdWxsIC0gU2VuZFRhc2s6JWQsIFF1ZUlkOjB4JVgsICglbGQsICVsZCksIG5hbWU6JXNcclxuIiwNCi0JCQkJcHRocmVhZF9zZWxmKCksIHFfaWQsIHEtPm1zZ19jb3VudF8sIHEtPmN1cnJfbXNnX2NvdW50XywgcS0+bmFtZSk7DQotI2VuZGlmDQotCX0NCi0NCi0JcmV0dXJuIEhNWF9PSzsNCi19DQotDQotDQotLyoNCi0gICAgSE1YX01TR19QcmludE1zZ1FMaXN0DQotICAgILjevLzB9sWlIMGkuri4piDD4rfCx9G02S4NCi0qLw0KLSNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpDQotdm9pZCBITVhfTVNHX1ByaW50TXNnUUxpc3Qodm9pZCkNCi17DQotCUhJTlQzMgl1bENudD0wOw0KLQlzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcE1zZ1E7DQotDQotICAgIFByaW50RGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOw0KLSAgICBQcmludERlYnVnKCIgICAgICAgICAgICAgICAgTmFtZSBRaWQgICAgICAgIFNpemUgQ291bnQgQ3VyX0NvdW50IFR5cGVcbiIpOw0KLSAgICBmb3IgKHBNc2dRID0gbXNnX3FfbGlzdF9oZWFkLnRxaF9maXJzdDsgcE1zZ1EgIT0gTlVMTDsgcE1zZ1EgPSBwTXNnUS0+ZW50cmllcy50cWVfbmV4dCkNCi0gICAgew0KLSAgICAgICAgUHJpbnREZWJ1ZygiWyUwM2RdJTIwcyAweCUwOFggJTA0ZCAlMDVkICUwOWQgJTA0ZFxuIix1bENudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2dRLT5uYW1lLCAodW5zaWduZWQgbG9uZylwTXNnUSwgcE1zZ1EtPm1zZ19zaXplXywgcE1zZ1EtPm1zZ19jb3VudF8sIHBNc2dRLT5jdXJyX21zZ19jb3VudF8sIHBNc2dRLT5zdXNwZW5kX3R5cGVfKTsNCi0gICAgICAgIHVsQ250Kys7DQotICAgIH0NCi0gICAgUHJpbnREZWJ1ZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7DQotfQ0KLSNlbmRpZg0KLQ0KLQ0KLS8qQH0qLw0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfc3lzdGVtLmggYi9saWJ1cGdyYWRlL2hteF91cGdyYWRlX3N5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDUxZDIxLi4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvaG14X3VwZ3JhZGVfc3lzdGVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRmlsZSBEZXNjcmlwdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfc3lzdGVtLmggICQNCi0gKiBWZXJzaW9uOgkJCSRSZXZpc2lvbjogICAxLjAgICQNCi0gKiBPcmlnaW5hbCBBdXRob3I6IFlhbmcgSHl1biBVayAkDQotICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQNCi0gKiBEYXRlOgkJCSREYXRlOiAyMDExLjA5LjMwDQotICogRmlsZSBEZXNjcmlwdGlvbjoJVXBncmFkZSBBUElzDQotICogTW9kdWxlOg0KLSAqIFJlbWFya3M6DQotICovDQotDQotDQotLyoqDQotICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkNCi0gKiBAZGF0ZSAzMCBTZXB0IDIwMTENCi0gKi8NCi0NCi0vKioNCi0gKiBAbm90ZQ0KLSAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KLSAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCi0gKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQ0KLSAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCi0gKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQotICovDQotDQotIC8qQHsqLw0KLQ0KLS8qKg0KLSAqIEBmaWxlIGhteF91cGdyYWRlX3N5c3RlbS5oDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgSW5jbHVkaW5nIEhlYWRlciBGaWxlcyAqLw0KLSNpbmNsdWRlIDxzdGRpby5oPg0KLSNpbmNsdWRlIDxzdHJpbmcuaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHB0aHJlYWQuaD4NCi0jaW5jbHVkZSA8ZXJybm8uaD4NCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+DQotI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPg0KLSNpbmNsdWRlIDx1bmlzdGQuaD4NCi0jaW5jbHVkZSA8ZmNudGwuaD4NCi0vKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IEV4dGVybiB2YXJpYWJsZWUgKi8NCi0NCi0vKiBFbmQgRXh0ZXJuIHZhcmlhYmxlICovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNYWNybyBEZWZpbml0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogU3RhcnQgTWFjcm8gZGVmaW5pdGlvbiAqLw0KLSNkZWZpbmUgSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpDQotI2RlZmluZSBITVhfT0sJMA0KLSNkZWZpbmUgSE1YX0VSUk9SCTENCi0jZGVmaW5lIEhNWF9USU1FT1VUCQkyDQotI2RlZmluZSBITVhfSU5WQUxJRF9JRAkJMw0KLSNkZWZpbmUgSE1YX0FMTE9DX0VSUk9SCQk0DQotI2RlZmluZSBITVhfTk9fTVNHCQkJNQ0KLSNkZWZpbmUgSE1YX0NSRUFURV9FUlJPUgkJMTANCi0jZGVmaW5lIEhNWF9ERVNUUk9ZX0VSUk9SCTExDQotI2RlZmluZSBITVhfTE9DS19FUlJPUgkJMTINCi0jZGVmaW5lIEhNWF9VTkxPQ0tfRVJST1IJCTEzDQotI2RlZmluZSBITVhfVElNRV9JTkZJTklURSAgICAxNA0KLSNkZWZpbmUgSE1YX0lOVkFMSURfQ0xPQ0sJMTUNCi0jZGVmaW5lIEhNWF9NU0dfRlVMTAkJCTE3DQotDQotI2RlZmluZSBUUlVFIDENCi0jZGVmaW5lIEZBTFNFIDANCi0NCi0NCi0jZGVmaW5lIEhNWF9UQVNLX1BUSFJFQURfU1RBQ0tfTUlOCSgxNioxMDI0KQ0KLSNkZWZpbmUgSE1YX1RBU0tfUFRIUkVBRF9ERUZBVUxUX1BSSU8JU0NIRURfUlINCi0NCi0jZGVmaW5lIEhNWF9UQVNLX1NUQUNLX09WRVJIRUFEX1NJWkUgCQkJMHgyMDAwDQotI2RlZmluZSBITVhfVEFTS19HVUFSRF9TSVpFIAkJCTE2DQotDQotLyogRW5kIE1hY3JvIGRlZmluaXRpb24gKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBTdGFydCB0eXBlZGVmICovDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBUYXNrIFByaW9yaXR5IFNldA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLyoNCi0gICAgwdbAx7vnx9cNCi0gICAgUHJpb3JpdHm4piDB9bChIL3DxbK02bjpIFZLX01TR19QUklPUklUWcDHILCqtbUgsLDAzCDB9bChIL3DxNG+3yDH0bTZLg0KLSAgICBWS19NU0dfUFJJT1JJVFnAxyCwqsC6IMfXu/MgcHJpb3JpdHnAxyCwqiC6uLTZIDEguLm+xr7fILHXt6G+3yBVcmdlbnQgbXNnuKYgw7O4riDH0bTZLg0KLSovDQotLyogQmFzaWMgUHJpb3JpdHkgU2V0ICovDQotI2RlZmluZQlCQVNFX1BSSU9SSVRZCQkJNjANCi0jZGVmaW5lCUhJR0hFU1RfUFJJT1JJVFkJCTEwOA0KLQ0KLSNkZWZpbmUJUFJJT1JJVFlfSU5DUkVNRU5UCTENCi0NCi0vL3RlbXAgOjogTmV2ZXIgdXNlDQotI2RlZmluZQlVU0VSX1BSSU9SSVRZMAkJCUJBU0VfUFJJT1JJVFkJCQkJCQkJLy8gNjANCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMSkNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkyCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMikNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkzCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMykNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk0CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNCkNCi0NCi0vL8DPtNwgZGVmYXVsdCBwcmlvcml0ebfOIDa5+CC757/rCTUwwLsgseLB2MC4t84gOMDMIMD7tOfH0iC17S4NCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk1CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNSkNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk2CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNikNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk3CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqNykNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk4CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqOCkNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFk5CQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqOSkNCi0NCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxMAkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjEwKQkvLyA4MA0KLSNkZWZpbmUJVVNFUl9QUklPUklUWTExCQkJKEJBU0VfUFJJT1JJVFkgKyBQUklPUklUWV9JTkNSRU1FTlQqMTEpDQotI2RlZmluZQlVU0VSX1BSSU9SSVRZMTIJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoxMikNCi0NCi0vL3RlbXAgOjogZm9yIHRoZSBoaWdoZXN0IEREDQotI2RlZmluZQlVU0VSX1BSSU9SSVRZMTMJCQkoQkFTRV9QUklPUklUWSArIFBSSU9SSVRZX0lOQ1JFTUVOVCoxMykNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxNAkJCShCQVNFX1BSSU9SSVRZICsgUFJJT1JJVFlfSU5DUkVNRU5UKjE0KQ0KLQ0KLS8vVVNFUl9QUklPUklUWTE1tMIgu+e/68fPwfYguLsgsM0uLi4uLiAvLzIwMDcxMDExIFRlc3RCeVBvb2gNCi0vL09ubHkgdGFzayBwcmlvcml0eSBhZGp1c3QNCi0jZGVmaW5lCVVTRVJfUFJJT1JJVFkxNQkJCUhJR0hFU1RfUFJJT1JJVFkNCi0NCi0NCi0NCi0vL01TR19QUklPUklUWcDHILCqwLogVGFzayBQcmlvcml0ecDHILC5vPa6uLTZIDGwsyC4ub7Gvt8gx9G02S4NCi10eXBlZGVmIGVudW0NCi17DQotICAgIE1TR19QUklPUklUWTAsDQotICAgIE1TR19QUklPUklUWTEsDQotICAgIE1TR19QUklPUklUWTIsDQotICAgIE1TR19QUklPUklUWTMsDQotICAgIE1TR19QUklPUklUWTQsDQotICAgIE1TR19QUklPUklUWTUsDQotICAgIE1TR19QUklPUklUWTYsDQotICAgIE1TR19QUklPUklUWTcsDQotICAgIE1TR19QUklPUklUWTgsDQotICAgIE1TR19QUklPUklUWTksDQotICAgIE1TR19QUklPUklUWTEwLA0KLSAgICBNU0dfUFJJT1JJVFkxMSwNCi0gICAgTVNHX1BSSU9SSVRZMTIsDQotICAgIE1TR19QUklPUklUWTEzLA0KLSAgICBNU0dfUFJJT1JJVFkxNCwNCi0gICAgTVNHX1BSSU9SSVRZMTUsDQotICAgIE1TR19QUklPUklUWTE2LA0KLSAgICBNU0dfUFJJT1JJVFlfTUFYICAgLy/D1rvzwKfAxyBQUklPUklUWbTCIFVyZ2VudLfOILvnv+vH1C4uDQotfUhNWF9NU0dfUFJJT1JJVFk7DQotDQotdHlwZWRlZiBlbnVtDQotew0KLQlITVhfU1VTUEVORFRZUEVfRklGTywNCi0JSE1YX1NVU1BFTkRUWVBFX1BSSU9SSVRZLA0KLQlITVhfU1VTUEVORFRZUEVfTUFYDQotfUhNWF9TVVNQRU5EVFlQRTsNCi0NCi0NCi0vKiBFbmQgdHlwZWRlZiAqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIFN0YXJ0IGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQotDQotLyogRW5kIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQotDQotDQotc3RydWN0IEhNWF9UQVNLX2FyZyB7DQotCXB0aHJlYWRfbXV0ZXhfdAlsb2NrXzsNCi0JcHRocmVhZF9jb25kX3QJY29uZF87DQotCXVuc2lnbmVkIGxvbmcJCXByaW9yaXR5XzsNCi0JdW5zaWduZWQgbG9uZwkJc3RhY2tTaXplXzsNCi0JaW50CQkJCQlJc0pvaW5hYmxlOw0KLQlpbnQgCQkJCXN0YXJ0Ow0KLQl1bnNpZ25lZCBsb25nCQkqcHVjVGFza1N0YWNrOw0KLQl1bnNpZ25lZCBsb25nCQkqcHVsU3RhY2tTdGFydEFkZHJlc3M7DQotCXZvaWQgKCpzdGFydF9mdW5jXykodm9pZCAqKTsNCi0Jdm9pZCAqYXJnXzsNCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQotCXBpZF90IHBpZDsNCi0JcGlkX3QgdGlkOw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykNCi0JaW50IHRocmVhZF9pZDsNCi0jZW5kaWYNCi0JY2hhciBuYW1lWzMyXTsNCi19Ow0KLQ0KLXN0cnVjdCBITVhfVEFTSyB7DQotCXB0aHJlYWRfdCB0YXNrXzsNCi0Jc3RydWN0IEhNWF9UQVNLX2FyZyB0YXJnXzsNCi19Ow0KLQ0KLXN0cnVjdCAgSE1YX01TR19lbGVtZW50DQotew0KLSAgICB2b2lkICAgICAgICAgICAgICpkYXRhOw0KLSAgICBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAqbmV4dDsNCi0gICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgKnByZXY7DQotfTsNCi0NCi1zdHJ1Y3QgSE1YX01TR19xdWV1ZQ0KLXsNCi0NCi0gICAgcHRocmVhZF9tdXRleF90ICAgICBxX2xvY2tfOw0KLSAgICBwdGhyZWFkX2NvbmRfdCAgICAgIHFfbm90X2VtcHR5XzsNCi0gICAgcHRocmVhZF9jb25kX3QgICAgICBxX25vdF9mdWxsXzsNCi0gICAgdW5zaWduZWQgbG9uZyAgICAgICBjdXJyX21zZ19jb3VudF87DQotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgbXNnX3NpemVfOw0KLSAgICB1bnNpZ25lZCBsb25nICAgICAgIG1zZ19jb3VudF87DQotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgYml0bWFwX2NvdW50W01TR19QUklPUklUWV9NQVhdOw0KLSAgICB1bnNpZ25lZCBjaGFyICAgICAgIGJpdG1hcFtNU0dfUFJJT1JJVFlfTUFYXTsNCi0gICAgdW5zaWduZWQgY2hhciAgICAgICBzdXNwZW5kX3R5cGVfOw0KLQl2b2lkCQkJCSpwUG9vbDsNCi0Jdm9pZAkJCQkqcERhdGFQb29sOw0KLQ0KLSAgICBpbnQgd3JpdGVyX2NvdW50XzsNCi0gICAgaW50IHJlYWRlcl9jb3VudF87DQotDQotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICp0ZW1wX2hlYWQ7DQotICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICp0ZW1wX3RhaWw7DQotICAgIHN0cnVjdCAgSE1YX01TR19lbGVtZW50ICAgICAgICAgICpoZWFkW01TR19QUklPUklUWV9NQVhdOw0KLSAgICBzdHJ1Y3QgIEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAqdGFpbFtNU0dfUFJJT1JJVFlfTUFYXTsNCi0NCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUcpDQotICAgIHVuc2lnbmVkIGxvbmcgc2VuZFRpY2s7DQotICAgIHVuc2lnbmVkIGxvbmcgcmVjZWl2ZVRpY2s7DQotICAgIHVuc2lnbmVkIGxvbmcgbGFzdFNlbmRUaWNrOw0KLSAgICB1bnNpZ25lZCBsb25nIGxhc3RSZWNlaXZlVGljazsNCi0gICAgY2hhciBuYW1lWzMyXTsNCi0gICAgVEFJTFFfRU5UUlkoSE1YX01TR19xdWV1ZSkgZW50cmllczsNCi0jZW5kaWYNCi19Ow0KLQ0KLSNpZiBkZWZpbmVkKFZLX01TR19ERUJVRykNCi1UQUlMUV9IRUFEKGxpc3RoZWFkLCBITVhfTVNHX3F1ZXVlKSBtc2dfcV9saXN0X2hlYWQ7DQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQ0KLXVuc2lnbmVkIGxvbmcJdGlja0ZvclZrRGVidWc7DQotI2VuZGlmDQotDQotLypAfSovDQpkaWZmIC0tZ2l0IGEvbGlidXBncmFkZS9obnZyYW1fZGxpc3QuaCBiL2xpYnVwZ3JhZGUvaG52cmFtX2RsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwNGEzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnVwZ3JhZGUvaG52cmFtX2RsaXN0LmgKQEAgLTAsMCArMSwzMSBAQAorLyogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisjaWZuZGVmIF9ITlZSQU1fRExJU1RfSF8KKyNkZWZpbmUgX0hOVlJBTV9ETElTVF9IXworCit0eXBlZGVmIHN0cnVjdCBkbGlzdF9oZHIgeworICBzdHJ1Y3QgZGxpc3RfaGRyICpuZXh0OworICBzdHJ1Y3QgZGxpc3RfaGRyICpwcmV2OworfSBkbGlzdF9oZHJfdDsKKworI2RlZmluZSBETElTVF9JTklUKGRsaXN0KSB7ICYoZGxpc3QpLCAmKGRsaXN0KSB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbGlzdF9hZGQoc3RydWN0IGRsaXN0X2hkciAqZGxpc3QsIHN0cnVjdCBkbGlzdF9oZHIgKmVudHJ5KQoreworICBlbnRyeS0+bmV4dCA9IGRsaXN0OworICBlbnRyeS0+cHJldiA9IGRsaXN0LT5wcmV2OworICBkbGlzdC0+cHJldi0+bmV4dCA9IGVudHJ5OworICBkbGlzdC0+cHJldiA9IGVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGxpc3RfZGVsKHN0cnVjdCBkbGlzdF9oZHIgKmVudHJ5KQoreworICBlbnRyeS0+cHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OworICBlbnRyeS0+bmV4dC0+cHJldiA9IGVudHJ5LT5wcmV2OworfQorCisjZGVmaW5lIERMSVNUX0ZPUl9FQUNIKGRsaXN0LCBlbnRyeSkgXAorICAgIGZvciAoZW50cnkgPSAoZGxpc3QpLT5uZXh0OyBlbnRyeSAhPSAoZGxpc3QpOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorCisjZW5kaWYgIC8qIF9ITlZSQU1fRExJU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmMgYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTU3MzM5Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQotICAgICogIAotICAgICogIFF1ZXVlIE1hbmFnZW1lbnQgcm91dGluZXMJCUZpbGU6IGxpYl9xdWV1ZS5jCi0gICAgKiAgCi0gICAgKiAgUm91dGluZXMgdG8gbWFuYWdlIGRvdWJseS1saW5rZWQgcXVldWVzLgotICAgICogIAotICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnIChtcGxAYnJvYWRjb20uY29tKQotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCi0gICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEKLSAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgCi0gICAgKiAgY29waWVkIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIAotICAgICogIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIAotICAgICogIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQgCi0gICAgKiAgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gIE5vIHRpdGxlIAotICAgICogIG9yIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBoZXJlYnkuCi0gICAgKiAgCi0gICAgKiAgMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIAotICAgICogICAgIGFuZCByZXRhaW4gdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgCi0gICAgKiAgICAgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICogIAotICAgICogIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIAotICAgICogICAgIGxvZ28gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJCcm9hZGNvbSAKLSAgICAqICAgICBDb3Jwb3JhdGlvbiIgbmFtZSBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIEJyb2FkY29tIAotICAgICogICAgIENvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKLSAgICAqICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIAotICAgICogICAgIHBlcm1pc3Npb24gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uCi0gICAgKiAgCi0gICAgKiAgMykgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBBTlkgRVhQUkVTUyBPUgotICAgICogICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgCi0gICAgKiAgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAgICAqICAgICBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKLSAgICAqICAgICBTSEFMTCBCUk9BRENPTSBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIEFORCBJTiAKLSAgICAqICAgICBQQVJUSUNVTEFSLCBCUk9BRENPTSBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBESVJFQ1QsIElORElSRUNULCAKLSAgICAqICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKLSAgICAqICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgCi0gICAgKiAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICAgICogICAgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgCi0gICAgKiAgICAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAKLSAgICAqICAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpLCBFVkVOIElGIEFEVklTRUQgT0YgCi0gICAgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaW5jbHVkZSAibGliX3F1ZXVlLmgiCi0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfRU5RVUVVRShxYixpdGVtKQkKLSAgICAqICAJCQkJCi0gICAgKiAgQWRkIGl0ZW0gdG8gYSBxdWV1ZQotICAgICogIAkJCQkKLSAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCi0gICAgKiAgICAgIHFiIC0gcXVldWUgYmxvY2sJCi0gICAgKiAgICAgIGl0ZW0gLSBpdGVtIHRvIGFkZAkKLSAgICAqICAgICAgCQkJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgkJCi0gICAgKiAgICAgIE5vdGhpbmcuCQkKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotdm9pZCBxX2VucXVldWUocXVldWVfdCAqcWIscXVldWVfdCAqaXRlbSkKLXsKLSAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBpdGVtOwotICAgIGl0ZW0tPnFfbmV4dCA9IHFiOwotICAgIGl0ZW0tPnFfcHJldiA9IHFiLT5xX3ByZXY7Ci0gICAgcWItPnFfcHJldiA9IGl0ZW07Ci19Ci0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfREVRVUVVRShlbGVtZW50KQkKLSAgICAqICAJCQkJCi0gICAgKiAgUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUKLSAgICAqICAJCQkJCQotICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkJCi0gICAgKiAgICAgIGVsZW1lbnQgLSBlbGVtZW50IHRvIHJlbW92ZQkKLSAgICAqICAgICAgCQkJCQotICAgICogIFJldHVybiBWYWx1ZToJCQkKLSAgICAqICAgICAgTm90aGluZy4JCQkKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotdm9pZCBxX2RlcXVldWUocXVldWVfdCAqaXRlbSkKLXsKLSAgICBpdGVtLT5xX3ByZXYtPnFfbmV4dCA9IGl0ZW0tPnFfbmV4dDsKLSAgICBpdGVtLT5xX25leHQtPnFfcHJldiA9IGl0ZW0tPnFfcHJldjsKLX0KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgUV9ERVFORVhUKHFiKQotICAgICoKLSAgICAqICBEZXF1ZXVlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgcXVldWUKLSAgICAqIAotICAgICogIElucHV0IFBhcmFtZXRlcnM6IAkKLSAgICAqICAgICAgcWIgLSBxdWV1ZSBibG9jawkKLSAgICAqICAgICAgCQkJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgkJCi0gICAgKiAgICAgIG5leHQgZWxlbWVudCwgb3IgTlVMTAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1xdWV1ZV90ICpxX2RlcW5leHQocXVldWVfdCAqcWIpCi17Ci0gICAgaWYgKHFiLT5xX25leHQgPT0gcWIpIHsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICBxYiA9IHFiLT5xX25leHQ7Ci0KLSAgICBxYi0+cV9wcmV2LT5xX25leHQgPSBxYi0+cV9uZXh0OwotICAgIHFiLT5xX25leHQtPnFfcHJldiA9IHFiLT5xX3ByZXY7Ci0KLSAgICByZXR1cm4gcWI7Ci19Ci0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfTUFQKHFiKQotICAgICogCi0gICAgKiAgIk1hcCIgYSBxdWV1ZSwgY2FsbGluZyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGZvciBlYWNoCi0gICAgKiAgZWxlbWVudCBpbiB0aGUgcXVldWUKLSAgICAqICAKLSAgICAqICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBub256ZXJvLCBxX21hcCB3aWxsIHRlcm1pbmF0ZS4KLSAgICAqICAKLSAgICAqICBJbnB1dCBQYXJhbWV0ZXJzOiAJCQotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkKLSAgICAqICAgICAgZm4gLSBmdW5jdGlvbiBwb2ludGVyCQotICAgICogICAgICBhLGIgLSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24KLSAgICAqICAKLSAgICAqICBSZXR1cm4gVmFsdWU6CQotICAgICogICAgICByZXR1cm4gdmFsdWUgZnJvbSBmdW5jdGlvbiwgb3IgemVybyBpZiBlbnRpcmUgcXVldWUgCi0gICAgKiAgICAgIHdhcyBtYXBwZWQuCQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1pbnQgcV9tYXAocXVldWVfdCAqcWIsIGludCAoKmZ1bmMpKHF1ZXVlX3QgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KSwKLQkgIHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKQotewotICAgIHF1ZXVlX3QgKnFlOwotICAgIHF1ZXVlX3QgKm5leHRxOwotICAgIGludCByZXM7Ci0KLSAgICBxZSA9IHFiOwotCi0gICAgcWUgPSBxYi0+cV9uZXh0OwotCi0gICAgd2hpbGUgKHFlICE9IHFiKSB7Ci0JbmV4dHEgPSBxZS0+cV9uZXh0OwotCWlmICgocmVzID0gKCpmdW5jKShxZSxhLGIpKSkgcmV0dXJuIHJlczsKLQlxZSA9IG5leHRxOwotCX0KLQotICAgIHJldHVybiAwOwotfQotCi0KLQotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBRX0NPVU5UKHFiKQkJCQkJCQkqCi0gICAgKiAgCQkJCQkJCQkJKgotICAgICogIENvdW50cyB0aGUgZWxlbWVudHMgb24gYSBxdWV1ZSAobm90IGludGVybG9ja2VkKQkJCSoKLSAgICAqICAJCQkJCQkJCQkqCi0gICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQkJCQkJKgotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCQkJCQkJKgotICAgICogICAgICAJCQkJCQkJCSoKLSAgICAqICBSZXR1cm4gVmFsdWU6CQkJCQkJCSoKLSAgICAqICAgICAgbnVtYmVyIG9mIGVsZW1lbnRzCQkJCQkJKgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50IHFfY291bnQocXVldWVfdCAqcWIpCi17Ci0gICAgcXVldWVfdCAqcWU7Ci0gICAgaW50IHJlcyA9IDA7Ci0KLSAgICBxZSA9IHFiOwotCi0gICAgd2hpbGUgKHFlLT5xX25leHQgIT0gcWIpIHsKLQlxZSA9IHFlLT5xX25leHQ7Ci0JcmVzKys7Ci0JfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0KLQotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIFFfRklORChxYixpdGVtKQotICAgICogIAotICAgICogIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIGVsZW1lbnQgaXMgb24gYSBxdWV1ZS4KLSAgICAqICAJCQkJCi0gICAgKiAgSW5wdXQgUGFyYW1ldGVyczogCQotICAgICogICAgICBxYiAtIHF1ZXVlIGJsb2NrCi0gICAgKiAgICAgIGl0ZW0gLSBxdWV1ZSBlbGVtZW50IAotICAgICogICAgICAJCi0gICAgKiAgUmV0dXJuIFZhbHVlOgotICAgICogICAgICAwIC0gbm90IG9uIHF1ZXVlICAgICAgICAKLSAgICAqICAgICAgPjAgLSBwb3NpdGlvbiBvbiBxdWV1ZSAgCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQgcV9maW5kKHF1ZXVlX3QgKnFiLHF1ZXVlX3QgKml0ZW0pCi17Ci0gICAgcXVldWVfdCAqcTsKLSAgICBpbnQgcmVzID0gMTsKLQotICAgIHEgPSBxYi0+cV9uZXh0OwotCi0gICAgd2hpbGUgKHEgIT0gaXRlbSkgewotCWlmIChxID09IHFiKSByZXR1cm4gMDsKLQlxID0gcS0+cV9uZXh0OwotCXJlcysrOwotCX0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmggYi9saWJ1cGdyYWRlL2xpYl9xdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmFiMmY1Li4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvbGliX3F1ZXVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEJyb2FkY29tIENvbW1vbiBGaXJtd2FyZSBFbnZpcm9ubWVudCAoQ0ZFKQotICAgICogIAotICAgICogIFF1ZXVlIG1hbmFnZW1lbnQgcHJvdG90eXBlcwkJRmlsZTogbGliX3F1ZXVlLmgKLSAgICAqICAKLSAgICAqICBDb25zdGFudHMsIHN0cnVjdHVyZXMsIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUgcXVldWUKLSAgICAqICBtYW5hZ2VyLgotICAgICogIAotICAgICogIEF1dGhvcjogIE1pdGNoIExpY2h0ZW5iZXJnIChtcGxAYnJvYWRjb20uY29tKQotICAgICogIAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgCi0gICAgKgotICAgICogIENvcHlyaWdodCAyMDAwLDIwMDEKLSAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAqICAKLSAgICAqICBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgCi0gICAgKiAgY29waWVkIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIAotICAgICogIGNvbmRpdGlvbnMuICBTdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnMsIHlvdSBtYXkgZG93bmxvYWQsIAotICAgICogIGNvcHksIGluc3RhbGwsIHVzZSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQgCi0gICAgKiAgY29waWVzIG9mIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gIE5vIHRpdGxlIAotICAgICogIG9yIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCBoZXJlYnkuCi0gICAgKiAgCi0gICAgKiAgMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIAotICAgICogICAgIGFuZCByZXRhaW4gdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFuZCBsaXN0IG9mIGNvbmRpdGlvbnMgYXMgCi0gICAgKiAgICAgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICogIAotICAgICogIDIpIE5vIHJpZ2h0IGlzIGdyYW50ZWQgdG8gdXNlIGFueSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssIG9yIAotICAgICogICAgIGxvZ28gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJCcm9hZGNvbSAKLSAgICAqICAgICBDb3Jwb3JhdGlvbiIgbmFtZSBub3IgYW55IHRyYWRlbWFyayBvciBsb2dvIG9mIEJyb2FkY29tIAotICAgICogICAgIENvcnBvcmF0aW9uIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyAKLSAgICAqICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIAotICAgICogICAgIHBlcm1pc3Npb24gb2YgQnJvYWRjb20gQ29ycG9yYXRpb24uCi0gICAgKiAgCi0gICAgKiAgMykgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBBTlkgRVhQUkVTUyBPUgotICAgICogICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgCi0gICAgKiAgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAgICAqICAgICBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5UIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCAKLSAgICAqICAgICBTSEFMTCBCUk9BRENPTSBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIEFORCBJTiAKLSAgICAqICAgICBQQVJUSUNVTEFSLCBCUk9BRENPTSBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBESVJFQ1QsIElORElSRUNULCAKLSAgICAqICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKLSAgICAqICAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgCi0gICAgKiAgICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICAgICogICAgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgCi0gICAgKiAgICAgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiAKLSAgICAqICAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpLCBFVkVOIElGIEFEVklTRUQgT0YgCi0gICAgKiAgICAgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLSNpZm5kZWYgX0xJQl9RVUVVRV9ICi0jZGVmaW5lIF9MSUJfUVVFVUVfSAotCi0vKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgTWFjcm9zCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLSNkZWZpbmUgcV9pbml0KHEpIChxKS0+cV9wcmV2ID0gKHEpLCAocSktPnFfbmV4dCA9IChxKQotI2RlZmluZSBxX2lzZW1wdHkocSkgKChxKS0+cV9uZXh0ID09IChxKSkKLSNkZWZpbmUgcV9nZXRmaXJzdChxKSAoKHEpLT5xX25leHQpCi0jZGVmaW5lIHFfZ2V0bGFzdChxKSAoKHEpLT5xX3ByZXYpCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBUeXBlcwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgcXVldWVfcyB7Ci0gICAgc3RydWN0IHF1ZXVlX3MgKnFfbmV4dDsKLSAgICBzdHJ1Y3QgcXVldWVfcyAqcV9wcmV2OwotfSBxdWV1ZV90OwotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBQcm90b3R5cGVzCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXZvaWQgcV9lbnF1ZXVlKHF1ZXVlX3QgKixxdWV1ZV90ICopOwotdm9pZCBxX2RlcXVldWUocXVldWVfdCAqKTsKLXF1ZXVlX3QgKnFfZGVxbmV4dChxdWV1ZV90ICopOwotaW50IHFfbWFwKHF1ZXVlX3QgKnFiLGludCAoKmZ1bmMpKHF1ZXVlX3QgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgaW50KSwKLQkgIHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKTsKLWludCBxX2NvdW50KHF1ZXVlX3QgKik7Ci1pbnQgcV9maW5kKHF1ZXVlX3QgKixxdWV1ZV90ICopOwotCi0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnVwZ3JhZGUvdXRpbC5jIGIvbGlidXBncmFkZS91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTViN2EuLjAwMDAwMDAKLS0tIGEvbGlidXBncmFkZS91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTUgKzAsMCBAQAotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogV29ya2ZpbGUgICA6IHV0aWwuYw0KLSAqIFByb2plY3QgICAgOiBLcmFrZW4NCi0gKiBBdXRob3IgICAgIDoga2h3b28NCi0gKiBEZXNjcmlwdGlvbjogQ29tbWFuZHMgVGVtcGxhdGUNCi0gKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA5IEhVTUFYIENvLiwgTHRkLg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotI2RlZmluZSBfX19fSEVBREVSX0ZJTEVTX19fXw0KLSNpbmNsdWRlICJodHlwZS5oIg0KLSNpbmNsdWRlICJ1dGlsLmgiDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX01BQ1JPX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX0VYVEVSTkFMX1ZBUklBQkxFX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX0VYVEVSTkFMX0ZVTkNUSU9OX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX1RZUEVfREVGSU5JVElPTl9fX18NCi0NCi0NCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotI2RlZmluZSBfX19fR0xPQkFMX1ZBUklBQkxFX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX1NUQVRJQ19WQVJJQUJMRV9ERUZJTklUSU9OX19fXw0KLWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBDUkNfMTZfVEFCTEVbMjU2XSA9DQotew0KLQkweDAwMDAsIDB4YzBjMSwgMHhjMTgxLCAweDAxNDAsIDB4YzMwMSwgMHgwM2MwLCAweDAyODAsIDB4YzI0MSwNCi0JMHhjNjAxLCAweDA2YzAsIDB4MDc4MCwgMHhjNzQxLCAweDA1MDAsIDB4YzVjMSwgMHhjNDgxLCAweDA0NDAsDQotCTB4Y2MwMSwgMHgwY2MwLCAweDBkODAsIDB4Y2Q0MSwgMHgwZjAwLCAweGNmYzEsIDB4Y2U4MSwgMHgwZTQwLA0KLQkweDBhMDAsIDB4Y2FjMSwgMHhjYjgxLCAweDBiNDAsIDB4YzkwMSwgMHgwOWMwLCAweDA4ODAsIDB4Yzg0MSwNCi0JMHhkODAxLCAweDE4YzAsIDB4MTk4MCwgMHhkOTQxLCAweDFiMDAsIDB4ZGJjMSwgMHhkYTgxLCAweDFhNDAsDQotCTB4MWUwMCwgMHhkZWMxLCAweGRmODEsIDB4MWY0MCwgMHhkZDAxLCAweDFkYzAsIDB4MWM4MCwgMHhkYzQxLA0KLQkweDE0MDAsIDB4ZDRjMSwgMHhkNTgxLCAweDE1NDAsIDB4ZDcwMSwgMHgxN2MwLCAweDE2ODAsIDB4ZDY0MSwNCi0JMHhkMjAxLCAweDEyYzAsIDB4MTM4MCwgMHhkMzQxLCAweDExMDAsIDB4ZDFjMSwgMHhkMDgxLCAweDEwNDAsDQotCTB4ZjAwMSwgMHgzMGMwLCAweDMxODAsIDB4ZjE0MSwgMHgzMzAwLCAweGYzYzEsIDB4ZjI4MSwgMHgzMjQwLA0KLQkweDM2MDAsIDB4ZjZjMSwgMHhmNzgxLCAweDM3NDAsIDB4ZjUwMSwgMHgzNWMwLCAweDM0ODAsIDB4ZjQ0MSwNCi0JMHgzYzAwLCAweGZjYzEsIDB4ZmQ4MSwgMHgzZDQwLCAweGZmMDEsIDB4M2ZjMCwgMHgzZTgwLCAweGZlNDEsDQotCTB4ZmEwMSwgMHgzYWMwLCAweDNiODAsIDB4ZmI0MSwgMHgzOTAwLCAweGY5YzEsIDB4Zjg4MSwgMHgzODQwLA0KLQkweDI4MDAsIDB4ZThjMSwgMHhlOTgxLCAweDI5NDAsIDB4ZWIwMSwgMHgyYmMwLCAweDJhODAsIDB4ZWE0MSwNCi0JMHhlZTAxLCAweDJlYzAsIDB4MmY4MCwgMHhlZjQxLCAweDJkMDAsIDB4ZWRjMSwgMHhlYzgxLCAweDJjNDAsDQotCTB4ZTQwMSwgMHgyNGMwLCAweDI1ODAsIDB4ZTU0MSwgMHgyNzAwLCAweGU3YzEsIDB4ZTY4MSwgMHgyNjQwLA0KLQkweDIyMDAsIDB4ZTJjMSwgMHhlMzgxLCAweDIzNDAsIDB4ZTEwMSwgMHgyMWMwLCAweDIwODAsIDB4ZTA0MSwNCi0JMHhhMDAxLCAweDYwYzAsIDB4NjE4MCwgMHhhMTQxLCAweDYzMDAsIDB4YTNjMSwgMHhhMjgxLCAweDYyNDAsDQotCTB4NjYwMCwgMHhhNmMxLCAweGE3ODEsIDB4Njc0MCwgMHhhNTAxLCAweDY1YzAsIDB4NjQ4MCwgMHhhNDQxLA0KLQkweDZjMDAsIDB4YWNjMSwgMHhhZDgxLCAweDZkNDAsIDB4YWYwMSwgMHg2ZmMwLCAweDZlODAsIDB4YWU0MSwNCi0JMHhhYTAxLCAweDZhYzAsIDB4NmI4MCwgMHhhYjQxLCAweDY5MDAsIDB4YTljMSwgMHhhODgxLCAweDY4NDAsDQotCTB4NzgwMCwgMHhiOGMxLCAweGI5ODEsIDB4Nzk0MCwgMHhiYjAxLCAweDdiYzAsIDB4N2E4MCwgMHhiYTQxLA0KLQkweGJlMDEsIDB4N2VjMCwgMHg3ZjgwLCAweGJmNDEsIDB4N2QwMCwgMHhiZGMxLCAweGJjODEsIDB4N2M0MCwNCi0JMHhiNDAxLCAweDc0YzAsIDB4NzU4MCwgMHhiNTQxLCAweDc3MDAsIDB4YjdjMSwgMHhiNjgxLCAweDc2NDAsDQotCTB4NzIwMCwgMHhiMmMxLCAweGIzODEsIDB4NzM0MCwgMHhiMTAxLCAweDcxYzAsIDB4NzA4MCwgMHhiMDQxLA0KLQkweDUwMDAsIDB4OTBjMSwgMHg5MTgxLCAweDUxNDAsIDB4OTMwMSwgMHg1M2MwLCAweDUyODAsIDB4OTI0MSwNCi0JMHg5NjAxLCAweDU2YzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVjMSwgMHg5NDgxLCAweDU0NDAsDQotCTB4OWMwMSwgMHg1Y2MwLCAweDVkODAsIDB4OWQ0MSwgMHg1ZjAwLCAweDlmYzEsIDB4OWU4MSwgMHg1ZTQwLA0KLQkweDVhMDAsIDB4OWFjMSwgMHg5YjgxLCAweDViNDAsIDB4OTkwMSwgMHg1OWMwLCAweDU4ODAsIDB4OTg0MSwNCi0JMHg4ODAxLCAweDQ4YzAsIDB4NDk4MCwgMHg4OTQxLCAweDRiMDAsIDB4OGJjMSwgMHg4YTgxLCAweDRhNDAsDQotCTB4NGUwMCwgMHg4ZWMxLCAweDhmODEsIDB4NGY0MCwgMHg4ZDAxLCAweDRkYzAsIDB4NGM4MCwgMHg4YzQxLA0KLQkweDQ0MDAsIDB4ODRjMSwgMHg4NTgxLCAweDQ1NDAsIDB4ODcwMSwgMHg0N2MwLCAweDQ2ODAsIDB4ODY0MSwNCi0JMHg4MjAxLCAweDQyYzAsIDB4NDM4MCwgMHg4MzQxLCAweDQxMDAsIDB4ODFjMSwgMHg4MDgxLCAweDQwNDANCi19Ow0KLQ0KLWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBsb25nCV9jcmMzMlRibFsyNTZdID0NCi17DQotCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsDQotCTB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsDQotCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsDQotCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsDQotCTB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsDQotCTB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsDQotCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsDQotCTB4MTQwMTVjNGYsIDB4NjMwNjZjZDksIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsDQotCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsDQotCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsDQotCTB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsDQotCTB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksDQotCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsDQotCTB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsDQotCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsDQotCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsDQotCTB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsDQotCTB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsDQotCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsDQotCTB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsDQotCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsDQotCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsDQotCTB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsDQotCTB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsDQotCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsDQotCTB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsDQotCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsDQotCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksDQotCTB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsDQotCTB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsDQotCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsDQotCTB4NTliMzNkMTcsIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsDQotCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsDQotCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsDQotCTB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsDQotCTB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsDQotCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsDQotCTB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsDQotCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsDQotCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsDQotCTB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsDQotCTB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsDQotCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsDQotCTB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksDQotCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsDQotCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsDQotCTB4YzViYTNiYmUsIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsDQotCTB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsDQotCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsDQotCTB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsDQotCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsDQotCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsDQotCTB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsDQotCTB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsDQotCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsDQotCTB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsDQotCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsDQotCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsDQotCTB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsDQotCTB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksDQotCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsDQotCTB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsDQotCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsDQotCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQsDQotfTsJLyogX2NyYzMyVGJsICovDQotDQotI2RlZmluZSBOX0JJVF9CeXRlCQk4DQotI2RlZmluZSBTSVpFX0JpdEJ1ZiAJKE5fQklUX0J5dGUgKiBzaXplb2YoX2JpdEJ1ZikpDQotI2RlZmluZSBOX0JJVF9EaWMJCTEzDQotI2RlZmluZSBTSVpFX0RpYwkJKDEgPDwgTl9CSVRfRGljKQ0KLSNkZWZpbmUgTUFYX01hdGNoCQkyNTYNCi0jZGVmaW5lIFRIUkVTSE9MRAkJMw0KLSNkZWZpbmUgTUFYX0J5dGVOdW0gCTI1NQ0KLSNkZWZpbmUgTkMJCQkJKE1BWF9CeXRlTnVtICsgTUFYX01hdGNoKzItVEhSRVNIT0xEKQ0KLSNkZWZpbmUgTl9CSVRfQyAJCTkNCi0jZGVmaW5lIE5fQklUX0NvZGUJCTE2DQotDQotDQotI2RlZmluZSBOUAkJCQkoTl9CSVRfRGljKzEpDQotI2RlZmluZSBOVAkJCQkoTl9CSVRfQ29kZSszKQ0KLSNkZWZpbmUgUEJJVAkJCTQJCQkJLy8gc21hbGxlc3QgaW50ZWdlciBzdWNoIHRoYXQgKDFVPDxQQklUKSA+IE5QDQotI2RlZmluZSBUQklUCQkJNQkJCQkvLyBzbWFsbGVzdCBpbnRlZ2VyIHN1Y2ggdGhhdCAoMVU8PFRCSVQpID4gTlQNCi0jaWYgTlQ+TlANCi0JI2RlZmluZSBOUFQgCQlOVA0KLSNlbHNlDQotCSNkZWZpbmUgTlBUIAkJTlANCi0jZW5kaWYNCi0NCi1leHRlcm4JdW5zaWduZWQgbG9uZwlfY29tcERhdGFTaXplIDsJCQkvLyBjb21wcmVzc2VkIGRhdGEgc2l6ZQ0KLWV4dGVybgl1bnNpZ25lZCBsb25nCV9vcmdEYXRhU2l6ZSA7CQkJLy8gb3JpZ2luYWwgZGF0YSBzaXplDQotZXh0ZXJuCXVuc2lnbmVkIGNoYXIJX2RlY29tcEJ1ZlsweDgwMDBdIDsJLy8gZGVjb21wcmVzcyBidWZmZXINCi0NCi11bnNpZ25lZCBjaGFyCV9jTGVuW05DXSwgX3B0TGVuW05QVCArIDEwMF0sICpfb3JnRGF0YSwgX2RpY0J1ZltTSVpFX0RpY107DQotdW5zaWduZWQgc2hvcnQJX2xlZnRbMipOQy0xXSwgX3JpZ2h0WzIqTkMtMV0sIF9ibGtTaXplLCBfY1RibFs0MDk2XSwNCi0JCQkJX3B0VGJsWzI1Nl0sIF9iaXRCdWYsIF9zdWJCaXRCdWYsDQotCQkJCV9zdGFydFsxOF0sIF9jb3VudFsxN10sIF93ZWlnaHRbMTddOw0KLXNob3J0CQkJX2JpdENvdW50Ow0KLXVuc2lnbmVkIHNob3J0CV9jb21wU2l6ZTsNCi0NCi0NCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotI2RlZmluZSBfX19fU1RBVElDX0ZVTkNUSU9OX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX1NUQVRJQ19GVU5DVElPTl9CT0RZX19fXw0KLQ0KLQ0KLSNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCi0jZGVmaW5lIF9fX19HTE9CQUxfRlVOQ1RJT05fQk9EWV9fX18NCi0NCi11bnNpZ25lZCBzaG9ydCBHZXRDUkMxNih1bnNpZ25lZCBjaGFyICpCdWZmZXJQdHIsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKQ0KLXsNCi0JdW5zaWduZWQgc2hvcnQJCUNSQyA7DQotDQotCUNSQyA9IDA7DQotCXdoaWxlIChOdW1iZXJPZkJ5dGUtLSkNCi0Jew0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKkJ1ZmZlclB0cisrKSAmIDB4ZmZdIDsNCi0JfQ0KLQ0KLQlyZXR1cm4gQ1JDIDsNCi19IC8qIEdldENyYzE2ICovDQotDQotdW5zaWduZWQgc2hvcnQgR2V0Q1JDMTZGYXN0KHZvaWQgKmluUCwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpDQotew0KLQl1bnNpZ25lZCBzaG9ydAkJQ1JDIDsNCi0JdW5zaWduZWQgbG9uZyAqYWxpZ25lZF80Ow0KLQl1bnNpZ25lZCBsb25nIHByZV9jb3VudCwgZW5kX2NvdW50LGxvb3BfNDsNCi0JdW5zaWduZWQgbG9uZyBkYXRhOw0KLQl1bnNpZ25lZCBjaGFyICpCdWZmZXJQdHIgPSBpblA7DQotDQotCWlmIChOdW1iZXJPZkJ5dGUgPCA0KQ0KLQl7DQotCQlyZXR1cm4gR2V0Q1JDMTYoaW5QLCBOdW1iZXJPZkJ5dGUpOw0KLQl9DQotCXByZV9jb3VudCA9ICgodW5zaWduZWQgbG9uZylCdWZmZXJQdHIgJiAweDAzKTsNCi0JaWYocHJlX2NvdW50IT0wKQ0KLQkJcHJlX2NvdW50ID0gNC1wcmVfY291bnQ7DQotCWFsaWduZWRfNCA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKUJ1ZmZlclB0ciArIHByZV9jb3VudCk7DQotCWxvb3BfNCA9IChOdW1iZXJPZkJ5dGUtcHJlX2NvdW50KT4+MjsNCi0JZW5kX2NvdW50ID0gTnVtYmVyT2ZCeXRlLShsb29wXzQ8PDIpLXByZV9jb3VudDsNCi0NCi0JQ1JDPTA7DQotCXdoaWxlKChwcmVfY291bnQtLSkhPTApDQotCXsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7DQotCX0NCi0NCi0JQnVmZmVyUHRyPSh1bnNpZ25lZCBjaGFyICopYWxpZ25lZF80Kyhsb29wXzQ8PDIpOw0KLQ0KLQl3aGlsZSgobG9vcF80LS0pIT0wKQ0KLQl7DQotCQlkYXRhPSAqYWxpZ25lZF80Kys7DQotI2lmIGRlZmluZWQoQ09ORklHX0JJR19FTkRJQU4pDQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOw0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PjE2KSkgJiAweGZmXTsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeIChkYXRhPj4gOCkpICYgMHhmZl07DQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YQkpKSAmIDB4ZmZdOw0KLSNlbHNlDQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YQkpKSAmIDB4ZmZdOw0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIENSQ18xNl9UQUJMRVsoQ1JDIF4gKGRhdGE+PiA4KSkgJiAweGZmXTsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeIChkYXRhPj4xNikpICYgMHhmZl07DQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gQ1JDXzE2X1RBQkxFWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOw0KLSNlbmRpZg0KLQl9DQotDQotCXdoaWxlKChlbmRfY291bnQtLSkhPTApDQotCXsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBDUkNfMTZfVEFCTEVbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXTsNCi0JfQ0KLQ0KLQlyZXR1cm4gQ1JDIDsNCi0NCi19IC8qIEdldENyYzE2ICovDQotDQotdW5zaWduZWQgbG9uZyBHZXRDcmMzMih1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIG4pDQotew0KLQl1bnNpZ25lZCBsb25nCWNyYywgKnRibDsNCi0JdW5zaWduZWQgbG9uZwlsZW47DQotDQotCWxlbiA9IG47DQotDQotCWNyYyA9IDB4RkZGRkZGRkY7DQotCXRibCA9ICh1bnNpZ25lZCBsb25nKilfY3JjMzJUYmw7DQotCXdoaWxlIChuLS0pDQotCXsNCi0JCSAgY3JjID0gKGNyYyA+PiA4KSBeIHRibFsoY3JjIF4gKnApICYgMHhmZl07DQotCQkgIHArKzsNCi0JfQ0KLQlyZXR1cm4gfmNyYzsNCi19IC8qIEdldENyYzMyICovDQotDQotdW5zaWduZWQgbG9uZyBHZXRDUkMzMkZhc3Qodm9pZCAqaW5QLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSkNCi17DQotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcJCUNSQyA7DQotCXVuc2lnbmVkIGxvbmcgKmFsaWduZWRfNDsNCi0JdW5zaWduZWQgbG9uZyBwcmVfY291bnQsIGVuZF9jb3VudCxsb29wXzQ7DQotCXVuc2lnbmVkIGxvbmcgZGF0YTsNCi0JdW5zaWduZWQgY2hhciAqQnVmZmVyUHRyID0gaW5QOw0KLQ0KLQlpZiAoTnVtYmVyT2ZCeXRlIDwgNCkNCi0Jew0KLQkJcmV0dXJuIEdldENyYzMyKGluUCwgTnVtYmVyT2ZCeXRlKTsNCi0JfQ0KLQlwcmVfY291bnQgPSAoKHVuc2lnbmVkIGxvbmcpQnVmZmVyUHRyICYgMHgwMyk7DQotCWlmKHByZV9jb3VudCE9MCkNCi0JCXByZV9jb3VudCA9IDQtcHJlX2NvdW50Ow0KLQlhbGlnbmVkXzQgPSAodW5zaWduZWQgbG9uZyAqKSgodW5zaWduZWQgbG9uZylCdWZmZXJQdHIgKyBwcmVfY291bnQpOw0KLQlsb29wXzQgPSAoTnVtYmVyT2ZCeXRlLXByZV9jb3VudCk+PjI7DQotCWVuZF9jb3VudCA9IE51bWJlck9mQnl0ZS0obG9vcF80PDwyKS1wcmVfY291bnQ7DQotDQotCUNSQyA9IDB4RkZGRkZGRkY7DQotCXdoaWxlKChwcmVfY291bnQtLSkhPTApDQotCXsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeICpCdWZmZXJQdHIrKykgJiAweGZmXSA7DQotCX0NCi0NCi0JQnVmZmVyUHRyPSh1bnNpZ25lZCBjaGFyICopYWxpZ25lZF80Kyhsb29wXzQ8PDIpOw0KLQ0KLQl3aGlsZSgobG9vcF80LS0pIT0wKQ0KLQl7DQotCQlkYXRhPSAqYWxpZ25lZF80Kys7DQotI2lmIGRlZmluZWQoQ09ORklHX0JJR19FTkRJQU4pDQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+MjQpKSAmIDB4ZmZdOw0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGE+PjE2KSkgJiAweGZmXTsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhPj4gOCkpICYgMHhmZl07DQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YQkgKSkgJiAweGZmXTsNCi0jZWxzZQ0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGEJICkpICYgMHhmZl07DQotCQlDUkMgPSAoQ1JDID4+IDgpIF4gX2NyYzMyVGJsWyhDUkMgXiAoZGF0YT4+IDgpKSAmIDB4ZmZdOw0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKGRhdGE+PjE2KSkgJiAweGZmXTsNCi0JCUNSQyA9IChDUkMgPj4gOCkgXiBfY3JjMzJUYmxbKENSQyBeIChkYXRhPj4yNCkpICYgMHhmZl07DQotI2VuZGlmDQotCX0NCi0NCi0Jd2hpbGUoKGVuZF9jb3VudC0tKSE9MCkNCi0Jew0KLQkJQ1JDID0gKENSQyA+PiA4KSBeIF9jcmMzMlRibFsoQ1JDIF4gKkJ1ZmZlclB0cisrKSAmIDB4ZmZdIDsNCi0JfQ0KLQ0KLQlyZXR1cm4gfkNSQyA7DQotDQotfSAvKiBHZXRDcmMxNiAqLw0KLQ0KLQ0KLXVuc2lnbmVkIHNob3J0IEdldDEyQml0cyh1bnNpZ25lZCBjaGFyICogYmFzZSkNCi17DQotCXVuc2lnbmVkIHNob3J0IHRlbXAgPSAwIDsNCi0NCi0JdGVtcCB8PSAqKGJhc2UgKyAwKSA7DQotCXRlbXAgPDw9IDggOw0KLQl0ZW1wIHw9ICooYmFzZSArIDEpIDsNCi0NCi0JcmV0dXJuIHRlbXAgJiAweDBGRkYgOw0KLX0gLyogR2V0MTJCaXRzICovDQotDQotdW5zaWduZWQgc2hvcnQgR2V0MTZCaXRzKHVuc2lnbmVkIGNoYXIgKmJhc2UpDQotew0KLQl1bnNpZ25lZCBzaG9ydCB0ZW1wID0gMCA7DQotDQotCXRlbXAgfD0gKihiYXNlICsgMCkgOw0KLQl0ZW1wIDw8PSA4IDsNCi0JdGVtcCB8PSAqKGJhc2UgKyAxKSA7DQotDQotCXJldHVybiB0ZW1wIDsNCi19IC8qIEdldDE2Qml0cyAqLw0KLQ0KLXVuc2lnbmVkIGxvbmcgIEdldDI0Qml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKQ0KLXsNCi0JdW5zaWduZWQgbG9uZyB0ZW1wID0gMCA7DQotDQotCXRlbXAgfD0gKihiYXNlICsgMCkgOw0KLQl0ZW1wIDw8PSA4IDsNCi0JdGVtcCB8PSAqKGJhc2UgKyAxKSA7DQotCXRlbXAgPDw9IDggOw0KLQl0ZW1wIHw9ICooYmFzZSArIDIpIDsNCi0NCi0JcmV0dXJuIHRlbXAgOw0KLX0gLyogR2V0MjRCaXRzICovDQotDQotdW5zaWduZWQgbG9uZyBHZXQzMkJpdHModW5zaWduZWQgY2hhciAqYmFzZSkNCi17DQotCXVuc2lnbmVkIGxvbmcgdGVtcCA9IDAgOw0KLQ0KLQl0ZW1wIHw9ICooYmFzZSArIDApIDsNCi0JdGVtcCA8PD0gOCA7DQotCXRlbXAgfD0gKihiYXNlICsgMSkgOw0KLQl0ZW1wIDw8PSA4IDsNCi0JdGVtcCB8PSAqKGJhc2UgKyAyKSA7DQotCXRlbXAgPDw9IDggOw0KLQl0ZW1wIHw9ICooYmFzZSArIDMpIDsNCi0NCi0JcmV0dXJuIHRlbXAgOw0KLX0gLyogR2V0MzJCaXRzICovDQotDQotdW5zaWduZWQgc2hvcnQgU1dBUDE2KHVuc2lnbmVkIHNob3J0IEEpDQotew0KLQlyZXR1cm4gKCgoQSA+PiA4KSB8IChBIDw8IDgpKSk7DQotfQ0KLQ0KLXVuc2lnbmVkIGludCBTV0FQMzIodW5zaWduZWQgbG9uZyBBKQ0KLXsNCi0JcmV0dXJuICgoQSA8PCAyNCkgfCAoKEEgPDwgOCkgJiAgMHhGRjAwMDApIHwgKChBID4+IDgpICYgIDB4RkYwMCkgfChBID4+IDI0KSk7DQotfQ0KLQ0KLXZvaWQgTWFrZVRibCh1bnNpZ25lZCBzaG9ydCBuQ2hhciwgdW5zaWduZWQgY2hhciAqYml0TGVuLCB1bnNpZ25lZCBzaG9ydCB0YmxCaXRzLCB1bnNpZ25lZCBzaG9ydCAqdGJsKQ0KLXsNCi0JdW5zaWduZWQgc2hvcnQJKndwLCAqd3BwLCAqd3BwcCwgaSwgaywgYXZhaWwsIG1hc2s7DQotCXVuc2lnbmVkIHNob3J0CWxlbiwgY2gsIGp1dEJpdHMsIG5leHRDb2RlOw0KLQl1bnNpZ25lZCBjaGFyCSpicDsNCi0NCi0JZm9yICh3cD0mX2NvdW50WzFdLGk9MTsgaTw9MTY7IGkrKykNCi0JCSp3cCsrID0gMDsNCi0JZm9yICh3cD1fY291bnQsIGJwPWJpdExlbiwgaT0wOyBpPG5DaGFyOyBpKyspDQotCQl3cFsqYnArK10rKzsNCi0NCi0JZm9yICh3cD0mX3N0YXJ0WzFdLHdwcD0mX2NvdW50WzFdLCp3cD0wLGk9MSxrPTE1OyBpPD0xNjsgaSsrLGstLSx3cCsrKQ0KLQkJd3BbMV0gPSAqd3AgKyAoKndwcCsrIDw8IGspOw0KLQ0KLQlpZiAoX3N0YXJ0WzE3XSAhPSAodW5zaWduZWQgc2hvcnQpKDFVIDw8IDE2KSkNCi0JCXByaW50ZigiXG5cbkRlY29tcHJlc3Npb24gZXJyb3I6IEJBRCBUQUJMRVxyXG5cclxuIik7DQotDQotCWp1dEJpdHMgPSAxNi10YmxCaXRzOw0KLQ0KLQlmb3IgKHdwPSZfc3RhcnRbMV0sd3BwPSZfd2VpZ2h0WzFdLGk9MSxrPXRibEJpdHMtMTsgaTw9dGJsQml0czsgaSsrLGstLSkNCi0Jew0KLQkJKndwID4+PSBqdXRCaXRzOw0KLQkJd3ArKzsNCi0JCSp3cHArKyA9IDFVIDw8IGs7DQotCX0NCi0NCi0JZm9yIChrPTE2LWksd3A9Jl93ZWlnaHRbaV07IGk8PTE2OyBpKyssay0tKQ0KLQkJKndwKysgPSAxVSA8PCBrOw0KLQ0KLQlpID0gX3N0YXJ0W3RibEJpdHMrMV0gPj4ganV0Qml0czsNCi0JaWYgKGkgIT0gKHVuc2lnbmVkIHNob3J0KSgxVSA8PCAxNikpDQotCXsNCi0JCWsgPSAxVSA8PCB0YmxCaXRzOw0KLQkJd2hpbGUgKGkhPWspDQotCQkJdGJsW2krK10gPSAwOw0KLQl9DQotDQotCWF2YWlsID0gbkNoYXI7DQotCW1hc2sgPSAxVSA8PCAoMTUtdGJsQml0cyk7DQotCXdwcCA9IF9yaWdodDsNCi0Jd3BwcCA9IF9sZWZ0Ow0KLQlmb3IgKGNoPTAsYnA9Yml0TGVuOyBjaDxuQ2hhcjsgY2grKykNCi0Jew0KLQkJaWYgKChsZW4gPSAqYnArKykgPT0gMCkNCi0JCQljb250aW51ZTsNCi0NCi0JCWsgPSBfc3RhcnRbbGVuXTsNCi0JCW5leHRDb2RlID0gayArIF93ZWlnaHRbbGVuXTsNCi0NCi0JCWlmIChsZW4gPD0gdGJsQml0cykNCi0JCXsNCi0JCQlmb3IgKHdwPXRibCtrOyBrPG5leHRDb2RlOyBrKyspDQotCQkJCSp3cCsrID0gY2g7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJd3AgPSB0YmwgKyAoayA+PiBqdXRCaXRzKTsNCi0JCQlpID0gbGVuLXRibEJpdHM7DQotCQkJd2hpbGUgKGkgIT0gMCkNCi0JCQl7DQotCQkJCWlmICgqd3AgPT0gMCkNCi0JCQkJew0KLQkJCQkJd3BwW2F2YWlsXSA9IHdwcHBbYXZhaWxdID0gMDsNCi0JCQkJCSp3cCA9IGF2YWlsKys7DQotCQkJCX0NCi0JCQkJd3AgPSAoayZtYXNrID8gd3BwIDogd3BwcCkgKyAqd3A7DQotCQkJCWsgPDw9IDE7DQotCQkJCWktLTsNCi0JCQl9DQotCQkJKndwID0gY2g7DQotCQl9DQotCQlfc3RhcnRbbGVuXSA9IG5leHRDb2RlOw0KLQl9DQotfSAvKiBNYWtlVGJsICovDQotDQotDQotdm9pZCBGaWxsQnVmKHVuc2lnbmVkIHNob3J0IG4pCS8qIFNoaWZ0IF9iaXRCdWYgbiBiaXRzIGxlZnQsIHJlYWQgbiBiaXRzICovDQotew0KLQlfYml0QnVmIDw8PSBuOw0KLQl3aGlsZSAobiA+IF9iaXRDb3VudCkNCi0Jew0KLQkJbiAtPSBfYml0Q291bnQ7DQotCQlfYml0QnVmIHw9IF9zdWJCaXRCdWYgPDwgbjsNCi0JCWlmIChfY29tcFNpemUgIT0gMCkNCi0JCXsNCi0JCQlfY29tcFNpemUtLTsNCi0JCQlfc3ViQml0QnVmID0gKl9vcmdEYXRhKys7DQotCQl9DQotCQllbHNlDQotCQkJX3N1YkJpdEJ1ZiA9IDA7DQotCQlfYml0Q291bnQgPSBOX0JJVF9CeXRlOw0KLQl9DQotCV9iaXRDb3VudCAtPSBuOw0KLQlfYml0QnVmIHw9IF9zdWJCaXRCdWYgPj4gX2JpdENvdW50Ow0KLX0gLyogRmlsbEJ1ZiAqLw0KLQ0KLQ0KLXVuc2lnbmVkIHNob3J0IEdldEJpdHModW5zaWduZWQgc2hvcnQgbikNCi17DQotCXVuc2lnbmVkIHNob3J0CXg7DQotDQotCXggPSBfYml0QnVmID4+IChTSVpFX0JpdEJ1Zi1uKTsNCi0JRmlsbEJ1ZihuKTsNCi0NCi0JcmV0dXJuIHg7DQotfSAvKiBHZXRCaXRzICovDQotDQotDQotdm9pZCBSZWFkUHRMZW4oc2lnbmVkIHNob3J0IG5uLCBzaWduZWQgc2hvcnQgbkJpdCwgc2lnbmVkIHNob3J0IGlTcGVjaWFsKQ0KLXsNCi0Jc2lnbmVkIHNob3J0CWksYyxuOw0KLQl1bnNpZ25lZCBzaG9ydAltYXNrLCAqd3A7DQotCXVuc2lnbmVkIGNoYXIJKmJwOw0KLQ0KLQluID0gR2V0Qml0cyhuQml0KTsNCi0JaWYgKG4gPT0gMCkNCi0Jew0KLQkJYyA9IEdldEJpdHMobkJpdCk7DQotDQotCQlmb3IgKGJwPV9wdExlbixpPTA7IGk8bm47IGkrKykNCi0JCQkqYnArKyA9IDA7DQotCQlmb3IgKHdwPV9wdFRibCxpPTA7IGk8MjU2OyBpKyspDQotCQkJKndwKysgPSBjOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaSA9IDA7DQotCQlicCA9IF9wdExlbjsNCi0JCXdoaWxlIChpIDwgbikNCi0JCXsNCi0JCQljID0gX2JpdEJ1ZiA+PiAoU0laRV9CaXRCdWYtMyk7DQotCQkJaWYgKGMgPT0gNykNCi0JCQl7DQotCQkJCW1hc2sgPSAxVSA8PCAoU0laRV9CaXRCdWYtMS0zKTsNCi0JCQkJd2hpbGUgKG1hc2sgJiBfYml0QnVmKQ0KLQkJCQl7DQotCQkJCQltYXNrID4+PSAxOw0KLQkJCQkJYysrOw0KLQkJCQl9DQotCQkJfQ0KLQkJCUZpbGxCdWYoYzw3ID8gMyA6IGMtMyk7DQotCQkJYnBbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKWM7DQotCQkJaWYgKGkgPT0gaVNwZWNpYWwpDQotCQkJew0KLQkJCQljID0gR2V0Qml0cygyKTsNCi0JCQkJd2hpbGUgKC0tYyA+PSAwKQ0KLQkJCQkJYnBbaSsrXSA9IDA7DQotCQkJfQ0KLQkJfQ0KLQkJd2hpbGUgKGk8bm4pDQotCQkJYnBbaSsrXSA9IDA7DQotCQlNYWtlVGJsKG5uLCBicCwgOCwgX3B0VGJsKTsNCi0JfQ0KLX0gLyogUmVhZFB0TGVuICovDQotDQotDQotdm9pZCBSZWFkQ0xlbih2b2lkKQ0KLXsNCi0Jc2lnbmVkIHNob3J0CWksIGMsIG47DQotCXVuc2lnbmVkIHNob3J0CW1hc2ssICp3cCwgKndwcDsNCi0JdW5zaWduZWQgY2hhcgkqYnAsICpicHA7DQotDQotCW4gPSBHZXRCaXRzKE5fQklUX0MpOw0KLQlicCA9IF9jTGVuOw0KLQlpZiAobiA9PSAwKQ0KLQl7DQotCQljID0gR2V0Qml0cyhOX0JJVF9DKTsNCi0JCWZvciAoaT0wOyBpPE5DOyBpKyspDQotCQkJKmJwKysgPSAwOw0KLQkJZm9yICh3cD1fY1RibCxpPTA7IGk8NDA5NjsgaSsrKQ0KLQkJCSp3cCsrID0gYzsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWkgPSAwOw0KLQkJYnBwID0gX3B0TGVuOw0KLQkJd3AgPSBfcmlnaHQ7DQotCQl3cHAgPSBfbGVmdDsNCi0JCXdoaWxlIChpIDwgbikNCi0JCXsNCi0JCQljID0gX3B0VGJsW19iaXRCdWY+PihTSVpFX0JpdEJ1Zi04KV07DQotCQkJaWYgKGMgPj0gTlQpDQotCQkJew0KLQkJCQltYXNrID0gMVUgPDwgKFNJWkVfQml0QnVmLTEtOCk7DQotCQkJCWRvDQotCQkJCXsNCi0JCQkJCWMgPSAoX2JpdEJ1ZiAmIG1hc2spID8gd3BbY10gOiB3cHBbY107DQotCQkJCQltYXNrID4+PSAxOw0KLQkJCQl9IHdoaWxlIChjID49IE5UKTsNCi0JCQl9DQotCQkJRmlsbEJ1ZihicHBbY10pOw0KLQkJCWlmIChjIDw9IDIpDQotCQkJew0KLQkJCQlpZiAoYyA9PSAwKSBjID0gMTsNCi0JCQkJZWxzZSBpZiAoYyA9PSAxKSBjID0gR2V0Qml0cyg0KSArIDM7DQotCQkJCWVsc2UJCWMgPSBHZXRCaXRzKE5fQklUX0MpICsgMjA7DQotDQotCQkJCXdoaWxlICgtLWMgPj0gMCkNCi0JCQkJCWJwW2krK109MDsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCQlicFtpKytdID0gYy0yOw0KLQkJfQ0KLQkJd2hpbGUgKGkgPCBOQykNCi0JCQlicFtpKytdID0gMDsNCi0JCU1ha2VUYmwoTkMsIGJwLCAxMiwgX2NUYmwpOw0KLQl9DQotfSAvKiBSZWFkQ0xlbiAqLw0KLQ0KLQ0KLXVuc2lnbmVkIHNob3J0IERlY29kZUModm9pZCkNCi17DQotCXVuc2lnbmVkIHNob3J0CWksIG1hc2ssICp3cCwgKndwcDsNCi0NCi0JaWYgKF9ibGtTaXplID09IDApDQotCXsNCi0JCV9ibGtTaXplID0gR2V0Qml0cygxNik7DQotCQlSZWFkUHRMZW4oTlQsIFRCSVQsIDMpOw0KLQkJUmVhZENMZW4oKTsNCi0JCVJlYWRQdExlbihOUCwgUEJJVCwgKHVuc2lnbmVkIHNob3J0KS0xKTsNCi0JfQ0KLQlfYmxrU2l6ZS0tOw0KLQlpID0gX2NUYmxbX2JpdEJ1ZiA+PiAoU0laRV9CaXRCdWYtMTIpXTsNCi0JaWYgKGkgPj0gTkMpDQotCXsNCi0JCW1hc2sgPSAxVSA8PCAoU0laRV9CaXRCdWYtMS0xMik7DQotCQl3cCA9IF9yaWdodDsNCi0JCXdwcCA9IF9sZWZ0Ow0KLQkJZG8NCi0JCXsNCi0JCQlpID0gKF9iaXRCdWYgJiBtYXNrKSA/IHdwW2ldIDogd3BwW2ldOw0KLQkJCW1hc2sgPj49IDE7DQotCQl9IHdoaWxlIChpID49IE5DKTsNCi0JfQ0KLQlGaWxsQnVmKF9jTGVuW2ldKTsNCi0NCi0JcmV0dXJuIGk7DQotfSAvKiBEZWNvZGVDICovDQotDQotDQotdW5zaWduZWQgc2hvcnQgRGVjb2RlUCh2b2lkKQ0KLXsNCi0JdW5zaWduZWQgc2hvcnQJaSwgbWFzaywgKndwLCAqd3BwOw0KLQ0KLQlpID0gX3B0VGJsW19iaXRCdWYgPj4gKFNJWkVfQml0QnVmLTgpXTsNCi0JaWYgKGkgPj0gTlApDQotCXsNCi0JCW1hc2sgPSAxVSA8PCAoU0laRV9CaXRCdWYtMS04KTsNCi0JCXdwID0gX3JpZ2h0Ow0KLQkJd3BwID0gX2xlZnQ7DQotCQlkbw0KLQkJew0KLQkJCWkgPSAoX2JpdEJ1ZiAmIG1hc2spID8gd3BbaV0gOiB3cHBbaV07DQotCQkJbWFzayA+Pj0gMTsNCi0JCX0gd2hpbGUgKGkgPj0gTlApOw0KLQl9DQotCUZpbGxCdWYoX3B0TGVuW2ldKTsNCi0JaWYgKGkgIT0gMCkNCi0JCWkgPSAoMVUgPDwgKGktMSkpICsgR2V0Qml0cyhpLTEpOw0KLQ0KLQlyZXR1cm4gaTsNCi19IC8qIERlY29kZVAgKi8NCi0NCi0NCi11bnNpZ25lZCBjaGFyICpEZWNvbXByZXNzRGF0YSh1bnNpZ25lZCBjaGFyICpkYXRhKQ0KLXsNCi0Jc2lnbmVkIHNob3J0CXJlbSwgbiwgaSwgciwgYzsJLy8gcmVtOiByZW1haW5pbmcgdW5zaWduZWQgY2hhcnMgdG8gY29weQ0KLQl1bnNpZ25lZCBjaGFyCSpkaWNCdWYsICpkZWNvbXBCdWY7DQotCXVuc2lnbmVkIHNob3J0CW9yZ1NpemU7DQotDQotCV9vcmdEYXRhCT0gZGF0YTsNCi0Jb3JnU2l6ZQkJPSAodW5zaWduZWQgc2hvcnQpX29yZ0RhdGFTaXplOw0KLQlfY29tcFNpemUJPSAodW5zaWduZWQgc2hvcnQpX2NvbXBEYXRhU2l6ZTsNCi0JZGVjb21wQnVmCT0gX2RlY29tcEJ1ZjsNCi0NCi0JX2JpdEJ1ZiA9IF9zdWJCaXRCdWYgPSAwOw0KLQlfYml0Q291bnQgPSAwOw0KLQlGaWxsQnVmKFNJWkVfQml0QnVmKTsNCi0JX2Jsa1NpemUgPSAwOw0KLQlyZW0gPSAwOw0KLQlpID0gMDsNCi0NCi0Jd2hpbGUgKG9yZ1NpemUgIT0gMCkNCi0Jew0KLQkJZGljQnVmID0gX2RpY0J1ZjsNCi0NCi0JCW4gPSAob3JnU2l6ZSA+IFNJWkVfRGljKSA/IFNJWkVfRGljIDogb3JnU2l6ZTsNCi0NCi0JCXIgPSAwOw0KLQkJd2hpbGUgKC0tcmVtID49IDApDQotCQl7DQotCQkJZGljQnVmW3JdID0gZGljQnVmW2ldOw0KLQkJCWkgPSAoaSsxKSAmIChTSVpFX0RpYy0xKTsNCi0JCQlpZiAoKytyID09IG4pDQotCQkJCWdvdG8gTkVYVDsNCi0JCX0NCi0NCi0JCXdoaWxlKDEpDQotCQl7DQotCQkJYyA9IERlY29kZUMoKTsNCi0JCQlpZiAoYyA8PSBNQVhfQnl0ZU51bSkNCi0JCQl7DQotCQkJCWRpY0J1ZltyXSA9ICh1bnNpZ25lZCBjaGFyKWM7DQotCQkJCWlmICgrK3IgPT0gbikNCi0JCQkJCWdvdG8gTkVYVDsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJcmVtID0gYyAtIChNQVhfQnl0ZU51bSsxLVRIUkVTSE9MRCk7DQotCQkJCWkgPSAoci1EZWNvZGVQKCktMSkgJiAoU0laRV9EaWMtMSk7DQotCQkJCXdoaWxlICgtLXJlbSA+PSAwKQ0KLQkJCQl7DQotCQkJCQlkaWNCdWZbcl0gPSBkaWNCdWZbaV07DQotCQkJCQlpID0gKGkrMSkgJiAoU0laRV9EaWMtMSk7DQotCQkJCQlpZiAoKytyID09IG4pDQotCQkJCQkJZ290byBORVhUOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJTkVYVDoNCi0NCi0JCWZvciAocj0wOyByPG47IHIrKykNCi0JCQkqZGVjb21wQnVmKysgPSAqZGljQnVmKys7DQotDQotCQlvcmdTaXplIC09IG47DQotCX0NCi0NCi0vLwlEU0lfcHJpbnRmKDAsICJEZWNvbXAgZW5kXHJcbiIpOw0KLQ0KLQlyZXR1cm4gX2RlY29tcEJ1ZjsNCi19IC8qIERlY29tcHJlc3MgKi8NCi0NCmRpZmYgLS1naXQgYS9saWJ1cGdyYWRlL3V0aWwuaCBiL2xpYnVwZ3JhZGUvdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk2ZjVlLi4wMDAwMDAwCi0tLSBhL2xpYnVwZ3JhZGUvdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotDQotI2lmbmRlZiBfVVRJTF9IXw0KLSNkZWZpbmUgX1VUSUxfSF8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBXb3JrZmlsZSAgIDogdXRpbC5oDQotICogUHJvamVjdCAgICA6IEtyYWtlbg0KLSAqIEF1dGhvciAgICAgOiBraHdvbw0KLSAqIERlc2NyaXB0aW9uOiBDb21tYW5kcyBUZW1wbGF0ZQ0KLSAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSFVNQVggQ28uLCBMdGQuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCi0jZGVmaW5lIF9fX19IRUFERVJfRklMRVNfX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX01BQ1JPX0RFRklOSVRJT05fX19fDQotDQotDQotI2RlZmluZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KLSNkZWZpbmUgX19fX1RZUEVfREVGSU5JVElPTl9fX18NCi0NCi0NCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotI2RlZmluZSBfX19fRVhURVJOQUxfVkFSSUFCTEVfREVGSU5JVElPTl9fX18NCi0NCi0NCi0jZGVmaW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQotI2RlZmluZSBfX19fRVhURVJOQUxfRlVOQ1RJT05fREVGSU5JVElPTl9fX18NCi11bnNpZ25lZCBzaG9ydCBHZXRDUkMxNih1bnNpZ25lZCBjaGFyICpCdWZmZXJQdHIsIHVuc2lnbmVkIGxvbmcgTnVtYmVyT2ZCeXRlKTsNCi11bnNpZ25lZCBzaG9ydCBHZXRDUkMxNkZhc3Qodm9pZCAqaW5QLCB1bnNpZ25lZCBsb25nIE51bWJlck9mQnl0ZSk7DQotdW5zaWduZWQgbG9uZyBHZXRDcmMzMih1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIG4pOw0KLXVuc2lnbmVkIGxvbmcgR2V0Q1JDMzJGYXN0KHZvaWQgKmluUCwgdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGUpOw0KLXVuc2lnbmVkIHNob3J0IEdldDEyQml0cyh1bnNpZ25lZCBjaGFyICogYmFzZSk7DQotdW5zaWduZWQgc2hvcnQgR2V0MTZCaXRzKHVuc2lnbmVkIGNoYXIgKmJhc2UpOw0KLXVuc2lnbmVkIGxvbmcgIEdldDI0Qml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKTsNCi11bnNpZ25lZCBsb25nIEdldDMyQml0cyh1bnNpZ25lZCBjaGFyICpiYXNlKTsNCi11bnNpZ25lZCBzaG9ydCBTV0FQMTYodW5zaWduZWQgc2hvcnQgQSk7DQotdW5zaWduZWQgaW50IFNXQVAzMih1bnNpZ25lZCBsb25nIEEpOw0KLQ0KLXVuc2lnbmVkIGNoYXIgKkRlY29tcHJlc3NEYXRhKHVuc2lnbmVkIGNoYXIgKmRhdGEpOw0KLQ0KLS8vbG9uZyBhdG9sKGNvbnN0IGNoYXIgKmRlc3QpOw0KLS8vY2hhciB0b2xvd2VyKGNoYXIgYyk7DQotDQotI2VuZGlmIC8qIF9VVElMX0hfICovDQotDQotDQo=