ZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0kuaCBiL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlYTdmNC4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvamVjdAk6CUdVU0kJCQkJLQlHcmFuZCBVbmlmaWVkIFNvY2tldCBJbnRlcmZhY2UKLUZpbGUJCToJR1VTSS5oCQkJLQlTb2NrZXQgY2FsbHMKLUF1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgotTGFuZ3VhZ2UJOglNUFcgQy9DKysKLQotJExvZyQKLVJldmlzaW9uIDEuMSAgMjAwMC8wOS8xMiAyMDoyNDo1MCAgamFjawotTW92ZWQgdG8gVW5zdXBwb3J0ZWQuCi0KLVJldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozMyAgamFjawotUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KLQotUmV2aXNpb24gMS4yICAxOTk0LzEyLzMxICAwMTo0NTo1NCAgbmVlcmkKLUZpeCBhbGlnbm1lbnQuCi0KLVJldmlzaW9uIDEuMSAgMTk5NC8wMi8yNSAgMDI6NTY6NDkgIG5lZXJpCi1Jbml0aWFsIHJldmlzaW9uCi0KLVJldmlzaW9uIDAuMTUgIDE5OTMvMDYvMjcgIDAwOjAwOjAwICBuZWVyaQotZj90cnVuY2F0ZQotCi1SZXZpc2lvbiAwLjE0ICAxOTkzLzA2LzIwICAwMDowMDowMCAgbmVlcmkKLUNoYW5nZWQgc2FfY29uc3RyX3BwYwotCi1SZXZpc2lvbiAwLjEzICAxOTkzLzAyLzE0ICAwMDowMDowMCAgbmVlcmkKLUFGX1BBUAotCi1SZXZpc2lvbiAwLjEyICAxOTkyLzEyLzA4ICAwMDowMDowMCAgbmVlcmkKLWdldGN3ZCgpCi0KLVJldmlzaW9uIDAuMTEgIDE5OTIvMTEvMTUgIDAwOjAwOjAwICBuZWVyaQotcmVtb3ZlIG5ldGRiLmggZGVmaW5pdGlvbnMKLQotUmV2aXNpb24gMC4xMCAgMTk5Mi8wOS8yNiAgMDA6MDA6MDAgIG5lZXJpCi1TZXBhcmF0ZSBkaXJlbnQgYW5kIHN0YXQKLQotUmV2aXNpb24gMC45ICAxOTkyLzA5LzEyICAwMDowMDowMCAgbmVlcmkKLUhvc3RuYW1lIHN0dWZmCi0KLVJldmlzaW9uIDAuOCAgMTk5Mi8wOS8wNyAgMDA6MDA6MDAgIG5lZXJpCi1yZWFkbGluaygpCi0KLVJldmlzaW9uIDAuNyAgMTk5Mi8wOC8wMyAgMDA6MDA6MDAgIG5lZXJpCi1zYV9jb25zdHJfcHBjCi0KLVJldmlzaW9uIDAuNiAgMTk5Mi8wNy8yMSAgMDA6MDA6MDAgIG5lZXJpCi1zb2NrYWRkcl9hdGxrX3N5bQotCi1SZXZpc2lvbiAwLjUgIDE5OTIvMDYvMjYgIDAwOjAwOjAwICBuZWVyaQotY2hvb3NlKCkKLQotUmV2aXNpb24gMC40ICAxOTkyLzA1LzE4ICAwMDowMDowMCAgbmVlcmkKLVBQQyBzdHVmZgotCi1SZXZpc2lvbiAwLjMgIDE5OTIvMDQvMjcgIDAwOjAwOjAwICBuZWVyaQotZ2V0c29ja29wdCgpCi0KLVJldmlzaW9uIDAuMiAgMTk5Mi8wNC8xOSAgMDA6MDA6MDAgIG5lZXJpCi1DKysgY29tcGF0aWJpbGl0eQotCi1SZXZpc2lvbiAwLjEgIDE5OTIvMDQvMTcgIDAwOjAwOjAwICBuZWVyaQotYnplcm8oKQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0dVU0lfCi0jZGVmaW5lIF9HVVNJXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLS8qIEZlZWwgZnJlZSB0byBpbmNyZWFzZSBGRF9TRVRTSVpFIGFzIG5lZWRlZCAqLwotI2RlZmluZSBHVVNJX01BWF9GRAlGRF9TRVRTSVpFCi0KLSNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KLSNpbmNsdWRlIDxjb21wYXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jaW5jbHVkZSA8RXZlbnRzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLSNpbmNsdWRlIDxBcHBsZVRhbGsuaD4KLSNpbmNsdWRlIDxDVEJVdGlsaXRpZXMuaD4KLSNpbmNsdWRlIDxQYWNrYWdlcy5oPgotI2luY2x1ZGUgPFBQQ1Rvb2xCb3guaD4KLSNpbmNsdWRlIDxTdGFuZGFyZEZpbGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+Ci0KLXR5cGVkZWYgZW51bSBzcGluX21zZyB7Ci0JU1BfTUlTQywJCQkJLyogc29tZSB3ZWlyZCB0aGluZywgdXN1YWxseSBqdXN0IHJldHVybiBpbW1lZGlhdGVseSBpZiB5b3UgZ2V0IHRoaXMgKi8KLQlTUF9TRUxFQ1QsCQkJLyogaW4gYSBzZWxlY3QgY2FsbCAqLwotCVNQX05BTUUsCQkJCS8qIGdldHRpbmcgYSBob3N0IGJ5IG5hbWUgKi8KLQlTUF9BRERSLAkJCQkvKiBnZXR0aW5nIGEgaG9zdCBieSBhZGRyZXNzICovCi0JU1BfU1RSRUFNX1JFQUQsCS8qIFN0cmVhbSByZWFkIGNhbGwgKi8KLQlTUF9TVFJFQU1fV1JJVEUsCS8qIFN0cmVhbSB3cml0ZSBjYWxsICovCi0JU1BfREdSQU1fUkVBRCwJCS8qIERhdGFncmFtIHJlYWQgY2FsbCAqLwotCVNQX0RHUkFNX1dSSVRFLAkvKiBEYXRhZ3JhbSB3cml0ZSBjYWxsICovCi0JU1BfU0xFRVAsCQkJLyogc2xlZXBpbmcsIHBhc3NlcyB0aWNrcyBsZWZ0IHRvIHNsZWVwICovCi0JU1BfQVVUT19TUElOCQkvKiBBdXRvc3BpbiwgcGFzc2VzIGFyZ3VtZW50IHRvIFNwaW5DdXJzb3IgKi8KLX0gc3Bpbl9tc2c7Ci0KLXR5cGVkZWYgaW50ICgqR1VTSVNwaW5Gbikoc3Bpbl9tc2cgbXNnLCBsb25nIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoKkdVU0lFdnRIYW5kbGVyKShFdmVudFJlY29yZCAqIGV2KTsKLXR5cGVkZWYgR1VTSUV2dEhhbmRsZXIJR1VTSUV2dFRhYmxlWzI0XTsKLQotLyoKLSAqIEFkZHJlc3MgZmFtaWxpZXMsIGRlZmluZWQgaW4gc3lzL3NvY2tldC5oCi0gKgotIAotI2RlZmluZQlBRl9VTlNQRUMJCSAwCQkvLyB1bnNwZWNpZmllZAotI2RlZmluZQlBRl9VTklYCQkJIDEJCS8vIGxvY2FsIHRvIGhvc3QgKHBpcGVzLCBwb3J0YWxzKQotI2RlZmluZQlBRl9JTkVUCQkJIDIJCS8vIGludGVybmV0d29yazogVURQLCBUQ1AsIGV0Yy4KLSNkZWZpbmUJQUZfQ1RCCQkJIDMJCS8vIEFwcGxlIENvbW0gVG9vbGJveCAobm90IHlldCBzdXBwb3J0ZWQpCi0jZGVmaW5lCUFGX0ZJTEUJCQkgNAkJLy8gTm9ybWFsIEZpbGUgSS9PICh1c2VkIGludGVybmFsbHkpCi0jZGVmaW5lCUFGX1BQQwkJCSA1CQkvLyBQUEMgVG9vbGJveAotI2RlZmluZQlBRl9QQVAJCQkgNgkJLy8gUHJpbnRlciBBY2Nlc3MgUHJvdG9jb2wgKGNsaWVudCBvbmx5KQotI2RlZmluZQlBRl9BUFBMRVRBTEsJMTYJCS8vIEFwcGxlIFRhbGsKLQotKi8KLQotI2RlZmluZQlBVEFMS19TWU1BRERSIDI3MgkJLyogU3ltYm9saWMgQWRkcmVzcyBmb3IgQXBwbGVUYWxrIAkJCSovCi0KLS8qCi0gKiBTb21lIEltcGxlbWVudGF0aW9ucyBvZiBHVVNJIHJlcXVpcmUgeW91IHRvIGNhbGwgR1VTSVNldHVwIGZvciB0aGUKLSAqIHNvY2tldCBmYW1pbGllcyB5b3UnZCBsaWtlIHRvIGhhdmUgZGVmaW5lZC4gSXQncyBhIGdvb2QgaWRlYSB0byBjYWxsCi0gKiB0aGlzIGZvciAqYWxsKiBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogR1VTSURlZmF1bHRTZXR1cCgpIHdpbGwgaW5jbHVkZSBhbGwgc29ja2V0IGZhbWlsaWVzLgotICoKLSAqIE5ldmVyIGNhbGwgYW55IG9mIHRoZSBHVVNJd2l0aFhYWCByb3V0aW5lcyBkaXJlY3RseS4KLSAqLwotCi1fX0JFR0lOX0RFQ0xTCi12b2lkIEdVU0l3aXRoQXBwbGVUYWxrU29ja2V0cygpOwotdm9pZCBHVVNJd2l0aEludGVybmV0U29ja2V0cygpOwotdm9pZCBHVVNJd2l0aFBBUFNvY2tldHMoKTsKLXZvaWQgR1VTSXdpdGhQUENTb2NrZXRzKCk7Ci12b2lkIEdVU0l3aXRoVW5peFNvY2tldHMoKTsKLXZvaWQgR1VTSXdpdGhTSU9VWFNvY2tldHMoKTsKLXZvaWQgR1VTSXdpdGhNUFdTb2NrZXRzKCk7Ci0KLXZvaWQgR1VTSVNldHVwKHZvaWQgKCpzb2NrZXRmYW1pbHkpKCkpOwotdm9pZCBHVVNJRGVmYXVsdFNldHVwKCk7Ci12b2lkIEdVU0lMb2FkQ29uZmlndXJhdGlvbihIYW5kbGUpOwotX19FTkRfREVDTFMKLS8qCi0gKiBUeXBlcywgIGRlZmluZWQgaW4gc3lzL3NvY2tldC5oCi0gKgotCi0jZGVmaW5lCVNPQ0tfU1RSRUFNCQkgMQkJLy8gc3RyZWFtIHNvY2tldCAKLSNkZWZpbmUJU09DS19ER1JBTQkJIDIJCS8vIGRhdGFncmFtIHNvY2tldAotCi0qLwotCi0vKgotICogRGVmaW5lZCBpbiBzeXMvdW4uaAotICoKLSAKLXN0cnVjdCBzb2NrYWRkcl91biB7Ci0Jc2hvcnQJCXN1bl9mYW1pbHk7Ci0JY2hhciAJCXN1bl9wYXRoWzEwOF07Ci19OwotCi0qLwotCi0jaWZuZGVmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKLSNlcnJvciBBcHBsZSBoYWQgc29tZSBmdW4gd2l0aCB0aGUgY29uZGl0aW9uYWwgbWFjcm9zIGFnYWluCi0jZW5kaWYKLQotI2lmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKLSNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKLSNlbmRpZgotCi1zdHJ1Y3Qgc29ja2FkZHJfYXRsayB7Ci0Jc2hvcnQJCQlmYW1pbHk7Ci0JQWRkckJsb2NrCWFkZHI7Ci19OwotCi1zdHJ1Y3Qgc29ja2FkZHJfYXRsa19zeW0gewotCXNob3J0CQkJZmFtaWx5OwotCUVudGl0eU5hbWUJbmFtZTsKLX07Ci0KLXN0cnVjdCBzb2NrYWRkcl9wcGMgewotCXNob3J0CQkJCQlmYW1pbHk7Ci0JTG9jYXRpb25OYW1lUmVjCWxvY2F0aW9uOwotCVBQQ1BvcnRSZWMJCQlwb3J0OwotfTsKLQotLyogRGVmaW5pdGlvbnMgZm9yIGNob29zZSgpICovCi0KLSNkZWZpbmUgCUNIT09TRV9ERUZBVUxUCTEJCS8qCVVzZSAqbmFtZSBhcyBkZWZhdWx0IG5hbWUJCQkJCQkqLwotI2RlZmluZQlDSE9PU0VfTkVXCQkyCQkvKiBDaG9vc2UgbmV3IGVudGl0eSBuYW1lLCBub3QgZXhpc3Rpbmcgb25lCSovCi0jZGVmaW5lCUNIT09TRV9ESVIJCTQJCS8qIENob29zZSBhIGRpcmVjdG9yeSBuYW1lLCBub3QgYSBmaWxlIAkJKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXNob3J0CQkJbnVtVHlwZXM7Ci0JU0ZUeXBlTGlzdAl0eXBlczsKLX0gc2FfY29uc3RyX2ZpbGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydAkJCW51bVR5cGVzOwotCU5MVHlwZQkJdHlwZXM7Ci19IHNhX2NvbnN0cl9hdGxrOwotCi0vKiBEZWZpbml0aW9ucyBmb3Igc2FfY29uc3RyX3BwYyAqLwotCi0jZGVmaW5lIFBQQ19DT05fTkVXU1RZTEUJCTB4ODAwMAkvKiBSZXF1aXJlZCAqLwotI2RlZmluZSBQUENfQ09OX01BVENIX05BTUUJCTB4MDAwMQkvKiBNYXRjaCBuYW1lICovCi0jZGVmaW5lIFBQQ19DT05fTUFUQ0hfVFlQRSAJMHgwMDAyIAkvKiBNYXRjaCBwb3J0IHR5cGUgKi8KLSNkZWZpbmUgUFBDX0NPTl9NQVRDSF9OQlAJCTB4MDAwNAkvKiBNYXRjaCBOQlAgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdAl7Ci0Jc2hvcnQJCQlmbGFnczsKLQlTdHIzMgkJCW5icFR5cGU7Ci0JUFBDUG9ydFJlYwltYXRjaDsKLX0gc2FfY29uc3RyX3BwYzsKLQotI2lmIFBSQUdNQV9BTElHTl9TVVBQT1JURUQKLSNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAotI2VuZGlmCi0KLV9fQkVHSU5fREVDTFMKLS8qIAotICogSU8vU29ja2V0IHN0dWZmLCBkZWZpbmVkIGVsc2V3aGVyZSAodW5pc3RkLmgsIHN5cy9zb2NrZXQuaAotICoKLQotaW50IHNvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgc2hvcnQgcHJvdG9jb2wpOwotaW50IGJpbmQoaW50IHMsIHZvaWQgKm5hbWUsIGludCBuYW1lbGVuKTsKLWludCBjb25uZWN0KGludCBzLCB2b2lkICphZGRyLCBpbnQgYWRkcmxlbik7Ci1pbnQgbGlzdGVuKGludCBzLCBpbnQgcWxlbik7Ci1pbnQgYWNjZXB0KGludCBzLCB2b2lkICphZGRyLCBpbnQgKmFkZHJsZW4pOwotaW50IGNsb3NlKGludCBzKTsKLWludCByZWFkKGludCBzLCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGJ1Zmxlbik7Ci1pbnQgcmVhZHYoaW50IHMsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpOwotaW50IHJlY3YoaW50IHMsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGZsYWdzKTsKLWludCByZWN2ZnJvbShpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MsIHZvaWQgKmZyb20sIGludCAqZnJvbWxlbik7Ci1pbnQgcmVjdm1zZyhpbnQgcyxzdHJ1Y3QgbXNnaGRyICptc2csaW50IGZsYWdzKTsKLWludCB3cml0ZShpbnQgcywgY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW4pOwotaW50IHdyaXRldihpbnQgcywgc3RydWN0IGlvdmVjICppb3YsIGludCBjb3VudCk7Ci1pbnQgc2VuZChpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MpOwotaW50IHNlbmR0byAoaW50IHMsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGZsYWdzLCB2b2lkICp0bywgaW50IHRvbGVuKTsKLWludCBzZW5kbXNnKGludCBzLHN0cnVjdCBtc2doZHIgKm1zZyxpbnQgZmxhZ3MpOwotaW50IHNlbGVjdChpbnQgd2lkdGgsIGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICpleGNlcHRmZHMsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKLWludCBnZXRkdGFibGVzaXplKHZvaWQpOwotaW50IGdldHNvY2tuYW1lKGludCBzLCB2b2lkICpuYW1lLCBpbnQgKm5hbWVsZW4pOwotaW50IGdldHBlZXJuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCAqbmFtZWxlbik7Ci1pbnQgc2h1dGRvd24oaW50IHMsIGludCBob3cpOwotaW50IGZjbnRsKGludCBzLCB1bnNpZ25lZCBpbnQgY21kLCBpbnQgYXJnKTsKLWludCBkdXAoaW50IHMpOwotaW50IGR1cDIoaW50IHMsIGludCBzMSk7Ci1pbnQgaW9jdGwoaW50IGQsIHVuc2lnbmVkIGludCByZXF1ZXN0LCBsb25nICphcmdwKTsKLWludCBnZXRzb2Nrb3B0KGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjaGFyICpvcHR2YWwsIGludCAqIG9wdGxlbik7Ci1pbnQgc2V0c29ja29wdChpbnQgcywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKLWludCBpc2F0dHkoaW50KTsKLWludCByZW1vdmUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotaW50IHJlbmFtZShjb25zdCBjaGFyICpvbGRuYW1lLCBjb25zdCBjaGFyICpuZXduYW1lKTsKLWludCBjcmVhdChjb25zdCBjaGFyKik7Ci1pbnQgZmFjY2VzcyhjaGFyKiwgdW5zaWduZWQgaW50LCBsb25nKik7Ci1sb25nIGxzZWVrKGludCwgbG9uZywgaW50KTsKLWludCBvcGVuKGNvbnN0IGNoYXIqLCBpbnQpOwotaW50IHVubGluayhjaGFyKik7Ci1pbnQgc3ltbGluayhjaGFyKiBsaW5rdG8sIGNoYXIqIGxpbmtuYW1lKTsKLWludCByZWFkbGluayhjaGFyKiBwYXRoLCBjaGFyKiBidWYsIGludCBidWZzaXopOwotaW50IHRydW5jYXRlKGNoYXIgKnBhdGgsIGxvbmcgbGVuZ3RoKTsKLWludCBmdHJ1bmNhdGUoaW50IGZkLCBsb25nIGxlbmd0aCk7Ci1pbnQgY2hkaXIoY2hhciAqIHBhdGgpOwotaW50IG1rZGlyKGNoYXIgKiBwYXRoKTsKLWludCBybWRpcihjaGFyICogcGF0aCk7Ci1jaGFyICogZ2V0Y3dkKGNoYXIgKiBidWYsIGludCBzaXplKTsKLSovCi0KLS8qIAotICogRGVmaW5lZCBpbiBzdGRpby5oCi0gKi8KLSAKLSNpZmRlZiBfX01XRVJLU19fCi12b2lkIGZzZXRmaWxlaW5mbyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGxvbmcgbmV3Y3JlYXRvciwgdW5zaWduZWQgbG9uZyBuZXd0eXBlKTsKLSNlbmRpZgotCi12b2lkIGZnZXRmaWxlaW5mbyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGxvbmcgKiBjcmVhdG9yLCB1bnNpZ25lZCBsb25nICogdHlwZSk7Ci0KLSNpZmRlZiBfX01XRVJLU19fCi1GSUxFICpmZG9wZW4oaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTsKLWludCBmd2FsayhpbnQgKCpmdW5jKShGSUxFICogc3RyZWFtKSk7Ci0jZW5kaWYKLQotaW50IGNob29zZSgKLQkJaW50IAkJZG9tYWluLAotCQlpbnQgCQl0eXBlLAotCQljaGFyICogCXByb21wdCwKLQkJdm9pZCAqIAljb25zdHJhaW50LAotCQlpbnQgCQlmbGFncywKLQkJdm9pZCAqIAluYW1lLAotCQlpbnQgKiAJbmFtZWxlbik7Ci0KLS8qIAotICogSG9zdG5hbWUgcm91dGluZXMsIGRlZmluZWQgaW4gbmV0ZGIuaAotICoKLSAKLXN0cnVjdCBob3N0ZW50ICogZ2V0aG9zdGJ5bmFtZShjaGFyICpuYW1lKTsKLXN0cnVjdCBob3N0ZW50ICogZ2V0aG9zdGJ5YWRkcihzdHJ1Y3QgaW5fYWRkciAqYWRkclAsIGludCwgaW50KTsKLWludCBnZXRob3N0bmFtZShjaGFyICptYWNobmFtZSwgbG9uZyBidWZsZW4pOwotc3RydWN0IHNlcnZlbnQgKiBnZXRzZXJ2YnluYW1lIChjaGFyICogbmFtZSwgY2hhciAqIHByb3RvKTsKLXN0cnVjdCBwcm90b2VudCAqIGdldHByb3RvYnluYW1lKGNoYXIgKiBuYW1lKTsKLQotKi8KLQotY2hhciAqIGluZXRfbnRvYShzdHJ1Y3QgaW5fYWRkciBpbmFkZHIpOwotc3RydWN0IGluX2FkZHIgaW5ldF9hZGRyKGNoYXIgKmFkZHJlc3MpOwotCi0vKiAKLSAqIEdVU0kgc3VwcG9ydHMgYSBudW1iZXIgb2YgaG9va3MuIEV2ZXJ5IG9uZSBvZiB0aGVtIGhhcyBhIGRpZmZlcmVudCBwcm90b3R5cGUsIGJ1dCBuZWVkcwotICogdG8gYmUgcGFzc2VkIGFzIGEgR1VTSUhvb2sKLSAqLwotCi10eXBlZGVmIGVudW0gewotCUdVU0lfU3Bpbkhvb2ssCS8qIEEgR1VTSVNwaW5GbiwgdG8gYmUgY2FsbGVkIHdoZW4gYSBjYWxsIGJsb2NrcyAqLwotCUdVU0lfRXhlY0hvb2ssIC8qIEJvb2xlYW4gKCpob29rKShjb25zdCBHVVNJRmlsZVJlZiAmIHJlZiksIGRlY2lkZXMgaWYgZmlsZSBpcyBleGVjdXRhYmxlICovCi0JR1VTSV9GVHlwZUhvb2ssLyogQm9vbGVhbiAoKmhvb2spKGNvbnN0IEZTU3BlYyAmIHNwZWMpIHNldHMgYSBkZWZhdWx0IGZpbGUgdHlwZSAqLwotCUdVU0lfU3BlZWRIb29rIC8qIEEgbG9uZyBpbnRlZ2VyLCB0byBiZSBhZGRlZCB0byB0aGUgY3Vyc29yIHNwaW4gdmFyaWFibGUgKi8KLX0gR1VTSUhvb2tDb2RlOwotCi10eXBlZGVmIHZvaWQgKCpHVVNJSG9vaykodm9pZCk7Ci12b2lkIEdVU0lTZXRIb29rKEdVU0lIb29rQ29kZSBjb2RlLCBHVVNJSG9vayBob29rKTsKLUdVU0lIb29rIEdVU0lHZXRIb29rKEdVU0lIb29rQ29kZSBjb2RlKTsKLQotLyogCi0gKiBXaGF0IHRvIGRvIHdoZW4gYSByb3V0aW5lIGJsb2NrcwotICovCi0KLS8qIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgR1VTSVNldFNwaW4ocm91dGluZSkJR1VTSVNldEhvb2soR1VTSV9TcGluSG9vaywgKEdVU0lIb29rKXJvdXRpbmUpCi0jZGVmaW5lIEdVU0lHZXRTcGluKCkJCQkoR1VTSVNwaW5GbikgR1VTSUdldEhvb2soR1VTSV9TcGluSG9vaykKLQotaW50IEdVU0lTZXRFdmVudHMoR1VTSUV2dFRhYmxlIHRhYmxlKTsKLUdVU0lFdnRIYW5kbGVyICogR1VTSUdldEV2ZW50cyh2b2lkKTsKLQotZXh0ZXJuIEdVU0lFdnRIYW5kbGVyCUdVU0lTSU9XRXZlbnRzW107Ci0KLSNkZWZpbmUgU0lHUElQRQkxMwotI2RlZmluZSBTSUdBTFJNCTE0Ci0KLS8qIAotICogQlNEIG1lbW9yeSByb3V0aW5lcywgZGVmaW5lZCBpbiBjb21wYXQuaAotICoKLQotI2RlZmluZSBpbmRleChhLCBiKQkJCQkJCXN0cmNocihhLCBiKQotI2RlZmluZSByaW5kZXgoYSwgYikJCQkJCQlzdHJyY2hyKGEsIGIpCi0jZGVmaW5lIGJ6ZXJvKGZyb20sIGxlbikgCQkJCW1lbXNldChmcm9tLCAwLCBsZW4pCi0jZGVmaW5lIGJjb3B5KGZyb20sIHRvLCBsZW4pCQkJbWVtY3B5KHRvLCBmcm9tLCBsZW4pCi0jZGVmaW5lIGJjbXAoczEsIHMyLCBsZW4pCQkJCW1lbWNtcChzMSwgczIsIGxlbikKLSNkZWZpbmUgYmZpbGwoZnJvbSwgbGVuLCB4KQkJCW1lbXNldChmcm9tLCB4LCBsZW4pCi0KLSAqLwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogIV9HVVNJXyAqLwpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL0dVU0kxLW1vZHMvR1VTSS5yIGIvTWFjL1Vuc3VwcG9ydGVkL0dVU0kxLW1vZHMvR1VTSS5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmUyNjQ4Li4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0kucgorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm9qZWN0CToJR1VTSQkJCQktCUdyYW5kIFVuaWZpZWQgU29ja2V0IEludGVyZmFjZQotRmlsZQkJOglHVVNJLnIJCQktCUluY2x1ZGUgdGhpcwotQXV0aG9yCToJTWF0dGhpYXMgTmVlcmFjaGVyCi1MYW5ndWFnZQk6CU1QVyBSZXogMy4wCi0KLSRMb2ckCi1SZXZpc2lvbiAxLjEgIDIwMDAvMDkvMTIgMjA6MjQ6NDUgIGphY2sKLU1vdmVkIHRvIFVuc3VwcG9ydGVkLgotCi1SZXZpc2lvbiAxLjEgIDE5OTgvMDgvMTggMTQ6NTI6MzcgIGphY2sKLVB1dHRpbmcgUHl0aG9uLXNwZWNpZmljIEdVU0kgbW9kaWZpY2F0aW9ucyB1bmRlciBDVlMuCi0KLVJldmlzaW9uIDEuMyAgMTk5NC8xMi8zMCAgMTk6MzM6MzQgIG5lZXJpCi1FbmxhcmdlbmVkIG1lc3NhZ2UgYm94IGZvciBzZWxlY3QgZm9sZGVyIGRpYWxvZy4KLQotUmV2aXNpb24gMS4yICAxOTk0LzA4LzEwICAwMDozNDoxOCAgbmVlcmkKLVNhbml0aXplZCBmb3IgdW5pdmVyc2FsIGhlYWRlcnMuCi0KLVJldmlzaW9uIDEuMSAgMTk5NC8wMi8yNSAgMDI6MTI6MDQgIG5lZXJpCi1Jbml0aWFsIHJldmlzaW9uCi0KLVJldmlzaW9uIDAuNSAgMTk5My8wNS8yMSAgMDA6MDA6MDAgIG5lZXJpCi1zdWZmaXhlcwotCi1SZXZpc2lvbiAwLjQgIDE5OTMvMDEvMzEgIDAwOjAwOjAwICBuZWVyaQotRGFlbW9uCi0KLVJldmlzaW9uIDAuMyAgMTk5My8wMS8wMyAgMDA6MDA6MDAgIG5lZXJpCi1hdXRvU3BpbgotCi1SZXZpc2lvbiAwLjIgIDE5OTIvMDkvMjQgIDAwOjAwOjAwICBuZWVyaQotRG9uJ3QgaW5jbHVkZSBDS0lELCBjcmVhdGUgR1VTSVJzcmNfUC5oCi0KLVJldmlzaW9uIDAuMSAgMTk5Mi8wNy8xMyAgMDA6MDA6MDAgIG5lZXJpCi0ucnNyYwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJUeXBlcy5yIgotI2luY2x1ZGUgIkdVU0lSc3JjX1AuaCIKLQotaW5jbHVkZSAiR1VTSS5yc3JjIiBub3QgJ2NraWQnOwotCi0vKiBEZWZpbmUgYSByZXNvdXJjZSAoJ0dVhUknLCBHVVNJUnNyY0lEKSB0byBvdmVycmlkZSBHVVNJIGRlZmF1bHRzIAkJCi0JVG8gYXZvaWQgaGF2aW5nIHRvIGNoYW5nZSB0aGUgUmV6IGZpbGUgZXZlcnkgdGltZSBJIGludHJvZHVjZSBhbm90aGVyCi0JZmVhdHVyZSwgdGhlIHByZXByb2Nlc3NvciB2YXJpYWJsZSBHVVNJX1BSRUZfVkVSU0lPTiBieSBkZWZhdWx0IGtlZXBzCi0JZXZlcnl0aGluZyBjb21wYXRpYmxlIHdpdGggdmVyc2lvbiAxLjAuMi4gSnVzdCBkZWZpbmUgR1VTSV9QUkVGX1ZFUlNJT04KLQl0byBiZSB0aGUgdmVyc2lvbiB5b3Ugd2FudCB0byB1c2UuCi0qLwotCi0jaWZuZGVmIEdVU0lfUFJFRl9WRVJTSU9OCi0jZGVmaW5lIEdVU0lfUFJFRl9WRVJTSU9OICcwMTAyJwotI2VuZGlmCi0KLXR5cGUgJ0dVhUknIHsKLQlsaXRlcmFsIGxvbmdpbnQJdGV4dCAJPQknVEVYVCc7CS8qIFR5cGUgZm9yIGNyZWF0J2VkIGZpbGVzIAkJCQkqLwotCWxpdGVyYWwgbG9uZ2ludAltcHcJPQknTVBTICc7CS8qIENyZWF0b3IgZm9yIGNyZWF0J2VkIGZpbGVzICAJCQkqLwotCWJ5dGUgCQlub0F1dG9TcGluLCBhdXRvU3BpbjsJCS8qIEF1dG9tYXRpY2FsbHkgc3BpbiBjdXJzb3IgPwkJCSovCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPiAnMDEwMicKLQlib29sZWFuIAl1c2VDaGRpciwgZG9udFVzZUNoZGlyOwkJLyogVXNlIGNoZGlyKCkgPwkJCQkJCQkqLwotCWJvb2xlYW4JYXBwcm94U3RhdCwgYWNjdXJhdGVTdGF0OwkvKiBzdGF0YnVmLnN0X25saW5rID0gIyBvZiBzdWJkaXJlY3RvcmllcyA/ICovCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxODEnCi0JYm9vbGVhbglub0RlbGF5Q29uc29sZSwgRGVsYXlDb25zb2xlOwkvKiBEZWxheSBvcGVuaW5nIGNvbnNvbGUgd2luZG93IHVudGlsIG5lZWRlZD8gKi8KLQlmaWxsCQliaXRbMV07Ci0jZWxzZQotCWJvb2xlYW4Jbm9UQ1BEYWVtb24sIGlzVENQRGFlbW9uOwkvKiBJbmV0ZCBjbGllbnQgPwkJCQkJCQkqLwotCWJvb2xlYW4Jbm9VRFBEYWVtb24sIGlzVURQRGFlbW9uOwotI2VuZGlmCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxNTAnCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxODEnCi0JYm9vbGVhbgl3YW50QXBwbGVFdmVudHMsIG5vQXBwbGVFdmVudHM7IC8qIEFsd2F5cyBzb2xpY2l0IEFwcGxlRXZlbnRzICovCi0jZWxzZQotCWJvb2xlYW4Jbm9Db25zb2xlLCBoYXNDb25zb2xlOwkJLyogQXJlIHdlIHByb3ZpZGluZyBvdXIgb3duIGRldjpjb25zb2xlID8gKE9ic29sZXRlKSAqLwotI2VuZGlmCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxODAnCi0JYm9vbGVhbglhdXRvSW5pdEdyYWYsIG5vQXV0b0luaXRHcmFmOwkvKiBBdXRvbWF0aWNhbGx5IGRvIEluaXRHcmFmID8gKi8KLQlib29sZWFuCWV4Y2x1c2l2ZU9wZW4sIHNoYXJlZE9wZW47CS8qIFNoYXJlZCBvcGVuKCkgPyAJCQkJCQkJKi8KLQlib29sZWFuCW5vU2lnUGlwZSwgc2lnUGlwZTsJCQkvKiByYWlzZSBTSUdQSVBFIG9uIHdyaXRlIHRvIGNsb3NlZCBQSVBFICovCi0jZWxzZQotCWZpbGwgCQliaXRbM107Ci0jZW5kaWYKLSNlbHNlCi0JZmlsbCAJCWJpdFs0XTsKLSNlbmRpZgotCWxpdGVyYWwgbG9uZ2ludCA9IEdVU0lfUFJFRl9WRVJTSU9OOwotI2lmIEdVU0lfUFJFRl9WRVJTSU9OID49ICcwMTIwJwotCWludGVnZXIgPSAkJENvdW50b2YoU3VmZml4QXJyYXkpOwotCXdpZGUgYXJyYXkgU3VmZml4QXJyYXkgewotCQkJbGl0ZXJhbCBsb25naW50OwkJCQkJLyogU3VmZml4IG9mIGZpbGUgKi8KLQkJCWxpdGVyYWwgbG9uZ2ludDsJCQkJCS8qIFR5cGUgZm9yIGZpbGUgKi8KLQkJCWxpdGVyYWwgbG9uZ2ludDsJCQkJCS8qIENyZWF0b3IgZm9yIGZpbGUgKi8KLQl9OwotI2VuZGlmCi0jZW5kaWYKLX07Ci0KLXR5cGUgJ1RNUEwnIHsKLQl3aWRlIGFycmF5IHsKLQkJcHN0cmluZzsKLQkJbGl0ZXJhbCBsb25naW50OwotCX07Ci19OwotCi1yZXNvdXJjZSAnVE1QTCcgKEdVU0lSc3JjSUQsICJHVYVJIikgewotCXsKLQkJIlR5cGUgb2YgY3JlYXRlZCBmaWxlcyIsCQknVE5BTScsCi0JCSJDcmVhdG9yIG9mIGNyZWF0ZWQgZmlsZXMiLAknVE5BTScsCi0JCSJBdXRvbWF0aWNhbGx5IHNwaW4gY3Vyc29yIiwgCSdEQllUJywKLSNpZiBHVVNJX1BSRUZfVkVSU0lPTiA+ICcwMTAyJwotCQkiTm90IHVzaW5nIGNoZGlyKCkiLAkJCQknQkJJVCcsCi0JCSJBY2N1cmF0ZSBzdGF0KCkiLAkJCQknQkJJVCcsCi0JCSJUQ1AgZGFlbW9uIiwJCQkJCQknQkJJVCcsCi0JCSJVRFAgZGFlbW9uIiwJCQkJCQknQkJJVCcsCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxNTAnCi0JCSJPd24gQ29uc29sZSIsCQkJCQkJJ0JCSVQnLAotI2Vsc2UKLQkJIlJlc2VydmVkIiwJCQkJCQkJJ0JCSVQnLAotI2VuZGlmCi0jaWYgR1VTSV9QUkVGX1ZFUlNJT04gPj0gJzAxODAnCi0JCSJEb24ndCBpbml0aWFsaXplIFF1aWNrRHJhdyIsCSdCQklUJywKLQkJIk9wZW4gZmlsZXMgc2hhcmVkIiwJCQkJJ0JCSVQnLAotCQkiUmFpc2UgU0lHUElQRSIsCQkJCQknQkJJVCcsCi0jZWxzZQotCQkiUmVzZXJ2ZWQiLAkJCQkJCQknQkJJVCcsCi0JCSJSZXNlcnZlZCIsCQkJCQkJCSdCQklUJywKLQkJIlJlc2VydmVkIiwJCQkJCQkJJ0JCSVQnLAotI2VuZGlmCi0JCSJWZXJzaW9uIChkb24ndCBjaGFuZ2UpIiwJCSdUTkFNJywJCQotI2lmIEdVU0lfUFJFRl9WRVJTSU9OID49ICcwMTIwJwotCQkiTnVtU3VmZmljZXMiLAkJCQkJCSdPQ05UJywKLQkJIioqKioqIiwJCQkJCQkJCSdMU1RDJywKLQkJIlN1ZmZpeCIsCQkJCQkJCSdUTkFNJywKLQkJIlR5cGUgZm9yIHN1ZmZpeCIsCQkJCSdUTkFNJywKLQkJIkNyZWF0b3IgZm9yIHN1ZmZpeCIsCQkJJ1ROQU0nLAotCQkiKioqKioiLAkJCQkJCQkJJ0xTVEUnLAotI2VuZGlmCi0jZW5kaWYJCQotCX0KLX07Ci0KLXJlc291cmNlICdETE9HJyAoR1VTSVJzcmNJRCwgIkdldCBEaXJlY3RvcnkiKSB7Ci0JezAsIDAsIDIxNywgMzQ4fSwgCi0JZEJveFByb2MsIAotCWludmlzaWJsZSwgCi0Jbm9Hb0F3YXksIAotCTB4MCwgCi0JMTAyNDAsIAotCSIiLAotCWFsZXJ0UG9zaXRpb25NYWluU2NyZWVuCi19OwotCi1yZXNvdXJjZSAnRElUTCcgKEdVU0lSc3JjSUQsICJHZXQgRGlyZWN0b3J5IikgewotCXsKLQkJeyAxNDIsIDI1NiwgIDE2MCwgMzM2fSwJQnV0dG9uCQl7ZW5hYmxlZCwiT3BlbiJ9LAotCQl7MTE1MiwgIDU5LCAxMjMyLCAgNzd9LAlCdXR0b24JCXtlbmFibGVkLCJIaWRkZW4ifSwKLQkJeyAxOTMsIDI1NiwgIDIxMSwgMzM2fSwJQnV0dG9uCQl7ZW5hYmxlZCwiQ2FuY2VsIn0sCi0JCXsgIDQzLCAyMzIsICAgNjMsIDM0N30sCVVzZXJJdGVtCQl7ZGlzYWJsZWR9LAotCQl7ICA3MiwgMjU2LCAgIDkwLCAzMzZ9LAlCdXR0b24JCXtlbmFibGVkLCJFamVjdCJ9LAotCQl7ICA5NywgMjU2LCAgMTE1LCAzMzZ9LAlCdXR0b24JCXtlbmFibGVkLCJEcml2ZSJ9LAotCQl7ICA0MywgIDEyLCAgMTg5LCAyMzB9LAlVc2VySXRlbQkJe2VuYWJsZWR9LAotCQl7ICA0MywgMjI5LCAgMTg5LCAyNDZ9LAlVc2VySXRlbQkJe2VuYWJsZWR9LAotCQl7IDEyOCwgMjUyLCAgMTI5LCAzNDB9LAlVc2VySXRlbQkJe2Rpc2FibGVkfSwKLQkJezEwNDQsICAyMCwgMTE0NSwgMTE2fSwJU3RhdGljVGV4dAl7ZGlzYWJsZWQsIiJ9LAotCQl7IDE2NywgMjU2LCAgMTg1LCAzMzZ9LAlCdXR0b24JCXtlbmFibGVkLCJEaXJlY3RvcnkifSwKLQkJeyAgIDAsICAzMCwgICAxOCwgMjE1fSwJQnV0dG9uCQl7ZW5hYmxlZCwiU2VsZWN0IEN1cnJlbnQgRGlyZWN0b3J5OiJ9LAotCQl7IDIwMCwgIDIwLCAxMTQ1LCAyMjJ9LAlTdGF0aWNUZXh0CXtkaXNhYmxlZCwiU2VsZWN0IGEgRm9sZGVyIn0KLQl9Ci19OwotCi0KZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0lEaXNwYXRjaC5jcCBiL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0lEaXNwYXRjaC5jcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNzgzZi4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJRGlzcGF0Y2guY3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgVW5pZmllZCBTb2NrZXQgSW50ZXJmYWNlCi1GaWxlCToJR1VTSURpc3BhdGNoLmNwLQlEaXNwYXRjaCBjYWxscyB0byB0aGVpciBjb3JyZWN0IHJlY2lwaWVudAotQXV0aG9yCToJTWF0dGhpYXMgTmVlcmFjaGVyCi1MYW5ndWFnZToJTVBXIEMvQysrCi0KLSRMb2ckCi1SZXZpc2lvbiAxLjEgIDIwMDAvMDkvMTIgMjA6MjQ6NDcgIGphY2sKLU1vdmVkIHRvIFVuc3VwcG9ydGVkLgotCi1SZXZpc2lvbiAxLjEgIDE5OTgvMDgvMTggMTQ6NTI6MzcgIGphY2sKLVB1dHRpbmcgUHl0aG9uLXNwZWNpZmljIEdVU0kgbW9kaWZpY2F0aW9ucyB1bmRlciBDVlMuCi0KLVJldmlzaW9uIDEuNCAgMTk5NC8xMi8zMCAgMTk6NDg6MDkgIG5lZXJpCi1SZW1vdmUgKHRoZW9yZXRpY2FsKSBzdXBwb3J0IGZvciBwcmUtU3lzdGVtIDYgc3lzdGVtcy4KLVJlbW92ZSBidWlsdC1pbiBzdXBwb3J0IGZvciBJTkVUZC4KLUZpeCBwcm9ibGVtcyBpbiBjb25uZWN0aW9uIHdpdGggUk9NIFBvd2VyUEMgbGlicmFyeS4KLU1vdmUgb3BlbigpIHRvIEdVU0lGaWxlRGlzcGF0Y2guY3AuCi1TdXBwb3J0IEFGX1VOU1BFQyBkb21haW5zLgotTW9yZSB3b3JrIG9uIHNwaW5uaW5nIHBlcmZvcm1hbmNlLgotCi1SZXZpc2lvbiAxLjMgIDE5OTQvMDgvMTAgIDAwOjMwOjMwICBuZWVyaQotU2FuaXRpemVkIGZvciB1bml2ZXJzYWwgaGVhZGVycy4KLVByZXZlbnQgb3Zlcmx5IGZhc3Qgc3Bpbm5pbmcuCi0KLVJldmlzaW9uIDEuMiAgMTk5NC8wNS8wMSAgMjM6NDc6MzQgIG5lZXJpCi1FeHRlbmQgZmZsdXNoKCkga2x1ZGdlLgotRGVmaW5lIF9sYXN0YnVmIGZvciBNUFcgMy4yIGNvbXBhdGliaWxpdHkuCi0KLVJldmlzaW9uIDEuMSAgMTk5NC8wMi8yNSAgMDI6Mjg6MzYgIG5lZXJpCi1Jbml0aWFsIHJldmlzaW9uCi0KLVJldmlzaW9uIDAuMjcgIDE5OTMvMTEvMjQgIDAwOjAwOjAwICBuZWVyaQotRmx1c2ggc3RkaW8gYmVmb3JlIGNsb3NpbmcKLQotUmV2aXNpb24gMC4yNiAgMTk5My8xMS8yMiAgMDA6MDA6MDAgIG5lZXJpCi1FeHRlbmQgdHdvIHRpbWUgbG9zZXIgZm9yIEVCQURGCi0KLVJldmlzaW9uIDAuMjUgIDE5OTMvMTEvMTIgIDAwOjAwOjAwICBuZWVyaQotVHdvIHRpbWUgbG9zZXIgd29ya2Fyb3VuZCBmb3IgZmx1c2ggYnVnCi0KLVJldmlzaW9uIDAuMjQgIDE5OTMvMDYvMjcgIDAwOjAwOjAwICBuZWVyaQote3ByZSxwb3N0fV9zZWxlY3QKLQotUmV2aXNpb24gMC4yMyAgMTk5My8wNi8yNyAgMDA6MDA6MDAgIG5lZXJpCi1mdHJ1bmNhdGUKLQotUmV2aXNpb24gMC4yMiAgMTk5My8wNi8yMCAgMDA6MDA6MDAgIG5lZXJpCi1GdXJ0aGVyIHN1YnRsZXRpZXMgaW4gY29uc29sZSBoYW5kbGluZyAKLQotUmV2aXNpb24gMC4yMSAgMTk5My8wNS8yMSAgMDA6MDA6MDAgIG5lZXJpCi1TdWZmaXhlcwotCi1SZXZpc2lvbiAwLjIwICAxOTkzLzA1LzE1ICAwMDowMDowMCAgbmVlcmkKLVRyeSB0byBrZWVwIGVycm5vIGFsd2F5cyBzZXQgb24gZXJyb3IgcmV0dXJucwotCi1SZXZpc2lvbiAwLjE5ICAxOTkzLzA1LzEzICAwMDowMDowMCAgbmVlcmkKLUxpbWl0IFNlYXJjaCBmb3IgY29uZmlndXJhdGlvbiByZXNvdXJjZSB0byBhcHBsaWNhdGlvbgotCi1SZXZpc2lvbiAwLjE4ICAxOTkzLzAxLzMxICAwMDowMDowMCAgbmVlcmkKLUludHJvZHVjaW5nIGRhZW1vbnMgKHBsZWFzZWQgdG8gbWVldCB5b3UsIGhvcGUgeW91IGd1ZXNzIG15IG5hbWUpCi0KLVJldmlzaW9uIDAuMTcgIDE5OTMvMDEvMTcgIDAwOjAwOjAwICBuZWVyaQotQmUgbW9yZSBjYXJlZnVsIGFib3V0IHVzZXIgYWJvcnRzLgotCi1SZXZpc2lvbiAwLjE2ICAxOTkzLzAxLzAzICAwMDowMDowMCAgbmVlcmkKLUdVU0lDb25maWd1cmF0aW9uCi0KLVJldmlzaW9uIDAuMTUgIDE5OTIvMTEvMjUgIDAwOjAwOjAwICBuZWVyaQotU3RpbGwgdHJ5aW5nIHRvIGdldCBzdGFuZGFyZCBkZXNjcmlwdG9ycyBmb3Igc3RhbmRhbG9uZSBwcm9ncmFtcyByaWdodC4gc2lnaC4KLQotUmV2aXNpb24gMC4xNCAgMTk5Mi8xMC8wNSAgMDA6MDA6MDAgIG5lZXJpCi1TbWFsbCBmaXggaW4gZXZlbnQgZGlzcGF0Y2hpbmcKLQotUmV2aXNpb24gMC4xMyAgMTk5Mi8wOS8xMiAgMDA6MDA6MDAgIG5lZXJpCi1nZXRkdGFibGVzaXplKCkKLQotUmV2aXNpb24gMC4xMiAgMTk5Mi8wOC8zMCAgMDA6MDA6MDAgIG5lZXJpCi1Nb3ZlIGhhc1BQQyB0byBHVVNJUFBDLmNwLCBBcHBsZVRhbGtJZGVudGl0eQotCi1SZXZpc2lvbiAwLjExICAxOTkyLzA4LzA1ICAwMDowMDowMCAgbmVlcmkKLUNoYW5nZSB0aGUgd2F5IHN0YW5kYXJkIEkvTyBjaGFubmVscyBhcmUgb3BlbmVkCi0KLVJldmlzaW9uIDAuMTAgIDE5OTIvMDgvMDMgIDAwOjAwOjAwICBuZWVyaQotTW92ZSBTY2F0dGVyL0dhdGhlciB0byBHVVNJQnVmZmVyLmNwCi0KLVJldmlzaW9uIDAuOSAgMTk5Mi8wNy8zMCAgMDA6MDA6MDAgIG5lZXJpCi1GZWF0dXJlcyB3aXRoIGluaXRpYWxpemVycwotCi1SZXZpc2lvbiAwLjggIDE5OTIvMDcvMTMgIDAwOjAwOjAwICBuZWVyaQotaGFzUHJvY2Vzc01ncgotCi1SZXZpc2lvbiAwLjcgIDE5OTIvMDYvMjcgIDAwOjAwOjAwICBuZWVyaQotY2hvb3NlKCksIGhhc05ld1NGCi0KLVJldmlzaW9uIDAuNiAgMTk5Mi8wNi8wNiAgMDA6MDA6MDAgIG5lZXJpCi1GZWF0dXJlCi0KLVJldmlzaW9uIDAuNSAgMTk5Mi8wNC8xOSAgMDA6MDA6MDAgIG5lZXJpCi1DKysgUmV3cml0ZQotCi1SZXZpc2lvbiAwLjQgIDE5OTIvMDQvMTggIDAwOjAwOjAwICBuZWVyaQotQ2hhbmdlZCByZWFkL3dyaXRlL3NlbmQvcmVjdiBkaXNwYXRjaGVycwotCi1SZXZpc2lvbiAwLjMgIDE5OTIvMDQvMTcgIDAwOjAwOjAwICBuZWVyaQotU3BpbiByb3V0aW5lcwotCi1SZXZpc2lvbiAwLjIgIDE5OTIvMDQvMTYgIDAwOjAwOjAwICBuZWVyaQotVXNlciBpbnRlcnJ1cHQgc3R1ZmYKLQotUmV2aXNpb24gMC4xICAxOTkyLzAzLzMxICAwMDowMDowMCAgbmVlcmkKLXVuaXggZG9tYWluIHNvY2tldCBjYWxscwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJHVVNJRmlsZV9QLmgiCi0jaW5jbHVkZSAiR1VTSU1QV19QLmgiCi0jaW5jbHVkZSA8U2V0Sm1wLmg+Ci0jaW5jbHVkZSA8U2lnbmFsLmg+Ci0jaW5jbHVkZSA8Q3Vyc29yQ3RsLmg+Ci0jaW5jbHVkZSA8UmVzb3VyY2VzLmg+Ci0jaW5jbHVkZSA8RXZlbnRzLmg+IAotI2luY2x1ZGUgPFdpbmRvd3MuaD4KLSNpbmNsdWRlIDxGaW5kZXIuaD4KLSNpbmNsdWRlIDxTY3JpcHQuaD4KLSNpbmNsdWRlIDxFdmVudHMuaD4KLSNpbmNsdWRlIDxUcmFwcy5oPgotI2luY2x1ZGUgPENvbW1SZXNvdXJjZXMuaD4KLSNpbmNsdWRlIDxDVEJVdGlsaXRpZXMuaD4KLSNpbmNsdWRlIDxDb25uZWN0aW9ucy5oPgotI2luY2x1ZGUgPEZpbGVUcmFuc2ZlcnMuaD4KLSNpbmNsdWRlIDxUZXJtaW5hbHMuaD4KLSNpbmNsdWRlIDxFUFBDLmg+Ci0jaW5jbHVkZSA8UExTdHJpbmdGdW5jcy5oPgotI2luY2x1ZGUgPExvd01lbS5oPgotI2luY2x1ZGUgPFByb2Nlc3Nlcy5oPgotCi0jaWYgR0VORVJBVElOR0NGTQotI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLSNlbmRpZgotCi0jcHJhZ21hIHNlZ21lbnQgR1VTSQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUdVU0lDb25maWd1cmF0aW9uIEdVU0lDb25maWc7CQkvLyBDaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZXNlIGRlY2xhcmF0aW9ucwotU29ja2V0VGFibGUJCQkJCVNvY2tldHM7CQkJLy8gCWFuZCB5b3UnbGwgcmVncmV0IGl0IChBUk0gpzEyLjYuMSkKLUdVU0lTcGluRm4gCQkJCQlHVVNJU3BpbiAJPSBHVVNJRGVmYXVsdFNwaW47Ci1HVVNJRXhlY0ZuCQkJCQlHVVNJRXhlYwk9IEdVU0lEZWZhdWx0RXhlYzsKLUdVU0lGVHlwZUZuCQkJCQlHVVNJRlR5cGUJPSAoR1VTSUZUeXBlRm4pMDsKLWxvbmcJCQkJCQlnR1VTSVNwZWVkCT0gMTsKLXN0YXRpYyBHVVNJRXZ0SGFuZGxlciAqCWV2dEhhbmRsZXIJPSBuaWw7Ci1zdGF0aWMgc2hvcnQJCQkJZXZ0TWFzawkJPSAwOwotc3RhdGljIGludAkJCQkJZXJyb3JTb2NrCT0gLTE7Ci1zdGF0aWMgaW50CQkJCQllcnJvclR5cGUJPSAwOwotc3RhdGljIGludAkJCQkJZXJyb3JDb3VudAk9IDA7Ci1jb25zdCBpbnQJCQkJCWVycm9yTWF4CQk9IDM7Ci1Cb29sZWFuCQkJCQkJQ2F0Y2hTdGRJTwk9IGZhbHNlOwotCi1GZWF0dXJlIAloYXNNYWtlRlNTcGVjKAotCQkJCWdlc3RhbHRGU0F0dHIsCi0JCQkJKDE8PGdlc3RhbHRIYXNGU1NwZWNDYWxscyksCi0JCQkJKDE8PGdlc3RhbHRIYXNGU1NwZWNDYWxscykpOwotRmVhdHVyZSAJaGFzQWxpYXMoCi0JCQkJZ2VzdGFsdEFsaWFzTWdyQXR0ciwKLQkJCQkoMTw8Z2VzdGFsdEFsaWFzTWdyUHJlc2VudCksCi0JCQkJKDE8PGdlc3RhbHRBbGlhc01nclByZXNlbnQpKTsKLUZlYXR1cmUJaGFzTmV3U0YoCi0JCQkJZ2VzdGFsdFN0YW5kYXJkRmlsZUF0dHIsCi0JCQkJKDE8PGdlc3RhbHRTdGFuZGFyZEZpbGU1OCksCi0JCQkJKDE8PGdlc3RhbHRTdGFuZGFyZEZpbGU1OCkpOwotRmVhdHVyZSAJaGFzUHJvY2Vzc01ncigKLQkJCQlnZXN0YWx0T1NBdHRyLAotCQkJCSgxPDxnZXN0YWx0TGF1bmNoQ29udHJvbCksCi0JCQkJKDE8PGdlc3RhbHRMYXVuY2hDb250cm9sKSk7Ci1GZWF0dXJlIGhhc0NSTV9QKAotCQkJCWdlc3RhbHRDUk1BdHRyLAotCQkJCSgxPDxnZXN0YWx0Q1JNUHJlc2VudCksCi0JCQkJKDE8PGdlc3RhbHRDUk1QcmVzZW50KSk7Ci1GZWF0dXJlIGhhc0NSTShoYXNDUk1fUCwgSW5pdENSTSk7Ci1GZWF0dXJlIGhhc0NUQihoYXNDUk0sIEluaXRDVEJVdGlsaXRpZXMpOwotRmVhdHVyZSBoYXNTdGROQlBfUCgKLQkJCQlnZXN0YWx0U3RkTkJQQXR0ciwKLQkJCQkoMTw8Z2VzdGFsdFN0ZE5CUFByZXNlbnQpLAotCQkJCSgxPDxnZXN0YWx0U3RkTkJQUHJlc2VudCkpOwotRmVhdHVyZSBoYXNTdGROQlAoaGFzQ1RCLCBoYXNTdGROQlBfUCk7Ci1GZWF0dXJlIGhhc0FwcGxlRXZlbnRzKAotCQkJCWdlc3RhbHRBcHBsZUV2ZW50c0F0dHIsCi0JCQkJKDE8PGdlc3RhbHRBcHBsZUV2ZW50c1ByZXNlbnQpLAotCQkJCSgxPDxnZXN0YWx0QXBwbGVFdmVudHNQcmVzZW50KSk7Ci1GZWF0dXJlIGhhc1JldmlzZWRUaW1lTWdyKAotCQkJZ2VzdGFsdFRpbWVNZ3JWZXJzaW9uLAotCQkJMkwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKiogRXJyb3IgcHJvcGFnYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgR1VTSV9ESVNQQVRDSAotaW5saW5lCi0jZW5kaWYKLWludCBHVVNJX2Vycm9yKGludCBlcnIpCi17Ci0JaWYgKGVycikKLQkJZXJybm8gPQllcnI7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBHVVNJX0RJU1BBVENICi1pbmxpbmUKLSNlbmRpZgotdm9pZCAqIEdVU0lfZXJyb3JfbmlsKGludCBlcnIpCi17Ci0JaWYgKGVycikKLQkJZXJybm8gPQllcnI7Ci0KLQlyZXR1cm4gbmlsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKiogR1VTSUNvbmZpZ3VyYXRpb24gbWVtYmVycyAqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgR1VTSV9ESVNQQVRDSAotCi1Cb29sZWFuIAlHVVNJQ29uZmlndXJhdGlvbjo6Zmlyc3RUaW1lID0gZmFsc2U7Ci1zaG9ydAkJR1VTSUNvbmZpZ3VyYXRpb246OndlOwotCi12b2lkIEdVU0lDb25maWd1cmF0aW9uOjpHVVNJTG9hZENvbmZpZ3VyYXRpb24oSGFuZGxlIGgpCi17Ci0JdHlwZWRlZiAJR1VTSUNvbmZpZ1JzcmMgKioJR1VTSUNvbmZIZGw7CQkKLQlHVVNJQ29uZkhkbCBjb25maWcgCQk9CUdVU0lDb25mSGRsKGgpOwotCWxvbmcJCWNvbmZTaXplCT0JY29uZmlnID8gR2V0SGFuZGxlU2l6ZShIYW5kbGUoY29uZmlnKSkgOiAwOwotCQotCWlmIChjb25mU2l6ZSA8IDQgfHwgIShkZWZhdWx0VHlwZSA9ICgqY29uZmlnKS0+ZGVmYXVsdFR5cGUpKQotCQlkZWZhdWx0VHlwZQk9CSdURVhUJzsKLQlpZiAoY29uZlNpemUgPCA4IHx8ICEoZGVmYXVsdENyZWF0b3IgPSAoKmNvbmZpZyktPmRlZmF1bHRDcmVhdG9yKSkKLQkJZGVmYXVsdENyZWF0b3IJPQknTVBTICc7Ci0JaWYgKGNvbmZTaXplIDwgOSkgCi0JCWF1dG9TcGluCT0JMTsJCQkvLyBkbyBhdXRvbWF0aWMgc3BpbiBvbiByZWFkL3dyaXRlCi0JZWxzZQotCQlhdXRvU3BpbiA9ICgqY29uZmlnKS0+YXV0b1NwaW47Ci0JCQkKLQlpZiAoY29uZlNpemUgPCAxNCkKLQkJdmVyc2lvbiA9ICcwMTAyJzsKLQllbHNlCi0JCXZlcnNpb24gPSAoKmNvbmZpZyktPnZlcnNpb247Ci0KLQlpZiAoY29uZlNpemUgPCAxMCkgewotCQlub0NoZGlyCQkJPQlmYWxzZTsJLy8gVXNlIGNoZGlyKCkKLQkJYWNjdXJTdGF0CQk9CWZhbHNlOwkvLyBzdF9ubGluayA9ICMgb2YgZW50cmllcyArIDIKLQkJaGFzQ29uc29sZQkJPQlmYWxzZTsKLQkJbm9BdXRvSW5pdEdyYWYJPSAJZmFsc2U7Ci0JCXNoYXJlZE9wZW4JCT0JZmFsc2U7Ci0JCXNpZ1BpcGUJCQk9CWZhbHNlOwotCQlub0FwcGxlRXZlbnRzCT0gCWZhbHNlOwotCQlkZWxheUNvbnNvbGUJCT0JZmFsc2U7Ci0JfSBlbHNlIHsKLQkJbm9DaGRpcgkJCT0JKCgqY29uZmlnKS0+ZmxhZ3MgJiAweDgwKSAhPSAwOwotCQlhY2N1clN0YXQJCT0JKCgqY29uZmlnKS0+ZmxhZ3MgJiAweDQwKSAhPSAwOwotCQloYXNDb25zb2xlCQk9CXZlcnNpb24gPj0gJzAxNTAnICYmIHZlcnNpb24gPD0gJzAxODAnICYmICgoKmNvbmZpZyktPmZsYWdzICYgMHgwOCkgIT0gMDsKLQkJZGVsYXlDb25zb2xlCT0JdmVyc2lvbiA+PSAnMDE4MScgJiYgKCgqY29uZmlnKS0+ZmxhZ3MgJiAweDIwKSAhPSAwOwotCQlub0FwcGxlRXZlbnRzCT0JdmVyc2lvbiA+PSAnMDE4MScgJiYgKCgqY29uZmlnKS0+ZmxhZ3MgJiAweDA4KSAhPSAwOwotCQlub0F1dG9Jbml0R3JhZgk9CXZlcnNpb24gPj0gJzAxNzQnICYmICgoKmNvbmZpZyktPmZsYWdzICYgMHgwNCkgIT0gMDsKLQkJc2hhcmVkT3BlbgkJPQl2ZXJzaW9uID49ICcwMTc0JyAmJiAoKCpjb25maWcpLT5mbGFncyAmIDB4MDIpICE9IDA7Ci0JCXNpZ1BpcGUJCQk9CXZlcnNpb24gPj0gJzAxNzQnICYmICgoKmNvbmZpZyktPmZsYWdzICYgMHgwMSkgIT0gMDsKLQl9Ci0JCi0JaWYgKHZlcnNpb24gPCAnMDEyMCcgfHwgY29uZlNpemUgPCAxNikKLQkJbnVtU3VmZmljZXMgPSAwOwotCWVsc2UKLQkJbnVtU3VmZmljZXMgPSAoKmNvbmZpZyktPm51bVN1ZmZpY2VzOwotCQotCWlmICghbnVtU3VmZmljZXMpCi0JCXN1ZmZpY2VzID0gbmlsOwotCWVsc2UgaWYgKHN1ZmZpY2VzID0gbmV3IEdVU0lTdWZmaXhbbnVtU3VmZmljZXNdKSB7Ci0JCUhMb2NrKChIYW5kbGUpY29uZmlnKTsKLQkJbWVtY3B5KHN1ZmZpY2VzLCAoKmNvbmZpZyktPnN1ZmZpY2VzLCBudW1TdWZmaWNlcypzaXplb2YoR1VTSVN1ZmZpeCkpOwotCQlmb3IgKGludCBpPTA7IGk8bnVtU3VmZmljZXM7IGkrKykKLQkJCWZvciAoaW50IGo9MDsgajw0OyBqKyspCi0JCQkJaWYgKCgoY2hhciAqKSAoc3VmZmljZXMraSkpW2pdID09ICcgJykKLQkJCQkJKChjaGFyICopIChzdWZmaWNlcytpKSlbal0gPSAwOwotCX0KLX0KLQotR1VTSUNvbmZpZ3VyYXRpb246OkdVU0lDb25maWd1cmF0aW9uKCkKLXsKLQlzaG9ydAlvbGRSZXNGaWxlID0gQ3VyUmVzRmlsZSgpOwotCQotCWlmICghZmlyc3RUaW1lKQotCQl3ZSA9IG9sZFJlc0ZpbGU7Ci0JZWxzZQotCQlVc2VSZXNGaWxlKHdlKTsKLQkJCi0JSGFuZGxlIGNvbmZpZyAJPQlHZXQxUmVzb3VyY2UoJ0dVhUknLCBHVVNJUnNyY0lEKTsKLQlHVVNJTG9hZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JaWYgKCFmaXJzdFRpbWUpIHsKLQkJZmlyc3RUaW1lCT0JdHJ1ZTsKLQkJCi0JCWlmICghbm9DaGRpcikKLQkJCWNoZGlyKCI6Iik7Ci0JfSBlbHNlCi0JCVVzZVJlc0ZpbGUob2xkUmVzRmlsZSk7Ci0JCi0JUmVsZWFzZVJlc291cmNlKChIYW5kbGUpY29uZmlnKTsKLX0KLQotdm9pZCBHVVNJQ29uZmlndXJhdGlvbjo6U2V0RGVmYXVsdEZUeXBlKGNvbnN0IFRGaWxlU3BlYyAmIG5hbWUpIGNvbnN0Ci17Ci0JRkluZm8JaW5mbzsJCi0KLQkvLyAKLQkvLyBDdXN0b20gaG9vayBpZiBleGlzdGluZwotCS8vCi0JaWYgKEdVU0lGVHlwZSAmJiBHVVNJRlR5cGUobmFtZSkpCi0JCXJldHVybjsKLQkKLQkvLwotCS8vIE90aGVyd2lzZSBkZWZhdWx0IGJlaGF2aW91cgotCS8vCi0JaWYgKEhHZXRGSW5mbyhuYW1lLnZSZWZOdW0sIG5hbWUucGFySUQsIG5hbWUubmFtZSwgJmluZm8pKQotCQlyZXR1cm47Ci0KLQlQdHIgZG90ID0gUExzdHJyY2hyKG5hbWUubmFtZSwgJy4nKTsKLQkKLQlpZiAoZG90ICYmIChuYW1lLm5hbWVbMF0gLSAoZG90LVB0cihuYW1lLm5hbWUpKSkgPD0gNCkgewotCQljaGFyIHNlYXJjaHN1ZmZpeFs1XTsKLQkJCi0JCXN0cm5jcHkoc2VhcmNoc3VmZml4LCBkb3QrMSwgbmFtZS5uYW1lWzBdIC0gKGRvdC1QdHIobmFtZS5uYW1lKSkpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGk8bnVtU3VmZmljZXM7IGkrKykKLQkJCWlmICghc3RybmNtcChzdWZmaWNlc1tpXS5zdWZmaXgsIHNlYXJjaHN1ZmZpeCwgNCkpIHsKLQkJCQlpbmZvLmZkVHlwZSAJPQlzdWZmaWNlc1tpXS5zdWZmVHlwZTsKLQkJCQlpbmZvLmZkQ3JlYXRvcgk9CXN1ZmZpY2VzW2ldLnN1ZmZDcmVhdG9yOwotCQkJCQotCQkJCWdvdG8gZGV0ZXJtaW5lZDsKLQkJCX0KLQl9Ci0KLQlpbmZvLmZkVHlwZSAJPQlkZWZhdWx0VHlwZTsKLQlpbmZvLmZkQ3JlYXRvcgk9CWRlZmF1bHRDcmVhdG9yOwotCWluZm8uZmRGbGFncwkmPSB+a0hhc0JlZW5Jbml0ZWQ7Ci0KLWRldGVybWluZWQ6CQotCUhTZXRGSW5mbyhuYW1lLnZSZWZOdW0sIG5hbWUucGFySUQsIG5hbWUubmFtZSwgJmluZm8pOwotfQotCi12b2lkIEdVU0lDb25maWd1cmF0aW9uOjpEb0F1dG9Jbml0R3JhZigpIGNvbnN0Ci17Ci0JaWYgKCooR3JhZlB0ciAqKikgTE1HZXRDdXJyZW50QTUoKSAhPSAmcWQudGhlUG9ydCkKLQkJSW5pdEdyYWYoJnFkLnRoZVBvcnQpOwotCWNvbnN0X2Nhc3Q8R1VTSUNvbmZpZ3VyYXRpb24gKj4odGhpcyktPm5vQXV0b0luaXRHcmFmCT0JdHJ1ZTsKLX0KLQotI2VuZGlmIC8vIEdVU0lfRElTUEFUQ0gKLQotaW5saW5lIHZvaWQgR1VTSUNvbmZpZ3VyYXRpb246OkRvQXV0b1NwaW4oKSBjb25zdCAKLXsKLQlpZiAoYXV0b1NwaW4pCi0JCVNBRkVTUElOKDAsIFNQX0FVVE9fU1BJTiwgYXV0b1NwaW4pOwotfQotCi1Cb29sZWFuIEdVU0lDb25maWd1cmF0aW9uOjpEZWxheUNvbnNvbGUoKSBjb25zdAotewotCXJldHVybiBkZWxheUNvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogSGFuZGxlIG5vbnN0YW5kYXJkIGNvbnNvbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgR1VTSV9ESVNQQVRDSAotCi1zdGF0aWMgdm9pZCBJbml0Q29uc29sZSgpCi17Ci0JaWYgKE1QV0RvbWFpbjo6c3Rkb3BlbikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJU29ja2V0ICogc29jayA9IAlNUFdEb21haW46OnN0ZG9wZW4oaSk7Ci0KLQkJCWlmIChzb2NrKQotCQkJCVNvY2tldHMuSW5zdGFsbChzb2NrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChvcGVuKCJkZXY6Y29uc29sZSIsIE9fUkRPTkxZKSA8IDApCi0JCQlvcGVuKCJkZXY6bnVsbCIsIE9fUkRPTkxZKTsKLQkJaWYgKG9wZW4oImRldjpjb25zb2xlIiwgT19XUk9OTFkpIDwgMCkKLQkJCW9wZW4oImRldjpudWxsIiwgT19XUk9OTFkpOwotCQlpZiAob3BlbigiZGV2OmNvbnNvbGUiLCBPX1dST05MWSkgPCAwKQotCQkJb3BlbigiZGV2Om51bGwiLCBPX1dST05MWSk7IAotCX0KLX0KLQotdm9pZCBTb2NrZXRUYWJsZTo6SW5pdENvbnNvbGUoKQotewotCWlmIChuZWVkc0NvbnNvbGUpIHsKLQkJbmVlZHNDb25zb2xlID0gZmFsc2U7Ci0JCTo6SW5pdENvbnNvbGUoKTsKLQl9Ci19Ci0KLSNlbmRpZiAvLyBHVVNJX0RJU1BBVENICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuYWwgcm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IGdldGR0YWJsZXNpemUoKQotewotCXJldHVybiBHVVNJX01BWF9GRDsKLX0KLQotaW50IHNvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQotewotCVNvY2tldERvbWFpbiAqCWRvbTsKLQlTb2NrZXQgKiAJCXNvY2s7Ci0JaW50CQkJCWZkOwotCi0JU29ja2V0cy5Jbml0Q29uc29sZSgpOwotCQotCWlmIChkb20gPSBTb2NrZXREb21haW46OkRvbWFpbihkb21haW4pKQotCQlpZiAoc29jayA9IGRvbS0+c29ja2V0KHR5cGUsIHByb3RvY29sKSkKLQkJCWlmICgoZmQgPSBTb2NrZXRzLkluc3RhbGwoc29jaykpICE9IC0xKQotCQkJCXJldHVybiBmZDsKLQkJCWVsc2UKLQkJCQlkZWxldGUgc29jazsKLQotCWlmICghZXJybm8pCi0JCXJldHVybiBHVVNJX2Vycm9yKEVOT01FTSk7Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLWludCBzb2NrZXRwYWlyKGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIGludCAqIHN2KQotewotCVNvY2tldERvbWFpbiAqCWRvbTsKLQlTb2NrZXQgKiAJCXNvY2tbMl07Ci0KLQlTb2NrZXRzLkluaXRDb25zb2xlKCk7Ci0JCi0JaWYgKGRvbSA9IFNvY2tldERvbWFpbjo6RG9tYWluKGRvbWFpbikpCi0JCWlmICghZG9tLT5zb2NrZXRwYWlyKHR5cGUsIHByb3RvY29sLCBzb2NrKSkKLQkJCWlmICgoc3ZbMF0gPSBTb2NrZXRzLkluc3RhbGwoc29ja1swXSkpICE9IC0xKQotCQkJCWlmICgoc3ZbMV0gPSBTb2NrZXRzLkluc3RhbGwoc29ja1sxXSkpICE9IC0xKQotCQkJCQlyZXR1cm4gMDsKLQkJCQllbHNlIHsKLQkJCQkJU29ja2V0cy5SZW1vdmUoc3ZbMF0pOwotCQkJCQkKLQkJCQkJZ290byBmYWlsSW5zdGFsbDsKLQkJCQl9Ci0JCQllbHNlIHsKLWZhaWxJbnN0YWxsOgotCQkJCWRlbGV0ZSBzb2NrWzBdOwotCQkJCWRlbGV0ZSBzb2NrWzFdOwotCQkJfQotCQkKLQlpZiAoIWVycm5vKQotCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOwotCWVsc2UKLQkJcmV0dXJuIC0xOwotfQotCi1pbnQgcGlwZShpbnQgKiBmZCkKLXsKLQlHVVNJd2l0aFVuaXhTb2NrZXRzKCk7Ci0JCi0JaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkKSkKLQkJcmV0dXJuIC0xOwotCXNodXRkb3duKGZkWzBdLCAxKTsKLQlzaHV0ZG93bihmZFsxXSwgMCk7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjaG9vc2UoaW50IGRvbWFpbiwgaW50IHR5cGUsIGNoYXIgKiBwcm9tcHQsIHZvaWQgKiBjb25zdHJhaW50LCBpbnQgZmxhZ3MsIHZvaWQgKiBuYW1lLCBpbnQgKiBuYW1lbGVuKQotewotCVNvY2tldERvbWFpbiAqCWRvbTsKLQotCWlmIChkb20gPSBTb2NrZXREb21haW46OkRvbWFpbihkb21haW4pKQotCQlyZXR1cm4gZG9tLT5jaG9vc2UodHlwZSwgcHJvbXB0LCBjb25zdHJhaW50LCBmbGFncywgbmFtZSwgbmFtZWxlbik7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBiaW5kKGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCBuYW1lbGVuKQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5iaW5kKCh2b2lkICopIG5hbWUsIG5hbWVsZW4pIDogLTE7Ci19Ci0KLWludCBjb25uZWN0KGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuKQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5jb25uZWN0KCh2b2lkICopIGFkZHIsIGFkZHJsZW4pIDogLTE7Ci19Ci0KLWludCBsaXN0ZW4oaW50IHMsIGludCBxbGVuKQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5saXN0ZW4ocWxlbikgOiAtMTsKLX0KLQotaW50IGFjY2VwdChpbnQgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgKmFkZHJsZW4pCi17Ci0JU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107Ci0KLQlpZiAoc29jaykKLQkJaWYgKHNvY2sJPSBzb2NrLT5hY2NlcHQoYWRkciwgYWRkcmxlbikpCi0JCQlpZiAoKHMgPSBTb2NrZXRzLkluc3RhbGwoc29jaykpICE9IC0xKQotCQkJCXJldHVybiBzOwotCQkJZWxzZQotCQkJCWRlbGV0ZSBzb2NrOwotCi0JcmV0dXJuIC0xOwotfQotCi1pbnQgY2xvc2UoaW50IHMpCi17Ci0JZXJyb3JTb2NrCT0JLTE7Ci0JCi0JcmV0dXJuIFNvY2tldHMuUmVtb3ZlKHMpOwotfQotCi0jaWZkZWYgX19NV0VSS1NfXwotaW50IHJlYWQoaW50IHMsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKLSNlbHNlCi1pbnQgcmVhZChpbnQgcywgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW4pCi0jZW5kaWYKLXsKLQlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKLQkKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+cmVhZChidWZmZXIsICh1bnNpZ25lZCkgYnVmbGVuKSA6IC0xOwotfQotCi1pbnQgcmVhZHYoaW50IHMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpCi17Ci0JR1VTSUNvbmZpZy5Eb0F1dG9TcGluKCk7Ci0JCi0JU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107Ci0KLQlpZiAoc29jaykJewotCQlTY2F0dGVyZXIJc2NhdHQoaW92LCBjb3VudCk7Ci0KLQkJaWYgKHNjYXR0KQotCQkJcmV0dXJuIHNjYXR0Lmxlbmd0aChzb2NrLT5yZWFkKHNjYXR0LmJ1ZmZlcigpLCBzY2F0dC5idWZsZW4oKSkpOwotCQllbHNlCi0JCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOwotCX0gZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLWludCByZWN2KGludCBzLCB2b2lkICpidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncykKLXsKLQlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKLQkKLQlpbnQgCQlmcm9tbGVuIAk9CTA7Ci0JU29ja2V0ICoJc29jawkJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5yZWN2ZnJvbShidWZmZXIsIGJ1ZmxlbiwgZmxhZ3MsIG5pbCwgJmZyb21sZW4pIDogLTE7Ci19Ci0KLWludCByZWN2ZnJvbShpbnQgcywgdm9pZCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MsIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgaW50ICpmcm9tbGVuKQotewotCUdVU0lDb25maWcuRG9BdXRvU3BpbigpOwotCQotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5yZWN2ZnJvbShidWZmZXIsIGJ1ZmxlbiwgZmxhZ3MsIGZyb20sIGZyb21sZW4pIDogLTE7Ci19Ci0KLWludCByZWN2bXNnKGludCBzLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKLXsKLQlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKLQkKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCWlmIChzb2NrKQl7Ci0JCVNjYXR0ZXJlcglzY2F0dCgoc3RydWN0IGlvdmVjICopbXNnLT5tc2dfaW92LCBtc2ctPm1zZ19pb3ZsZW4pOwotCi0JCWlmIChzY2F0dCkKLQkJCXJldHVybgotCQkJCXNjYXR0Lmxlbmd0aCgKLQkJCQkJc29jay0+cmVjdmZyb20oCi0JCQkJCQlzY2F0dC5idWZmZXIoKSwKLQkJCQkJCXNjYXR0LmJ1ZmxlbigpLAotCQkJCQkJZmxhZ3MsCi0JCQkJCQltc2ctPm1zZ19uYW1lLAotCQkJCQkJKGludCAqKSZtc2ctPm1zZ19uYW1lbGVuKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBHVVNJX2Vycm9yKEVOT01FTSk7Ci0JfSBlbHNlCi0JCXJldHVybiAtMTsKLX0KLQotI2lmZGVmIF9fTVdFUktTX18KLWludCB3cml0ZShpbnQgcywgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQotI2Vsc2UKLWludCB3cml0ZShpbnQgcywgY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW4pCi0jZW5kaWYKLXsKLQkvKiBmZmx1c2goKSBpbiB0aGUgTVBXIHN0ZGlvIGxpYnJhcnkgZG9lc24ndCB0YWtlIG5vIGZvciBhbiBhbnN3ZXIuCi0JCU91ciB3b3JrYXJvdW5kIGlzIHRvIHRyZWF0IGEgc2Vjb25kIHN1YnNlcXVlbnQgRVNIVVRET1dOIG9yIEVCQURGIGFzIAotCQlhbiBpbnZpdGF0aW9uIHRvIGxpZSBieSBwcmV0ZW5kaW5nIHRoZSB3cml0ZSB3b3JrZWQuCi0JKi8KLQkKLQlpbnQJbGVuOwotCQotCUdVU0lDb25maWcuRG9BdXRvU3BpbigpOwotCQotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JaWYgKHNvY2sgJiYgKGxlbiA9IHNvY2stPndyaXRlKChjaGFyICopIGJ1ZmZlciwgKHVuc2lnbmVkKSBidWZsZW4pKSAhPSAtMSkKLQkJcmV0dXJuIGxlbjsKLQkJCi0Jc3dpdGNoIChlcnJubykgewotCWNhc2UgRUlOVFI6Ci0JY2FzZSBFV09VTERCTE9DSzoKLQljYXNlIEVJTlBST0dSRVNTOgotCWNhc2UgRUFMUkVBRFk6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChHVVNJQ29uZmlnLnNpZ1BpcGUpCi0JCQlyYWlzZShTSUdQSVBFKTsKLQkJaWYgKGVycm9yU29jayA9PSBzICYmIGVycm9yVHlwZSA9PSBlcnJubykgewotCQkJaWYgKCsrZXJyb3JDb3VudCA9PSBlcnJvck1heCkgewotCQkJCWVycm9yU29jayA9IC0xOwotCQkJCi0JCQkJcmV0dXJuIGJ1ZmxlbjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVycm9yU29jayA9IHM7Ci0JCQllcnJvclR5cGUgPSBlcnJubzsKLQkJCWVycm9yQ291bnQ9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IEhhbmRsZVdyaXRlRXJyb3JzKGludCByZXR2YWwpCi17Ci0JaWYgKHJldHZhbCA9PSAtMSkKLQkJc3dpdGNoIChlcnJubykgewotCQljYXNlIEVJTlRSOgotCQljYXNlIEVXT1VMREJMT0NLOgotCQljYXNlIEVJTlBST0dSRVNTOgotCQljYXNlIEVBTFJFQURZOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoR1VTSUNvbmZpZy5zaWdQaXBlKQotCQkJCXJhaXNlKFNJR1BJUEUpOwotCQkJYnJlYWs7Ci0JCX0KLQkKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgd3JpdGV2KGludCBzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KQotewotCUdVU0lDb25maWcuRG9BdXRvU3BpbigpOwotCQotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JaWYgKHNvY2spCXsKLQkJR2F0aGVyZXIJZ2F0aChpb3YsIGNvdW50KTsKLQotCQlpZiAoZ2F0aCkKLQkJCXJldHVybiBIYW5kbGVXcml0ZUVycm9ycyhnYXRoLmxlbmd0aChzb2NrLT53cml0ZShnYXRoLmJ1ZmZlcigpLCBnYXRoLmJ1ZmxlbigpKSkpOwotCQllbHNlCi0JCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOwotCX0gZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLWludCBzZW5kKGludCBzLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncykKLXsKLQlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKLQkKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gSGFuZGxlV3JpdGVFcnJvcnMoc29jay0+c2VuZHRvKCh2b2lkICopYnVmZmVyLCBidWZsZW4sIGZsYWdzLCBuaWwsIDApKSA6IC0xOwotfQotCi1pbnQgc2VuZHRvKGludCBzLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncywgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywgaW50IHRvbGVuKQotewotCUdVU0lDb25maWcuRG9BdXRvU3BpbigpOwotCQotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBIYW5kbGVXcml0ZUVycm9ycyhzb2NrLT5zZW5kdG8oKHZvaWQgKilidWZmZXIsIGJ1ZmxlbiwgZmxhZ3MsICh2b2lkICopIHRvLCB0b2xlbikpIDogLTE7Ci19Ci0KLWludCBzZW5kbXNnKGludCBzLCBjb25zdCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKLXsKLQlHVVNJQ29uZmlnLkRvQXV0b1NwaW4oKTsKLQkKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCWlmIChzb2NrKQl7Ci0JCUdhdGhlcmVyCWdhdGgoKHN0cnVjdCBpb3ZlYyAqKSBtc2ctPm1zZ19pb3YsIG1zZy0+bXNnX2lvdmxlbik7Ci0KLQkJaWYgKGdhdGgpCi0JCQlyZXR1cm4KLQkJCQlIYW5kbGVXcml0ZUVycm9ycyhnYXRoLmxlbmd0aCgKLQkJCQkJc29jay0+c2VuZHRvKAotCQkJCQkJZ2F0aC5idWZmZXIoKSwKLQkJCQkJCWdhdGguYnVmbGVuKCksCi0JCQkJCQlmbGFncywKLQkJCQkJCW1zZy0+bXNnX25hbWUsCi0JCQkJCQltc2ctPm1zZ19uYW1lbGVuKSkpOwotCQllbHNlCi0JCQlyZXR1cm4gR1VTSV9lcnJvcihFTk9NRU0pOwotCX0gZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLWludCBzZWxlY3QoaW50IHdpZHRoLCBmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqZXhjZXB0ZmRzLCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKLXsKLQlTb2NrZXQJKglzb2NrOwotCWxvbmcgCQkJY291bnQ7Ci0JaW50IAkJCXM7Ci0JbG9uZyAJCQlzdGFydHRpbWUsIHdhaXR0aW1lOwotCWZkX3NldCAJCXJkLCB3ZCwgZWQ7Ci0JQm9vbGVhbgkJcix3LGU7Ci0JQm9vbGVhbiAqCWNhblJlYWQ7Ci0JQm9vbGVhbiAqCWNhbldyaXRlOwotCUJvb2xlYW4gKglleGNlcHRpb247Ci0KLQljb3VudCA9IDA7Ci0JRkRfWkVSTygmcmQpOwotCUZEX1pFUk8oJndkKTsKLQlGRF9aRVJPKCZlZCk7Ci0KLQlpZiAodGltZW91dCkKLQkJd2FpdHRpbWUgPSAgdGltZW91dC0+dHZfc2VjKjYwICsgdGltZW91dC0+dHZfdXNlYy8xNjY2NjsKLQllbHNlCi0JCXdhaXR0aW1lID0JMjAwMDAwMDAwMDsJLy8gU2xpZ2h0bHkgbW9yZSB0aGFuIGEgeWVhcjsgY2xvc2UgZW5vdWdoIHRvICJubyB0aW1lb3V0IgotCQkKLQlzdGFydHRpbWUgPSBMTUdldFRpY2tzKCk7Ci0KLQkvLyBDaGVjayBmaWxlcyBmb3Iga29zaGVybmVzcwotCi0JZm9yIChzID0gMDsgcyA8IHdpZHRoIDsgKytzKQotCQlpZiAoCShyZWFkZmRzICYmIEZEX0lTU0VUKHMscmVhZGZkcykpCi0JCQl8fAkod3JpdGVmZHMgJiYgRkRfSVNTRVQocyx3cml0ZWZkcykpCi0JCQl8fAkoZXhjZXB0ZmRzICYmIEZEX0lTU0VUKHMsZXhjZXB0ZmRzKSkKLQkJKQotCQkJaWYgKCFTb2NrZXRzW3NdKQotCQkJCXJldHVybiBHVVNJX2Vycm9yKEVCQURGKTsKLQkKLQlmb3IgKHMgPSAwOyBzIDwgd2lkdGggOyArK3MpCi0JCWlmIChzb2NrID0gU29ja2V0c1tzXSkgewotCQkJciA9IHJlYWRmZHMgJiYgRkRfSVNTRVQocyxyZWFkZmRzKTsKLQkJCXcgPSB3cml0ZWZkcyAmJiBGRF9JU1NFVChzLHdyaXRlZmRzKTsKLQkJCWUgPSBleGNlcHRmZHMgJiYgRkRfSVNTRVQocyxleGNlcHRmZHMpOwotCi0JCQlpZiAociB8fCB3IHx8IGUpCi0JCQkJc29jay0+cHJlX3NlbGVjdChyLCB3LCBlKTsKLQkJfQotCQkKLQlkbyB7Ci0JCWZvciAocyA9IDA7IHMgPCB3aWR0aCA7ICsrcykgIHsKLQkJCWlmIChzb2NrID0gU29ja2V0c1tzXSkgewotCQkJCXIgPSBmYWxzZTsKLQkJCQl3ID0gZmFsc2U7Ci0JCQkJZSA9IGZhbHNlOwotCi0JCQkJY2FuUmVhZCA9IChyZWFkZmRzICYmIEZEX0lTU0VUKHMscmVhZGZkcykpID8gJnIgOiBuaWw7Ci0JCQkJY2FuV3JpdGUgPSAod3JpdGVmZHMgJiYgRkRfSVNTRVQocyx3cml0ZWZkcykpID8gJncgOiBuaWw7Ci0JCQkJZXhjZXB0aW9uID0gKGV4Y2VwdGZkcyAmJiBGRF9JU1NFVChzLGV4Y2VwdGZkcykpID8gJmUgOiBuaWw7Ci0KLQkJCQlpZiAoY2FuUmVhZCB8fCBjYW5Xcml0ZSB8fCBleGNlcHRpb24pCXsKLQkJCQkJY291bnQJKz0gc29jay0+c2VsZWN0KGNhblJlYWQsIGNhbldyaXRlLCBleGNlcHRpb24pOwotCi0JCQkJCWlmIChyKQotCQkJCQkJRkRfU0VUKHMsJnJkKTsKLQkJCQkJaWYgKHcpCi0JCQkJCQlGRF9TRVQocywmd2QpOwotCQkJCQlpZiAoZSkKLQkJCQkJCUZEX1NFVChzLCZlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjb3VudCkKLQkJCWJyZWFrOwotCi0JCVNBVkVfQU5EX0NMRUFSX0VSUk5POwotCQlTQUZFU1BJTihmYWxzZSwgU1BfU0VMRUNULCB3YWl0dGltZSk7Ci0KLQkJaWYgKGVycm5vKSB7Ci0JCQljb3VudCA9IC0xOwotCQkJCi0JCQlicmVhazsKLQkJfQotCX0gIHdoaWxlIChMTUdldFRpY2tzKCkgLSBzdGFydHRpbWUgPCB3YWl0dGltZSk7Ci0KLQlmb3IgKHMgPSAwOyBzIDwgd2lkdGggOyArK3MpCi0JCWlmIChzb2NrID0gU29ja2V0c1tzXSkgewotCQkJciA9IHJlYWRmZHMgJiYgRkRfSVNTRVQocyxyZWFkZmRzKTsKLQkJCXcgPSB3cml0ZWZkcyAmJiBGRF9JU1NFVChzLHdyaXRlZmRzKTsKLQkJCWUgPSBleGNlcHRmZHMgJiYgRkRfSVNTRVQocyxleGNlcHRmZHMpOwotCi0JCQlpZiAociB8fCB3IHx8IGUpCi0JCQkJc29jay0+cG9zdF9zZWxlY3QociwgdywgZSk7Ci0JCX0KLQkJCi0JaWYgKGNvdW50IDwgMCkKLQkJcmV0dXJuIEdVU0lfZXJyb3IoRUlOVFIpOwotCQkKLQlpZiAocmVhZGZkcykKLQkJKnJlYWRmZHMgPSByZDsKLQlpZiAod3JpdGVmZHMpCi0JCSp3cml0ZWZkcyA9IHdkOwotCWlmIChleGNlcHRmZHMpCi0JCSpleGNlcHRmZHMgPSBlZDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IGdldHNvY2tuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCAqbmFtZWxlbikKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+Z2V0c29ja25hbWUobmFtZSwgbmFtZWxlbikgOiAtMTsKLX0KLQotaW50IGdldHBlZXJuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCAqbmFtZWxlbikKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+Z2V0cGVlcm5hbWUobmFtZSwgbmFtZWxlbikgOiAtMTsKLX0KLQotaW50IHNodXRkb3duKGludCBzLCBpbnQgaG93KQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5zaHV0ZG93bihob3cpIDogLTE7Ci19Ci0KLWludCBmY250bChpbnQgcywgdW5zaWduZWQgaW50IGNtZCwgaW50IGFyZykKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCWlmIChzb2NrKQotCQlyZXR1cm4gKGNtZCA9PSBGX0RVUEZEKSA/IFNvY2tldHMuSW5zdGFsbChzb2NrLCBhcmcpIDogc29jay0+ZmNudGwoY21kLCBhcmcpOwotCWVsc2UKLQkJcmV0dXJuIC0xOwotfQotCi1pbnQgZHVwKGludCBzKQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBTb2NrZXRzLkluc3RhbGwoc29jaykgOiAtMTsKLX0KLQotaW50IGR1cDIoaW50IHMsIGludCBzMSkKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCWlmICghc29jaykKLQkJcmV0dXJuIC0xOwotCi0JaWYgKFNvY2tldHNbczFdKQotCQlTb2NrZXRzLlJlbW92ZShzMSk7Ci0KLQlyZXR1cm4gU29ja2V0cy5JbnN0YWxsKHNvY2ssIHMxKTsKLX0KLQotaW50IGlvY3RsKGludCBzLCB1bnNpZ25lZCBpbnQgcmVxdWVzdCwgbG9uZyAqYXJncCkKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCWlmICghc29jaykKLQkJcmV0dXJuIC0xOwotCQotCXJldHVybiBzb2NrLT5pb2N0bChyZXF1ZXN0LCBhcmdwKTsKLX0KLQotaW50IGdldHNvY2tvcHQoaW50IHMsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIHZvaWQgKm9wdHZhbCwgaW50ICogb3B0bGVuKQotewotCVNvY2tldCAqCXNvY2sJPQlTb2NrZXRzW3NdOwotCi0JcmV0dXJuIHNvY2sgPyBzb2NrLT5nZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikgOiAtMTsKLX0KLQotaW50IHNldHNvY2tvcHQoaW50IHMsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNvbnN0IHZvaWQgKm9wdHZhbCwgaW50IG9wdGxlbikKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+c2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgKHZvaWQgKikgb3B0dmFsLCBvcHRsZW4pIDogLTE7Ci19Ci0KLWludCBmc3RhdChpbnQgcywgc3RydWN0IHN0YXQgKiBidWYpCi17Ci0JU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107Ci0KLQlyZXR1cm4gc29jayA/IHNvY2stPmZzdGF0KGJ1ZikgOiAtMTsKLX0KLQotbG9uZyBsc2VlayhpbnQgcywgbG9uZyBvZmZzZXQsIGludCB3aGVuY2UpCi17Ci0JU29ja2V0ICoJc29jawk9CVNvY2tldHNbc107Ci0KLQlyZXR1cm4gc29jayA/IHNvY2stPmxzZWVrKG9mZnNldCwgd2hlbmNlKSA6IC0xOwotfQotCi1pbnQgZnRydW5jYXRlKGludCBzLCBsb25nIG9mZnNldCkKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+ZnRydW5jYXRlKG9mZnNldCkgOiAtMTsKLX0KLQotaW50IGlzYXR0eShpbnQgcykKLXsKLQlTb2NrZXQgKglzb2NrCT0JU29ja2V0c1tzXTsKLQotCXJldHVybiBzb2NrID8gc29jay0+aXNhdHR5KCkgOiAtMTsKLX0KLQotdm9pZCBHVVNJU2V0SG9vayhHVVNJSG9va0NvZGUgY29kZSwgR1VTSUhvb2sgaG9vaykKLXsKLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIEdVU0lfU3Bpbkhvb2s6Ci0JCUdVU0lTcGluID0gKEdVU0lTcGluRm4pIGhvb2s7Ci0JCWJyZWFrOwotCWNhc2UgR1VTSV9FeGVjSG9vazoKLQkJR1VTSUV4ZWMgPSAoR1VTSUV4ZWNGbikgaG9vazsKLQkJYnJlYWs7Ci0JY2FzZSBHVVNJX0ZUeXBlSG9vazoKLQkJR1VTSUZUeXBlID0gKEdVU0lGVHlwZUZuKSBob29rOwotCQlicmVhazsKLQljYXNlIEdVU0lfU3BlZWRIb29rOgotCQlnR1VTSVNwZWVkID0gKGxvbmcpIGhvb2s7Ci0JCWJyZWFrOwotCX0KLX0KLQotR1VTSUhvb2sgR1VTSUdldEhvb2soR1VTSUhvb2tDb2RlIGNvZGUpCi17Ci0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBHVVNJX1NwaW5Ib29rOgotCQlyZXR1cm4gKEdVU0lIb29rKSBHVVNJU3BpbjsKLQljYXNlIEdVU0lfRXhlY0hvb2s6Ci0JCXJldHVybiAoR1VTSUhvb2spIEdVU0lFeGVjOwotCWNhc2UgR1VTSV9GVHlwZUhvb2s6Ci0JCXJldHVybiAoR1VTSUhvb2spIEdVU0lGVHlwZTsKLQljYXNlIEdVU0lfU3BlZWRIb29rOgotCQlyZXR1cm4gKEdVU0lIb29rKSBnR1VTSVNwZWVkOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gKEdVU0lIb29rKSBuaWw7Ci0JfQotfQotCi1pbnQgR1VTSVNldEV2ZW50cyhHVVNJRXZ0VGFibGUgdGFibGUpCi17Ci0Jc2hvcnQJZXZ0OwotCi0JZXZ0SGFuZGxlcgk9CXRhYmxlOwotCWV2dE1hc2sJCT0JMDsKLQotCWZvciAoZXZ0ID0gMDsgZXZ0PDE2OyArK2V2dCkKLQkJaWYgKGV2dEhhbmRsZXJbZXZ0XSkKLQkJCWV2dE1hc2sJfD0JMSA8PCBldnQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotR1VTSUV2dEhhbmRsZXIgKiBHVVNJR2V0RXZlbnRzKHZvaWQpCi17Ci0JcmV0dXJuIGV2dEhhbmRsZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKiBTb2NrZXREb21haW4gbWVtYmVycyAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBHVVNJX0RJU1BBVENICi0KLVNvY2tldERvbWFpbiAqCQkJU29ja2V0RG9tYWluOjpkb21haW5zW0dVU0lfTUFYX0RPTUFJTl07Ci1Qcm9jZXNzU2VyaWFsTnVtYmVyCVNvY2tldERvbWFpbjo6cHJvY2VzczsKLQotU29ja2V0RG9tYWluICogU29ja2V0RG9tYWluOjpEb21haW4oaW50IGRvbWFpbikKLXsKLQlpZiAoZG9tYWluIDwgMCB8fCBkb21haW4gPj0gR1VTSV9NQVhfRE9NQUlOIHx8ICFkb21haW5zW2RvbWFpbl0pCXsKLQkJR1VTSV9lcnJvcihFSU5WQUwpOwotCi0JCXJldHVybiBuaWw7Ci0JfSBlbHNlCi0JCXJldHVybiBkb21haW5zW2RvbWFpbl07Ci19Ci0KLXZvaWQgU29ja2V0RG9tYWluOjpSZWFkeSgpCi17Ci0JaWYgKGhhc1Byb2Nlc3NNZ3IpCi0JCVdha2VVcFByb2Nlc3MoJnByb2Nlc3MpOwotfQotCi1Tb2NrZXREb21haW46OlNvY2tldERvbWFpbihpbnQgZG9tYWluKQotewotI2lmZGVmIFBSRVZFTlRfRFVQTElDQVRFX0RPTUFJTlMKLQlpZiAoZG9tYWluc1tkb21haW5dKQl7Ci0JCVN0cjYzCW1zZzsKLQotCQlzcHJpbnRmKChjaGFyICopIG1zZysxLCAiRHVwbGljYXRlIGRlY2xhcmF0aW9uIGZvciBkb21haW4gJWRcbiIsIGRvbWFpbik7Ci0JCW1zZ1swXSA9ICh1bnNpZ25lZCBjaGFyKXN0cmxlbigoY2hhciAqKSBtc2crMSk7Ci0KLQkJRGVidWdTdHIobXNnKTsKLQl9Ci0jZW5kaWYKLQlpZiAoZG9tYWluKQkJCQkJCQkJCS8vIElnbm9yZSBBRl9VTlNQRUMgZG9tYWlucwotCQlkb21haW5zW2RvbWFpbl0JPQl0aGlzOwotCQotCWlmIChoYXNQcm9jZXNzTWdyICYmICFwcm9jZXNzLmhpZ2hMb25nT2ZQU04gJiYgIXByb2Nlc3MubG93TG9uZ09mUFNOKQotCQlHZXRDdXJyZW50UHJvY2VzcygmcHJvY2Vzcyk7Ci19Ci0KLVNvY2tldERvbWFpbjo6flNvY2tldERvbWFpbigpCi17Ci19Ci0KLS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHNvY2tldCgpIGp1c3QgcmV0dXJucyBhbiBlcnJvcgotCi1Tb2NrZXQgKiBTb2NrZXREb21haW46OnNvY2tldChpbnQsIHNob3J0KQotewotCUdVU0lfZXJyb3IoRU9QTk9UU1VQUCk7Ci0KLQlyZXR1cm4gbmlsOwotfQotCi0vLyBTYW1lIHdpdGggc29ja2V0cGFpcgotCi1pbnQgU29ja2V0RG9tYWluOjpzb2NrZXRwYWlyKGludCwgc2hvcnQsIFNvY2tldCAqKikKLXsKLQlyZXR1cm4gR1VTSV9lcnJvcihFT1BOT1RTVVBQKTsKLX0KLQotCi1pbnQgU29ja2V0RG9tYWluOjpjaG9vc2UoaW50LCBjaGFyICosIHZvaWQgKiwgaW50LCB2b2lkICosIGludCAqKQotewotCXJldHVybiBHVVNJX2Vycm9yKEVPUE5PVFNVUFApOwotfQotCi12b2lkIFNvY2tldERvbWFpbjo6RG9udFN0cmlwKCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqIFNvY2tldFRhYmxlIG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBGbHVzaFN0ZGlvKCkKLXsKLQlmd2FsayhmZmx1c2gpOwotfQotCi1Tb2NrZXRUYWJsZTo6U29ja2V0VGFibGUoKQotewotCWF0ZXhpdChGbHVzaFN0ZGlvKTsKLQkKLQluZWVkc0NvbnNvbGUgPSB0cnVlOwotfQotCQotaW50IFNvY2tldFRhYmxlOjpJbnN0YWxsKFNvY2tldCAqIHNvY2ssIGludCBzdGFydCkKLXsKLQlzaG9ydAlmZDsKLQotCWlmIChzdGFydDwwIHx8IHN0YXJ0ID49IEdVU0lfTUFYX0ZEKQotCQlyZXR1cm4gR1VTSV9lcnJvcihFSU5WQUwpOwotCi0JZm9yIChmZD1zdGFydDsgZmQ8R1VTSV9NQVhfRkQ7ICsrZmQpCi0JCWlmICghc29ja2V0c1tmZF0pCXsKLQkJCXNvY2tldHNbZmRdID0gc29jazsKLQkJCi0JCQkrK3NvY2stPnJlZkNvdW50OwotCQkJcmV0dXJuIGZkOwotCQl9Ci0KLQlyZXR1cm4gR1VTSV9lcnJvcihFTUZJTEUpOwotfQotCi1pbnQgU29ja2V0VGFibGU6OlJlbW92ZShpbnQgZmQpCi17Ci0JU29ja2V0ICoJc29jazsKLQotCUluaXRDb25zb2xlKCk7Ci0KLQlpZiAoZmQ8MCB8fCBmZCA+PSBHVVNJX01BWF9GRCB8fCAhKHNvY2sgPSBzb2NrZXRzW2ZkXSkpCi0JCXJldHVybiBHVVNJX2Vycm9yKEVCQURGKTsKLQotCXNvY2tldHNbZmRdIAk9CW5pbDsKLQotCWlmICghLS1zb2NrLT5yZWZDb3VudCkKLQkJZGVsZXRlIHNvY2s7Ci0KLQlyZXR1cm4gMDsKLX0KLQotU29ja2V0ICogU29ja2V0VGFibGU6Om9wZXJhdG9yW10oaW50IGZkKQotewotCVNvY2tldCAqIHNvY2s7Ci0KLQlJbml0Q29uc29sZSgpOwotCQotCWlmIChmZDwwIHx8IGZkID49IEdVU0lfTUFYX0ZEIHx8ICEoc29jayA9IHNvY2tldHNbZmRdKSkJewotCQlHVVNJX2Vycm9yKEVCQURGKTsKLQotCQlyZXR1cm4gbmlsOwotCX0gZWxzZQotCQlyZXR1cm4gc29jazsKLX0KLQotI2lmbmRlZiBwb3dlcmMKLSNwcmFnbWEgZmFyX2NvZGUKLSNlbmRpZgotCi1Tb2NrZXRUYWJsZTo6flNvY2tldFRhYmxlKCkKLXsKLQlpbnQgaTsKLQotCS8vIEZsdXNoIHN0ZGlvIGZpbGVzIChuZWNlc3NhcnkgdG8gZmx1c2ggYnVmZmVycykKLQotCWZ3YWxrKGZmbHVzaCk7Ci0KLQkvLyBJZiB3ZSBkaWRuJ3QgbmVlZCBhIGNvbnNvbGUgc28gZmFyLCB3ZSBjZXJ0YWlubHkgZG9uJ3QgbmVlZCBvbmUgbm93IQotCS8vIERvaW5nIHRoaXMgZnVydGhlciB1cCB3b3VsZCBiZSBkYW5nZXJvdXMgZm9yIHNtYWxsIHdyaXRlIG9ubHkgYXBwcwotCQotCW5lZWRzQ29uc29sZSA9IGZhbHNlOwotCi0JLy8gTm93IGNsb3NlIHN0ZGlvIGZpbGVzLCBqdXN0IHRvIGJlIHN1cmUKLQotCWZ3YWxrKGZjbG9zZSk7Ci0KLQkvLyBDbG9zZSBhbGwgZmlsZXMKLQotCWZvciAoaSA9IDA7IGk8R1VTSV9NQVhfRkQ7ICsraSkKLQkJaWYgKHNvY2tldHNbaV0pCi0JCQljbG9zZShpKTsKLX0KLQotI2VuZGlmIC8vIEdVU0lfRElTUEFUQ0gKLQotLyoqKioqKioqKioqKioqKioqKioqKiogc2xlZXAoKS9hbGFybSgpICoqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgbG9uZwlHVVNJQWxhcm0gPSAwOwotCi1pbnQgR1VTSUNoZWNrQWxhcm0oKQotewotCWlmIChHVVNJQWxhcm0gJiYgTE1HZXRUaWNrcygpID4gR1VTSUFsYXJtKSB7Ci0JCUdVU0lBbGFybSA9IDA7Ci0JCXJhaXNlKFNJR0FMUk0pOwotCQkKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlCi0JCXJldHVybiAwOwotfQotCi11X2ludAkgYWxhcm0odV9pbnQgc2Vjb25kcykKLXsKLQlsb25nIHJlbWFpbmluZyA9IEdVU0lBbGFybSA/IChMTUdldFRpY2tzKCkgLSBHVVNJQWxhcm0pIC8gNjAgOiAwOwotCQotCUdVU0lBbGFybSA9IHNlY29uZHMgPyBMTUdldFRpY2tzKCkgKyA2MCAqIHNlY29uZHMgOiAwOwotCQotCXJldHVybiAocmVtYWluaW5nIDwgMCkgPyAwIDogKHVfaW50KSByZW1haW5pbmc7Ci19Ci0KLXN0YXRpYyB1X2ludCBEb1NsZWVwKGxvbmcgdGlja3MpCi17Ci0JbG9uZyB3YWtldXAgPSBMTUdldFRpY2tzKCkgKyB0aWNrczsKLQkKLQlTQUZFU1BJTih3YWtldXAgPiBMTUdldFRpY2tzKCksIFNQX1NMRUVQLCB3YWtldXAgLSBMTUdldFRpY2tzKCkpOwotCQotCWxvbmcgcmVtYWluaW5nID0gKExNR2V0VGlja3MoKSAtIHdha2V1cCkgLyA2MDsKLQkKLQlyZXR1cm4gKHJlbWFpbmluZyA8IDApID8gMCA6ICh1X2ludCkgcmVtYWluaW5nOwotfQotCi11X2ludCBzbGVlcCh1X2ludCBzZWNvbmRzKSAKLXsKLQlyZXR1cm4gRG9TbGVlcChzZWNvbmRzICogNjApOwotfQotCi12b2lkIHVzbGVlcCh1X2ludCB1c2Vjb25kcykKLXsKLQlEb1NsZWVwKCh1c2Vjb25kcyAqIDMpIC8gNTAwMDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBEZWZhdWx0IHNwaW4gZnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgR1VTSV9ESVNQQVRDSAotCi0jaWZuZGVmIHBvd2VyYwotI3ByYWdtYSBzbWFydF9jb2RlCi0jZW5kaWYKLQotLyogQm9ycm93ZWQgZnJvbSB0ZWNoIG5vdGUgMjYzICovCi0KLSNkZWZpbmUga01hc2tNb2RpZmllcnMgIAkweEZFMDAgICAgIAkvLyB3ZSBuZWVkIHRoZSBtb2RpZmllcnMgd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkvLyBjb21tYW5kIGtleSBmb3IgS2V5VHJhbnMKLSNkZWZpbmUga01hc2tWaXJ0dWFsS2V5IAkweDAwMDBGRjAwIAkvLyBnZXQgdmlydHVhbCBrZXkgZnJvbSBldmVudCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJLy8gZm9yIEtleVRyYW5zCi0jZGVmaW5lIGtVcEtleU1hc2sgICAgICAJMHgwMDgwCi0jZGVmaW5lIGtTaGlmdFdvcmQgICAgICAJOCAgICAgICAgICAJLy8gd2Ugc2hpZnQgdGhlIHZpcnR1YWwga2V5IHRvIG1hc2sgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkvLyBpbnRvIHRoZSBrZXlDb2RlIGZvciBLZXlUcmFucwotI2RlZmluZSBrTWFza0FTQ0lJMSAgICAgCTB4MDBGRjAwMDAgCS8vIGdldCB0aGUga2V5IG91dCBvZiB0aGUgQVNDSUkxIGJ5dGUKLSNkZWZpbmUga01hc2tBU0NJSTIgICAgIAkweDAwMDAwMEZGIAkvLyBnZXQgdGhlIGtleSBvdXQgb2YgdGhlIEFTQ0lJMiBieXRlCi0jZGVmaW5lIGtQZXJpb2QgICAgICAgICAJMHgyRSAgICAgICAJLy8gYXNjaWkgZm9yIGEgcGVyaW9kCi0KLXN0YXRpYyBCb29sZWFuIENtZFBlcmlvZChFdmVudFJlY29yZCAqdGhlRXZlbnQpCi17Ci0gIAlCb29sZWFuICBmVGltZVRvUXVpdDsKLSAgCXNob3J0ICAgIGtleUNvZGU7Ci0gIAlsb25nICAgICB2aXJ0dWFsS2V5LCBrZXlJbmZvLCBsb3dDaGFyLCBoaWdoQ2hhciwga2V5Q0lkOwotICAJVUludDMyCXN0YXRlOwotICAJSGFuZGxlICAgaEtDSFI7Ci0JUHRyIAkJS0NIUlB0cjsKLQotCWZUaW1lVG9RdWl0ID0gZmFsc2U7Ci0KLQlpZiAoKCgqdGhlRXZlbnQpLndoYXQgPT0ga2V5RG93bikgfHwgKCgqdGhlRXZlbnQpLndoYXQgPT0gYXV0b0tleSkpIHsKLQotCQkvLyBzZWUgaWYgdGhlIGNvbW1hbmQga2V5IGlzIGRvd24uICBJZiBpdCBpcywgZmluZCBvdXQgdGhlIEFTQ0lJCi0JCS8vIGVxdWl2YWxlbnQgZm9yIHRoZSBhY2NvbXBhbnlpbmcga2V5LgotCi0JCWlmICgoKnRoZUV2ZW50KS5tb2RpZmllcnMgJiBjbWRLZXkgKSB7Ci0KLQkJCXZpcnR1YWxLZXkgPSAoKCp0aGVFdmVudCkubWVzc2FnZSAmIGtNYXNrVmlydHVhbEtleSkgPj4ga1NoaWZ0V29yZDsKLQkJCS8vIEFuZCBvdXQgdGhlIGNvbW1hbmQga2V5IGFuZCBPciBpbiB0aGUgdmlydHVhbEtleQotCQkJa2V5Q29kZSAgICA9IHNob3J0KCgoKnRoZUV2ZW50KS5tb2RpZmllcnMgJiBrTWFza01vZGlmaWVycykgfCB2aXJ0dWFsS2V5KTsKLQkJCXN0YXRlICAgICAgPSAwOwotCi0JCQloS0NIUiA9IG5pbDsgIC8qIHNldCB0aGlzIHRvIG5pbCBiZWZvcmUgc3RhcnRpbmcgKi8KLQkJIAlLQ0hSUHRyID0gKFB0cilHZXRTY3JpcHRNYW5hZ2VyVmFyaWFibGUoc21LQ0hSQ2FjaGUpOwotCi0JCQlpZiAoICFLQ0hSUHRyICkgewotCQkJCWtleUNJZCA9IEdldFNjcmlwdFZhcmlhYmxlKHNob3J0KEdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbUtleVNjcmlwdCkpLCBzbVNjcmlwdEtleXMpOwotCi0JCQkJaEtDSFIgICA9IEdldFJlc291cmNlKCdLQ0hSJyxzaG9ydChrZXlDSWQpKTsKLQkJCQlLQ0hSUHRyID0gKmhLQ0hSOwotCQkJfQotCi0JCQlpZiAoS0NIUlB0cikgewotCQkJCWtleUluZm8gPSBLZXlUcmFucyhLQ0hSUHRyLCBrZXlDb2RlLCAmc3RhdGUpOwotCQkJCWlmIChoS0NIUikKLQkJCQkJUmVsZWFzZVJlc291cmNlKGhLQ0hSKTsKLQkJCX0gZWxzZQotCQkJCWtleUluZm8gPSAoKnRoZUV2ZW50KS5tZXNzYWdlOwotCi0JCQlsb3dDaGFyID0gIGtleUluZm8gJiAga01hc2tBU0NJSTI7Ci0JCQloaWdoQ2hhciA9IChrZXlJbmZvICYga01hc2tBU0NJSTEpID4+IDE2OwotCQkJaWYgKGxvd0NoYXIgPT0ga1BlcmlvZCB8fCBoaWdoQ2hhciA9PSBrUGVyaW9kKQotCQkJCWZUaW1lVG9RdWl0ID0gdHJ1ZTsKLQotCQl9ICAvLyBlbmQgdGhlIGNvbW1hbmQga2V5IGlzIGRvd24KLQl9ICAvLyBlbmQga2V5IGRvd24gZXZlbnQKLQotCXJldHVybiggZlRpbWVUb1F1aXQgKTsKLX0KLQotQm9vbGVhbiBHVVNJSW50ZXJydXB0KCkKLXsKLQlFdlFFbFB0cgkJZXZlbnRROwotCi0JZm9yIChldmVudFEgPSAoRXZRRWxQdHIpIExNR2V0RXZlbnRRdWV1ZSgpLT5xSGVhZDsgZXZlbnRROyApCi0JCWlmIChDbWRQZXJpb2QoKEV2ZW50UmVjb3JkICopICZldmVudFEtPmV2dFFXaGF0KSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlldmVudFEgPSAoRXZRRWxQdHIpZXZlbnRRLT5xTGluazsKLQkKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBTdGFuZEFsb25lID0gMTsKLWxvbmcgZ0dVU0lTcGluQ29udHJvbCA9IDA7Ci0KLWludCBHVVNJRGVmYXVsdFNwaW4oc3Bpbl9tc2cgbXNnLCBsb25nIGFyZykKLXsKLQlzdGF0aWMgQm9vbGVhbgkJCWluRm9yZWdyb3VuZAk9CXRydWU7Ci0JV2luZG93UHRyCQkJCXdpbjsKLQlFdmVudFJlY29yZAkJCQlldjsKLQlsb25nCQkJCQlzbGVlcFRpbWUJPQk2OwkvLyAxLzEwIG9mIGEgc2Vjb25kIGJ5IGRlZmF1bHQKLQlzaG9ydAkJCQkJbWFzayAJCT0gCW9zTWFza3xoaWdoTGV2ZWxFdmVudE1hc2t8bURvd25NYXNrfGV2dE1hc2s7Ci0KLQlHVVNJQ29uZmlnLkF1dG9Jbml0R3JhZigpOwotCQotCWlmIChpbkZvcmVncm91bmQpIHsKLQkJcmVnaXN0ZXIgbG9uZyBjb250cmliID0gKG1zZyA9PSBTUF9BVVRPX1NQSU4pID8gYXJnIDogZ0dVU0lTcGVlZDsKLQkJZ0dVU0lTcGluQ29udHJvbCArPSBjb250cmliOwotCQkvLyBUd2VhayB3aGVuIGEgc3BpbiBwb2ludCBoYXMgYmVlbiBvdmVyc2hvdAotCQlSb3RhdGVDdXJzb3IoKGdHVVNJU3BpbkNvbnRyb2wgJiAzMSkgPCBjb250cmliID8gMzIgOiBnR1VTSVNwaW5Db250cm9sKTsKLQl9Ci0KLQlpZiAoR1VTSUludGVycnVwdCgpKQotCQlnb3RvIGludGVycnVwdDsKLQotCWlmICghU3RhbmRBbG9uZSAmJiBpbkZvcmVncm91bmQpCQkvLyBGb3IgTVBXIHRvb2xzLCBTcGluQ3Vyc29yIGFscmVhZHkgY2FsbHMgV05FCi0JCWlmICghR1VTSUNvbmZpZy5ub0FwcGxlRXZlbnRzKQkJCS8vIGJ1dCBpdCBubyBsb25nZXIgcmVwb3J0cyBBcHBsZUV2ZW50cwotCQkJbWFzayA9IGhpZ2hMZXZlbEV2ZW50TWFza3xldnRNYXNrOwotCQllbHNlCi0JCQlyZXR1cm4gMDsJCQkJCQkJCQotCQkKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgU1BfU0xFRVA6Ci0JY2FzZSBTUF9TRUxFQ1Q6Ci0JCWlmIChhcmcgPj0gc2xlZXBUaW1lKQkJCQkvLyBPbmx5IHNsZWVwIGlmIHBhdGllbmNlIGd1YXJhbnRlZWQKLQkJCWJyZWFrOwotCQkvLyBPdGhlcndpc2UsIGZhbGwgdGhyb3VnaAkKLQljYXNlIFNQX0FVVE9fU1BJTjoKLQkJc2xlZXBUaW1lID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCQotCWlmIChXYWl0TmV4dEV2ZW50KG1hc2ssICZldiwgc2xlZXBUaW1lLCBuaWwpKQotCQlzd2l0Y2ggKGV2LndoYXQpIHsKLQkJY2FzZSBtb3VzZURvd246Ci0JCQlpZiAoIWV2dEhhbmRsZXIgfHwgIWV2dEhhbmRsZXJbbW91c2VEb3duXSkKLQkJCQlpZiAoRmluZFdpbmRvdyhldi53aGVyZSwgJndpbikgPT0gaW5TeXNXaW5kb3cpCi0JCQkJCVN5c3RlbUNsaWNrKCZldiwgd2luKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2Ugb3NFdnQ6Ci0JCQlpZiAoZXYubWVzc2FnZSAmIDEpCi0JCQkJaW5Gb3JlZ3JvdW5kCT0JdHJ1ZTsKLQkJCWVsc2UKLQkJCQlpbkZvcmVncm91bmQJPQlmYWxzZTsKLQkJCWJyZWFrOwotCQljYXNlIGtIaWdoTGV2ZWxFdmVudDoKLQkJCWlmICghZXZ0SGFuZGxlciB8fCAhZXZ0SGFuZGxlcltrSGlnaExldmVsRXZlbnRdKQotCQkJCWlmIChoYXNBcHBsZUV2ZW50cykJCQkJLy8gYWN0dWFsbHkgcHJldHR5IGxpa2VseSwgaWYgd2UgZ2V0IEhMIEV2ZW50cwotCQkJCQlBRVByb2Nlc3NBcHBsZUV2ZW50KCZldik7CS8vIElnbm9yZSBlcnJvcnMKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCWlmIChldi53aGF0ID49IDAgJiYgZXYud2hhdCA8IDI0ICYmIGV2dEhhbmRsZXIgJiYgZXZ0SGFuZGxlcltldi53aGF0XSkKLQkJZXZ0SGFuZGxlcltldi53aGF0XSgmZXYpOwotCi0JcmV0dXJuIDA7Ci0KLWludGVycnVwdDoKLQlGbHVzaEV2ZW50cygtMSwgMCk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBGZWF0dXJlIG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUZlYXR1cmU6OkZlYXR1cmUodW5zaWduZWQgc2hvcnQgdHJhcE51bSwgVHJhcFR5cGUgdFR5cCkKLXsKLQlnb29kID0KLQkJTkdldFRyYXBBZGRyZXNzKHRyYXBOdW0sIHRUeXApICE9IE5HZXRUcmFwQWRkcmVzcyhfVW5pbXBsZW1lbnRlZCwgVG9vbFRyYXApOwotfQotCi1GZWF0dXJlOjpGZWF0dXJlKE9TVHlwZSB0eXBlLCBsb25nIHZhbHVlKQotewotCWxvbmcJCWF0dHI7Ci0KLQlnb29kID0gKCFHZXN0YWx0KHR5cGUsICZhdHRyKSAmJiAoYXR0ciA+PSB2YWx1ZSkpOwotfQotCi1GZWF0dXJlOjpGZWF0dXJlKE9TVHlwZSB0eXBlLCBsb25nIG1hc2ssIGxvbmcgdmFsdWUpCi17Ci0JbG9uZwkJYXR0cjsKLQotCWdvb2QgPSAoIUdlc3RhbHQodHlwZSwgJmF0dHIpICYmICgoYXR0ciAmIG1hc2spID09IHZhbHVlKSk7Ci19Ci0KLUZlYXR1cmU6OkZlYXR1cmUoY29uc3QgRmVhdHVyZSAmIHByZWNvbmRpdGlvbiwgT1NFcnJJbml0aWFsaXplciBpbml0KQotewotCWdvb2QJPQlwcmVjb25kaXRpb24gJiYgIWluaXQoKTsKLX0KLQotRmVhdHVyZTo6RmVhdHVyZShPU0VyckluaXRpYWxpemVyIGluaXQpCi17Ci0JZ29vZAk9CSFpbml0KCk7Ci19Ci0KLUZlYXR1cmU6OkZlYXR1cmUoY29uc3QgRmVhdHVyZSAmIHByZWNvbmRpdGlvbiwgdm9pZEluaXRpYWxpemVyIGluaXQpCi17Ci0JaWYgKHByZWNvbmRpdGlvbikJewotCQlnb29kID0gdHJ1ZTsKLQkJaW5pdCgpOwotCX0gZWxzZQotCQlnb29kID0gZmFsc2U7Ci19Ci0KLUZlYXR1cmU6OkZlYXR1cmUodm9pZEluaXRpYWxpemVyIGluaXQpCi17Ci0JZ29vZCA9IHRydWU7Ci0JaW5pdCgpOwotfQotCi1GZWF0dXJlOjpGZWF0dXJlKGNvbnN0IEZlYXR1cmUgJiBjb25kMSwgY29uc3QgRmVhdHVyZSAmIGNvbmQyKQotewotCWdvb2QgPSBjb25kMSAmJiBjb25kMjsKLX0KLQotT1NFcnIgQXBwbGVUYWxrSWRlbnRpdHkoc2hvcnQgJiBuZXQsIHNob3J0ICYgbm9kZSkKLXsKLQlzdGF0aWMgc2hvcnQJbXluZXQ7Ci0Jc3RhdGljIHNob3J0CW15bm9kZTsKLQlzdGF0aWMgT1NFcnIJZXJyID0gMTsKLQotCWlmIChlcnIgPT0gMSkKLQkJaWYgKCEoZXJyID0gTVBQT3BlbigpKSkKLQkJCWVyciA9IEdldE5vZGVBZGRyZXNzKCZteW5vZGUsICZteW5ldCk7Ci0KLQotCW5ldAk9CW15bmV0OwotCW5vZGUJPQlteW5vZGU7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogU2V0dXAgc3VwcHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByYXkgdGhhdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIG5ldmVyIGlubGluZXMgR1VTSVNldHVwICovCi0KLXZvaWQgR1VTSURlZmF1bHRTZXR1cCgpCi17Ci0JR1VTSVNldHVwKEdVU0l3aXRoQXBwbGVUYWxrU29ja2V0cyk7Ci0JR1VTSVNldHVwKEdVU0l3aXRoSW50ZXJuZXRTb2NrZXRzKTsKLQlHVVNJU2V0dXAoR1VTSXdpdGhQQVBTb2NrZXRzKTsKLQlHVVNJU2V0dXAoR1VTSXdpdGhQUENTb2NrZXRzKTsKLQlHVVNJU2V0dXAoR1VTSXdpdGhVbml4U29ja2V0cyk7Ci0JR1VTSVNldHVwKEdVU0l3aXRoU0lPVVhTb2NrZXRzKTsKLX0KLQotdm9pZCBHVVNJU2V0dXAodm9pZCAoKnByb2MpKCkpCi17Ci0JcHJvYygpOwotfQotCi12b2lkIEdVU0lMb2FkQ29uZmlndXJhdGlvbihIYW5kbGUgaGRsKQotewotCUdVU0lDb25maWcuR1VTSUxvYWRDb25maWd1cmF0aW9uKGhkbCk7Ci19Ci0KLSNlbmRpZiAvLyBHVVNJX0RJU1BBVENICmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJTmV0REIuY3AgYi9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJTmV0REIuY3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMjE0MGUuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL0dVU0kxLW1vZHMvR1VTSU5ldERCLmNwCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgVW5pZmllZCBTb2NrZXQgSW50ZXJmYWNlCi1GaWxlCQk6CUdVU0lOZXREQi5jcAktCUNvbnZlcnQgaW50ZXJuZXQgbmFtZXMgdG8gYWRyZXNzZXMKLUF1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgotCi0JVGhpcyBmaWxlIHdhcyBkZXJpdmVkIGZyb20gdGhlIHNvY2tldCBsaWJyYXJ5IGJ5Ci0KLQkJQ2hhcmxpZSBSZWltYW4JPGNyZWltYW5AbmNzYS51aXVjLmVkdT4gYW5kCi0JCVRvbSBNaWxsaWdhbgk8bWlsbGlnYW5AbWFkaGF1cy51dGNzLnV0b3JvbnRvLmNhPgotCi1MYW5ndWFnZQk6CU1QVyBDKysKLQotJExvZyQKLVJldmlzaW9uIDEuMSAgMjAwMC8wOS8xMiAyMDoyNDo0OSAgamFjawotTW92ZWQgdG8gVW5zdXBwb3J0ZWQuCi0KLVJldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozOCAgamFjawotUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KLQotUmV2aXNpb24gMS4zICAxOTk0LzA4LzEwICAwMDowNzozMCAgbmVlcmkKLVNhbml0aXplZCBmb3IgdW5pdmVyc2FsIGhlYWRlcnMuCi0KLVJldmlzaW9uIDEuMiAgMTk5NC8wNS8wMSAgMjM6NDM6MzEgIG5lZXJpCi1nZXRzZXJ2YnluYW1lKCkgd2l0aG91dCAvZXRjL3NlcnZpY2VzIHdvdWxkIGZhaWwuCi0KLVJldmlzaW9uIDEuMSAgMTk5NC8wMi8yNSAgMDI6Mjk6MzYgIG5lZXJpCi1Jbml0aWFsIHJldmlzaW9uCi0KLVJldmlzaW9uIDAuNSAgMTk5My8xMC8zMSAgMDA6MDA6MDAgIG5lZXJpCi1EZWZlcnJlZCBvcGVuaW5nIG9mIHJlc29sdmVyCi0KLVJldmlzaW9uIDAuNCAgMTk5My8wNy8yOSAgMDA6MDA6MDAgIG5lZXJpCi1SZWFsIGdldHNlcnZlbnQgY29kZSAoYWRhcHRlZCBmcm9tIFNhayBXYXRoYW5hc2luKQotCi1SZXZpc2lvbiAwLjMgIDE5OTMvMDEvMTkgIDAwOjAwOjAwICBuZWVyaQotQ2FuJ3Qgc2V0IGFsaWFzZXMgdG8gTlVMTC4KLQotUmV2aXNpb24gMC4yICAxOTkyLzExLzIxICAwMDowMDowMCAgbmVlcmkKLVJlbW92ZSBmb3JjZV9hY3RpdmUKLQotUmV2aXNpb24gMC4xICAxOTkyLzA5LzE0ICAwMDowMDowMCAgbmVlcmkKLU1heWJlIGl0IHdvcmtzLCBtYXliZSBpdCBkb2Vzbid0Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkdVU0lJTkVUX1AuaCIKLQotI2luY2x1ZGUgIlRGaWxlU3BlYy5oIgotI2luY2x1ZGUgIkZvbGRlcnMuaCIKLSNpbmNsdWRlICJQTFN0cmluZ0Z1bmNzLmgiCi0KLSNpZmRlZiBfX01XRVJLU19fCi0vLwotLy8gSSBkaXNhcHByb3ZlIG9mIHRoZSB3YXkgZG5yLmMgaXMgd3JpdHRlbgotLy8gVGhpcyBkaXNhcHByb3ZhbCBnZXRzIHN0cm9uZ2VyIHdpdGggZXZlcnkgdmVyc2lvbgotLy8KLSNpbmNsdWRlICJkbnIuYyIKLSNwcmFnbWEgcmVxdWlyZV9wcm90b3R5cGVzIHJlc2V0Ci0jcHJhZ21hIGNwbHVzcGx1cyByZXNldAotI2VuZGlmCi0KLSNpZiBHRU5FUkFUSU5HNjhLCi0jcHJhZ21hIHNlZ21lbnQgR1VTSUlORVQKLSNlbmRpZgotCi1zdGF0aWMgcGFzY2FsIHZvaWQgRE5SRG9uZShzdHJ1Y3QgaG9zdEluZm8gKiwgQm9vbGVhbiAqIGRvbmUpCi17Ci0JKmRvbmUgPSB0cnVlOwotfQotCi0jaWYgR0VORVJBVElOR0NGTQotUm91dGluZURlc2NyaXB0b3IJdUROUkRvbmUgPSAKLQkJQlVJTERfUk9VVElORV9ERVNDUklQVE9SKHVwcFJlc3VsdFByb2NJbmZvLCBETlJEb25lKTsKLSNlbHNlCi0jZGVmaW5lIHVETlJEb25lIEROUkRvbmUKLSNlbmRpZgotCi1pbnQgaF9lcnJubzsKLQotLyoKLSAqICAgR2V0aG9zdGJ5bmFtZSBhbmQgZ2V0aG9zdGJ5YWRkciBlYWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYW4KLSAqICAgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBJbnRlcm5ldAotICogICBob3N0IHJlZmVyZW5jZWQgYnkgbmFtZSBvciBieSBhZGRyZXNzLCByZXNwZWN0aXZlbHkuIFRoaXMKLSAqICAgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBNYWNUQ1AKLSAqICAgbmFtZSBzZXJ2ZXIuCi0gKgotICogICBzdHJ1Y3QgICAgaG9zdGVudAotICogICB7Ci0gKiAgICAgICAgY2hhciAqaF9uYW1lOwotICogICAgICAgIGNoYXIgKipoX2FsaWFzZXM7Ci0gKiAgICAgICAgaW50ICBoX2FkZHJ0eXBlOwotICogICAgICAgIGludCAgaF9sZW5ndGg7Ci0gKiAgICAgICAgY2hhciAqKmhfYWRkcl9saXN0OwotICogICB9OwotICogICAjZGVmaW5lICAgaF9hZGRyICBoX2FkZHJfbGlzdFswXQotICoKLSAqICAgVGhlIG1lbWJlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlOgotICoKLSAqICAgaF9uYW1lICAgICAgIE9mZmljaWFsIG5hbWUgb2YgdGhlIGhvc3QuCi0gKgotICogICBoX2FsaWFzZXMgICAgQSB6ZXJvIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYWx0ZXJuYXRlIG5hbWVzIGZvciB0aGUgaG9zdC4KLSAqCi0gKiAgIGhfYWRkcnR5cGUgICBUaGUgdHlwZSBvZiBhZGRyZXNzIGJlaW5nICByZXR1cm5lZDsgYWx3YXlzIEFGX0lORVQuCi0gKgotICogICBoX2xlbmd0aCAgICAgVGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBhZGRyZXNzLgotICoKLSAqICAgaF9hZGRyX2xpc3QgIEEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIG5ldHdvcmsgYWRkcmVzc2VzIGZvciB0aGUgaG9zdC4KLSAqCi0gKiAgIEVycm9yIHJldHVybiBzdGF0dXMgZnJvbSBnZXRob3N0YnluYW1lIGFuZCBnZXRob3N0YnlhZGRyICBpcwotICogICBpbmRpY2F0ZWQgYnkgcmV0dXJuIG9mIGEgbnVsbCBwb2ludGVyLiAgVGhlIGV4dGVybmFsIGludGVnZXIKLSAqICAgaF9lcnJubyBtYXkgdGhlbiAgYmUgY2hlY2tlZCAgdG8gIHNlZSAgd2hldGhlciAgdGhpcyAgaXMgIGEKLSAqICAgdGVtcG9yYXJ5ICBmYWlsdXJlICBvciAgYW4gIGludmFsaWQgIG9yICB1bmtub3duICBob3N0LiAgVGhlCi0gKiAgIHJvdXRpbmUgaGVycm9yICBjYW4gIGJlICB1c2VkICB0byAgcHJpbnQgIGFuIGVycm9yICBtZXNzYWdlCi0gKiAgIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUuICBJZiBpdHMgYXJndW1lbnQgc3RyaW5nIGlzIG5vbi1OVUxMLAotICogICBpdCBpcyBwcmludGVkLCBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZCBhIHNwYWNlLiAgIFRoZSAgZXJyb3IKLSAqICAgbWVzc2FnZSBpcyBwcmludGVkIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLgotICoKLSAqICAgaF9lcnJubyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqCi0gKiAgICAgSE9TVF9OT1RfRk9VTkQgIE5vIHN1Y2ggaG9zdCBpcyBrbm93bi4KLSAqCi0gKiAgICAgVFJZX0FHQUlOCVRoaXMgaXMgdXN1YWxseSBhIHRlbXBvcmFyeSBlcnJvciBhbmQKLSAqCQkJCQltZWFucyAgIHRoYXQgIHRoZSAgbG9jYWwgIHNlcnZlciAgZGlkICBub3QKLSAqCQkJCQlyZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSAgYW4gIGF1dGhvcml0YXRpdmUKLSAqCQkJCQlzZXJ2ZXIuICAgQSAgcmV0cnkgYXQgc29tZSBsYXRlciB0aW1lIG1heQotICoJCQkJCXN1Y2NlZWQuCi0gKgotICogICAgIE5PX1JFQ09WRVJZCVNvbWUgdW5leHBlY3RlZCBzZXJ2ZXIgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQuCi0gKgkgCQkJCVRoaXMgaXMgYSBub24tcmVjb3ZlcmFibGUgZXJyb3IuCi0gKgotICogICAgIE5PX0RBVEEJCVRoZSByZXF1ZXN0ZWQgbmFtZSBpcyB2YWxpZCBidXQgIGRvZXMgIG5vdAotICoJCQkJCWhhdmUgICBhbiBJUCAgYWRkcmVzczsgIHRoaXMgIGlzIG5vdCAgYQotICoJCQkJCXRlbXBvcmFyeSBlcnJvci4gVGhpcyBtZWFucyB0aGF0IHRoZSAgbmFtZQotICoJCQkJCWlzIGtub3duICB0byB0aGUgbmFtZSBzZXJ2ZXIgYnV0IHRoZXJlIGlzCi0gKgkJCQkJbm8gYWRkcmVzcyAgYXNzb2NpYXRlZCAgd2l0aCAgdGhpcyAgbmFtZS4KLSAqCQkJCQlBbm90aGVyIHR5cGUgb2YgcmVxdWVzdCB0byB0aGUgbmFtZSBzZXJ2ZXIKLSAqCQkJCQl1c2luZyB0aGlzIGRvbWFpbiBuYW1lIHdpbGwgcmVzdWx0IGluICBhbgotICoJCQkJCWFuc3dlcjsgIGZvciBleGFtcGxlLCBhIG1haWwtZm9yd2FyZGVyIG1heQotICoJCQkJCWJlIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZG9tYWluLgotICoJCQkJCShOT1QgR0VORVJBVEVEIEJZIFRISVMgSU1QTEVNRU5UQVRJT04pCi0gKi8KLQotc3RhdGljIHN0cnVjdCBob3N0SW5mbyBtYWNIb3N0OwotCi0jZGVmaW5lIE1BWEFMSUFTRVMgMAotc3RhdGljIGNoYXIgKmFsaWFzUHRyc1tNQVhBTElBU0VTKzFdID0ge05VTEx9Owotc3RhdGljIGlwX2FkZHIgKmFkZHJQdHJzW05VTV9BTFRfQUREUlMrMV07Ci0KLXN0YXRpYyBzdHJ1Y3QgaG9zdGVudCAgdW5peEhvc3QgPQotewotCW1hY0hvc3QuY25hbWUsCi0JYWxpYXNQdHJzLAotCUFGX0lORVQsCi0Jc2l6ZW9mKGlwX2FkZHIpLAotCShjaGFyICoqKSBhZGRyUHRycwotfTsKLQotaW5saW5lIHN0cnVjdCBpbl9hZGRyIG1ha2VfaW5fYWRkcihpcF9hZGRyIGFkZHIpCi17Ci0Jc3RydWN0IGluX2FkZHIJcmVzOwotCi0JcmVzLnNfYWRkcgk9CWFkZHI7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdHJ1Y3QgaG9zdGVudCAqIGdldGhvc3RieW5hbWUoY2hhciAqbmFtZSkKLXsKLQlCb29sZWFuIGRvbmU7Ci0JaW50IGk7Ci0KLQlpZiAoIXN0cmNtcChuYW1lLCAibG9jYWxob3N0IikpIHsKLQkJaW5fYWRkciBpcGFkZHI7Ci0KLQkJaXBhZGRyCT0JbWFrZV9pbl9hZGRyKGlwX2FkZHIoZ2V0aG9zdGlkKCkpKTsKLQotCQlpZiAoaXBhZGRyLnNfYWRkcikKLQkJCXJldHVybiBnZXRob3N0YnlhZGRyKChjaGFyICopICZpcGFkZHIsIHNpemVvZihpbl9hZGRyKSwgQUZfSU5FVCk7Ci0KLQkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOwotCQkJCi0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgewotCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUzsgaSsrKQotCQltYWNIb3N0LmFkZHJbaV0gPSAwOwotCi0JZG9uZSA9IGZhbHNlOwotCi0JaWYgKFN0clRvQWRkcihuYW1lLCAmbWFjSG9zdCwgUmVzdWx0VVBQKCZ1RE5SRG9uZSksIChjaGFyICopICZkb25lKSA9PSBjYWNoZUZhdWx0KQotCQlTUElOUCghZG9uZSxTUF9OQU1FLDBMKTsKLQotCXN3aXRjaCAobWFjSG9zdC5ydG5Db2RlKSB7Ci0JY2FzZSBub0VycjogYnJlYWs7Ci0KLQljYXNlIG5hbWVTeW50YXhFcnI6CWhfZXJybm8gPSBIT1NUX05PVF9GT1VORDsJcmV0dXJuKE5VTEwpOwotCWNhc2UgY2FjaGVGYXVsdDoJCWhfZXJybm8gPSBOT19SRUNPVkVSWTsJCXJldHVybihOVUxMKTsKLQljYXNlIG5vUmVzdWx0UHJvYzoJaF9lcnJubyA9IE5PX1JFQ09WRVJZOwkJcmV0dXJuKE5VTEwpOwotCWNhc2Ugbm9OYW1lU2VydmVyOgloX2Vycm5vID0gSE9TVF9OT1RfRk9VTkQ7CXJldHVybihOVUxMKTsKLQljYXNlIGF1dGhOYW1lRXJyOgkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOwlyZXR1cm4oTlVMTCk7Ci0JY2FzZSBub0Fuc0VycjoJCQloX2Vycm5vID0gVFJZX0FHQUlOOwkJCXJldHVybihOVUxMKTsKLQljYXNlIGRuckVycjoJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7Ci0JY2FzZSBvdXRPZk1lbW9yeToJCWhfZXJybm8gPSBUUllfQUdBSU47CQkJcmV0dXJuKE5VTEwpOwotCWRlZmF1bHQ6CQkJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogd2FzIHRoZSAnbmFtZScgYW4gSVAgYWRkcmVzcz8gKi8KLQlpZiAobWFjSG9zdC5jbmFtZVswXSA9PSAwKSB7Ci0JCWhfZXJybm8gPSBIT1NUX05PVF9GT1VORDsKLQkJcmV0dXJuKE5VTEwpOwotCX0KLQotCS8qIGZvciBzb21lIHJlYXNvbiB0aGVyZSBpcyBhIGRvdCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lICovCi0JaSA9IGludChzdHJsZW4obWFjSG9zdC5jbmFtZSkpIC0gMTsKLQlpZiAobWFjSG9zdC5jbmFtZVtpXSA9PSAnLicpCi0JCW1hY0hvc3QuY25hbWVbaV0gPSAwOwotCi0JZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUyAmJiBtYWNIb3N0LmFkZHJbaV0hPTA7IGkrKykKLQkJYWRkclB0cnNbaV0gPQkoaXBfYWRkciAqKSAmbWFjSG9zdC5hZGRyW2ldOwotCi0JYWRkclB0cnNbaV0gPSBOVUxMOwotCi0JcmV0dXJuICZ1bml4SG9zdDsKLX0KLQotc3RydWN0IGhvc3RlbnQgKiBnZXRob3N0YnlhZGRyKGNvbnN0IGNoYXIgKmFkZHJQLCBpbnQsIGludCkKLXsKLQlCb29sZWFuCWRvbmU7Ci0JaW50IAkJaTsKLQotCWlmIChJTkVUU29ja2V0cy5SZXNvbHZlcigpKSB7Ci0JCWhfZXJybm8gPSBOT19SRUNPVkVSWTsJCi0JCXJldHVybiBOVUxMOwotCX0KLQotCWZvciAoaT0wOyBpPE5VTV9BTFRfQUREUlM7IGkrKykKLQkJbWFjSG9zdC5hZGRyW2ldID0gMDsKLQotCWRvbmUgPSBmYWxzZTsKLQotCWlwX2FkZHIgYWRkciA9IEZJWF9MT09QQkFDSygqKGlwX2FkZHIgKilhZGRyUCk7Ci0JCi0JaWYgKEFkZHJUb05hbWUoYWRkciwgJm1hY0hvc3QsIFJlc3VsdFVQUCgmdUROUkRvbmUpLCAoY2hhciAqKSAmZG9uZSkgPT0gY2FjaGVGYXVsdCkKLQkJU1BJTlAoIWRvbmUsU1BfQUREUiwwTCk7Ci0KLQlzd2l0Y2ggKG1hY0hvc3QucnRuQ29kZSkgewotCWNhc2Ugbm9FcnI6IAkJCWJyZWFrOwotCi0JY2FzZSBjYWNoZUZhdWx0OgkJaF9lcnJubyA9IE5PX1JFQ09WRVJZOwkJcmV0dXJuKE5VTEwpOwotCWNhc2Ugbm9OYW1lU2VydmVyOgloX2Vycm5vID0gSE9TVF9OT1RfRk9VTkQ7CXJldHVybihOVUxMKTsKLQljYXNlIGF1dGhOYW1lRXJyOgkJaF9lcnJubyA9IEhPU1RfTk9UX0ZPVU5EOwlyZXR1cm4oTlVMTCk7Ci0JY2FzZSBub0Fuc0VycjoJCQloX2Vycm5vID0gVFJZX0FHQUlOOwkJCXJldHVybihOVUxMKTsKLQljYXNlIGRuckVycjoJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7Ci0JY2FzZSBvdXRPZk1lbW9yeToJCWhfZXJybm8gPSBUUllfQUdBSU47CQkJcmV0dXJuKE5VTEwpOwotCWRlZmF1bHQ6CQkJCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQlyZXR1cm4oTlVMTCk7Ci0JfQotCi0JLyogZm9yIHNvbWUgcmVhc29uIHRoZXJlIGlzIGEgZG90IGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUgKi8KLQlpID0gaW50KHN0cmxlbihtYWNIb3N0LmNuYW1lKSkgLSAxOwotCWlmIChtYWNIb3N0LmNuYW1lW2ldID09ICcuJykKLQkJbWFjSG9zdC5jbmFtZVtpXSA9IDA7Ci0KLQkvKiBGb3Igc29tZSByZWFzb24sIHRoZSBJUCBhZGRyZXNzIHVzdWFsbHkgc2VlbXMgdG8gYmUgc2V0IHRvIDAgKi8KLQlpZiAoIW1hY0hvc3QuYWRkclswXSkKLQkJbWFjSG9zdC5hZGRyWzBdID0gYWRkcjsKLQkJCi0JZm9yIChpPTA7IGk8TlVNX0FMVF9BRERSUzsgaSsrKQotCQlhZGRyUHRyc1tpXSA9IChpcF9hZGRyICopICZtYWNIb3N0LmFkZHJbaV07Ci0KLQlhZGRyUHRyc1tOVU1fQUxUX0FERFJTXSA9IE5VTEw7Ci0KLQlyZXR1cm4gJnVuaXhIb3N0OwotfQotCi1jaGFyICogaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluYWRkcikKLXsKLQlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgewotCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JKHZvaWQpIEFkZHJUb1N0cihpbmFkZHIuc19hZGRyLCBtYWNIb3N0LmNuYW1lKTsKLQotCXJldHVybiBtYWNIb3N0LmNuYW1lOwotfQotCi1zdHJ1Y3QgaW5fYWRkciBpbmV0X2FkZHIoY2hhciAqYWRkcmVzcykKLXsKLQlpZiAoSU5FVFNvY2tldHMuUmVzb2x2ZXIoKSkgewotCQloX2Vycm5vID0gTk9fUkVDT1ZFUlk7CQotCQlyZXR1cm4gbWFrZV9pbl9hZGRyKDB4RkZGRkZGRkYpOwotCX0KLQkKLQlpZiAoU3RyVG9BZGRyKGFkZHJlc3MsJm1hY0hvc3QsTlVMTCxOVUxMKSAhPSBub0VycikKLQkJcmV0dXJuIG1ha2VfaW5fYWRkcigweEZGRkZGRkZGKTsKLQotCS8qIHdhcyB0aGUgJ2FkZHJlc3MnIHJlYWxseSBhIG5hbWU/ICovCi0JaWYgKG1hY0hvc3QuY25hbWVbMF0gIT0gMCkKLQkJcmV0dXJuIG1ha2VfaW5fYWRkcigweEZGRkZGRkZGKTsKLQotCXJldHVybiBtYWtlX2luX2FkZHIobWFjSG9zdC5hZGRyWzBdKTsKLX0KLQotLyoKLSAqIGdldGhvc3RpZCgpCi0gKgotICogR2V0IGludGVybmV0IGFkZHJlc3Mgb2YgY3VycmVudCBob3N0Ci0gKi8KLQotbG9uZyBnZXRob3N0aWQoKQotewotCXN0YXRpYyBsb25nIHNIb3N0SUQgPSAwOwotCWlmIChzSG9zdElEKQotCQlyZXR1cm4gc0hvc3RJRDsKLQkKLQlzdHJ1Y3QgR2V0QWRkclBhcmFtQmxvY2sgcGJyOwotCQkKLQlwYnIuaW9DUmVmTnVtIAk9IElORVRTb2NrZXRzLkRyaXZlcigpOwotCXBici5jc0NvZGUgCQk9IGlwY3RsR2V0QWRkcjsKLQotCWlmIChQQkNvbnRyb2xTeW5jKFBhcm1CbGtQdHIoJnBicikpKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiBzSG9zdElEID0gKGxvbmcpcGJyLm91ckFkZHJlc3M7Ci19Ci0KLS8qCi0gKiBnZXRob3N0bmFtZSgpCi0gKgotICogVHJ5IHRvIGdldCBteSBob3N0IG5hbWUgZnJvbSBETlIuIElmIGl0IGZhaWxzLCBqdXN0IHJldHVybiBteQotICogSVAgYWRkcmVzcyBhcyBBU0NJSS4gVGhpcyBpcyBub24tc3RhbmRhcmQsIGJ1dCBpdCdzIGEgbWFjLAotICogd2hhdCBkbyB5b3Ugd2FudCBtZSB0byBkbz8KLSAqLwotCi1pbnQgZ2V0aG9zdG5hbWUoY2hhciAqbWFjaG5hbWUsIGludCBidWZsZW4pCi17Ci0Jc3RhdGljIGNoYXIgKiBzSG9zdE5hbWUgPSBuaWw7Ci0JCi0JaWYgKCFzSG9zdE5hbWUpIHsKLQkJaW5fYWRkciBpcGFkZHI7Ci0JCXN0cnVjdAlob3N0ZW50ICpocDsKLQotCQlpcGFkZHIJPQltYWtlX2luX2FkZHIoaXBfYWRkcihnZXRob3N0aWQoKSkpOwotCi0JCWlmICghaXBhZGRyLnNfYWRkcikgCQkJCQkvLyBUQ1AvSVAgbm90IHVwIGF0IGFsbAotCQkJcmV0dXJuIEdVU0lfZXJyb3IoRU5FVERPV04pOwotCQkKLQkJaHAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopICZpcGFkZHIsIHNpemVvZihpbl9hZGRyKSwgQUZfSU5FVCk7Ci0KLQkJaWYgKCFocCkgewotCQkJLy8gTm8gZ29vZCBuYW1lCi0JCQlpZiAoYnVmbGVuIDwgMTYpCQkJCQkJLy8gTm90IGVub3VnaCBzcGFjZQotCQkJCXJldHVybiBHVVNJX2Vycm9yKEVJTlZBTCk7CQotCQkJc3ByaW50ZihtYWNobmFtZSwgIiVkLiVkLiVkLiVkIiwKLQkJCQkJCQlpcGFkZHIuc19hZGRyPj4yNCwKLQkJCQkJCQlpcGFkZHIuc19hZGRyPj4xNiAmIDB4ZmYsCi0JCQkJCQkJaXBhZGRyLnNfYWRkcj4+OCAmIDB4ZmYsCi0JCQkJCQkJaXBhZGRyLnNfYWRkciAmIDB4ZmYpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXZSBvbmx5IGNhY2hlIHNhdGlzZmFjdG9yeSByZXBsaWVzIGluIHNIb3N0TmFtZQotCQkJc0hvc3ROYW1lID0gbmV3IGNoYXJbc3RybGVuKGhwLT5oX25hbWUpKzFdOwotCQkJc3RyY3B5KHNIb3N0TmFtZSwgaHAtPmhfbmFtZSk7Ci0JCX0KLQl9Ci0Jc3RybmNweShtYWNobmFtZSwgc0hvc3ROYW1lLCB1bnNpZ25lZChidWZsZW4pKTsKLQltYWNobmFtZVtidWZsZW4tMV0gPSAwOyAgLyogZXh0cmEgc2FmZWd1YXJkICovCi0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICoJZ2V0c2VydmJ5Ym5hbWUoKQotICoKLSAqLwotCi1zdGF0aWMgY2hhciAqIHNlcnZsaXN0W10gPQotewotCSJlY2hvICAgCQkgIDcvdWRwIiwKLQkiZGlzY2FyZCAgIAkgIDkvdWRwIiwKLQkidGltZSAgIAkJIDM3L3VkcCIsCi0JImRvbWFpbiAgIAkgNTMvdWRwIiwKLQkic3VucnBjICAgCTExMS91ZHAiLAotCSJ0ZnRwICAJCSA2OS91ZHAiLAotCSJiaWZmICAgCQk1MTIvdWRwIiwKLQkid2hvICAgCQk1MTMvdWRwIiwKLQkidGFsayAgIAkJNTE3L3VkcCIsCi0JImZ0cC1kYXRhICAJIDIwL3RjcCIsCi0JImZ0cCAgCQkgMjEvdGNwIiwKLQkidGVsbmV0ICAJIDIzL3RjcCIsCi0JInNtdHAgIAkJIDI1L3RjcCIsCi0JInRpbWUgIAkJIDM3L3RjcCIsCi0JIndob2lzICAJCSA0My90Y3AiLAotCSJkb21haW4gCSAJIDUzL3RjcCIsCi0JImhvc3RuYW1lcyAgMTAxL3RjcCIsCi0JIm5udHAgICAJCTExOS90Y3AiLAotCSJmaW5nZXIgIAkgNzkvdGNwIiwKLQkibnRwICAgCQkxMjMvdGNwIiwKLQkidXVjcCAgIAkJNTQwL3RjcCIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNoYXIgCQkJCXNlcnZsaW5lWzEyOF07Ci1zdGF0aWMgc3RydWN0IHNlcnZlbnQJc2VydjsKLXN0YXRpYyBGSUxFICogCQkJCXNlcnZmaWw7Ci1zdGF0aWMgaW50CQkJCQlzZXJ2cHRyOwotc3RhdGljIGNoYXIgKgkJCQlzZXJ2YWxpYXNbOF07Ci1zdGF0aWMgaW50CQkJCQlzZXJ2c3RheSA9IDA7Ci0KLXZvaWQgc2V0c2VydmVudChpbnQgc3RheW9wZW4pCi17Ci0JaWYgKHNlcnZmaWwgJiYgc2VydmZpbCAhPSAoRklMRSAqKSAtMSkgewotCQlyZXdpbmQoc2VydmZpbCk7Ci0JfQotCXNlcnZwdHIJPSAwOwotCXNlcnZzdGF5ID0gc2VydnN0YXkgfHwgc3RheW9wZW47Ci19Ci0KLXZvaWQgZW5kc2VydmVudCgpCi17Ci0JaWYgKHNlcnZmaWwgJiYgc2VydmZpbCAhPSAoRklMRSAqKSAtMSkgewotCQlmY2xvc2Uoc2VydmZpbCk7Ci0JCXNlcnZmaWwgPSBOVUxMOwotCX0KLQkKLQlzZXJ2c3RheSA9IDA7Ci19Ci0KLXN0cnVjdCBzZXJ2ZW50ICogIGdldHNlcnZlbnQoKQotewotCWNoYXIgKglwOwotCWludAkJYWxpYXNjb3VudDsKLQkKLQlpZiAoIXNlcnZmaWwpIHsKLQkJVEZpbGVTcGVjIHNlcnY7Ci0JCQotCQlpZiAoIUZpbmRGb2xkZXIoCi0JCQkJa09uU3lzdGVtRGlzaywgCi0JCQkJa1ByZWZlcmVuY2VzRm9sZGVyVHlwZSwgCi0JCQkJa0RvbnRDcmVhdGVGb2xkZXIsIAotCQkJCSZzZXJ2LnZSZWZOdW0sCi0JCQkJJnNlcnYucGFySUQpCi0JCSkgewotCQkJUExzdHJjcHkoc2Vydi5uYW1lLCAoU3RyaW5nUHRyKSAiXHAvZXRjL3NlcnZpY2VzIik7Ci0JCQotCQkJaWYgKHNlcnZmaWwgPSBmb3BlbihzZXJ2LkZ1bGxQYXRoKCksICJyIikpCi0JCQkJZ290byByZXRyeTsKLQkJfQkKLQkJc2VydmZpbCAJPSAoRklMRSAqKSAtMTsKLQkJc2VydnB0cgk9IDA7Ci0JfQotCQotcmV0cnk6Ci0JaWYgKHNlcnZmaWwgPT0gKEZJTEUgKikgLTEpCi0JCWlmICghc2Vydmxpc3Rbc2VydnB0cl0pCi0JCQlyZXR1cm4gKHN0cnVjdCBzZXJ2ZW50ICopIE5VTEw7Ci0JCWVsc2UKLQkJCXN0cmNweShzZXJ2bGluZSwgc2Vydmxpc3Rbc2VydnB0cisrXSk7Ci0JZWxzZSBpZiAoIShmZ2V0cyhzZXJ2bGluZSwgMTI4LCBzZXJ2ZmlsKSkpCi0JCXJldHVybiAoc3RydWN0IHNlcnZlbnQgKikgTlVMTDsKLQkJCi0JaWYgKHAgPSBzdHJwYnJrKHNlcnZsaW5lLCAiI1xuXHIiKSkKLQkJKnAgPSAwOwotCWlmICghc2VydmxpbmVbMF0pCi0JCWdvdG8gcmV0cnk7Ci0JCi0JaWYgKCEoc2Vydi5zX25hbWUgPSBzdHJ0b2soc2VydmxpbmUsICIgXHQiKSkpCi0JCWdvdG8gcmV0cnk7Ci0JCQotCWlmICghKHAgPSBzdHJ0b2soTlVMTCwgIiBcdCIpKSkKLQkJZ290byByZXRyeTsKLQkKLQlpZiAoIShzZXJ2LnNfcHJvdG8gPSBzdHJwYnJrKHAsICIvLCIpKSkKLQkJZ290byByZXRyeTsKLQkJCi0JKnNlcnYuc19wcm90bysrIAk9IDA7Ci0Jc2Vydi5zX3BvcnQgCQk9IGh0b25zKGF0b2kocCkpOwotCXNlcnYuc19hbGlhc2VzIAk9IHNlcnZhbGlhczsKLQkKLQlmb3IgKGFsaWFzY291bnQgPSAwOyBhbGlhc2NvdW50IDwgNzsgKSAKLQkJaWYgKCEoc2VydmFsaWFzW2FsaWFzY291bnQrK10gPSBzdHJ0b2soTlVMTCwgIiBcdCIpKSkKLQkJCWJyZWFrOwotCQotCXNlcnZhbGlhc1thbGlhc2NvdW50XSA9IE5VTEw7Ci0JCi0JcmV0dXJuICZzZXJ2OwotfQotCi1zdHJ1Y3Qgc2VydmVudCAqIGdldHNlcnZieW5hbWUoY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGNoYXIgKiBwcm90bykKLXsKLQlzdHJ1Y3Qgc2VydmVudCAqIAllbnQ7Ci0JY2hhciAqKiAJCQkJYWw7Ci0Jc2V0c2VydmVudCgwKTsKLQkKLQl3aGlsZSAoZW50ID0gZ2V0c2VydmVudCgpKSB7Ci0JCWlmICghc3RyY21wKG5hbWUsIGVudC0+c19uYW1lKSkKLQkJCWdvdG8gaGF2ZU5hbWU7Ci0JCQotCQlmb3IgKGFsID0gZW50LT5zX2FsaWFzZXM7ICphbDsgKythbCkKLQkJCWlmICghc3RyY21wKG5hbWUsICphbCkpCi0JCQkJZ290byBoYXZlTmFtZTsKLQkJCi0JCWNvbnRpbnVlOwotaGF2ZU5hbWU6Ci0JCWlmICghcHJvdG8gfHwgIXN0cmNtcChwcm90bywgZW50LT5zX3Byb3RvKSkKLQkJCWJyZWFrOwotCX0KLQkKLQlpZiAoIXNlcnZzdGF5KQotCQllbmRzZXJ2ZW50KCk7Ci0JCi0JcmV0dXJuIGVudDsKLX0KLQotc3RydWN0IHNlcnZlbnQgKiBnZXRzZXJ2Ynlwb3J0KGludCBwb3J0LCBjb25zdCBjaGFyICogcHJvdG8pCi17Ci0Jc3RydWN0IHNlcnZlbnQgKiBlbnQ7Ci0JCi0Jc2V0c2VydmVudCgwKTsKLQkKLQl3aGlsZSAoZW50ID0gZ2V0c2VydmVudCgpKQotCQlpZiAocG9ydCA9PSBlbnQtPnNfcG9ydCAmJiAoIXByb3RvIHx8ICFzdHJjbXAocHJvdG8sIGVudC0+c19wcm90bykpKQotCQkJYnJlYWs7Ci0JCi0JaWYgKCFzZXJ2c3RheSkKLQkJZW5kc2VydmVudCgpOwotCQotCXJldHVybiBlbnQ7Ci19Ci0KLXN0YXRpYwljaGFyCXRjcFtdID0gInRjcCI7Ci1zdGF0aWMJY2hhcgl1ZHBbXSA9ICJ1ZHAiOwotI2RlZmluZQlNQVhfUFJPVE9FTlQJCQkxMAotc3RhdGljIAlzdHJ1Y3QgcHJvdG9lbnQJCXByb3RvZW50c1tNQVhfUFJPVE9FTlRdOwotc3RhdGljIAlpbnQJCQkJCQlwcm90b2VudF9jb3VudD0wOwotCi1zdHJ1Y3QgcHJvdG9lbnQgKiBnZXRwcm90b2J5bmFtZShjb25zdCBjaGFyICogbmFtZSkKLXsKLQlzdHJ1Y3QgcHJvdG9lbnQgKnBlOwotCi0JcGUgPSAmcHJvdG9lbnRzW3Byb3RvZW50X2NvdW50XTsKLQlpZiAoc3RyY21wKG5hbWUsICJ1ZHAiKSA9PSAwKSB7Ci0JCXBlLT5wX25hbWUgPSB1ZHA7Ci0JCXBlLT5wX3Byb3RvID0gSVBQUk9UT19VRFA7Ci0JfSBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJ0Y3AiKSA9PSAwKSAgewotCQlwZS0+cF9uYW1lID0gdGNwOwotCQlwZS0+cF9wcm90byA9IElQUFJPVE9fVENQOwotCX0gZWxzZSB7Ci0JCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGUtPnBfYWxpYXNlcyA9IGFsaWFzUHRyczsKLQlwcm90b2VudF9jb3VudCA9IChwcm90b2VudF9jb3VudCArMSkgJSBNQVhfUFJPVE9FTlQ7Ci0JcmV0dXJuIHBlOwotfQotCi1zdHJ1Y3QgcHJvdG9lbnQgKiBnZXRwcm90b2J5bnVtYmVyKGludCBwcm90bykKLXsKLQlzdHJ1Y3QgcHJvdG9lbnQgKnBlOwotCi0JcGUgPSAmcHJvdG9lbnRzW3Byb3RvZW50X2NvdW50XTsKLQlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApIHsKLQkJcGUtPnBfbmFtZSA9IHVkcDsKLQkJcGUtPnBfcHJvdG8gPSBJUFBST1RPX1VEUDsKLQl9IGVsc2UgaWYgKHByb3RvID09IElQUFJPVE9fVENQKSAgewotCQlwZS0+cF9uYW1lID0gdGNwOwotCQlwZS0+cF9wcm90byA9IElQUFJPVE9fVENQOwotCX0gZWxzZSB7Ci0JCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGUtPnBfYWxpYXNlcyA9IGFsaWFzUHRyczsKLQlwcm90b2VudF9jb3VudCA9IChwcm90b2VudF9jb3VudCArMSkgJSBNQVhfUFJPVE9FTlQ7Ci0JcmV0dXJuIHBlOwotfQotCmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJU0lPVVguY3AgYi9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJU0lPVVguY3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2ZjNjUuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL0dVU0kxLW1vZHMvR1VTSVNJT1VYLmNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgdW5pZmllZCBzb2NrZXQgaW50ZXJmYWNlCi1GaWxlCQk6CUdVU0lTSU9VWC5jcAktCUludGVyZmFjZSB0byBNZXRyb3dlcmtzIFNJT1VYIGxpYnJhcnkKLUF1dGhvcgk6CU1hdHRoaWFzIE5lZXJhY2hlcgotTGFuZ3VhZ2UJOglNUFcgQy9DKysKLQotJExvZyQKLVJldmlzaW9uIDEuMSAgMjAwMC8wOS8xMiAyMDoyNDo0OSAgamFjawotTW92ZWQgdG8gVW5zdXBwb3J0ZWQuCi0KLVJldmlzaW9uIDEuMSAgMTk5OC8wOC8xOCAxNDo1MjozOCAgamFjawotUHV0dGluZyBQeXRob24tc3BlY2lmaWMgR1VTSSBtb2RpZmljYXRpb25zIHVuZGVyIENWUy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8R1VTSUZpbGVfUC5oPgotI2luY2x1ZGUgPGlvY3RsLmg+Ci0jaW5jbHVkZSA8Y29uc29sZS5oPgotCi0jaW5jbHVkZSA8RXZlbnRzLmg+Ci0jaW5jbHVkZSA8TG93TWVtLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogU0lPVVhTb2NrZXQgbWVtYmVycyAqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgZGVjbGFyYXRpb24gbGllcyBhYm91dCB0aGUgcmV0dXJuIHR5cGUgKi8KLWV4dGVybiAiQyIgdm9pZCBTSU9VWEhhbmRsZU9uZUV2ZW50KEV2ZW50UmVjb3JkICp1c2VyZXZlbnQpOwotCi1HVVNJRXZ0SGFuZGxlcglHVVNJU0lPVVhFdmVudHNbXQk9CXsKLQlTSU9VWEhhbmRsZU9uZUV2ZW50LAkJLy8gbnVsbEV2ZW50Ci0JCi0JU0lPVVhIYW5kbGVPbmVFdmVudCwJCS8vIG1vdXNlRG93bgotCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyBtb3VzZVVwCi0JbmlsLAkJCQkJCQkvLyBrZXlEb3duCi0JbmlsLAotCQotCW5pbCwJCQkJCQkJLy8gYXV0b0tleQotCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyB1cGRhdGVFdnQKLQlTSU9VWEhhbmRsZU9uZUV2ZW50LAkJLy8gZGlza0V2dAotCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyBhY3RpdmF0ZUV2dAotCQotCW5pbCwKLQluaWwsCi0JbmlsLAotCW5pbCwKLQkKLQluaWwsCi0JbmlsLAotCVNJT1VYSGFuZGxlT25lRXZlbnQsCQkvLyBvc0V2dAotCW5pbCwKLQkKLQluaWwsCi0JbmlsLAotCW5pbCwKLQluaWwsCi0JCi0JbmlsLAotCW5pbCwKLQluaWwsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIERlY2xhcmF0aW9uIG9mIFNJT1VYU29ja2V0ICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2xhc3MgU0lPVVhTb2NrZXQgOiBwdWJsaWMgU29ja2V0CXsJCQotCWZyaWVuZCBjbGFzcyBTSU9VWFNvY2tldERvbWFpbjsJCi0JCi0JCQkJCVNJT1VYU29ja2V0KCk7Ci0JCQkJCQotCXZpcnR1YWwgCQl+U0lPVVhTb2NrZXQoKTsKLXByb3RlY3RlZDoKLQlpbnQJCQlpbml0aWFsaXplZDsKLQl2b2lkCQkJRG9Jbml0aWFsaXplKHZvaWQpOwotcHVibGljOgotCXZpcnR1YWwgaW50CXJlYWQodm9pZCAqIGJ1ZmZlciwgaW50IGJ1Zmxlbik7Ci0JdmlydHVhbCBpbnQgd3JpdGUodm9pZCAqIGJ1ZmZlciwgaW50IGJ1Zmxlbik7Ci0JdmlydHVhbCBpbnQgc2VsZWN0KEJvb2xlYW4gKiBjYW5SZWFkLCBCb29sZWFuICogY2FuV3JpdGUsIEJvb2xlYW4gKiBleGNlcHRpb24pOwotCXZpcnR1YWwgaW50CWlvY3RsKHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICphcmdwKTsKLQl2aXJ0dWFsIGludAlpc2F0dHkoKTsKLX07CQotCi1jbGFzcyBTSU9VWFNvY2tldERvbWFpbiA6IHB1YmxpYyBGaWxlU29ja2V0RG9tYWluIHsKLQlTSU9VWFNvY2tldCAqCXNpbmdsZXRvbjsKLXB1YmxpYzoKLQlTSU9VWFNvY2tldERvbWFpbigpCToJRmlsZVNvY2tldERvbWFpbihBRl9VTlNQRUMsIHRydWUsIGZhbHNlKSwgc2luZ2xldG9uKG5pbCkJewl9Ci0JCi0JdmlydHVhbCBCb29sZWFuIFlvdXJzKGNvbnN0IEdVU0lGaWxlUmVmICYgcmVmLCBSZXF1ZXN0IHJlcXVlc3QpOwotCXZpcnR1YWwgU29ja2V0ICogb3Blbihjb25zdCBHVVNJRmlsZVJlZiAmIHJlZiwgaW50IG9mbGFnKTsKLX07Ci0KLSNpZiBHRU5FUkFUSU5HNjhLCi0jcHJhZ21hIHNlZ21lbnQgU0lPVVgKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIFNJT1VYU29ja2V0IG1lbWJlcnMgKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFNJT1VYU29ja2V0OjpEb0luaXRpYWxpemUoKQotewotCWlmICggaW5pdGlhbGl6ZWQgKSByZXR1cm47Ci0JaW5pdGlhbGl6ZWQrKzsKLQlJbnN0YWxsQ29uc29sZSgwKTsKLQlHVVNJU2V0RXZlbnRzKEdVU0lTSU9VWEV2ZW50cyk7Ci19Ci0KLVNJT1VYU29ja2V0OjpTSU9VWFNvY2tldCgpCi17Ci0JaW5pdGlhbGl6ZWQgPSAwOwotCWlmICggIUdVU0lDb25maWcuRGVsYXlDb25zb2xlKCkgKQotCQlEb0luaXRpYWxpemUoKTsKLX0KLQotU0lPVVhTb2NrZXQ6On5TSU9VWFNvY2tldCgpCi17Ci0JUmVtb3ZlQ29uc29sZSgpOwotfQotCi1pbnQgU0lPVVhTb2NrZXQ6OmlvY3RsKHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICopCi17Ci0JaWYgKCAhaW5pdGlhbGl6ZWQpIERvSW5pdGlhbGl6ZSgpOwotCXN3aXRjaCAocmVxdWVzdCkJewotCWNhc2UgRklPSU5URVJBQ1RJVkU6Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBHVVNJX2Vycm9yKEVPUE5PVFNVUFApOwotCX0KLX0KLQotaW50IFNJT1VYU29ja2V0OjpyZWFkKHZvaWQgKiBidWZmZXIsIGludCBidWZsZW4pCi17Ci0JaWYgKCAhaW5pdGlhbGl6ZWQpIERvSW5pdGlhbGl6ZSgpOwotCWZmbHVzaChzdGRvdXQpOwotCQotCXJldHVybiBSZWFkQ2hhcnNGcm9tQ29uc29sZSgoY2hhciAqKSBidWZmZXIsIGJ1Zmxlbik7Ci19Ci0KLWludCBTSU9VWFNvY2tldDo6d3JpdGUodm9pZCAqIGJ1ZmZlciwgaW50IGJ1ZmxlbikKLXsKLQlpZiAoICFpbml0aWFsaXplZCkgRG9Jbml0aWFsaXplKCk7Ci0JcmV0dXJuIFdyaXRlQ2hhcnNUb0NvbnNvbGUoKGNoYXIgKikgYnVmZmVyLCBidWZsZW4pOwotfQotCi1zdGF0aWMgQm9vbGVhbiBpbnB1dF9wZW5kaW5nKCkKLXsKLQlRSGRyUHRyIGV2ZW50UXVldWUgPSBMTUdldEV2ZW50UXVldWUoKTsKLQlFdlFFbFB0ciBlbGVtZW50ID0gKEV2UUVsUHRyKWV2ZW50UXVldWUtPnFIZWFkOwotCQotCS8vIG5vdywgY291bnQgdGhlIG51bWJlciBvZiBwZW5kaW5nIGtleURvd24gZXZlbnRzLgotCXdoaWxlIChlbGVtZW50ICE9IG5pbCkgewotCQlpZiAoZWxlbWVudC0+ZXZ0UVdoYXQgPT0ga2V5RG93biB8fCBlbGVtZW50LT5ldnRRV2hhdCA9PSBhdXRvS2V5KQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsZW1lbnQgPSAoRXZRRWxQdHIpZWxlbWVudC0+cUxpbms7Ci0JfQotCQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IFNJT1VYU29ja2V0OjpzZWxlY3QoQm9vbGVhbiAqIGNhblJlYWQsIEJvb2xlYW4gKiBjYW5Xcml0ZSwgQm9vbGVhbiAqIGV4Y2VwdGlvbikKLXsKLQlpbnQJCWdvb2RpZXMgCT0gCTA7Ci0JCQotCWlmICggIWluaXRpYWxpemVkKSBEb0luaXRpYWxpemUoKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQkKLQlpZiAoY2FuUmVhZCkgCi0JCWlmICgqY2FuUmVhZCA9IGlucHV0X3BlbmRpbmcoKSkKLQkJCSsrZ29vZGllczsKLQkKLQlpZiAoY2FuV3JpdGUpIHsKLQkJKmNhbldyaXRlID0gdHJ1ZTsKLQkJKytnb29kaWVzOwotCX0KLQkKLQlpZiAoZXhjZXB0aW9uKQotCQkqZXhjZXB0aW9uID0gZmFsc2U7Ci0JCi0JcmV0dXJuIGdvb2RpZXM7Ci19Ci0KLWludCBTSU9VWFNvY2tldDo6aXNhdHR5KCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTSU9VWFNvY2tldERvbWFpbiBtZW1iZXJzICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBNU0xHVVNJCi0jaWZuZGVmIFNGSU9HVVNJCi0JZXh0ZXJuIHZvaWQgR1VTSVNldHVwTVNMU0lPVVgoKTsKLSNlbmRpZgotI2VuZGlmCi0KLWV4dGVybiAiQyIgdm9pZCBHVVNJd2l0aFNJT1VYU29ja2V0cygpCi17Ci0Jc3RhdGljIFNJT1VYU29ja2V0RG9tYWluCVNJT1VYU29ja2V0czsKLQlTSU9VWFNvY2tldHMuRG9udFN0cmlwKCk7Ci0jaWZkZWYgTVNMR1VTSQotI2lmbmRlZiBTRklPR1VTSQotCUdVU0lTZXR1cE1TTFNJT1VYKCk7Ci0jZW5kaWYKLSNlbmRpZgotfQotCi1Cb29sZWFuIFNJT1VYU29ja2V0RG9tYWluOjpZb3Vycyhjb25zdCBHVVNJRmlsZVJlZiAmIHJlZiwgRmlsZVNvY2tldERvbWFpbjo6UmVxdWVzdCByZXF1ZXN0KQotewotCWlmIChyZWYuc3BlYyB8fCAocmVxdWVzdCAhPSB3aWxsT3BlbiAmJiByZXF1ZXN0ICE9IHdpbGxTdGF0KSkKLQkJcmV0dXJuIGZhbHNlOwotCQotCXN3aXRjaCAocmVmLm5hbWVbNF0gfCAweDIwKSB7Ci0JY2FzZSAncyc6Ci0JCWlmICgocmVmLm5hbWVbNV0gfCAweDIwKSAhPSAndCcgfHwgKHJlZi5uYW1lWzZdIHwgMHgyMCkgIT0gJ2QnKQotCQkJcmV0dXJuIGZhbHNlOwotCQlzd2l0Y2ggKHJlZi5uYW1lWzddIHwgMHgyMCkgewotCQljYXNlICdpJzoKLQkJCWlmICgocmVmLm5hbWVbOF0gfCAweDIwKSAhPSAnbicgfHwgcmVmLm5hbWVbOV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCWNhc2UgJ28nOgotCQkJaWYgKChyZWYubmFtZVs4XSB8IDB4MjApICE9ICd1JyB8fCAocmVmLm5hbWVbOV0gfCAweDIwKSAhPSAndCcgfHwgcmVmLm5hbWVbMTBdKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwotCQljYXNlICdlJzoKLQkJCWlmICgocmVmLm5hbWVbOF0gfCAweDIwKSAhPSAncicgfHwgKHJlZi5uYW1lWzldIHwgMHgyMCkgIT0gJ3InIHx8IHJlZi5uYW1lWzEwXSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCWNhc2UgJ2MnOgotCQlpZiAoCShyZWYubmFtZVs1XSB8IDB4MjApICE9ICdvJyB8fCAocmVmLm5hbWVbNl0gfCAweDIwKSAhPSAnbicKLQkJCXx8IChyZWYubmFtZVs3XSB8IDB4MjApICE9ICdzJyB8fCAocmVmLm5hbWVbOF0gfCAweDIwKSAhPSAnbycKLQkJCXx8IChyZWYubmFtZVs5XSB8IDB4MjApICE9ICdsJyB8fCAocmVmLm5hbWVbMTBdIHwgMHgyMCkgIT0gJ2UnKQotCQkJcmV0dXJuIGZhbHNlOwotCQlzd2l0Y2ggKHJlZi5uYW1lWzExXSkgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLVNvY2tldCAqIFNJT1VYU29ja2V0RG9tYWluOjpvcGVuKGNvbnN0IEdVU0lGaWxlUmVmICYsIGludCkKLXsKLQlpZiAoIXNpbmdsZXRvbikKLQkJc2luZ2xldG9uID0gbmV3IFNJT1VYU29ja2V0KCk7Ci0JKysqc2luZ2xldG9uOwotCQotCXJldHVybiBzaW5nbGV0b247Ci19CmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvR1VTSTEtbW9kcy9HVVNJX1AuaCBiL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0lfUC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmVlM2E3Li4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9HVVNJMS1tb2RzL0dVU0lfUC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb2plY3QJOglHVVNJCQkJCS0JR3JhbmQgVW5pZmllZCBTb2NrZXQgSW50ZXJmYWNlCi1GaWxlCQk6CUdVU0lfUC5oCQkJLQlQcml2YXRlIHN0dWZmCi1BdXRob3IJOglNYXR0aGlhcyBOZWVyYWNoZXIKLUxhbmd1YWdlCToJTVBXIEMvQysrCi0KLSRMb2ckCi1SZXZpc2lvbiAxLjEgIDIwMDAvMDkvMTIgMjA6MjQ6NDYgIGphY2sKLU1vdmVkIHRvIFVuc3VwcG9ydGVkLgotCi1SZXZpc2lvbiAxLjEgIDE5OTgvMDgvMTggMTQ6NTI6MzMgIGphY2sKLVB1dHRpbmcgUHl0aG9uLXNwZWNpZmljIEdVU0kgbW9kaWZpY2F0aW9ucyB1bmRlciBDVlMuCi0KLVJldmlzaW9uIDEuMyAgMTk5NC8xMi8zMSAgMDE6MzA6MjYgIG5lZXJpCi1SZW9yZ2FuaXplIGZpbGVuYW1lIGRpc3BhdGNoaW5nLgotCi1SZXZpc2lvbiAxLjIgIDE5OTQvMDgvMTAgIDAwOjQxOjA1ICBuZWVyaQotU2FuaXRpemVkIGZvciB1bml2ZXJzYWwgaGVhZGVycy4KLQotUmV2aXNpb24gMS4xICAxOTk0LzAyLzI1ICAwMjo1NzowMSAgbmVlcmkKLUluaXRpYWwgcmV2aXNpb24KLQotUmV2aXNpb24gMC4yMiAgMTk5My8wNy8xNyAgMDA6MDA6MDAgIG5lZXJpCi1HVVNJUmluZ0J1ZmZlcjo6cHJvYyAtPiBkZWZwcm9jCi0KLVJldmlzaW9uIDAuMjEgIDE5OTMvMDcvMTcgIDAwOjAwOjAwICBuZWVyaQotR1VTSU9fTUFYX0RPTUFJTiAtPiBBRl9NQVgKLQotUmV2aXNpb24gMC4yMCAgMTk5My8wNi8yNyAgMDA6MDA6MDAgIG5lZXJpCi1Tb2NrZXQ6OntwcmUscG9zdH1fc2VsZWN0Ci0KLVJldmlzaW9uIDAuMTkgIDE5OTMvMDYvMjcgIDAwOjAwOjAwICBuZWVyaQotU29ja2V0OjpmdHJ1bmNhdGUKLQotUmV2aXNpb24gMC4xOCAgMTk5My8wMi8wOSAgMDA6MDA6MDAgIG5lZXJpCi1Tb2NrZXQ6Omx1cmtpbmcsIFNvY2tldDo6bHVya2Rlc2NyCi0KLVJldmlzaW9uIDAuMTcgIDE5OTMvMDEvMzEgIDAwOjAwOjAwICBuZWVyaQotR1VTSUNvbmZpZ3VyYXRpb246OmRhZW1vbgotCi1SZXZpc2lvbiAwLjE2ICAxOTkzLzAxLzE3ICAwMDowMDowMCAgbmVlcmkKLURlc3RydWN0b3JzIGZvciBTb2NrZXRkb21haW4KLQotUmV2aXNpb24gMC4xNSAgMTk5My8wMS8xNyAgMDA6MDA6MDAgIG5lZXJpCi1TQUZFU1BJTgotCi1SZXZpc2lvbiAwLjE0ICAxOTkzLzAxLzAzICAwMDowMDowMCAgbmVlcmkKLUdVU0lDb25maWcKLQotUmV2aXNpb24gMC4xMyAgMTk5Mi8wOS8yNCAgMDA6MDA6MDAgIG5lZXJpCi1JbmNsdWRlIEdVU0lSc3JjX1AuaAotCi1SZXZpc2lvbiAwLjEyICAxOTkyLzA5LzEzICAwMDowMDowMCAgbmVlcmkKLVNQSU5WT0lEIGRpZG4ndCByZXR1cm4KLQotUmV2aXNpb24gMC4xMSAgMTk5Mi8wOC8zMCAgMDA6MDA6MDAgIG5lZXJpCi1BcHBsZVRhbGtJZGVudGl0eSgpCi0KLVJldmlzaW9uIDAuMTAgIDE5OTIvMDgvMDMgIDAwOjAwOjAwICBuZWVyaQotUmluZ0J1ZmZlcgotCi1SZXZpc2lvbiAwLjkgIDE5OTIvMDcvMzAgIDAwOjAwOjAwICBuZWVyaQotSW5pdGlhbGl6ZXIgRmVhdHVyZXMKLQotUmV2aXNpb24gMC44ICAxOTkyLzA3LzI2ICAwMDowMDowMCAgbmVlcmkKLVVuaXhTb2NrZXRzLmNob29zZSgpCi0KLVJldmlzaW9uIDAuNyAgMTk5Mi8wNy8xMyAgMDA6MDA6MDAgIG5lZXJpCi1NYWtlIEFwcGxlVGFsa1NvY2tldHMgZ2xvYmFsCi0KLVJldmlzaW9uIDAuNiAgMTk5Mi8wNi8yNyAgMDA6MDA6MDAgIG5lZXJpCi1jaG9vc2UoKSwgaGFzTmV3U0YKLQotUmV2aXNpb24gMC41ICAxOTkyLzA2LzA3ICAwMDowMDowMCAgbmVlcmkKLUZlYXR1cmUKLQotUmV2aXNpb24gMC40ICAxOTkyLzA1LzIxICAwMDowMDowMCAgbmVlcmkKLUltcGxlbWVudGVkIHNlbGVjdCgpCi0KLVJldmlzaW9uIDAuMyAgMTk5Mi8wNC8xOSAgMDA6MDA6MDAgIG5lZXJpCi1DKysgcmV3cml0ZQotCi1SZXZpc2lvbiAwLjIgIDE5OTIvMDQvMTggIDAwOjAwOjAwICBuZWVyaQotY2hhbmdlZCByZWFkL3dyaXRlL3NlbmQvcmVjdiBkaXNwYXRjaGVycwotCi1SZXZpc2lvbiAwLjEgIDE5OTIvMDQvMTggIDAwOjAwOjAwICBuZWVyaQotcHBjIERvbWFpbgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19HVVNJX1BfXwotI2RlZmluZSBfX0dVU0lfUF9fCi0KLSNkZWZpbmUgX191c2VBcHBsZUV4dHNfXwotCi0jaW5jbHVkZSA8R1VTSS5oPgotI2luY2x1ZGUgPEdVU0lSc3JjX1AuaD4KLSNpbmNsdWRlIDxURmlsZVNwZWMuaD4KLQotCi0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotZXh0ZXJuICJDIiB7Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1pbnQgCQlHVVNJX2Vycm9yKGludCBlcnIpOwotdm9pZCAqCUdVU0lfZXJyb3JfbmlsKGludCBlcnIpOwotfQotCi0jaW5jbHVkZSA8TWVtb3J5Lmg+Ci0jaW5jbHVkZSA8R2VzdGFsdC5oPgotI2luY2x1ZGUgPFRyYXBzLmg+Ci0jaW5jbHVkZSA8QXBwbGVFdmVudHMuaD4KLSNpbmNsdWRlIDxQcm9jZXNzZXMuaD4KLSNpbmNsdWRlIDxNaXhlZE1vZGUuaD4KLQotI2lmIE1TTEdVU0kKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0jZW5kaWYKLQotI2lmIEdFTkVSQVRJTkc2OEsKLSNwcmFnbWEgc2VnbWVudCBHVVNJCi0jZW5kaWYKLQotI2RlZmluZSBHVVNJX01BWF9ET01BSU4JCQlBRl9NQVgKLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJfU0laRQk0MDk2Ci0KLS8qCi0gKglJbiB1c2UgYW5kIHNodXRkb3duIHN0YXR1cy4KLSAqLwotI2RlZmluZQlTT0NLX1NUQVRVU19VU0VECQkweDEJCS8qIFVzZWQgc29ja2V0IHRhYmxlIGVudHJ5ICovCi0jZGVmaW5lCVNPQ0tfU1RBVFVTX05PUkVBRAkweDIJCS8qIE5vIG1vcmUgcmVhZGluZyBhbGxvd2VkIGZyb20gc29ja2V0ICovCi0jZGVmaW5lCVNPQ0tfU1RBVFVTX05PV1JJVEUJMHg0CQkvKiBObyBtb3JlIHdyaXRpbmcgYWxsb3dlZCB0byBzb2NrZXQgKi8KLQotLyoKLSAqCVNvY2tldCBjb25uZWN0aW9uIHN0YXRlcy4KLSAqLwotI2RlZmluZQlTT0NLX1NUQVRFX05PX1NUUkVBTQkJMAkvKiBTb2NrZXQgZG9lc24ndCBoYXZlIGEgTWFjVENQIHN0cmVhbSB5ZXQgKi8KLSNkZWZpbmUJU09DS19TVEFURV9VTkNPTk5FQ1RFRAkxCS8qIFNvY2tldCBpcyB1bmNvbm5lY3RlZC4gKi8KLSNkZWZpbmUJU09DS19TVEFURV9MSVNURU5JTkcJCTIJLyogU29ja2V0IGlzIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbi4gKi8KLSNkZWZpbmUJU09DS19TVEFURV9MSVNfQ09OCQkzCS8qIFNvY2tldCBpcyBpbiB0cmFuc2l0aW9uIGZyb20gbGlzdGVuIHRvIGNvbm5lY3RlZC4gKi8KLSNkZWZpbmUJU09DS19TVEFURV9DT05ORUNUSU5HCTQJLyogU29ja2V0IGlzIGluaXRpYXRpbmcgYSBjb25uZWN0aW9uLiAqLwotI2RlZmluZQlTT0NLX1NUQVRFX0NPTk5FQ1RFRAkJNQkvKiBTb2NrZXQgaXMgY29ubmVjdGVkLiAqLwotI2RlZmluZQlTT0NLX1NUQVRFX0NMT1NJTkcgICAgICA2CS8qIFNvY2tldCBpcyBjbG9zaW5nICovCi0jZGVmaW5lCVNPQ0tfU1RBVEVfTElTX0NMT1NFICAgIDcJLyogU29ja2V0IGNsb3NlZCB3aGlsZSBsaXN0ZW5pbmcgKi8KLQotI2RlZmluZQkJbWluKGEsYikJCQkJKCAoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZGVmaW5lCQltYXgoYSxiKQkJCQkoIChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotZXh0ZXJuIEdVU0lTcGluRm4gR1VTSVNwaW47Ci1leHRlcm4gIkMiIGludCBHVVNJRGVmYXVsdFNwaW4oc3Bpbl9tc2csIGxvbmcpOwotZXh0ZXJuIGludCBHVVNJQ2hlY2tBbGFybSgpOwotCi0jZGVmaW5lIEdVU0lfSU5URVJSVVBUKG1lc2cscGFyYW0pCShHVVNJQ2hlY2tBbGFybSgpIHx8IChHVVNJU3BpbiAmJiAoKkdVU0lTcGluKShtZXNnLHBhcmFtKSkpCi0KLS8qIFNQSU4gcmV0dXJucyBhIC0xIG9uIHVzZXIgY2FuY2VsIGZvciBmbiByZXR1cm5pbmcgaW50ZWdlcnMgKi8KLSNkZWZpbmUJCVNQSU4oY29uZCxtZXNnLHBhcmFtKQkJCQkJCQlcCi0JCQkJCWRvIHsJCQkJCQkJCQkJCQlcCi0JCQkJCQlpZiAoR1VTSV9JTlRFUlJVUFQobWVzZyxwYXJhbSkpCQlcCi0JCQkJCQkJcmV0dXJuIEdVU0lfZXJyb3IoRUlOVFIpOwkJCVwKLQkJCQkJfSB3aGlsZShjb25kKQotCi0vKiBTUElOUCByZXR1cm5zIGEgTlVMTCBvbiB1c2VyIGNhbmNlbCwgZm9yIGZuIHJldHVybmluZyBwb2ludGVycyAqLwkJCQkKLSNkZWZpbmUJCVNQSU5QKGNvbmQsbWVzZyxwYXJhbSkJCQkJCQkJXAotCQkJCQlkbyB7CQkJCQkJCQkJCQkJXAotCQkJCQkJaWYgKEdVU0lfSU5URVJSVVBUKG1lc2cscGFyYW0pKSB7CVwKLQkJCQkJCQlHVVNJX2Vycm9yKEVJTlRSKTsJCQkJCVwKLQkJCQkJCQlyZXR1cm4gTlVMTDsJCQkJCQkJXAotCQkJCQkJfQkJCQkJCQkJCQkJCVwKLQkJCQkJfSB3aGlsZShjb25kKQotCi0vKiBTUElOVk9JRCBqdXN0IHJldHVybnMgb24gdXNlciBjYW5jZWwsIGZvciBmbiByZXR1cm5pbmcgdm9pZCAqLwkJCQkKLSNkZWZpbmUJCVNQSU5WT0lEKGNvbmQsbWVzZyxwYXJhbSkJCQkJCQlcCi0JCQkJCWRvIHsJCQkJCQkJCQkJCQlcCi0JCQkJCQlpZiAoR1VTSV9JTlRFUlJVUFQobWVzZyxwYXJhbSkpIHsJXAotCQkJCQkJCQlHVVNJX2Vycm9yKEVJTlRSKTsJCQkJXAotCQkJCQkJCQlyZXR1cm47CQkJCQkJCQlcCi0JCQkJCQkJfQkJCQkJCQkJCQkJXAotCQkJCQl9IHdoaWxlKGNvbmQpCi0JCQkJCQotLyogU0FGRVNQSU4gZG9lc24ndCByZXR1cm4sIHlvdSBoYXZlIHRvIGNoZWNrIGVycm5vICovCQkJCQotI2RlZmluZQkJU0FGRVNQSU4oY29uZCxtZXNnLHBhcmFtKQkJCQkJCVwKLQkJCQkJZG8gewkJCQkJCQkJCQkJCVwKLQkJCQkJCWlmIChHVVNJX0lOVEVSUlVQVChtZXNnLHBhcmFtKSkgewlcCi0JCQkJCQkJR1VTSV9lcnJvcihFSU5UUik7CQkJCQlcCi0JCQkJCQkJYnJlYWs7CQkJCQkJCQkJXAotCQkJCQkJfSBlbHNlCQkJCQkJCQkJCVwKLQkJCQkJCQllcnJubyA9IDA7CQkJCQkJCQlcCi0JCQkJCX0gd2hpbGUoY29uZCkKLQotLy8KLS8vIExpYnJhcnkgZnVuY3Rpb25zIGFyZSBuZXZlciBhbGxvd2VkIHRvIGNsZWFyIGVycm5vLCBzbyB3ZSBoYXZlIHRvIHNhdmUKLS8vCi1jbGFzcyBFcnJub1NhdmVyIHsKLXB1YmxpYzoKLQlFcnJub1NhdmVyKCkgIHsgZlNhdmVkRXJybm8gPSA6OmVycm5vOyA6OmVycm5vID0gMDsgCX0KLQl+RXJybm9TYXZlcigpIHsgaWYgKCE6OmVycm5vKSA6OmVycm5vID0gZlNhdmVkRXJybm87ICB9Ci1wcml2YXRlOgotCWludCBmU2F2ZWRFcnJubzsKLX07Ci0KLSNkZWZpbmUgU0FWRV9BTkRfQ0xFQVJfRVJSTk8JRXJybm9TYXZlciBzYXZlRXJybm8KLQkJCQotY2xhc3MgU29ja2V0VGFibGU7Ci0KLSNpZiBQUkFHTUFfQUxJR05fU1VQUE9SVEVECi0jcHJhZ21hIG9wdGlvbnMgYWxpZ249bWFjNjhrCi0jZW5kaWYKLQotY2xhc3MgU29ja2V0IHsKLQlmcmllbmQgY2xhc3MgU29ja2V0VGFibGU7Ci0JCi0Jc2hvcnQJCQlyZWZDb3VudDsKLXByb3RlY3RlZDoKLQkJCQkJU29ja2V0KCk7Ci1wdWJsaWM6Ci0JdmlydHVhbCBpbnQJYmluZCh2b2lkICogbmFtZSwgaW50IG5hbWVsZW4pOwotCXZpcnR1YWwgaW50IGNvbm5lY3Qodm9pZCAqIGFkZHJlc3MsIGludCBhZGRybGVuKTsKLQl2aXJ0dWFsIGludCBsaXN0ZW4oaW50IHFsZW4pOwotCXZpcnR1YWwgU29ja2V0ICogYWNjZXB0KHZvaWQgKiBhZGRyZXNzLCBpbnQgKiBhZGRybGVuKTsKLQl2aXJ0dWFsIGludAlyZWFkKHZvaWQgKiBidWZmZXIsIGludCBidWZsZW4pOwotCXZpcnR1YWwgaW50IHdyaXRlKHZvaWQgKiBidWZmZXIsIGludCBidWZsZW4pOwotCXZpcnR1YWwgaW50IHJlY3Zmcm9tKHZvaWQgKiBidWZmZXIsIGludCBidWZsZW4sIGludCBmbGFncywgdm9pZCAqIGZyb20sIGludCAqIGZyb21sZW4pOwotCXZpcnR1YWwgaW50IHNlbmR0byh2b2lkICogYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgZmxhZ3MsIHZvaWQgKiB0bywgaW50IHRvbGVuKTsKLQl2aXJ0dWFsIGludCBnZXRzb2NrbmFtZSh2b2lkICogbmFtZSwgaW50ICogbmFtZWxlbik7Ci0JdmlydHVhbCBpbnQgZ2V0cGVlcm5hbWUodm9pZCAqIG5hbWUsIGludCAqIG5hbWVsZW4pOwotCXZpcnR1YWwgaW50IGdldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLCBpbnQgKiBvcHRsZW4pOwotCXZpcnR1YWwgaW50IHNldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKLQl2aXJ0dWFsIGludAlmY250bCh1bnNpZ25lZCBpbnQgY21kLCBpbnQgYXJnKTsKLQl2aXJ0dWFsIGludAlpb2N0bCh1bnNpZ25lZCBpbnQgcmVxdWVzdCwgdm9pZCAqYXJncCk7Ci0JdmlydHVhbCBpbnQJZnN0YXQoc3RydWN0IHN0YXQgKiBidWYpOwotCXZpcnR1YWwgbG9uZyBsc2Vlayhsb25nIG9mZnNldCwgaW50IHdoZW5jZSk7Ci0JdmlydHVhbCBpbnQgZnRydW5jYXRlKGxvbmcgb2Zmc2V0KTsKLQl2aXJ0dWFsIGludAlpc2F0dHkoKTsKLQl2aXJ0dWFsIGludCBzaHV0ZG93bihpbnQgaG93KTsKLQl2aXJ0dWFsIHZvaWQgcHJlX3NlbGVjdChCb29sZWFuIHdhbnRSZWFkLCBCb29sZWFuIHdhbnRXcml0ZSwgQm9vbGVhbiB3YW50RXhjZXB0KTsKLQl2aXJ0dWFsIGludCBzZWxlY3QoQm9vbGVhbiAqIGNhblJlYWQsIEJvb2xlYW4gKiBjYW5Xcml0ZSwgQm9vbGVhbiAqIGV4Y2VwdGlvbik7Ci0JdmlydHVhbCB2b2lkIHBvc3Rfc2VsZWN0KEJvb2xlYW4gd2FudFJlYWQsIEJvb2xlYW4gd2FudFdyaXRlLCBCb29sZWFuIHdhbnRFeGNlcHQpOwotCXZpcnR1YWwgCQl+U29ja2V0KCk7Ci0JCi0Jdm9pZCBvcGVyYXRvcisrKCkJewkrK3JlZkNvdW50OwkJCQkJCQl9Ci0Jdm9pZCBvcGVyYXRvci0tKCkJewlpZiAoIS0tcmVmQ291bnQpIGRlbGV0ZSB0aGlzOwl9Ci19OwotCi0KLSNpZiBQUkFHTUFfQUxJR05fU1VQUE9SVEVECi0jcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKLSNlbmRpZgotCi1jbGFzcyBTb2NrZXREb21haW4gewotCXN0YXRpYyBTb2NrZXREb21haW4gKgkJZG9tYWluc1tHVVNJX01BWF9ET01BSU5dOwotCXN0YXRpYyBQcm9jZXNzU2VyaWFsTnVtYmVyCXByb2Nlc3M7Ci1wcm90ZWN0ZWQ6Ci0JU29ja2V0RG9tYWluKGludCBkb21haW4pOwotCXZpcnR1YWwgflNvY2tldERvbWFpbigpOwotcHVibGljOgotCWlubGluZSBzdGF0aWMgU29ja2V0RG9tYWluICoJRG9tYWluKGludCBkb21haW4pOwotCXN0YXRpYyB2b2lkIFJlYWR5KCk7Ci0JCi0JLy8gT3B0aW9uYWxseSBvdmVycmlkZSB0aGUgZm9sbG93aW5nCi0JCi0JdmlydHVhbCBTb2NrZXQgKiBzb2NrZXQoaW50IHR5cGUsIHNob3J0IHByb3RvY29sKTsKLQkKLQkvLyBPcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcKLQkKLQl2aXJ0dWFsIGludCBzb2NrZXRwYWlyKGludCB0eXBlLCBzaG9ydCBwcm90b2NvbCwgU29ja2V0ICogc29ja2V0c1tdKTsKLQkKLQkvLyBPcHRpb25hbGx5IGRlZmluZSB0aGUgZm9sbG93aW5nCi0JCi0JdmlydHVhbCBpbnQgY2hvb3NlKAotCQkJCQkJaW50IAkJdHlwZSwgCi0JCQkJCQljaGFyICogCXByb21wdCwgCi0JCQkJCQl2b2lkICogCWNvbnN0cmFpbnQsCQkKLQkJCQkJCWludCAJCWZsYWdzLAotIAkJCQkJCXZvaWQgKiAJbmFtZSwgCi0JCQkJCQlpbnQgKiAJbmFtZWxlbik7Ci0JCi0JLy8gTmV2ZXIgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZwotCQotCXZvaWQgRG9udFN0cmlwKCk7Ci19OwotCi1jbGFzcyBTb2NrZXRUYWJsZSB7Ci0JU29ja2V0ICoJc29ja2V0c1tHVVNJX01BWF9GRF07Ci0JQm9vbGVhbgluZWVkc0NvbnNvbGU7Ci1wdWJsaWM6Ci0JU29ja2V0VGFibGUoKTsKLQl+U29ja2V0VGFibGUoKTsKLQkKLQl2b2lkCQlJbml0Q29uc29sZSgpOwotCWludAkJSW5zdGFsbChTb2NrZXQgKiBzb2NrLCBpbnQgc3RhcnQgPSAwKTsKLQlpbnQJCVJlbW92ZShpbnQgZmQpOwotCVNvY2tldCAqIG9wZXJhdG9yW10oaW50IGZkKTsKLX07Ci0KLXN0cnVjdCBHVVNJU3VmZml4IHsKLQljaGFyIAkJc3VmZml4WzRdOwotCU9TVHlwZQlzdWZmVHlwZTsKLQlPU1R5cGUJc3VmZkNyZWF0b3I7Ci19OwotCi0jaWYgUFJBR01BX0FMSUdOX1NVUFBPUlRFRAotI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awotI2VuZGlmCi0KLS8vCi0vLyBJIGxlYXJuZWQgdGhlIGhhcmQgd2F5IG5vdCB0byByZWx5IG9uIGJpdCBmaWVsZCBhbGlnbm1lbnRzCi0vLwotCi1zdHJ1Y3QgR1VTSUNvbmZpZ1JzcmMgewotCU9TVHlwZQkJCWRlZmF1bHRUeXBlOwotCU9TVHlwZQkJCWRlZmF1bHRDcmVhdG9yOwotCQotCWNoYXIJCQkJYXV0b1NwaW47Ci0JdW5zaWduZWQgY2hhcglmbGFnczsKLQkKLQlPU1R5cGUJCQl2ZXJzaW9uOwotCXNob3J0CQkJCW51bVN1ZmZpY2VzOwotCUdVU0lTdWZmaXggCQlzdWZmaWNlc1sxXTsKLX07Ci0KLSNpZiBQUkFHTUFfQUxJR05fU1VQUE9SVEVECi0jcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKLSNlbmRpZgotCi1zdHJ1Y3QgR1VTSUNvbmZpZ3VyYXRpb24gewotCU9TVHlwZQkJCWRlZmF1bHRUeXBlOwotCU9TVHlwZQkJCWRlZmF1bHRDcmVhdG9yOwotCQotCWNoYXIJCQkJYXV0b1NwaW47Ci0JCi0JQm9vbGVhbgkgCQlub0NoZGlyOwkJLy8gU2V0IGN1cnJlbnQgZGlyZWN0b3J5IHdpdGhvdXQgY2hkaXIoKQotCUJvb2xlYW4gCQkJYWNjdXJTdGF0OwkvLyBSZXR1cm4gIyBvZiBzdWJkaXJlY3RvcmllcyArIDIgaW4gc3RfbmxpbmsKLQlCb29sZWFuCSAJCWhhc0NvbnNvbGU7CS8vIERvIHdlIGhhdmUgb3VyIG93biBjb25zb2xlID8KLQlCb29sZWFuCQkJbm9BdXRvSW5pdEdyYWY7CS8vIE5ldmVyIGF1dG9tYXRpY2FsbHkgZG8gSW5pdEdyYWYKLQlCb29sZWFuCQkJc2hhcmVkT3BlbjsJLy8gT3BlbiBmaWxlcyB3aXRoIHNoYXJlZCBwZXJtaXNzaW9ucwotCUJvb2xlYW4JCQlzaWdQaXBlOwkJLy8gcmFpc2UgU0lHUElQRSBvbiB3cml0ZSB0byBjbG9zZWQgc29ja2V0Ci0JQm9vbGVhbgkJCW5vQXBwbGVFdmVudHM7IC8vIERvbid0IHNvbGljaXQgQXBwbGVFdmVudHMgZm9yIE1QVyB0b29scwotCUJvb2xlYW4JCQlkZWxheUNvbnNvbGU7CS8vIERvIG5vdCBvcGVuIGNvbnNvbGUgdW50aWwgbmVlZGVkCi0JCi0JT1NUeXBlCQkJdmVyc2lvbjsKLQlzaG9ydAkJCQludW1TdWZmaWNlczsKLQlHVVNJU3VmZml4ICoJc3VmZmljZXM7Ci0JCi0JR1VTSUNvbmZpZ3VyYXRpb24oKTsKLQl2b2lkIEdVU0lMb2FkQ29uZmlndXJhdGlvbihIYW5kbGUgY29uZmlnKTsKLQkKLQl2b2lkIFNldERlZmF1bHRGVHlwZShjb25zdCBURmlsZVNwZWMgJiBuYW1lKSBjb25zdDsKLQl2b2lkIERvQXV0b1NwaW4oKSBjb25zdDsKLQl2b2lkIEF1dG9Jbml0R3JhZigpCWNvbnN0IHsJaWYgKCFub0F1dG9Jbml0R3JhZikgRG9BdXRvSW5pdEdyYWYoKTsJfQotCXZvaWQgRG9BdXRvSW5pdEdyYWYoKSBjb25zdDsKLQlCb29sZWFuIERlbGF5Q29uc29sZSgpIGNvbnN0OwotcHJpdmF0ZToKLQlzdGF0aWMgQm9vbGVhbiBmaXJzdFRpbWU7Ci0Jc3RhdGljIHNob3J0CXdlOwotfTsKLQotZXh0ZXJuIEdVU0lDb25maWd1cmF0aW9uCUdVU0lDb25maWc7Ci1leHRlcm4gU29ja2V0VGFibGUJCQkJCVNvY2tldHM7Ci0KLXR5cGVkZWYgcGFzY2FsIE9TRXJyICgqT1NFcnJJbml0aWFsaXplcikoKTsKLXR5cGVkZWYgcGFzY2FsIHZvaWQgICgqdm9pZEluaXRpYWxpemVyKSgpOwotCi1jbGFzcyBGZWF0dXJlIHsKLQlCb29sZWFuCWdvb2Q7Ci1wdWJsaWM6Ci0JRmVhdHVyZSh1bnNpZ25lZCBzaG9ydCB0cmFwTnVtLCBUcmFwVHlwZSB0VHlwKTsKLQlGZWF0dXJlKE9TVHlwZSB0eXBlLCBsb25nIHZhbHVlKTsKLQlGZWF0dXJlKE9TVHlwZSB0eXBlLCBsb25nIG1hc2ssIGxvbmcgdmFsdWUpOwotCUZlYXR1cmUoY29uc3QgRmVhdHVyZSAmIHByZWNvbmRpdGlvbiwgT1NFcnJJbml0aWFsaXplciBpbml0KTsKLQlGZWF0dXJlKE9TRXJySW5pdGlhbGl6ZXIgaW5pdCk7Ci0JRmVhdHVyZShjb25zdCBGZWF0dXJlICYgcHJlY29uZGl0aW9uLCB2b2lkSW5pdGlhbGl6ZXIgaW5pdCk7Ci0JRmVhdHVyZSh2b2lkSW5pdGlhbGl6ZXIgaW5pdCk7Ci0JRmVhdHVyZShjb25zdCBGZWF0dXJlICYgY29uZDEsIGNvbnN0IEZlYXR1cmUgJiBjb25kMik7Ci0KLQlvcGVyYXRvciB2b2lkKigpIGNvbnN0IHsJcmV0dXJuICh2b2lkICopIGdvb2Q7CX0KLX07Ci0KLWV4dGVybiBGZWF0dXJlIGhhc01ha2VGU1NwZWM7Ci1leHRlcm4gRmVhdHVyZSBoYXNBbGlhczsKLWV4dGVybiBGZWF0dXJlIGhhc05ld1NGOwotZXh0ZXJuIEZlYXR1cmUgaGFzUHJvY2Vzc01ncjsKLWV4dGVybiBGZWF0dXJlIGhhc0NSTTsKLWV4dGVybiBGZWF0dXJlIGhhc0NUQjsKLWV4dGVybiBGZWF0dXJlIGhhc1N0ZE5CUDsKLWV4dGVybiBGZWF0dXJlIGhhc0NNOwotZXh0ZXJuIEZlYXR1cmUgaGFzRlQ7Ci1leHRlcm4gRmVhdHVyZSBoYXNUTTsKLWV4dGVybiBGZWF0dXJlCWhhc1BQQzsKLWV4dGVybiBGZWF0dXJlIGhhc1JldmlzZWRUaW1lTWdyOwotCi1jbGFzcyBTY2F0dEdhdGgJewotCUhhbmRsZQkJCXNjcmF0Y2g7Ci1wcm90ZWN0ZWQ6Ci0Jdm9pZCAqCQkJYnVmOwotCWludAkJCQkJCWxlbjsKLQlpbnQJCQkJCQljb3VudDsKLQljb25zdCBzdHJ1Y3QgaW92ZWMgKglpbzsKLQotCVNjYXR0R2F0aChjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNudCk7Ci0JdmlydHVhbCB+U2NhdHRHYXRoKCk7Ci1wdWJsaWM6Ci0Jdm9pZCAqCQkJYnVmZmVyKCkJCQl7CXJldHVybiBidWY7CQkJfQotCWludAkJCQlidWZsZW4oKQkJCXsJcmV0dXJuIGxlbjsJCQl9Ci0JaW50CQkJCWxlbmd0aChpbnQgbCkJewlyZXR1cm4gbGVuID0gbDsJfQotCW9wZXJhdG9yIHZvaWQgKigpCQkJCQl7CXJldHVybiBidWY7CQkJfQotfTsKLQotY2xhc3MgU2NhdHRlcmVyIDogcHVibGljIFNjYXR0R2F0aCB7Ci1wdWJsaWM6Ci0JU2NhdHRlcmVyKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgY291bnQpOwotCXZpcnR1YWwgflNjYXR0ZXJlcigpOwotfTsKLQotY2xhc3MgR2F0aGVyZXIgOiBwdWJsaWMgU2NhdHRHYXRoIHsKLXB1YmxpYzoKLQlHYXRoZXJlcihjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KTsKLQl2aXJ0dWFsIH5HYXRoZXJlcigpOwotfTsKLQotdHlwZWRlZiBwYXNjYWwgdm9pZCAoKkRlZmVycmVkKSh2b2lkICopOwotCi1jbGFzcyBSaW5nQnVmZmVyIHsKLQkvLyBWYWxpZCBieXRlcyBhcmUgYmV0d2VlbiBjb25zdW1lIGFuZCBwcm9kdWNlCi0JLy8gRnJlZSBieXRlcyBhcmUgYmV0d2VlbiBwcm9kdWNlIGFuZCBjb25zdW1lCi0JLy8gYnl0ZXMgYmV0d2VlbiBlbmRidWYtc3BhcmUgYW5kIGVuZGJ1ZiBhcmUgbmVpdGhlcgotCVB0cgkJYnVmZmVyOwotCVB0cgkJZW5kYnVmOwotCVB0ciAJCWNvbnN1bWU7Ci0JUHRyCQlwcm9kdWNlOwotCXVfc2hvcnQJZnJlZTsKLQl1X3Nob3J0CXZhbGlkOwotCXVfc2hvcnQJc3BhcmU7Ci0JQm9vbGVhbglsb2NrOwotCURlZmVycmVkCWRlZnByb2M7Ci0Jdm9pZCAqCWFyZzsKLQkKLXB1YmxpYzoKLQkJCQlSaW5nQnVmZmVyKHVfc2hvcnQgYnVmc2l6KTsKLQkJCQl+UmluZ0J1ZmZlcigpOwotCQotCVB0cgkJUHJvZHVjZXIobG9uZyAmIGxlbik7CQkJLy8JRmluZCBjb250aW51b3VzIG1lbW9yeSBmb3IgcHJvZHVjZXIKLQlQdHIJCUNvbnN1bWVyKGxvbmcgJiBsZW4pOwkJCS8vCUZpbmQgY29udGludW91cyBtZW1vcnkgZm9yIGNvbnN1bWVyCi0Jdm9pZAkJVmFsaWRhdGUobG9uZyBsZW4pOwkJCQkvLyBWYWxpZGF0ZSB0aGlzLCB1bmFsbG9jYXRlIHJlc3QKLQl2b2lkIAkJSW52YWxpZGF0ZShsb25nIGxlbik7Ci0Jdm9pZAkJUHJvZHVjZShQdHIgZnJvbSwgbG9uZyAmIGxlbik7Ly8JQWxsb2NhdGUsIGNvcHkgJiB2YWxpZGF0ZQotCXZvaWQJCUNvbnN1bWUoUHRyIHRvLCBsb25nICYgbGVuKTsJLy8gQ29weSAmIGludmFsaWRhdGUKLQkKLQlsb25nCQlGcmVlKCkJCQkJCQkJCXsgcmV0dXJuIGZyZWU7CQkJCQkJCQkJfQkJCi0JbG9uZwkJVmFsaWQoKQkJCQkJCQkJeyByZXR1cm4gdmFsaWQ7CQkJCQkJCQl9Ci0JCi0Jdm9pZCAJCURlZmVyKCkJCQkJCQkJCXsgbG9jayA9IHRydWU7CQkJCQkJCQkJfQotCXZvaWQgCQlVbmRlZmVyKCkJCQkJCQkJeyBsb2NrID0gZmFsc2U7IGlmIChkZWZwcm9jKSBkZWZwcm9jKGFyZyk7fQotCUJvb2xlYW4JTG9ja2VkKCkJCQkJCQkJCXsgcmV0dXJuIGxvY2s7CQkJCQkJCQkJfQotCXZvaWQJCUxhdGVyKERlZmVycmVkIGRlZiwgdm9pZCAqIGFyKXsgZGVmcHJvYyA9IGRlZjsgYXJnID0gYXI7CQkJCQl9Ci0JCi0Jb3BlcmF0b3Igdm9pZCAqKCkJCQkJCQkJCXsgcmV0dXJuIGJ1ZmZlcjsJCQkJCQkJCX0KLX07Ci0KLUJvb2xlYW4gR1VTSUludGVycnVwdCgpOwotCi1Cb29sZWFuIENvcHlJY29uRmFtaWx5KHNob3J0IHNyY1Jlc0ZpbGUsIHNob3J0IHNyY0lELCBzaG9ydCBkc3RSZXNGaWxlLCBzaG9ydCBkc3RJRCk7Ci0KLXBhc2NhbCBPU0VyciBQUENJbml0X1AoKTsKLQotT1NFcnIgQXBwbGVUYWxrSWRlbnRpdHkoc2hvcnQgJiBuZXQsIHNob3J0ICYgbm9kZSk7Ci0KLXZvaWQgQ29weUMyUFN0cihjb25zdCBjaGFyICogY3N0ciwgU3RyaW5nUHRyIHBzdHIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvTUFDVENQY29uc3QucHkgYi9NYWMvVW5zdXBwb3J0ZWQvbWFjdGNwL01BQ1RDUGNvbnN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I5ZDY4Li4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvTUFDVENQY29uc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jCi0jIE1BQ1RDUCAtIGV2ZW50IGNvZGVzIGZvciB0aGUgbWFjdGNwIG1vZHVsZQotIwotCi0jIFVEUCBhc3IgZXZlbnQgY29kZXMKLVVEUERhdGFBcnJpdmFsPTEJCSMgQSBkYXRhZ3JhbSBoYXMgYXJyaXZlZAotVURQSUNNUFJlY2VpdmVkPTIJCSMgQW4gSUNNUCBlcnJvciB3YXMgcmVjZWl2ZWQKLQotIyBUQ1AgYXNyIGV2ZW50IGNvZGVzCi1UQ1BDbG9zaW5nPTEJCQkjIEFsbCBpbmNvbWluZyBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCByZWFkLgotVENQVUxQVGltZW91dD0yCQkJIyBObyByZXNwb25zZSBmcm9tIHJlbW90ZSBwcm9jZXNzLgotVENQVGVybWluYXRlPTMJCQkjIENvbm5lY3Rpb24gdGVybWluYXRlZC4gSGFzIGEgZGV0YWlsIHBhcmFtZXRlci4KLVRDUERhdGFBcnJpdmFsPTQJCSMgRGF0YSBoYXMgYXJyaXZlZCAoYW5kIG5vIFJjdiBjYWxsIGlzIG91dHN0YW5kaW5nKQotVENQVXJnZW50PTUJCQkJIyBVcmdlbnQgZGF0YSBpcyBvdXRzdGFuZGluZwotVENQSUNNUFJlY2VpdmVkPTYJCSMgQW4gSUNNUCBlcnJvciB3YXMgcmVjZWl2ZWQKLVBhc3NpdmVPcGVuRG9uZT0zMjc2NgkjIChweXRob24gb25seSkgYSBQYXNzaXZlT3BlbiBoYXMgY29tcGxldGVkLgotCi0jIFRDUCB0ZXJtaW5hdGlvbiByZWFzb25zCi1UQ1BSZW1vdGVBYm9ydD0yCi1UQ1BOZXR3b3JrRmFpbHVyZT0zCi1UQ1BTZWNQcmVjTWlzbWF0Y2g9NAotVENQVUxQVGltZW91dFRlcm1pbmF0ZT01Ci1UQ1BVTFBBYm9ydD02Ci1UQ1BVTFBDbG9zZT03Ci1UQ1BTZXJ2aWNlRXJyb3I9OAotCi0jIE1hY1RDUC9ETlIgZXJyb3JzCi1pcEJhZExhcEVyciA9IAkJCS0yMzAwMAkJCSMgYmFkIG5ldHdvcmsgY29uZmlndXJhdGlvbiAKLWlwQmFkQ25mZ0VyciA9IAkJCS0yMzAwMQkJCSMgYmFkIElQIGNvbmZpZ3VyYXRpb24gZXJyb3IgCi1pcE5vQ25mZ0VyciA9IAkJCS0yMzAwMgkJCSMgbWlzc2luZyBJUCBvciBMQVAgY29uZmlndXJhdGlvbiBlcnJvciAKLWlwTG9hZEVyciA9IAkJCS0yMzAwMwkJCSMgZXJyb3IgaW4gTWFjVENQIGxvYWQgCi1pcEJhZEFkZHIgPSAJCQktMjMwMDQJCQkjIGVycm9yIGluIGdldHRpbmcgYWRkcmVzcyAKLWNvbm5lY3Rpb25DbG9zaW5nID0gCS0yMzAwNQkJCSMgY29ubmVjdGlvbiBpcyBjbG9zaW5nIAotaW52YWxpZExlbmd0aCA9IAkJLTIzMDA2Ci1jb25uZWN0aW9uRXhpc3RzID0gCQktMjMwMDcJCQkjIHJlcXVlc3QgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29ubmVjdGlvbiAKLWNvbm5lY3Rpb25Eb2VzbnRFeGlzdCA9CS0yMzAwOAkJCSMgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCAKLWluc3VmZmljaWVudFJlc291cmNlcyA9CS0yMzAwOQkJCSMgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHJlcXVlc3QgCi1pbnZhbGlkU3RyZWFtUHRyID0gCQktMjMwMTAKLXN0cmVhbUFscmVhZHlPcGVuID0gCS0yMzAxMQotY29ubmVjdGlvblRlcm1pbmF0ZWQgPSAJLTIzMDEyCi1pbnZhbGlkQnVmUHRyID0gCQktMjMwMTMKLWludmFsaWRSRFMgPSAJCQktMjMwMTQKLWludmFsaWRXRFMgPSAJCQktMjMwMTQKLW9wZW5GYWlsZWQgPSAJCQktMjMwMTUKLWNvbW1hbmRUaW1lb3V0ID0gCQktMjMwMTYKLWR1cGxpY2F0ZVNvY2tldCA9IAkJLTIzMDE3Ci0KLSMgRXJyb3IgY29kZXMgZnJvbSBpbnRlcm5hbCBJUCBmdW5jdGlvbnMgCi1pcERvbnRGcmFnRXJyID0gCQktMjMwMzIJCQkjIFBhY2tldCB0b28gbGFyZ2UgdG8gc2VuZCB3L28gZnJhZ21lbnRpbmcgCi1pcERlc3REZWFkRXJyID0gCQktMjMwMzMJCQkjIGRlc3RpbmF0aW9uIG5vdCByZXNwb25kaW5nCi1pY21wRWNob1RpbWVvdXRFcnIgPSAJLTIzMDM1CQkJIyBJQ01QIGVjaG8gdGltZWQtb3V0IAotaXBOb0ZyYWdNZW1FcnIgPSAJCS0yMzAzNgkJCSMgbm8gbWVtb3J5IHRvIHNlbmQgZnJhZ21lbnRlZCBwa3QgCi1pcFJvdXRlRXJyID0gCQkJLTIzMDM3CQkJIyBjYW4ndCByb3V0ZSBwYWNrZXQgb2ZmLW5ldCAKLQotbmFtZVN5bnRheEVyciA9ICAJCS0yMzA0MQkJCi1jYWNoZUZhdWx0ID0gCQkJLTIzMDQyCi1ub1Jlc3VsdFByb2MgPSAJCQktMjMwNDMKLW5vTmFtZVNlcnZlciA9IAkJCS0yMzA0NAotYXV0aE5hbWVFcnIgPSAJCQktMjMwNDUKLW5vQW5zRXJyID0gCQkJCS0yMzA0NgotZG5yRXJyID0gCQkJCS0yMzA0Nwotb3V0T2ZNZW1vcnkgPSAJCQktMjMwNDgKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvTWFjVENQZXJyb3JzLnB5IGIvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9NYWNUQ1BlcnJvcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNmU3MmIuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9NYWNUQ1BlcnJvcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1pcEJhZExhcEVyciA9IAkJCS0yMzAwMAkJCSMgYmFkIG5ldHdvcmsgY29uZmlndXJhdGlvbiAKLWlwQmFkQ25mZ0VyciA9IAkJCS0yMzAwMQkJCSMgYmFkIElQIGNvbmZpZ3VyYXRpb24gZXJyb3IgCi1pcE5vQ25mZ0VyciA9IAkJCS0yMzAwMgkJCSMgbWlzc2luZyBJUCBvciBMQVAgY29uZmlndXJhdGlvbiBlcnJvciAKLWlwTG9hZEVyciA9IAkJCS0yMzAwMwkJCSMgZXJyb3IgaW4gTWFjVENQIGxvYWQgCi1pcEJhZEFkZHIgPSAJCQktMjMwMDQJCQkjIGVycm9yIGluIGdldHRpbmcgYWRkcmVzcyAKLWNvbm5lY3Rpb25DbG9zaW5nID0gCS0yMzAwNQkJCSMgY29ubmVjdGlvbiBpcyBjbG9zaW5nIAotaW52YWxpZExlbmd0aCA9IAkJLTIzMDA2Ci1jb25uZWN0aW9uRXhpc3RzID0gCQktMjMwMDcJCQkjIHJlcXVlc3QgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29ubmVjdGlvbiAKLWNvbm5lY3Rpb25Eb2VzbnRFeGlzdCA9CS0yMzAwOAkJCSMgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCAKLWluc3VmZmljaWVudFJlc291cmNlcyA9CS0yMzAwOQkJCSMgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHJlcXVlc3QgCi1pbnZhbGlkU3RyZWFtUHRyID0gCQktMjMwMTAKLXN0cmVhbUFscmVhZHlPcGVuID0gCS0yMzAxMQotY29ubmVjdGlvblRlcm1pbmF0ZWQgPSAJLTIzMDEyCi1pbnZhbGlkQnVmUHRyID0gCQktMjMwMTMKLWludmFsaWRSRFMgPSAJCQktMjMwMTQKLWludmFsaWRXRFMgPSAJCQktMjMwMTQKLW9wZW5GYWlsZWQgPSAJCQktMjMwMTUKLWNvbW1hbmRUaW1lb3V0ID0gCQktMjMwMTYKLWR1cGxpY2F0ZVNvY2tldCA9IAkJLTIzMDE3Ci0KLSMgRXJyb3IgY29kZXMgZnJvbSBpbnRlcm5hbCBJUCBmdW5jdGlvbnMgCi1pcERvbnRGcmFnRXJyID0gCQktMjMwMzIJCQkjIFBhY2tldCB0b28gbGFyZ2UgdG8gc2VuZCB3L28gZnJhZ21lbnRpbmcgCi1pcERlc3REZWFkRXJyID0gCQktMjMwMzMJCQkjIGRlc3RpbmF0aW9uIG5vdCByZXNwb25kaW5nCi1pY21wRWNob1RpbWVvdXRFcnIgPSAJLTIzMDM1CQkJIyBJQ01QIGVjaG8gdGltZWQtb3V0IAotaXBOb0ZyYWdNZW1FcnIgPSAJCS0yMzAzNgkJCSMgbm8gbWVtb3J5IHRvIHNlbmQgZnJhZ21lbnRlZCBwa3QgCi1pcFJvdXRlRXJyID0gCQkJLTIzMDM3CQkJIyBjYW4ndCByb3V0ZSBwYWNrZXQgb2ZmLW5ldCAKLQotbmFtZVN5bnRheEVyciA9ICAJCS0yMzA0MQkJCi1jYWNoZUZhdWx0ID0gCQkJLTIzMDQyCi1ub1Jlc3VsdFByb2MgPSAJCQktMjMwNDMKLW5vTmFtZVNlcnZlciA9IAkJCS0yMzA0NAotYXV0aE5hbWVFcnIgPSAJCQktMjMwNDUKLW5vQW5zRXJyID0gCQkJCS0yMzA0NgotZG5yRXJyID0gCQkJCS0yMzA0Nwotb3V0T2ZNZW1vcnkgPSAJCQktMjMwNDgKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjZG5ybW9kdWxlLmMgYi9NYWMvVW5zdXBwb3J0ZWQvbWFjdGNwL21hY2Rucm1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg5ZTAzLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjZG5ybW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db3B5cmlnaHQgMTk5MS0xOTk1IGJ5IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtLAotVGhlIE5ldGhlcmxhbmRzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCi0KLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCi1DZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCi0KLVNUSUNIVElORyBNQVRIRU1BVElTQ0ggQ0VOVFJVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLVRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFNUSUNIVElORyBNQVRIRU1BVElTQ0ggQ0VOVFJVTSBCRSBMSUFCTEUKLUZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi1XSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLUFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCi1PRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhbGxvYmplY3RzLmgiCi0jaW5jbHVkZSAibW9kc3VwcG9ydC5oIgkJLyogRm9yIGdldGFyZ3MoKSBldGMuICovCi0KLSNpbmNsdWRlICJtYWNnbHVlLmgiCi0jaW5jbHVkZSA8QWRkcmVzc1hsYXRpb24uaD4KLSNpbmNsdWRlIDxEZXNrLmg+Ci0KLSNpZm5kZWYgSEFWRV9VTklWRVJTQUxfSEVBREVSUwotI2RlZmluZSBSZXN1bHRVUFAgUmVzdWx0UHJvY1B0cgotI2RlZmluZSBOZXdSZXN1bHRQcm9jKHgpICh4KQotI2RlZmluZSBSZXN1bHRQcm9jMlVQUCBSZXN1bHRQcm9jMlB0cgotI2RlZmluZSBOZXdSZXN1bHRQcm9jMlByb2MoeCkgKHgpCi0jZW5kaWYKLQotc3RhdGljIG9iamVjdCAqRXJyb3JPYmplY3Q7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBNYWNUQ1AgRE5SIFJlc3VsdCAqLwotCi0vKiBUeXBlcyBvZiByZWNvcmRzIHdlIGhhdmUgKi8KLSNkZWZpbmUgRE5SX0FERFIgMAotI2RlZmluZSBETlJfSElORk8gMQotI2RlZmluZSBETlJfTVggMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JT0JfSEVBRAotCWludCB0eXBlOwkJLyogRE5SX1hYWCAqLwotCWludCB3YWl0aW5nOwkvKiBUcnVlIHdoaWxlIGNvbXBsZXRpb24gcHJvYyBub3QgY2FsbGVkICovCi0Jc3RydWN0IHJldHVyblJlYyBoaW5mbzsKLX0gZG5ycm9iamVjdDsKLQotc3RhdGljZm9yd2FyZCB0eXBlb2JqZWN0IERucnJ0eXBlOwotCi0jZGVmaW5lIGlzX2RucnJvYmplY3QodikJCSgodiktPm9iX3R5cGUgPT0gJkRucnJ0eXBlKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBwYXNjYWwgdm9pZAotZG5ycl9kb25lKHJycCwgdWRwKQotCXN0cnVjdCBob3N0SW5mbyAqcnJwOwkvKiBVbnVzZWQgKi8KLQlkbnJyb2JqZWN0ICp1ZHA7Ci17Ci0JaWYgKCAhdWRwLT53YWl0aW5nICkgewotCQlwcmludGYoIm1hY2RucjogZG5ycl9kb25lOiBzcHVyaW91cyBjb21wbGV0aW9uIGNhbGwhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl1ZHAtPndhaXRpbmcgPSAwOwotCURFQ1JFRih1ZHApOwotfQotCi1zdGF0aWMgaW50IGRucndhaXQoc2VsZikKLQlkbnJyb2JqZWN0ICpzZWxmOwotewotCXdoaWxlICggc2VsZi0+d2FpdGluZyApIHsKLQkJaWYgKCBQeU1hY19JZGxlKCkgKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgb2JqZWN0ICoKLWRucnJfd2FpdChzZWxmLCBhcmdzKQotCWRucnJvYmplY3QgKnNlbGY7Ci0Jb2JqZWN0ICphcmdzOwotewotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICggIWRucndhaXQoc2VsZikgKSB7Ci0JCS8qIFhYWCBBbiBpbnRlcnJ1cHQgaXMgcGVuZGluZyAtLSBpcyB0aGlzIGNvcnJlY3Q/ICovCi0JCUlOQ1JFRihOb25lKTsKLQkJcmV0dXJuIE5vbmU7Ci0JfQotCWlmICggc2VsZi0+aGluZm8ucnRuQ29kZSApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBzZWxmLT5oaW5mby5ydG5Db2RlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi1kbnJyX2lzZG9uZShzZWxmLCBhcmdzKQotCWRucnJvYmplY3QgKnNlbGY7Ci0Jb2JqZWN0ICphcmdzOwotewotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdpbnRvYmplY3QoIXNlbGYtPndhaXRpbmcpOwotfQotCi1zdGF0aWMgc3RydWN0IG1ldGhvZGxpc3QgZG5ycl9tZXRob2RzW10gPSB7Ci0JeyJ3YWl0IiwJKG1ldGhvZClkbnJyX3dhaXQsCTF9LAotCXsiaXNkb25lIiwJKG1ldGhvZClkbnJyX2lzZG9uZSwJMX0sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KLX07Ci0KLS8qIC0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGRucnJvYmplY3QgKgotbmV3ZG5ycm9iamVjdCh0cCkKLQlpbnQgdHA7Ci17Ci0JZG5ycm9iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gTkVXT0JKKGRucnJvYmplY3QsICZEbnJydHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+dHlwZSA9IHRwOwotCXNlbGYtPndhaXRpbmcgPSAwOwotCW1lbXNldCgmc2VsZi0+aGluZm8sIDAsIHNpemVvZihzZWxmLT5oaW5mbykpOwotCXJldHVybiBzZWxmOwotfQotCi1zdGF0aWMgdm9pZAotZG5ycl9kZWFsbG9jKHNlbGYpCi0JZG5ycm9iamVjdCAqc2VsZjsKLXsKLQlzZWxmLT53YWl0aW5nID0gMDsgIC8qIE5vdCByZWFsbHkgbmVlZGVkLCBzaW5jZSB3ZSBpbmNyZWYgZm9yIGNvbXBsZXRpb24gKi8KLQlERUwoc2VsZik7Ci19Ci0KLS8qIENvZGUgdG8gYWNjZXNzIHN0cnVjdHVyZSBtZW1iZXJzIGJ5IGFjY2Vzc2luZyBhdHRyaWJ1dGVzICovCi0KLSNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKLQotI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2Yoc3RydWN0IHJldHVyblJlYywgeCkKLQotc3RhdGljIHN0cnVjdCBtZW1iZXJsaXN0IGRucnJfbWVtYmVybGlzdF9hZGRyW10gPSB7Ci0JeyAicnRuQ29kZSIsIFRfSU5ULCBPRkYocnRuQ29kZSksIFJPfSwKLQl7ICJjbmFtZSIsIFRfU1RSSU5HX0lOUExBQ0UsIE9GRihjbmFtZSksIFJPfSwKLQl7ICJpcDAiLCBUX1VJTlQsIE9GRihyZGF0YS5hZGRyWzBdKSwgUk99LAotCXsgImlwMSIsIFRfVUlOVCwgT0ZGKHJkYXRhLmFkZHJbMV0pLCBST30sCi0JeyAiaXAyIiwgVF9VSU5ULCBPRkYocmRhdGEuYWRkclsyXSksIFJPfSwKLQl7ICJpcDMiLCBUX1VJTlQsIE9GRihyZGF0YS5hZGRyWzNdKSwgUk99LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1iZXJsaXN0IGRucnJfbWVtYmVybGlzdF9oaW5mb1tdID0gewotCXsgInJ0bkNvZGUiLCBUX0lOVCwgT0ZGKHJ0bkNvZGUpLCBST30sCi0JeyAiY25hbWUiLCBUX1NUUklOR19JTlBMQUNFLCBPRkYoY25hbWUpLCBST30sCi0JeyAiY3B1VHlwZSIsIFRfU1RSSU5HX0lOUExBQ0UsIE9GRihyZGF0YS5oaW5mby5jcHVUeXBlKSwgUk99LAotCXsgIm9zVHlwZSIsIFRfU1RSSU5HX0lOUExBQ0UsIE9GRihyZGF0YS5oaW5mby5vc1R5cGUpLCBST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1lbWJlcmxpc3QgZG5ycl9tZW1iZXJsaXN0X214W10gPSB7Ci0JeyAicnRuQ29kZSIsIFRfSU5ULCBPRkYocnRuQ29kZSksIFJPfSwKLQl7ICJjbmFtZSIsIFRfU1RSSU5HX0lOUExBQ0UsIE9GRihjbmFtZSksIFJPfSwKLQl7ICJwcmVmZXJlbmNlIiwgVF9VU0hPUlQsIE9GRihyZGF0YS5teC5wcmVmZXJlbmNlKSwgUk99LAotCXsgImV4Y2hhbmdlIiwgVF9TVFJJTkdfSU5QTEFDRSwgT0ZGKHJkYXRhLm14LmV4Y2hhbmdlKSwgUk99LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtZW1iZXJsaXN0ICpkbnJyX21saXN0c1szXSA9IHsKLQlkbnJyX21lbWJlcmxpc3RfYWRkciwKLQlkbnJyX21lbWJlcmxpc3RfaGluZm8sCi0JZG5ycl9tZW1iZXJsaXN0X214Ci19OwotCi1zdGF0aWMgb2JqZWN0ICoKLWRucnJfZ2V0YXR0cihzZWxmLCBuYW1lKQotCWRucnJvYmplY3QgKnNlbGY7Ci0JY2hhciAqbmFtZTsKLXsKLQlvYmplY3QgKnJ2OwotCWludCB0cDsKLQkKLQlydiA9IGZpbmRtZXRob2QoZG5ycl9tZXRob2RzLCAob2JqZWN0ICopc2VsZiwgbmFtZSk7Ci0JaWYgKCBydiApIHJldHVybiBydjsKLQllcnJfY2xlYXIoKTsKLQlpZiAoIHNlbGYtPndhaXRpbmcgKQotCQlpZiAoICFkbnJ3YWl0KHNlbGYpICkgewotCQkJLyogWFhYIEFuIGludGVycnVwdCBpcyBwZW5kaW5nIC0tIGlzIHRoaXMgY29ycmVjdD8gKi8KLQkJCWVycl9zZXRzdHIoRXJyb3JPYmplY3QsICJSZXNvbHZlciBidXN5Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCXRwID0gc2VsZi0+dHlwZTsKLQlyZXR1cm4gZ2V0bWVtYmVyKChjaGFyICopJnNlbGYtPmhpbmZvLCBkbnJyX21saXN0c1t0cF0sIG5hbWUpOwotfQotCi0KLXN0YXRpYyB0eXBlb2JqZWN0IERucnJ0eXBlID0gewotCU9CX0hFQURfSU5JVCgmVHlwZXR5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiTWFjVENQIEROUiBSZXN1bHQiLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGRucnJvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkbnJyX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWRucnJfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLX07Ci0KLS8qIEVuZCBvZiBjb2RlIGZvciBNYWNUQ1AgRE5SIFJlc3VsdCBvYmplY3RzICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1pbnQgZG5yX2lzX29wZW47Ci0KLXN0YXRpYyBpbnQKLW9wZW5kbnIoZm4pCi0JY2hhciAqZm47Ci17Ci0JT1NFcnIgZXJyOwotCQotCWlmICggZG5yX2lzX29wZW4gKSByZXR1cm4gMTsKLQlpZiAoIChlcnI9T3BlblJlc29sdmVyKGZuKSkgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRucl9pc19vcGVuID0gMTsKLQlyZXR1cm4gMTsKLX0KLQkKLXN0YXRpYyBvYmplY3QgKgotZG5yX09wZW4oc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCWNoYXIgKmZuID0gTlVMTDsKLQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAifHMiLCAmZm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIGRucl9pc19vcGVuICkgewotCQllcnJfc2V0c3RyKEVycm9yT2JqZWN0LCAiRE5SIGFscmVhZHkgb3BlbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCAhb3BlbmRucihmbikgKQotCQlyZXR1cm4gTlVMTDsKLQlJTkNSRUYoTm9uZSk7Ci0JcmV0dXJuIE5vbmU7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotZG5yX0Nsb3NlKHNlbGYsIGFyZ3MpCi0Jb2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0KLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlkbnJfaXNfb3BlbiA9IDA7Ci0JaWYgKCAoZXJyPUNsb3NlUmVzb2x2ZXIoKSkgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi1kbnJfU3RyVG9BZGRyKHNlbGYsIGFyZ3MpCi0Jb2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0JY2hhciAqaG9zdG5hbWU7Ci0JZG5ycm9iamVjdCAqcnY7Ci0JUmVzdWx0VVBQIGNiX3VwcCA9IE5ld1Jlc3VsdFByb2MoZG5ycl9kb25lKTsKLQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAicyIsICZob3N0bmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICggIW9wZW5kbnIoTlVMTCkgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChydj1uZXdkbnJyb2JqZWN0KEROUl9BRERSKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWVyciA9IFN0clRvQWRkcihob3N0bmFtZSwgKHN0cnVjdCBob3N0SW5mbyAqKSZydi0+aGluZm8sIGNiX3VwcCwgKGNoYXIgKilydik7Ci0JaWYgKCBlcnIgPT0gY2FjaGVGYXVsdCApIHsKLQkJcnYtPndhaXRpbmcrKzsKLQkJSU5DUkVGKHJ2KTsKLQl9IGVsc2UgaWYgKCBlcnIgKSB7Ci0JCURFQ1JFRihydik7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAob2JqZWN0ICopcnY7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotZG5yX0FkZHJUb05hbWUoc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQl1bnNpZ25lZCBsb25nIGlwYWRkcjsKLQlkbnJyb2JqZWN0ICpydjsKLQlSZXN1bHRVUFAgY2JfdXBwID0gTmV3UmVzdWx0UHJvYyhkbnJyX2RvbmUpOwotCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICJsIiwgJmlwYWRkcikpCi0JCXJldHVybiBOVUxMOwotCWlmICggIW9wZW5kbnIoTlVMTCkgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChydj1uZXdkbnJyb2JqZWN0KEROUl9BRERSKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWVyciA9IEFkZHJUb05hbWUoaXBhZGRyLCAoc3RydWN0IGhvc3RJbmZvICopJnJ2LT5oaW5mbywgY2JfdXBwLCAoY2hhciAqKXJ2KTsKLQlpZiAoIGVyciA9PSBjYWNoZUZhdWx0ICkgewotCQlydi0+d2FpdGluZysrOwotCQlJTkNSRUYocnYpOwotCX0gZWxzZSBpZiAoIGVyciApIHsKLQkJREVDUkVGKHJ2KTsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChvYmplY3QgKilydjsKLX0KLQotc3RhdGljIG9iamVjdCAqCi1kbnJfQWRkclRvU3RyKHNlbGYsIGFyZ3MpCi0Jb2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0JdW5zaWduZWQgbG9uZyBpcGFkZHI7Ci0JY2hhciBpcG5hbWVbMTZdOwotCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICJsIiwgJmlwYWRkcikpCi0JCXJldHVybiBOVUxMOwotCWlmICggIW9wZW5kbnIoTlVMTCkgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChlcnI9QWRkclRvU3RyKGlwYWRkciwgaXBuYW1lKSkgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBuZXdzdHJpbmdvYmplY3QoaXBuYW1lKTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi1kbnJfSEluZm8oc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQljaGFyICpob3N0bmFtZTsKLQlkbnJyb2JqZWN0ICpydjsKLQlSZXN1bHRQcm9jMlVQUCBjYl91cHAgPSBOZXdSZXN1bHRQcm9jMlByb2MoZG5ycl9kb25lKTsKLQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAicyIsICZob3N0bmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICggIW9wZW5kbnIoTlVMTCkgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChydj1uZXdkbnJyb2JqZWN0KEROUl9ISU5GTykpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBISW5mbyhob3N0bmFtZSwgJnJ2LT5oaW5mbywgY2JfdXBwLCAoY2hhciAqKXJ2KTsKLQlpZiAoIGVyciA9PSBjYWNoZUZhdWx0ICkgewotCQlydi0+d2FpdGluZysrOwotCQlJTkNSRUYocnYpOwotCX0gZWxzZSBpZiAoIGVyciApIHsKLQkJREVDUkVGKHJ2KTsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChvYmplY3QgKilydjsKLQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi1kbnJfTVhJbmZvKHNlbGYsIGFyZ3MpCi0Jb2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0JY2hhciAqaG9zdG5hbWU7Ci0JZG5ycm9iamVjdCAqcnY7Ci0JUmVzdWx0UHJvYzJVUFAgY2JfdXBwID0gTmV3UmVzdWx0UHJvYzJQcm9jKGRucnJfZG9uZSk7Ci0KLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgInMiLCAmaG9zdG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoICFvcGVuZG5yKE5VTEwpICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAocnY9bmV3ZG5ycm9iamVjdChETlJfTVgpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTVhJbmZvKGhvc3RuYW1lLCAmcnYtPmhpbmZvLCBjYl91cHAsIChjaGFyICopcnYpOwotCWlmICggZXJyID09IGNhY2hlRmF1bHQgKSB7Ci0JCXJ2LT53YWl0aW5nKys7Ci0JCUlOQ1JFRihydik7Ci0JfSBlbHNlIGlmICggZXJyICkgewotCQlERUNSRUYocnYpOwotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKG9iamVjdCAqKXJ2OwotfQotCi0vKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWV0aG9kbGlzdCBkbnJfbWV0aG9kc1tdID0gewotCXsiT3BlbiIsCWRucl9PcGVuLAkxfSwKLQl7IkNsb3NlIiwJZG5yX0Nsb3NlLAkxfSwKLQl7IlN0clRvQWRkciIsCWRucl9TdHJUb0FkZHIsCTF9LAotCXsiQWRkclRvU3RyIiwJZG5yX0FkZHJUb1N0ciwJMX0sCi0JeyJBZGRyVG9OYW1lIiwJZG5yX0FkZHJUb05hbWUsCTF9LAotCXsiSEluZm8iLAlkbnJfSEluZm8sCTF9LAotCXsiTVhJbmZvIiwJZG5yX01YSW5mbywJMX0sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KLX07Ci0KLQotLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdG1hY2RucikgKi8KLQotdm9pZAotaW5pdG1hY2RucigpCi17Ci0Jb2JqZWN0ICptLCAqZDsKLQotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBpbml0bW9kdWxlKCJtYWNkbnIiLCBkbnJfbWV0aG9kcyk7Ci0KLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBnZXRtb2R1bGVkaWN0KG0pOwotCUVycm9yT2JqZWN0ID0gbmV3c3RyaW5nb2JqZWN0KCJtYWNkbnIuZXJyb3IiKTsKLQlkaWN0aW5zZXJ0KGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKLSNpZiAwCi0vKiBOb3QgbmVlZGVkLCBhZnRlciBhbGwgKi8KLSNkZWZpbmUgQ09OU1QobmFtZSwgdmFsdWUpIG8gPSBuZXdpbnRvYmplY3QodmFsdWUpOyBkaWN0aW5zZXJ0KGQsIG5hbWUsIG8pOwotCUNPTlNUKCJBRERSIiwgRE5SX0FERFIpOwotCUNPTlNUKCJISU5GTyIsIEROUl9ISU5GTyk7Ci0JQ09OU1QoIk1YIiwgRE5SX01YKTsKLSNlbmRpZgotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoZXJyX29jY3VycmVkKCkpCi0JCWZhdGFsKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBtYWNkbnIiKTsKLX0KZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjdGNwbW9kdWxlLmMgYi9NYWMvVW5zdXBwb3J0ZWQvbWFjdGNwL21hY3RjcG1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzA3ZjFlLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjdGNwbW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCBieSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sCi1BbXN0ZXJkYW0sIFRoZSBOZXRoZXJsYW5kcy4KLQotICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAotcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAotc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAotQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KLWRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgotCi1TVElDSFRJTkcgTUFUSEVNQVRJU0NIIENFTlRSVU0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCi1USElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECi1GSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBTVElDSFRJTkcgTUFUSEVNQVRJU0NIIENFTlRSVU0gQkUgTElBQkxFCi1GT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCi1BQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAotT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWxsb2JqZWN0cy5oIgotI2luY2x1ZGUgIm1vZHN1cHBvcnQuaCIJCS8qIEZvciBnZXRhcmdzKCkgZXRjLiAqLwotCi0jaW5jbHVkZSAibWFjZ2x1ZS5oIgotI2luY2x1ZGUgInRjcGdsdWUuaCIKLQotI2luY2x1ZGUgPERlc2suaD4KLQotLyogU3RhdGUgb2YgYSB0Y3Agc3RyZWFtLCBpbiB0aGUgY29ubmVjdGlvblN0YXRlIGZpZWxkICovCi0jZGVmaW5lIFNUQVRFX0NMT1NFRAkwCi0jZGVmaW5lIFNUQVRFX0xJU1RFTgkyCi0jZGVmaW5lIFNUQVRFX0VTVEFCCQk4Ci0jZGVmaW5lIFNUQVRFX0NXQUlUCQkxOAotCi0vKiBQeXRob24gY29kZSBoYXMgYW4gYWRkaXRpb25hbCByZWFzb24gZm9yIGFzciBjYWxsOiBvcGVuIGRvbmUgKi8KLSNkZWZpbmUgTVlfT1BFTl9ET05FCTMyNzY2Ci0KLXN0YXRpYyBvYmplY3QgKkVycm9yT2JqZWN0OwotCi1UQ1BJT0NvbXBsZXRpb25VUFAJdXBwX3RjcF9kb25lOwotVENQTm90aWZ5VVBQCQl1cHBfdGNwX2FzcjsKLSNpZiAwCi1VRFBJT0NvbXBsZXRpb25VUFAJdXBwX3VkcF9kb25lOwotI2VuZGlmCi1VRFBOb3RpZnlVUFAJCXVwcF91ZHBfYXNyOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgTWFjVENQIGNvbm5lY3Rpb24gc3RhdHVzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlPQl9IRUFECi0JVENQU3RhdHVzUEIgc3RhdHVzOwotfSB0Y3Bjc29iamVjdDsKLQotc3RhdGljZm9yd2FyZCB0eXBlb2JqZWN0IFRjcGNzdHlwZTsKLQotI2RlZmluZSBpc190Y3Bjc29iamVjdCh2KQkJKCh2KS0+b2JfdHlwZSA9PSAmVGNwY3N0eXBlKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBNYWNUQ1AgZ2xvYmFsIHN0YXR1cyAqLwotCi0jaWZkZWYgVENQX0dTCi10eXBlZGVmIHN0cnVjdCB7Ci0JT0JfSEVBRAotCVRDUFBhcmFtICpwdHI7Ci19IHRjcGdzb2JqZWN0OwotCi1zdGF0aWNmb3J3YXJkIHR5cGVvYmplY3QgVGNwZ3N0eXBlOwotCi0jZGVmaW5lIGlzX3RjcGdzb2JqZWN0KHYpCQkoKHYpLT5vYl90eXBlID09ICZUY3Bnc3R5cGUpCi0jZW5kaWYgLyogVENQX0dTICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIE1hY1RDUCBUQ1Agc3RyZWFtICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlPQl9IRUFECi0JVENQaW9wYiBpb3A7Ci0JbG9uZyBsb2NhbGhvc3Q7CQkJLyogT3VyIElQIGFkZHJlc3MgKi8KLQlzaG9ydCBsb2NhbHBvcnQ7CQkvKiBPdXIgcG9ydCBudW1iZXIgKi8KLQlvYmplY3QgKmFzcjsJCQkvKiBPcHRpb25hbCBhc3luYyBub3RpZmljYXRpb24gcm91dGluZSAqLwotCWludCBhc3JfZWM7CQkJCS8qIGVycm9yIGNvZGUgcGFyYW1ldGVyIHRvIGFzciAqLwotCWludCBhc3JfcmVhc29uOwkJCS8qIGRldGFpbCBmb3Igc29tZSBlcnJvcnMgKi8KLQlpbnQgYXN5bmNfYnVzeTsJCQkvKiBUcnVlIHdoZW4gY29tcGxldGlvbiByb3V0aW5lIHBlbmRpbmcgKi8KLQlpbnQgYXN5bmNfZXJyOwkJCS8qIHRoZSBlcnJvciBmb3IgdGhlIGFzeW5jIGNhbGwgKi8KLX0gdGNwc29iamVjdDsKLQotc3RhdGljZm9yd2FyZCB0eXBlb2JqZWN0IFRjcHN0eXBlOwotCi0jZGVmaW5lIGlzX3RjcHNvYmplY3QodikJCSgodiktPm9iX3R5cGUgPT0gJlRjcHN0eXBlKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBNYWNUQ1AgVURQIHN0cmVhbSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JT0JfSEVBRAotCVVEUGlvcGIgaW9wOwotCW9iamVjdCAqYXNyOwotCWludCBhc3JfZWM7CQkJCS8qIGVycm9yIGNvZGUgcGFyYW1ldGVyIHRvIGFzciAqLwotCWlwX3BvcnQgcG9ydDsKLX0gdWRwc29iamVjdDsKLQotc3RhdGljZm9yd2FyZCB0eXBlb2JqZWN0IFVkcHN0eXBlOwotCi0jZGVmaW5lIGlzX3VkcHNvYmplY3QodikJCSgodiktPm9iX3R5cGUgPT0gJlVkcHN0eXBlKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB0Y3Bjc29iamVjdCAqCi1uZXd0Y3Bjc29iamVjdChwdHIpCi0JVENQU3RhdHVzUEIgKnB0cjsKLXsKLQl0Y3Bjc29iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gTkVXT0JKKHRjcGNzb2JqZWN0LCAmVGNwY3N0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5zdGF0dXMgPSAqcHRyOwotCXJldHVybiBzZWxmOwotfQotCi1zdGF0aWMgdm9pZAotdGNwY3NfZGVhbGxvYyhzZWxmKQotCXRjcGNzb2JqZWN0ICpzZWxmOwotewotCURFTChzZWxmKTsKLX0KLS8qIENvZGUgdG8gYWNjZXNzIHN0cnVjdHVyZSBtZW1iZXJzIGJ5IGFjY2Vzc2luZyBhdHRyaWJ1dGVzICovCi0KLSNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKLQotI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoVENQU3RhdHVzUEIsIHgpCi0KLXN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCB0Y3Bjc19tZW1iZXJsaXN0W10gPSB7Ci0JeyJyZW1vdGVIb3N0IiwgCQlUX1VMT05HLCAJT0ZGKHJlbW90ZUhvc3QpLCAJCVJPfSwKLQl7InJlbW90ZVBvcnQiLCAJCVRfVVNIT1JULCAJT0ZGKHJlbW90ZVBvcnQpLCAJCVJPfSwKLQl7ImxvY2FsSG9zdCIsIAkJVF9VSU5ULCAJT0ZGKGxvY2FsSG9zdCksIAkJUk99LAotCXsibG9jYWxQb3J0IiwgCQlUX1VTSE9SVCwgCU9GRihsb2NhbFBvcnQpLCAJCVJPfSwKLQl7InRvc0ZsYWdzIiwgCQlUX0JZVEUsIAlPRkYodG9zRmxhZ3MpLCAJCQlST30sCi0jaWYgMCAgLyogQnVnIGluIGhlYWRlciBmaWxlOiBjYW5ub3QgYWNjZXNzIHByZWNlZGVuY2UgKi8KLQl7InByZWNlZGVuY2UiIAkJVF9CWVRFLCAJT0ZGKHByZWNlZGVuY2UpLCAJCVJPfSwKLSNlbmRpZgotCXsiY29ubmVjdGlvblN0YXRlIiwgVF9CWVRFLCAJT0ZGKGNvbm5lY3Rpb25TdGF0ZSksIAlST30sCi0JeyJzZW5kV2luZG93IiwgCQlUX1VTSE9SVCwgCU9GRihzZW5kV2luZG93KSwgCQlST30sCi0JeyJyY3ZXaW5kb3ciLCAJCVRfVVNIT1JULCAJT0ZGKHJjdldpbmRvdyksIAkJUk99LAotCXsiYW10VW5hY2tlZERhdGEiLCAJVF9VU0hPUlQsIAlPRkYoYW10VW5hY2tlZERhdGEpLCAJUk99LAotCXsiYW10VW5yZWFkRGF0YSIsIAlUX1VTSE9SVCwgCU9GRihhbXRVbnJlYWREYXRhKSwgCVJPfSwKLQl7InNlbmRVbmFja2VkIiwJCVRfVUlOVCwgCU9GRihzZW5kVW5hY2tlZCksIAkJUk99LAotCXsic2VuZE5leHQiLCAJCVRfVUlOVCwgCU9GRihzZW5kTmV4dCksIAkJCVJPfSwKLQl7ImNvbmdlc3Rpb25XaW5kb3ciLCBUX1VJTlQsIAlPRkYoY29uZ2VzdGlvbldpbmRvdyksIAlST30sCi0JeyJyY3ZOZXh0IiwgCQlUX1VJTlQsIAlPRkYocmN2TmV4dCksIAkJCVJPfSwKLQl7InNydHQiLCAJCQlUX1VJTlQsIAlPRkYoc3J0dCksIAkJCQlST30sCi0JeyJsYXN0UlRUIiwJCQlUX1VJTlQsCQlPRkYobGFzdFJUVCksCQkJUk99LAotCXsic2VuZE1heFNlZ1NpemUiLAlUX1VJTlQsCQlPRkYoc2VuZE1heFNlZ1NpemUpLAlST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCi19OwotCi1zdGF0aWMgb2JqZWN0ICoKLXRjcGNzX2dldGF0dHIoc2VsZiwgbmFtZSkKLQl0Y3Bjc29iamVjdCAqc2VsZjsKLQljaGFyICpuYW1lOwotewotCXJldHVybiBnZXRtZW1iZXIoKGNoYXIgKikmc2VsZi0+c3RhdHVzLCB0Y3Bjc19tZW1iZXJsaXN0LCBuYW1lKTsKLX0KLQotCi1zdGF0aWMgdHlwZW9iamVjdCBUY3Bjc3R5cGUgPSB7Ci0JT0JfSEVBRF9JTklUKCZUeXBldHlwZSkKLQkwLAkJCQkJCQkvKm9iX3NpemUqLwotCSJNYWNUQ1AgY29ubmVjdGlvbiBzdGF0dXMiLAkvKnRwX25hbWUqLwotCXNpemVvZih0Y3Bjc29iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXRjcGNzX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpdGNwY3NfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJCQkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkJCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCQkJLyp0cF9oYXNoKi8KLX07Ci0KLS8qIEVuZCBvZiBjb2RlIGZvciBNYWNUQ1AgY29ubmVjdGlvbiBzdGF0dXMgb2JqZWN0cyAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmZGVmIFRDUF9HUwotc3RhdGljIHRjcGdzb2JqZWN0ICoKLW5ld3RjcGdzb2JqZWN0KHB0cikKLQlUQ1BQYXJhbSAqcHRyOwotewotCXRjcGdzb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBORVdPQkoodGNwZ3NvYmplY3QsICZUY3Bnc3R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnB0ciA9IHB0cjsKLQlyZXR1cm4gc2VsZjsKLX0KLQotc3RhdGljIHZvaWQKLXRjcGdzX2RlYWxsb2Moc2VsZikKLQl0Y3Bnc29iamVjdCAqc2VsZjsKLXsKLQlERUwoc2VsZik7Ci19Ci0vKiBDb2RlIHRvIGFjY2VzcyBzdHJ1Y3R1cmUgbWVtYmVycyBieSBhY2Nlc3NpbmcgYXR0cmlidXRlcyAqLwotI3VuZGVmIE9GRgotI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoVENQUGFyYW0sIHgpCi0KLXN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCB0Y3Bnc19tZW1iZXJsaXN0W10gPSB7Ci0JeyJSdG9BIiwJCVRfVUlOVCwJT0ZGKHRjcFJ0b0EpLAkJUk99LAotCXsiUnRvTWluIiwJCVRfVUlOVCwJT0ZGKHRjcFJ0b01pbiksCQlST30sCi0JeyJSdG9NYXgiLAkJVF9VSU5ULAlPRkYodGNwUnRvTWF4KSwJCVJPfSwKLQl7Ik1heFNlZ1NpemUiLAlUX1VJTlQsCU9GRih0Y3BNYXhTZWdTaXplKSwJUk99LAotCXsiTWF4Q29ubiIsCQlUX1VJTlQsCU9GRih0Y3BNYXhDb25uKSwJUk99LAotCXsiTWF4V2luZG93IiwJVF9VSU5ULAlPRkYodGNwTWF4V2luZG93KSwJUk99LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLwotfTsKLQotc3RhdGljIG9iamVjdCAqCi10Y3Bnc19nZXRhdHRyKHNlbGYsIG5hbWUpCi0JdGNwZ3NvYmplY3QgKnNlbGY7Ci0JY2hhciAqbmFtZTsKLXsKLQlvYmplY3QgKnJ2OwotCQotCXJldHVybiBnZXRtZW1iZXIoKGNoYXIgKilzZWxmLT5wdHIsIHRjcGdzX21lbWJlcmxpc3QsIG5hbWUpOwotfQotCi1zdGF0aWMgdHlwZW9iamVjdCBUY3Bnc3R5cGUgPSB7Ci0JT0JfSEVBRF9JTklUKCZUeXBldHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJNYWNUQ1AgZ2xvYmFsIHN0YXR1cyIsCQkJLyp0cF9uYW1lKi8KLQlzaXplb2YodGNwZ3NvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0Y3Bnc19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyl0Y3Bnc19nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotfTsKLSNlbmRpZiAvKiBUQ1BfR1MgKi8KLQotLyogRW5kIG9mIGNvZGUgZm9yIE1hY1RDUCBnbG9iYWwgc3RhdHVzIG9iamVjdHMgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQKLXRjcHNfY2hlY2tzdGF0ZShzZWxmLCBzdGF0ZSwgc3RhdGUyKQotCXRjcHNvYmplY3QgKnNlbGY7Ci0JaW50IHN0YXRlLCBzdGF0ZTI7Ci17Ci0JT1NFcnIgZXJyOwotCVRDUFN0YXR1c1BCICpwYjsKLQljaGFyIGJ1Zls4MF07Ci0JCi0JaWYgKCBzZWxmLT5hc3luY19idXN5ICkgewotCQllcnJfc2V0c3RyKEVycm9yT2JqZWN0LCAiT3BlcmF0aW9uIG5vdCBhbGxvd2VkLCBQYXNzaXZlT3BlbiBpbiBwcm9ncmVzcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICggc3RhdGUgPCAwICYmIHN0YXRlMiA8IDAgKQotCQlyZXR1cm4gMDsKLQllcnIgPSB4VENQU3RhdHVzKCZzZWxmLT5pb3AsICZwYik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIHN0YXRlID09IHBiLT5jb25uZWN0aW9uU3RhdGUgfHwKLQkJIHN0YXRlMiA9PSBwYi0+Y29ubmVjdGlvblN0YXRlICkKLQkJIHJldHVybiAwOwotCXNwcmludGYoYnVmLCAiT3BlcmF0aW9uIG5vdCBhbGxvd2VkLCBjb25uZWN0aW9uIHN0YXRlPSVkIiwgcGItPmNvbm5lY3Rpb25TdGF0ZSk7Ci0JZXJyX3NldHN0cihFcnJvck9iamVjdCwgYnVmKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcHNfYXNyX3NhZmUoYXJnKQotCXZvaWQgKmFyZzsKLXsKLQl0Y3Bzb2JqZWN0ICpzZWxmID0gKHRjcHNvYmplY3QgKilhcmc7Ci0Jb2JqZWN0ICphcmdzLCAqcnY7Ci0JCi0JaWYgKCBzZWxmLT5hc3IgPT0gTm9uZSApCi0JCXJldHVybiAwOwotCWFyZ3MgPSBta3ZhbHVlKCIoaWkpIiwgc2VsZi0+YXNyX2VjLCBzZWxmLT5hc3JfcmVhc29uKTsKLQlydiA9IGNhbGxfb2JqZWN0KHNlbGYtPmFzciwgYXJncyk7Ci0JREVDUkVGKGFyZ3MpOwotCWlmICggcnYgKSB7Ci0JCURFQ1JFRihydik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBwYXNjYWwgdm9pZAotdGNwc19hc3Ioc3RyLCBlYywgc2VsZiwgcmVhc29uLCBpY21wKQotCVN0cmVhbVB0ciBzdHI7Ci0JdW5zaWduZWQgc2hvcnQgZWM7Ci0JdGNwc29iamVjdCAqc2VsZjsKLQl1bnNpZ25lZCBzaG9ydCByZWFzb247Ci0Jc3RydWN0IElDTVBSZXBvcnQgaWNtcDsKLXsKLQlpZiAoIHNlbGYtPmFzciA9PSBOb25lICkKLQkJcmV0dXJuOwotCXNlbGYtPmFzcl9lYyA9IGVjOwotCXNlbGYtPmFzcl9yZWFzb24gPSByZWFzb247Ci0JUHlfQWRkUGVuZGluZ0NhbGwodGNwc19hc3Jfc2FmZSwgKHZvaWQgKilzZWxmKTsKLX0KLQotc3RhdGljIHZvaWQKLXRjcHNfZG9uZShwYikKLQlUQ1Bpb3BiICpwYjsKLXsKLQl0Y3Bzb2JqZWN0ICpzZWxmID0gKHRjcHNvYmplY3QgKilwYi0+Y3NQYXJhbS5vcGVuLnVzZXJEYXRhUHRyOwotCQotCWlmICggcGIgIT0gJnNlbGYtPmlvcCB8fCAhc2VsZi0+YXN5bmNfYnVzeSApIHsKLQkJLyogT29wcy4uLiBwcm9ibGVtcyAqLwotCQlwcmludGYoInRjcHNfZG9uZTogdW5leHBlY3RlZCBjYWxsXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlzZWxmLT5hc3luY19idXN5ID0gMDsKLQlzZWxmLT5hc3luY19lcnIgPSBwYi0+aW9SZXN1bHQ7Ci0JLyogRXh0ZW5zaW9uIG9mIG1hY3RjcCBzZW1hbnRpY3M6IGFsc28gY2FsbCBhc3Igb24gb3BlbiBjb21wbGV0ZSAqLwotCWlmICggc2VsZi0+YXNyID09IE5vbmUgKQotCQlyZXR1cm47Ci0Jc2VsZi0+YXNyX2VjID0gTVlfT1BFTl9ET05FOwotCXNlbGYtPmFzcl9yZWFzb24gPSAwOwotCVB5X0FkZFBlbmRpbmdDYWxsKHRjcHNfYXNyX3NhZmUsICh2b2lkICopc2VsZik7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotdGNwc19pc2RvbmUoc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3aW50b2JqZWN0KCFzZWxmLT5hc3luY19idXN5KTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi10Y3BzX3dhaXQoc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoIHNlbGYtPmFzeW5jX2J1c3kgKSB7Ci0JCWlmICggUHlNYWNfSWRsZSgpICkgewotCQkJSU5DUkVGKE5vbmUpOwotCQkJcmV0dXJuIE5vbmU7Ci0JCX0KLQl9Ci0JaWYgKCBzZWxmLT5hc3luY19lcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgc2VsZi0+YXN5bmNfZXJyKTsKLQkJc2VsZi0+YXN5bmNfZXJyID0gMDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotCi1zdGF0aWMgb2JqZWN0ICoKLXRjcHNfUGFzc2l2ZU9wZW4oc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQlzaG9ydCBwb3J0OwotCU9TRXJyIGVycjsKLQkKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgImgiLCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCWlmICggdGNwc19jaGVja3N0YXRlKHNlbGYsIC0xLCAtMSkgPCAwICkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+YXN5bmNfYnVzeSA9IDE7Ci0Jc2VsZi0+YXN5bmNfZXJyID0gMDsKLQllcnIgPSB4VENQUGFzc2l2ZU9wZW4oJnNlbGYtPmlvcCwgcG9ydCwgdXBwX3RjcF9kb25lLAotCQkJCQkJICh2b2lkICopc2VsZik7Ci0JaWYgKCBlcnIgKSB7Ci0JCXNlbGYtPmFzeW5jX2J1c3kgPSAwOwotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmLT5sb2NhbGhvc3QgPSBzZWxmLT5pb3AuY3NQYXJhbS5vcGVuLmxvY2FsSG9zdDsKLQlzZWxmLT5sb2NhbHBvcnQgPSBzZWxmLT5pb3AuY3NQYXJhbS5vcGVuLmxvY2FsUG9ydDsKLQlJTkNSRUYoTm9uZSk7Ci0JcmV0dXJuIE5vbmU7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotdGNwc19BY3RpdmVPcGVuKHNlbGYsIGFyZ3MpCi0JdGNwc29iamVjdCAqc2VsZjsKLQlvYmplY3QgKmFyZ3M7Ci17Ci0Jc2hvcnQgbHBvcnQsIHJwb3J0OwotCWxvbmcgcmhvc3Q7Ci0JT1NFcnIgZXJyOwotCQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAiaGxoIiwgJmxwb3J0LCAmcmhvc3QsICZycG9ydCkpCi0JCXJldHVybiBOVUxMOwotCWlmICggdGNwc19jaGVja3N0YXRlKHNlbGYsIC0xLCAtMSkgPCAwICkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0geFRDUEFjdGl2ZU9wZW4oJnNlbGYtPmlvcCwgbHBvcnQsIHJob3N0LCBycG9ydCwgKFRDUElPQ29tcGxldGlvblVQUCkwKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CQotCXNlbGYtPmxvY2FsaG9zdCA9IHNlbGYtPmlvcC5jc1BhcmFtLm9wZW4ubG9jYWxIb3N0OwotCXNlbGYtPmxvY2FscG9ydCA9IHNlbGYtPmlvcC5jc1BhcmFtLm9wZW4ubG9jYWxQb3J0OwotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi10Y3BzX1NlbmQoc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnNpemU7Ci0JaW50IHB1c2ggPSAwLCB1cmdlbnQgPSAwOwotCU9TRXJyIGVycjsKLQltaW5pd2RzIHdkczsKLQkKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgInMjfGlpIiwgJmJ1ZiwgJmJ1ZnNpemUsICZwdXNoLCAmdXJnZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCB0Y3BzX2NoZWNrc3RhdGUoc2VsZiwgU1RBVEVfRVNUQUIsIFNUQVRFX0NXQUlUKSA8IDAgKQotCQlyZXR1cm4gTlVMTDsKLQl3ZHMubGVuZ3RoID0gYnVmc2l6ZTsKLQl3ZHMucHRyID0gYnVmOwotCXdkcy50ZXJtaW51cyA9IDA7Ci0JZXJyID0geFRDUFNlbmQoJnNlbGYtPmlvcCwgKHdkc0VudHJ5ICopJndkcywgKEJvb2xlYW4pcHVzaCwgKEJvb2xlYW4pdXJnZW50LAotCQkJCQkoVENQSU9Db21wbGV0aW9uVVBQKTApOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlJTkNSRUYoTm9uZSk7Ci0JcmV0dXJuIE5vbmU7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotdGNwc19SY3Yoc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQlpbnQgdGltZW91dDsKLQlyZHNFbnRyeSByZHNbMl07Ci0JT1NFcnIgZXJyOwotCW9iamVjdCAqcnY7Ci0JaW50IHVyZ2VudCwgbWFyazsKLQkKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgImkiLCAmdGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCWlmICggdGNwc19jaGVja3N0YXRlKHNlbGYsIC0xLCAtMSkgPCAwICkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KChjaGFyICopJnJkcywgMCwgc2l6ZW9mKHJkcykpOwotCWVyciA9IHhUQ1BOb0NvcHlSY3YoJnNlbGYtPmlvcCwgcmRzLCAxLCB0aW1lb3V0LCAoVENQSU9Db21wbGV0aW9uVVBQKTApOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl1cmdlbnQgPSBzZWxmLT5pb3AuY3NQYXJhbS5yZWNlaXZlLnVyZ2VudEZsYWc7Ci0JbWFyayA9IHNlbGYtPmlvcC5jc1BhcmFtLnJlY2VpdmUubWFya0ZsYWc7Ci0JcnYgPSBuZXdzaXplZHN0cmluZ29iamVjdCgoY2hhciAqKXJkc1swXS5wdHIsIHJkc1swXS5sZW5ndGgpOwotCWVyciA9IHhUQ1BCdWZSZXR1cm4oJnNlbGYtPmlvcCwgcmRzLCAoVENQSU9Db21wbGV0aW9uVVBQKTApOwotCWlmICggZXJyICkgewotCQkvKiBTaG91bGQgbm90IGhhcHBlbiAqL3ByaW50ZigibWFjdGNwIG1vZHVsZTogQnVmUmV0dXJuIGZhaWxlZD9cbiIpOwotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCURFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbWt2YWx1ZSgiKE9paSkiLCBydiwgdXJnZW50LCBtYXJrKTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi10Y3BzX0Nsb3NlKHNlbGYsIGFyZ3MpCi0JdGNwc29iamVjdCAqc2VsZjsKLQlvYmplY3QgKmFyZ3M7Ci17Ci0JT1NFcnIgZXJyOwotCQotCWlmICghbmV3Z2V0YXJncyhhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IHhUQ1BDbG9zZSgmc2VsZi0+aW9wLCAoVENQSU9Db21wbGV0aW9uVVBQKTApOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlJTkNSRUYoTm9uZSk7Ci0JcmV0dXJuIE5vbmU7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotdGNwc19BYm9ydChzZWxmLCBhcmdzKQotCXRjcHNvYmplY3QgKnNlbGY7Ci0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQkKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSB4VENQQWJvcnQoJnNlbGYtPmlvcCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLQotc3RhdGljIG9iamVjdCAqCi10Y3BzX1N0YXR1cyhzZWxmLCBhcmdzKQotCXRjcHNvYmplY3QgKnNlbGY7Ci0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQlUQ1BTdGF0dXNQQiAqcGI7Ci0JCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCB0Y3BzX2NoZWNrc3RhdGUoc2VsZiwgLTEsIC0xKSA8IDAgKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSB4VENQU3RhdHVzKCZzZWxmLT5pb3AsICZwYik7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAob2JqZWN0ICopbmV3dGNwY3NvYmplY3QocGIpOwotfQotCi1zdGF0aWMgb2JqZWN0ICoKLXRjcHNfR2V0U29ja05hbWUoc2VsZiwgYXJncykKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQkvKiBUaGlzIHJvdXRpbmUgaXMgbmVlZGVkIHNvIHdlIGNhbiBnZXQgYXQgdGhlIGxvY2FsIHBvcnQgZXZlbiB3aGVuCi0JKiogYSBQYXNzaXZlT3BlbiBpcyBpbiBwcm9ncmVzcyAod2hlbiB3ZSBjYW4ndCBkbyBhIFN0YXR1cyBjYWxsKS4KLQkqKiBUaGlzIGlzIG5lZWRlZCBmb3Igc29ja2V0IGxpc3RlbigpOyBnZXRzb2NrbmFtZSgpOyBhY2NlcHQoKSBlbXVsYXRpb24KLQkqKiBhcyB1c2VkIGJ5IGZ0cCBhbmQgdGhlIGxpa2UuCi0JKi8JCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG1rdmFsdWUoIihsaCkiLCBzZWxmLT5sb2NhbGhvc3QsIHNlbGYtPmxvY2FscG9ydCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbWV0aG9kbGlzdCB0Y3BzX21ldGhvZHNbXSA9IHsKLQl7ImlzZG9uZSIsCShtZXRob2QpdGNwc19pc2RvbmUsCTF9LAotCXsid2FpdCIsCShtZXRob2QpdGNwc193YWl0LAkJMX0sCi0JeyJQYXNzaXZlT3BlbiIsCShtZXRob2QpdGNwc19QYXNzaXZlT3BlbiwJMX0sCi0JeyJBY3RpdmVPcGVuIiwJKG1ldGhvZCl0Y3BzX0FjdGl2ZU9wZW4sCTF9LAotCXsiU2VuZCIsCShtZXRob2QpdGNwc19TZW5kLAkxfSwKLQl7IlJjdiIsCShtZXRob2QpdGNwc19SY3YsCTF9LAotCXsiQ2xvc2UiLAkobWV0aG9kKXRjcHNfQ2xvc2UsCTF9LAotCXsiQWJvcnQiLAkobWV0aG9kKXRjcHNfQWJvcnQsCTF9LAotCXsiU3RhdHVzIiwJKG1ldGhvZCl0Y3BzX1N0YXR1cywJMX0sCi0JeyJHZXRTb2NrTmFtZSIsIChtZXRob2QpdGNwc19HZXRTb2NrTmFtZSwgMX0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KLX07Ci0KLS8qIC0tLS0tLS0tLS0gKi8KLQotc3RhdGljIG9iamVjdCAqCi10Y3BzX2dldGF0dHIoc2VsZiwgbmFtZSkKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotCWNoYXIgKm5hbWU7Ci17Ci0JaWYgKCBzdHJjbXAobmFtZSwgImFzciIpID09IDAgKSB7Ci0JCUlOQ1JFRihzZWxmLT5hc3IpOwotCQlyZXR1cm4gc2VsZi0+YXNyOwotCX0KLQlyZXR1cm4gZmluZG1ldGhvZCh0Y3BzX21ldGhvZHMsIChvYmplY3QgKilzZWxmLCBuYW1lKTsKLX0KLQotc3RhdGljIGludAotdGNwc19zZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQotCXRjcHNvYmplY3QgKnNlbGY7Ci0JY2hhciAqbmFtZTsKLQlvYmplY3QgKnZhbHVlOwotewotCWlmICggc3RyY21wKG5hbWUsICJhc3IiKSAhPSAwIHx8IHZhbHVlID09IE5VTEwgKQotCQlyZXR1cm4gLTE7Ci0Jc2VsZi0+YXNyID0gdmFsdWU7CS8qIFhYWFggQXNzdW1pbmcgSSBkb24ndCBoYXZlIHRvIGluY3JlZiAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdGNwc29iamVjdCAqCi1uZXd0Y3Bzb2JqZWN0KGJ1ZnNpemUpCi0JaW50IGJ1ZnNpemU7Ci17Ci0JdGNwc29iamVjdCAqc2VsZjsKLQlPU0VyciBlcnI7Ci0JCi0Jc2VsZiA9IE5FV09CSih0Y3Bzb2JqZWN0LCAmVGNwc3R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldCgoY2hhciAqKSZzZWxmLT5pb3AsIDAsIHNpemVvZihzZWxmLT5pb3ApKTsKLQllcnI9IHhUQ1BDcmVhdGUoYnVmc2l6ZSwgdXBwX3RjcF9hc3IsICh2b2lkICopc2VsZiwgJnNlbGYtPmlvcCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCURFTChzZWxmKTsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JSU5DUkVGKE5vbmUpOwotCXNlbGYtPmxvY2FsaG9zdCA9IDA7Ci0Jc2VsZi0+bG9jYWxwb3J0ID0gMDsKLQlzZWxmLT5hc3IgPSBOb25lOwotCXNlbGYtPmFzeW5jX2J1c3kgPSAwOwotCXNlbGYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0dXJuIHNlbGY7Ci19Ci0KLXN0YXRpYyB2b2lkCi10Y3BzX2RlYWxsb2Moc2VsZikKLQl0Y3Bzb2JqZWN0ICpzZWxmOwotewotCWlmICggc2VsZi0+YXN5bmNfYnVzeSApIHsKLQkJcHJpbnRmKCJtYWN0Y3AgbW9kdWxlOiBlcnJvcjogZGVhbGxvYyB3aXRoIGFzeW5jIGJ1c3lcbiIpOwotCQlyZXR1cm47Ci0JfQotCXhUQ1BSZWxlYXNlKCZzZWxmLT5pb3ApOwotCURFTChzZWxmKTsKLX0KLQotc3RhdGljIHR5cGVvYmplY3QgVGNwc3R5cGUgPSB7Ci0JT0JfSEVBRF9JTklUKCZUeXBldHlwZSkKLQkwLAkJCQkJCQkvKm9iX3NpemUqLwotCSJNYWNUQ1AgVENQIHN0cmVhbSIsCQkvKnRwX25hbWUqLwotCXNpemVvZih0Y3Bzb2JqZWN0KSwJCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXRjcHNfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyl0Y3BzX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKXRjcHNfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJCQkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkJCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCQkJLyp0cF9oYXNoKi8KLX07Ci0KLS8qIEVuZCBvZiBjb2RlIGZvciBNYWNUQ1AgVENQIHN0cmVhbSBvYmplY3RzICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50Ci11ZHBzX2Fzcl9zYWZlKGFyZykKLQl2b2lkICphcmc7Ci17Ci0JdWRwc29iamVjdCAqc2VsZiA9ICh1ZHBzb2JqZWN0ICopYXJnOwotCW9iamVjdCAqYXJncywgKnJ2OwotCQotCWlmICggc2VsZi0+YXNyID09IE5vbmUgKQotCQlyZXR1cm4gMDsKLQlhcmdzID0gbWt2YWx1ZSgiKGkpIiwgc2VsZi0+YXNyX2VjKTsKLQlydiA9IGNhbGxfb2JqZWN0KHNlbGYtPmFzciwgYXJncyk7Ci0JREVDUkVGKGFyZ3MpOwotCWlmICggcnYgKSB7Ci0JCURFQ1JFRihydik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBwYXNjYWwgdm9pZAotdWRwc19hc3Ioc3RyLCBlYywgc2VsZiwgaWNtcCkKLQlTdHJlYW1QdHIgc3RyOwotCXVuc2lnbmVkIHNob3J0IGVjOwotCXVkcHNvYmplY3QgKnNlbGY7Ci0Jc3RydWN0IElDTVBSZXBvcnQgaWNtcDsKLXsKLQlpZiAoIHNlbGYtPmFzciA9PSBOb25lICkKLQkJcmV0dXJuOwotCXNlbGYtPmFzcl9lYyA9IGVjOwotCVB5X0FkZFBlbmRpbmdDYWxsKHVkcHNfYXNyX3NhZmUsICh2b2lkICopc2VsZik7Ci19Ci0KLQotc3RhdGljIG9iamVjdCAqCi11ZHBzX1JlYWQoc2VsZiwgYXJncykKLQl1ZHBzb2JqZWN0ICpzZWxmOwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0Jb2JqZWN0ICpydjsKLQlpbnQgdGltZW91dDsKLQkKLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgImkiLCAmdGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IHhVRFBSZWFkKCZzZWxmLT5pb3AsIHRpbWVvdXQsIChVRFBJT0NvbXBsZXRpb25VUFApMCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJ2ID0gbmV3c2l6ZWRzdHJpbmdvYmplY3QoKGNoYXIgKilzZWxmLT5pb3AuY3NQYXJhbS5yZWNlaXZlLnJjdkJ1ZmYsCi0JCQkJCQkJCXNlbGYtPmlvcC5jc1BhcmFtLnJlY2VpdmUucmN2QnVmZkxlbik7Ci0JZXJyID0geFVEUEJmclJldHVybigmc2VsZi0+aW9wLCBzZWxmLT5pb3AuY3NQYXJhbS5yZWNlaXZlLnJjdkJ1ZmYpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCURFQ1JFRihydik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotdWRwc19Xcml0ZShzZWxmLCBhcmdzKQotCXVkcHNvYmplY3QgKnNlbGY7Ci0Jb2JqZWN0ICphcmdzOwotewotCXVuc2lnbmVkIGxvbmcgaG9zdDsKLQl1bnNpZ25lZCBzaG9ydCBwb3J0OwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc2l6ZTsKLQlPU0VyciBlcnI7Ci0JbWluaXdkcyB3ZHM7Ci0JCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICJsaHMjIiwgJmhvc3QsICZwb3J0LCAmYnVmLCAmYnVmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCXdkcy5sZW5ndGggPSBidWZzaXplOwotCXdkcy5wdHIgPSBidWY7Ci0Jd2RzLnRlcm1pbnVzID0gMDsKLQllcnIgPSB4VURQV3JpdGUoJnNlbGYtPmlvcCwgaG9zdCwgcG9ydCwgJndkcywgKFVEUElPQ29tcGxldGlvblVQUCkwKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JSU5DUkVGKE5vbmUpOwotCXJldHVybiBOb25lOwotfQotc3RhdGljIHN0cnVjdCBtZXRob2RsaXN0IHVkcHNfbWV0aG9kc1tdID0gewotCXsiUmVhZCIsCShtZXRob2QpdWRwc19SZWFkLAkxfSwKLQl7IldyaXRlIiwJKG1ldGhvZCl1ZHBzX1dyaXRlLAkxfSwKLSAKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwotfTsKLQotLyogLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgb2JqZWN0ICoKLXVkcHNfZ2V0YXR0cihzZWxmLCBuYW1lKQotCXVkcHNvYmplY3QgKnNlbGY7Ci0JY2hhciAqbmFtZTsKLXsKLQlpZiAoIHN0cmNtcChuYW1lLCAiYXNyIikgPT0gMCApIHsKLQkJSU5DUkVGKHNlbGYtPmFzcik7Ci0JCXJldHVybiBzZWxmLT5hc3I7Ci0JfQotCWlmICggc3RyY21wKG5hbWUsICJwb3J0IikgPT0gMCApIAotCQlyZXR1cm4gbmV3aW50b2JqZWN0KChpbnQpc2VsZi0+cG9ydCk7Ci0JcmV0dXJuIGZpbmRtZXRob2QodWRwc19tZXRob2RzLCAob2JqZWN0ICopc2VsZiwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXVkcHNfc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKLQl1ZHBzb2JqZWN0ICpzZWxmOwotCWNoYXIgKm5hbWU7Ci0Jb2JqZWN0ICp2YWx1ZTsKLXsKLQlpZiAoIHN0cmNtcChuYW1lLCAiYXNyIikgIT0gMCB8fCB2YWx1ZSA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPmFzciA9IHZhbHVlOwkvKiBYWFhYIEFzc3VtaW5nIEkgZG9uJ3QgaGF2ZSB0byBpbmNyZWYgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVkcHNvYmplY3QgKgotbmV3dWRwc29iamVjdChidWZzaXplLCBwb3J0KQotCWludCBidWZzaXplOwotCWludCBwb3J0OwotewotCXVkcHNvYmplY3QgKnNlbGY7Ci0JT1NFcnIgZXJyOwotCQotCXNlbGYgPSBORVdPQkoodWRwc29iamVjdCwgJlVkcHN0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoKGNoYXIgKikmc2VsZi0+aW9wLCAwLCBzaXplb2Yoc2VsZi0+aW9wKSk7Ci0Jc2VsZi0+cG9ydCA9IHBvcnQ7Ci0JZXJyPSB4VURQQ3JlYXRlKCZzZWxmLT5pb3AsIGJ1ZnNpemUsICZzZWxmLT5wb3J0LCB1cHBfdWRwX2FzciwKLQkJCQkJICh2b2lkICopc2VsZik7Ci0JaWYgKCBlcnIgKSB7Ci0JCURFTChzZWxmKTsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JSU5DUkVGKE5vbmUpOwotCXNlbGYtPmFzciA9IE5vbmU7Ci0JcmV0dXJuIHNlbGY7Ci19Ci0KLXN0YXRpYyB2b2lkCi11ZHBzX2RlYWxsb2Moc2VsZikKLQl1ZHBzb2JqZWN0ICpzZWxmOwotewotCXhVRFBSZWxlYXNlKCZzZWxmLT5pb3ApOwotCURFTChzZWxmKTsKLX0KLQotc3RhdGljIHR5cGVvYmplY3QgVWRwc3R5cGUgPSB7Ci0JT0JfSEVBRF9JTklUKCZUeXBldHlwZSkKLQkwLAkJCQkJCQkvKm9iX3NpemUqLwotCSJNYWNUQ1AgVURQIHN0cmVhbSIsCQkvKnRwX25hbWUqLwotCXNpemVvZih1ZHBzb2JqZWN0KSwJCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXVkcHNfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyl1ZHBzX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKXVkcHNfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJCQkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkJCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCQkJLyp0cF9oYXNoKi8KLX07Ci0KLS8qIEVuZCBvZiBjb2RlIGZvciBNYWNUQ1AgVURQIHN0cmVhbSBvYmplY3RzICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgb2JqZWN0ICoKLW1hY3RjcF9UQ1BDcmVhdGUoc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQlvYmplY3QgKnJ2OwotCWludCBidWZzaXplOwotCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICJpIiwgJmJ1ZnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChlcnIgPSB4T3BlbkRyaXZlcigpKSAhPSBub0VyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcnYgPSAob2JqZWN0ICopbmV3dGNwc29iamVjdChidWZzaXplKTsKLQlyZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotbWFjdGNwX1VEUENyZWF0ZShzZWxmLCBhcmdzKQotCW9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlvYmplY3QgKmFyZ3M7Ci17Ci0JT1NFcnIgZXJyOwotCW9iamVjdCAqcnY7Ci0JaW50IGJ1ZnNpemUsIHBvcnQ7Ci0KLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgImlpIiwgJmJ1ZnNpemUsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAoZXJyID0geE9wZW5Ecml2ZXIoKSkgIT0gbm9FcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJ2ID0gKG9iamVjdCAqKW5ld3VkcHNvYmplY3QoYnVmc2l6ZSwgcG9ydCk7Ci0JcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgb2JqZWN0ICoKLW1hY3RjcF9NVFUoc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQl1bnNpZ25lZCBzaG9ydCBtdHU7Ci0KLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChlcnIgPSB4T3BlbkRyaXZlcigpKSAhPSBub0VyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbXR1ID0geE1heE1UVSgpOwotCXJldHVybiBuZXdpbnRvYmplY3QoKGludCltdHUpOwotfQotCi1zdGF0aWMgb2JqZWN0ICoKLW1hY3RjcF9JUEFkZHIoc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQl1bnNpZ25lZCBsb25nIHJ2OwotCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAoZXJyID0geE9wZW5Ecml2ZXIoKSkgIT0gbm9FcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJ2ID0geElQQWRkcigpOwotCXJldHVybiBuZXdpbnRvYmplY3QoKGludClydik7Ci19Ci0KLXN0YXRpYyBvYmplY3QgKgotbWFjdGNwX05ldE1hc2soc2VsZiwgYXJncykKLQlvYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0Jb2JqZWN0ICphcmdzOwotewotCU9TRXJyIGVycjsKLQl1bnNpZ25lZCBsb25nIHJ2OwotCi0JaWYgKCFuZXdnZXRhcmdzKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAoZXJyID0geE9wZW5Ecml2ZXIoKSkgIT0gbm9FcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJ2ID0geE5ldE1hc2soKTsKLQlyZXR1cm4gbmV3aW50b2JqZWN0KChpbnQpcnYpOwotfQotCi0jaWZkZWYgVENQX0dTCi1zdGF0aWMgb2JqZWN0ICoKLW1hY3RjcF9HbG9iYWxJbmZvKHNlbGYsIGFyZ3MpCi0Jb2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCW9iamVjdCAqYXJnczsKLXsKLQlPU0VyciBlcnI7Ci0KLQlpZiAoIW5ld2dldGFyZ3MoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChlcnIgPSB4T3BlbkRyaXZlcigpKSAhPSBub0VyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogWFhYWCBBbGxvY2F0ZSwgZmlsbCAqLwotCUlOQ1JFRihOb25lKTsKLQlyZXR1cm4gTm9uZTsKLX0KLSNlbmRpZiAvKiBUQ1BfR1MgKi8KLQotLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwotCi1zdGF0aWMgc3RydWN0IG1ldGhvZGxpc3QgbWFjdGNwX21ldGhvZHNbXSA9IHsKLQl7IlRDUENyZWF0ZSIsCW1hY3RjcF9UQ1BDcmVhdGUsCTF9LAotCXsiVURQQ3JlYXRlIiwJbWFjdGNwX1VEUENyZWF0ZSwJMX0sCi0JeyJNVFUiLAkJCW1hY3RjcF9NVFUsCTF9LAotCXsiSVBBZGRyIiwJCW1hY3RjcF9JUEFkZHIsCTF9LAotCXsiTmV0TWFzayIsCQltYWN0Y3BfTmV0TWFzaywJMX0sCi0jaWZkZWYgVENQX0dTCi0JeyJHbG9iYWxJbmZvIiwJbWFjdGNwX0dsb2JhbEluZm8sCTF9LAotI2VuZGlmCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KLX07Ci0KLQotLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdG1hY3RjcCkgKi8KLQotdm9pZAotaW5pdG1hY3RjcCgpCi17Ci0Jb2JqZWN0ICptLCAqZDsKLQotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBpbml0bW9kdWxlKCJtYWN0Y3AiLCBtYWN0Y3BfbWV0aG9kcyk7Ci0KLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWQgPSBnZXRtb2R1bGVkaWN0KG0pOwotCUVycm9yT2JqZWN0ID0gbmV3c3RyaW5nb2JqZWN0KCJtYWN0Y3AuZXJyb3IiKTsKLQlkaWN0aW5zZXJ0KGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKLQkKLQl1cHBfdGNwX2RvbmUgPSBOZXdUQ1BJT0NvbXBsZXRpb25Qcm9jKHRjcHNfZG9uZSk7Ci0JdXBwX3RjcF9hc3IgPSBOZXdUQ1BOb3RpZnlQcm9jKHRjcHNfYXNyKTsKLSNpZiAwCi0JdXBwX3VkcF9kb25lID0gTmV3VURQSU9Db21wbGV0aW9uUHJvYyh1ZHBzX2RvbmUpOwotI2VuZGlmCi0JdXBwX3VkcF9hc3IgPSBOZXdVRFBOb3RpZnlQcm9jKHVkcHNfYXNyKTsKLQotCS8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCi0JCi0JLyogQ2hlY2sgZm9yIGVycm9ycyAqLwotCWlmIChlcnJfb2NjdXJyZWQoKSkKLQkJZmF0YWwoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIG1hY3RjcCIpOwotfQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9tYWN0Y3Btb2R1bGVzLm11LmV4cCBiL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjdGNwbW9kdWxlcy5tdS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjlmNTIuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9tYWN0Y3Btb2R1bGVzLm11LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotaW5pdG1hY2RucgotaW5pdG1hY3RjcApkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9tYWN0Y3Btb2R1bGVzLm11LmhxeCBiL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvbWFjdGNwbW9kdWxlcy5tdS5ocXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODQwMDYuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC9tYWN0Y3Btb2R1bGVzLm11LmhxeAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0oVGhpcyBmaWxlIG11c3QgYmUgY29udmVydGVkIHdpdGggQmluSGV4IDQuMCkKLQotOiUnZUtCaDRNRidlW0MoOVhDQS1aRUE4ITY4ZTM4TjBBNTg4IU4hM0RkISEhK3FATWhAMFtFZmAhISEhIiEhIQotISghISEnUTMhISJVISEhISE4ISEhISEzISEhIlMhISkhLSEhIyEiYCg4ZnBlRlEwUEZwZjMjISMzJzMpIS0hIQotIyEjSio2J1BMRlEmYkRAOWNoQyEnISohQyFKISEhISkhKyFQLURAKmJCQSpUQ0EyR04hQiFOImQjISNKIXEycgotYCEqISYhRzU4ISohJy1YQiEhISEiISo1ZlUhIzMkMykhIS1jLSEkLC1jKlEzIiEhY2MtYkNRQENRISQ2LWMqUQotQy1jLSEwRmMtUUNOISEhIWZjLWFRQ1tyciEkSS1jJ0NRYy1gITEtYy1DUUIhIWAhIjMhRiFOITMtNUBqZENBKgotUUJAMFA2J1BMISohNlYlcVAzISciRmg0ZUJVYTJUOCEhIUohJCEqISUkUWVLQmY0WkZRZVtDKDlYQzVqTSEqIQotNFZBLWJAMyciOSU5QjkrZWMtUE4hIWAhJCEqISUkUWVLQmg0TUYnZVtDKDlYQzVqTSEqITRWQS1iQEonIjklOQotQjkrZWMtUFMhIiEhJCEqISUjQTRNRidHWEdAOFpCYCMzJlVlYy1QUyJKOTQmQCY1WUZjKkQhITghIWAjMyIhYQotS0UnYVtCUVRQQmg0YyxRSiFOIjFaI0MhITEzJyE5JTlCOStpKk4hIWohIUIhIWAjMyIhS01FZmpRREBGWkQhIwotMyZrZWMtTkYiSiY0JkAmNVlGYyooISFHISFgIzMiIUdjRyc0VEVialMhKiFCVjZxWnAhIyE5JTlCOStkclZbMwotISMlISQhKiElImhQZkJAYWMsUUohTiJMWVhwNCohKSI4NDlLOFZFMjg1MyEqMyEtIU4hMylGaDRiREBqUixRSgotIU4iSFkya2xkISkiODQ5SzhWNnFacCEhKzMhLSFOITMoQ0EqYkVRbVpEISMzJytkclZbKSFKJjQmQCY1WTJrbAotYiEhWCEhYCMzIiFQWUhBImJFaDRbLFFKIU4iRFlGYylIIUIiODQ5SzhWQS1iKEohLSEhLSFOITMqRlE5WkJAZQotUC1MalMhKiFAVkpRMyEkTiJKJjQmQCY1WiNDISExMyEwISEtIU4hMylFZipVQ0AwZCxRSiFOIkhaI0MhITEzJwotITklOUI5K2kqTiEhaiEhaSEhYCMzIiFQW0JRVFRFQSJYLFFKIU4iRFlGYylIIUIiODQ5SzhWQS1iKEohMiEhLQotIU4hMzFCQDBNQ0EwY0VmKlVDQDBkLFFKIU4iJ1lGYylDIUIiODQ5SzhWQS1iJzMhMyEhLSFOITMsREBqZEVmKgotVUNAMGQsUUohTiI1WUZjKUYhQiI4NDlLOFZBLWIoISE0ISEtIU4hMy1FJ3BaQ2ZwTERROU1HI2pTISohNlZBLQotYigzJyE5JTlCOStlYy1LZCElSiEkISohJSRAQ1hFZiZkRWYqVUNAMGQsUUohTiIrWUZjKUUhQiI4NDlLOFZBLQotYidgITYhIS0hTiEzMEZRJlpDZjlbQlFUUEJoM1pEISMzJVVlYy1LbSJKJjQmQCY1WUZjKUkhIjMhIWAjMyIhagotY0coKlRFUUdbQlFUUEJoM1pEISMzJURlYy1LbSJKJjQmQCY1WUZjKUkhIjghIWAjMyIhZWRHQSJYQ0BwTERROQotTUcjalMhKiE1VkEtYikhJyE5JTlCOStlYy1MISEmSiEkISohJSQnYVRGaDRbQlFUUEJoM1pEISMzJWtlYy1LZAotIkomNCZAJjVZRmMpRyEiRiEhYCMzIiFwWUJBImBEQGpSRWYqVUNAMGQsUUohTiIjWUZjKUchQiI4NDlLOFZBLQotYigzIUIhIS0hTiEzMUVAOWREJ3BORWYqVUNAMGQsUUohTiInWUZjKUchQiI4NDlLOFZBLWIoMyFDISEtIU4hMwotMUVAcE5HQGFQRWYqVUNAMGQsUUohTiInWUZjKUchQiI4NDlLOFZBLWIoMyFEISEtIU4hMy1DUjlaQmZwTERROQotTUcjalMhKiE2VkEtYighJyE5JTlCOStlYy1LYCEnYCEkISohJSRAMFhCQTBjRWYqVUNAMGQsUUohTiIrWUZjKQotRCFCIjg0OUs4VkEtYidKIUYhIS0hTiEzLUNRUFhDQHBMRFE5TUcjalMhKiE2VkpRMyEkTiJKJjQmQCY1WiNDIQotITEzIUchIS0hTiEzK0VBUFlCQGFYRWYtWkQhIzMmRGVjLUtpIkomNCZAJjVZRmMpSCEiaiEhYCMzIiFLY0cnNAotWERAKVpEISMzJmtkclZbMyFKJjQmQCY1WTJrbGQhIm0hIWAjMyIhYVlFZjRjR0EiYEVoKmQsUUohTiIxWUZjKQotRyFCIjg0OUs4VkEtYigzIUozIS0hTiEzKUZoNE5CQSpSLFFKIU4iSFkya3FwISkiODQ5SzhWNnFbWzMhSzMhLQotIU4hMypBaDBkQycmYkNialMhKiFAVVhgMmVgIyE5JTlCOStWLSRwRiEpSiEkISohJSJmMFBHUSZYLFFKIU4iTAotWUZjKUQhQiI4NDlLOFZBLWInSiFNISEtIU4hMytCQCpjRygqS0JoM1pEISMzJkRlYy1LTiJKJjQmQCY1WUZjKQotQyEjMyEhYCMzIiFQWUJAMFJFKDlQLFFKIU4iRFoqOEFGIUIiODQ5SzhWTDkmaCEhUDMhQiFOITMoOShQYENBLQotWkQhIzMnK2ZZJ1VOIUomNCZAJjVZVjRVVCEjQyEiSiMzIiIwJEVmak5EQTRURWZqS0UlZUtCaCpbRmJqUyEqIQotLVY0cmIzISMhOSU5QjkrZEltTiEhKmQhJyEqISUiZENURSc5YyxRSiFOIkxYKUIkISEpIjg0OUs4ViMnIWAhIQotUzMhQiFOITMsNkBQaUNANDBFZjRQLFFKIU4iNVk4ZWMhISkiODQ5SzhWOTBGYCEhVDMhQiFOITMqNmUwOUcnUAotWEZialMhKiFAVkUyOTFgIyE5JTlCOStmY2U2WCErTiEnISohJSMlZVBFQHBiSDVqUyEqIUFWIychYCEjITklOQotQjkrYEtKLSEhK2QhJyEqISUjJTlmQ0BqZEZialMhKiFBVjRyYjMhIyE5JTlCOStkSW1OISEsJSEnISohJSNlJgotZURAMFZDKCpLR2JqUyEqIThWJylEMyEjITklOUI5K2FMJ04hISw4ISchKiElJGUmZURAMFZDKCpLR2U0UEgoMwotWkQhIzMlK2BLSi0hIUomNCZAJjVYKUIkISEjaiEiSiMzIiFqNkcnJlpDJyZiQyVDVEUnOFpEISMzJURgS0otIQotIUomNCZAJjVYKUIkISEjcCEiSiMzIiFQJURAJlhFZkdjLFFKIU4iRFgpQiQhISkiODQ5SzhWIychYCEhYDMhQgotIU4hMyk0QSpiRWgqYyxRSiFOIkhZKHIqISEpIjg0OUs4VjRyYjMhIWEzIUIhTiEzKDZAOVpHQS1aRCEjMycrYAotS0otISFKJjQmQCY1WClCJCEhJCohIkojMyIhVCRFZmpkRlFwWEZialMhKiE5ViMnIWAhIyE5JTlCOStgS0otIQotIS1kISchKiElIzlHVEVRNFtHaC1aRCEjMyZVYUwnTiEhSiY0JkAmNVhCS1QhISQ0ISJKIzMiIVQ4Q0FLZDRANAotVEcjalMhKiE5ViMnIWAhIyE5JTlCOStgS0otISEwOCEmISohJSUlJk5DKCpQRmgwQkUnJmREQHBaLFFKIU4hcQotVlpyZSEhKSI4NDlLOFVsW3AzISFmMyFCIU4hMyk2QCZNOSUwMyxRSiFOIkhZUTZhISEpIjg0OUs4VkNObTMhIQotaDMhQiFOITMsM0EiYEUnOThCQGFWLFFKIU4iNVgpQiQhISkiODQ5SzhWIychYCEhaTMhQiFOITMnNCc5Y0RiagotUyEqIUNWIychYCEjITklOUI5K2BLSi0hITE4ISchKiElIzg0UEdRUE1DQS1aRCEjMyZVZEltTiEhSiY0JkAmNQotWShyKiEhJFMhIWAjMyIhamNHKCplQmg0WUNAZUxDQSlaRCEjMyVEZWMtS20iSiY0JkAmNVlGYylJISRYISFgIwotMyIhUGRCaCJSRSg5UCxRSiFOIkRZRmMqRSFCIjg0OUs4VkEtYkBgIW0zITghTiEzNjZAJk05JTAzM2ZwWUVAcAotWjkoUGBDQS1aRCEjMyQrWCVgZEIhSiY0JkAmNVYiLTAnISRlISIzIzMiIWUoQ0E0MEg4UDMzQDRORkxqUyEqIQotNVVgNiQ4MyMhOSU5QjkrWCVgZSUhMk4hJiEqISUiZTQkOCYiIyxRSiFOIkxWIi0tVCEpIjg0OUs4VWA2JCszIQotcjMhOCFOITMoOTg0MzglKVpEISMzJytYJWBiISFKJjQmQCY1ViItLUohJSEhIiEjMyIhUGJHQGpkREBlUCxRLQotIU4iRFhWYSJlIUIiODQ5SzhWK20zRzMiIiEhLSFOITNARUFHUEZRWWNBaCJYR0BHVEVQcE1FZmpRREBGWkQhIwotMyNEZWMtUVgiSiY0JkAmNVlGYypWISUpISFgIzMiIXBNRWZlYEUnOWlFZipVQ0AwZCxRSiFOIiNaI0MhITEzJwotITklOUI5K2kqTiEhaiElLSEhYCMzIiFQTUVmKlVDQDBkLFFKIU4iRFlGYylEIUIiODQ5SzhWQS1iJ0oiJSEhKQotIU4hMzZFQCZNRycwYEVAcE5HQGFQRmJrZSxROWlGISMzJCtjcSEyOCJKJjQmQCY1WHJKJGUhJTghIWAjMyIhVAotYEhAOWJGUXBiRmJqUyEqITlWQS1iKGAnITklOUI5K2VjLUttITRKISQhKiElI1AiakcnS1tFTjBbRlE4IU4iQAotWipSWXAhQiJjRCdhTFZMQ2xJMyIoISEtIU4hMypGKFBOQ0AqZUNialMhKiFAVkpRMyEkTiJKJjQmQCY1WiNDIQotITEzIikhIS0hTiEzLEcoKktCZjlMQkAwVixRSiFOIjVZRmMpSiFCIjg0OUs4VkEtYikhIiohIS0hTiEzLEYoUAotZEQncFpGUjlaLFFKIU4iNVojQyEhMTMnITklOUI5K2kqTiEhaiElUyEhYCMzIiFZY0hBMFlFZjRlRSc4WkQhIwotMyYraSpOISFqIUIiODQ5SzhWSlEzISROITVgISQhKiElI2ZQWkcoKk1EJzlNRGJqUyEqIThWS1AwJyEnITklOQotQjkraUM2NEohNiEhJCEqISUjJ1BZRidwYkcjalMhKiFBVkpRMyEkTiJKJjQmQCY1WiNDISExMyIwISEtIU4hMwotMEJRYWREQGpZRWY0ZUUnOFpEISMzJVVpKk4hIWohQiI4NDlLOFZKUTMhJE4hNk4hJyEqISUjJVlQRlFqUEUjagotUyEqIUFWNHJiMyEjITklOUI5K2RJbU4hITZkISchKiElJWRlS0JmS1RFUTkmSCcwUEYoNFRFZmpjLFFKIU4hYgotWClCJCEhKSI4NDlLOFYjJyFgISIzMyFCIU4hMzE2USZZQzkqUENmUGNHKCpqLFFKIU4iJ1kociohISkiODQ5SwotOFY0cmIzISI0MyFCIU4hMzIzZnBOQzhDYkJAR1lDQGpkRmJqUyEqITNWIychYCEjITklOUI5K2BLSi0hISEhSwotLSEhRiNHISEhISVCISEzIzMjISkhTiE4MUVAJk1DJ2piRUBwTkdAYVAsUS0hTiJTIyEqISgwRFpscjghISEzIQotaFYjJyFgISEiISYnWClCJCEhISUhKlVkSW1OISEhMyFiViMnIWAhISIhJExYKUIkISEhJSExRGRJbU4hISEzIQotW1YjJyFgISEiISFVWTJrbGIhISUhLStkSW1OISEhMyFWVjRyYjMhISIhI0hYKUIkISEhJSE2VWRJbU4hISEzIgotMlYjJyFgISEiISREWVE2YSEhISUhK1VgS0otISEhMyFhViMnIWAhISIhI0xZOGVjISEhJSE4K2RJbU4hISEzIQotVFZFMjkxYCEiISNiWEJLVCEhISUhLERgS0otISEhMyFaViMnIWAhISIhIyNZMmtxcCEhJSEia2RyVlszISEzIQotSFY2cVpwISEiISFRWTJrbGQhISUhMCtgS0otISEhMyFQVkRkRFUzISIhJDFYQktUISEhJSEjK2ZjZSVOISEzIQotS1VYYDJlYCEiISMxWUZjKUMhISUhJGtlYy1LTiEhMyEmVkpRMyEkTiEhMyIwVkpRMyEkTiEhMyFMVkEtYidKIQotIiEiWllGYylEISElITNrZWMtS1MhITMiI1ZKUTMhJE4hITMhJ1ZBLWI0YCEiISJiWiNDISExMyEiISIrWUZjKQotRSEhJSEnVWVjLUtgISEzIi1WSlEzISROISEzITNWQS1iKCEhIiElWlonOGRCISElISZVZWMtS2QhITMhNFZBLQotYigzISIhIzVaKjhBRiEhJSEma2VjLUtkISEzIUJWQS1iKDMhIiEicVlGYylHISElISdEZWMtS2QhITMiIlZBLQotYkRgISIhImZZRmMpSCEhJSEja2VjLUtpISEzITBWSlEzISROISEzITFWQS1iKEohIiElSFojQyEhMTMhIiElQAotWUZjKUkhISUhNURpKk4hIWohISUhJWtlYy1LbSEhMyEtVkpRMyEkTiEhMyE4VkEtYihgISIhJFVZRmMpSSEhJQotITVVaSpOISFqISElITUrZWMtTCEhITMhOVZBLWIpISEiIVRCI1EhK0QhVGAhISEiLCEhJSFOIUojISohJiRRZQotS0JoNE1GJ2VbQyg5WEM1ak0hKiFEIWAjMyJjQFZacmUhISElITBrYEtKLSEhITMiNFYjJyFgISEiISNEWShyKgotISEhJSEtVWBLSi0hISEzIWlWIychYCEhIiEkUVkociohISElISxrYEtKLSEhITMhK1Y2cVptSiEiISQjWShyKgotISEhJSEra2RJbU4hISEzIVJWIychYCEhIiEkZlYiLTA0ISElITZVZEltTiEhITMiMlYjJyFgISEiISREWVE2YQotISEhJSEyK1glYGRCISEzIVVWIychYCEhIiEkJ1gpQiQhISElISsrZTZBLSEhITMiM1Y0cmIzISEiISNRWVhwOAotbCEhJSEsK2FMJ04hISEzIVlWIychYCEhIiEja1gpQiQhISElISkrZHJWbGQhITMhKFY2cVpwISEiISJrWTJrbAotZCEhJSEjRGRyVlszISEzIXFVYDYkKzMhIiEkNVgpQiQhISElISpEZlknVU4hITMhclVgNiQpISEiISQxWEJLVAotISEhJSEjK2ZjZSVOISEzIUtVWGAyZWAhIiEjMVlGYylDISElISRrZWMtS04hITMhJlZKUTMhJE4hITMiMFZKUQotMyEkTiEhMyFMVkEtYidKISIhIlpZRmMpRCEhJSEza2VjLUtTISEzIiNWSlEzISROISEzISdWQS1iNGAhIiEiYgotWiNDISExMyEiISIrWUZjKUUhISUhJ1VlYy1LYCEhMyItVkpRMyEkTiEhMyEzVkEtYighISIhJVpaJzhkQiEhJQotISZVZWMtS2QhITMhNFZBLWIoMyEiISM1Wio4QUYhISUhJmtlYy1LZCEhMyFCVkEtYigzISIhInFZRmMpRyEhJQotISdEZWMtS2QhITMiIlZBLWJEYCEiISJmWUZjKUghISUhI2tlYy1LaSEhMyEwVkpRMyEkTiEhMyExVkEtYihKIQotIiElSFojQyEhMTMhIiElQFlGYylJISElITVEaSpOISFqISElISVrZWMtS20hITMhLVZKUTMhJE4hITMhOFZBLQotYihgISIhJFVZRmMpSSEhJSE1VWkqTiEhaiEhJSExa2VjLVBYISEzIilWQS1iKSEhIiEiQFlGYylKISElIixKJQotYCE2KSIwISEhISJpISEzIzMjISkhTiE4KkcnMGBDZmFlQzVqTSEqIUkiISMzImNAVlpyZSEhISUhMGtgS0otIQotISEzIjRWIychYCEhIiEjRFkociohISElIS1VYEtKLSEhITMhalY0cmIzISEiISNxWClCJCEhISUhLStkSW1OIQotISEzIVZWNHJiMyEhIiEjSFgpQiQhISElITJEWCVgZSUhITMiMVY0cmIzISEiISVxWClCJCEhISUhMFVmQzIlIQotISEzIW1VYDYkNEohIiEjVVgpQiQhISElIS1EYEtKLSEhITMhU1Y5MEZgISEiISYjWShyKiEhISUhK0RmY2U2WAotISEzIVhWJylEMyEhIiEjZlgpQiQhISElITJVWCVgYk4hITMhZFYjJyFgISEiISNAWVY0VVQhISUhMmtYJWBiIQotISEzIWNWJylEMyEhIiElJ1lGYypWISElITFrZWMtUFghITMlMSE0ISIlSiU4ISEhISEzISIhKiEpIUolIU4hMwotNkVAJk1HJzBgRUBwTkdAYVBGYmtlLFE5aUYhIzMmODMhTiFHJyElTXAzMyEiISRIWCkzJjRGRCEhTiFCTE4hIQotIjhDNiFKLSkhITMhalYjJyFgSiEiIThJITgpJCMhISUhLStgS0otKSEhMyFWViMnIWBKISIhI0hYKUIkIyEhJQotITJEWCVgZSUhITMhZlYjJyFgMyEiISRiViItMCchISUhK1VgS0otKSEhMyFhViMnIWBKISIhI0xYKUIkIyEhJQotIStEYEtKLSkhITMhWFYjJyFgSiEiISNmWClCJCMhISUhMlVYJWBiTiEhMyFkViMnIWBKISIhI0BYREk2YiEhJQotITJrWCVgYiEhITMhY1YjJyFgSiEiISUnWHJicVshISUhMWtZI2M2KSEhMyInISVKITVKIi0hcUYhITMhIyEqIQotKSFKJSFOITMrOChQZEQncFozZnBiQzMjMyhOQiFOIUcnISVKITVKIi0hcUYhITMhIyEqISkhSiMzIjNhKkVSNAotUEZRQ0tCZjktREApIU4iYCIhKiEoNkoiMyEmKSE5ISEhISEpISFKIzMjISkiISohJSNBKmVFUjRURUA4WkJgIwotMyhkISFOIUciVkEtYkRgISIhKiEpIVlrWVEhISEhNGkhISIlQDglQ1hGYCMzIiEsSFZZMyEhIilkISEhKTYmIgotLUZoMyFOIVMiKCEhISEhKjM4ZjlScnJtIU4hTkYhISEiISYiNkNARiEhMyEhR00pISEhJSEhISFULWAhISskLQotISEhK2IhITMhKyEhKyFGKSNKISFTISFTImBKKyEhKiExJSdlS0JoNE1GJ2VbQyg5WENBLVpFQTlYIUohISElZQotMDgmKiQ5ZFAmISohJTY4ZTM4TjBBNTg4IU4iTFpVUyFWISEhRGQhISErcTlTISohQiNKISMhKiEsIiEhIyMhIwotMyItMyEiMCEhTiUmVEVRUGRIKEohTiFYIyEhQiEhISErISEzIU4hWGAhIUIiITJyciEqISlycm0iTiE4IU4hMwotSCEzJSFOIUxDUTMhITJybXJyY3JyITMjMyIlUyEhMyEqIlFlW0VRJk1FYCMzKCEzISshISshRikjSiEhUyEhUwotImBKKyEhKiEzITMjMyIhKSFOITg4ISElIUAhI1ohLW0iZDMjMyIlUzYhISFHMGAhISEiUyEhYCEhUUNOIU4hNAotcnJgIzMiKHJyISohJUlybSFOITMrLSEhJSEhISEhYCEoITNKISEzJWtBKiUhak5NTiEhaltLJyZjRGIhISEhIQotRiEqISpbWFVRISxsLFAhI3Fia2AhTiFAciVlYCFOIUByJWVgISUjNSEhKiFTYyohKSExQyFkISRRMyckR04hSwotcnJocnIhMUMhSyEjMyIlIyghKiElIkIzISErJUxySikhTiFJUTMwISEhY05iISohNiEzI3FiZikhW1hZIyEsbQotKGIhISFBKiUhak5NTiEhISEhZiZjRGIhISEhIUYhKiEqW1hVUSEsbCxQISNxYmtgIU4hQHIlZWAhW2lQRiEsbQotNiclZTMzZC0iIyEhIiFNU2tOMyRRNTEzISRRcSVCQTBWKSEhISEiYCFOIVFxYlVCIVtYWjghLGwsViEjMyJFbQotNkEhIzMiRW02QSEhMyopISFOI00tTiFKIWpOJDMhMUMhQjBmMyMocnJJcm0hak4jJSEqISUzKUYhTiEzJkshIQotIVM1LHEhSiMzInFDIWQhISQxNikhTiItIiEsbCxCSiNxYmQpIVtgSSkhISJGTjMkUTUxMyEhISEkQkEwVikhIQotISEiYCFOIVFxYlVCIVtYWjghLGwsViEjMyJFbTZBISNyTDlgIVthLUI2OSIkM2AnaSEhKWgxTmVLQmRwNikmMAotZUYoIltGUjNrNidQTEZRJmJEQDljMVAqZUVSNFRFQDhrOFI5WkcnUFlDNSIzOCUtaysmMFtHQSpNQ0EtVDFKIQotISEiMltFISMzKSEnTUhwSiFOIUE2JTgzIU4hMyJTaFtCISEpISEhKDZoYSEiVjgoUyEqIUtqSiJjITJKIWIhJwotWTRyYCEiISFpIUcySjUhISElODMiZHBwYCxrJEdoMyEyayMhISEyciIhJDIjZCEhNmxmYCFEYCVyISdYIjJgKAotRkZgSiJoKDQ4IUdhQlYhKEZGZDMiaCYsWCFHYUpaISEhITJtIklgI3FybUlNSUooNmhgISJkYCUhISElQjFNUwotazNlRyg5OTAqKSQlWjBMaWQxUVBaQmZhZUMnOGstISE2cUMzITFEMykhISFkWSEjMyNJcnJyYCgpcDZKImIyNAotMzNKISMiMnJHQidgIlhANiohRk1kQiEhIzlFISJYQVAzIUQpWGQhKClwKCEhIVBAYCEiJ2xqISFlLGAhITQhKQotISEhJSEhMyEiISElISEhISQhRk1kWCEjMyIyckRpKTMhISEhIiFGTWUhISE1cVJgIlEpcWAhRSZOYyEoKXAtIQotISVbVG0hIigrJiEoKXBHKSJiMjYhISEqOVgycjhGRiEhISslTCFGTWRtISEkLThNcmZgMSkhKiElIUZNZiUhIQotNmZJYCElcFJgIUZNZkBKKClwMiEhJXFDU3JwZSMxJ01ycGQhImIyOCEhIixoKyEhNFUmISJYQDVTITJycnJgIQotOTBjMyJkMyUhISEpTjFOZUtCZHA2KSYwZUYoIltGUjNrNSc5S0MnOWJGY1QiNlAwKiklS1BCQDRQRlItayEqIQotTGpOMzMhKiEoITMhMEhQSk4hIUolITFDJE4hISElIzMzITFDJjYhIzMnNCFKWyEjMyJIQyZKISMzIjNla1QhIwotcWsjIiFSSSYzISIhTiUhIzMiSEMmS0ojMyI0IU5KISEhUyJgIU4iQVE0KiEhISohKiRBVEIqKSEpIiEkUTQiIQotISUjMzMhKiFIITMhISFMM2s2QCZNNmUtSjhoOWBGJ3BiRyRUKUNAJk5DQSpjMVAiMzNiIjZGJzlNREBDVEJjUwotIU4jLFE0IiEhTiFGIiEhZWtAIzMhIyEzIWpOMTMhISEzKiIhIWpOOS0hKiFDJSMjbSEqISZqTkAhISohJiRBVQotTiEsbFMpJSNHbTkhISUjMzMhKiEmak5AJyEqISYlIzUhISEjSighIzMmSEMlTiEhIU4hTjBIUEpOSiFKJSExQwotJSUhITMqIiEhTiJpIiEhISMyJFQwQkAwMjhiIjZHQSJgRWgqZDFOS1BCQDRQRlItazhoUGNHJzlZKSU5aUcoKgotS0ZiIilDQCZOQ0EqYzFOZUtCZTQkOCMiKUNAJk5DQSpjMUojMyNaQyUlISMzImAlISRBVEIqISEpIiEkUTNqIQotISEiIU4lISRRNDhgIU4iTjMpLGAhTiFBUTRCISFOITgwSFUzIVtaSkozKmhhOCEhMyoiISFOIUFRNEJCIU4hOAotMyopISEhKyFGISohOWpONTMhISMzIzNla0AjNSEjITMhak4zMyEiIU4lISMzKEolISEhKVQxTmVLQmRwNikmMAotZUYoIltGUjNrNSc5S0MnOWJGY1Q5RVFQZkNBKmNCQGBKNSc5S0MnOWJGY1MhTiJoUTQiISFOIUYiISFla0AjMwotISMhMyFqTjEzISEhMyoiISFqTjktISohQyUjI20hKiEmak5AISEqISYkQVVOISxsUyklI0dtOSEhJSMzMyEqIQotJmpOQCchKiEmJSM1ISEhI0ooISMzJkhDJU4hISFOIU4wSFBKTkohSiUhMUMlJSEhMyoiISFOImkiISEhIypNVAotMEJAMDI4YiI2R0EiYEVoKmQxTmFUQlIqS0ZRUFBGY1QwQkAwMjhiIiRFZmVZRWZpayEqIUpqTjMzISohKCEzIQotMEhQSk4hIUolITFDJE4hISElIzMzITFDJjYhIzMnNCFKWyEjMyJIQyZKISMzIjNla1QhI3FrIyIhUkkmMyEiIQotTiUhIzMiSEMmS0ojMyI0IU5KISEhUyJgIU4iQVE0KiEhISohKiRBVEIqKSEpIiEkUTQiISElIzMzISohSCEzIQotISFMZGs2QCZNNmUtSjhoOWBGJ3BiRyRULURAKmJCQSpUQ0EtazhSOVpHJ1BZQzZUNUdAamREQGVQKSYiMzNjUwotIU4iUlE0IiEhTiFGIiEhZWtAIzMhIyEzIWpOMTMhISEzKiIhIWpOOS0hKiFDJSMjbSEqISZqTkAhISohJiRBVQotTiEsbFMpJSNHbTkhISUjMzMhKiEmak5AJyEqISYlIzUhISEjSighIzMmSEMlTiEhIU4hTjBIUEpOSiFKJSExQwotJSUhITMqIiEhTiMhOFAhISclJWVLQmRwNikmIjMzYiItREBqVkNBKSFOIiElJSVlS0JkcDYpJiIzM2IiLURAagotVkNBKSFOJCFEMzkiMzYhIzMzJyEhISEiIkYoIlghKiIhQiEhISElZTA2JSkhTiMhMTYnUEwpJVBZRidwYkcjIgotMzglLSFOIjkwOCVhJyEqIUokTmFUQkwiKkVBIltGUjNKOCYiJCEqITk2OUckNCEjMzMnISEhISI1OGUqJCEqIgotIUIhISEhJjQmQCYzJCxRKlNCbVVWOCEhJC0tSiEmK2gzISEhIklKKCtVZSEhJidBISEhISNlSmEjQkBhWEVmcAotWiklS1BFKCEhTiE4RyIhKCtVaSEhJidBISFCSEBlISMzIiY0JkAmMyMsUS0hTiJkLTY5RkozYnAkK2JYSjgmIgotJCEqIUE5JTlCOSEzWkJiWFYhKiFFJCVlQSklLVszYlhWKSYiMzNgIzMmZTQmQCYzJCxRME0hKiFGJCVlQSklLQotWzNiWFYpJiIzM2AjMyZlNCZAJjMkLFEwYCEqIUYkJWVBKSUtWzNiWFYpJiIzM2AjMyZlNCZAJjMlLFEwYEYhIwotMydgYTA5YiIkLGQtVitiIjM4JS0hTiJHODQ5SzgiI2pQSCghIU4kcDg0OUs4IUxqUyEqIUckJWVBKSUtWzNiWAotVikmIjMzYCMzJWEhISEhIjg0OUs4IUxqYCEqIUckOGVBKSYiS0ZmMEtFIyIzOCUtIU4iQzg0OUs4IiNqYEJBLQotIU4iWDA2OUZKOCcmY0JmJlgpJiIzM2AjMyZQNCZAJjMlLFIiTUQhIzMnYGEwOWIiJCxkLVYrYiIzOCUtIU4iMQotISEhISE5JTlCOSFCWkYnMFMrYlghTiJOLTY5RkozYnAkK2JYSjgmIiQhKiE2SiEhISEmNCZAJjMjLFIpIU4iZAotJzY5Rko4UTlrISohRzklOUI5ISlaRmZLTWJVWTMhIS1gYiEhOFZHISEhISZxIUZVVjghIThDRiEhISEsQCJQIgotMzNkJmNFQGlKNSc5WCEqIScoMzMiYlVaISEiNFBgIScoUFkzIU4hNEIzZHAnISohSiUmSyQ2ZEMnKSVQWUYncAotYkcjIjM4JS0hTiIwTkVmMGUhKiIhQiEhISEoKmNGUS0hTiUiSiEhISFGZktYQkojMykhajM0OEJKNUBlYEVoKgotZCkmIjMzYCMzJkEwZEdAKSFOIyExOCU5JyklUFlGJ3BiRyMiMzglLSFOIk4lLFE0W0JgIzMxZSEhISEhMzZAJgotTTZlLUowTUssKSVhVEVRWVBGSiMzLSJUIjgmIi0hKiIhQiEhISElJmBGJ2AhTiUiSiEhISE2OGUtM0ojMykhagotLURAKUo1QGVgRWgqZCkkQmk1YCMzJjhlMzYlQiFOIyExNidQTCklUFlGJ3BiRyMhZjElWCFOIjkwOWQwJSEqIgotIUIhISEhJXAjNUwhIU4jITE2OSJBKSVQWUYncGJHIyFmMSVYIU4iOTU4ZSokISoiIUIhISEhJjQmQCYzJCxRKgotU0JtVVY4ISEkLS1KISYraDMhISEiSUooK1VlISEmJ0EhISEhI2VKYSNCQGFYRWZwWiklS1BFKCEhTiE4RyIhKAotK1VpISEmJ0EhIUJIQGUhIzMiJjQmQCYzIyxRLSFOImQtNjlGSjNicCQrYlhKME1LLCEqIUE5JTlCOSEzWkJiWAotViEqIUUkJWVBKSUtWzNiWFYpJEJpNWAjMyZlNCZAJjMkLFEwTSEqIUYkJWVBKSUtWzNiWFYpJEJpNWAjMyZlNAotJkAmMyQsUTBgISohRiQlZUEpJS1bM2JYVikkQmk1YCMzJmU0JkAmMyUsUTBgRiEjMydgYTA5YiIkLGQtVitiIQotZjElWCFOIkc4NDlLOCIjalBIKCQrVWUhISFjJCkhIjVZZCEhISFBaSJiVVkzISI0UGAhISEhWUIhYWJUZFAlTAotVkohKCtWTjMhJWo5OCEhIUciISgrVWkhISYnQSEhQkhMMiEjMyImNCZAJjMjLFFKIU4iZC02OUZKM2JwJCtiWAotSjBNSywhKiE2JSEhISEmNCZAJjMjLFIhIU4iZDA2OUZKOCcmY0JmJlgpJEJpNWAjMyZQNCZAJjMlLFIiS0ZgIwotMydgZTA5YiIzQkEwTUJAYEowTUssISohQDklOUI5ITNaRicwUyEqIUUkJWVBKSUtWzNiWFYpJEJpNWAjMyVpIQotISEhIjg0OUs4IkxqYEJmSlYrYCMzJzNhMDliIiQsZC1WK2IhZjElWCFOIjEhISEhITklOUI5ISlaRkojMygzQwotMDliIjVDQVMhTiJlODQ5SzgiI2pjQ0BJK1VlISEhYyQpISI1WWQhISEhQWkiYlVZMyEiNFBgISEhIVlCIWFiVAotZFAlTFZKISgrVk4zISVqOTghISFHIiEoK1VpISEmJ0EhIUJITDIhIzMiJzRbQmg4IU4lIkohISEhRlIwYkJgIwotMzMnISEhISJjRCdhTCEqIUokUCImNEwiKkVBIltGUjNKME1LViEqITlGaDRlQkojMykhajM0OEJKNUBlYEVoKgotZCkkQmlEYCMzJzMzWkMncE0hKiFsOCEhISEiIkFEQGljLUwiaTEkQko2J1BaRGY5YiEqIWAjOTQmQCYzIyxRLQotIU4iZC02OUZKM2JwJCtiWEpIJEpmISohQTklOUI5ITNaQmJYViEqIUUkJWVBKSUtWzNiWFYpKEppMEojMyZlNAotJkAmMyQsUTBgISohRiQlZUEpJS1bM2JYVikoSmkwSiMzJmU0JkAmMyUsUTBgRiEjMydgYTA5YiIkLGQtVitiIgotaTEkQiFOIkc4NDlLOCIjamBCZkohTiJYLTY5RkozYnAkK2JYSkgkSmYhKiE2SiEhISEmNCZAJjMnLFIiTUQjWAotViEqIUMkJWVBKSUtWzNiWFYpKEppMEojMyVpISEhISI4NDlLOCFiamJCYCMzKCFLMDliIkFEQGo1M2AjMyhgMwotWkUnUEwhKiFFJE5hVEJMIipFQSJbRlIzSkgkSmYhKiFDIiNqW0JRUyFOIlgxNmYqVSklUFlGJ3BiRyMiaTEkQgotIU4iOCo2OC1KNidQWkRmOWIhKiFoIyVlMDNkSiFOJTQ4NDlLOCFMak0hKiFHIyVlJCklLVszYlhWISohRTklOQotQjkhM1pCZmFjISohRSU4ZSQpJTBYQkEwYyklMFtFQSJURSc5YiEqITFKISEhISY0JkAmMyUsUTRQQ0ojMzJlNAotJkAmMyUsUTRbQmAjMzFhISEhISI4NDlLOCFMalMhKiFwJSEhISEmNCZAJjMlLFIiTUQhIzMnYEswM2IiJCxkLQotVitgIzMmaSEhISEiODQ5SzghYmpkRmAjMzNgQiEhMyUhTiFCOCEhMyIhKiEoITMjMyQhUyEhMyUhISElIiEhJQotIU4hMzEhIUYiISElIiEhJSIhISEhITMjMyItQiEiYCMzM01xMyIlJjM4JWAhISEnIUApISFOJSlyTiEzIU4hUAotOSFDISEhMykjSGAjMyIzKSEhISE4ISohJSFCISFOIiVpISFOIU4hRkBFQUdQRlFZY0FoIlhHQEdURVBwTUVmagotUURARlpEISMzJCElIU4haS0hIS0hTiFgImZKISUhKiEzITMjM3JgIzM0JnBJRmg0S0ZSMyFOKGAiISEhITBKIQotLSEqISghMyMzKjMlIU4hOCIhISEhJDMhIyEqITEmISEkIUohIiEzISEhMyUkITMjMyNgUyEhMyUiISEhIiEzIQotIiEhISFhISEnYEojM2BgJTghITghITMhIS1YSiEhJCwpISEhYmIhIzMiIWVZQkAwZEJoIllFZjRlRSc5YyEqJAotZVpKISUhISU0RUAmTUcnMGBFQHBOR0BhUEZiamNFJykhTiFqM0hBNFNGZktYQkojM0YzJXJOITMhTiFHQSEraQotIWtKKDQhMyEhISFZQCEhIkZOMyEhISNpISFKISEhISkhIUojMyshKS0hISkhOCEhIiEhJSEhMyEiISokciEiMwotUjNkcCU0NUZKKmQ0IjklJVIpI0czNTgwOCpgIzNsSlMhIiEjMyNKJSEhISFULWAhISskLSEhIStiIVlrWEAjSAotVSEhISEoISZrISEqYEZROVEhIkohJ1IiQENBKSEhISYnOGU0NSlgISEhOSklWCEhMyEhISEiSiMzIiRVNSEiZAotISEhITghKiElRkZpISohISEhJUohTiE0RUBKIVQhISEhUiEjMyIoUGQhJEohISEjZCEqISUkQS0hNSEhISEwKQotIU4hMzJQSiI5ISEhLCJKIzMiJmUrISZgISEicUghKiElKms4IUQzISEoa0ohTiEzLWEhImUhISFJYCEjMyIjSAotVSEpQiEhInIxISohJTNoWCFOMyEhKHEhIU4hNCZTYCNHISEhSlVKIzMiIWhOIStgISEjJFEhKiElKlpKIVpgIQotISkyQiFOITRrRjMkIyEhIUxlISMzIidAWCEwKSEhIy0xISohJShZRiFpSiEhKWFtIU4hMzBWMyRaISEhTTBgIwotMyIkIy0hMm0hISMwJiEqISVATUYiI0ohISohZCFOITMsTDMlNSEhIVAqMyMzIihJKyE0aSEhI0FNISohJUYtRgotIitgISEqSzghTiFBKXJybSEhI0pQISohMydpJHJyYCEhISpCIU4hMzI4KCpbRFE5TUcjIkBDQSpjREBwWiQmIgotYkVmVFBCaDNKNkBQY0JgQyZDJ1BkRWgpJTRRcFpHIWozRlFwVUNAMGQpJTlpRygqS0ZgcCRHQTBkRWZkSjVmOQotakdmcGJDKC0tM0AwTUNBMGMpJiJLRydLYyJQNEtGUUdQRyFhI0dAUFhDIyImSCg0YkJBLSwwTUssKSUwW0MnOQotKENAaTMwTUssKSU0VEZmJmNGZjlZQlFhUEZKU2YxJVhKNidQWkRmOWIjY0JpNWIiM0ZRcFVDQDBkJE4tWzNiWAotViklMFtFQSJURSc5YiROLVszYlhWKSZHS0ZRalRFUUdjIk4wJzY2Qmk1YHAzQkEwTUJAYEozZnBZRidQWENBKQotMjgnJmNCZiZYKSZHS0ZRalRFUUdjI2UiMzNiIiRFZjRQNGY5WiUmIjMzYiIlREEwS0ZoMFBFQCpYQ0EpKzgmIgotJCklYVRFUVlQRkpHMzglLUo4JTknI2UiMzNiIjNGUXBVQ0AwZCQmIjMzZCZjRTUiM0JAalBFIWE1Q0FTSjNmcAotWUYnUFhDQStxTWA6CmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvbWFjdGNwL3NvY2tldC5weSBiL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3Avc29ja2V0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjYwMGIxLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3Avc29ja2V0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLSIiInNvY2tldC5weSBmb3IgbWFjIC0gRW11bGF0ZSBzb2NrZXQgbW9kdWxlIHdpdGggbWFjdGNwIGFuZCBtYWNkbnIKLQotQ3VycmVudGx5IG9ubHkgaW1wbGVtZW50cyBUQ1Agc29ja2V0cyAoQUZfSU5FVCwgU09DS19TVFJFQU0pLgotRXNvdGVyaWMgdGhpbmdzIGxpa2Ugc29ja2V0IG9wdGlvbnMgZG9uJ3Qgd29yaywKLWJ1dCBnZXRwZWVybmFtZSgpIGFuZCBtYWtlZmlsZSgpIGRvIHdvcms7IGV2ZXJ5dGhpbmcgdXNlZCBieSBmdHBsaWIgd29ya3MhCi0iIiIKLQotIyBKYWNrIEphbnNlbiwgQ1dJLCBOb3ZlbWJlciAxOTk0IChpbml0aWFsIHZlcnNpb24pCi0jIEd1aWRvIHZhbiBSb3NzdW0sIENXSSwgTWFyY2ggMTk5NSAoYnVnIGZpeGVzIGFuZCBsYXktb3V0KQotCi0KLWltcG9ydCBtYWN0Y3AKLWltcG9ydCBNQUNUQ1Bjb25zdAotaW1wb3J0IG1hY2RucgotCi0KLSMgRXhwb3J0ZWQgY29uc3RhbnRzCi0KLV9teWVycm9yID0gJ3NvY2tldF93cmFwcGVyLmVycm9yJwotZXJyb3IgPSAobWFjdGNwLmVycm9yLCBtYWNkbnIuZXJyb3IsIF9teWVycm9yKQotCi1TT0NLX0RHUkFNID0gMQotU09DS19TVFJFQU0gPSAyCi0KLUFGX0lORVQgPSAxCi0KLQotIyBJbnRlcm5hbCBjb25zdGFudHMKLQotX0JVRlNJWkUgPSAxNSoxMDI0CQkJIyBTaXplIG9mIFRDUC9VRFAgaW5wdXQgYnVmZmVyCi0KLV9teWFkZHJlc3MgPSBOb25lCi1fbXluYW1lID0gTm9uZQotX215YWRkcnN0ciA9IE5vbmUKLQotCi1kZWYgX215aXBhZGRyZXNzKCk6Ci0JZ2xvYmFsIF9teWFkZHJlc3MKLQlpZiBfbXlhZGRyZXNzID09IE5vbmU6Ci0JCV9teWFkZHJlc3MgPSBtYWN0Y3AuSVBBZGRyKCkKLQlyZXR1cm4gX215YWRkcmVzcwotCi0KLWRlZiBfaXBhZGRyZXNzKHN0cik6Ci0JaWYgdHlwZShzdHIpID09IHR5cGUoMSk6Ci0JCXJldHVybiBzdHIJCQkjIEFscmVhZHkgbnVtZXJpYwotCXB0ciA9IG1hY2Ruci5TdHJUb0FkZHIoc3RyKQotCXB0ci53YWl0KCkKLQlyZXR1cm4gcHRyLmlwMAotCi0KLWRlZiBnZXRob3N0YnluYW1lKHN0cik6Ci0JaWQgPSBfaXBhZGRyZXNzKHN0cikKLQlyZXR1cm4gbWFjZG5yLkFkZHJUb1N0cihpZCkKLQotCi1kZWYgZ2V0aG9zdGJ5YWRkcihzdHIpOgotCWlkID0gX2lwYWRkcmVzcyhzdHIpCi0JcHRyID0gbWFjZG5yLkFkZHJUb05hbWUoaWQpCi0JcHRyLndhaXQoKQotCW5hbWUgPSBwdHIuY25hbWUKLQlpZiBuYW1lWy0xOl0gPT0gJy4nOiBuYW1lID0gbmFtZVs6LTFdCi0JbmFtZXMsIGFkZHJlc3NlcyA9IFtdLCBbc3RyXQotCXJldHVybiBuYW1lLCBuYW1lcywgYWRkcmVzc2VzCi0KLWRlZiBnZXRob3N0bmFtZSgpOgotCWdsb2JhbCBfbXluYW1lCi0JaWYgX215bmFtZSA9PSBOb25lOgotCQlpZCA9IF9teWlwYWRkcmVzcygpCi0JCXB0ciA9IG1hY2Ruci5BZGRyVG9OYW1lKGlkKQotCQlwdHIud2FpdCgpCi0JCV9teW5hbWUgPSBwdHIuY25hbWUKLQlyZXR1cm4gX215bmFtZQotCi0KLWRlZiBfZ2V0aG9zdGFkZHJlc3MoKToKLQlnbG9iYWwgX215YWRkcnN0cgotCWlmIF9teWFkZHJzdHIgPT0gTm9uZToKLQkJaWQgPSBfbXlpcGFkZHJlc3MoKQotCQlfbXlhZGRyc3RyID0gbWFjZG5yLkFkZHJUb1N0cihpZCkKLQlyZXR1cm4gX215YWRkcnN0cgotCi0KLWRlZiBzb2NrZXQoZmFtaWx5LCB0eXBlLCAqd2hpY2gpOgotCWlmIGZhbWlseSA8PiBBRl9JTkVUOgotCQlyYWlzZSBfbXllcnJvciwgJ1Byb3RvY29sIGZhbWlseSAlZCBub3Qgc3VwcG9ydGVkJyAlIHR5cGUKLQlpZiB0eXBlID09IFNPQ0tfREdSQU06Ci0JCXJldHVybiBfdWRwc29ja2V0KCkKLQllbGlmIHR5cGUgPT0gU09DS19TVFJFQU06Ci0JCXJldHVybiBfdGNwc29ja2V0KCkKLQlyYWlzZSBfbXllcnJvciwgJ1Byb3RvY29sIHR5cGUgJWQgbm90IHN1cHBvcnRlZCcgJSB0eXBlCi0KLQotZGVmIGZyb21mZCgqYXJncyk6Ci0JcmFpc2UgX215ZXJyb3IsICdPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiBhIG1hYycKLQotCi1jbGFzcyBfc29ja2V0OgotCWRlZiB1bnN1cHBvcnRlZChzZWxmLCAqYXJncyk6Ci0JCXJhaXNlIF9teWVycm9yLCAnT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBzb2NrZXQnCi0JCi0JYWNjZXB0ID0gdW5zdXBwb3J0ZWQKLQliaW5kID0gdW5zdXBwb3J0ZWQKLQljbG9zZSA9IHVuc3VwcG9ydGVkCi0JY29ubmVjdCA9IHVuc3VwcG9ydGVkCi0JZmlsZW5vID0gdW5zdXBwb3J0ZWQKLQlnZXRwZWVybmFtZSA9IHVuc3VwcG9ydGVkCi0JZ2V0c29ja25hbWUgPSB1bnN1cHBvcnRlZAotCWdldHNvY2tvcHQgPSB1bnN1cHBvcnRlZAotCWxpc3RlbiA9IHVuc3VwcG9ydGVkCi0JcmVjdiA9IHVuc3VwcG9ydGVkCi0JcmVjdmZyb20gPSB1bnN1cHBvcnRlZAotCXNlbmQgPSB1bnN1cHBvcnRlZAotCXNlbmR0byA9IHVuc3VwcG9ydGVkCi0Jc2V0YmxvY2tpbmcgPSB1bnN1cHBvcnRlZAotCXNldHNvY2tvcHQgPSB1bnN1cHBvcnRlZAotCXNodXRkb3duID0gdW5zdXBwb3J0ZWQKLQotCi1jbGFzcyBfdGNwc29ja2V0KF9zb2NrZXQpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi5zdHJlYW0gPSBtYWN0Y3AuVENQQ3JlYXRlKF9CVUZTSVpFKQotCQkjI3NlbGYuc3RyZWFtLmFzciA9IHNlbGYuYXNyCi0JCXNlbGYuZGF0YWJ1ZiA9ICcnCi0JCXNlbGYudWRhdGFidWYgPSAnJwotCQlzZWxmLnBvcnQgPSAwCi0JCXNlbGYuYWNjZXB0ZWQgPSAwCi0JCXNlbGYubGlzdGVuaW5nID0gMAotCi0JZGVmIGFjY2VwdChzZWxmKToKLQkJaWYgbm90IHNlbGYubGlzdGVuaW5nOgotCQkJcmFpc2UgX215ZXJyb3IsICdOb3QgbGlzdGVuaW5nJwotCQlzZWxmLmxpc3RlbmluZyA9IDAKLQkJc2VsZi5zdHJlYW0ud2FpdCgpCi0JCXNlbGYuYWNjZXB0ZWQgPSAxCi0JCXJldHVybiBzZWxmLCBzZWxmLmdldHNvY2tuYW1lKCkKLQkKLQkjIGJpbmQgaGFzIHR3byB3YXlzIG9mIGNhbGxpbmc6IHMuYmluZChob3N0LCBwb3J0KSBvciBzLmJpbmQoKGhvc3QsIHBvcnQpKTsKLQkjIHRoZSBsYXR0ZXIgaXMgbW9yZSBwcm9wZXIgYnV0IHRoZSBmb3JtZXIgbW9yZSBjb21tb24KLQlkZWYgYmluZChzZWxmLCBhMSwgYTI9Tm9uZSk6Ci0JCWlmIGEyIGlzIE5vbmU6Ci0JCQlob3N0LCBwb3J0ID0gYTEKLQkJZWxzZToKLQkJCWhvc3QsIHBvcnQgPSBhMSwgYTIKLQkJc2VsZi5wb3J0ID0gcG9ydAotCQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYuYWNjZXB0ZWQ6Ci0JCQlzZWxmLmFjY2VwdGVkID0gMAotCQkJcmV0dXJuCi0JCXNlbGYuc3RyZWFtLkFib3J0KCkKLQkKLQkjIGNvbm5lY3QgaGFzIHRoZSBzYW1lIHByb2JsZW0gYXMgYmluZCAoc2VlIGFib3ZlKQotCWRlZiBjb25uZWN0KHNlbGYsIGExLCBhMj1Ob25lKToKLQkJaWYgYTIgaXMgTm9uZToKLQkJCWhvc3QsIHBvcnQgPSBhMQotCQllbHNlOgotCQkJaG9zdCwgcG9ydCA9IGExLCBhMgotCQlzZWxmLnN0cmVhbS5BY3RpdmVPcGVuKHNlbGYucG9ydCwgX2lwYWRkcmVzcyhob3N0KSwgcG9ydCkKLQkJCi0JZGVmIGdldHNvY2tuYW1lKHNlbGYpOgotCQlob3N0LCBwb3J0ID0gc2VsZi5zdHJlYW0uR2V0U29ja05hbWUoKQotCQlob3N0ID0gbWFjZG5yLkFkZHJUb1N0cihob3N0KQotCQlyZXR1cm4gaG9zdCwgcG9ydAotCQkKLQlkZWYgZ2V0cGVlcm5hbWUoc2VsZik6Ci0JCXN0ID0gc2VsZi5zdHJlYW0uU3RhdHVzKCkKLQkJaG9zdCA9IG1hY2Ruci5BZGRyVG9TdHIoc3QucmVtb3RlSG9zdCkKLQkJcmV0dXJuIGhvc3QsIHN0LnJlbW90ZVBvcnQJCQotCQkKLQlkZWYgbGlzdGVuKHNlbGYsIGJhY2tsb2cpOgotCQlzZWxmLnN0cmVhbS5QYXNzaXZlT3BlbihzZWxmLnBvcnQpCi0JCXNlbGYubGlzdGVuaW5nID0gMQotCQkKLQlkZWYgbWFrZWZpbGUoc2VsZiwgcncgPSAncicsIGJzID0gNTEyKToKLQkJcmV0dXJuIF9zb2NrZXRmaWxlKHNlbGYsIHJ3LCBicykKLQkJCi0JZGVmIHJlY3Yoc2VsZiwgYnVmc2l6ZSwgZmxhZ3M9MCk6Ci0JCWlmIGZsYWdzOgotCQkJcmFpc2UgX215ZXJyb3IsICdyZWN2IGZsYWdzIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIG1hYycKLQkJaWYgbm90IHNlbGYuZGF0YWJ1ZjoKLQkJCXRyeToKLQkJCQlzZWxmLmRhdGFidWYsIHVyZywgbWFyayA9IHNlbGYuc3RyZWFtLlJjdigwKQotCQkJZXhjZXB0IG1hY3RjcC5lcnJvciwgYXJnOgotCQkJCWlmIGFyZ1swXSAhPSBNQUNUQ1Bjb25zdC5jb25uZWN0aW9uQ2xvc2luZzoKLQkJCQkJcmFpc2UgbWFjdGNwLmVycm9yLCBhcmcKLQkJcnYgPSBzZWxmLmRhdGFidWZbOmJ1ZnNpemVdCi0JCXNlbGYuZGF0YWJ1ZiA9IHNlbGYuZGF0YWJ1ZltidWZzaXplOl0KLQkJcmV0dXJuIHJ2Ci0JCQotCWRlZiBzZW5kKHNlbGYsIGJ1Zik6Ci0JCXNlbGYuc3RyZWFtLlNlbmQoYnVmKQotCQlyZXR1cm4gbGVuKGJ1ZikKLQkJCi0JZGVmIHNodXRkb3duKHNlbGYsIGhvdyk6Ci0JCWlmIGhvdyA9PSAwOgotCQkJcmV0dXJuCi0JCXNlbGYuc3RyZWFtLkNsb3NlKCkKLQkJCi0JZGVmIGJ5dGVzX3JlYWRhYmxlKHNlbGYpOgotCQlzdCA9IHNlbGYuc3RyZWFtLlN0YXR1cygpCi0JCXJldHVybiBzdC5hbXRVbnJlYWREYXRhCi0JCQotCWRlZiBieXRlc193cml0ZWFibGUoc2VsZik6Ci0JCXN0ID0gc2VsZi5zdHJlYW0uU3RhdHVzKCkKLQkJcmV0dXJuIHN0LnNlbmRXaW5kb3cgLSBzdC5zZW5kVW5hY2tlZDsKLQotCi1jbGFzcyBfdWRwc29ja2V0KF9zb2NrZXQpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJcGFzcwotCi0KLWNsYXNzIF9zb2NrZXRmaWxlOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzb2NrLCBydywgYnMpOgotCQlpZiByd1sxOl0gPT0gJ2InOiBydyA9IHJ3WzoxXQotCQlpZiBydyBub3QgaW4gKCdyJywgJ3cnKTogcmFpc2UgX215ZXJyb3IsICJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIKLQkJc2VsZi5zb2NrID0gc29jawotCQlzZWxmLnJ3ID0gcncKLQkJc2VsZi5icyA9IGJzCi0JCXNlbGYuYnVmID0gJycKLQkJCi0JZGVmIHJlYWQoc2VsZiwgbGVuZ3RoID0gLTEpOgotCQlpZiBsZW5ndGggPCAwOgotCQkJbGVuZ3RoID0gMHg3ZmZmZmZmZgotCQl3aGlsZSBsZW4oc2VsZi5idWYpIDwgbGVuZ3RoOgotCQkJbmV3ID0gc2VsZi5zb2NrLnJlY3YoMHg3ZmZmZmZmZikKLQkJCWlmIG5vdCBuZXc6Ci0JCQkJYnJlYWsKLQkJCXNlbGYuYnVmID0gc2VsZi5idWYgKyBuZXcKLQkJcnYgPSBzZWxmLmJ1Zls6bGVuZ3RoXQotCQlzZWxmLmJ1ZiA9IHNlbGYuYnVmW2xlbmd0aDpdCi0JCXJldHVybiBydgotCQkKLQlkZWYgcmVhZGxpbmUoc2VsZik6Ci0JCWltcG9ydCBzdHJpbmcKLQkJd2hpbGUgbm90ICdcbicgaW4gc2VsZi5idWY6Ci0JCQluZXcgPSBzZWxmLnNvY2sucmVjdigweDdmZmZmZmZmKQotCQkJaWYgbm90IG5ldzoKLQkJCQlicmVhawotCQkJc2VsZi5idWYgPSBzZWxmLmJ1ZiArIG5ldwotCQlpZiBub3QgJ1xuJyBpbiBzZWxmLmJ1ZjoKLQkJCXJ2ID0gc2VsZi5idWYKLQkJCXNlbGYuYnVmID0gJycKLQkJZWxzZToKLQkJCWkgPSBzdHJpbmcuaW5kZXgoc2VsZi5idWYsICdcbicpCi0JCQlydiA9IHNlbGYuYnVmWzppKzFdCi0JCQlzZWxmLmJ1ZiA9IHNlbGYuYnVmW2krMTpdCi0JCXJldHVybiBydgotCQkKLQlkZWYgcmVhZGxpbmVzKHNlbGYpOgotCQlsaXN0ID0gW10KLQkJbGluZSA9IHNlbGYucmVhZGxpbmUoKQotCQl3aGlsZSBsaW5lOgotCQkJbGlzdC5hcHBlbmQobGluZSkKLQkJCWxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKLQkJcmV0dXJuIGxpc3QKLQkJCi0JZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0JCUJTID0gc2VsZi5icwotCQlpZiBsZW4oYnVmKSA+PSBCUzoKLQkJCXNlbGYuZmx1c2goKQotCQkJc2VsZi5zb2NrLnNlbmQoYnVmKQotCQllbGlmIGxlbihidWYpICsgbGVuKHNlbGYuYnVmKSA+PSBCUzoKLQkJCXNlbGYuZmx1c2goKQotCQkJc2VsZi5idWYgPSBidWYKLQkJZWxzZToKLQkJCXNlbGYuYnVmID0gc2VsZi5idWYgKyBidWYKLQkKLQlkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKLQkJZm9yIGxpbmUgaW4gbGlzdDoKLQkJCXNlbGYud3JpdGUobGluZSkKLQkKLQlkZWYgZmx1c2goc2VsZik6Ci0JCWlmIHNlbGYuYnVmIGFuZCBzZWxmLnJ3ID09ICd3JzoKLQkJCXNlbGYuc29jay5zZW5kKHNlbGYuYnVmKQotCQkJc2VsZi5idWYgPSAnJwotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5mbHVzaCgpCi0JCSMjc2VsZi5zb2NrLmNsb3NlKCkKLQkJZGVsIHNlbGYuc29jawotCi0KLWRlZiBfX3Rlc3RfdGNwKCk6Ci0JcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSkKLQlzLmNvbm5lY3QoJ3Bvc2VpZG9uLmN3aS5ubCcsIDEzKQotCXJ2ID0gcy5yZWN2KDEwMDApCi0JcHJpbnQgJ1RpbWUvZGF0ZTonLCBydgotCXJ2ID0gcy5yZWN2KDEwMDApCi0JaWYgcnY6Ci0JCXByaW50ICdVbmV4cGVjdGVkIGV4dHJhIGRhdGE6JywgcnYKLQlzLmNsb3NlKCkKLQkKLQotZGVmIF9fdGVzdF91ZHAoKToKLQlzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0pCi0JcHJpbnQgJ1NlbmRpbmcgZGF0YS4uLiAoaGVsbG8gd29ybGQpJwotCXMuc2VuZHRvKCgncG9zZWlkb24uY3dpLm5sJywgNyksICdoZWxsbyB3b3JsZCcpCi0JcnYsIGhvc3QgPSBzLnJlY3Zmcm9tKDEwMDApCi0JcHJpbnQgJ0dvdCBmcm9tICcsIGhvc3QsICc6JywgcnYKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvdGNwZ2x1ZS5jIGIvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC90Y3BnbHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDQyYjQuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC90Y3BnbHVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIEdsdWUgcm91dGluZXMgZm9yIG1hY3RjcCBtb2R1bGUuCi0gKiBKYWNrIEphbnNlbiwgQ1dJLCAxOTk0LgotICoKLSAqIEFkYXB0ZWQgZnJvbSBtYWN0Y3Agc29ja2V0IGxpYnJhcnksIHdoaWNoIHdhcyBpbiB0dXJuCi0gKiBhZGFwdGVkIGZyb20gbmNzYSB0ZWxuZXQgY29kZS4KLSAqCi0gKiBPcmlnaW5hbCBhdXRob3JzOiBUb20gTWlsbGlnYW4sIENoYXJsaWUgUmVpbWFuCi0gKi8KLSAKLSMgaW5jbHVkZSA8TWVtb3J5Lmg+Ci0jIGluY2x1ZGUgPEZpbGVzLmg+Ci0jIGluY2x1ZGUgPEVycm9ycy5oPgotCi0jaW5jbHVkZSAidGNwZ2x1ZS5oIgotI2luY2x1ZGUgPERldmljZXMuaD4KLQotc3RhdGljIHNob3J0IGRyaXZlciA9IDA7Ci0KLSNpZm5kZWYgX19wb3dlcmMKLS8qCi0gKiBIYWNrIGZpeCBmb3IgTWFjVENQIDEuMC5YIGJ1ZwotICoKLSAqIFRoaXMgaGFjayBkb2Vzbid0IHdvcmsgb24gdGhlIFBQQy4gQnV0IHRoZW4sIHBlb3BsZSB3aXRoIG5ldyBtYWNoaW5lcwotICogc2hvdWxkbid0IHJ1biBhbmNpZW50IGJ1Z2d5IHNvZnR3YXJlLiAtLSBKYWNrLgotICovCi0gCi1wYXNjYWwgY2hhciAqUmV0dXJuQTUodm9pZCkgPSB7MHgyRThEfTsKLSNlbmRpZiAvKiAhX19wb3dlcmMgKi8KLQotT1NFcnIgeE9wZW5Ecml2ZXIoKSAKLXsgCi0JaWYgKGRyaXZlciA9PSAwKSAKLQl7IAotCQlQYXJhbUJsb2NrUmVjIHBiOyAKLQkJT1NFcnIgaW87IAotCQkKLQkJcGIuaW9QYXJhbS5pb0NvbXBsZXRpb24gPSAwTDsgCi0JCXBiLmlvUGFyYW0uaW9OYW1lUHRyID0gIlxwLklQUCI7IAotCQlwYi5pb1BhcmFtLmlvUGVybXNzbiA9IGZzQ3VyUGVybTsgCi0JCWlvID0gUEJPcGVuKCZwYixmYWxzZSk7IAotCQlpZiAoaW8gIT0gbm9FcnIpIAotCQkJcmV0dXJuKGlvKTsgCi0JCWRyaXZlciA9IHBiLmlvUGFyYW0uaW9SZWZOdW07IAotCX0KLQlyZXR1cm4gbm9FcnI7Ci19Ci0KLS8qCi0gKiBjcmVhdGUgYSBUQ1Agc3RyZWFtCi0gKi8KLU9TRXJyIHhUQ1BDcmVhdGUoYnVmbGVuLG5vdGlmeSx1ZHAsIHBiKSAKLQlpbnQgYnVmbGVuOwotCVRDUE5vdGlmeVVQUCBub3RpZnk7Ci0Jdm9pZCAqdWRwOwotCVRDUGlvcGIgKnBiOwotewkKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBUQ1BDcmVhdGU7Ci0JcGItPmNzUGFyYW0uY3JlYXRlLnJjdkJ1ZmYgPSAoY2hhciAqKU5ld1B0cihidWZsZW4pOwotCXBiLT5jc1BhcmFtLmNyZWF0ZS5yY3ZCdWZmTGVuID0gYnVmbGVuOwotCXBiLT5jc1BhcmFtLmNyZWF0ZS5ub3RpZnlQcm9jID0gbm90aWZ5OwotCXBiLT5jc1BhcmFtLmNyZWF0ZS51c2VyRGF0YVB0ciA9IHVkcDsKLQlyZXR1cm4gKHhQQkNvbnRyb2xTeW5jKHBiKSk7Ci19Ci0KLQotLyoKLSAqIHN0YXJ0IGxpc3RlbmluZyBmb3IgYSBUQ1AgY29ubmVjdGlvbgotICovCi1PU0VyciB4VENQUGFzc2l2ZU9wZW4oVENQaW9wYiAqcGIsIHNob3J0IHBvcnQsIFRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uLAotCXZvaWQgKnVkcCkKLXsKLQlpZiAoZHJpdmVyID09IDApCi0JCXJldHVybihpbnZhbGlkU3RyZWFtUHRyKTsKLQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFRDUFBhc3NpdmVPcGVuOwotCXBiLT5jc1BhcmFtLm9wZW4udmFsaWRpdHlGbGFncyA9IHRpbWVvdXRWYWx1ZSB8IHRpbWVvdXRBY3Rpb247Ci0JcGItPmNzUGFyYW0ub3Blbi51bHBUaW1lb3V0VmFsdWUgPSAyNTUgLyogc2Vjb25kcyAqLzsKLQlwYi0+Y3NQYXJhbS5vcGVuLnVscFRpbWVvdXRBY3Rpb24gPSAwIC8qIDE6YWJvcnQgMDpyZXBvcnQgKi87Ci0JcGItPmNzUGFyYW0ub3Blbi5jb21tYW5kVGltZW91dFZhbHVlID0gMCAvKiBpbmZpbml0eSAqLzsKLQlwYi0+Y3NQYXJhbS5vcGVuLnJlbW90ZUhvc3QgPSAwOwotCXBiLT5jc1BhcmFtLm9wZW4ucmVtb3RlUG9ydCA9IDA7Ci0JcGItPmNzUGFyYW0ub3Blbi5sb2NhbEhvc3QgPSAwOwotCXBiLT5jc1BhcmFtLm9wZW4ubG9jYWxQb3J0ID0gcG9ydDsKLQlwYi0+Y3NQYXJhbS5vcGVuLmRvbnRGcmFnID0gMDsKLQlwYi0+Y3NQYXJhbS5vcGVuLnRpbWVUb0xpdmUgPSAwOwotCXBiLT5jc1BhcmFtLm9wZW4uc2VjdXJpdHkgPSAwOwotCXBiLT5jc1BhcmFtLm9wZW4ub3B0aW9uQ250ID0gMDsKLQlwYi0+Y3NQYXJhbS5vcGVuLnVzZXJEYXRhUHRyID0gdWRwOwotCXJldHVybiAoeFBCQ29udHJvbChwYixjb21wbGV0aW9uKSk7Ci19Ci0KLS8qCi0gKiBjb25uZWN0IHRvIGEgcmVtb3RlIFRDUAotICovCi1PU0VyciB4VENQQWN0aXZlT3BlbihUQ1Bpb3BiICpwYiwgc2hvcnQgcG9ydCwgbG9uZyByaG9zdCwgc2hvcnQgcnBvcnQsIAotCVRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uKQotewotCWlmIChkcml2ZXIgPT0gMCkKLQkJcmV0dXJuKGludmFsaWRTdHJlYW1QdHIpOwotCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVENQQWN0aXZlT3BlbjsKLQlwYi0+Y3NQYXJhbS5vcGVuLnZhbGlkaXR5RmxhZ3MgPSB0aW1lb3V0VmFsdWUgfCB0aW1lb3V0QWN0aW9uOwotCXBiLT5jc1BhcmFtLm9wZW4udWxwVGltZW91dFZhbHVlID0gNjAgLyogc2Vjb25kcyAqLzsKLQlwYi0+Y3NQYXJhbS5vcGVuLnVscFRpbWVvdXRBY3Rpb24gPSAxIC8qIDE6YWJvcnQgMDpyZXBvcnQgKi87Ci0JcGItPmNzUGFyYW0ub3Blbi5jb21tYW5kVGltZW91dFZhbHVlID0gMDsKLQlwYi0+Y3NQYXJhbS5vcGVuLnJlbW90ZUhvc3QgPSByaG9zdDsKLQlwYi0+Y3NQYXJhbS5vcGVuLnJlbW90ZVBvcnQgPSBycG9ydDsKLQlwYi0+Y3NQYXJhbS5vcGVuLmxvY2FsSG9zdCA9IDA7Ci0JcGItPmNzUGFyYW0ub3Blbi5sb2NhbFBvcnQgPSBwb3J0OwotCXBiLT5jc1BhcmFtLm9wZW4uZG9udEZyYWcgPSAwOwotCXBiLT5jc1BhcmFtLm9wZW4udGltZVRvTGl2ZSA9IDA7Ci0JcGItPmNzUGFyYW0ub3Blbi5zZWN1cml0eSA9IDA7Ci0JcGItPmNzUGFyYW0ub3Blbi5vcHRpb25DbnQgPSAwOwotCXJldHVybiAoeFBCQ29udHJvbChwYixjb21wbGV0aW9uKSk7Ci19Ci0KLU9TRXJyIHhUQ1BOb0NvcHlSY3YocGIscmRzLHJkc2xlbix0aW1lb3V0LGNvbXBsZXRpb24pIAotCVRDUGlvcGIgKnBiOwotCXJkc0VudHJ5ICpyZHM7IAotCWludCByZHNsZW47Ci0JaW50CXRpbWVvdXQ7Ci0JVENQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb247Ci17Ci0JCi0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oaW52YWxpZFN0cmVhbVB0cik7Ci0JCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVENQTm9Db3B5UmN2OwotCXBiLT5jc1BhcmFtLnJlY2VpdmUuY29tbWFuZFRpbWVvdXRWYWx1ZSA9IHRpbWVvdXQ7IC8qIHNlY29uZHMsIDAgPSBibG9ja2luZyAqLwotCXBiLT5jc1BhcmFtLnJlY2VpdmUucmRzUHRyID0gKFB0cilyZHM7Ci0JcGItPmNzUGFyYW0ucmVjZWl2ZS5yZHNMZW5ndGggPSByZHNsZW47Ci0JcmV0dXJuICh4UEJDb250cm9sKHBiLGNvbXBsZXRpb24pKTsKLX0KLQotT1NFcnIgeFRDUEJ1ZlJldHVybihUQ1Bpb3BiICpwYixyZHNFbnRyeSAqcmRzLFRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uKQotCXsKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBUQ1BSY3ZCZnJSZXR1cm47Ci0JcGItPmNzUGFyYW0ucmVjZWl2ZS5yZHNQdHIgPSAoUHRyKXJkczsKLQkKLQlyZXR1cm4gKHhQQkNvbnRyb2wocGIsY29tcGxldGlvbikpOwotCX0KLQkKLS8qCi0gKiBzZW5kIGRhdGEKLSAqLwotT1NFcnIgeFRDUFNlbmQoVENQaW9wYiAqcGIsIHdkc0VudHJ5ICp3ZHMsIEJvb2xlYW4gcHVzaCwgQm9vbGVhbiB1cmdlbnQsIFRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uKQotewotCWlmIChkcml2ZXIgPT0gMCkKLQkJcmV0dXJuIGludmFsaWRTdHJlYW1QdHI7Ci0JCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVENQU2VuZDsKLQlwYi0+Y3NQYXJhbS5zZW5kLnZhbGlkaXR5RmxhZ3MgPSB0aW1lb3V0VmFsdWUgfCB0aW1lb3V0QWN0aW9uOwotCXBiLT5jc1BhcmFtLnNlbmQudWxwVGltZW91dFZhbHVlID0gNjAgLyogc2Vjb25kcyAqLzsKLQlwYi0+Y3NQYXJhbS5zZW5kLnVscFRpbWVvdXRBY3Rpb24gPSAwIC8qIDA6YWJvcnQgMTpyZXBvcnQgKi87Ci0JcGItPmNzUGFyYW0uc2VuZC5wdXNoRmxhZyA9IHB1c2g7Ci0JcGItPmNzUGFyYW0uc2VuZC51cmdlbnRGbGFnID0gdXJnZW50OwotCXBiLT5jc1BhcmFtLnNlbmQud2RzUHRyID0gKFB0cil3ZHM7Ci0JcmV0dXJuICh4UEJDb250cm9sKHBiLGNvbXBsZXRpb24pKTsKLX0KLQotCi0vKgotICogY2xvc2UgYSBjb25uZWN0aW9uCi0gKi8KLU9TRXJyIHhUQ1BDbG9zZShUQ1Bpb3BiICpwYixUQ1BJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbikgCi17Ci0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oaW52YWxpZFN0cmVhbVB0cik7Ci0JCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVENQQ2xvc2U7Ci0JcGItPmNzUGFyYW0uY2xvc2UudmFsaWRpdHlGbGFncyA9IHRpbWVvdXRWYWx1ZSB8IHRpbWVvdXRBY3Rpb247Ci0JcGItPmNzUGFyYW0uY2xvc2UudWxwVGltZW91dFZhbHVlID0gNjAgLyogc2Vjb25kcyAqLzsKLQlwYi0+Y3NQYXJhbS5jbG9zZS51bHBUaW1lb3V0QWN0aW9uID0gMSAvKiAxOmFib3J0IDA6cmVwb3J0ICovOwotCXJldHVybiAoeFBCQ29udHJvbChwYixjb21wbGV0aW9uKSk7Ci19Ci0KLS8qCi0gKiBhYm9ydCBhIGNvbm5lY3Rpb24KLSAqLwotT1NFcnIgeFRDUEFib3J0KFRDUGlvcGIgKnBiKSAKLXsKLQlpZiAoZHJpdmVyID09IDApCi0JCXJldHVybihpbnZhbGlkU3RyZWFtUHRyKTsKLQkKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBUQ1BBYm9ydDsKLQlyZXR1cm4gKHhQQkNvbnRyb2xTeW5jKHBiKSk7Ci19Ci0KLS8qCi0gKiBjbG9zZSBkb3duIGEgVENQIHN0cmVhbSAoYWJvcnRpbmcgYSBjb25uZWN0aW9uLCBpZiBuZWNlc3NhcnkpCi0gKi8KLU9TRXJyIHhUQ1BSZWxlYXNlKHBiKSAKLQlUQ1Bpb3BiICpwYjsKLXsKLQlPU0VyciBpbzsKLQkKLQlpZiAoZHJpdmVyID09IDApCi0JCXJldHVybihpbnZhbGlkU3RyZWFtUHRyKTsKLQkKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBUQ1BSZWxlYXNlOwotCWlvID0geFBCQ29udHJvbFN5bmMocGIpOwotCWlmIChpbyA9PSBub0VycikKLQkJRGlzcG9zUHRyKHBiLT5jc1BhcmFtLmNyZWF0ZS5yY3ZCdWZmKTsgLyogdGhlcmUgaXMgbm8gcmVsZWFzZSBwYiAqLwotCXJldHVybihpbyk7Ci19Ci0KLSNpZiAwCi0KLWludAoteFRDUEJ5dGVzVW5yZWFkKHNwKSAKLQlTb2NrZXRQdHIgc3A7Ci17Ci0JVENQaW9wYgkqcGI7Ci0JT1NFcnIgaW87Ci0JCi0JaWYgKCEocGIgPSBzb2NrX2ZldGNoX3BiKHNwKSkpCi0JCXJldHVybiAtMTsJCS8qIHBhbmljICovCi0JCi0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oLTEpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFRDUFN0YXR1czsKLQlpbyA9IHhQQkNvbnRyb2xTeW5jKHBiKTsKLQlpZiAoaW8gIT0gbm9FcnIpCi0JCXJldHVybigtMSk7Ci0JcmV0dXJuKHBiLT5jc1BhcmFtLnN0YXR1cy5hbXRVbnJlYWREYXRhKTsKLX0KLQotaW50Ci14VENQQnl0ZXNXcml0ZWFibGUoc3ApCi0JU29ja2V0UHRyIHNwOwotCXsKLQlUQ1Bpb3BiICpwYjsKLQlPU0VycglpbzsKLQlsb25nCWFtb3VudDsKLQkKLQlpZiAoIShwYiA9IHNvY2tfZmV0Y2hfcGIoc3ApKSkKLQkJcmV0dXJuIC0xOwkJLyogcGFuaWMgKi8KLQkKLQlpZiAoZHJpdmVyID09IDApCi0JCXJldHVybigtMSk7Ci0JCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVENQU3RhdHVzOwotCWlvID0geFBCQ29udHJvbFN5bmMocGIpOwotCWlmIChpbyAhPSBub0VycikKLQkJcmV0dXJuKC0xKTsKLQlhbW91bnQgPSBwYi0+Y3NQYXJhbS5zdGF0dXMuc2VuZFdpbmRvdy1wYi0+Y3NQYXJhbS5zdGF0dXMuYW10VW5hY2tlZERhdGE7Ci0JaWYgKGFtb3VudCA8IDApCi0JCWFtb3VudCA9IDA7Ci0JcmV0dXJuIGFtb3VudDsKLQl9Ci0JCi1pbnQgeFRDUFdyaXRlQnl0ZXNMZWZ0KFNvY2tldFB0ciBzcCkKLQl7Ci0JVENQaW9wYiAqcGI7Ci0JT1NFcnIJaW87Ci0JCi0JaWYgKCEocGIgPSBzb2NrX2ZldGNoX3BiKHNwKSkpCi0JCXJldHVybiAtMTsJCS8qIHBhbmljICovCi0JCi0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oLTEpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFRDUFN0YXR1czsKLQlpbyA9IHhQQkNvbnRyb2xTeW5jKHBiKTsKLQlpZiAoaW8gIT0gbm9FcnIpCi0JCXJldHVybigtMSk7Ci0JcmV0dXJuIChwYi0+Y3NQYXJhbS5zdGF0dXMuYW10VW5hY2tlZERhdGEpOwotCX0KLSNlbmRpZgotCi1PU0VyciB4VENQU3RhdHVzKFRDUGlvcGIgKnBiLCBUQ1BTdGF0dXNQQiAqKnNwYikKLQl7Ci0JT1NFcnIgaW87Ci0JCi0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oLTEpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFRDUFN0YXR1czsKLQlpbyA9IHhQQkNvbnRyb2xTeW5jKHBiKTsKLQlpZiAoaW8gPT0gbm9FcnIpCi0JCSpzcGIgPSAmcGItPmNzUGFyYW0uc3RhdHVzOwotCXJldHVybihpbyk7Ci0JfQotCi0KLS8qCi0gKiBjcmVhdGUgYSBVRFAgc3RyZWFtLCBob29rIGl0IHRvIGEgc29ja2V0LgotICovCi1PU0VyciB4VURQQ3JlYXRlKFVEUGlvcGIgKnBiLGludCBidWZsZW4saXBfcG9ydCAqcG9ydCwgVURQTm90aWZ5VVBQIGFzciwgdm9pZCAqdWRwKQotCXsJCi0JT1NFcnIgICBpbzsKLQkKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBVRFBDcmVhdGU7Ci0JcGItPmNzUGFyYW0uY3JlYXRlLnJjdkJ1ZmYgPSAoY2hhciAqKU5ld1B0cihidWZsZW4pOwotCXBiLT5jc1BhcmFtLmNyZWF0ZS5yY3ZCdWZmTGVuID0gYnVmbGVuOwotCXBiLT5jc1BhcmFtLmNyZWF0ZS5ub3RpZnlQcm9jID0gYXNyOwotCXBiLT5jc1BhcmFtLmNyZWF0ZS51c2VyRGF0YVB0ciA9IHVkcDsKLQlwYi0+Y3NQYXJhbS5jcmVhdGUubG9jYWxQb3J0ID0gKnBvcnQ7Ci0JaWYgKCAoaW8gPSB4UEJDb250cm9sU3luYyggKFRDUGlvcGIgKilwYiApICkgIT0gbm9FcnIpCi0JCXJldHVybiBpbzsKLQkJCi0JKnBvcnQgPSBwYi0+Y3NQYXJhbS5jcmVhdGUubG9jYWxQb3J0OwotCXJldHVybiBub0VycjsKLQl9Ci0KLS8qCi0gKiBhc2sgZm9yIGluY29taW5nIGRhdGEKLSAqLwotT1NFcnIgeFVEUFJlYWQoVURQaW9wYiAqcGIsIGludCB0aW1lb3V0LCBVRFBJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbikgCi0JewotCQotCWlmIChkcml2ZXIgPT0gMCkKLQkJcmV0dXJuKGludmFsaWRTdHJlYW1QdHIpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFVEUFJlYWQ7Ci0JcGItPmNzUGFyYW0ucmVjZWl2ZS50aW1lT3V0ID0gdGltZW91dDsKLQlwYi0+Y3NQYXJhbS5yZWNlaXZlLnNlY29uZFRpbWVTdGFtcCA9IDAvKiBtdXN0IGJlIHplcm8gKi87Ci0JcmV0dXJuICh4UEJDb250cm9sICggKFRDUGlvcGIgKilwYiwgKFRDUElPQ29tcGxldGlvblVQUCljb21wbGV0aW9uICkpOwotCX0KLQotT1NFcnIgeFVEUEJmclJldHVybihVRFBpb3BiICpwYiwgY2hhciAqYnVmZikgCi0JewotCQotCWlmIChkcml2ZXIgPT0gMCkKLQkJcmV0dXJuKGludmFsaWRTdHJlYW1QdHIpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFVEUEJmclJldHVybjsKLQlwYi0+Y3NQYXJhbS5yZWNlaXZlLnJjdkJ1ZmYgPSBidWZmOwotCXJldHVybiAoIHhQQkNvbnRyb2woIChUQ1Bpb3BiICopcGIsKFRDUElPQ29tcGxldGlvblVQUCktMSApICk7Ci0JfQotCi0vKgotICogc2VuZCBkYXRhCi0gKi8KLU9TRXJyIHhVRFBXcml0ZShVRFBpb3BiCSpwYixpcF9hZGRyIGhvc3QsaXBfcG9ydCBwb3J0LG1pbml3ZHMgKndkcywKLQkJVURQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb24pIAotCXsKLQkJCi0JaWYgKGRyaXZlciA9PSAwKQotCQlyZXR1cm4oaW52YWxpZFN0cmVhbVB0cik7Ci0JCi0JcGItPmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYi0+Y3NDb2RlID0gVURQV3JpdGU7Ci0JcGItPmNzUGFyYW0uc2VuZC5yZW1vdGVIb3N0ID0gaG9zdDsKLQlwYi0+Y3NQYXJhbS5zZW5kLnJlbW90ZVBvcnQgPSBwb3J0OwotCXBiLT5jc1BhcmFtLnNlbmQud2RzUHRyID0gKFB0cil3ZHM7Ci0JcGItPmNzUGFyYW0uc2VuZC5jaGVja1N1bSA9IHRydWU7Ci0JcGItPmNzUGFyYW0uc2VuZC5zZW5kTGVuZ3RoID0gMC8qIG11c3QgYmUgemVybyAqLzsKLQlyZXR1cm4gKHhQQkNvbnRyb2woIChUQ1Bpb3BiICopcGIsIChUQ1BJT0NvbXBsZXRpb25VUFApY29tcGxldGlvbikpOwotCX0KLQotLyoKLSAqIGNsb3NlIGRvd24gYSBVRFAgc3RyZWFtIChhYm9ydGluZyBhIHJlYWQsIGlmIG5lY2Vzc2FyeSkKLSAqLwotT1NFcnIgeFVEUFJlbGVhc2UoVURQaW9wYiAqcGIpIHsKLQlPU0VyciBpbzsKLQotCWlmIChkcml2ZXIgPT0gMCkKLQkJcmV0dXJuKGludmFsaWRTdHJlYW1QdHIpOwotCQotCXBiLT5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGItPmNzQ29kZSA9IFVEUFJlbGVhc2U7Ci0JaW8gPSB4UEJDb250cm9sU3luYyggKFRDUGlvcGIgKilwYiApOwotCWlmIChpbyA9PSBub0VycikgewotCQlEaXNwb3NQdHIocGItPmNzUGFyYW0uY3JlYXRlLnJjdkJ1ZmYpOwotCQl9Ci0JcmV0dXJuKGlvKTsKLQl9Ci0KLWlwX2FkZHIgeElQQWRkcih2b2lkKSAKLXsKLQlzdHJ1Y3QgR2V0QWRkclBhcmFtQmxvY2sgcGJyOwotCU9TRXJyIGlvOwotCQotCXBici5pb0NSZWZOdW0gPSBkcml2ZXI7Ci0JcGJyLmNzQ29kZSA9IGlwY3RsR2V0QWRkcjsKLQlpbyA9IHhQQkNvbnRyb2xTeW5jKCAoVENQaW9wYiAqKSZwYnIgKTsKLQlpZiAoaW8gIT0gbm9FcnIpCi0JCXJldHVybigwKTsKLQlyZXR1cm4ocGJyLm91ckFkZHJlc3MpOwotfQotCi1sb25nIHhOZXRNYXNrKCkgCi17Ci0Jc3RydWN0IEdldEFkZHJQYXJhbUJsb2NrIHBicjsKLQlPU0VyciBpbzsKLQkKLQlwYnIuaW9DUmVmTnVtID0gZHJpdmVyOwotCXBici5jc0NvZGUgPSBpcGN0bEdldEFkZHI7Ci0JaW8gPSB4UEJDb250cm9sU3luYyggKFRDUGlvcGIgKikmcGJyKTsKLQlpZiAoaW8gIT0gbm9FcnIpCi0JCXJldHVybigwKTsKLQlyZXR1cm4ocGJyLm91ck5ldE1hc2spOwotfQotCi11bnNpZ25lZCBzaG9ydCB4TWF4TVRVKCkKLXsKLQlzdHJ1Y3QgVURQaW9wYiBwYnI7Ci0JT1NFcnIgaW87Ci0JCi0JcGJyLmlvQ1JlZk51bSA9IGRyaXZlcjsKLQlwYnIuY3NDb2RlID0gVURQTWF4TVRVU2l6ZTsKLQlwYnIuY3NQYXJhbS5tdHUucmVtb3RlSG9zdCA9IHhJUEFkZHIoKTsKLQlpbyA9IHhQQkNvbnRyb2xTeW5jKCAoVENQaW9wYiAqKSZwYnIgKTsKLQlpZiAoaW8gIT0gbm9FcnIpCi0JCXJldHVybigwKTsKLQlyZXR1cm4ocGJyLmNzUGFyYW0ubXR1Lm10dVNpemUpOwotfQotCi1PU0VyciB4UEJDb250cm9sU3luYyhUQ1Bpb3BiICpwYikgCi17IAotCShwYiktPmlvQ29tcGxldGlvbiA9IDBMOyAKLQlyZXR1cm4gUEJDb250cm9sKChQYXJtQmxrUHRyKShwYiksZmFsc2UpOyAKLX0KLQotI3ByYWdtYSBzZWdtZW50IFNPQ0tfUkVTSURFTlQKLQotT1NFcnIgeFRDUFJjdihwYixidWYsYnVmbGVuLHRpbWVvdXQsY29tcGxldGlvbikgCi0JVENQaW9wYiAqcGI7Ci0JUHRyIGJ1ZjsgCi0JaW50IGJ1ZmxlbjsKLQlpbnQJdGltZW91dDsKLQlUQ1BJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbjsKLXsKLQkKLQlpZiAoZHJpdmVyID09IDApCi0JCXJldHVybihpbnZhbGlkU3RyZWFtUHRyKTsKLQkKLQlwYi0+aW9DUmVmTnVtID0gZHJpdmVyOwotCXBiLT5jc0NvZGUgPSBUQ1BSY3Y7Ci0JcGItPmNzUGFyYW0ucmVjZWl2ZS5jb21tYW5kVGltZW91dFZhbHVlID0gdGltZW91dDsgLyogc2Vjb25kcywgMCA9IGJsb2NraW5nICovCi0JcGItPmNzUGFyYW0ucmVjZWl2ZS5yY3ZCdWZmID0gYnVmOwotCXBiLT5jc1BhcmFtLnJlY2VpdmUucmN2QnVmZkxlbiA9IGJ1ZmxlbjsKLQlyZXR1cm4gKHhQQkNvbnRyb2wocGIsY29tcGxldGlvbikpOwotfQotCi1PU0VyciB4UEJDb250cm9sKFRDUGlvcGIgKnBiLFRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uKSAKLXsgCi0jaWZuZGVmIF9fTVdFUktTX18KLQlwYi0+aW9OYW1lUHRyID0gUmV0dXJuQTUoKTsKLSNlbmRpZgotCQotCWlmIChjb21wbGV0aW9uID09IDBMKSAKLQl7IAotCQkocGIpLT5pb0NvbXBsZXRpb24gPSAwTDsgCi0JCXJldHVybihQQkNvbnRyb2woKFBhcm1CbGtQdHIpKHBiKSxmYWxzZSkpOwkJLyogc3luYyAqLwotCX0gCi0JZWxzZSBpZiAoY29tcGxldGlvbiA9PSAoVENQSU9Db21wbGV0aW9uVVBQKS0xTCkgCi0JeyAKLQkJKHBiKS0+aW9Db21wbGV0aW9uID0gMEw7IAotCQlyZXR1cm4oUEJDb250cm9sKChQYXJtQmxrUHRyKShwYiksdHJ1ZSkpOwkJLyogYXN5bmMgKi8KLQl9IAotCWVsc2UgCi0JeyAgCi0JCShwYiktPmlvQ29tcGxldGlvbiA9IGNvbXBsZXRpb247Ci0JCXJldHVybihQQkNvbnRyb2woKFBhcm1CbGtQdHIpKHBiKSx0cnVlKSk7CQkvKiBhc3luYyAqLwotCX0gCi19Ci0KZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC9tYWN0Y3AvdGNwZ2x1ZS5oIGIvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC90Y3BnbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWUxMzMuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL21hY3RjcC90Y3BnbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogUHJvdG90eXBlcyBmb3IgbWFjdGNwZ2x1ZSByb3V0aW5lcyBhbmQgaW5jbHVkZXMvc3RydWN0dXJlcyBuZWVkZWQKLSAqIGJ5IHRob3NlLgotICoKLSAqIEphY2sgSmFuc2VuLCBDV0ksIDE5OTQuCi0gKgotICogQWRhcHRlZCBmcm9tIG1hYyBzb2NrZXQgbGlicmFyeSwgd2hpY2ggaGFzIGluIHR1cm4gYWRhcHRlZCBmcm9tIG5jc2EgdGVsbmV0LgotICogT3JpZ2luYWwgYXV0aG9yczogVG9tIE1pbGxpZ2FuLCBDaGFybGllIFJlaW1hbgotICovCi0gIAotI2luY2x1ZGUgPE1hY1RDUENvbW1vblR5cGVzLmg+Ci0jaW5jbHVkZSA8R2V0TXlJUEFkZHIuaD4KLSNpbmNsdWRlIDxUQ1BQQi5oPgotI2luY2x1ZGUgPFVEUFBCLmg+Ci0jaW5jbHVkZSA8QWRkcmVzc1hsYXRpb24uaD4KLQotI2lmbmRlZiBfX01XRVJLU19fCi0jZGVmaW5lIFRDUElPQ29tcGxldGlvblVQUCBUQ1BJT0NvbXBsZXRpb25Qcm9jCi0jZGVmaW5lIFRDUE5vdGlmeVVQUCBUQ1BOb3RpZnlQcm9jCi0jZGVmaW5lIFVEUElPQ29tcGxldGlvblVQUCBVRFBJT0NvbXBsZXRpb25Qcm9jCi0jZGVmaW5lIFVEUE5vdGlmeVVQUCBVRFBOb3RpZnlQcm9jCi0jZGVmaW5lIE5ld1RDUElPQ29tcGxldGlvblByb2MoeCkgKHgpCi0jZGVmaW5lIE5ld1RDUE5vdGlmeVByb2MoeCkgKHgpCi0jZGVmaW5lIE5ld1VEUElPQ29tcGxldGlvblByb2MoeCkgKHgpCi0jZGVmaW5lIE5ld1VEUE5vdGlmeVByb2MoeCkgKHgpCi0jZW5kaWYgLyogX19NV0VSS1NfXyAqLwotCi0jaWYgZGVmaW5lZChwb3dlcmMpIHx8IGRlZmluZWQgKF9fcG93ZXJjKQotI3ByYWdtYSBvcHRpb25zIGFsaWduPW1hYzY4awotI2VuZGlmCi0KLXR5cGVkZWYJc3RydWN0CW1pbml3ZHMKLQl7Ci0JdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwotCWNoYXIgKiBwdHI7Ci0JdW5zaWduZWQgc2hvcnQgdGVybWludXM7CS8qIG11c3QgYmUgemVybydkIGZvciB1c2UgKi8KLQl9IG1pbml3ZHM7Ci0KLSNpZiBkZWZpbmVkKHBvd2VyYykgfHwgZGVmaW5lZChfX3Bvd2VyYykKLSNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAotI2VuZGlmCi0KLQotT1NFcnIgeE9wZW5Ecml2ZXIodm9pZCk7Ci1PU0VyciB4UEJDb250cm9sKFRDUGlvcGIgKnBiLCBUQ1BJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbik7Ci1PU0VyciB4UEJDb250cm9sU3luYyhUQ1Bpb3BiICpwYik7Ci1PU0VyciB4VENQQ3JlYXRlKGludCBidWZsZW4sIFRDUE5vdGlmeVVQUCBub3RpZnksIHZvaWQgKnVkcCwgVENQaW9wYiAqcGIpOwotT1NFcnIgeFRDUFBhc3NpdmVPcGVuKFRDUGlvcGIgKnBiLCBzaG9ydCBwb3J0LCBUQ1BJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbiwgdm9pZCAqdWRwKTsKLU9TRXJyIHhUQ1BBY3RpdmVPcGVuKFRDUGlvcGIgKnBiLCBzaG9ydCBwb3J0LCBsb25nIHJob3N0LCBzaG9ydCBycG9ydCwgVENQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb24pOwotT1NFcnIgeFRDUFJjdihUQ1Bpb3BiICpwYiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgdGltZW91dCwgVENQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb24pOwotT1NFcnIgeFRDUE5vQ29weVJjdihUQ1Bpb3BiICoscmRzRW50cnkgKixpbnQsaW50LFRDUElPQ29tcGxldGlvblVQUCk7Ci1PU0VyciB4VENQQnVmUmV0dXJuKFRDUGlvcGIgKnBiLHJkc0VudHJ5ICpyZHMsVENQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb24pOwotT1NFcnIgeFRDUFNlbmQoVENQaW9wYiAqcGIsIHdkc0VudHJ5ICp3ZHMsIEJvb2xlYW4gcHVzaCwgQm9vbGVhbiB1cmdlbnQsIFRDUElPQ29tcGxldGlvblVQUCBjb21wbGV0aW9uKTsKLU9TRXJyIHhUQ1BDbG9zZShUQ1Bpb3BiICpwYixUQ1BJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbik7Ci1PU0VyciB4VENQQWJvcnQoVENQaW9wYiAqcGIpOwotT1NFcnIgeFRDUFJlbGVhc2UoVENQaW9wYiAqcGIpOwotCi1PU0VyciB4VURQQ3JlYXRlKFVEUGlvcGIgKnBiLGludCBidWZsZW4saXBfcG9ydCAqcG9ydCwgVURQTm90aWZ5VVBQIGFzciwgdm9pZCAqdWRwKTsKLU9TRXJyIHhVRFBSZWFkKFVEUGlvcGIgKnBiLGludCB0aW1lb3V0LCBVRFBJT0NvbXBsZXRpb25VUFAgY29tcGxldGlvbik7Ci1PU0VyciB4VURQQmZyUmV0dXJuKFVEUGlvcGIgKnBiLCBjaGFyICpidWZmKTsKLU9TRXJyIHhVRFBXcml0ZShVRFBpb3BiICpwYixpcF9hZGRyIGhvc3QsaXBfcG9ydCBwb3J0LG1pbml3ZHMgKndkcywKLQkJVURQSU9Db21wbGV0aW9uVVBQIGNvbXBsZXRpb24pOwotT1NFcnIgeFVEUFJlbGVhc2UoVURQaW9wYiAqcGIpOwotCi1pcF9hZGRyIHhJUEFkZHIodm9pZCk7Ci1sb25nIHhOZXRNYXNrKHZvaWQpOwotdW5zaWduZWQgc2hvcnQgeE1heE1UVSh2b2lkKTsKLQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3N0ZHdpbm1vZHVsZS5tdS5leHAgYi9NYWMvVW5zdXBwb3J0ZWQvc3Rkd2lubW9kdWxlLm11LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjNTMyMS4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvc3Rkd2lubW9kdWxlLm11LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi1EcmF3aW5ndHlwZQotaW5pdHN0ZHdpbgotZXdwYXN0ZQotZXdjb3B5Ci1ld3VuZG8KLWV3cmVwbGFjZQotZXdjbG9zZWFsbAotZXdzYXZlYWxsCi1ld2V2ZW50Ci1ld3dyaXRlZmlsZQotZXdzZXRkaW1lbnNpb25zCi1ld3JlYWRmaWxlCi1ld3JldmVydAotZXdzYXZlcHJvbXB0Ci1ld3NhdmVjb3B5Ci1ld3NhdmVhcwotZXdzYXZlCi1ld2Nsb3NlCi1ld29wZW4KLWV3bmV3Ci1ld2NyZWF0ZQotZXdjb3VudAotZXdmaW5kCi13cGFyaGVpZ2h0Ci13ZHJhd3BhcgotdGVzZXRidWYKLXRlZ2V0bGVuCi10ZWdldHRleHQKLXRlZ2V0bmxpbmVzCi10ZWdldGZvYzIKLXRlZ2V0Zm9jMQotdGVzZXRmb2N1cwotdGVub3ZpZXcKLXRlc2V0dmlldwotdGVtb3ZlbmV3Ci10ZW1vdmUKLXRlZ2V0Ym90dG9tCi10ZWdldHJpZ2h0Ci10ZWdldHRvcAotdGVnZXRsZWZ0Ci10ZWNsaWNrbmV3Ci10ZWJhY2tzcGFjZQotdGVhcnJvdwotdGVldmVudAotdGVyZXBsYWNlCi10ZXRleHRyb3VuZAotdGV3aGVyZWlzCi10ZXdoaWNobGluZQotdGV3aGljaHBvaW50Ci10ZXNldGNhcmV0Ci10ZWVtcHR5Z2FwCi10ZWdyb3dnYXBieQotdGVtb3ZlZ2FwdG8KLXRlZHJhd25ldwotdGVkcmF3Ci10ZWNoYW5nZWZvY3VzCi10ZWhpZGVmb2N1cwotdGVzaG93Zm9jdXMKLXRlc2V0YWN0aXZlCi10ZWZyZWUKLXRlZGVzdHJveQotdGVzZXR1cAotdGVjcmVhdGUKLXRlYWxsb2MKLXpyZWFsbG9jCi16bWFsbG9jCi10ZWRyYXd0ZXh0Ci10ZXRleHRicmVhawotdGV0ZXh0d2lkdGgKLXdjcHJpbnRmCi13cHJpbnRmCi1hYm91dF9tZXNzYWdlCi1kb19hYm91dAotd2FyZ3NfYXJndgotd2FyZ3NfYXJnYwotd2FyZ3MKLUluaXRBRUhhbmRsZXJzCi13bm9jYXJldAotd3NldGNhcmV0Ci1ibGlua2NhcmV0Ci1ybWNhcmV0Ci13ZmV0Y2hjb2xvcgotX3dfY3Vyc29yCi1zZXRfaGFuZAotc2V0X2FwcGxjdXJzb3IKLXNldF93YXRjaAotc2V0X2Fycm93Ci13c2V0d2luY3Vyc29yCi13ZmV0Y2hjdXJzb3IKLXN0ZF90eXBlCi13YXNrdHlwZWxpc3QKLXdhc2tudHlwZXMKLXdwZXJyb3IKLXdhc2tzdHIKLXdhc2t5bmMKLXdtZXNzYWdlCi13YXNrZmlsZQotZHByaW50ZgotX3dfZmdjb2xvcgotX3dfYmdjb2xvcgotX3dfZm9udAotX3dfc2l6ZQotX3dfdXNlYmdjb2xvcgotX3dfdXNlZmdjb2xvcgotd3NldGJnY29sb3IKLXdzZXRmZ2NvbG9yCi13Z2V0Ymdjb2xvcgotd2dldGZnY29sb3IKLXdub2NsaXAKLXdjbGlwcmVjdAotd3hvcnBvbHkKLXdmaWxscG9seQotd2RyYXdwb2x5Ci13eG9yZWxhcmMKLXdmaWxsZWxhcmMKLXdkcmF3ZWxhcmMKLXd4b3JjaXJjbGUKLXdmaWxsY2lyY2xlCi13ZHJhd2NpcmNsZQotd3NoYWRlCi13cGFpbnQKLXdpbnZlcnQKLXdfZXJhc2UKLXdkcmF3Ym94Ci13eG9ybGluZQotd2RyYXdsaW5lCi1nZXR3aW5yZWN0Ci1tYWtlcmVjdAotd2RyYXdjaGFyCi13ZHJhd3RleHQKLXdjaGFyd2lkdGgKLXd0ZXh0d2lkdGgKLXdiYXNlbGluZQotd2xpbmVoZWlnaHQKLXdzZXRoaWxpdGUKLXdzZXR1bmRlcmxpbmUKLXdzZXRib2xkaXRhbGljCi13c2V0aXRhbGljCi13c2V0Ym9sZAotd3NldGludmVyc2UKLXdzZXRwbGFpbgotd3NldHN0eWxlXwotd3NldHNpemUKLXdzZXRmb250Ci13bGlzdGZvbnRuYW1lcwotd3NldHdpbnRleHRhdHRyCi13Z2V0d2ludGV4dGF0dHIKLXdzZXR0ZXh0YXR0cgotd2dldHRleHRhdHRyCi1pbml0d2F0dHIKLXdlbmRkcmF3aW5nCi13YmVnaW5kcmF3aW5nCi13dXBkYXRlCi1fd3VwZGF0ZQotc2Nyb2xsYnkKLXdzY3JvbGwKLXdjaGFuZ2UKLV93bV9kb3duCi1hY3RpdmUKLV93X2hpZ2hfbGV2ZWxfZXZlbnRfcHJvYwotX3dfaWRsZV9wcm9jCi13Z2V0YWN0aXZlCi13c2V0YWN0aXZlCi1fd3Jlc2V0bW91c2UKLXZhbGlkX2JvcmRlcgotaW52YWxfYm9yZGVyCi13Z2V0ZXZlbnQKLXdwb2xsZXZlbnQKLXd1bmdldGV2ZW50Ci1mdWxscGF0aAotZ2V0ZGlybmFtZQotYWJvdXRfaXRlbQotX3dtZW51aGlsaXRlCi1zZXR1cF9tZW51cwotX3dkb19tZW51Ci1ybWxvY2FsbWVudXMKLWFkZGxvY2FsbWVudXMKLWtpbGxtYmFyCi1pbml0bWJhcgotd21lbnVzZXRkZWZsb2NhbAotd21lbnVkZXRhY2gKLXdtZW51YXR0YWNoCi13bWVudWNoZWNrCi13bWVudWVuYWJsZQotd21lbnVzZXRpdGVtCi13bWVudWFkZGl0ZW0KLXdtZW51ZGVsZXRlCi13bWVudWNyZWF0ZQotUFNUUklORwotd3JvdGF0ZWN1dGJ1ZmZlcnMKLXdnZXRjdXRidWZmZXIKLXdzZXRjdXRidWZmZXIKLXdyZXNldHNlbGVjdGlvbgotd2dldHNlbGVjdGlvbgotd3NldHNlbGVjdGlvbgotd3NldGNsaXAKLXdnZXRjbGlwCi1fd2ZyZWVjbGlwCi1fd2dyb3dpY29uCi1tb3Zlc2Nyb2xsYmFycwotaGlkZXNjcm9sbGJhcnMKLXNob3dzY3JvbGxiYXJzCi1tYWtlc2Nyb2xsYmFycwotZHJhZ3Njcm9sbAotYXV0b3Njcm9sbAotZG9fc2Nyb2xsCi1fd2ZpeG9yaWdpbgotd2dldGRvY3NpemUKLXdzZXRkb2NzaXplCi13c2hvdwotd2dldG9yaWdpbgotd3NldG9yaWdpbgotd2F0dHIKLXNjcmVlbgotd2dldGRlZnNjcm9sbGJhcnMKLXdzZXRkZWZzY3JvbGxiYXJzCi13Z2V0ZGVmd2luc2l6ZQotd3NldGRlZndpbnNpemUKLXdnZXRkZWZ3aW5wb3MKLXdzZXRkZWZ3aW5wb3MKLXdzZXRtYXh3aW5zaXplCi13ZmxlZXAKLXdnZXR0aXRsZQotd3NldHRpdGxlCi13c2V0d2lucG9zCi13Z2V0d2lucG9zCi13c2V0d2luc2l6ZQotd2dldHdpbnNpemUKLXdjbG9zZQotd29wZW4KLXdoaWNod2luCi13Z2V0bW91c2Vjb25maWcKLXdnZXRzY3JtbQotd2dldHNjcnNpemUKLXdkb25lCi13aW5pdAotd2luaXRhcmdzCi1zdHJkdXAKLWNoZWNrdGltZXIKLXdzZXR0aW1lcgotd3RleHRicmVhawpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3N0ZHdpbm1vZHVsZS5tdS5ocXggYi9NYWMvVW5zdXBwb3J0ZWQvc3Rkd2lubW9kdWxlLm11LmhxeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyOTMzNS4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvc3Rkd2lubW9kdWxlLm11LmhxeAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0oVGhpcyBmaWxlIG11c3QgYmUgY29udmVydGVkIHdpdGggQmluSGV4IDQuMCkKLQotOiRoMGRDKEdURVFlW0MoOVhDNWpZRzMiMDY5IjUzZUcqNDMjMyIiMTEhISFWajlrW0JmcFtFISEhISElISEhIQotRiEhITYpSiEhJWNpISEhIjMhISEhIiEhISEnSiEhSiFgISEpISghRzZFaDliQmY5Y2hDISkhKiFDIUohYCEhKQotISshUC1EQCpiQkEqVENBMkdOIUIhTiJOIyEhISEhSiFTIzhhVEJSKktGUVBQRnBmMyJKIzMoMykhKyEkaXJyIQotIU4hOCJlKjMhTiFCYmFKISEhISUhUCxEUyEqITAhSiEhYy1gIS1YYy1RQyElISQyLWMqUUNDUUIhMC1jLVFDTgotYy1gIWVjLWJDUTMhISEkRS1jJ0NRcnJtITBtYy1DUUUtYyEhaWMtYVFDSiEkISEmISJKIzMiIWEqRVI0UEZRQwotS0JmOS1EQCkhTiIxWDZrOSEhQiZjRyg5TFYlcVAzISEjISEzIU4hMzFGaDROR2ZQWikmIjMzYmotREApIU4iJwotWTZQIkchQiYwOCVhJ1Y4ajNBMyEkISEtIU4hMzFGaDROR2ZQWkVAcE5HQGFQLFEtIU4iJ1lGYysrIUImODQ5SwotOFZBLWJMSiElISEzIU4hMzNHJzlpRyc5TkRBM0o4JiIkLE5hVEJKIzMka2UxOCklIko4ZTM2JURZNlAjIiEhOAotISFgIzMiIWFLRSdhW0JRVFBCaDRjLFFKIU4iMVojQyEhMTMnITklOUI5K2kqTiEhaiEhQiEhYCMzIiFLTUVmagotUURARlpEISMzJmtlYy1ORiJKJjQmQCY1WUZjKighIUchIWAjMyIhR2NHJzRURWJqUyEqIUJWNnFacCEjITklOQotQjkrZHJWWzMhIyUhJCEqISUiaFBmQkBhYyxRSiFOIkxZWHA0KiEpIjg0OUs4VkUyODUzISozIS0hTiEzKUZoNAotYkRAalIsUUohTiJIWTJrbGQhKSI4NDlLOFY2cVpwISErMyEtIU4hMyhDQSpiRVFtWkQhIzMnK2RyVlspIUomNAotJkAmNVkya2xiISFYISFgIzMiIVBZSEEiYkVoNFssUUohTiJEWUZjKUghQiI4NDlLOFZBLWIoSiEtISEtIU4hMwotKkZROVpCQGVQLUxqUyEqIUBWSlEzISROIkomNCZAJjVaI0MhITEzITAhIS0hTiEzKUVmKlVDQDBkLFFKIU4iSAotWiNDISExMychOSU5QjkraSpOISFqISFpISFgIzMiIVBbQlFUVEVBIlgsUUohTiJEWUZjKUghQiI4NDlLOFZBLQotYihKITIhIS0hTiEzMUJAME1DQTBjRWYqVUNAMGQsUUohTiInWUZjKUMhQiI4NDlLOFZBLWInMyEzISEtIU4hMwotLERAamRFZipVQ0AwZCxRSiFOIjVZRmMpRiFCIjg0OUs4VkEtYighITQhIS0hTiEzLUUncFpDZnBMRFE5TUcjagotUyEqITZWQS1iKDMnITklOUI5K2VjLUtkISVKISQhKiElJEBDWEVmJmRFZipVQ0AwZCxRSiFOIitZRmMpRSFCIgotODQ5SzhWQS1iJ2AhNiEhLSFOITMwRlEmWkNmOVtCUVRQQmgzWkQhIzMlVWVjLUttIkomNCZAJjVZRmMpSSEiMwotISFgIzMiIWpjRygqVEVRR1tCUVRQQmgzWkQhIzMlRGVjLUttIkomNCZAJjVZRmMpSSEiOCEhYCMzIiFlZEdBIgotWENAcExEUTlNRyNqUyEqITVWQS1iKSEnITklOUI5K2VjLUwhISZKISQhKiElJCdhVEZoNFtCUVRQQmgzWkQhIwotMyVrZWMtS2QiSiY0JkAmNVlGYylHISJGISFgIzMiIXBZQkEiYERAalJFZipVQ0AwZCxRSiFOIiNZRmMpRyFCIgotODQ5SzhWQS1iKDMhQiEhLSFOITMxRUA5ZEQncE5FZipVQ0AwZCxRSiFOIidZRmMpRyFCIjg0OUs4VkEtYigzIQotQyEhLSFOITMxRUBwTkdAYVBFZipVQ0AwZCxRSiFOIidZRmMpRyFCIjg0OUs4VkEtYigzIUQhIS0hTiEzLUNSOQotWkJmcExEUTlNRyNqUyEqITZWQS1iKCEnITklOUI5K2VjLUtgISdgISQhKiElJEAwWEJBMGNFZipVQ0AwZCxRSgotIU4iK1lGYylEIUIiODQ5SzhWQS1iJ0ohRiEhLSFOITMtQ1FQWENAcExEUTlNRyNqUyEqITZWSlEzISROIkomNAotJkAmNVojQyEhMTMhRyEhLSFOITMrRUFQWUJAYVhFZi1aRCEjMyZEZWMtS2kiSiY0JkAmNVlGYylIISJqISFgIwotMyIhS2NHJzRYREApWkQhIzMma2RyVlszIUomNCZAJjVZMmtsZCEibSEhYCMzIiFhWUVmNGNHQSJgRWgqZCxRSgotIU4iMVlGYylHIUIiODQ5SzhWQS1iKDMhSjMhLSFOITMpRmg0TkJBKlIsUUohTiJIWTJrcXAhKSI4NDlLOFY2cQotW1szIUszIS0hTiEzKkFoMGRDJyZiQ2JqUyEqIUBVWGAyZWAjITklOUI5K1YtJHBGISlKISQhKiElImYwUEdRJgotWCxRSiFOIkxZRmMpRCFCIjg0OUs4VkEtYidKIU0hIS0hTiEzK0JAKmNHKCpLQmgzWkQhIzMmRGVjLUtOIkomNAotJkAmNVlGYylDISMzISFgIzMiIVljSEEwWUVmNGVFJzhaRCEjMyYraSpOISFqIUIiODQ5SzhWSlEzISROISozIQotJCEqISUjQGVLQmZHWEdAOFpEISMzJlVpUDRHYCJKJjQmQCY1Wio4QUYhI0MhIjMjMyIhRzhIQSJQRmJqUyEqIQotQlZEZERVMyMhOSU5QjkrZlknVU4hKmQhJiEqISUlZDBbRVE0VEcnUFtFUSZYNkAmTUZRcGMsUUohTiFiWShyKgotISEpIjg0OUs4VjRyYjMhIVMzITghTiEzKDRRUFhDQS1aRCEjMycrYEtKLSEhSiY0JkAmNVgpQiQhISNQISIzIwotMyIhWTBEQUtQQyVlW0MnOFpEISMzJitlNkEtISFKJjQmQCY1WThlYyEhI1QhIjMjMyIhUDI4ZTlkREBhYyxRSgotIU4iRFlYcDhsISkiODQ5SzhWRTI5MWAhVjMhOCFOITMpNkA5WUVoKmosUUohTiJIWClCJCEhKSI4NDlLOFYjJwotIWAhIVgzITghTiEzKTRBQ1BFUjRjLFFKIU4iSFkociohISkiODQ5SzhWNHJiMyEhWTMhOCFOITMsOEE5VEJmWQotTkZRJmgsUUohTiI1WEJLVCEhKSI4NDlLOFYnKUQzISFaMyE4IU4hMzI4QTlUQmZZTkZRJmg5JzlpRyNqUyEqIQotM1YjJyFgISMhOSU5QjkrYEtKLSEhLGQhJiEqISUkUDBkQkBqTkJBKk40UVBYQzVqUyEqITRWIychYCEjITklOQotQjkrYEtKLSEhLSUhJiEqISUjODRUQkBhW0NoLVpEISMzJlVgS0otISFKJjQmQCY1WClCJCEhJCYhIjMjMyIhSwotJkZSKltGUi1aRCEjMyZrZEltTiEhSiY0JkAmNVkociohISQqISIzIzMiIUcwQ0BqZUZialMhKiFCViMnIWAhIwotITklOUI5K2BLSi0hIS1kISYhKiElI04wW0VSNGJFZmFjLFFKIU4iQFgpQiQhISkiODQ5SzhWIychYCEhZDMhOAotIU4hMyo5ZlBaQydwaEZialMhKiFAVicpRDMhIyE5JTlCOSthTCdOISEwOCEmISohJSNQNFBIKDQmQydQZCxRSgotIU4iQFgpQiQhISkiODQ5SzhWIychYCEhZiEhKSFOITM4MU1Ta0ZoNE5HZlBaMU5Ka0ZoNE5HZlBaLFFKIU4hbQotIkomNCZAJjMhTiE4aCEhMyFOITMoQWQmNTRlLVpEISMzJytjcjJyISJKJjQmQCY1WHJjcmAhJEohIiEjMyIhVAotY0cnNGhHJzlpRyNqUyEqITlWMm1ybTMnITklOUI5K2NyMnIlITEzISYhKiElI0EqZUVSNFRFQDhaQmAjMyZVYgotWyUoOCJKJjQmQCY1WFZhImUhJFMhIWAjMyIiQ1lHZjliRGgwSUYnYWVDZlBaQWYwW0VRQ1RDYmpTISohKlZBLQotYkRgJyE5JTlCOStlYy1RWCExYCEkISohJSRmMFtFQSJYQ0FLW0JRVFBCaDNaRCEjMyUraSpOISFqIUIiODQ5SwotOFZKUTMhJE4hMiEhJCEqISUjQDBbQlFUUEJoM1pEISMzJlVlYy1LUyJKJjQmQCY1WUZjKUQhJGQhIWAjMyIhVAotYEhAOWJGUXBiRmJqUyEqITlWQS1iKGAnITklOUI5K2VjLUttITJKISQhKiElI1AiakcnS1tFTjBbRlE4IU4iQAotWipSWXAhQiJjRCdhTFZMQ2xJMyFyISEtIU4hMypGKFBOQ0AqZUNialMhKiFAVkpRMyEkTiJKJjQmQCY1WiNDIQotITEzIiEhIS0hTiEzLEcoKktCZjlMQkAwVixRSiFOIjVZRmMpSiFCIjg0OUs4VkEtYikhIiIhIS0hTiEzLEYoUAotZEQncFpGUjlaLFFKIU4iNVojQyEhMTMnITklOUI5K2kqTiEhaiElKSEhYCMzIiFZVEVSNGJCZktQQmZYWkQhIwotMyYraUM2NEoiSiY0JkAmNVonOGRCISUtISFgIzMiIUtURUEiW0ZSM1pEISMzJmtpKk4hIWohQiI4NDlLOFZKUQotMyEkTiE0ISEkISohJSRAKlhHJ1BaRUBwTkdAYVAsUUohTiIrWiNDISExMychOSU5QjkraSpOISFqISEhJGIhIQotJyFNYCEhISFyISElIU4hSiMhKiEmJFIwZEMoR1RFUWVbQyg5WEM1ak0hKiFEIWAjMyJiSFkociohISElIS1rYAotS0otISEhMyFgViMnIWAhISIhIVVZMmtsYiEhJSEtRGRJbU4hISEzIVhWNHJiMyEhIiEjTFgpQiQhISElIStrYAotS0otISEhMyFiViMnIWAhISIhI1FZOGVjISEhJSErVWZjZTZYISEzIVlWJylEMyEhIiEja1gpQiQhISElISxrYAotS0otISEhMyFKVjZxW1szISIhIUhZMmtsZCEhJSEoVWRyVlszISEzISpWNnFacCEhIiEkQFgpQiQhISElISpVZgotWSdVTiEhMyFkVicpRDMhISIhIUxZWHA0KiEhJSEpRFYtJHBGISEzIWZWMm1ybTMhIiEjMVlGYylDISElISRrZQotYy1LTiEhMyEmVkpRMyEkTiEhMyIlVkpRMyEkTiEhMyFMVkEtYidKISIhIlpZRmMpRCEhJSEyK2VjLUtTISEzIQotbFZKUTMhJE4hITMhJ1ZBLWI0YCEiISJiWiNDISExMyEiISIrWUZjKUUhISUhJ1VlYy1LYCEhMyIkVkpRMyEkTgotISEzITNWQS1iKCEhIiElK1onOGRCISElISZVZWMtS2QhITMhNFZBLWIoMyEiISNAWio4QUYhISUhJmtlYy1LZAotISEzIUJWQS1iKDMhIiEicVlGYylHISElISdEZWMtS2QhITMha1ZBLWJEYCEiISJmWUZjKUghISUhI2tlYy1LaQotISEzITBWSlEzISROISEzITFWQS1iKEohIiEkcVojQyEhMTMhIiEkZllGYylJISElITNEaSpOISFqISElISVrZQotYy1LbSEhMyEtVkpRMyEkTiEhMyFpVjJtcm0zISIhIjVZRmMpSSEhJSEqK2kqTiEhaiEhJSEzK2VjLUwhISEzIQotOVZBLWIpISEiISRIWHJjcmAhISUhNEoiKSElUyE2ITJSISElISEzIzMjISkhTiE4M0cnOWlHJzlOREEzSjgmIgotJCxOYVRCSiMzJyEzIU4hRychJUohNUoiLSFxRiEhMyEiISohKSFKIzMiM2pjRyc0aERAaUo4JiIkLE5hVEJKIwotMydKKSFOIUcnISVKITVKIi0hcUYhITMhIyEqISkhSiUhTiEzKzgoUGREJ3BaM2ZwYkMzIzMoTWkhTiFHJyElSgotITVKIi0hcUYhITMhIyEqISkhSiUhTiEzLTVAamRDQSpRQkAwUDYnUEwhKiFGITMjMyJkaSE4ISI1ISYzISEhIQotIyEhKSFOIUojITMjMyIhUGJHQGpkREBlUCxRLSFOIm1qISohKDFVZWMtUVghITMjMyMhLEhWWiEhISElSCEhIQotMUAmIidFKC0hTiEzI2hVaWkhISEyR0ohISFtSzM2KDBkISohKyE0YCEhISEjOCYwUENycnIhKiEqKCEhISEzIgotMzhmOVIhISUhISIzbCEhISIhISEhKzYtISEjSmMhISEjWE40J0UnRiEhIU0xNCgqJ0ZKISEjMFQqRU5DWCEhIQotKWpOYSU0OEIhISFNYiRoMGRDKEdURVFlW0MoOVhDNWpZRzMpISEhIjA2OSI1M2VHKjQzISEhJDMhISVlMDgmKgotJDlkUCYhISEhMCEjISEqITVWVVUhK2AhISVpaSEhI1tQI0VqKjNkaU0hISkqYlFQTUUkSiEhIVJaREAwWDAhIQotISNJVCM2TjQtISEhKyJQMDgtJCUhISFTNTRQKiY0SiEhI0tqY0VRM0ohISErK1JOQiEqIStIQWNycmIhISNjWAotIU4hNGpJSXJyKSEhMWUhIzMiKFJQISdkISEiOC0hKiElSEglIVJgISEmcSkhTiE0amlgJEwhISFKQSEjMyJgKQotISJKISEhIVMhIiEjMyNjISEiSiUhcnJtIU4hTXJyYCczIjMjMyIiaSIhMyMzIypRQyEhIXJyY3JyMnJtIiEqIQotJTVKISIhIU4nRUBwWkJAMFshKiFGIiEhUyEhUyJgSishISNKISNKKCMhUyEhTiIhIiEqISUhSiMzIjQzISEzIgotQiEraSFjYCg0ISohJTVLLSEhImRmISEhISdKISQhISNDUTMjMyIocnIhKiElSXJtIU4hNHJyYCMzIiFTYCEhMwotISEhISUhIUIiIyEhIiE2VEZOMyRRNTEzISRRcSVCQTBWKSEhISEiYCFOIVFxYlVCIVtYWjghLGwsViEjMyJFbQotNUohIzMiRW01SiEhMyopISFOI00tTiFKIWpOJDMhMUMhQjBmMyMocnJJcm0hak4jJSEqISUzKUYhTiEzJkshIQotIVM1LHEhSiMzInFDIWQhISQxNikhTiItIiEsbCxCSiNxYmQpIVtgSSkhISJGTjMkUTUxMyEhISEkQkEwVikhIQotISEiYCFOIVFxYlVCIVtYWjghLGwsViEjMyJFbTVKISNyJkpgIVthJSE2OSIkM2AlKSEhJSMxTVU0ITFDKWohIQotMUVpNEtGZlhKISEhISghIzMjRWwrVEojcWJqMyFbWFpYISohJlthKyEhKiEmW2ErISEiIU5KISMzKy1iMyMhJAotUTMwISFqTiJKaEMhKUlycHJyYCRRMykzIU4hNCFLYCMzIiFAJSEhI0spW2kjISohKGpOJDMhIS1qLUojMyVgJQotIVtYWUwhLGwsM0ojciJtSiEhJmI0ITFDKWohISEhITBLRmZYSiEhISEoISMzI0VsK1RKI3FiajMhW1haWCEqIQotJlthKyEhLG1AJCEjciUzIjA4JTAkITNKISEzU2sxTVRjRyc0aERAaWtLJyZjRGIhISEhIUYhKiEqW1hVUSEsbAotLFAhI3Fia2AhTiFAciVTISFOIUByJVMhISUjNSEhKiFTYyohKSExQyFkISRRMyckR04hS3JyaHJyITFDIUshIwotMyIlIyghKiElIkIzISErJUxySikhTiFJUTMwISEhY05iISohNiEzI3FiZikhW1hZIyEsbShiISEhQSolIWpOTQotTiEhISEhZiZjRGIhISEhIUYhKiEqW1hVUSEsbCxQISNxYmtgIU4hQHIlUyEhW2FCLSEsbTQhJWUzM2QtIkIhIQotIzBjVDBCQDAyOGIiNkdBImBFaCpkMU5hVEJSKktGUVBQRmNUNUdAamREQGVQMVAqZUVSNFRFQDhKOCYiJDFMSwotNkVoOWJCZjljKzZWSGQlKSEhSjZyaEAiWCFFOUMrMyg2aFohISFQQGAhRTlVKSEnWTUzYCJkcGxgISEqOVghIQotM0diMyEwIkUhISVFJk4hISEhMyEiISElISEzISEhIS0iZHBtYCEqISVycFZKSyEhISEhJSJkcHEhISInZVYhJwotTUhQISJZOU5YIUcySTMhITRZRGAhJSk5OCFHMko4Sig2aGQhISFQQGBycDRhYCEhIVM1KSJkcHBgISEtYTUycgotRSFpSiFOITMiZHEjMyEhITgqYmAhJiNGSiFHMkpmSig2aGghISYkMUJycGUjMSdNcnBkISJkcHEhISInYkAhIQotM0JqISEhRTlDIyEkcnJybSElck1OIUdgImkhISInJFNrMU4wQTRlOTY1NSFhLE1CWjAkVFRFUTBYR0A0UDFNIQotISVyUTghJFFOIyEhITAsMyFOIVJycnJtImIyOGkhRk1kOCUpISFKNnJoQCJYIUUsRUwzKClwJyEhIVBAYCFFLAotW1MhJ0wsIUoiYjI0YCEhKjlYISE0WnEzITA1bSEhJTMjISEhIiEhJSEhMyEiISEhISFgKClwLCEhTiE2cmZaIwotJSEhISEhMygpcDMhISVbVG0hQ0wyWCEnYmZpYCJiMjYhISIsa0khITRiSzMiYjJBNSFGTWRgISEjOUUkcmUoKAotISEhI0spSigpcDIhISFjJilycFgkTCEjMyIhKClwSyEhJXBSbSEiMkNtISgpcFBTImIyNmAhIjJRRDJyRzNNSwotU3JyRyEhRk1lISEhNXBiSiElREszIUUsRUQhJHJycm0hJjZGZCFHJSIhISEjKiRUMEJAMDI4YiI2R0EiYEVoKgotZDFOS1BCQDRQRlItazM4ajY1NSIpQ0AmTkNBKmMxSiMzKVpDJSUhIzMiYCUhJEFUQiohISkiISRRM2ohISEiIQotTiUhJFE0OGAhTiJOMyksYCFOIUFRNEIhIU4hODBIVTMhW1pKSjMqaGE4ISEzKiIhIU4hQVE0QkIhTiE4MyopIQotISErIUYhKiE5ak41MyEhIzMjM2VrQCM1ISMhMyFqTjMzISIhTiUhIzMoSiUhISEpTjFOZUtCZHA2KSYwZUYoIgotW0ZSM2s1JzlLQyc5YkZjVDM4JS1KOGgiUEJmUFFEQC1rISohTGpOMzMhKiEoITMhMEhQSk4hIUolITFDJE4hIQotISUjMzMhMUMmNiEjMyc0IUpbISMzIkhDJkohIzMiM2VrVCEjcWsjIiFSSSYzISIhTiUhIzMiSEMmS0ojMyI0IQotTkohISFTImAhTiJBUTQqISEhKiEqJEFUQiopISkiISRRNCIhISUjMzMhKiFIITMhISFMTms2QCZNNmUtSjhoOQotYEYncGJHJFQpQ0AmTkNBKmMxUDlaREFDUEZSMEtFIyIpQ0AmTkNBKmMxSiMzKEhDJSUhIzMiYCUhJEFUQiohIQotKSIhJFEzaiEhISIhTiUhJFE0OGAhTiJOMyksYCFOIUFRNEIhIU4hODBIVTMhW1pKSjMqaGE4ISEzKiIhIU4hQQotUTRCQiFOITgzKikhISErIUYhKiE5ak41MyEhIzMjM2VrQCM1ISMhMyFqTjMzISIhTiUhIzMoSiUhISEpUTFOZQotS0JkcDYpJjBlRigiW0ZSM2s2J1BMRlEmYkRAOWMxTmVLQmRwNiklMFtFQGVbRU1TIU4jJFE0IiEhTiFGIiEhZQota0AjMyEjITMhak4xMyEhITMqIiEhak45LSEqIUMlIyNtISohJmpOQCEhKiEmJEFVTiEsbFMpJSNHbTkhISUjMwotMyEqISZqTkAnISohJiUjNSEhISNKKCEjMyZIQyVOISEhTiFOMEhQSk5KIUolITFDJSUhITMqIiEhTiJpIiEhIQotIyk2VDBCQDAyOGIiNkdBImBFaCpkMU5hVEJSKktGUVBQRmNUNUdAamREQGVQMUojMyohJSJiQyEhITNJcVghIQotISEhJSEkZSFpKiEhKSIhJSJiNCEhJUokSiEzKCtjISMzJzQocE0hIzMiISUiYmAhIiJya2AhIXAzSyEkREVAIQotISIqTG0hIikhaSEjMyIhJSJiYEIhTiE4NSE5ISEhKyFGISohOCEzKCslISMzIzNwMzEjNSEjITMiIUZRMyEhIQotNSExISFOIyE4UCEhJyUlZUtCZHA2KSYiMzNiIi1EQGpWQ0EpIU4iISUlJWVLQmRwNikmIjMzYiItREBqVkNBKQotIU4kIUQzOSIzNiEjMzMnISEhISIiRigiWCEqIiFCISEhISVlMDYlKSFOIyExNidQTCklUFlGJ3BiRyMiMzglLQotIU4iOTA4JWEnISohSiROYVRCTCIqRUEiW0ZSM0o4JiIkISohOTY5RyQ0ISMzMychISEhIjU4ZSokISoiIUIhIQotISEmNCZAJjMkLFEqU0JtVVY4ISEkLS1KISYraDMhISEiSUooK1VlISEmJ0EhISEhI2VKYSNCQGFYRWZwWiklSwotUEUoISFOIThHIiEoK1VpISEmJ0EhIUJIQGUhIzMiJjQmQCYzIyxRLSFOImQtNjlGSjNicCQrYlhKOCYiJCEqIQotQTklOUI5ITNaQmJYViEqIUUkJWVBKSUtWzNiWFYpJiIzM2AjMyZlNCZAJjMkLFEwTSEqIUYkJWVBKSUtWzNiWAotVikmIjMzYCMzJmU0JkAmMyQsUTBgISohRiQlZUEpJS1bM2JYVikmIjMzYCMzJmU0JkAmMyUsUTBgRiEjMydgYQotMDliIiQsZC1WK2IiMzglLSFOIkc4NDlLOCIjalBIKCEhTiRwODQ5SzghTGpTISohRyQlZUEpJS1bM2JYVikmIgotMzNgIzMlYSEhISEiODQ5SzghTGpgISohRyQ4ZUEpJiJLRmYwS0UjIjM4JS0hTiJDODQ5SzgiI2pgQkEtIU4iWAotMDY5Rko4JyZjQmYmWCkmIjMzYCMzJlA0JkAmMyUsUiJNRCEjMydgYTA5YiIkLGQtVitiIjM4JS0hTiIxISEhIQotITklOUI5IUJaRicwUytiWCFOIk4tNjlGSjNicCQrYlhKOCYiJCEqITZKISEhISY0JkAmMyMsUikhTiJkJzY5RgotSjhROWshKiFHOSU5QjkhKVpGZktNYlVZMyEhLWBiISE4VkchISEhJnEhRlVWOCEhOENGISEhISxAIlAiMzNkJgotY0VAaUo1JzlYISohJygzMyJiVVohISI0UGAhJyhQWTMhTiE0QjNkcCchKiFKJSZLJDZkQycpJVBZRidwYkcjIgotMzglLSFOIjBORWYwZSEqIiFCISEhISgqY0ZRLSFOJSJKISEhIUZmS1hCSiMzKSFqMzQ4Qko1QGVgRWgqZCkmIgotMzNgIzMmQTBkR0ApIU4jITE4JTknKSVQWUYncGJHIyIzOCUtIU4iTiUsUTRbQmAjMzFlISEhISEzNkAmTTZlLQotSjBNSywpJWFURVFZUEZKIzMtIlQiOCYiLSEqIiFCISEhISUmYEYnYCFOJSJKISEhITY4ZS0zSiMzKSFqLURAKQotSjVAZWBFaCpkKSRCaTVgIzMmOGUzNiVCIU4jITE2J1BMKSVQWUYncGJHIyFmMSVYIU4iOTA5ZDAlISoiIUIhIQotISElcCM1TCEhTiMhMTY5IkEpJVBZRidwYkcjIWYxJVghTiI5NThlKiQhKiIhQiEhISEmNCZAJjMkLFEqU0JtVQotVjghISQtLUohJitoMyEhISJJSigrVWUhISYnQSEhISEjZUphI0JAYVhFZnBaKSVLUEUoISFOIThHIiEoK1VpIQotISYnQSEhQkhAZSEjMyImNCZAJjMjLFEtIU4iZC02OUZKM2JwJCtiWEowTUssISohQTklOUI5ITNaQmJYViEqIQotRSQlZUEpJS1bM2JYVikkQmk1YCMzJmU0JkAmMyQsUTBNISohRiQlZUEpJS1bM2JYVikkQmk1YCMzJmU0JkAmMwotJCxRMGAhKiFGJCVlQSklLVszYlhWKSRCaTVgIzMmZTQmQCYzJSxRMGBGISMzJ2BhMDliIiQsZC1WK2IhZjElWAotIU4iRzg0OUs4IiNqUEgoJCtVZSEhIWMkKSEiNVlkISEhIUFpImJVWTMhIjRQYCEhISFZQiFhYlRkSmpMVkohKAotK1ZOMyElajk4ISEhRyIhKCtVaSEhJidBISFCSEwyISMzIiY0JkAmMyMsUUohTiJkLTY5RkozYnAkK2JYSjBNSwotLCEqITYlISEhISY0JkAmMyMsUiEhTiJkMDY5Rko4JyZjQmYmWCkkQmk1YCMzJlA0JkAmMyUsUiJLRmAjMydgZQotMDliIjNCQTBNQkBgSjBNSywhKiFAOSU5QjkhM1pGJzBTISohRSQlZUEpJS1bM2JYVikkQmk1YCMzJWkhISEhIgotODQ5SzgiTGpgQmZKVitgIzMnM2EwOWIiJCxkLVYrYiFmMSVYIU4iMSEhISEhOSU5QjkhKVpGSiMzKDNDMDliIgotNUNBUyFOImU4NDlLOCIjamNDQEkrVWUhISFjJCkhIjVZZCEhISFBaSJiVVkzISI0UGAhISEhWUIhYWJUZEpqTAotVkohKCtWTjMhJWo5OCEhIUciISgrVWkhISYnQSEhQkhMMiEjMyInNFtCaDghTiUiSiEhISFGUjBiQmAjMzMnIQotISEhImNEJ2FMISohSiRQIiY0TCIqRUEiW0ZSM0owTUtWISohOUZoNGVCSiMzKSFqMzQ4Qko1QGVgRWgqZCkkQgotaURgIzMnMzNaQydwTSEqIWw4ISEhISIiQURAaWMtTCJpMSRCSjYnUFpEZjliISohYCM5NCZAJjMjLFEtIU4iZAotLTY5RkozYnAkK2JYSkgkSmYhKiFBOSU5QjkhM1pCYlhWISohRSQlZUEpJS1bM2JYVikoSmkwSiMzJmU0JkAmMwotJCxRMGAhKiFGJCVlQSklLVszYlhWKShKaTBKIzMmZTQmQCYzJSxRMGBGISMzJ2BhMDliIiQsZC1WK2IiaTEkQgotIU4iRzg0OUs4IiNqYEJmSiFOIlgtNjlGSjNicCQrYlhKSCRKZiEqITZKISEhISY0JkAmMycsUiJNRCNYViEqIQotQyQlZUEpJS1bM2JYVikoSmkwSiMzJWkhISEhIjg0OUs4IWJqYkJgIzMoIUswOWIiQURAajUzYCMzKGAzWkUnUAotTCEqIUUkTmFUQkwiKkVBIltGUjNKSCRKZiEqIUMiI2pbQlFTIU4iWDE2ZipVKSVQWUYncGJHIyJpMSRCIU4iOAotKjY4LUo2J1BaRGY5YiEqIWgjJWUwM2RKIU4lNDg0OUs4IUxqTSEqIUcjJWUkKSUtWzNiWFYhKiFFOSU5QjkhMwotWkJmYWMhKiFFJThlJCklMFhCQTBjKSUwW0VBIlRFJzliISohMUohISEhJjQmQCYzJSxRNFBDSiMzMmU0JkAmMwotJSxRNFtCYCMzMWEhISEhIjg0OUs4IUxqUyEqIXAlISEhISY0JkAmMyUsUiJNRCEjMydgSzAzYiIkLGQtVitgIwotMyZpISEhISI4NDlLOCFiamRGYCMzM2BCISEzJSFOIUI4ISEzIiEqISghMyMzJCFTISEzJSEhISUiISElIU4hMwotMSEhRiIhISUiISElIiEhISEhMyMzIi1CISJgIzMzTXEzIiUmMzglYCEhISchQCkhIU4lKXJOITMhTiFQOSFDIQotISEzKSNIYCMzIjMpISEhITghKiElIUIhIU4iJWkhIU4hTiFGQEVBR1BGUVljQWgiWEdAR1RFUHBNRWZqUURARgotWkQhIzMkISUhTiFpLSEhLSFOIWAiZkohJSEqITMhMyMzcmAjMzQmcElGaDRLRlIzIU4oYCIhISEhMEohLSEqIQotKCEzIzMqMyUhTiE4IiEhISEkMyEjISohMSYhISQhISEiITMhISEzJSQhMyMzI2BTISEzJSIhISEiITMhIiEhIQotIWEhISdgSiMzM0BQWkRBNGNHJzRoREBpIU4oSiImISEmISElISEkLCkhISFiYiEhIS1YSiFOITMnRmg0TkdmUAotWiEqJG1aSiElISElM0ZoNE5HZlBaRUBwTkdAYVAsUjBYQkojMyRlImpHJ0tjRCdhTCEqImEhNnEzIiEjMyJlRgotIVZKJFUhRyUiISEhISNlQiEhJmI0ISEhISxKISMhISEhIUohIyEqIVMhSmAhIUoiMyEhJSEhMyEiISElIU4ybQotISYjRyQ2ZDQmKmIhUjQlJjgzNUZKKmUiKjNlM1IhKiRaI0ohJSEqISshMyEhISNOYyEhIVMtYCEhIVYpI2hVYwotOCprUyEhISFGIUFTISFSImJDQEIhJyEhREYmQ1BGSiEhIThDNjkmKU0hISEiOEo1YCEiISEhISEnISohJTNMaQotISgzISEhIjMhTiEzYSVKIU4hISEhNSEjMyInU0MhI04hISEjRiEqISU5bEohMSEhISEsMyFOITNKSUoiKSEhIQotIWRKIzMiKCVAISY4ISEhWCchKiElRWpKIUEhISEoamkhTiEzKzFKIlQhISFJVSEjMyIoNCMhKDghISJyISEqIQotJUNbQiFLSiEhKG1pIU4hM2xrSiM0ISEhSWkhIzMiKGMnISpkISEjI1UhKiElNVAhIVYhISEpMUIhTiEzNiNgIwotbCEhIUpwSiMzIicrUyEtKSEhIyw4ISohJSRxZCFkSiEhKWBpIU4hNC1QISRMISEhTShgIzMiImNhITFpISEjLQotaCEqISUpUzMhcmAhISlkOCFOITMwWEolKyEhIU4kMyMzIiM4IyE0KSEhIzhQISohJTgmISIoSiEhKkgtIU4hMwotbWZgJVYhISFRJjMjMyJGTXJyYCEhKyM4IU4iIUVKMnJyISEhIVBKIzMiIXAzRlFwVUNAMGQpJkNQRlIwVEVmaQotLTgoKltEUTlNRyMiMERBME0iTjlOREE0W0ZKNCdFZmpkJFAiYkVmVFBCaDNKNEFLZEZRJmMkZDBlRmg0W0U1IgotLENBUGhFaCpORmBhIkJmMFBGaC1KOCcmZEQoLSc5JyZiQ2Y5ZCQlKmVEQGFOKSU5aUcoKktGYFhmMSVYSjNmcAotTkM4R1BFSyFmMSVYSjQnUGNCQTBjQ0BlTEUnOWIjTUJpNWIiLURAalZDQSksME1LLCkmImJFZlRQQmgzMTNicAotJCtiWEozZnBZRidQWENBKTEzYnAkK2JYSjlmJmJFUVBaQ2gtJzNkQzAwTUssJGUiS0ZmMEtFIyIkRWZlYERAYQotUEZKcDNCQTBNQkBgSjlmJmJFUVBaQ2gtLDgmIiQpJTBbQyc5KENAaTM4JiIkKSU0VEZmJmNGZjlZQlFhUEZKVAotMzglLUo2J1BaRGY5YiJlIjMzYiIzNDhCLDgmIiQpJiJiRWZUUEJoMy04JiIkM0EwWSkmIktFUTlYJCYqUEhMIgotJEVmZWBEQGFQRlZBKDoKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC90d2l0L1R3aXRDb3JlLnB5IGIvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvVHdpdENvcmUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDhjMGUuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvVHdpdENvcmUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotIyBXaW5kb3ctaW50ZXJmYWNlLWluZGVwZW5kZW50IHBhcnQgb2YgdHdpdAotaW1wb3J0IHN5cwotaW1wb3J0IHR5cGVzCi1pbXBvcnQgYmRiCi1pbXBvcnQgdHlwZXMKLWltcG9ydCBvcwotCi1TSU1QTEVfVFlQRVM9KAotCXR5cGVzLk5vbmVUeXBlLAotCXR5cGVzLkludFR5cGUsCi0JdHlwZXMuTG9uZ1R5cGUsCi0JdHlwZXMuRmxvYXRUeXBlLAotCXR5cGVzLkNvbXBsZXhUeXBlLAotCXR5cGVzLlN0cmluZ1R5cGUKLSkKLQotIyBYWFhYIE1hYy1zcGVjaWZpYwotSUNPTl9OT1JNQUw9NTAwCi1JQ09OX1JFVFVSTj01MDMKLUlDT05fQ0FMTD01MDQKLUlDT05fWkVSTz01MDUKLUlDT05fREVBRD01MDYKLQotY2xhc3MgRGVidWdnZXJTdHVmZihiZGIuQmRiKToKLQotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgotCQliZGIuQmRiLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYucGFyZW50ID0gcGFyZW50Ci0JCXNlbGYuZXhjZXB0aW9uX2luZm8gPSAoTm9uZSwgTm9uZSkKLQkJc2VsZi5yZWFzb24gPSAnTm90IHJ1bm5pbmcnCi0JCXNlbGYuaWNvbiA9IElDT05fTk9STUFMCi0JCXNlbGYucmVzZXQoKQotCQkKLQlkZWYgcmVzZXQoc2VsZik6Ci0JCWJkYi5CZGIucmVzZXQoc2VsZikKLQkJc2VsZi5mb3JnZXQoKQotCQotCWRlZiBmb3JnZXQoc2VsZik6Ci0JCXNlbGYubGluZW5vID0gTm9uZQotCQlzZWxmLnN0YWNrID0gW10KLQkJc2VsZi5jdXJpbmRleCA9IDAKLQkJc2VsZi5jdXJmcmFtZSA9IE5vbmUKLQkJCi0JZGVmIHJ1bihzZWxmLCBjbWQsIGxvY2FscywgZ2xvYmFscyk6Ci0JCXNlbGYucmVhc29uID0gJ1J1bm5pbmcnCi0JCWJkYi5CZGIucnVuKHNlbGYsIGNtZCwgbG9jYWxzLCBnbG9iYWxzKQotCQlwcmludCAnUkVUVVJOIGZyb20gcnVuJwotCQlzZWxmLnJlYXNvbiA9ICdOb3QgcnVubmluZycKLQkKLQlkZWYgc2V0dXAoc2VsZiwgZiwgdCk6Ci0JCXNlbGYuZm9yZ2V0KCkKLQkJc2VsZi5zdGFjaywgc2VsZi5jdXJpbmRleCA9IHNlbGYuZ2V0X3N0YWNrKGYsIHQpCi0JCXNlbGYuY3VyZnJhbWUgPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdCi0JCQotCWRlZiBpbnRlcmFjdGlvbihzZWxmLCBmcmFtZSwgdHJhY2ViYWNrKToKLQkJc2VsZi5zZXR1cChmcmFtZSwgdHJhY2ViYWNrKQotCQlzZWxmLnBhcmVudC5pbnRlcmFjdCgpCi0JCXNlbGYuZXhjZXB0aW9uX2luZm8gPSAoTm9uZSwgTm9uZSkKLQotIwlkZWYgdXNlcl9jYWxsKHNlbGYsIGZyYW1lLCBhcmd1bWVudF9saXN0KToKLSMJCXNlbGYucmVhc29uID0gJ0NhbGxpbmcnCi0jCQlzZWxmLmljb24gPSBJQ09OX0NBTEwKLSMJCXNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCi0JCQkKLQlkZWYgdXNlcl9saW5lKHNlbGYsIGZyYW1lKToKLQkJc2VsZi5yZWFzb24gPSAnU3RvcHBlZCcKLQkJc2VsZi5pY29uID0gSUNPTl9OT1JNQUwKLQkJc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKLQkJCi0JZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgotCQlzZWxmLnJlYXNvbiA9ICdSZXR1cm5pbmcnCi0JCXNlbGYuaWNvbiA9IElDT05fUkVUVVJOCi0JCXNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCi0JCQkJCi0JZGVmIHVzZXJfZXhjZXB0aW9uKHNlbGYsIGZyYW1lLCAoZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaykpOgotCQlzZWxmLnJlYXNvbiA9ICdFeGNlcHRpb24gb2NjdXJyZWQnCi0JCXNlbGYuaWNvbiA9IElDT05fREVBRAotCQlzZWxmLnBhcmVudC5zZXRzdGF0ZSgndGInKQotCQlzZWxmLmV4Y2VwdGlvbl9pbmZvID0gKGV4Y190eXBlLCBleGNfdmFsdWUpCi0JCXNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIGV4Y190cmFjZWJhY2spCi0KLQlkZWYgZ2V0ZXhjZXB0aW9uKHNlbGYpOgotCQl0cCwgdmFsdWUgPSBzZWxmLmV4Y2VwdGlvbl9pbmZvCi0JCWlmIHRwIDw+IE5vbmUgYW5kIHR5cGUodHApIDw+IHR5cGUoJycpOgotCQkJdHAgPSB0cC5fX25hbWVfXwotCQlpZiB2YWx1ZSA8PiBOb25lIGFuZCB0eXBlKHZhbHVlKSA8PiB0eXBlKCcnKToKLQkJCXZhbHVlID0gYHZhbHVlYAotCQlyZXR1cm4gdHAsIHZhbHVlCi0JCQotCWRlZiBnZXRzdGFja3RyYWNlKHNlbGYpOgotCQluYW1lcywgbG9jYXRpb25zID0gW10sIFtdCi0JCWZvciBmcmFtZSwgbGluZW5vIGluIHNlbGYuc3RhY2s6Ci0JCQluYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKLQkJCWlmIG5vdCBuYW1lOgotCQkJCW5hbWUgPSAiPGxhbWJkYT4iCi0JCQllbGlmIG5hbWUgPT0gJz8nOiAKLQkJCQluYW1lID0gIjxub3QgYSBmdW5jdGlvbj4iCi0JCQllbHNlOgotCQkJCW5hbWUgPSBuYW1lICsgJygpJwotCQkJbmFtZXMuYXBwZW5kKG5hbWUpCi0JCQkKLQkJCWlmIGxpbmVubyA9PSAtMToKLQkJCQlsaW5lbm8gPSBnZXRmcmFtZWxpbmVubyhmcmFtZSkKLQkJCQkKLQkJCW1vZG5hbWUgPSBnZXRmcmFtZW1vZG5hbWUoZnJhbWUpCi0JCQlpZiBub3QgbW9kbmFtZTogbW9kbmFtZSA9ICI8dW5rbm93bj4iCQotCi0JCQlsb2NhdGlvbnMuYXBwZW5kKCIlczolZCIgJSAobW9kbmFtZSwgbGluZW5vKSkKLQkJcmV0dXJuIG5hbWVzLCBsb2NhdGlvbnMKLQkJCi0JZGVmIGdldGZyYW1lKHNlbGYsIG51bWJlcik6Ci0JCWlmIG51bWJlciA8IDAgb3IgbnVtYmVyID49IGxlbihzZWxmLnN0YWNrKToKLQkJCXJldHVybiBOb25lCi0JCXJldHVybiBzZWxmLnN0YWNrW251bWJlcl1bMF0KLQotCWRlZiBnZXRmcmFtZXZhcnMoc2VsZiwgbnVtYmVyLCBzaG93X2NvbXBsZXg9MSwgc2hvd19zeXN0ZW09MSk6Ci0JCWZyYW1lID0gc2VsZi5nZXRmcmFtZShudW1iZXIpCi0JCWlmIG5vdCBmcmFtZToKLQkJCXJldHVybiBbXSwgW10KLQkJcmV0dXJuIGdldHZhcnNmcm9tZGljdChmcmFtZS5mX2xvY2Fscywgc2hvd19jb21wbGV4LCBzaG93X3N5c3RlbSkKLQkJCi0JZGVmIGdldGZyYW1ldmFyKHNlbGYsIG51bWJlciwgdmFyKToKLQkJZnJhbWUgPSBzZWxmLmdldGZyYW1lKG51bWJlcikKLQkJcmV0dXJuIGZyYW1lLmZfbG9jYWxzW3Zhcl0KLQotCWRlZiBnZXRmcmFtZWZpbGVwb3Moc2VsZiwgZnJhbWVubyk6Ci0JCWlmIGZyYW1lbm8gPT0gTm9uZSBvciBmcmFtZW5vIDwgMCBvciBmcmFtZW5vID49IGxlbihzZWxmLnN0YWNrKToKLQkJCXJldHVybiBOb25lLCBOb25lLCBOb25lCi0JCWZyYW1lLCBsaW5lID0gc2VsZi5zdGFja1tmcmFtZW5vXQotCQlpZiBsaW5lID09IC0xOgotCQkJbGluZSA9IGdldGZyYW1lbGluZW5vKGZyYW1lKQotCQltb2RuYW1lID0gZ2V0ZnJhbWVtb2RuYW1lKGZyYW1lKQotCQlmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQotCQlyZXR1cm4gZmlsZW5hbWUsIG1vZG5hbWUsIGxpbmUKLQotCWRlZiBnZXRwcm9ncmFtc3RhdGUoc2VsZik6Ci0JCXJldHVybiBzZWxmLnJlYXNvbgotCQotY2xhc3MgQXBwbGljYXRpb246Ci0JIiIiQmFzZSBjb2RlIGZvciB0aGUgYXBwbGljYXRpb24iIiIKLQkKLQlkZWYgbWlfaW5pdChzZWxmLCBzZXNzaW9udHlwZSwgYXJnKToKLQkJc2VsZi5kYmcgPSBEZWJ1Z2dlclN0dWZmKHNlbGYpCi0JCXNlbGYucnVuX2RpYWxvZyA9IHNlbGYubmV3X3N0YWNrX2Jyb3dzZXIoc2VsZikKLQkJc2VsZi5ydW5fZGlhbG9nLm9wZW4oKQotCQlzZWxmLm1vZHVsZV9kaWFsb2cgPSBOb25lCi0JCXNlbGYuaW5pdGlhbF9jbWQgPSBOb25lCi0JCXNlbGYuY3VyX3N0cmluZ19uYW1lID0gTm9uZQotCQlpZiBzZXNzaW9udHlwZSA9PSAndGInOgotCQkJd2hpbGUgYXJnLnRiX25leHQgPD4gTm9uZToKLQkJCQlhcmcgPSBhcmcudGJfbmV4dAotCQkJc2VsZi5kYmcuc2V0dXAoYXJnLnRiX2ZyYW1lLCBhcmcpCi0JCQlzZWxmLnJ1bl9kaWFsb2cuc2V0dXAoKQotCQllbGlmIHNlc3Npb250eXBlID09ICdydW4nOgotCQkJc2VsZi5pbml0aWFsX2NtZCA9IGFyZwotCQkJCi0JZGVmIGJyZWFrc19jaGFuZ2VkKHNlbGYsIGZpbGVuYW1lKToKLQkJc2VsZi5ydW5fZGlhbG9nLmJyZWFrc19jaGFuZ2VkKGZpbGVuYW1lKQotCQlpZiBzZWxmLm1vZHVsZV9kaWFsb2c6Ci0JCQlzZWxmLm1vZHVsZV9kaWFsb2cuYnJlYWtzX2NoYW5nZWQoZmlsZW5hbWUpCi0JCi0JZGVmIHRvX2RlYnVnZ2VyKHNlbGYpOgotCQljbWQgPSBzZWxmLmluaXRpYWxfY21kCi0JCXNlbGYuaW5pdGlhbF9jbWQgPSBOb25lCi0JCXNlbGYuc2V0c3RhdGUoJ3J1bicpCi0JCXNlbGYuc3dpdGNoX3RvX2FwcCgpCi0JCWFwcGx5KHNlbGYuZGJnLnJ1biwgY21kKQotCQlzZWxmLnNldHN0YXRlKCdub25lJykKLQkJc2VsZi5zd2l0Y2hfdG9fZGJnKCkKLQkJc2VsZi5ydW5fZGlhbG9nLnVwZGF0ZV92aWV3cygpCi0JCWlmIHNlbGYubW9kdWxlX2RpYWxvZzoKLQkJCXNlbGYubW9kdWxlX2RpYWxvZy51cGRhdGVfdmlld3MoKQotCQkKLQlkZWYgaW50ZXJhY3Qoc2VsZik6Ci0JCSMgSW50ZXJhY3Qgd2l0aCB1c2VyLiBGaXJzdCwgZGlzcGxheSBjb3JyZWN0IGluZm8KLQkJc2VsZi5zd2l0Y2hfdG9fZGJnKCkKLQkJc2VsZi5ydW5fZGlhbG9nLnVwZGF0ZV92aWV3cygpCi0JCWlmIHNlbGYubW9kdWxlX2RpYWxvZzoKLQkJCXNlbGYubW9kdWxlX2RpYWxvZy51cGRhdGVfdmlld3MoKQotCQkKLQkJIyBOZXh0LCBnbyBpbnRvIG1haW5sb29wCi0JCXNlbGYub25lX21haW5sb29wKCkKLQkJCi0JCSMgRmluYWxseSAoYmVmb3JlIHdlIHN0YXJ0IHRoZSBkZWJ1Z2dlZSBhZ2Fpbikgc2hvdyBzdGF0ZQotCQlzZWxmLnN3aXRjaF90b19hcHAoKQotCQlzZWxmLnJ1bl9kaWFsb2cuc2hvd19pdF9ydW5uaW5nKCkKLQkJCi0JZGVmIHF1aXRfYmRiKHNlbGYpOgotCQlzZWxmLmRiZy5zZXRfcXVpdCgpCi0JCQotCWRlZiBydW4oc2VsZik6Ci0JCWNtZCA9IHNlbGYuQXNrU3RyaW5nKCdTdGF0ZW1lbnQgdG8gZXhlY3V0ZTonKQotCQlzZWxmLnJ1bnN0cmluZyhjbWQpCi0JCQotCWRlZiBydW5maWxlKHNlbGYsIHBhdGgpOgotCQlkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0JCXRyeToKLQkJCW9zLmNoZGlyKGRpcikKLQkJZXhjZXB0IG9zLmVycm9yLCBhcmc6Ci0JCQlzZWxmLk1lc3NhZ2UoIiVzOiAlcyIlKGRpciwgYXJnKSkKLQkJCXJldHVybgotCQlucyA9IHsnX19uYW1lX18nOidfX21haW5fXycsICdfX2ZpbGVfXyc6cGF0aH0KLQkJY21kID0gImV4ZWNmaWxlKCclcycpIiVmaWxlCi0JCXNlbGYucnVuc3RyaW5nKGNtZCwgbnMsIG5zKQotCQkKLQlkZWYgcnVuc3RyaW5nKHNlbGYsIGNtZCwgZ2xvYmFscz17fSwgbG9jYWxzPXt9KToKLQkJc2VsZi5jdXJfc3RyaW5nX25hbWUgPSAnPHN0cmluZzogIiVzIj4nJWNtZAotCQl0cnk6Ci0JCQljbWQgPSBjb21waWxlKGNtZCwgc2VsZi5jdXJfc3RyaW5nX25hbWUsICdleGVjJykKLQkJZXhjZXB0IFN5bnRheEVycm9yLCBhcmc6Ci0JCQlzZWxmLk1lc3NhZ2UoJ1N5bnRheCBlcnJvcjogJXMnJWBhcmdgKQotCQkJcmV0dXJuCi0JCXNlbGYuaW5pdGlhbF9jbWQgPSAoY21kLCBnbG9iYWxzLCBsb2NhbHMpCi0JCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0KLQlkZWYgY29udChzZWxmKToKLQkJc2VsZi5kYmcuc2V0X2NvbnRpbnVlKCkKLQkJc2VsZi5leGl0X21haW5sb29wKCkKLQkJCQkKLQlkZWYgc3RlcChzZWxmLCBmcmFtZSk6Ci0JCXNlbGYuZGJnLnNldF9uZXh0KGZyYW1lKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkKLQlkZWYgc3RlcF9pbihzZWxmKToKLQkJc2VsZi5kYmcuc2V0X3N0ZXAoKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkKLQlkZWYgc3RlcF9vdXQoc2VsZiwgZnJhbWUpOgotCQlzZWxmLmRiZy5zZXRfcmV0dXJuKGZyYW1lKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkKLQlkZWYga2lsbChzZWxmKToKLQkJc2VsZi5kYmcuc2V0X3F1aXQoKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkKLQlkZWYgcXVpdChzZWxmKToKLQkJc2VsZi5kb19xdWl0KCkKLQkJCi0JZGVmIGJyb3dzZShzZWxmLCBtb2R1bGUpOgotCQlpZiBub3Qgc2VsZi5tb2R1bGVfZGlhbG9nOgotCQkJc2VsZi5tb2R1bGVfZGlhbG9nID0gc2VsZi5uZXdfbW9kdWxlX2Jyb3dzZXIoc2VsZikKLQkJCXNlbGYubW9kdWxlX2RpYWxvZy5vcGVuKG1vZHVsZSkKLQkJZWxzZToKLQkJCXNlbGYubW9kdWxlX2RpYWxvZy5mb2N1cyhtb2R1bGUpCi0JCi0JZGVmIGJyb3dzZV92YXIoc2VsZiwgdmFyKToKLQkJYiA9IHNlbGYubmV3X3Zhcl9icm93c2VyKHNlbGYsIHZhcikKLQkJCi1jbGFzcyBTdGFja0Jyb3dzZXI6Ci0JIiIiQmFzZSBjb2RlIGZvciBzdGFjayBicm93c2VyIiIiCi0JZGVmIG1pX29wZW4oc2VsZik6Ci0JCSIiIlNldHVwIGluaXRpYWwgZGF0YSBzdHJ1Y3R1cmVzIiIiCi0JCXNlbGYuY3VyX3N0YWNraXRlbSA9IE5vbmUKLQkJc2VsZi5jdXJfc291cmNlID0gTm9uZQotCQlzZWxmLmN1cl9tb2RuYW1lID0gTm9uZQotCQlzZWxmLmN1cl9saW5lID0gTm9uZQotCQlzZWxmLnNob3dfY29tcGxleCA9IDEKLQkJc2VsZi5zaG93X3N5c3RlbSA9IDAKLQkJc2VsZi5zZXR1cCgpCi0KLQkjIGNyZWF0ZV9pdGVtcyhzZWxmKSBzaG91bGQgY3JlYXRlIHNlbGYubW9kdWxlcywgc2VsZi52YXJzIGFuZCBzZWxmLnNvdXJjZQotCQotCWRlZiBzZXR1cChzZWxmKToKLQkJc2VsZi5wYXJlbnQuU2V0V2F0Y2goKQotCQkiIiJGaWxsIHRoZSB2YXJpb3VzIHdpZGdldHMgd2l0aCB2YWx1ZXMiIiIKLQkJbmFtZSwgdmFsdWUgPSBzZWxmLnBhcmVudC5kYmcuZ2V0ZXhjZXB0aW9uKCkKLQkJc2VsZi5zZXRleGNlcHRpb24obmFtZSwgdmFsdWUpCi0JCXNlbGYuc2V0cHJvZ3JhbXN0YXRlKHNlbGYucGFyZW50LmRiZy5nZXRwcm9ncmFtc3RhdGUoKSkKLQkJCi0JCW5hbWVzLCBsb2NhdGlvbnMgPSBzZWxmLnBhcmVudC5kYmcuZ2V0c3RhY2t0cmFjZSgpCi0JCXNlbGYuc3RhY2tfc2V0Y29udGVudChuYW1lcywgbG9jYXRpb25zKQotCQlzZWxmLmN1cl9zdGFja2l0ZW0gPSBsZW4obmFtZXMpLTEKLQkJc2VsZi5zdGFja19zZWxlY3Qoc2VsZi5jdXJfc3RhY2tpdGVtKQotCQlzZWxmLnNldHVwX2ZyYW1lKCkKLQkJCi0JZGVmIHNldHVwX2ZyYW1lKHNlbGYpOgotCQkiIiJTZXR1cCBmcmFtZS1kZXBlbmRlbnQgd2lkZ2V0IGRhdGEiIiIKLQkJc2VsZi5wYXJlbnQuU2V0V2F0Y2goKQotCQlzZWxmLmNvbnRfdmFybmFtZXMsIHNlbGYuY29udF92YXJ2YWx1ZXMgPSBcCi0JCQlzZWxmLnBhcmVudC5kYmcuZ2V0ZnJhbWV2YXJzKHNlbGYuY3VyX3N0YWNraXRlbSwgCi0JCQlzZWxmLnNob3dfY29tcGxleCwgc2VsZi5zaG93X3N5c3RlbSkKLQkJc2VsZi5zZXR2YXJzKCkKLQkJc2VsZi5zZXRfdmFyX2J1dHRvbnMoKQotCQotCQltc2cgPSAiIgotCQlpZiBzZWxmLmN1cl9zdGFja2l0ZW0gPT0gTm9uZToKLQkJCXNlbGYuY3VyX3NvdXJjZSA9IE5vbmUKLQkJCXNlbGYuY3VyX21vZG5hbWUgPSBOb25lCi0JCQlzZWxmLmN1cl9saW5lID0gTm9uZQotCQkJbXNnID0gIk5vIHN0YWNrZnJhbWUgc2VsZWN0ZWQiCi0JCWVsc2U6Ci0JCQlzZWxmLmN1cl9zb3VyY2UsIHNlbGYuY3VyX21vZG5hbWUsIG9wdG5leHRsaW5lID0gXAotCQkJCXNlbGYucGFyZW50LmRiZy5nZXRmcmFtZWZpbGVwb3Moc2VsZi5jdXJfc3RhY2tpdGVtKQotCQkJaWYgb3B0bmV4dGxpbmUgPj0gMDoKLQkJCQlzZWxmLmN1cl9saW5lID0gb3B0bmV4dGxpbmUKLQkJCWlmIHNlbGYuY3VyX3NvdXJjZSA9PSAnPHN0cmluZz4nOgotCQkJCXNlbGYuY3VyX3NvdXJjZSA9IE5vbmUKLQkJCQltc2cgPSAiRXhlY3V0aW5nIGZyb20gdW5rbm93biA8c3RyaW5nPiIKLQkJCWVsaWYgdHlwZShzZWxmLmN1cl9zb3VyY2UpID09IHR5cGVzLlN0cmluZ1R5cGUgYW5kIFwKLQkJCQkJCXNlbGYuY3VyX3NvdXJjZVs6OF0gPT0gJzxzdHJpbmc6JzoKLQkJCQltc2cgPSAiRXhlY3V0aW5nIGZyb20gIitzZWxmLmN1cl9zb3VyY2UKLQkJCQlzZWxmLmN1cl9zb3VyY2UgPSBOb25lCi0JCQkJCi0JCXNlbGYuc2V0c291cmNlKG1zZykKLQkJaWYgbm90IHNlbGYuY3VyX2xpbmU6Ci0JCQlzZWxmLnNvdXJjZV9zZXRsaW5lKDEsIElDT05fWkVSTykKLQkJZWxzZToKLQkJCXNlbGYuc291cmNlX3NldGxpbmUoc2VsZi5jdXJfbGluZSwgc2VsZi5wYXJlbnQuZGJnLmljb24pCi0JCXNlbGYuYnJlYWtzX2NoYW5nZWQoc2VsZi5jdXJfc291cmNlKQotCQkKLQkJCi0JCXNlbGYucGFyZW50LlNldEN1cnNvcigpCi0JCQotCSMgc2V0c291cmNlKG1zZykgc2hvdWxkIGRpc3BsYXkgY3VyX3NvdXJjZStjb250ZW50LCBvciBtc2cgaWYgTm9uZQotCQotCWRlZiBzaG93X2l0X3J1bm5pbmcoc2VsZik6Ci0JCXNlbGYuc2V0cHJvZ3JhbXN0YXRlKCJSdW5uaW5nIikKLQotCWRlZiB1cGRhdGVfdmlld3Moc2VsZik6Ci0JCXNlbGYuc2V0dXAoKQotCi0JZGVmIGNsaWNrX3N0YWNrKHNlbGYsIG51bWJlciwgKmR1bW15KToKLQkJaWYgbnVtYmVyID09IHNlbGYuY3VyX3N0YWNraXRlbTogcmV0dXJuCi0JCXNlbGYuY3VyX3N0YWNraXRlbSA9IG51bWJlcgotCQlzZWxmLnN0YWNrX3NlbGVjdChzZWxmLmN1cl9zdGFja2l0ZW0pCi0JCXNlbGYuc2V0dXBfZnJhbWUoKQotCQkJCQotCWRlZiBjbGlja192YXIoc2VsZiwgdmFyLCAqZHVtbXkpOgotCQl2ID0gc2VsZi5wYXJlbnQuZGJnLmdldGZyYW1ldmFyKHNlbGYuY3VyX3N0YWNraXRlbSwgdmFyKQotCQlzZWxmLnBhcmVudC5icm93c2VfdmFyKHYpCi0JCQotCWRlZiBjbGlja19zb3VyY2Uoc2VsZiwgbGluZW5vLCBpbmJvcmRlcik6Ci0JCWlmIG5vdCBpbmJvcmRlcjoKLQkJCXNlbGYuc291cmNlX3NlbGVjdChsaW5lbm8pCi0JCQlzZWxmLmN1cl9saW5lID0gbGluZW5vCi0JCWlmIGxpbmVubyA9PSBOb25lIG9yIG5vdCBzZWxmLmN1cl9zb3VyY2Ugb3Igbm90IGluYm9yZGVyOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYucGFyZW50LmRiZy5nZXRfYnJlYWsoc2VsZi5jdXJfc291cmNlLCBsaW5lbm8pOgotCQkJc2VsZi5wYXJlbnQuZGJnLmNsZWFyX2JyZWFrKHNlbGYuY3VyX3NvdXJjZSwgbGluZW5vKQotCQllbHNlOgotCQkJc2VsZi5wYXJlbnQuZGJnLnNldF9icmVhayhzZWxmLmN1cl9zb3VyY2UsIGxpbmVubykKLQkJc2VsZi5wYXJlbnQuYnJlYWtzX2NoYW5nZWQoc2VsZi5jdXJfc291cmNlKQotCQkKLQlkZWYgYnJlYWtzX2NoYW5nZWQoc2VsZiwgZmlsZW5hbWUpOgotCQlpZiBmaWxlbmFtZSA9PSBzZWxmLmN1cl9zb3VyY2U6Ci0JCQlsaXN0ID0gc2VsZi5wYXJlbnQuZGJnLmdldF9maWxlX2JyZWFrcyhmaWxlbmFtZSkKLQkJCXNlbGYuc291cmNlX3NldGJyZWFrcyhsaXN0KQotCQkKLQlkZWYgY2xpY2tfcXVpdChzZWxmKToKLQkJc2VsZi5wYXJlbnQucXVpdCgpCi0JCQotCWRlZiBjbGlja19ydW4oc2VsZik6Ci0JCXNlbGYucGFyZW50LnJ1bigpCi0JCQotCWRlZiBjbGlja19jb250aW51ZShzZWxmKToKLQkJc2VsZi5wYXJlbnQuY29udCgpCi0JCQotCWRlZiBjbGlja19zdGVwKHNlbGYpOgotCQlpZiBzZWxmLmN1cl9zdGFja2l0ZW0gPD4gTm9uZToKLQkJCWZyYW1lID0gc2VsZi5wYXJlbnQuZGJnLmdldGZyYW1lKHNlbGYuY3VyX3N0YWNraXRlbSkKLQkJCXNlbGYucGFyZW50LnN0ZXAoZnJhbWUpCi0JCWVsc2U6Ci0JCQlzZWxmLnBhcmVudC5zdGVwX2luKCkKLQkJCi0JZGVmIGNsaWNrX3N0ZXBfaW4oc2VsZik6Ci0JCXNlbGYucGFyZW50LnN0ZXBfaW4oKQotCQkKLQlkZWYgY2xpY2tfc3RlcF9vdXQoc2VsZik6Ci0JCWlmIHNlbGYuY3VyX3N0YWNraXRlbSA8PiBOb25lOgotCQkJZnJhbWUgPSBzZWxmLnBhcmVudC5kYmcuZ2V0ZnJhbWUoc2VsZi5jdXJfc3RhY2tpdGVtKQotCQkJc2VsZi5wYXJlbnQuc3RlcF9vdXQoZnJhbWUpCi0JCWVsc2U6Ci0JCQlzZWxmLnBhcmVudC5zdGVwX2luKCkKLQkJCQotCWRlZiBjbGlja19raWxsKHNlbGYpOgotCQlzZWxmLnBhcmVudC5raWxsKCkKLQkJCi0JZGVmIGNsaWNrX2Jyb3dzZShzZWxmKToKLQkJc2VsZi5wYXJlbnQuYnJvd3NlKHNlbGYuY3VyX21vZG5hbWUpCi0JCQotCWRlZiBjbGlja19lZGl0KHNlbGYpOgotCQlsaW5vID0gc2VsZi5jdXJfbGluZQotCQlpZiBub3QgbGlubzoKLQkJCWxpbm8gPSAxCi0JCWlmIHNlbGYuY3VyX3NvdXJjZToKLQkJCXNlbGYucGFyZW50LmVkaXQoc2VsZi5jdXJfc291cmNlLCBsaW5vKQotCi1jbGFzcyBNb2R1bGVCcm93c2VyOgotCSIiIkJhc2UgY29kZSBmb3IgYSBtb2R1bGUtYnJvd3NlciIiIgotCi0JZGVmIG1pX29wZW4oc2VsZiwgbW9kdWxlKToKLQkJIiIiU2V0dXAgaW5pdGlhbCBkYXRhIHN0cnVjdHVyZXMiIiIKLQkJc2VsZi5jdXJfbW9kdWxlID0gbW9kdWxlCi0JCXNlbGYuY3VyX3NvdXJjZSA9IE5vbmUKLQkJc2VsZi5jdXJfbGluZSA9IE5vbmUKLQkJc2VsZi5jb250X21vZHVsZXMgPSBbXQotCQlzZWxmLnZhbHVlX3dpbmRvd3MgPSBbXQotCQlzZWxmLnNldHVwKCkKLQotCSMgY3JlYXRlX2l0ZW1zKHNlbGYpIHNob3VsZCBjcmVhdGUgc2VsZi5tb2R1bGVzLCBzZWxmLnZhcnMgYW5kIHNlbGYuc291cmNlCi0JCi0JZGVmIHNldHVwKHNlbGYpOgotCQkiIiJGaWxsIHRoZSB2YXJpb3VzIHdpZGdldHMgd2l0aCB2YWx1ZXMiIiIKLQkJc2VsZi5wYXJlbnQuU2V0V2F0Y2goKQotCQltb2RuYW1lcyA9IGdldG1vZHVsZW5hbWVzKCkKLQkJaWYgbm90IHNlbGYuY3VyX21vZHVsZSBpbiBtb2RuYW1lczoKLQkJCXNlbGYuY3VyX21vZHVsZSA9IE5vbmUKLQkJaWYgbW9kbmFtZXMgPD4gc2VsZi5jb250X21vZHVsZXM6Ci0JCQlzZWxmLmNvbnRfbW9kdWxlcyA9IG1vZG5hbWVzCi0JCQlzZWxmLnNldG1vZHVsZW5hbWVzKCkKLQkJaWYgc2VsZi5jdXJfbW9kdWxlOgotCQkJc2VsZi5tb2R1bGVfc2VsZWN0KHNlbGYuY29udF9tb2R1bGVzLmluZGV4KHNlbGYuY3VyX21vZHVsZSkpCi0JCWVsc2U6Ci0JCQlzZWxmLm1vZHVsZV9zZWxlY3QoTm9uZSkKLQkJc2VsZi5zZXR1cF9tb2R1bGUoKQotCQkKLQlkZWYgc2V0dXBfbW9kdWxlKHNlbGYpOgotCQkiIiJTZXR1cCBtb2R1bGUtZGVwZW5kZW50IHdpZGdldCBkYXRhIiIiCi0JCXNlbGYucGFyZW50LlNldFdhdGNoKCkKLQkJaWYgbm90IHNlbGYuY3VyX21vZHVsZToKLQkJCXNlbGYuY29udF92YXJuYW1lcyA9IFtdCi0JCQlzZWxmLmNvbnRfdmFydmFsdWVzID0gW10KLQkJZWxzZToKLQkJCXNlbGYuY29udF92YXJuYW1lcywgc2VsZi5jb250X3ZhcnZhbHVlcyA9IGdldG1vZHVsZXZhcnMoc2VsZi5jdXJfbW9kdWxlKQotCQlzZWxmLnNldHZhcnMoKQotCQkJCi0JCW1zZyA9ICIiCi0JCWlmIG5vdCBzZWxmLmN1cl9tb2R1bGU6Ci0JCQlzZWxmLmN1cl9zb3VyY2UgPSBOb25lCi0JCQltc2cgPSAiTm8gbW9kdWxlIHNlbGVjdGVkIgotCQllbHNlOgotCQkJbSA9IHN5cy5tb2R1bGVzW3NlbGYuY3VyX21vZHVsZV0KLQkJCXRyeToKLQkJCQlzZWxmLmN1cl9zb3VyY2UgPSBtLl9fZmlsZV9fCi0JCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQkJc2VsZi5jdXJfc291cmNlID0gTm9uZQotCQkJCW1zZyA9ICJOb3QgYSBweXRob24gbW9kdWxlIgotCQlzZWxmLmN1cl9saW5lbm8gPSAwCQotCQlzZWxmLnNldHNvdXJjZShtc2cpCi0JCXNlbGYuc291cmNlX3NlbGVjdChzZWxmLmN1cl9saW5lKQotCQlzZWxmLmJyZWFrc19jaGFuZ2VkKHNlbGYuY3VyX3NvdXJjZSkKLQkJCi0JCXNlbGYucGFyZW50LlNldEN1cnNvcigpCi0KLQkjIHNldHNvdXJjZShtc2cpIHNob3VsZCBkaXNwbGF5IGN1cl9zb3VyY2UrY29udGVudCwgb3IgbXNnIGlmIE5vbmUKLQkKLQlkZWYgdXBkYXRlX3ZpZXdzKHNlbGYpOgotCQlzZWxmLnNldHVwX21vZHVsZSgpCi0JCi0JZGVmIGNsaWNrX21vZHVsZShzZWxmLCBtb2R1bGUsICpkdW1teSk6Ci0JCWlmIG5vdCBtb2R1bGUgb3IgbW9kdWxlID09IHNlbGYuY3VyX21vZHVsZTogcmV0dXJuCi0JCXNlbGYuZm9jdXMobW9kdWxlKQotCQkKLQlkZWYgZm9jdXMoc2VsZiwgbW9kdWxlKToKLQkJc2VsZi5jdXJfbW9kdWxlID0gbW9kdWxlCi0JCXNlbGYuc2V0dXAoKQotCQkKLQlkZWYgY2xpY2tfdmFyKHNlbGYsIHZhciwgKmR1bW15KToKLQkJaWYgbm90IHZhcjogcmV0dXJuCi0JCW0gPSBzeXMubW9kdWxlc1tzZWxmLmN1cl9tb2R1bGVdCi0JCWRpY3QgPSBtLl9fZGljdF9fCi0JCXNlbGYucGFyZW50LmJyb3dzZV92YXIoZGljdFt2YXJdKQotCQkJCQotCWRlZiBjbGlja19zb3VyY2Uoc2VsZiwgbGluZW5vLCBpbmJvcmRlcik6Ci0JCWlmIG5vdCBpbmJvcmRlcjoKLQkJCXNlbGYuc291cmNlX3NlbGVjdChsaW5lbm8pCi0JCQlzZWxmLmN1cl9saW5lbm8gPSBsaW5lbm8KLQkJaWYgbGluZW5vID09IE5vbmUgb3Igbm90IHNlbGYuY3VyX3NvdXJjZSBvciBub3QgaW5ib3JkZXI6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuZGJnLmdldF9icmVhayhzZWxmLmN1cl9zb3VyY2UsIGxpbmVubyk6Ci0JCQlzZWxmLnBhcmVudC5kYmcuY2xlYXJfYnJlYWsoc2VsZi5jdXJfc291cmNlLCBsaW5lbm8pCi0JCWVsc2U6Ci0JCQlzZWxmLnBhcmVudC5kYmcuc2V0X2JyZWFrKHNlbGYuY3VyX3NvdXJjZSwgbGluZW5vKQotCQlzZWxmLnBhcmVudC5icmVha3NfY2hhbmdlZChzZWxmLmN1cl9zb3VyY2UpCi0JCQotCWRlZiBicmVha3NfY2hhbmdlZChzZWxmLCBmaWxlbmFtZSk6Ci0JCWlmIGZpbGVuYW1lID09IHNlbGYuY3VyX3NvdXJjZToKLQkJCWxpc3QgPSBzZWxmLnBhcmVudC5kYmcuZ2V0X2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQotCQkJc2VsZi5zb3VyY2Vfc2V0YnJlYWtzKGxpc3QpCi0JCQotCWRlZiBjbGlja19lZGl0KHNlbGYpOgotCQlsaW5vID0gc2VsZi5jdXJfbGluZW5vCi0JCWlmIG5vdCBsaW5vOgotCQkJbGlubyA9IDEKLQkJaWYgc2VsZi5jdXJfc291cmNlOgotCQkJc2VsZi5wYXJlbnQuZWRpdChzZWxmLmN1cl9zb3VyY2UsIGxpbm8pCi0JCQotCQkJCi1kZWYgZ2V0bW9kdWxlbmFtZXMoKToKLQkiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBjdXJyZW50IG1vZHVsZXMsIHNvcnRlZCIiIgotCWxpc3QgPSBzeXMubW9kdWxlcy5rZXlzKClbOl0KLQlsaXN0LnNvcnQoKQotCXJldHVybiBsaXN0Ci0JCi1kZWYgZ2V0bW9kdWxldmFycyhuYW1lKToKLQkiIiJGb3IgZ2l2ZW4gbW9kdWxlIHJldHVybiBsaXN0cyB3aXRoIG5hbWVzIGFuZCB2YWx1ZXMiIiIKLQltID0gc3lzLm1vZHVsZXNbbmFtZV0KLQl0cnk6Ci0JCWRpY3QgPSBtLl9fZGljdF9fCi0JZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotCQlkaWN0ID0ge30KLQlyZXR1cm4gZ2V0dmFyc2Zyb21kaWN0KGRpY3QpCi0JCi1kZWYgZ2V0dmFyc2Zyb21kaWN0KGRpY3QsIHNob3dfY29tcGxleD0xLCBzaG93X3N5c3RlbT0xKToKLQlhbGxuYW1lcyA9IGRpY3Qua2V5cygpWzpdCi0JYWxsbmFtZXMuc29ydCgpCi0JbmFtZXMgPSBbXQotCWZvciBuIGluIGFsbG5hbWVzOgotCQlpZiBub3Qgc2hvd19jb21wbGV4OgotCQkJaWYgbm90IHR5cGUoZGljdFtuXSkgaW4gU0lNUExFX1RZUEVTOgotCQkJCWNvbnRpbnVlCi0JCWlmIG5vdCBzaG93X3N5c3RlbToKLQkJCWlmIG5bOjJdID09ICdfXycgYW5kIG5bLTI6XSA9PSAnX18nOgotCQkJCWNvbnRpbnVlCi0JCW5hbWVzLmFwcGVuZChuKQotCXZhbHVlcyA9IFtdCi0JZm9yIG4gaW4gbmFtZXM6Ci0JCXYgPSBwcmV0dHkoZGljdFtuXSkKLQkJdmFsdWVzLmFwcGVuZCh2KQotCXJldHVybiBuYW1lcywgdmFsdWVzCi0JCi1kZWYgcHJldHR5KHZhcik6Ci0JdCA9IHR5cGUodmFyKQotCWlmIHQgPT0gdHlwZXMuRnVuY3Rpb25UeXBlOiByZXR1cm4gJzxmdW5jdGlvbj4nCi0JaWYgdCA9PSB0eXBlcy5DbGFzc1R5cGU6IHJldHVybiAnPGNsYXNzPicKLQlyZXR1cm4gYHZhcmAKLQkKLWRlZiBnZXRmcmFtZWxpbmVubyhmcmFtZSk6Ci0JIiIiR2l2ZW4gYSBmcmFtZSByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIiIiCi0JcmV0dXJuIGdldGNvZGVsaW5lbm8oZnJhbWUuZl9jb2RlKQotCQotZGVmIGdldGZ1bmNsaW5lbm8oZnVuYyk6Ci0JIiIiR2l2ZW4gYSBmdW5jdGlvbiByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIiIiCi0JcmV0dXJuIGdldGNvZGVsaW5lbm8oZnVuYy5mdW5jX2NvZGUpCi0JCi1kZWYgZ2V0Y29kZWxpbmVubyhjb2JqKToKLQkiIiJHaXZlbiBhIGNvZGUgb2JqZWN0IHJldHVybiB0aGUgbGluZSBudW1iZXIiIiIKLQljb2RlID0gY29iai5jb19jb2RlCi0JbGluZW5vID0gLTEKLQlpZiBvcmQoY29kZVswXSkgPT0gMTI3OiAjIFNFVF9MSU5FTk8gaW5zdHJ1Y3Rpb24KLQkJbGluZW5vID0gb3JkKGNvZGVbMV0pIHwgKG9yZChjb2RlWzJdKSA8PCA4KQotCXJldHVybiBsaW5lbm8KLQotZGVmIGdldGZyYW1lbW9kbmFtZShmcmFtZSk6Ci0JIiIiR2l2ZW4gYSBmcmFtZSByZXR1cm4gdGhlIG1vZHVsZSBuYW1lIiIiCi0JZ2xvYmFscyA9IGZyYW1lLmZfZ2xvYmFscwotCWlmIGdsb2JhbHMuaGFzX2tleSgnX19uYW1lX18nKToKLQkJcmV0dXJuIGdsb2JhbHNbJ19fbmFtZV9fJ10KLQlyZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvbWFjX3dpZGdldHMucHkgYi9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWNfd2lkZ2V0cy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNzQ4Yi4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWNfd2lkZ2V0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi1mcm9tIEZyYW1lV29yayBpbXBvcnQgKgotaW1wb3J0IFdpbgotaW1wb3J0IFFkCi1pbXBvcnQgQ29udHJvbHMKLWltcG9ydCBDdGwKLWltcG9ydCBURQotaW1wb3J0IExpc3QKLWltcG9ydCBvcwotaW1wb3J0IHN0cmluZwotaW1wb3J0IG1hY2ZzCi0KLVNDUk9MTEJBUj0xNgotTUFSR0lOPTIKLUlDT05TSVpFPTE2Ci1URVhUV0lEVEg9NDA5NiAjIE1vcmUtb3ItbGVzcyByYW5kb20gdmFsdWUKLQotVEVYVEZPTlQ9NAotVEVYVFNJWkU9OQotCi0jIFJlc291cmNlIG51bWJlcnMKLVBJQ19DVVJSRU5UPTUwMAotUElDX0JSRUFLPTUwMQotCi1waWN0dXJlX2NhY2hlPXt9Ci0KLWNsYXNzIE1UX1RleHRXaWRnZXQ6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIHdpZCwgcik6Ci0JCXNlbGYud2lkID0gd2lkCi0JCXNlbGYucmVjdCA9IHIKLQkJbGVmdCwgdG9wLCByaWdodCwgYm90dG9tID0gcgotCQlzZWxmLnRlcmVjdCA9IGxlZnQrTUFSR0lOK0lDT05TSVpFLCB0b3ArTUFSR0lOLCBcCi0JCQkJcmlnaHQtKE1BUkdJTitTQ1JPTExCQVIpLCBib3R0b20tKE1BUkdJTitTQ1JPTExCQVIpCi0JCWRyID0gc2VsZi50ZXJlY3RbMF0sIHNlbGYudGVyZWN0WzFdLCBURVhUV0lEVEgsIHNlbGYudGVyZWN0WzNdCi0JCVFkLlNldFBvcnQod2lkKQotCQlRZC5UZXh0Rm9udChURVhURk9OVCkKLQkJUWQuVGV4dFNpemUoVEVYVFNJWkUpCi0JCXNlbGYudGVkID0gVEUuVEVOZXcoZHIsIHNlbGYudGVyZWN0KQotCQlzZWxmLnRlZC5URUF1dG9WaWV3KDEpCi0JCXNlbGYuYWN0aXZhdGUoMSkKLQkJCi0JCXJlY3QgPSByaWdodC1TQ1JPTExCQVIsIHRvcCwgcmlnaHQsIGJvdHRvbS1TQ1JPTExCQVIrMQotCQlzZWxmLmJhcnkgPSBDdGwuTmV3Q29udHJvbChzZWxmLndpZCwgcmVjdCwgIiIsIDEsIDAsIDAsIDAsIDE2LCAwKQotCQlyZWN0ID0gbGVmdCwgYm90dG9tLVNDUk9MTEJBUiwgcmlnaHQtU0NST0xMQkFSKzEsIGJvdHRvbQotCQlzZWxmLmJhcnggPSBDdGwuTmV3Q29udHJvbChzZWxmLndpZCwgcmVjdCwgIiIsIDEsIDAsIDAsIDAsIDE2LCAwKQotCQkKLQkJc2VsZi5oYXZlX2RhdGEgPSAwCi0JCXNlbGYubGluZV9pbmRleCA9IFtdCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJZGVsIHNlbGYuYmFyeAotCQlkZWwgc2VsZi5iYXJ5Ci0JCWRlbCBzZWxmLnRlZAotCQkKLQlkZWYgc2Nyb2xsYmFycyhzZWxmKToKLQkJcGFzcwotCQkKLQlkZWYgc2V0Y29udGVudChzZWxmLCBmaWxlKToKLQkJc2VsZi5saW5lX2luZGV4ID0gW10KLQkJaWYgZmlsZSA9PSBOb25lOgotCQkJZGF0YSA9ICcnCi0JCQlzZWxmLmhhdmVfZGF0YSA9IDAKLQkJZWxzZToKLQkJCXRyeToKLQkJCQlmcCA9IG9wZW4oZmlsZSwgJ3JiJykgIyBOT1RFIHRoZSBiaW5hcnkKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJc2VsZi5oYXZlX2RhdGEgPSAxCi0JCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJCWRhdGEgPSAnQ2Fubm90IG9wZW4gZmlsZTpccicrYGFyZ2AKLQkJCQlzZWxmLmhhdmVfZGF0YSA9IDAKLQkJaWYgbGVuKGRhdGEpID4gMzI3Njc6Ci0JCQlzZWxmLmhhdmVfZGF0YSA9IDAKLQkJCWRhdGEgPSAnRmlsZSB0b28gYmlnJwotCQlzZWxmLnRlZC5URVNldFRleHQoZGF0YSkKLQkJaWYgc2VsZi5oYXZlX2RhdGE6Ci0JCQljdXIgPSAwCi0JCQl3aGlsZSAxOgotCQkJCXNlbGYubGluZV9pbmRleC5hcHBlbmQoY3VyKQotCQkJCXRyeToKLQkJCQkJY3VyID0gc3RyaW5nLmluZGV4KGRhdGEsICdccicsIGN1cisxKQotCQkJCWV4Y2VwdCBWYWx1ZUVycm9yOgotCQkJCQlicmVhawotCQkJc2VsZi5saW5lX2luZGV4LmFwcGVuZChsZW4oZGF0YSkpCi0JCXNlbGYud2lkLkludmFsV2luZG93UmVjdChzZWxmLnJlY3QpCi0JCXNlbGYudGVkLlRFU2V0U2VsZWN0KDAsMCkKLQkJc2VsZi50ZWQuVEVDYWxUZXh0KCkKLQkJc2VsZi50ZWQuVEVTZWxWaWV3KCkKLQkJc2VsZi5zZXRzY3JvbGxiYXJzKCkKLQkJCi0JZGVmIHNldHNjcm9sbGJhcnMoc2VsZik6Ci0JCWRvY2xlZnQsIGRvY3RvcCwgZG9jcmlnaHQsIGRvY2JvdCA9IHNlbGYudGVkLmRlc3RSZWN0Ci0JCXdpbmxlZnQsIHdpbnRvcCwgd2lucmlnaHQsIHdpbmJvdCA9IHNlbGYudGVkLnZpZXdSZWN0Ci0JCWRvY2JvdCA9IHNlbGYudGVkLm5MaW5lcypzZWxmLnRlZC5saW5lSGVpZ2h0ICsgZG9jdG9wCi0JCXNlbGYuc2V0YmFyKHNlbGYuYmFyeCwgZG9jbGVmdCwgZG9jcmlnaHQsIHdpbmxlZnQsIHdpbnJpZ2h0KQotCQlzZWxmLnNldGJhcihzZWxmLmJhcnksIGRvY3RvcCwgZG9jYm90LCB3aW50b3AsIHdpbmJvdCkKLQkJCi0JZGVmIHNldGJhcihzZWxmLCBiYXIsIG1pbm1pbiwgbWF4bWF4LCBjdXJtaW4sIGN1cm1heCk6Ci0JCWlmIG1heG1heC1taW5taW4gPiAzMjc2NyBvciAoY3VybWluIDw9IG1pbm1pbiBhbmQgY3VybWF4ID49IG1heG1heCk6Ci0JCQliYXIuU2V0Q29udHJvbE1pbmltdW0oMCkKLQkJCWJhci5TZXRDb250cm9sTWF4aW11bSgwKQotCQkJYmFyLlNldENvbnRyb2xWYWx1ZSgwKQotCQkJcmV0dXJuCi0JCWJhci5TZXRDb250cm9sTWluaW11bShtaW5taW4pCi0JCWJhci5TZXRDb250cm9sTWF4aW11bShtYXhtYXgtKGN1cm1heC1jdXJtaW4pKQotCQliYXIuU2V0Q29udHJvbFZhbHVlKGN1cm1pbikKLQotCWRlZiB1cGRhdGUoc2VsZiwgcmduKToKLQkJUWQuRXJhc2VSZWN0KHNlbGYudGVyZWN0KQotCQlRZC5GcmFtZVJlY3Qoc2VsZi5yZWN0KQotCQlzZWxmLnRlZC5URVVwZGF0ZShzZWxmLnRlcmVjdCkKLQkJCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLnRlZC5URUFjdGl2YXRlKCkKLQkJZWxzZToKLQkJCXNlbGYudGVkLlRFRGVhY3RpdmF0ZSgpCi0KLQlkZWYgc2VsZWN0KHNlbGYsIGxpbmUpOgotCQlpZiBsaW5lID09IE5vbmUgb3IgbGluZSA8PSAwIG9yIG5vdCBzZWxmLmhhdmVfZGF0YToKLQkJCXNlbGYudGVkLlRFU2V0U2VsZWN0KDAsMCkKLQkJZWxzZToKLQkJCWxpbmUgPSBsaW5lIC0gMQotCQkJaWYgbGluZSA+IGxlbihzZWxmLmxpbmVfaW5kZXgpLTE6IGxpbmUgPSBsZW4oc2VsZi5saW5lX2luZGV4KS0xCi0JCQlpZiBsaW5lID09IDE6Ci0JCQkJc2VsZi50ZWQuVEVTZXRTZWxlY3QoMCwgc2VsZi5saW5lX2luZGV4WzFdKQotCQkJZWxzZToKLQkJCQlzZWxmLnRlZC5URVNldFNlbGVjdChzZWxmLmxpbmVfaW5kZXhbbGluZV0rMSwgc2VsZi5saW5lX2luZGV4W2xpbmUrMV0pCi0JCXNlbGYuc2V0c2Nyb2xsYmFycygpCi0JCQotCWRlZiBjbGljayhzZWxmLCB3aGVyZSwgbW9kaWZpZXJzKToKLQkJIyBGaXJzdCBjaGVjayBzY3JvbGxiYXJzCi0JCWN0bHR5cGUsIGNvbnRyb2wgPSBDdGwuRmluZENvbnRyb2wod2hlcmUsIHNlbGYud2lkKQotCQlpZiBjdGx0eXBlIGFuZCBjb250cm9sOgotCQkJcGFydGNvZGUgPSBjb250cm9sLlRyYWNrQ29udHJvbCh3aGVyZSkKLQkJCWlmIHBhcnRjb2RlOgotCQkJCXNlbGYuY29udHJvbGhpdChjb250cm9sLCBwYXJ0Y29kZSkKLQkJCXJldHVybiBOb25lLCAwCi0JCW9mZiA9IHNlbGYudGVkLlRFR2V0T2Zmc2V0KHdoZXJlKQotCQlpbmJvcmRlciA9IHdoZXJlWzBdIDwgc2VsZi50ZXJlY3RbMF0KLQkJbCwgdCwgciwgYiA9IHNlbGYudGVyZWN0Ci0JCWlmIGwgPD0gd2hlcmVbMF0gPD0gciBhbmQgdCA8PSB3aGVyZVsxXSA8PSBiIG9yIGluYm9yZGVyOgotCQkJcmV0dXJuIHNlbGYub2Zmc2V0dG9saW5lKG9mZiksIGluYm9yZGVyCi0JCXJldHVybiBOb25lLCAwCSMgSW4gdGhlIGdyb3cgYm94IG9yIHNvbWV0aGluZy4KLQkJCi0JZGVmIG9mZnNldHRvbGluZShzZWxmLCBvZmZzZXQpOgotCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5saW5lX2luZGV4KSk6Ci0JCQlpZiBvZmZzZXQgPCBzZWxmLmxpbmVfaW5kZXhbaV06Ci0JCQkJcmV0dXJuIGkgICAjIE5vdCBpLTE6IDEtYmFzZWQgbGluZSBudW1iZXJzIGluIGZpbGVzCi0JCXJldHVybiBOb25lCi0KLQlkZWYgY29udHJvbGhpdChzZWxmLCBjb250cm9sLCBwYXJ0Y29kZSk6Ci0JCWlmIHBhcnRjb2RlIDw+IENvbnRyb2xzLmluVGh1bWI6Ci0JCQlpZiBjb250cm9sID09IHNlbGYuYmFyeDoKLQkJCQlpZiBwYXJ0Y29kZSA9PSBDb250cm9scy5pblVwQnV0dG9uOgotCQkJCQlkZWx0YSA9IC0xMAotCQkJCWlmIHBhcnRjb2RlID09IENvbnRyb2xzLmluRG93bkJ1dHRvbjoKLQkJCQkJZGVsdGEgPSAxMAotCQkJCWlmIHBhcnRjb2RlID09IENvbnRyb2xzLmluUGFnZVVwOgotCQkJCQlkZWx0YSA9IDEwLShzZWxmLnRlcmVjdFsyXS1zZWxmLnRlcmVjdFswXSkKLQkJCQlpZiBwYXJ0Y29kZSA9PSBDb250cm9scy5pblBhZ2VEb3duOgotCQkJCQlkZWx0YSA9IChzZWxmLnRlcmVjdFsyXS1zZWxmLnRlcmVjdFswXSktMTAKLQkJCQlvbGQgPSBjb250cm9sLkdldENvbnRyb2xWYWx1ZSgpCi0JCQkJY29udHJvbC5TZXRDb250cm9sVmFsdWUob2xkK2RlbHRhKQotCQkJaWYgY29udHJvbCA9PSBzZWxmLmJhcnk6Ci0JCQkJaWYgcGFydGNvZGUgPT0gQ29udHJvbHMuaW5VcEJ1dHRvbjoKLQkJCQkJZGVsdGEgPSAtc2VsZi50ZWQubGluZUhlaWdodAotCQkJCWlmIHBhcnRjb2RlID09IENvbnRyb2xzLmluRG93bkJ1dHRvbjoKLQkJCQkJZGVsdGEgPSBzZWxmLnRlZC5saW5lSGVpZ2h0Ci0JCQkJaWYgcGFydGNvZGUgPT0gQ29udHJvbHMuaW5QYWdlVXA6Ci0JCQkJCWRlbHRhID0gc2VsZi50ZWQubGluZUhlaWdodC0oc2VsZi50ZXJlY3RbM10tc2VsZi50ZXJlY3RbMV0pCi0JCQkJaWYgcGFydGNvZGUgPT0gQ29udHJvbHMuaW5QYWdlRG93bjoKLQkJCQkJZGVsdGEgPSAoc2VsZi50ZXJlY3RbM10tc2VsZi50ZXJlY3RbMV0pLXNlbGYudGVkLmxpbmVIZWlnaHQKLQkJCQlvbGQgPSBjb250cm9sLkdldENvbnRyb2xWYWx1ZSgpCi0JCQkJY29udHJvbC5TZXRDb250cm9sVmFsdWUob2xkK2RlbHRhKQotCQluZXd4ID0gc2VsZi5iYXJ4LkdldENvbnRyb2xWYWx1ZSgpCi0JCW5ld3kgPSBzZWxmLmJhcnkuR2V0Q29udHJvbFZhbHVlKCkKLQkJb2xkeCA9IHNlbGYudGVkLnZpZXdSZWN0WzBdCi0JCW9sZHkgPSBzZWxmLnRlZC52aWV3UmVjdFsxXQotCQlzZWxmLnRlZC5URVBpblNjcm9sbChvbGR4LW5ld3gsIG9sZHktbmV3eSkKLQkJc2VsZi5zZXRzY3JvbGxiYXJzKCkgIyBYWFhYIEJpYmJlcnQsIG1hYXIgaG9lIGFuZGVycz8KLQkJCQotY2xhc3MgTVRfSWNvblRleHRXaWRnZXQoTVRfVGV4dFdpZGdldCk6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIHdpZCwgcik6Ci0JCU1UX1RleHRXaWRnZXQuX19pbml0X18oc2VsZiwgd2lkLCByKQotCQlzZWxmLmJyZWFrcG9pbnRsaXN0ID0gW10KLQkJc2VsZi5jdXJsaW5lID0gTm9uZQotCQlzZWxmLmljb25yZWN0ID0gKHNlbGYucmVjdFswXSsxLCBzZWxmLnJlY3RbMV0rMSwgCi0JCQkJc2VsZi50ZXJlY3RbMF0tMSwgc2VsZi5yZWN0WzNdLVNDUk9MTEJBUikKLQkJc2VsZi5jdXJsaW5lcmFuZ2UgPSAoc2VsZi50ZXJlY3RbMV0rc2VsZi50ZWQubGluZUhlaWdodCwKLQkJCQlzZWxmLnRlcmVjdFszXS0yKnNlbGYudGVkLmxpbmVIZWlnaHQpCi0JCXNlbGYucGljY3VycmVudCA9IFBJQ19DVVJSRU5UCi0JCQotCWRlZiBzZXRicmVha3Moc2VsZiwgbGlzdCk6Ci0JCXNlbGYuYnJlYWtwb2ludGxpc3QgPSBsaXN0WzpdCi0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXNlbGYud2lkLkludmFsV2luZG93UmVjdChzZWxmLmljb25yZWN0KQotCQkKLQlkZWYgc2V0Y3VybGluZShzZWxmLCBsaW5lLCBwaWM9UElDX0NVUlJFTlQpOgotCQlzZWxmLmN1cmxpbmUgPSBsaW5lCi0JCXNlbGYucGljY3VycmVudCA9IHBpYwotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlzZWxmLnNob3dsaW5lKGxpbmUpCi0KLQlkZWYgc2hvd2xpbmUoc2VsZiwgbGluZSk6Ci0JCWlmIGxpbmUgPD0gMDogbGluZSA9IDEKLQkJaWYgbGluZSA+PSBsZW4oc2VsZi5saW5lX2luZGV4KTogbGluZSA9IGxlbihzZWxmLmxpbmVfaW5kZXgpLTEKLQkJaWYgbGluZSA8IDA6IHJldHVybgotCQlvZmYgPSBzZWxmLmxpbmVfaW5kZXhbbGluZV0KLQkJeCwgeSA9IHNlbGYudGVkLlRFR2V0UG9pbnQob2ZmKQotCQlpZiBzZWxmLmN1cmxpbmVyYW5nZVswXSA8PSB5IDw9IHNlbGYuY3VybGluZXJhbmdlWzFdOgotCQkJcmV0dXJuICMgSXQgaXMgaW4gdmlldwotCQltaWRkbGUgPSAoc2VsZi5jdXJsaW5lcmFuZ2VbMF0rc2VsZi5jdXJsaW5lcmFuZ2VbMV0pLzIKLQkJc2VsZi50ZWQuVEVQaW5TY3JvbGwoMCwgbWlkZGxlLXkpICMgT2YgYW5kZXJzb20/Ci0JCXNlbGYuc2V0c2Nyb2xsYmFycygpCi0JCQotCWRlZiBzZXRzY3JvbGxiYXJzKHNlbGYpOgotCQlNVF9UZXh0V2lkZ2V0LnNldHNjcm9sbGJhcnMoc2VsZikKLQkJc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHNlbGYuaWNvbnJlY3QpCi0JCQkJCi0JZGVmIHVwZGF0ZShzZWxmLCByZ24pOgotCQlNVF9UZXh0V2lkZ2V0LnVwZGF0ZShzZWxmLCByZ24pCi0JCXNlbGYuZHJhd2FsbGljb25zKCkKLQkJCi0JZGVmIGRyYXdhbGxpY29ucyhzZWxmKToKLQkJUWQuRXJhc2VSZWN0KHNlbGYuaWNvbnJlY3QpCi0JCVFkLk1vdmVUbyhzZWxmLmljb25yZWN0WzJdLCBzZWxmLmljb25yZWN0WzFdKQotCQlRZC5MaW5lVG8oc2VsZi5pY29ucmVjdFsyXSwgc2VsZi5pY29ucmVjdFszXSkKLQkJdG9wb2Zmc2V0ID0gc2VsZi50ZWQuVEVHZXRPZmZzZXQoKHNlbGYudGVyZWN0WzBdLCBzZWxmLnRlcmVjdFsxXSkpCi0JCWJvdG9mZnNldCA9IHNlbGYudGVkLlRFR2V0T2Zmc2V0KChzZWxmLnRlcmVjdFswXSwgc2VsZi50ZXJlY3RbM10pKQotCQl0b3BsaW5lID0gc2VsZi5vZmZzZXR0b2xpbmUodG9wb2Zmc2V0KQotCQlib3RsaW5lID0gc2VsZi5vZmZzZXR0b2xpbmUoYm90b2Zmc2V0KQotCQlpZiB0b3BsaW5lID09IE5vbmU6IHRvcGxpbmUgPSAxICMgPz8/Ci0JCWlmIGJvdGxpbmUgPT0gTm9uZTogYm90bGluZSA9IGxlbihzZWxmLmxpbmVfaW5kZXgpCi0JCWZvciBpIGluIHNlbGYuYnJlYWtwb2ludGxpc3Q6Ci0JCQlpZiB0b3BsaW5lIDw9IGkgPD0gYm90bGluZToKLQkJCQlzZWxmLmRyYXcxaWNvbihpLCBQSUNfQlJFQUspCi0JCWlmIHNlbGYuY3VybGluZSA8PiBOb25lIGFuZCB0b3BsaW5lIDw9IHNlbGYuY3VybGluZSA8PSBib3RsaW5lOgotCQkJc2VsZi5kcmF3MWljb24oc2VsZi5jdXJsaW5lLCBzZWxmLnBpY2N1cnJlbnQpCi0JCQkKLQlkZWYgZHJhdzFpY29uKHNlbGYsIGxpbmUsIHdoaWNoKToKLQkJb2Zmc2V0ID0gc2VsZi5saW5lX2luZGV4W2xpbmVdCi0JCWJvdHgsIGJvdHkgPSBzZWxmLnRlZC5URUdldFBvaW50KG9mZnNldCkKLQkJcmVjdCA9IHNlbGYucmVjdFswXSsyLCBib3R5LXNlbGYudGVkLmxpbmVIZWlnaHQsIFwKLQkJCXNlbGYucmVjdFswXStJQ09OU0laRS0yLCBib3R5Ci0JCWlmIG5vdCBwaWN0dXJlX2NhY2hlLmhhc19rZXkod2hpY2gpOgotCQkJcGljdHVyZV9jYWNoZVt3aGljaF0gPSBRZC5HZXRQaWN0dXJlKHdoaWNoKQotCQlzZWxmLmRyYXdpY29uKHJlY3QsIHBpY3R1cmVfY2FjaGVbd2hpY2hdKQotCQkKLQlkZWYgZHJhd2ljb24oc2VsZiwgcmVjdCwgd2hpY2gpOgotCQlRZC5EcmF3UGljdHVyZSh3aGljaCwgcmVjdCkKLQotY2xhc3MgTVRfSW5kZXhMaXN0OgotCWRlZiBfX2luaXRfXyhzZWxmLCB3aWQsIHJlY3QsIHdpZHRoKToKLQkJIyB3aWQgaXMgdGhlIHdpbmRvdyAoZGlhbG9nKSB3aGVyZSBvdXIgbGlzdCBpcyBnb2luZyB0byBiZSBpbgotCQkjIHJlY3QgaXMgaXQncyBpdGVtIHJlY3RhbmdsZSAoYXMgaW4gZGlhbG9nIGl0ZW0pCi0JCXNlbGYucmVjdCA9IHJlY3QKLQkJcmVjdDIgPSByZWN0WzBdKzEsIHJlY3RbMV0rMSwgcmVjdFsyXS0xNiwgcmVjdFszXS0xCi0JCXNlbGYubGlzdCA9IExpc3QuTE5ldyhyZWN0MiwgKDAsIDAsIHdpZHRoLCAwKSwgKDAsMCksIDAsIHdpZCwKLQkJCQkJMCwgMSwgMCwgMSkKLQkJc2VsZi53aWQgPSB3aWQKLQkJc2VsZi53aWR0aCA9IHdpZHRoCi0JCi0JZGVmIHNldGNvbnRlbnQoc2VsZiwgKmNvbnRlbnQpOgotCQlzZWxmLmxpc3QuTERlbFJvdygwLCAxKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCi0JCXNlbGYubGlzdC5MQWRkUm93KGxlbihjb250ZW50WzBdKSwgMCkKLQkJZm9yIHggaW4gcmFuZ2UobGVuKGNvbnRlbnQpKToKLQkJCWNvbHVtbiA9IGNvbnRlbnRbeF0KLQkJCWZvciB5IGluIHJhbmdlKGxlbihjb2x1bW4pKToKLQkJCQlzZWxmLmxpc3QuTFNldENlbGwoY29sdW1uW3ldLCAoeCwgeSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHNlbGYucmVjdCkKLQotCWRlZiBkZXNlbGVjdGFsbChzZWxmKToKLQkJd2hpbGUgMToKLQkJCW9rLCBwdCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsICgwLDApKQotCQkJaWYgbm90IG9rOiByZXR1cm4KLQkJCXNlbGYubGlzdC5MU2V0U2VsZWN0KDAsIHB0KQotCQkJCi0JZGVmIHNlbGVjdChzZWxmLCBudW0pOgotCQlzZWxmLmRlc2VsZWN0YWxsKCkKLQkJaWYgbnVtIDwgMDoKLQkJCXJldHVybgotCQlmb3IgaSBpbiByYW5nZShzZWxmLndpZHRoKToKLQkJCXNlbGYubGlzdC5MU2V0U2VsZWN0KDEsIChpLCBudW0pKQotCQkJCi0JZGVmIGNsaWNrKHNlbGYsIHdoZXJlLCBtb2RpZmllcnMpOgotCQlpc19kb3VibGUgPSBzZWxmLmxpc3QuTENsaWNrKHdoZXJlLCBtb2RpZmllcnMpCi0JCW9rLCAoeCwgeSkgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCAoMCwgMCkpCi0JCWlmIG9rOgotCQkJcmV0dXJuIHksIGlzX2RvdWJsZQotCQllbHNlOgotCQkJcmV0dXJuIE5vbmUsIGlzX2RvdWJsZQotCQkJCi0JIyBkcmF3IGEgZnJhbWUgYXJvdW5kIHRoZSBsaXN0LCBMaXN0IE1hbmFnZXIgZG9lc24ndCBkbyB0aGF0Ci0JZGVmIGRyYXdmcmFtZShzZWxmKToKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJUWQuRnJhbWVSZWN0KHNlbGYucmVjdCkKLQkJCi0JZGVmIHVwZGF0ZShzZWxmLCByZ24pOgotCQlzZWxmLmRyYXdmcmFtZSgpCi0JCXNlbGYubGlzdC5MVXBkYXRlKHJnbikKLQkJCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJc2VsZi5saXN0LkxBY3RpdmF0ZShvbm9mZikKLQkJCi1jbGFzcyBNVF9BbnlMaXN0KE1UX0luZGV4TGlzdCk6Ci0KLQlkZWYgY2xpY2soc2VsZiwgd2hlcmUsIG1vZGlmaWVycyk6Ci0JCWlzX2RvdWJsZSA9IHNlbGYubGlzdC5MQ2xpY2sod2hlcmUsIG1vZGlmaWVycykKLQkJb2ssICh4LCB5KSA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsICgwLCAwKSkKLQkJaWYgb2s6Ci0JCQlzZWxmLnNlbGVjdCh5KQotCQkJZmllbGQwID0gc2VsZi5saXN0LkxHZXRDZWxsKDEwMDAsKDAseSkpCi0JCWVsc2U6Ci0JCQlmaWVsZDAgPSBOb25lCi0JCXJldHVybiBmaWVsZDAsIGlzX2RvdWJsZQotCQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvbWFjdHdpdF9hcHAucHkgYi9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X2FwcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1NjhkZi4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X2FwcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi1pbXBvcnQgRnJhbWVXb3JrCi1pbXBvcnQgTWluaUFFRnJhbWUKLWltcG9ydCBFYXN5RGlhbG9ncwotaW1wb3J0IEFFCi1pbXBvcnQgQXBwbGVFdmVudHMKLWltcG9ydCBSZXMKLWltcG9ydCBzeXMKLWltcG9ydCBRZAotaW1wb3J0IEV2dAotaW1wb3J0IEV2ZW50cwotaW1wb3J0IERsZwotaW1wb3J0IFdpbgotaW1wb3J0IE1lbnUKLWltcG9ydCBUd2l0Q29yZQotaW1wb3J0IG1hY3R3aXRfbW9kCi1pbXBvcnQgbWFjdHdpdF9zdGFjawotaW1wb3J0IG1hY3R3aXRfYnJvd3NlcgotaW1wb3J0IG1hY3R3aXRfZWRpdAotaW1wb3J0IG1hY2ZzCi1pbXBvcnQgc3RyaW5nCi0KLSMgUmVzb3VyY2UtaWQgKGZvciBjaGVja2luZyBleGlzdGVuY2UpCi1JRF9NT0RVTEVTPTUwMAotCi1JRF9BQk9VVD01MDIKLQotX2Fycm93ID0gUWQucWQuYXJyb3cKLV93YXRjaCA9IFFkLkdldEN1cnNvcig0KS5kYXRhCi0KLWNsYXNzIFR3aXQoRnJhbWVXb3JrLkFwcGxpY2F0aW9uLCBUd2l0Q29yZS5BcHBsaWNhdGlvbiwgTWluaUFFRnJhbWUuQUVTZXJ2ZXIpOgotCSIiIlRoZSB0d2l0IG1haW4gY2xhc3MgLSBtYWMtZGVwZW5kZW50IHBhcnQiIiIKLQotCWRlZiBfX2luaXRfXyhzZWxmLCBzZXNzaW9udHlwZSwgYXJnPU5vbmUpOgotCQkjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KLQkJc2VsZi5hcHBfbWVudV9iYXIgPSBNZW51LkdldE1lbnVCYXIoKQotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJTWluaUFFRnJhbWUuQUVTZXJ2ZXIuX19pbml0X18oc2VsZikKLQkJQUUuQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQoQXBwbGVFdmVudHMua0FFSW50ZXJhY3RXaXRoQWxsKQotCQlzZWxmLmluc3RhbGxhZWhhbmRsZXIoJ2FldnQnLCAnb2RvYycsIHNlbGYuYWVfb3Blbl9kb2MpCi0JCXNlbGYuaW5zdGFsbGFlaGFuZGxlcignYWV2dCcsICdxdWl0Jywgc2VsZi5kb19xdWl0KQotCQlzZWxmLmluc3RhbGxhZWhhbmRsZXIoJ3B5dGgnLCAnRVhFQycsIHNlbGYuZG9fYmJweWV4ZWMpICMgQkJweSBleGVjdXRlIGV2ZW50Ci0KLQkJc2VsZi5kYmdfbWVudV9iYXIgPSBNZW51LkdldE1lbnVCYXIoKQotCQlzZWxmLnNldHN0YXRlKHNlc3Npb250eXBlKQotCQlzZWxmLl9xdWl0dGluZyA9IDAKLQkJc2VsZi5yZWFsX3F1aXQgPSAwCi0JCXNlbGYud2luZG93X2F3YXJlID0gMQotCi0JCSMgTmV4dCBjcmVhdGUgb3VyIGRpYWxvZ3MKLQkJc2VsZi5taV9pbml0KHNlc3Npb250eXBlLCBhcmcpCi0JCXdoaWxlIDE6Ci0JCQlpZiBzZWxmLnJlYWxfcXVpdDoKLQkJCQlicmVhawotCQkJaWYgc2VsZi5pbml0aWFsX2NtZDoKLQkJCQlzZWxmLnRvX2RlYnVnZ2VyKCkJIyBXaWxsIGdldCB0byBtYWlubG9vcCB2aWEgZGVidWdnZXIKLQkJCWVsc2U6Ci0JCQkJc2VsZi5vbmVfbWFpbmxvb3AoKQkjIEVsc2UgZG8gaXQgb3Vyc2VsdmVzLgotCQkJCQotCWRlZiBzd2l0Y2hfdG9fYXBwKHNlbGYpOgotCQlpZiBub3Qgc2VsZi53aW5kb3dfYXdhcmU6Ci0JCQlyZXR1cm4KLQkJc2VsZi5kYmdfbWVudV9iYXIgPSBNZW51LkdldE1lbnVCYXIoKQotCQlNZW51LlNldE1lbnVCYXIoc2VsZi5hcHBfbWVudV9iYXIpCi0JCU1lbnUuRHJhd01lbnVCYXIoKQotCQkKLQlkZWYgc3dpdGNoX3RvX2RiZyhzZWxmKToKLQkJaWYgbm90IHNlbGYud2luZG93X2F3YXJlOgotCQkJcmV0dXJuCi0JCXNlbGYuYXBwX21lbnVfYmFyID0gTWVudS5HZXRNZW51QmFyKCkKLQkJTWVudS5TZXRNZW51QmFyKHNlbGYuZGJnX21lbnVfYmFyKQotCQlNZW51LkRyYXdNZW51QmFyKCkKLQkJc2VsZi5ydW5fZGlhbG9nLmZvcmNlX3JlZHJhdygpCi0JCWlmIHNlbGYubW9kdWxlX2RpYWxvZzoKLQkJCXNlbGYubW9kdWxlX2RpYWxvZy5mb3JjZV9yZWRyYXcoKQotCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRGVidWciKQotCQlzZWxmLl9vcGVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIEZpbGUuLi4iLCAiTyIsIHNlbGYuZG9fb3BlbikKLQkJc2VsZi5fcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIFN0cmluZy4uLiIsICJSIiwgc2VsZi5kb19ydW4pCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJc2VsZi5fYXdhcmVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJXaW5kb3ctYXdhcmUiLCAiIiwgc2VsZi5kb19hd2FyZSkKLQkJc2VsZi5fYXdhcmVpdGVtLmNoZWNrKDEpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJc2VsZi5fcXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYuZG9fcXVpdCkKLQkJCi0JCXNlbGYuY29udHJvbG1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiQ29udHJvbCIpCi0JCXNlbGYuX3N0ZXBpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTdGVwIE5leHQiLCAiTiIsIHNlbGYuZG9fc3RlcCkKLQkJc2VsZi5fc3RlcGluaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU3RlcCBJbiIsICJTIiwgc2VsZi5kb19zdGVwaW4pCi0JCXNlbGYuX3N0ZXBvdXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTdGVwIE91dCIsICJVIiwgc2VsZi5kb19zdGVwb3V0KQotCQlzZWxmLl9jb250aW51ZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNvbnRpbnVlIiwgIkciLCBzZWxmLmRvX2NvbnRpbnVlKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCXNlbGYuX2tpbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJLaWxsIiwgIksiLCBzZWxmLmRvX2tpbGwpCi0JCQotCWRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6Ci0JCXNlbGYuc3RhdGUgPSBzdGF0ZQotCQlpZiBzdGF0ZSA9PSAncnVuJzoKLQkJCXNlbGYuX3N0ZXBpdGVtLmVuYWJsZSgxKQotCQkJc2VsZi5fc3RlcG91dGl0ZW0uZW5hYmxlKDEpCi0JCQlzZWxmLl9zdGVwaW5pdGVtLmVuYWJsZSgxKQotCQkJc2VsZi5fY29udGludWVpdGVtLmVuYWJsZSgxKQotCQkJc2VsZi5fa2lsbGl0ZW0uZW5hYmxlKDEpCi0JCWVsc2U6Ci0JCQlzZWxmLl9zdGVwaXRlbS5lbmFibGUoMCkKLQkJCXNlbGYuX3N0ZXBvdXRpdGVtLmVuYWJsZSgwKQotCQkJc2VsZi5fc3RlcGluaXRlbS5lbmFibGUoMCkKLQkJCXNlbGYuX2NvbnRpbnVlaXRlbS5lbmFibGUoMCkKLQkJCXNlbGYuX2tpbGxpdGVtLmVuYWJsZSgwKQotCQkJCi0JZGVmIGFza25ld3Nlc3Npb24oc2VsZik6Ci0JCWlmIHNlbGYuc3RhdGUgPT0gJ25vbmUnOgotCQkJcmV0dXJuIDEKLQkJaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoIkFib3J0IGN1cnJlbnQgZGVidWcgc2Vzc2lvbj8iKSA9PSAxOgotCQkJc2VsZi5xdWl0X2JkYigpCi0JCQlyZXR1cm4gMQotCQlyZXR1cm4gMAotCi0JZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJaW1wb3J0IHRpbWUKLQkJZCA9IERsZy5HZXROZXdEaWFsb2coSURfQUJPVVQsIC0xKQotCQlpZiBub3QgZDoKLQkJCXJldHVybgotCQl3ID0gZC5HZXREaWFsb2dXaW5kb3coKQotCQlwb3J0ID0gdy5HZXRXaW5kb3dQb3J0KCkKLQkJbCwgdCwgciwgYiA9IHBvcnQucG9ydFJlY3QKLQkJc2wsIHN0LCBzciwgc2IgPSBRZC5xZC5zY3JlZW5CaXRzLmJvdW5kcwotCQl4ID0gKChzci1zbCkgLSAoci1sKSkgLyAyCi0JCXkgPSAoKHNiLXN0LTE2KSAtIChiLXQpKSAvIDUKLQkJdy5Nb3ZlV2luZG93KHgsIHksIDApCi0JCXcuU2hvd1dpbmRvdygpCi0JCWQuRHJhd0RpYWxvZygpCi0JCQotCQl0cCwgaCwgcmVjdCA9IGQuR2V0RGlhbG9nSXRlbSgyKQotCQl4MCwgeTAsIHgxLCB5MSA9IHJlY3QKLQkJeWJvdCA9IHkwICsgMzIKLQkJCi0JCXJnbiA9IFFkLk5ld1JnbigpCi0JCVFkLlNldFBvcnQoZCkKLQkJb2ssIGV2dCA9IHNlbGYuZ2V0ZXZlbnQoRXZlbnRzLm1Eb3duTWFza3xFdmVudHMua2V5RG93bk1hc2ssIDEpCi0JCWlmIG9rOiByZXR1cm4KLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJZGVsdGFfdCA9IDEyOAotCQluZXh0dGltZSA9IHdoZW4rZGVsdGFfdAotCQl3aGlsZSB5Ym90IDwgeTE6Ci0JCQkjIERvIHRoZSBhbmltYXRpb24sIGlmIGl0IGlzIHRpbWUKLQkJCWlmIHdoZW4gPiBuZXh0dGltZToKLQkJCQlRZC5TY3JvbGxSZWN0KCh4MCwgeTAsIHgxLCB5Ym90KSwgMCwgMSwgcmduKQotCQkJCXkwID0geTAgKyAxCi0JCQkJeWJvdCA9IHlib3QgKyAxCi0JCQkJIyBBbmQgdXBkYXRlIG5leHQgdGltZQotCQkJCWRlbHRhX3QgPSBpbnQoZGVsdGFfdCowLjYpLTEKLQkJCQlpZiBkZWx0YV90IDwgMDoKLQkJCQkJZGVsdGFfdCA9IDAKLQkJCQluZXh0dGltZSA9IHdoZW4gKyBkZWx0YV90Ci0JCQkjIENoZWNrIGZvciBhbiBldmVudC4KLQkJCW9rLCBldnQgPSBzZWxmLmdldGV2ZW50KEV2ZW50cy5tRG93bk1hc2t8RXZlbnRzLmtleURvd25NYXNrLCAwKQotCQkJaWYgb2s6IHJldHVybgotCQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZ0Ci0JCXdoaWxlIDE6Ci0JCQlvaywgZXZ0ID0gc2VsZi5nZXRldmVudChFdmVudHMubURvd25NYXNrfEV2ZW50cy5rZXlEb3duTWFzaywgLTEpCi0JCQlpZiBvazogcmV0dXJuCi0JCQkKLQlkZWYgZG9fb3BlbihzZWxmLCAqYXJncyk6Ci0JCWlmIG5vdCBzZWxmLmFza25ld3Nlc3Npb24oKToKLQkJCXJldHVybgotCQlmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRHZXRGaWxlKCdURVhUJykKLQkJaWYgbm90IG9rOiByZXR1cm4KLQkJc2VsZi5ydW5maWxlKGZzcy5hc19wYXRobmFtZSgpKQotCQkKLQlkZWYgYWVfb3Blbl9kb2Moc2VsZiwgb2JqZWN0PU5vbmUsICoqYXJncyk6Ci0JCWlmIG5vdCBvYmplY3Q6IHJldHVybgotCQlpZiBzZWxmLnN0YXRlIDw+ICdub25lJzoKLQkJCWlmIEFFLkFFSW50ZXJhY3RXaXRoVXNlcihBcHBsZUV2ZW50cy5rQUVEZWZhdWx0VGltZW91dCkgPT0gMDoKLQkJCQlpZiBub3Qgc2VsZi5hc2tuZXdzZXNzaW9uKCk6Ci0JCQkJCXJldHVybgotCQlpZiB0eXBlKG9iamVjdCkgPT0gdHlwZShbXSk6Ci0JCQlvYmplY3QgPSBvYmplY3RbMF0KLQkJZnNzLCBjaGFuZ2VkID0gb2JqZWN0LlJlc29sdmUoKQotCQlzZWxmLnJ1bmZpbGUoZnNzLmFzX3BhdGhuYW1lKCkpCi0JCQotCWRlZiBkb19iYnB5ZXhlYyhzZWxmLCBvYmplY3Q9Tm9uZSwgTkFNRT1Ob25lLCAqKmFyZ3MpOgotCQlpZiB0eXBlKG9iamVjdCkgPD4gdHlwZSgnJyk6Ci0JCQlpZiBBRS5BRUludGVyYWN0V2l0aFVzZXIoQXBwbGVFdmVudHMua0FFRGVmYXVsdFRpbWVvdXQpID09IDA6Ci0JCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgnRVhFQyBBcHBsZUV2ZW50IGFyZyBzaG91bGQgYmUgYSBzdHJpbmcnKQotCQkJcmV0dXJuCi0JCWlmIHNlbGYuc3RhdGUgPD4gJ25vbmUnOgotCQkJaWYgQUUuQUVJbnRlcmFjdFdpdGhVc2VyKEFwcGxlRXZlbnRzLmtBRURlZmF1bHRUaW1lb3V0KSA9PSAwOgotCQkJCWlmIG5vdCBzZWxmLmFza25ld3Nlc3Npb24oKToKLQkJCQkJcmV0dXJuCi0JCXN0dWZmID0gc3RyaW5nLnNwbGl0ZmllbGRzKG9iamVjdCwgJ1xyJykKLQkJc3R1ZmYgPSBzdHJpbmcuam9pbmZpZWxkcyhzdHVmZiwgJ1xuJykKLQkJc2VsZi5ydW5zdHJpbmcoc3R1ZmYpCi0JCQkKLQlkZWYgZG9fcnVuKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYuYXNrbmV3c2Vzc2lvbigpOgotCQkJcmV0dXJuCi0JCXNlbGYucnVuKCkKLQkJCi0JZGVmIGRvX2F3YXJlKHNlbGYsICphcmdzKToKLQkJc2VsZi53aW5kb3dfYXdhcmUgPSBub3Qgc2VsZi53aW5kb3dfYXdhcmUKLQkJc2VsZi5fYXdhcmVpdGVtLmNoZWNrKHNlbGYud2luZG93X2F3YXJlKQotCQkKLQlkZWYgZG9fcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQkJCSMgU2lnbmFsIEZyYW1lV29yay5BcHBsaWNhdGlvbiB0byBzdG9wCi0JCXNlbGYucmVhbF9xdWl0ID0gMQotCQlzZWxmLnF1aXRfYmRiKCkJCQkjIFRlbGwgZGVidWdnZXIgdG8gcXVpdC4KLQotCWRlZiBkb19zdGVwKHNlbGYsICphcmdzKToKLQkJc2VsZi5ydW5fZGlhbG9nLmNsaWNrX3N0ZXAoKQotCQkKLQlkZWYgZG9fc3RlcGluKHNlbGYsICphcmdzKToKLQkJc2VsZi5ydW5fZGlhbG9nLmNsaWNrX3N0ZXBfaW4oKQotCQkKLQlkZWYgZG9fc3RlcG91dChzZWxmLCAqYXJncyk6Ci0JCXNlbGYucnVuX2RpYWxvZy5jbGlja19zdGVwX291dCgpCi0JCQotCWRlZiBkb19jb250aW51ZShzZWxmLCAqYXJncyk6Ci0JCXNlbGYucnVuX2RpYWxvZy5jbGlja19jb250aW51ZSgpCi0JCQotCWRlZiBkb19raWxsKHNlbGYsICphcmdzKToKLQkJc2VsZi5ydW5fZGlhbG9nLmNsaWNrX2tpbGwoKQotCQkJCQkKLQlkZWYgZXhpdF9tYWlubG9vcChzZWxmKToKLQkJc2VsZi5fcXVpdCgpCQkJIyBTaWduYWwgRnJhbWVXb3JrLkFwcGxpY2F0aW9uIHRvIHN0b3AKLQkJc2VsZi5yZWFsX3F1aXQgPSAwCi0JCQotCWRlZiBvbmVfbWFpbmxvb3Aoc2VsZik6Ci0JCXNlbGYucXVpdHRpbmcgPSAwCi0JCXNlbGYubWFpbmxvb3AoKQotCi0JZGVmIFNldEN1cnNvcihzZWxmKToKLQkJUWQuU2V0Q3Vyc29yKF9hcnJvdykKLQkKLQlkZWYgU2V0V2F0Y2goc2VsZik6Ci0JCVFkLlNldEN1cnNvcihfd2F0Y2gpCi0JCQotCWRlZiBBc2tTdHJpbmcoc2VsZiwgKmFyZ3MpOgotCQlyZXR1cm4gYXBwbHkoRWFzeURpYWxvZ3MuQXNrU3RyaW5nLCBhcmdzKQotCQkKLQlkZWYgTWVzc2FnZShzZWxmLCAqYXJncyk6Ci0JCXJldHVybiBhcHBseShFYXN5RGlhbG9ncy5NZXNzYWdlLCBhcmdzKQotCi0JZGVmIG5ld19tb2R1bGVfYnJvd3NlcihzZWxmLCBwYXJlbnQpOgotCQlyZXR1cm4gbWFjdHdpdF9tb2QuTW9kdWxlQnJvd3NlcihwYXJlbnQpCi0JCQotCWRlZiBuZXdfc3RhY2tfYnJvd3NlcihzZWxmLCBwYXJlbnQpOgotCQlyZXR1cm4gbWFjdHdpdF9zdGFjay5TdGFja0Jyb3dzZXIocGFyZW50KQotCQkKLQlkZWYgbmV3X3Zhcl9icm93c2VyKHNlbGYsIHBhcmVudCwgdmFyKToKLQkJcmV0dXJuIG1hY3R3aXRfYnJvd3Nlci5WYXJCcm93c2VyKHBhcmVudCkub3Blbih2YXIpCi0JCi0JZGVmIGVkaXQoc2VsZiwgZmlsZSwgbGluZSk6Ci0JCXJldHVybiBtYWN0d2l0X2VkaXQuZWRpdChmaWxlLCBsaW5lKQotCQotCQkKLWRlZiBJbml0aWFsaXplKCk6Ci0JdHJ5OgotCQkjIGlmIHRoaXMgZG9lc24ndCByYWlzZSBhbiBlcnJvciwgd2UgYXJlIGFuIGFwcGxldCBjb250YWluaW5nIHRoZSAKLQkJIyBuZWNlc3NhcnkgcmVzb3VyY2VzIG9yIHdlIGhhdmUgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5Ci0JCSMgc28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgb3BlbmluZyB0aGUgcmVzb3VyY2UgZmlsZQotCQlkdW1teSA9IFJlcy5HZXRSZXNvdXJjZSgnRExPRycsIElEX01PRFVMRVMpCi0JZXhjZXB0IFJlcy5FcnJvcjoKLQkJdHJ5OgotCQkJUmVzLkZTcE9wZW5SZXNGaWxlKCJUd2l0LnJzcmMiLCAxKQotCQlleGNlcHQgUmVzLkVycm9yLCBhcmc6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJDYW5ub3Qgb3BlbiBUd2l0LnJzcmM6ICIrYXJnWzFdKQotCQkJc3lzLmV4aXQoMSkKLQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvbWFjdHdpdF9icm93c2VyLnB5IGIvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvbWFjdHdpdF9icm93c2VyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzBkZTQzLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC90d2l0L21hY3R3aXRfYnJvd3Nlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0iIiJBIHNpbXBsZSBNYWMtb25seSBicm93c2UgdXRpbGl0eSB0byBwZWVrIGF0IHRoZSBpbm5lciBkYXRhIHN0cnVjdHVyZXMgb2YgUHl0aG9uLiIiIgotIyBNaW5vciBtb2RpZmljYXRpb25zIGJ5IEphY2sgdG8gZmFjaWxpdGF0ZSBpbmNvcnBvcmF0aW9uIGluIHR3aXQuCi0KLSMganVuZSAxOTk2Ci0jIFdyaXR0ZW4gYnkgSnVzdCB2YW4gUm9zc3VtIDxqdXN0QGtub3dhcmUubmw+LCBwbGVhc2Ugc2VuZCBjb21tZW50cy9pbXByb3ZlbWVudHMuCi0jIExvb3NlbHkgYmFzZWQgb24gSmFjayBKYW5zZW5zJ3MgUElDVGJyb3dzZS5weSwgYnV0IGRlcGVuZHMgb24gaGlzIGZhYnVsb3VzIEZyYW1lV29yay5weQotIyBYWFggU29tZSBwYXJ0cyBhcmUgKnZlcnkqIHBvb3JseSBzb2x2ZWQuIFdpbGwgZml4LiBHdWlkbyBoYXMgdG8gY2hlY2sgaWYgYWxsIHRoZQotIyBYWFggInB5dGhvbi1wZWVraW5nIiBpcyBkb25lIGNvcnJlY3RseS4gSSBraW5kb2YgcmV2ZXJzZS1lbmdpbmVlcmVkIGl0IDstKQotCi0jIGRpc2NsYWltZXI6IGFsdGhvdWdoIEkgaGFwcGVuIHRvIGJlIHRoZSBicm90aGVyIG9mIFB5dGhvbidzIGZhdGhlciwgcHJvZ3JhbW1pbmcgaXMKLSMgbm90IHdoYXQgSSd2ZSBiZWVuIHRyYWluZWQgdG8gZG8uIFNvIGRvbid0IGJlIHN1cnByaXNlZCBpZiB5b3UgZmluZCBhbnl0aGluZyB0aGF0J3Mgbm90IAotIyBhcyBuaWNlIGFzIGl0IGNvdWxkIGJlLi4uCi0KLSMgWFhYIHRvIGRvOgotIyBBcnJvdyBrZXkgc3VwcG9ydAotIyBDb3B5ICYgUGFzdGU/IAotIyBNQUlOX1RFWFQgaXRlbSBzaG91bGQgbm90IGNvbnRhaW4gKHR5cGUpOyBzaG91bGQgYmUgYmVsb3cgb3Igc29tZXRoaW5nLiAKLSMgTUFJTl9URVhUIGl0ZW0gc2hvdWxkIGNoZWNrIGlmIGEgc3RyaW5nIGlzIGJpbmFyeSBvciBub3Q6IGNvbnZlcnQgdG8gJy8wMDAnIHN0eWxlCi0jIG9yIGNvbnZlcnQgbmV3bGluZXMuIAotCi12ZXJzaW9uID0gIjEuMCIKLQotaW1wb3J0IEZyYW1lV29yawotaW1wb3J0IEVhc3lEaWFsb2dzCi1pbXBvcnQgRGxnCi1pbXBvcnQgUmVzCi1pbXBvcnQgUWQKLWltcG9ydCBMaXN0Ci1pbXBvcnQgc3lzCi1mcm9tIFR5cGVzIGltcG9ydCAqCi1mcm9tIFF1aWNrRHJhdyBpbXBvcnQgKgotaW1wb3J0IHN0cmluZwotaW1wb3J0IHRpbWUKLWltcG9ydCBvcwotCi0jIFRoZSBpbml0aWFsIG9iamVjdCB0byBzdGFydCBicm93c2luZyB3aXRoLiBDYW4gYmUgYW55dGhpbmcsIGJ1dCAnc3lzJyBtYWtlcyBraW5kb2Ygc2Vuc2UuCi1zdGFydF9vYmplY3QgPSBzeXMKLQotIyBSZXNvdXJjZSBkZWZpbml0aW9ucwotSURfTUFJTiA9IDUwMwotTlVNX0xJU1RTID0gNAkjIHRoZSBudW1iZXIgb2YgbGlzdHMgdXNlZC4gY291bGQgYmUgY2hhbmdlZCwgYnV0IHRoZSBkbGcgaXRlbSBudW1iZXJzIHNob3VsZCBiZSBjb25zaXN0ZW50Ci1NQUlOX1RJVExFID0gMwkjIHRoaXMgaXMgb25seSB0aGUgZmlyc3QgdGV4dCBpdGVtLCB0aGUgb3RoZXIgdGhyZWUgSUQncyBzaG91bGQgYmUgNSwgNyBhbmQgOQotTUFJTl9MSVNUID0gNAkjIHRoaXMgaXMgb25seSB0aGUgZmlyc3QgbGlzdCwgdGhlIG90aGVyIHRocmVlIElEJ3Mgc2hvdWxkIGJlIDYsIDggYW5kIDEwCi1NQUlOX1RFWFQgPSAxMQotTUFJTl9MRUZUID0gMQotTUFJTl9SSUdIVCA9IDIKLU1BSU5fUkVTRVQgPSAxMgotTUFJTl9DTE9TRSA9IDEzCi1NQUlOX0xJTkUgPSAxNAotCi1kZWYgSW5pdGlhbGl6ZSgpOgotCSMgdGhpcyBiaXQgZW5zdXJlcyB0aGF0IHRoaXMgbW9kdWxlIHdpbGwgYWxzbyB3b3JrIGFzIGFuIGFwcGxldCBpZiB0aGUgcmVzb3VyY2VzIGFyZQotCSMgaW4gdGhlIHJlc291cmNlIGZvcmsgb2YgdGhlIGFwcGxldAotCSMgc3RvbGVuIGZyb20gSmFjaywgc28gaXQgc2hvdWxkIHdvcmsoPyE7LSkKLQl0cnk6Ci0JCSMgaWYgdGhpcyBkb2Vzbid0IHJhaXNlIGFuIGVycm9yLCB3ZSBhcmUgYW4gYXBwbGV0IGNvbnRhaW5pbmcgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMKLQkJIyBzbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBvcGVuaW5nIHRoZSByZXNvdXJjZSBmaWxlCi0JCWR1bW15ID0gUmVzLkdldFJlc291cmNlKCdETE9HJywgSURfTUFJTikKLQlleGNlcHQgUmVzLkVycm9yOgotCQlzYXZld2QgPSBvcy5nZXRjd2QoKQotCQlvdXJwYXJlbnRkaXIgPSBvcy5wYXRoLnNwbGl0KG9wZW5yZXNmaWxlLmZ1bmNfY29kZS5jb19maWxlbmFtZSlbMF0KLQkJb3MuY2hkaXIob3VycGFyZW50ZGlyKQkJCi0JCXRyeToKLQkJCVJlcy5GU3BPcGVuUmVzRmlsZSgibWFjdHdpdF9icm93c2UucnNyYyIsIDEpCi0JCWV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkNhbm5vdCBvcGVuIG1hY3R3aXRfYnJvd3NlLnJzcmM6ICIrYXJnWzFdKQotCQkJc3lzLmV4aXQoMSkKLQkJb3MuY2hkaXIoc2F2ZXdkKQotCi1kZWYgbWFpbigpOgotCUluaXRpYWxpemUoKQotCVB5dGhvbkJyb3dzZSgpCi0KLSMgdGhpcyBpcyBhbGwgdGhlcmUgaXMgdG8gaXQgdG8gbWFrZSBhbiBhcHBsaWNhdGlvbi4gCi1jbGFzcyBQeXRob25Ccm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQlWYXJCcm93c2VyKHNlbGYpLm9wZW4oc3RhcnRfb2JqZWN0KQotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIiB2ZXJzaW9uICIgKyB2ZXJzaW9uICsgIlxyYnkgSnVzdCB2YW4gUm9zc3VtIikKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXJhaXNlIHNlbGYKLQotY2xhc3MgTXlMaXN0OgotCWRlZiBfX2luaXRfXyhzZWxmLCB3aWQsIHJlY3QsIGl0ZW1udW0pOgotCQkjIHdpZCBpcyB0aGUgd2luZG93IChkaWFsb2cpIHdoZXJlIG91ciBsaXN0IGlzIGdvaW5nIHRvIGJlIGluCi0JCSMgcmVjdCBpcyBpdCdzIGl0ZW0gcmVjdGFuZ2xlIChhcyBpbiBkaWFsb2cgaXRlbSkKLQkJIyBpdGVtbnVtIGlzIHRoZSBpdGVtbnVtYmVyIGluIHRoZSBkaWFsb2cKLQkJc2VsZi5yZWN0ID0gcmVjdAotCQlyZWN0MiA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE2LCByZWN0WzNdLTEJCSMgU2Nyb2xsIGJhciBzcGFjZSwgdGhhdCdzIDE1ICsgMSwgSmFjayEKLQkJc2VsZi5saXN0ID0gTGlzdC5MTmV3KHJlY3QyLCAoMCwgMCwgMSwgMCksICgwLDApLCAwLCB3aWQsCi0JCQkJCTAsIDEsIDAsIDEpCi0JCXNlbGYud2lkID0gd2lkCi0JCXNlbGYuYWN0aXZlID0gMAotCQlzZWxmLml0ZW1udW0gPSBpdGVtbnVtCi0JCi0JZGVmIHNldGNvbnRlbnQoc2VsZiwgY29udGVudCwgdGl0bGUgPSAiIik6Ci0JCSMgZmlyc3QsIGdhdGhlciBzb21lIHN0dWZmCi0JCWtleWxpc3QgPSBbXQotCQl2YWx1ZWxpc3QgPSBbXQotCQl0aGV0eXBlID0gdHlwZShjb250ZW50KQotCQlpZiB0aGV0eXBlID09IERpY3RUeXBlOgotCQkJa2V5bGlzdCA9IGNvbnRlbnQua2V5cygpCi0JCQlrZXlsaXN0LnNvcnQoKQotCQkJZm9yIGtleSBpbiBrZXlsaXN0OgotCQkJCXZhbHVlbGlzdC5hcHBlbmQoY29udGVudFtrZXldKQotCQllbGlmIHRoZXR5cGUgPT0gTGlzdFR5cGU6Ci0JCQlrZXlsaXN0ID0gdmFsdWVsaXN0ID0gY29udGVudAotCQllbGlmIHRoZXR5cGUgPT0gVHVwbGVUeXBlOgotCQkJCi0JCQlrZXlsaXN0ID0gdmFsdWVsaXN0ID0gW10KLQkJCWZvciBpIGluIGNvbnRlbnQ6Ci0JCQkJa2V5bGlzdC5hcHBlbmQoaSkKLQkJZWxzZToKLQkJCSMgWFhYIGhlbHAgbWUhIGlzIGFsbCB0aGlzIGNvcnJlY3Q/IGlzIHRoZXJlIG1vcmUgSSBzaG91bGQgY29uc2lkZXI/Pz8KLQkJCSMgWFhYIGlzIHRoaXMgYSBzZW5zaWJsZSB3YXkgdG8gZG8gaXQgaW4gdGhlIGZpcnN0IHBsYWNlPz8/PwotCQkJIyBYWFggSSdtIG5vdCBmYW1pbGlhciBlbm91Z2ggd2l0aCBQeXRob24ncyBndXRzIHRvIGJlIHN1cmUuIEdVSURPT09PTyEhIQotCQkJaWYgaGFzYXR0cihjb250ZW50LCAiX19kaWN0X18iKToKLQkJCQlrZXlsaXN0ID0ga2V5bGlzdCArIGNvbnRlbnQuX19kaWN0X18ua2V5cygpCi0JCQlpZiBoYXNhdHRyKGNvbnRlbnQsICJfX21ldGhvZHNfXyIpOgotCQkJCWtleWxpc3QgPSBrZXlsaXN0ICsgY29udGVudC5fX21ldGhvZHNfXwotCQkJaWYgaGFzYXR0cihjb250ZW50LCAiX19tZW1iZXJzX18iKToKLQkJCQlrZXlsaXN0ID0ga2V5bGlzdCArIGNvbnRlbnQuX19tZW1iZXJzX18KLQkJCWlmIGhhc2F0dHIoY29udGVudCwgIl9fY2xhc3NfXyIpOgotCQkJCWtleWxpc3QuYXBwZW5kKCJfX2NsYXNzX18iKQotCQkJaWYgaGFzYXR0cihjb250ZW50LCAiX19iYXNlc19fIik6Ci0JCQkJa2V5bGlzdC5hcHBlbmQoIl9fYmFzZXNfXyIpCi0JCQlpZiBoYXNhdHRyKGNvbnRlbnQsICJfX25hbWVfXyIpOgotCQkJCXRpdGxlID0gY29udGVudC5fX25hbWVfXwotCQkJCWlmICJfX25hbWVfXyIgbm90IGluIGtleWxpc3Q6Ci0JCQkJCWtleWxpc3QuYXBwZW5kKCJfX25hbWVfXyIpCi0JCQlrZXlsaXN0LnNvcnQoKQotCQkJZm9yIGtleSBpbiBrZXlsaXN0OgotCQkJCXZhbHVlbGlzdC5hcHBlbmQoZ2V0YXR0cihjb250ZW50LCBrZXkpKQotCQlpZiBjb250ZW50IDw+IE5vbmU6Ci0JCQl0aXRsZSA9IHRpdGxlICsgIlxyIiArIGNsZWFudHlwZShjb250ZW50KQotCQkjIG5vdyBtYWtlIHRoYXQgbGlzdCEKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKHNlbGYuaXRlbW51bSAtIDEpCi0JCURsZy5TZXREaWFsb2dJdGVtVGV4dChoLCB0aXRsZVs6MjU1XSkKLQkJc2VsZi5saXN0LkxEZWxSb3coMCwgMSkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlzZWxmLmxpc3QuTEFkZFJvdyhsZW4oa2V5bGlzdCksIDApCi0JCWZvciBpIGluIHJhbmdlKGxlbihrZXlsaXN0KSk6Ci0JCQlzZWxmLmxpc3QuTFNldENlbGwoc3RyKGtleWxpc3RbaV0pLCAoMCwgaSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJc2VsZi5jb250ZW50ID0gY29udGVudAotCQlzZWxmLmtleWxpc3QgPSBrZXlsaXN0Ci0JCXNlbGYudmFsdWVsaXN0ID0gdmFsdWVsaXN0Ci0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQotCSMgZHJhdyBhIGZyYW1lIGFyb3VuZCB0aGUgbGlzdCwgTGlzdCBNYW5hZ2VyIGRvZXNuJ3QgZG8gdGhhdAotCWRlZiBkcmF3ZnJhbWUoc2VsZik6Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCVFkLkZyYW1lUmVjdChzZWxmLnJlY3QpCi0JCXJlY3QyID0gUWQuSW5zZXRSZWN0KHNlbGYucmVjdCwgLTMsIC0zKQotCQlzYXZlID0gUWQuR2V0UGVuU3RhdGUoKQotCQlRZC5QZW5TaXplKDIsIDIpCi0JCWlmIHNlbGYuYWN0aXZlOgotCQkJUWQuUGVuUGF0KFFkLnFkLmJsYWNrKQotCQllbHNlOgotCQkJUWQuUGVuUGF0KFFkLnFkLndoaXRlKQotCQkjIGRyYXcgKG9yIGVyYXNlKSBhbiBleHRyYSBmcmFtZSB0byBpbmRpY2F0ZSB0aGlzIGlzIHRoZSBhY2l2ZSBsaXN0IChvciBub3QpCi0JCVFkLkZyYW1lUmVjdChyZWN0MikKLQkJUWQuU2V0UGVuU3RhdGUoc2F2ZSkKLQkJCi0JCQotCi1jbGFzcyBWYXJCcm93c2VyKEZyYW1lV29yay5EaWFsb2dXaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHN0YXJ0X29iamVjdCwgdGl0bGUgPSAiIik6Ci0JCUZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQotCQlpZiB0aXRsZSA8PiAiIjoKLQkJCXdpbmRvd3RpdGxlID0gc2VsZi53aWQuR2V0V1RpdGxlKCkKLQkJCXNlbGYud2lkLlNldFdUaXRsZSh3aW5kb3d0aXRsZSArICIgPj4gIiArIHRpdGxlKQotCQllbHNlOgotCQkJaWYgaGFzYXR0cihzdGFydF9vYmplY3QsICJfX25hbWVfXyIpOgotCQkJCXdpbmRvd3RpdGxlID0gc2VsZi53aWQuR2V0V1RpdGxlKCkKLQkJCQlzZWxmLndpZC5TZXRXVGl0bGUod2luZG93dGl0bGUgKyAiID4+ICIgKyBzdHIoZ2V0YXR0cihzdGFydF9vYmplY3QsICJfX25hbWVfXyIpKSApCi0JCQkJCi0JCXNlbGYuU2V0UG9ydCgpCi0JCVFkLlRleHRGb250KDMpCi0JCVFkLlRleHRTaXplKDkpCi0JCXNlbGYubGlzdHMgPSBbXQotCQlzZWxmLmxpc3RpdGVtcyA9IFtdCi0JCWZvciBpIGluIHJhbmdlKE5VTV9MSVNUUyk6Ci0JCQlzZWxmLmxpc3RpdGVtcy5hcHBlbmQoTUFJTl9MSVNUICsgMiAqIGkpCSMgZGxnIGl0ZW0gbnVtYmVycy4uLiBoYXZlIHRvIGJlIGNvbnNpc3RlbnQKLQkJZm9yIGkgaW4gc2VsZi5saXN0aXRlbXM6Ci0JCQl0cCwgaCwgcmVjdCA9IHNlbGYud2lkLkdldERpYWxvZ0l0ZW0oaSkKLQkJCWxpc3QgPSBNeUxpc3Qoc2VsZi53aWQsIHJlY3QsIGkpCi0JCQlzZWxmLmxpc3RzLmFwcGVuZChsaXN0KQotCQlzZWxmLmxlZnRvdmVyID0gW10KLQkJc2VsZi5yaWdodG92ZXIgPSBbXQotCQlzZWxmLnNldHVwKHN0YXJ0X29iamVjdCwgdGl0bGUpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5saXN0cyA9IFtdCi0JCXNlbGYubGlzdGl0ZW1zID0gW10KLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQotCWRlZiBzZXR1cChzZWxmLCBzdGFydF9vYmplY3QsIHRpdGxlID0gIiIpOgotCQkjIGhlcmUgd2Ugc2V0IHRoZSBzdGFydGluZyBwb2ludCBmb3Igb3VyIGV4cGVkaXRpb24KLQkJc2VsZi5zdGFydCA9IHN0YXJ0X29iamVjdAotCQlzZWxmLmxpc3RzWzBdLnNldGNvbnRlbnQoc3RhcnRfb2JqZWN0LCB0aXRsZSkKLQkJZm9yIGxpc3QgaW4gc2VsZi5saXN0c1sxOl06Ci0JCQlsaXN0LnNldGNvbnRlbnQoTm9uZSkKLQkJCi0JZGVmIGRvX2xpc3RoaXQoc2VsZiwgZXZlbnQsIGl0ZW0pOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQl3aGVyZSA9IFFkLkdsb2JhbFRvTG9jYWwod2hlcmUpCi0JCWZvciBsaXN0IGluIHNlbGYubGlzdHM6Ci0JCQlsaXN0LmFjdGl2ZSA9IDAKLQkJbGlzdCA9IHNlbGYubGlzdHNbc2VsZi5saXN0aXRlbXMuaW5kZXgoaXRlbSldCi0JCWxpc3QuYWN0aXZlID0gMQotCQlmb3IgbCBpbiBzZWxmLmxpc3RzOgotCQkJbC5kcmF3ZnJhbWUoKQotCQkKLQkJcG9pbnQgPSAoMCwwKQotCQlvaywgcG9pbnQgPSBsaXN0Lmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJaWYgb2s6Ci0JCQlvbGRzZWwgPSBwb2ludFsxXQotCQllbHNlOgotCQkJb2xkc2VsID0gLTEKLQkJIyBUaGlzIHNob3VsZCBiZTogbGlzdC5saXN0LkxDbGljayh3aGVyZSwgbW9kaWZpZXJzKQotCQkjIFNpbmNlIHRoZSBzZWxGbGFncyBmaWVsZCBvZiB0aGUgbGlzdCBpcyBub3QgYWNjZXNzaWJsZSBmcm9tIFB5dGhvbiBJIGhhdmUgdG8gZG8gaXQgbGlrZSB0aGlzLgotCQkjIFRoZSBlZmZlY3QgaXMgdGhhdCB5b3UgY2FuJ3Qgc2VsZWN0IG1vcmUgaXRlbXMgYnkgdXNpbmcgc2hpZnQgb3IgY29tbWFuZC4KLQkJbGlzdC5saXN0LkxDbGljayh3aGVyZSwgMCkKLQkJCi0JCWluZGV4ID0gc2VsZi5saXN0aXRlbXMuaW5kZXgoaXRlbSkgKyAxCi0JCXBvaW50ID0gKDAsMCkKLQkJb2ssIHBvaW50ID0gbGlzdC5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCWlmIG9sZHNlbCA9PSBwb2ludFsxXToKLQkJCXJldHVybgkjIHNlbGVjdGlvbiBkaWRuJ3QgY2hhbmdlLCBkbyBub3RoaW5nLgotCQlpZiBub3Qgb2s6Ci0JCQlmb3IgaSBpbiByYW5nZShpbmRleCwgbGVuKHNlbGYubGlzdGl0ZW1zKSk6Ci0JCQkJc2VsZi5saXN0c1tpXS5zZXRjb250ZW50KE5vbmUpCi0JCQlzZWxmLnJpZ2h0b3ZlciA9IFtdCi0JCQlyZXR1cm4KLQkJCQotCQlpZiBwb2ludFsxXSA+PSBsZW4obGlzdC5rZXlsaXN0KToKLQkJCXJldHVybgkJIyBYWFggaXMgdGhpcyBzdGlsbCBuZWNlc3Nhcnk/IGlzIG9rIHJlYWxseSB0cnVlPwotCQlrZXkgPSBzdHIobGlzdC5rZXlsaXN0W3BvaW50WzFdXSkKLQkJdmFsdWUgPSBsaXN0LnZhbHVlbGlzdFtwb2ludFsxXV0KLQkJCi0JCXNlbGYuc2V0dGV4dGl0ZW0oIiIpCi0JCXRoZXR5cGUgPSB0eXBlKHZhbHVlKQotCQlpZiB0aGV0eXBlID09IExpc3RUeXBlIG9yIAkJCQlcCi0JCQkJdGhldHlwZSA9PSBUdXBsZVR5cGUgb3IgCQlcCi0JCQkJdGhldHlwZSA9PSBEaWN0VHlwZSBvciAJCQlcCi0JCQkJaGFzYXR0cih2YWx1ZSwgIl9fZGljdF9fIikgb3IgCQlcCi0JCQkJaGFzYXR0cih2YWx1ZSwgIl9fbWV0aG9kc19fIikgb3IJXAotCQkJCWhhc2F0dHIodmFsdWUsICJfX21lbWJlcnNfXyIpOgkjIFhYWCBvciwgb3IuLi4gYWdhaW46IGRpZCBJIG1pc3Mgc29tZXRoaW5nPwotCQkJaWYgaW5kZXggPj0gbGVuKHNlbGYubGlzdGl0ZW1zKToKLQkJCQkjIHdlJ3ZlIHJlYWNoZWQgdGhlIHJpZ2h0IHNpZGUgb2Ygb3VyIGRpYWxvZy4gbW92ZSBldmVyeXRoaW5nIHRvIHRoZSBsZWZ0Ci0JCQkJIyAoYnkgcHVzaGluZyB0aGUgcmlnaHRidXR0b24uLi4pCi0JCQkJc2VsZi5kb19yaWdodGJ1dHRvbigxKQotCQkJCWluZGV4ID0gaW5kZXggLSAxCi0JCQluZXdsaXN0ID0gc2VsZi5saXN0c1tpbmRleF0KLQkJCW5ld2xpc3Quc2V0Y29udGVudCh2YWx1ZSwga2V5KQotCQllbHNlOgotCQkJaW5kZXggPSBpbmRleCAtIDEKLQkJCXNlbGYuc2V0dGV4dGl0ZW0oIHN0cih2YWx1ZSkgKyAiXHIiICsgY2xlYW50eXBlKHZhbHVlKSkKLQkJZm9yIGkgaW4gcmFuZ2UoaW5kZXggKyAxLCBsZW4oc2VsZi5saXN0aXRlbXMpKToKLQkJCXNlbGYubGlzdHNbaV0uc2V0Y29udGVudChOb25lKQotCQlzZWxmLnJpZ2h0b3ZlciA9IFtdCi0JCi0JIyBoZWxwZXIgdG8gc2V0IHRoZSBiaWcgdGV4dCBpdGVtIGF0IHRoZSBib3R0b20gb2YgdGhlIGRpYWxvZy4KLQlkZWYgc2V0dGV4dGl0ZW0oc2VsZiwgdGV4dCk6Ci0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShNQUlOX1RFWFQpCi0JCURsZy5TZXREaWFsb2dJdGVtVGV4dChoLCB0ZXh0WzoyNTVdKQotCQotCWRlZiBkb19yYXd1cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCWlUeXBlLCBpSGFuZGxlLCBpUmVjdCA9IHdpbmRvdy5HZXREaWFsb2dJdGVtKE1BSU5fTElORSkKLQkJUWQuRnJhbWVSZWN0KGlSZWN0KQotCQlmb3IgbGlzdCBpbiBzZWxmLmxpc3RzOgotCQkJUWQuRnJhbWVSZWN0KGxpc3QucmVjdCkKLQkJCWlmIGxpc3QuYWN0aXZlOgotCQkJCSMgc2VlIE15TGlzdC5kcmF3ZnJhbWUKLQkJCQlyZWN0MiA9IFFkLkluc2V0UmVjdChsaXN0LnJlY3QsIC0zLCAtMykKLQkJCQlzYXZlID0gUWQuR2V0UGVuU3RhdGUoKQotCQkJCVFkLlBlblNpemUoMiwgMikKLQkJCQlRZC5GcmFtZVJlY3QocmVjdDIpCi0JCQkJUWQuU2V0UGVuU3RhdGUoc2F2ZSkKLQkJZm9yIGxpc3QgaW4gc2VsZi5saXN0czoKLQkJCWxpc3QubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBhY3RpdmF0ZSwgZXZlbnQpOgotCQlmb3IgbGlzdCBpbiBzZWxmLmxpc3RzOgotCQkJbGlzdC5saXN0LkxBY3RpdmF0ZShhY3RpdmF0ZSkKLQkJCi0JIyBzY3JvbGwgZXZlcnl0aGluZyBvbmUgJ3VuaXQnIHRvIHRoZSBsZWZ0Ci0JIyBYWFggSSBkb24ndCBsaWtlIHRoZSB3YXkgdGhpcyB3b3Jrcy4gVG9vIG1hbnkgJ21hbnVhbCcgYXNzaWdubWVudHMKLQlkZWYgZG9fcmlnaHRidXR0b24oc2VsZiwgZm9yY2UgPSAwKToKLQkJaWYgbm90IGZvcmNlIGFuZCBzZWxmLnJpZ2h0b3ZlciA9PSBbXToKLQkJCXJldHVybgotCQlzZWxmLnNjcm9sbCgtMSkKLQkJcG9pbnQgPSAoMCwgMCkKLQkJb2ssIHBvaW50ID0gc2VsZi5saXN0c1swXS5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCXNlbGYubGVmdG92ZXIuYXBwZW5kKChwb2ludCwgc2VsZi5saXN0c1swXS5jb250ZW50LCBzZWxmLmxpc3RzWzBdLnRpdGxlLCBzZWxmLmxpc3RzWzBdLmFjdGl2ZSkpCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmxpc3RzKS0xKToKLQkJCXBvaW50ID0gKDAsIDApCi0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3RzW2krMV0ubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJc2VsZi5saXN0c1tpXS5zZXRjb250ZW50KHNlbGYubGlzdHNbaSsxXS5jb250ZW50LCBzZWxmLmxpc3RzW2krMV0udGl0bGUpCi0JCQlzZWxmLmxpc3RzW2ldLmxpc3QuTFNldFNlbGVjdChvaywgcG9pbnQpCi0JCQlzZWxmLmxpc3RzW2ldLmxpc3QuTEF1dG9TY3JvbGwoKQotCQkJc2VsZi5saXN0c1tpXS5hY3RpdmUgPSBzZWxmLmxpc3RzW2krMV0uYWN0aXZlCi0JCQlzZWxmLmxpc3RzW2ldLmRyYXdmcmFtZSgpCi0JCWlmIGxlbihzZWxmLnJpZ2h0b3ZlcikgPiAwOgotCQkJcG9pbnQsIGNvbnRlbnQsIHRpdGxlLCBhY3RpdmUgPSBzZWxmLnJpZ2h0b3ZlclstMV0KLQkJCXNlbGYubGlzdHNbLTFdLnNldGNvbnRlbnQoY29udGVudCwgdGl0bGUpCi0JCQlzZWxmLmxpc3RzWy0xXS5saXN0LkxTZXRTZWxlY3QoMSwgcG9pbnQpCi0JCQlzZWxmLmxpc3RzWy0xXS5saXN0LkxBdXRvU2Nyb2xsKCkKLQkJCXNlbGYubGlzdHNbLTFdLmFjdGl2ZSA9IGFjdGl2ZQotCQkJc2VsZi5saXN0c1stMV0uZHJhd2ZyYW1lKCkKLQkJCWRlbCBzZWxmLnJpZ2h0b3ZlclstMV0KLQkJZWxzZToKLQkJCXNlbGYubGlzdHNbLTFdLnNldGNvbnRlbnQoTm9uZSkKLQkJCXNlbGYubGlzdHNbLTFdLmFjdGl2ZSA9IDAKLQkJZm9yIGxpc3QgaW4gc2VsZi5saXN0czoKLQkJCWxpc3QuZHJhd2ZyYW1lKCkKLQkKLQkjIHNjcm9sbCBldmVyeXRoaW5nIG9uZSAndW5pdCcgdG8gdGhlIHJpZ2h0Ci0JZGVmIGRvX2xlZnRidXR0b24oc2VsZik6Ci0JCWlmIHNlbGYubGVmdG92ZXIgPT0gW106Ci0JCQlyZXR1cm4KLQkJc2VsZi5zY3JvbGwoMSkKLQkJaWYgc2VsZi5saXN0c1stMV0uY29udGVudCA8PiBOb25lOgotCQkJcG9pbnQgPSAoMCwgMCkKLQkJCW9rLCBwb2ludCA9IHNlbGYubGlzdHNbLTFdLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJCXNlbGYucmlnaHRvdmVyLmFwcGVuZCgocG9pbnQsIHNlbGYubGlzdHNbLTFdLmNvbnRlbnQsIHNlbGYubGlzdHNbLTFdLnRpdGxlLCBzZWxmLmxpc3RzWy0xXS5hY3RpdmUgKSkKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYubGlzdHMpLTEsIDAsIC0xKToKLQkJCXBvaW50ID0gKDAsIDApCi0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3RzW2ktMV0ubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJc2VsZi5saXN0c1tpXS5zZXRjb250ZW50KHNlbGYubGlzdHNbaS0xXS5jb250ZW50LCBzZWxmLmxpc3RzW2ktMV0udGl0bGUpCi0JCQlzZWxmLmxpc3RzW2ldLmxpc3QuTFNldFNlbGVjdChvaywgcG9pbnQpCi0JCQlzZWxmLmxpc3RzW2ldLmxpc3QuTEF1dG9TY3JvbGwoKQotCQkJc2VsZi5saXN0c1tpXS5hY3RpdmUgPSBzZWxmLmxpc3RzW2ktMV0uYWN0aXZlCi0JCQlzZWxmLmxpc3RzW2ldLmRyYXdmcmFtZSgpCi0JCWlmIGxlbihzZWxmLmxlZnRvdmVyKSA+IDA6Ci0JCQlwb2ludCwgY29udGVudCwgdGl0bGUsIGFjdGl2ZSA9IHNlbGYubGVmdG92ZXJbLTFdCi0JCQlzZWxmLmxpc3RzWzBdLnNldGNvbnRlbnQoY29udGVudCwgdGl0bGUpCi0JCQlzZWxmLmxpc3RzWzBdLmxpc3QuTFNldFNlbGVjdCgxLCBwb2ludCkKLQkJCXNlbGYubGlzdHNbMF0ubGlzdC5MQXV0b1Njcm9sbCgpCi0JCQlzZWxmLmxpc3RzWzBdLmFjdGl2ZSA9IGFjdGl2ZQotCQkJc2VsZi5saXN0c1swXS5kcmF3ZnJhbWUoKQotCQkJZGVsIHNlbGYubGVmdG92ZXJbLTFdCi0JCWVsc2U6Ci0JCQlzZWxmLmxpc3RzWzBdLnNldGNvbnRlbnQoTm9uZSkKLQkJCXNlbGYubGlzdHNbMF0uYWN0aXZlID0gMAotCQotCSMgY3JlYXRlIHNvbWUgdmlzdWFsIGZlZWRiYWNrIHdoZW4gJ3Njcm9sbGluZycgdGhlIGxpc3RzIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodAotCWRlZiBzY3JvbGwoc2VsZiwgbGVmdHJpZ2h0KToJIyBsZWZ0cmlnaHQgc2hvdWxkIGJlIDEgb3IgLTEKLQkJIyBmaXJzdCwgYnVpbGQgYSByZWdpb24gY29udGFpbmluZyBhbGwgbGlzdCByZWN0YW5nbGVzCi0JCW15cmVnaW9uID0gUWQuTmV3UmduKCkKLQkJbXlsYXN0cmVnaW9uID0gUWQuTmV3UmduKCkKLQkJZm9yIGxpc3QgaW4gc2VsZi5saXN0czoKLQkJCUFkZFJlY3QyUmduKGxpc3QucmVjdCwgbXlyZWdpb24pCi0JCQlBZGRSZWN0MlJnbihsaXN0LnJlY3QsIG15bGFzdHJlZ2lvbikKLQkJIyBzZXQgdGhlIHBlbiwgYnV0IHNhdmUgaXQncyBzdGF0ZSBmaXJzdAotCQlzZWxmLlNldFBvcnQoKQotCQlzYXZlID0gUWQuR2V0UGVuU3RhdGUoKQotCQlRZC5QZW5QYXQoUWQucWQuZ3JheSkKLQkJUWQuUGVuTW9kZShzcmNYb3IpCi0JCSMgaG93IGZhciBkbyB3ZSBoYXZlIHRvIHNjcm9sbD8KLQkJZGlzdGFuY2UgPSBzZWxmLmxpc3RzWzFdLnJlY3RbMF0gLSBzZWxmLmxpc3RzWzBdLnJlY3RbMF0KLQkJc3RlcCA9IDMwCi0JCWxhc3R0aW1lID0gdGltZS5jbG9jaygpCSMgZm9yIGRlbGF5Ci0JCSMgZG8gaXQKLQkJZm9yIGkgaW4gcmFuZ2UoMCwgZGlzdGFuY2UsIHN0ZXApOgotCQkJaWYgaSA8PiAwOgotCQkJCVFkLkZyYW1lUmduKG15bGFzdHJlZ2lvbikJIyBlcmFzZSBsYXN0IHJlZ2lvbgotCQkJCVFkLk9mZnNldFJnbihteWxhc3RyZWdpb24sIHN0ZXAgKiBsZWZ0cmlnaHQsIDApCi0JCQkjIGRyYXcgZ3JheSByZWdpb24KLQkJCVFkLkZyYW1lUmduKG15cmVnaW9uKQotCQkJUWQuT2Zmc2V0UmduKG15cmVnaW9uLCBzdGVwICogbGVmdHJpZ2h0LCAwKQotCQkJd2hpbGUgdGltZS5jbG9jaygpIC0gbGFzdHRpbWUgPCAwLjA1OgotCQkJCXBhc3MJIyBkZWxheQotCQkJbGFzdHRpbWUgPSB0aW1lLmNsb2NrKCkKLQkJIyBjbGVhbiB1cCBhZnRlciB5b3VyIGRvZwotCQlRZC5GcmFtZVJnbihteWxhc3RyZWdpb24pCi0JCVFkLlNldFBlblN0YXRlKHNhdmUpCi0JCi0JZGVmIHJlc2V0KHNlbGYpOgotCQlmb3IgbGlzdCBpbiBzZWxmLmxpc3RzOgotCQkJcG9pbnQgPSAoMCwwKQotCQkJb2ssIHBvaW50ID0gbGlzdC5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCQlpZiBvazoKLQkJCQlzZWwgPSBsaXN0LmtleWxpc3RbcG9pbnRbMV1dCi0JCQlsaXN0LnNldGNvbnRlbnQobGlzdC5jb250ZW50LCBsaXN0LnRpdGxlKQotCQkJaWYgb2s6Ci0JCQkJbGlzdC5saXN0LkxTZXRTZWxlY3QoMSwgKDAsIGxpc3Qua2V5bGlzdC5pbmRleChzZWwpKSkKLQkJCQlsaXN0Lmxpc3QuTEF1dG9TY3JvbGwoKQotCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSBpbiBzZWxmLmxpc3RpdGVtczoKLQkJCXNlbGYuZG9fbGlzdGhpdChldmVudCwgaXRlbSkKLQkJZWxpZiBpdGVtID09IE1BSU5fTEVGVDoKLQkJCXNlbGYuZG9fbGVmdGJ1dHRvbigpCi0JCWVsaWYgaXRlbSA9PSBNQUlOX1JJR0hUOgotCQkJc2VsZi5kb19yaWdodGJ1dHRvbigpCi0JCWVsaWYgaXRlbSA9PSBNQUlOX0NMT1NFOgotCQkJc2VsZi5jbG9zZSgpCi0JCWVsaWYgaXRlbSA9PSBNQUlOX1JFU0VUOgotCQkJc2VsZi5yZXNldCgpCi0KLSMgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHNob3J0IHN0cmluZyBjb250YWluaW5nIHRoZSB0eXBlIG9mIGFuIGFyYml0cmFyeSBvYmplY3QKLSMgZWc6IGNsZWFudHlwZSgid2F0IGlzIGRpdCBudSB3ZWVyPyIpIC0+ICcoc3RyaW5nKScKLWRlZiBjbGVhbnR5cGUob2JqKToKLQkjIHR5cGUoKSB0eXBpY2FsbHkgcmV0dXJucyBzb21ldGhpbmcgbGlrZTogPHR5cGUgJ3N0cmluZyc+Ci0JaXRlbXMgPSBzdHJpbmcuc3BsaXQoc3RyKHR5cGUob2JqKSksICInIikKLQlpZiBsZW4oaXRlbXMpID09IDM6Ci0JCXJldHVybiAnKCcgKyBpdGVtc1sxXSArICcpJwotCWVsc2U6Ci0JCSMganVzdCBpbiBjYXNlLCBJIGRvbid0IGtub3cuCi0JCXJldHVybiBzdHIodHlwZShvYmopKQotCQotIyBoZWxwZXIgZm9yIFZhckJyb3dzZXIuc2Nyb2xsCi1kZWYgQWRkUmVjdDJSZ24odGhlUmVjdCwgdGhlUmduKToKLQlyUmduID0gUWQuTmV3UmduKCkKLQlRZC5SZWN0UmduKHJSZ24sIHRoZVJlY3QpCi0JUWQuVW5pb25SZ24oclJnbiwgdGhlUmduLCB0aGVSZ24pCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC90d2l0L21hY3R3aXRfZWRpdC5weSBiL01hYy9VbnN1cHBvcnRlZC90d2l0L21hY3R3aXRfZWRpdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlMjUzZC4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X2VkaXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0iIiJFZGl0IGEgZmlsZSB1c2luZyB0aGUgTWV0cm9XZXJrcyBlZGl0b3IuIE1vZGlmeSB0byBzdWl0IHlvdXIgbmVlZHMiIiIKLSAKLWltcG9ydCBNYWNPUwotaW1wb3J0IGFldG9vbHMKLWltcG9ydCBNZXRyb3dlcmtzX1NoZWxsX1N1aXRlCi1pbXBvcnQgUmVxdWlyZWRfU3VpdGUKLSAKLV90YWxrZXIgPSBOb25lCi0gCi1jbGFzcyBNV1NoZWxsKGFldG9vbHMuVGFsa1RvLCAKLSAJCQkJTWV0cm93ZXJrc19TaGVsbF9TdWl0ZS5NZXRyb3dlcmtzX1NoZWxsX1N1aXRlLAotIAkJCQlSZXF1aXJlZF9TdWl0ZS5SZXF1aXJlZF9TdWl0ZSk6Ci0JcGFzcwotIAotZGVmIGVkaXQoZmlsZSwgbGluZSk6Ci0JZ2xvYmFsIF90YWxrZXIKLQlpZiBfdGFsa2VyID09IE5vbmU6Ci0JCV90YWxrZXIgPSBNV1NoZWxsKCdDV0lFJywgc3RhcnQ9MSkKLQl0cnk6Ci0JCV90YWxrZXIub3BlbihmaWxlKQotCQlfdGFsa2VyLkdvdG9fTGluZShsaW5lKQotCWV4Y2VwdCAiKE1hY09TLkVycm9yLCBhZXRvb2xzLkVycm9yKSI6Ci0JCXBhc3MKLSAJCmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X21vZC5weSBiL01hYy9VbnN1cHBvcnRlZC90d2l0L21hY3R3aXRfbW9kLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGNlMTdkLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC90d2l0L21hY3R3aXRfbW9kLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgQSBzdGFiIGF0IGEgcHl0aG9uIGRlYnVnZ2VyCi1pbXBvcnQgUmVzCi1pbXBvcnQgUWQKLWltcG9ydCBEbGcKLWltcG9ydCBXaW4KLWltcG9ydCBGcmFtZVdvcmsKLWltcG9ydCBFYXN5RGlhbG9ncwotaW1wb3J0IHN5cwotaW1wb3J0IFR3aXRDb3JlCi1mcm9tIG1hY193aWRnZXRzIGltcG9ydCBNVF9BbnlMaXN0LCBNVF9JY29uVGV4dFdpZGdldAotCi0jIE91ciBkaWFsb2dzCi1JRF9NT0RVTEVTPTUwMAotSV9NT0RVTEVTX1RJVExFPTEKLUlfTU9EVUxFUz0yCi1JX1ZBUlNfVElUTEU9MwotSV9WQVJTPTQKLUlfU09VUkNFX1RJVExFPTUKLUlfU09VUkNFPTYKLUlfUlVMRVI9NwotSV9FRElUPTgKLQotY2xhc3MgTW9kdWxlQnJvd3NlcihGcmFtZVdvcmsuRGlhbG9nV2luZG93LCBUd2l0Q29yZS5Nb2R1bGVCcm93c2VyKToKLQkiIiJUaGUgbW9kdWxlLWJyb3dzZXIgZGlhbG9nIC0gbWFjLWRlcGVuZGVudCBwYXJ0IiIiCi0JZGVmIG9wZW4oc2VsZiwgbW9kdWxlKToKLQkJRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01PRFVMRVMpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCVFkLlRleHRGb250KDMpCi0JCVFkLlRleHRTaXplKDkpCi0KLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfTU9EVUxFUykKLQkJc2VsZi5tb2R1bGVzID0gTVRfQW55TGlzdChzZWxmLndpZCwgcmVjdCwgMSkKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfVkFSUykKLQkJc2VsZi52YXJzID0gTVRfQW55TGlzdChzZWxmLndpZCwgcmVjdCwgMikKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfU09VUkNFKQotCQlzZWxmLnNvdXJjZSA9IE1UX0ljb25UZXh0V2lkZ2V0KHNlbGYud2lkLCByZWN0KQotCi0JCXNlbGYubWlfb3Blbihtb2R1bGUpCi0JCQotCWRlZiBzZXRzb3VyY2Uoc2VsZiwgbXNnKToKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfU09VUkNFX1RJVExFKQotCQlpZiBzZWxmLmN1cl9zb3VyY2U6Ci0JCQlEbGcuU2V0RGlhbG9nSXRlbVRleHQoaCwgc2VsZi5jdXJfc291cmNlKQotCQllbHNlOgotCQkJRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIG1zZykKLQkJc2VsZi5zb3VyY2Uuc2V0Y29udGVudChzZWxmLmN1cl9zb3VyY2UpCi0KLQlkZWYgc291cmNlX3NldGJyZWFrcyhzZWxmLCBsaXN0KToKLQkJc2VsZi5zb3VyY2Uuc2V0YnJlYWtzKGxpc3QpCi0JCQotCWRlZiBzb3VyY2Vfc2V0bGluZShzZWxmLCBsaW5lbm8sIGljb24pOgotCQlzZWxmLnNvdXJjZS5zZXRjdXJsaW5lKGxpbmVubywgaWNvbikKLQkJCi0JZGVmIHNvdXJjZV9zZWxlY3Qoc2VsZiwgbGluZW5vKToKLQkJc2VsZi5zb3VyY2Uuc2VsZWN0KGxpbmVubykKLQotCWRlZiBzZXRtb2R1bGVuYW1lcyhzZWxmKToKLQkJc2VsZi5tb2R1bGVzLnNldGNvbnRlbnQoc2VsZi5jb250X21vZHVsZXMpCi0KLQlkZWYgbW9kdWxlX3NlbGVjdChzZWxmLCBudW1iZXIpOgotCQlzZWxmLm1vZHVsZXMuc2VsZWN0KG51bWJlcikKLQotCWRlZiBzZXR2YXJzKHNlbGYpOgotCQlzZWxmLnZhcnMuc2V0Y29udGVudChzZWxmLmNvbnRfdmFybmFtZXMsIHNlbGYuY29udF92YXJ2YWx1ZXMpCi0JCQkJCi0JZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQl3aGVyZSA9IFFkLkdsb2JhbFRvTG9jYWwod2hlcmUpCi0JCQotCQlpZiBpdGVtID09IElfTU9EVUxFUzoKLQkJCW5ld19tb2R1bGUsIGRvdWJsZSA9IHNlbGYubW9kdWxlcy5jbGljayh3aGVyZSwgMCkKLQkJCXNlbGYuY2xpY2tfbW9kdWxlKG5ld19tb2R1bGUpCi0JCWVsaWYgaXRlbSA9PSBJX1ZBUlM6Ci0JCQluZXdfdmFyLCBkb3VibGUgPSBzZWxmLnZhcnMuY2xpY2sod2hlcmUsIDApCi0JCQlpZiBkb3VibGU6Ci0JCQkJc2VsZi5jbGlja192YXIobmV3X3ZhcikKLQkJZWxpZiBpdGVtID09IElfU09VUkNFOgotCQkJbGluZW5vLCBpbmJvcmRlciA9IHNlbGYuc291cmNlLmNsaWNrKHdoZXJlLCAwKQotCQkJaWYgbGluZW5vIDw+IE5vbmUgYW5kIGxpbmVubyA+PSAwOgotCQkJCXNlbGYuY2xpY2tfc291cmNlKGxpbmVubywgaW5ib3JkZXIpCi0JCWVsaWYgaXRlbSA9PSBJX0VESVQ6Ci0JCQlzZWxmLmNsaWNrX2VkaXQoKQotCQotCWRlZiBkb19yYXd1cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXJnbiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfUlVMRVIpCi0JCVFkLk1vdmVUbyhyZWN0WzBdLCByZWN0WzFdKQotCQlRZC5MaW5lVG8ocmVjdFsyXSwgcmVjdFsxXSkKLQkJc2VsZi5tb2R1bGVzLnVwZGF0ZShyZ24pCi0JCXNlbGYudmFycy51cGRhdGUocmduKQotCQlzZWxmLnNvdXJjZS51cGRhdGUocmduKQotCQkKLQlkZWYgZm9yY2VfcmVkcmF3KHNlbGYpOgotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlzZWxmLndpZC5JbnZhbFdpbmRvd1JnbihzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQkKLQlkZWYgZG9fYWN0aXZhdGUoc2VsZiwgYWN0aXZhdGUsIGV2ZW50KToKLQkJc2VsZi5tb2R1bGVzLmFjdGl2YXRlKGFjdGl2YXRlKQotCQlzZWxmLnZhcnMuYWN0aXZhdGUoYWN0aXZhdGUpCi0JCXNlbGYuc291cmNlLmFjdGl2YXRlKGFjdGl2YXRlKQotCQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYucGFyZW50Lm1vZHVsZV9kaWFsb2cgPSBOb25lCi0JCXNlbGYuc291cmNlLmNsb3NlKCkKLQkJZGVsIHNlbGYubW9kdWxlcwotCQlkZWwgc2VsZi52YXJzCi0JCWRlbCBzZWxmLnNvdXJjZQotCQlzZWxmLmRvX3Bvc3RjbG9zZSgpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCmRpZmYgLS1naXQgYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X3N0YWNrLnB5IGIvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvbWFjdHdpdF9zdGFjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNmIxNC4uMDAwMDAwMAotLS0gYS9NYWMvVW5zdXBwb3J0ZWQvdHdpdC9tYWN0d2l0X3N0YWNrLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSMgQSBzdGFiIGF0IGEgcHl0aG9uIGRlYnVnZ2VyCi1pbXBvcnQgUmVzCi1pbXBvcnQgUWQKLWltcG9ydCBEbGcKLWltcG9ydCBXaW4KLWltcG9ydCBGcmFtZVdvcmsKLWltcG9ydCBFYXN5RGlhbG9ncwotaW1wb3J0IHN5cwotaW1wb3J0IFR3aXRDb3JlCi1mcm9tIG1hY193aWRnZXRzIGltcG9ydCBNVF9BbnlMaXN0LCBNVF9JbmRleExpc3QsIE1UX0ljb25UZXh0V2lkZ2V0Ci0KLSMgT3VyIGRpYWxvZ3MKLUlEX1NUQUNLPTUwMQotSV9TVEFDS19USVRMRT0xCi1JX1NUQUNLPTIKLUlfVkFSU19USVRMRT0zCi1JX1ZBUlM9NAotSV9TT1VSQ0VfVElUTEU9NQotSV9TT1VSQ0U9NgotSV9FWENfVElUTEU9NwotSV9FWEM9OAotSV9FWENWQUxVRV9USVRMRT05Ci1JX0VYQ1ZBTFVFPTEwCi1JX0JST1dTRT0xMQotSV9SVUxFUjE9MTIKLUlfUlVMRVIyPTEzCi1JX1NUQVRFX1RJVExFPTE0Ci1JX1NUQVRFPTE1Ci1JX1NIT1dfQ09NUExFWD0xNgotSV9TSE9XX1NZU1RFTT0xNwotSV9FRElUPTE4Ci0KLWNsYXNzIFN0YWNrQnJvd3NlcihGcmFtZVdvcmsuRGlhbG9nV2luZG93LCBUd2l0Q29yZS5TdGFja0Jyb3dzZXIpOgotCSIiIlRoZSBzdGFjay1icm93c2VyIGRpYWxvZyAtIG1hYy1kZXBlbmRlbnQgcGFydCIiIgotCWRlZiBvcGVuKHNlbGYpOgotCQlGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfU1RBQ0spCi0JCXNlbGYuU2V0UG9ydCgpCi0JCVFkLlRleHRGb250KDMpCi0JCVFkLlRleHRTaXplKDkpCi0KLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfU1RBQ0spCi0JCXNlbGYuc3RhY2sgPSBNVF9JbmRleExpc3Qoc2VsZi53aWQsIHJlY3QsIDIpCi0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX1ZBUlMpCi0JCXNlbGYudmFycyA9IE1UX0FueUxpc3Qoc2VsZi53aWQsIHJlY3QsIDIpCi0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX1NPVVJDRSkKLQkJc2VsZi5zb3VyY2UgPSBNVF9JY29uVGV4dFdpZGdldChzZWxmLndpZCwgcmVjdCkKLQotCQlzZWxmLm1pX29wZW4oKQotCQkKLQlkZWYgc2V0c291cmNlKHNlbGYsIG1zZyk6Ci0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX1NPVVJDRV9USVRMRSkKLQkJaWYgc2VsZi5jdXJfc291cmNlOgotCQkJRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIHNlbGYuY3VyX3NvdXJjZSkKLQkJZWxzZToKLQkJCURsZy5TZXREaWFsb2dJdGVtVGV4dChoLCBtc2cpCi0JCXNlbGYuc291cmNlLnNldGNvbnRlbnQoc2VsZi5jdXJfc291cmNlKQotCQkKLQlkZWYgc291cmNlX3NldGJyZWFrcyhzZWxmLCBsaXN0KToKLQkJc2VsZi5zb3VyY2Uuc2V0YnJlYWtzKGxpc3QpCi0JCQotCWRlZiBzb3VyY2Vfc2V0bGluZShzZWxmLCBsaW5lbm8sIGljb24pOgotCQlzZWxmLnNvdXJjZS5zZXRjdXJsaW5lKGxpbmVubywgaWNvbikKLQkJCi0JZGVmIHNvdXJjZV9zZWxlY3Qoc2VsZiwgbGluZW5vKToKLQkJc2VsZi5zb3VyY2Uuc2VsZWN0KGxpbmVubykKLQotCWRlZiBzdGFja19zZXRjb250ZW50KHNlbGYsIG5hbWVzLCBsb2NhdGlvbnMpOgotCQlzZWxmLnN0YWNrLnNldGNvbnRlbnQobmFtZXMsIGxvY2F0aW9ucykKLQotCWRlZiBzdGFja19zZWxlY3Qoc2VsZiwgbnVtYmVyKToKLQkJc2VsZi5zdGFjay5zZWxlY3QobnVtYmVyKQotCQkKLQlkZWYgc2V0dmFycyhzZWxmKToKLQkJc2VsZi52YXJzLnNldGNvbnRlbnQoc2VsZi5jb250X3Zhcm5hbWVzLCBzZWxmLmNvbnRfdmFydmFsdWVzKQotCQkKLQlkZWYgc2V0ZXhjZXB0aW9uKHNlbGYsIG5hbWUsIHZhbHVlKToKLQkJaWYgbmFtZSA9PSBOb25lOgotCQkJc2VsZi53aWQuSGlkZURpYWxvZ0l0ZW0oSV9FWEMpCi0JCQlzZWxmLndpZC5IaWRlRGlhbG9nSXRlbShJX0VYQ19USVRMRSkKLQkJCXZhbHVlID0gTm9uZQotCQllbHNlOgotCQkJc2VsZi53aWQuU2hvd0RpYWxvZ0l0ZW0oSV9FWEMpCi0JCQlzZWxmLndpZC5TaG93RGlhbG9nSXRlbShJX0VYQ19USVRMRSkKLQkJCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX0VYQykKLQkJCURsZy5TZXREaWFsb2dJdGVtVGV4dChoLCBuYW1lKQotCQlpZiB2YWx1ZSA9PSBOb25lOgotCQkJc2VsZi53aWQuSGlkZURpYWxvZ0l0ZW0oSV9FWENWQUxVRSkKLQkJCXNlbGYud2lkLkhpZGVEaWFsb2dJdGVtKElfRVhDVkFMVUVfVElUTEUpCi0JCWVsc2U6Ci0JCQlzZWxmLndpZC5TaG93RGlhbG9nSXRlbShJX0VYQ1ZBTFVFKQotCQkJc2VsZi53aWQuU2hvd0RpYWxvZ0l0ZW0oSV9FWENWQUxVRV9USVRMRSkKLQkJCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX0VYQ1ZBTFVFKQotCQkJRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIHZhbHVlKQotCQkKLQlkZWYgc2V0cHJvZ3JhbXN0YXRlKHNlbGYsIG1zZyk6Ci0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX1NUQVRFKQotCQlEbGcuU2V0RGlhbG9nSXRlbVRleHQoaCwgbXNnKQotCQkKLQlkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXdoZXJlID0gUWQuR2xvYmFsVG9Mb2NhbCh3aGVyZSkKLQkJCQkKLQkJaWYgaXRlbSA9PSBJX1NUQUNLOgotCQkJbmV3X3N0YWNraXRlbSwgZG91YmxlID0gc2VsZi5zdGFjay5jbGljayh3aGVyZSwgMCkKLQkJCXNlbGYuY2xpY2tfc3RhY2sobmV3X3N0YWNraXRlbSkKLQkJZWxpZiBpdGVtID09IElfVkFSUzoKLQkJCW5ld192YXIsIGRvdWJsZSA9IHNlbGYudmFycy5jbGljayh3aGVyZSwgMCkKLQkJCWlmIGRvdWJsZToKLQkJCQlzZWxmLmNsaWNrX3ZhcihuZXdfdmFyKQotCQllbGlmIGl0ZW0gPT0gSV9TT1VSQ0U6Ci0JCQlsaW5lbm8sIGluYm9yZGVyID0gc2VsZi5zb3VyY2UuY2xpY2sod2hlcmUsIDApCi0JCQlpZiBsaW5lbm8gPD4gTm9uZSBhbmQgbGluZW5vID49IDA6Ci0JCQkJc2VsZi5jbGlja19zb3VyY2UobGluZW5vLCBpbmJvcmRlcikKLQkJZWxpZiBpdGVtID09IElfQlJPV1NFOgotCQkJc2VsZi5jbGlja19icm93c2UoKQotCQllbGlmIGl0ZW0gPT0gSV9TSE9XX0NPTVBMRVg6Ci0JCQlzZWxmLnNob3dfY29tcGxleCA9IG5vdCBzZWxmLnNob3dfY29tcGxleAotCQkJc2VsZi5zZXR1cF9mcmFtZSgpCi0JCWVsaWYgaXRlbSA9PSBJX1NIT1dfU1lTVEVNOgotCQkJc2VsZi5zaG93X3N5c3RlbSA9IG5vdCBzZWxmLnNob3dfc3lzdGVtCi0JCQlzZWxmLnNldHVwX2ZyYW1lKCkKLQkJZWxpZiBpdGVtID09IElfRURJVDoKLQkJCXNlbGYuY2xpY2tfZWRpdCgpCi0JCQkKLQlkZWYgc2V0X3Zhcl9idXR0b25zKHNlbGYpOgotCQl0cCwgaCwgcmVjdCA9IHNlbGYud2lkLkdldERpYWxvZ0l0ZW0oSV9TSE9XX0NPTVBMRVgpCi0JCWguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZShzZWxmLnNob3dfY29tcGxleCkKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfU0hPV19TWVNURU0pCi0JCWguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZShzZWxmLnNob3dfc3lzdGVtKQotCQotCWRlZiBkb19yYXd1cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6Ci0JCVFkLlNldFBvcnQoc2VsZi53aWQpCi0JCXJnbiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJdHAsIGgsIHJlY3QgPSBzZWxmLndpZC5HZXREaWFsb2dJdGVtKElfUlVMRVIxKQotCQlRZC5Nb3ZlVG8ocmVjdFswXSwgcmVjdFsxXSkKLQkJUWQuTGluZVRvKHJlY3RbMl0sIHJlY3RbMV0pCi0JCXRwLCBoLCByZWN0ID0gc2VsZi53aWQuR2V0RGlhbG9nSXRlbShJX1JVTEVSMikKLQkJUWQuTW92ZVRvKHJlY3RbMF0sIHJlY3RbMV0pCi0JCVFkLkxpbmVUbyhyZWN0WzJdLCByZWN0WzFdKQotCQlzZWxmLnN0YWNrLnVwZGF0ZShyZ24pCi0JCXNlbGYudmFycy51cGRhdGUocmduKQotCQlzZWxmLnNvdXJjZS51cGRhdGUocmduKQotCi0JZGVmIGZvcmNlX3JlZHJhdyhzZWxmKToKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJc2VsZi53aWQuSW52YWxXaW5kb3dSZ24oc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIGFjdGl2YXRlLCBldmVudCk6Ci0JCXNlbGYuc3RhY2suYWN0aXZhdGUoYWN0aXZhdGUpCi0JCXNlbGYudmFycy5hY3RpdmF0ZShhY3RpdmF0ZSkKLQkJc2VsZi5zb3VyY2UuYWN0aXZhdGUoYWN0aXZhdGUpCi0JCQkJCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLnNvdXJjZS5jbG9zZSgpCi0JCWRlbCBzZWxmLnN0YWNrCi0JCWRlbCBzZWxmLnZhcnMKLQkJZGVsIHNlbGYuc291cmNlCi0JCXNlbGYuZG9fcG9zdGNsb3NlKCkKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC90d2l0L3R3aXQucHkgYi9NYWMvVW5zdXBwb3J0ZWQvdHdpdC90d2l0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2MzZjQxLi4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC90d2l0L3R3aXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0iIiJ0d2l0IC0gVGhlIFdpbmRvdy1JbmRlcGVuZGVudCBUcmFjZXIuCi0KLUludGVyZmFjZToKLXR3aXQubWFpbigpCQkJCQkJRW50ZXIgZGVidWdnZXIgaW4gaW5hY3RpdmUgaW50ZXJhY3RpdmUgc3RhdGUKLXR3aXQucnVuKHN0bXQsIGdsb2JhbHMsIGxvY2FscykJRW50ZXIgZGVidWdnZXIgYW5kIHN0YXJ0IHJ1bm5pbmcgc3RtdAotdHdpdC5wb3N0X21vcnRlbSh0cmFjZWJhY2spCQlFbnRlciBkZWJ1Z2dlciBpbiBwb3N0LW1vcnRlbSBtb2RlIG9uIHRyYWNlYmFjawotdHdpdC5wbSgpCQkJCQkJRW50ZXIgZGVidWdnZXIgaW4gcG0tbW9kZSBvbiBzeXMubGFzdF90cmFjZWJhY2sKLQotbWFpbiBwcm9ncmFtOiBub3RoaW5nIGJ1dCBhIGJpdCBvZiBnbHVlIHRvIHB1dCBpdCBhbGwgdG9nZXRoZXIuCi0KLUphY2sgSmFuc2VuLCBDV0ksIEF1Z3VzdCAxOTk2LiIiIgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotIyBBZGQgb3VyIGRpcmVjdG9yeSB0byBwYXRoLCBpZiBuZWVkZWQKLWRpcm5hbWUgPSBvcy5wYXRoLnNwbGl0KF9fZmlsZV9fKVswXQotaWYgbm90IGRpcm5hbWUgaW4gc3lzLnBhdGg6Ci0Jc3lzLnBhdGguYXBwZW5kKGRpcm5hbWUpCi0KLWlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0JaW1wb3J0IE1hY09TCi0JTWFjT1Muc3BsYXNoKDUwMikJIyBUcnkgdG8gc2hvdyB0aGUgc3BsYXNoIHNjcmVlbgotCWltcG9ydCBtYWN0d2l0X2FwcDsgdHdpdF9hcHAgPSBtYWN0d2l0X2FwcAotZWxzZToKLQl0cnk6Ci0JCWltcG9ydCBfdGtpbnRlcgotCQloYXZlX3RrID0gMQotCWV4Y2VwdCBJbXBvcnRFcnJvcjoKLQkJaGF2ZV90ayA9IDAKLQlpZiBoYXZlX3RrOgotCQlpbXBvcnQgdGt0d2l0X2FwcDsgdHdpdF9hcHAgPSB0a3R3aXRfYXBwCi0JZWxzZToKLQkJcHJpbnQgJ1BsZWFzZSBpbXBsZW1lbnRlbnQgbWFjaGluZS1kZXBlbmRlbnQgY29kZSBhbmQgdHJ5IGFnYWluOi0pJwotCQlzeXMuZXhpdCgxKQotCQotaW1wb3J0IHN5cwotCQotZGVmIG1haW4oKToKLQl0d2l0X2FwcC5Jbml0aWFsaXplKCkKLQlpZiBvcy5uYW1lID09ICdtYWMnOgotCQlNYWNPUy5zcGxhc2goKQotCXR3aXRfYXBwLlR3aXQoJ25vbmUnLCBOb25lKQotCQotZGVmIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpOgotCXR3aXRfYXBwLkluaXRpYWxpemUoKQotCXR3aXRfYXBwLlR3aXQoJ3J1bicsIChzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscykpCi0KLWRlZiBwb3N0X21vcnRlbSh0KToKLQlJbml0aWFsaXplKCkKLQl0d2l0X2FwcC5Ud2l0KCdwbScsIHQpCi0JCi1kZWYgcG0oKToKLQlwb3N0X21vcnRlbShzeXMubGFzdF90cmFjZWJhY2spCi0JCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQotCQpkaWZmIC0tZ2l0IGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvdHdpdC5yc3JjIGIvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvdHdpdC5yc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIxYzU3Li4wMDAwMDAwCi0tLSBhL01hYy9VbnN1cHBvcnRlZC90d2l0L3R3aXQucnNyYworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9VbnN1cHBvcnRlZC90d2l0L3R3aXR0ZXN0LnB5IGIvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvdHdpdHRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDM2OTMuLjAwMDAwMDAKLS0tIGEvTWFjL1Vuc3VwcG9ydGVkL3R3aXQvdHdpdHRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIFRlc3QgcHJvZ3JhbQotCi1kZWYgZm9vKGFyZzEsIGFyZzIpOgotCWJhcihhcmcxK2FyZzIpCi0JYmFyKGFyZzEtYXJnMikKLQlmb28oYXJnMSsxLCBhcmcyLTEpCi0JCi1kZWYgYmFyKGFyZyk6Ci0JcnYgPSAxMC9hcmcKLQlwcmludCBydgotCQotZm9vKDAsMTApCi0K