LyoKICogc3lzdGVtLmMKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIFN5c3RlbSBkZXBlbmRlbnQgcm91dGluZXMgZ28gaGVyZQogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZiBIQVZFX0lPX0gKI2luY2x1ZGUgPGlvLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFQ1RfSAojaW5jbHVkZSA8ZGlyZWN0Lmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9ORVREQl9ICiNpbmNsdWRlIDxuZXRkYi5oPgojZW5kaWYKCgojaWYgSEFWRV9TWVNfU09DS0lPX0gKI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfTkxJU1RfSAojaW5jbHVkZSA8bmxpc3QuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKCiNpZiBIQVZFX0tTVEFUX0gKI2luY2x1ZGUgPGtzdGF0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9GQ05UTF9ICiNpbmNsdWRlIDxmY250bC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiNpbmNsdWRlIDxzeXMvcHN0YXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfVVRTTkFNRV9ICiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1DRkdfSAojaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1JTkZPX0gKI2luY2x1ZGUgPHN5cy9zeXN0ZW1pbmZvLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoZGFyd2luOSkKI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+ICAgICAgICAvKiBmb3IgX05TR2V0QXJndigpICovCiNlbmRpZgoKI2lmIEhBVkVfUFdEX0gKI2luY2x1ZGUgPHB3ZC5oPgojZW5kaWYKI2lmIEhBVkVfR1JQX0gKI2luY2x1ZGUgPGdycC5oPgojZW5kaWYKCiNpZiBIQVZFX0xJTUlUU19ICiNpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiNpZiAxIC8qSEFWRV9BUlBBX05BTUVTRVJfSCovCiNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KI2VuZGlmCiNpbmNsdWRlIDx2YWxpZGF0b3IvdmFsaWRhdG9yLmg+Ci8qIE5ldFNOTVAgYW5kIEROU1NFQy1Ub29scyBib3RoIGRlZmluZSBGUkVFLiBXZSdsbCBub3QgdXNlIGVpdGhlciBoZXJlLiAqLwojdW5kZWYgRlJFRQojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3N5c3RlbS5oPiAgICAvKiBmb3IgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcmVhZF9jb25maWcuaD4gLyogZm9yIGdldF90ZW1wX2ZpbGVfcGF0dGVybigpICovCgojaW5jbHVkZSAiaW5ldF9udG9wLmgiCgovKiBOZXRTTk1QIGFuZCBETlNTRUMtVG9vbHMgYm90aCBkZWZpbmUgRlJFRS4gV2UnbGwgbm90IHVzZSBlaXRoZXIgaGVyZS4gKi8KI3VuZGVmIEZSRUUKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzeXN0ZW1fYWxsLCBsaWJuZXRzbm1wKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHVzZXJfaW5mb3JtYXRpb24sIHN5c3RlbV9hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihjYWxjdWxhdGVfc2VjdGltZV9kaWZmLCBzeXN0ZW1fYWxsKQoKI2lmbmRlZiBJRkZfTE9PUEJBQ0sKIwlkZWZpbmUgSUZGX0xPT1BCQUNLIDAKI2VuZGlmCgojaWZkZWYgIElOQUREUl9MT09QQkFDSwojIGRlZmluZSBMT09QQkFDSyAgICBJTkFERFJfTE9PUEJBQ0sKI2Vsc2UKIyBkZWZpbmUgTE9PUEJBQ0sgICAgMHg3ZjAwMDAwMQojZW5kaWYKCiNpZm5kZWYgRUFJX0ZBSUwKIyBkZWZpbmUgRUFJX0ZBSUwgICAgLTQgICAgLyogTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXMuICAqLwojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfRk9SSykKc3RhdGljIHZvaWQKX2RhZW1vbl9wcmVwKGludCBzdGRlcnJfbG9nKQp7CiAgICAvKiBBdm9pZCBrZWVwaW5nIGFueSBkaXJlY3RvcnkgaW4gdXNlLiAqLwogICAgY2hkaXIoIi8iKTsKCiAgICBpZiAoc3RkZXJyX2xvZykKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIENsb3NlIGluaGVyaXRlZCBmaWxlIGRlc2NyaXB0b3JzIHRvIGF2b2lkCiAgICAgKiBrZWVwaW5nIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMuCiAgICAgKi8KICAgIGNsb3NlKDApOwogICAgY2xvc2UoMSk7CiAgICBjbG9zZSgyKTsKCiAgICAvKgogICAgICogUmVkaXJlY3Qgc3Rke2luLG91dCxlcnJ9IHRvIC9kZXYvbnVsbCwganVzdCBpbiBjYXNlLgogICAgICovCiAgICBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOwogICAgZHVwKDApOwogICAgZHVwKDApOwp9CiNlbmRpZgoKLyoqCiAqIGZvcmsgY3VycmVudCBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZm9ya3MgYSBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQsIGluIG9yZGVyIHRvCiAqIGJlY29tZSBhIGRhZW1vbiBwcm9jZXNzLiBJdCBkb2VzIGEgZmV3IHRoaW5ncyBhbG9uZyB0aGUgd2F5OgogKgogKiAtIGJlY29taW5nIGEgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciwgYW5kICBmb3JraW5nIGEgc2Vjb25kIHRpbWUgc28KICogICB0aGF0IHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgY2FuIGV4aXQuCiAqCiAqIC0gY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIC8KICoKICogLSBjbG9zaW5nIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciAodW5sZXNzIHN0ZGVycl9sb2cgaXMgc2V0KSBhbmQKICogICByZWRpcmVjdGluZyB0aGVtIHRvIC9kZXYvbnVsbAogKgogKiBAcGFyYW0gcXVpdF9pbW1lZGlhdGVseSA6IGluZGljYXRlcyBpZiB0aGUgcGFyZW50IHByb2Nlc3Mgc2hvdWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCBhZnRlciBhIHN1Y2Nlc3NmdWwgZm9yay4KICogQHBhcmFtIHN0ZGVycl9sb2cgICAgICAgOiBpbmRpY2F0ZXMgaWYgc3RkZXJyIGlzIGJlaW5nIHVzZWQgZm9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBhbmQgc2hvdWxkbid0IGJlIGNsb3NlZAogKiBAcmV0dXJucyAtMSA6IGZvcmsgZXJyb3IKICogICAgICAgICAgIDAgOiBjaGlsZCBwcm9jZXNzIHJldHVybmluZwogKiAgICAgICAgICA+MCA6IHBhcmVudCBwcm9jZXNzIHJldHVybmluZy4gcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGNoaWxkIFBJRC4KICovCmludApuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpCnsKICAgIGludCBpID0gMDsKICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImRlYW1vbml6aW5nLi4uXG4iKSk7CiNpZiBIQVZFX0ZPUksKI2lmIGRlZmluZWQoZGFyd2luOSkKICAgICBjaGFyICAgICAgICAgICAgcGF0aCBbUEFUSF9NQVhdID0gIiI7CiAgICAgdWludDMyX3QgICAgICAgIHNpemUgPSBzaXplb2YgKHBhdGgpOwoKICAgICAvKgogICAgICAqIGlmIHdlIGFyZSBhbHJlYWR5IGxhdW5jaGVkIGluIGEgImRhZW1vbml6ZWQgc3RhdGUiLCBqdXN0CiAgICAgICogY2xvc2UgJiByZWRpcmVjdCB0aGUgZmlsZSBkZXNjcmlwdG9ycwogICAgICAqLwogICAgIGlmKGdldHBwaWQoKSA8PSAyKSB7CiAgICAgICAgIF9kYWVtb25fcHJlcChzdGRlcnJfbG9nKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQoKICAgICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGggKHBhdGgsICZzaXplKSkKICAgICAgICAgcmV0dXJuIC0xOwojZW5kaWYKICAgIC8qCiAgICAgKiBGb3JrIHRvIHJldHVybiBjb250cm9sIHRvIHRoZSBpbnZva2luZyBwcm9jZXNzIGFuZCB0bwogICAgICogZ3VhcmFudGVlIHRoYXQgd2UgYXJlbid0IGEgcHJvY2VzcyBncm91cCBsZWFkZXIuCiAgICAgKi8KICAgIGkgPSBmb3JrKCk7CiAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImZpcnN0IGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgaWYoaSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJmaXJzdCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgIm5ldHNubXBfZGFlbW9uaXplKClcbiIsIGVycm5vKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAocXVpdF9pbW1lZGlhdGVseSkgewogICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJwYXJlbnQgZXhpdGluZ1xuIikpOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ2hpbGQuICovCiNpZmRlZiBIQVZFX1NFVFNJRAogICAgICAgIC8qIEJlY29tZSBhIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIuICovCiAgICAgICAgc2V0c2lkKCk7CiNlbmRpZgogICAgICAgIC8qCiAgICAgICAgICogRm9yayB0byBsZXQgdGhlIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgZXhpdC4KICAgICAgICAgKi8KICAgICAgICBpZiAoKGkgPSBmb3JrKCkpICE9IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwic2Vjb25kIGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgICAgIGlmKGkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInNlY29uZCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRzbm1wX2RhZW1vbml6ZSgpXG4iLCBlcnJubyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KI2lmbmRlZiBXSU4zMgogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiBDaGlsZC4gKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImNoaWxkIGNvbnRpbnVpbmdcbiIpKTsKCiNpZiAhIGRlZmluZWQoZGFyd2luOSkKICAgICAgICAgICAgX2RhZW1vbl9wcmVwKHN0ZGVycl9sb2cpOwojZWxzZQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNvbWUgZGFyd2luIGNhbGxzICh1c2luZyBtYWNoIHBvcnRzKSBkb24ndCB3b3JrIGFmdGVyCiAgICAgICAgICAgICAgKiBhIGZvcmsuIFNvLCBub3cgdGhhdCB3ZSd2ZSBmb3JrZWQsIHdlIHJlLWV4ZWMgb3Vyc2VsZgogICAgICAgICAgICAgICogdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkJ3MgbWFjaCBwb3J0cyBhcmUgYWxsIHNldCB1cCBjb3JyZWN0bHksCiAgICAgICAgICAgICAgKiB0aGUgZ2V0cHBpZCBjYWxsIGFib3ZlIHdpbGwgcHJldmVudCB0aGUgZXhlYyBjaGlsZCBmcm9tCiAgICAgICAgICAgICAgKiBmb3JraW5nLi4uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGNoYXIgKiBjb25zdCAqYXJndiA9ICpfTlNHZXRBcmd2ICgpOwogICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwicmUtZXhlY2luZyBmb3JrZWQgY2hpbGRcbiIpKTsKICAgICAgICAgICAgIGV4ZWN2IChwYXRoLCBhcmd2KTsKICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIkZvcmtlZCBjaGlsZCB1bmFibGUgdG8gcmUtZXhlYyAtICVzLlxuIiwgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgICAgICAgICBleGl0ICgwKTsKI2VuZGlmCiAgICAgICAgfQojZW5kaWYgLyogIVdJTjMyICovCiAgICB9CiNlbmRpZiAvKiBIQVZFX0ZPUksgKi8KICAgIHJldHVybiBpOwp9CgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCiAqLwojaWZkZWYJCQkJCQkJV0lOMzIKaW5fYWRkcl90CmdldF9teWFkZHIodm9pZCkKewogICAgY2hhciAgICAgICAgICAgIGxvY2FsX2hvc3RbMTMwXTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQ7CiAgICBMUEhPU1RFTlQgICAgICAgbHBzdEhvc3RlbnQ7CiAgICBTT0NLQUREUl9JTiAgICAgaW5fYWRkciwgcmVtb3RlX2luX2FkZHI7CiAgICBTT0NLRVQgICAgICAgICAgaFNvY2s7CiAgICBpbnQgICAgICAgICAgICAgbkFkZHJTaXplID0gc2l6ZW9mKFNPQ0tBRERSKTsKCiAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CgogICAgcmVzdWx0ID0gZ2V0aG9zdG5hbWUobG9jYWxfaG9zdCwgc2l6ZW9mKGxvY2FsX2hvc3QpKTsKICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgIGxwc3RIb3N0ZW50ID0gZ2V0aG9zdGJ5bmFtZSgoTFBTVFIpIGxvY2FsX2hvc3QpOwogICAgICAgIGlmIChscHN0SG9zdGVudCkgewogICAgICAgICAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9CiAgICAgICAgICAgICAgICAqKCh1X2xvbmcgRkFSICopIChscHN0SG9zdGVudC0+aF9hZGRyKSk7CiAgICAgICAgICAgIHJldHVybiAoKGluX2FkZHJfdCkgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogaWYgd2UgYXJlIGhlcmUsIHRoYW4gd2UgZG9uJ3QgaGF2ZSBob3N0IGFkZHIgCiAgICAgKi8KICAgIGhTb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogICAgaWYgKGhTb2NrICE9IElOVkFMSURfU09DS0VUKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb25uZWN0IHRvIGFueSBwb3J0IGFuZCBhZGRyZXNzIAogICAgICAgICAqLwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoSVBQT1JUX0VDSE8pOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMC4wLjAuMCIpOwogICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgIGNvbm5lY3QoaFNvY2ssIChMUFNPQ0tBRERSKSAmIHJlbW90ZV9pbl9hZGRyLAogICAgICAgICAgICAgICAgICAgIHNpemVvZihTT0NLQUREUikpOwogICAgICAgIGlmIChyZXN1bHQgIT0gU09DS0VUX0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGdldCBsb2NhbCBpcCBhZGRyZXNzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0c29ja25hbWUoaFNvY2ssIChMUFNPQ0tBRERSKSAmIGluX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgRkFSICopICZuQWRkclNpemUpOwogICAgICAgIH0KICAgICAgICBjbG9zZXNvY2tldChoU29jayk7CiAgICB9CiAgICByZXR1cm4gKChpbl9hZGRyX3QpIGluX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKfQoKbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKICAgIGxvbmcgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAwOwogICAgRFdPUkQgICAgICAgICAgIGJ1ZmZlcnNpemUgPSAoc2l6ZW9mKFBFUkZfREFUQV9CTE9DSykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBFUkZfT0JKRUNUX1RZUEUpKSwKICAgICAgICB0eXBlID0gUkVHX0VYUEFORF9TWjsKICAgIFBQRVJGX0RBVEFfQkxPQ0sgcGVyZmRhdGEgPSBOVUxMOwoKICAgIC8qCiAgICAgKiBtaW4gcmVxdWlyZW1lbnQgaXMgb25lIFBFUkZfREFUQV9CTE9DSyBwbHVzIG9uZSBQRVJGX09CSkVDVF9UWVBFIAogICAgICovCiAgICBwZXJmZGF0YSA9IChQUEVSRl9EQVRBX0JMT0NLKSBtYWxsb2MoYnVmZmVyc2l6ZSk7CiAgICBpZiAoIXBlcmZkYXRhKQogICAgICAgIHJldHVybiAwOwoKICAgIG1lbXNldChwZXJmZGF0YSwgMCwgYnVmZmVyc2l6ZSk7CgogICAgUmVnUXVlcnlWYWx1ZUV4KEhLRVlfUEVSRk9STUFOQ0VfREFUQSwKICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIiwgTlVMTCwgJnR5cGUsIChMUEJZVEUpIHBlcmZkYXRhLCAmYnVmZmVyc2l6ZSk7CgogICAgLyoKICAgICAqIHdlIGNhbiBub3QgcmVseSBvbiB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHRoZXJlIGlzIGFsd2F5cyBtb3JlIHNvCiAgICAgKiB3ZSBjaGVjayB0aGUgc2lnbmF0dXJlIAogICAgICovCgogICAgaWYgKHdjc25jbXAocGVyZmRhdGEtPlNpZ25hdHVyZSwgTCJQRVJGIiwgNCkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogc2lnbmF0dXJlIG9rLCBhbmQgYWxsIHdlIG5lZWQgaXMgaW4gdGhlIGluIHRoZSBQRVJGX0RBVEFfQkxPQ0sgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuX3ZhbHVlID0gKGxvbmcpICgocGVyZmRhdGEtPlBlcmZUaW1lMTAwblNlYy5RdWFkUGFydCAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkdMT05HKSAxMDAwMDApKTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybl92YWx1ZSA9IEdldFRpY2tDb3VudCgpIC8gMTA7CgogICAgUmVnQ2xvc2VLZXkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKICAgIGZyZWUocGVyZmRhdGEpOwoKICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cn0KCmNoYXIgICAgICAgICAgICoKd2luc29ja19zdGFydHVwKHZvaWQpCnsKICAgIFdPUkQgICAgICAgICAgICBWZXJzaW9uUmVxdWVzdGVkOwogICAgV1NBREFUQSAgICAgICAgIHN0V1NBRGF0YTsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RhdGljIGNoYXIgICAgIGVycm1zZ1sxMDBdOwoKCS8qIHdpbnNvY2sgMTogdXNlIE1BS0VXT1JEKDEsMSkgKi8KCS8qIHdpbnNvY2sgMjogdXNlIE1BS0VXT1JEKDIsMikgKi8KCiAgICBWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMiwyKTsKICAgIGkgPSBXU0FTdGFydHVwKFZlcnNpb25SZXF1ZXN0ZWQsICZzdFdTQURhdGEpOwogICAgaWYgKGkgIT0gMCkgewogICAgICAgIGlmIChpID09IFdTQVZFUk5PVFNVUFBPUlRFRCkKICAgICAgICAgICAgc3ByaW50ZihlcnJtc2csCiAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbml0LiBzb2NrZXQgbGliLCBkb2VzIG5vdCBzdXBwb3J0IDEuMSIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBzcHJpbnRmKGVycm1zZywgIlNvY2tldCBTdGFydHVwIGVycm9yICVkIiwgaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoZXJybXNnKTsKICAgIH0KICAgIHJldHVybiAoTlVMTCk7Cn0KCnZvaWQKd2luc29ja19jbGVhbnVwKHZvaWQpCnsKICAgIFdTQUNsZWFudXAoKTsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhIFdJTjMyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogWFhYICBXaGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgYWRkcmVzc2VzPyAgT3Igbm8gYWRkcmVzc2VzIGZvciB0aGF0IG1hdHRlcj8KICogWFhYICBDb3VsZCBpdCBiZSBjb21wdXRlZCBvbmNlIHRoZW4gY2FjaGVkPyAgUHJvYmFibHkgbm90IHdvcnRoIGl0IChub3QKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdmVyeSBvZnRlbikuCiAqLwppbl9hZGRyX3QKZ2V0X215YWRkcih2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgc2QsIGksIGxhc3RsZW4gPSAwOwogICAgc3RydWN0IGlmY29uZiAgIGlmYzsKICAgIHN0cnVjdCBpZnJlcSAgICppZnJwID0gTlVMTDsKICAgIGluX2FkZHJfdCAgICAgICBhZGRyOwogICAgY2hhciAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CgogICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIENvcGUgd2l0aCBsb3RzIG9mIGludGVyZmFjZXMgYW5kIGJyb2tlbm5lc3Mgb2YgaW9jdGwgU0lPQ0dJRkNPTkYgb24KICAgICAqIHNvbWUgcGxhdGZvcm1zOyBzZWUgVy4gUi4gU3RldmVucywgYGBVbml4IE5ldHdvcmsgUHJvZ3JhbW1pbmcgVm9sdW1lCiAgICAgKiBJJycsIHAuNDM1LiAgCiAgICAgKi8KCiAgICBmb3IgKGkgPSA4OzsgaSArPSA4KSB7CiAgICAgICAgYnVmID0gKGNoYXIgKikgY2FsbG9jKGksIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWZjLmlmY19sZW4gPSBpICogc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CiAgICAgICAgaWZjLmlmY19idWYgPSAoY2FkZHJfdCkgYnVmOwoKICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZDT05GLCAoY2hhciAqKSAmaWZjKSA8IDApIHsKICAgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlZBTCB8fCBsYXN0bGVuICE9IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBTb21ldGhpbmcgaGFzIGdvbmUgZ2VudWluZWx5IHdyb25nLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQgY291bGQganVzdCBiZSB0aGF0IHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpZmMuaWZjX2xlbiA9PSBsYXN0bGVuKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCB0aW1lOyB3ZSdyZSBkb25lLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RsZW4gPSBpZmMuaWZjX2xlbjsKICAgICAgICB9CiAgICAgICAgZnJlZShidWYpOwogICAgfQoKICAgIGZvciAoaWZycCA9IGlmYy5pZmNfcmVxOwogICAgICAgIChjaGFyICopaWZycCA8IChjaGFyICopaWZjLmlmY19yZXEgKyBpZmMuaWZjX2xlbjsKI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NBX0xFTgogICAgICAgIGlmcnAgPSAoc3RydWN0IGlmcmVxICopKCgoY2hhciAqKSBpZnJwKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZycC0+aWZyX2FkZHIuc2FfbGVuKQojZWxzZQogICAgICAgIGlmcnArKwojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGlmcnAtPmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopIGlmcnApIDwgMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfVVApCiNpZmRlZiBJRkZfUlVOTklORwogICAgICAgICAgICAmJiAoaWZycC0+aWZyX2ZsYWdzICYgSUZGX1JVTk5JTkcpCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUZGX1JVTk5JTkcgKi8KICAgICAgICAgICAgJiYgIShpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAgICAgICAgICAgICYmIGFkZHIgIT0gTE9PUEJBQ0spIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSSAqcmVhbGx5KiBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gIFBlcmhhcHMgZm9yCiAgICAgICAgICAgICAqIHNvbWUgYnJva2VuIHBsYXRmb3JtPyAgTGVhdmUgaXQgZm9yIG5vdy4gIEpCUE4gIAogICAgICAgICAgICAgKi8KI2lmZGVmIFNZU19JT0NUTF9IX0hBU19TSU9DR0lGQUREUgogICAgICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZBRERSLCAoY2hhciAqKSBpZnJwKSA8IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZHIgPQogICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZnJwLT5pZnJfYWRkcikpLT5zaW5fYWRkci4KICAgICAgICAgICAgICAgIHNfYWRkcjsKI2VuZGlmCiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gYWRkcjsKICAgICAgICB9CiAgICB9CiAgICBmcmVlKGJ1Zik7CiAgICBjbG9zZShzZCk7CiAgICByZXR1cm4gMDsKfQoKCiNpZiAhZGVmaW5lZChzb2xhcmlzMikgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGN5Z3dpbikKLyoKICogUmV0dXJucyBib290dGltZSBpbiBjZW50aXNlY29uZHMoISkuCiAqICAgICAgQ2FjaGVzIHRoaXMgZm9yIGZ1dHVyZSB1c2UuCiAqLwpsb25nCmdldF9ib290dGltZSh2b2lkKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgYm9vdHRpbWVfY3NlY3MgPSAwOwojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IHBzdF9zdGF0aWMgcHN0X2J1ZjsKI2Vsc2UKICAgIHN0cnVjdCB0aW1ldmFsICBib290dGltZTsKI2lmZGVmCU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIGludCAgICAgICAgICAgICBtaWJbMl07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGludCAgICAgICAgICAgICBrbWVtOwojaWYgIWRlZmluZWQoaHB1eCkKICAgIHN0YXRpYyBjaGFyIGJvb3R0aW1lX25hbWVbXSA9ICJfYm9vdHRpbWUiOwojZWxzZQogICAgc3RhdGljIGNoYXIgYm9vdHRpbWVfbmFtZVtdID0gImJvb3R0aW1lIjsKI2VuZGlmCiAgICBzdGF0aWMgY2hhciBlbXB0eV9uYW1lW10gPSAiIjsKICAgIHN0cnVjdCBubGlzdCBubFsyXSA9IHsgfTsKCiAgICBubFswXS5uX25hbWUgPSBib290dGltZV9uYW1lOwogICAgbmxbMV0ubl9uYW1lID0gZW1wdHlfbmFtZTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDEwIHx8IGhwdXggMTEgKi8KCgogICAgaWYgKGJvb3R0aW1lX2NzZWNzICE9IDApCiAgICAgICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7CgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgcHN0YXRfZ2V0c3RhdGljKCZwc3RfYnVmLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0aWMpLCAxLCAwKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gcHN0X2J1Zi5ib290X3RpbWUgKiAxMDA7CiNlbGlmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIG1pYlswXSA9IENUTF9LRVJOOwogICAgbWliWzFdID0gS0VSTl9CT09UVElNRTsKCiAgICBsZW4gPSBzaXplb2YoYm9vdHRpbWUpOwoKICAgIHN5c2N0bChtaWIsIDIsICZib290dGltZSwgJmxlbiwgTlVMTCwgMCk7CiAgICBib290dGltZV9jc2VjcyA9IChib290dGltZS50dl9zZWMgKiAxMDApICsgKGJvb3R0aW1lLnR2X3VzZWMgLyAxMDAwMCk7CiNlbGlmIGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX05MSVNUKQogICAgaWYgKChrbWVtID0gb3BlbigiL2Rldi9rbWVtIiwgMCkpIDwgMCkKICAgICAgICByZXR1cm4gMDsKICAgIG5saXN0KEtFUk5FTF9MT0MsIG5sKTsKICAgIGlmIChubFswXS5uX3R5cGUgPT0gMCkgewogICAgICAgIGNsb3NlKGttZW0pOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGxzZWVrKGttZW0sIChsb25nKSBubFswXS5uX3ZhbHVlLCBMX1NFVCk7CiAgICByZWFkKGttZW0sICZib290dGltZSwgc2l6ZW9mKGJvb3R0aW1lKSk7CiAgICBjbG9zZShrbWVtKTsKICAgIGJvb3R0aW1lX2NzZWNzID0gKGJvb3R0aW1lLnR2X3NlYyAqIDEwMCkgKyAoYm9vdHRpbWUudHZfdXNlYyAvIDEwMDAwKTsKI2Vsc2UKICAgIHJldHVybiAwOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMCB8fCBocHV4IDExICovCgogICAgcmV0dXJuIChib290dGltZV9jc2Vjcyk7Cn0KI2VuZGlmCgovKioKICogUmV0dXJucyB0aGUgc3lzdGVtIHVwdGltZSBpbiBjZW50aXNlY29uZHMuCiAqCiAqIEBub3RlIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBpZGVudGljYWwgdG8gc3lzVXBUaW1lCiAqICAgZGVmaW5lZCBpbiBSRkMgMTIxMy4gZ2V0X3VwdGltZSgpIHJldHVybnMgdGhlIHN5c3RlbSB1cHRpbWUgd2hpbGUKICogICBzeXNVcFRpbWUgcmVwcmVzZW50cyB0aGUgdGltZSB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBtb3N0IHJlY2VudAogKiAgIHJlc3RhcnQgb2YgdGhlIG5ldHdvcmsgbWFuYWdlciAoc25tcGQpLgogKgogKiBAc2VlIFNlZSBhbHNvIG5ldHNubXBfZ2V0X2FnZW50X3VwdGltZSgpLgogKi8KbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgIHN0YXRpYyBjaGFyIGxib2x0X25hbWVbXSA9ICJsYm9sdCI7CiAgICBzdHJ1Y3Qgbmxpc3Qgbmw7CiAgICBpbnQga21lbTsKICAgIHRpbWVfdCBsYm9sdDsKICAgIG5sLm5fbmFtZSA9IGxib2x0X25hbWU7CiAgICBpZihrbmxpc3QoJm5sLCAxLCBzaXplb2Yoc3RydWN0IG5saXN0KSkgIT0gMCkgcmV0dXJuKDApOwogICAgaWYobmwubl90eXBlID09IDAgfHwgbmwubl92YWx1ZSA9PSAwKSByZXR1cm4oMCk7CiAgICBpZigoa21lbSA9IG9wZW4oIi9kZXYvbWVtIiwgMCkpIDwgMCkgcmV0dXJuIDA7CiAgICBsc2VlayhrbWVtLCAobG9uZykgbmwubl92YWx1ZSwgTF9TRVQpOwogICAgcmVhZChrbWVtLCAmbGJvbHQsIHNpemVvZihsYm9sdCkpOwogICAgY2xvc2Uoa21lbSk7CiAgICByZXR1cm4obGJvbHQpOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAga3N0YXRfY3RsX3QgICAgKmtzYyA9IGtzdGF0X29wZW4oKTsKICAgIGtzdGF0X3QgICAgICAgICprczsKICAgIGtpZF90ICAgICAgICAgICBraWQ7CiAgICBrc3RhdF9uYW1lZF90ICAqbmFtZWQ7CiAgICB1X2xvbmcgICAgICAgICAgbGJvbHQgPSAwOwoKICAgIGlmIChrc2MpIHsKICAgICAgICBrcyA9IGtzdGF0X2xvb2t1cChrc2MsICJ1bml4IiwgLTEsICJzeXN0ZW1fbWlzYyIpOwogICAgICAgIGlmIChrcykgewogICAgICAgICAgICBraWQgPSBrc3RhdF9yZWFkKGtzYywga3MsIE5VTEwpOwogICAgICAgICAgICBpZiAoa2lkICE9IC0xKSB7CiAgICAgICAgICAgICAgICBuYW1lZCA9IGtzdGF0X2RhdGFfbG9va3VwKGtzLCAibGJvbHQiKTsKICAgICAgICAgICAgICAgIGlmIChuYW1lZCkgewojaWZkZWYgS1NUQVRfREFUQV9VSU5UMzIKICAgICAgICAgICAgICAgICAgICBsYm9sdCA9IG5hbWVkLT52YWx1ZS51aTMyOwojZWxzZQogICAgICAgICAgICAgICAgICAgIGxib2x0ID0gbmFtZWQtPnZhbHVlLnVsOwojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrc3RhdF9jbG9zZShrc2MpOwogICAgfQogICAgcmV0dXJuIGxib2x0OwojZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKGN5Z3dpbikKICAgIEZJTEUgICAgICAgICAgICppbiA9IGZvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpOwogICAgbG9uZyAgICAgICAgICAgIHVwdGltID0gMCwgYSwgYjsKICAgIGlmIChpbikgewogICAgICAgIGlmICgyID09IGZzY2FuZihpbiwgIiVsZC4lbGQiLCAmYSwgJmIpKQogICAgICAgICAgICB1cHRpbSA9IGEgKiAxMDAgKyBiOwogICAgICAgIGZjbG9zZShpbik7CiAgICB9CiAgICByZXR1cm4gdXB0aW07CiNlbHNlCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwogICAgbG9uZyAgICAgICAgICAgIGJvb3R0aW1lX2NzZWNzLCBub3d0aW1lX2NzZWNzOwoKICAgIGJvb3R0aW1lX2NzZWNzID0gZ2V0X2Jvb3R0aW1lKCk7CiAgICBpZiAoYm9vdHRpbWVfY3NlY3MgPT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgIGdldHRpbWVvZmRheSgmbm93LCAoc3RydWN0IHRpbWV6b25lICopIDApOwogICAgbm93dGltZV9jc2VjcyA9IChub3cudHZfc2VjICogMTAwKSArIChub3cudHZfdXNlYyAvIDEwMDAwKTsKCiAgICByZXR1cm4gKG5vd3RpbWVfY3NlY3MgLSBib290dGltZV9jc2Vjcyk7CiNlbmRpZgp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICEgV0lOMzIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZkZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04Kc3RhdGljIHZhbF9jb250ZXh0X3QgKl92YWxfY29udGV4dCA9IE5VTEw7CgpzdGF0aWMgdmFsX2NvbnRleHRfdCAqCm5ldHNubXBfdmFsaWRhdG9yX2NvbnRleHQodm9pZCkKewogICAgaWYgKE5VTEwgPT0gX3ZhbF9jb250ZXh0KSB7CiAgICAgICAgaW50IHJjOwogICAgICAgIGNoYXIgKmFwcHR5cGUgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUpOwogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6c2VjOmNvbnRleHQiLCAiY3JlYXRpbmcgZG5zc2VjIGNvbnRleHQgZm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgIGFwcHR5cGUpKTsKICAgICAgICByYyA9IHZhbF9jcmVhdGVfY29udGV4dChhcHB0eXBlLCAmX3ZhbF9jb250ZXh0KTsKICAgIH0KCiAgICByZXR1cm4gX3ZhbF9jb250ZXh0Owp9CiNlbmRpZiAvKiBETlNTRUNfTE9DQUxfVkFMSURBVElPTiAqLwoKaW50Cm5ldHNubXBfZ2V0aG9zdGJ5bmFtZV92NChjb25zdCBjaGFyKiBuYW1lLCBpbl9hZGRyX3QgKmFkZHJfb3V0KQp7CiNpZiBIQVZFX0dFVEFERFJJTkZPCiAgICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJzID0gTlVMTDsKICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50OwogICAgaW50ICAgICAgICAgICAgIGVycjsKCiAgICBtZW1zZXQoJmhpbnQsIDAsIHNpemVvZiBoaW50KTsKICAgIGhpbnQuYWlfZmxhZ3MgPSAwOwogICAgaGludC5haV9mYW1pbHkgPSBQRl9JTkVUOwogICAgaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CiAgICBoaW50LmFpX3Byb3RvY29sID0gMDsKCiAgICBlcnIgPSBuZXRzbm1wX2dldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50LCAmYWRkcnMpOwogICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmIChhZGRycyAhPSBOVUxMKSB7CiAgICAgICAgbWVtY3B5KGFkZHJfb3V0LAogICAgICAgICAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYWRkcnMtPmFpX2FkZHIpLT5zaW5fYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGluX2FkZHJfdCkpOwogICAgICAgIGZyZWVhZGRyaW5mbyhhZGRycyk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBJUHY0IGhvc3RuYW1lXG4iKSk7CiAgICB9CiAgICByZXR1cm4gMDsKCiNlbGlmIEhBVkVfR0VUSE9TVEJZTkFNRQogICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKCiAgICBocCA9IG5ldHNubXBfZ2V0aG9zdGJ5bmFtZShuYW1lKTsKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb3VsZG4ndCByZXNvbHZlKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAobm90IEFGX0lORVQhKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChyZXNvbHZlZCBva2F5KVxuIikpOwogICAgICAgIG1lbWNweShhZGRyX291dCwgaHAtPmhfYWRkciwgc2l6ZW9mKGluX2FkZHJfdCkpOwogICAgfQogICAgcmV0dXJuIDA7CgojZWxpZiBIQVZFX0dFVElQTk9ERUJZTkFNRQogICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBlcnI7CgogICAgaHAgPSBnZXRpcG5vZGVieW5hbWUocGVlcm5hbWUsIEFGX0lORVQsIDAsICZlcnIpOwogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvdWxkbid0IHJlc29sdmUgPSAlZClcbiIsIGVycikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgImhvc3RuYW1lIChyZXNvbHZlZCBva2F5KVxuIikpOwogICAgbWVtY3B5KGFkZHJfb3V0LCBocC0+aF9hZGRyLCBzaXplb2YoaW5fYWRkcl90KSk7CiAgICByZXR1cm4gMDsKCiNlbHNlIC8qIEhBVkVfR0VUSVBOT0RFQllOQU1FICovCiAgICByZXR1cm4gLTE7CiNlbmRpZgp9CgppbnQKbmV0c25tcF9nZXRhZGRyaW5mbyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKnJlcykKewojaWYgSEFWRV9HRVRBRERSSU5GTwogICAgc3RydWN0IGFkZHJpbmZvICphZGRycyA9IE5VTEw7CiAgICBzdHJ1Y3QgYWRkcmluZm8gaGludDsKICAgIGludCAgICAgICAgICAgICBlcnI7CiNpZmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgogICAgdmFsX3N0YXR1c190ICAgIHZhbF9zdGF0dXM7CiNlbmRpZgoKICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0YWRkcmluZm8iLCAibG9va2luZyB1cCAiKSk7CiAgICBpZiAobmFtZSkKICAgICAgICBERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICJcIiVzXCIiLCBuYW1lKSk7CiAgICBlbHNlCiAgICAgICAgREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiPE5VTEw+IikpOwoKICAgIGlmIChzZXJ2aWNlKQoJREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiOlwiJXNcIiIsIHNlcnZpY2UpKTsKCiAgICBpZiAoaGludHMpCglERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICIgd2l0aCBoaW50ICh7IC4uLiB9KSIpKTsKICAgIGVsc2UKCURFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIiB3aXRoIG5vIGhpbnQiKSk7CgogICAgREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiXG4iKSk7CgogICAgaWYgKE5VTEwgPT0gaGludHMpIHsKICAgICAgICBtZW1zZXQoJmhpbnQsIDAsIHNpemVvZiBoaW50KTsKICAgICAgICBoaW50LmFpX2ZsYWdzID0gMDsKICAgICAgICBoaW50LmFpX2ZhbWlseSA9IFBGX0lORVQ7CiAgICAgICAgaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CiAgICAgICAgaGludC5haV9wcm90b2NvbCA9IDA7CiAgICAgICAgaGludHMgPSAmaGludDsKICAgIH0gZWxzZSB7CiAgICAgICAgbWVtY3B5KCZoaW50LCBoaW50cywgc2l6ZW9mIGhpbnQpOwogICAgfQoKI2lmbmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgogICAgZXJyID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnQsICZhZGRycyk7CiNlbHNlIC8qIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OICovCiAgICBlcnIgPSB2YWxfZ2V0YWRkcmluZm8obmV0c25tcF92YWxpZGF0b3JfY29udGV4dCgpLCBuYW1lLCBOVUxMLCAmaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkcnMsICZ2YWxfc3RhdHVzKTsKICAgIERFQlVHTVNHVEwoKCJkbnM6c2VjOnZhbCIsICJlcnIgJWQsIHZhbF9zdGF0dXMgJWQgLyAlczsgdHJ1c3RlZDogJWRcbiIsCiAgICAgICAgICAgICAgICBlcnIsIHZhbF9zdGF0dXMsIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSwKICAgICAgICAgICAgICAgIHZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpKTsKICAgIGlmICghIHZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpIHsKICAgICAgICBpbnQgcmM7CiAgICAgICAgaWYgKChlcnIgIT0gMCkgJiYgVkFMX0dFVEFERFJJTkZPX0hBU19TVEFUVVMoZXJyKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFVOVFJVU1RFRCBlcnJvciBpbiBETlMgcmVzb2x1dGlvbiBmb3IgJXMhXG4iLAogICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgICAgcmMgPSBFQUlfRkFJTDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgIlRoZSBhdXRoZW50aWNpdHkgb2YgRE5TIHJlc3BvbnNlIGlzIG5vdCB0cnVzdGVkICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSk7CiAgICAgICAgICAgIHJjID0gRUFJX05PTkFNRTsKICAgICAgICB9CiAgICAgICAgLyoqIGNvbnRpbnVlIGFueXdheXMgaWYgRE5TU0VDX1dBUk5fT05MWSBpcyBzZXQgKi8KICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE5TU0VDX1dBUk5fT05MWSkpCiAgICAgICAgICAgIHJldHVybiByYzsKICAgIH0KCgojZW5kaWYgLyogRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04gKi8KICAgICpyZXMgPSBhZGRyczsKICAgIGlmICgoMCA9PSBlcnIpICYmIGFkZHJzICYmIGFkZHJzLT5haV9hZGRyKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRhZGRyaW5mbyIsICJhbnN3ZXIgeyBBRl9JTkVULCAlczolaHUgfVxuIiwKICAgICAgICAgICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWFkZHJzLT5haV9hZGRyKS0+c2luX2FkZHIpLAogICAgICAgICAgICAgICAgICAgIG50b2hzKCgoc3RydWN0IHNvY2thZGRyX2luKilhZGRycy0+YWlfYWRkciktPnNpbl9wb3J0KSkpOwogICAgfQogICAgcmV0dXJuIGVycjsKI2Vsc2UKICAgIE5FVFNOTVBfTE9HT05DRSgoTE9HX0VSUiwgImdldGFkZHJpbmZvIG5vdCBhdmFpbGFibGUiKSk7CiAgICByZXR1cm4gRUFJX0ZBSUw7CiNlbmRpZiAvKiBnZXRhZGRyaW5mbyAqLwp9CgpzdHJ1Y3QgaG9zdGVudCAqCm5ldHNubXBfZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQp7CiNpZiBIQVZFX0dFVEhPU1RCWU5BTUUKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiAgICB2YWxfc3RhdHVzX3QgdmFsX3N0YXR1czsKI2VuZGlmCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwoKICAgIGlmIChOVUxMID09IG5hbWUpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnluYW1lIiwgImxvb2tpbmcgdXAgJXNcbiIsIG5hbWUpKTsKCiNpZmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgogICAgaHAgID0gdmFsX2dldGhvc3RieW5hbWUobmV0c25tcF92YWxpZGF0b3JfY29udGV4dCgpLCBuYW1lLCAmdmFsX3N0YXR1cyk7CiAgICBERUJVR01TR1RMKCgiZG5zOnNlYzp2YWwiLCAidmFsX3N0YXR1cyAlZCAvICVzOyB0cnVzdGVkOiAlZFxuIiwKICAgICAgICAgICAgICAgIHZhbF9zdGF0dXMsIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSwKICAgICAgICAgICAgICAgIHZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpKTsKICAgIGlmICghdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICJUaGUgYXV0aGVudGljaXR5IG9mIEROUyByZXNwb25zZSBpcyBub3QgdHJ1c3RlZCAoJXMpXG4iLAogICAgICAgICAgICAgICAgIHBfdmFsX3N0YXR1cyh2YWxfc3RhdHVzKSk7CiAgICAgICAgLyoqIGNvbnRpbnVlIGFueXdheXMgaWYgRE5TU0VDX1dBUk5fT05MWSBpcyBzZXQgKi8KICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE5TU0VDX1dBUk5fT05MWSkpCiAgICAgICAgICAgIGhwID0gTlVMTDsKICAgIH0KICAgIGVsc2UgaWYgKHZhbF9kb2VzX25vdF9leGlzdCh2YWxfc3RhdHVzKSAmJiBocCkKICAgICAgICBocCA9IE5VTEw7CiNlbHNlCiAgICBocCA9IGdldGhvc3RieW5hbWUobmFtZSk7CiNlbmRpZgogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieW5hbWUiLAogICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCByZXNvbHZlICVzXG4iLCBuYW1lKSk7CiAgICB9IGVsc2UgaWYgKGhwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQpIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieW5hbWUiLAogICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nOiByZXNwb25zZSBmb3IgJXMgbm90IEFGX0lORVQhXG4iLCBuYW1lKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5bmFtZSIsCiAgICAgICAgICAgICAgICAgICAgIiVzIHJlc29sdmVkIG9rYXlcbiIsIG5hbWUpKTsKICAgIH0KICAgIHJldHVybiBocDsKI2Vsc2UKICAgIE5FVFNOTVBfTE9HT05DRSgoTE9HX0VSUiwgImdldGhvc3RieW5hbWUgbm90IGF2YWlsYWJsZSIpKTsKICAgIHJldHVybiBOVUxMOwojZW5kaWYgLyogSEFWRV9HRVRIT1NUQllOQU1FICovCn0KCi8qKgogKiBMb29rIHVwIHRoZSBob3N0IG5hbWUgdmlhIEROUy4KICoKICogQHBhcmFtW2luXSBhZGRyIFBvaW50ZXIgdG8gdGhlIGFkZHJlc3MgdG8gcmVzb2x2ZS4gVGhpcyBhcmd1bWVudCBwb2ludHMgZS5nLgogKiAgIHRvIGEgc3RydWN0IGluX2FkZHIgZm9yIEFGX0lORVQgb3IgdG8gYSBzdHJ1Y3QgaW42X2FkZHIgZm9yIEFGX0lORVQ2LgogKiBAcGFyYW1baW5dIGxlbiAgTGVuZ3RoIGluIGJ5dGVzIG9mICphZGRyLgogKiBAcGFyYW1baW5dIHR5cGUgQWRkcmVzcyBmYW1pbHksIGUuZy4gQUZfSU5FVCBvciBBRl9JTkVUNi4KICoKICogQHJldHVybiBQb2ludGVyIHRvIGEgaG9zdGVudCBzdHJ1Y3R1cmUgaWYgYWRkcmVzcyBsb29rdXAgc3VjY2VlZGVkIG9yIE5VTEwKICogICBpZiB0aGUgbG9va3VwIGZhaWxlZC4KICoKICogQHNlZSBTZWUgYWxzbyB0aGUgZ2V0aG9zdGJ5YWRkcigpIG1hbiBwYWdlLgogKi8Kc3RydWN0IGhvc3RlbnQgKgpuZXRzbm1wX2dldGhvc3RieWFkZHIoY29uc3Qgdm9pZCAqYWRkciwgc29ja2xlbl90IGxlbiwgaW50IHR5cGUpCnsKI2lmIEhBVkVfR0VUSE9TVEJZQUREUgogICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgIGNoYXIgYnVmWzY0XTsKCiAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieWFkZHIiLCAicmVzb2x2aW5nICVzXG4iLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKHR5cGUsIGFkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSk7CgojaWZkZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04KICAgIHZhbF9zdGF0dXNfdCB2YWxfc3RhdHVzOwogICAgaHAgPSB2YWxfZ2V0aG9zdGJ5YWRkcihuZXRzbm1wX3ZhbGlkYXRvcl9jb250ZXh0KCksIGFkZHIsIGxlbiwgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbF9zdGF0dXMpOwogICAgREVCVUdNU0dUTCgoImRuczpzZWM6dmFsIiwgInZhbF9zdGF0dXMgJWQgLyAlczsgdHJ1c3RlZDogJWRcbiIsCiAgICAgICAgICAgICAgICB2YWxfc3RhdHVzLCBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cyksCiAgICAgICAgICAgICAgICB2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSk7CiAgICBpZiAoIXZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAiVGhlIGF1dGhlbnRpY2l0eSBvZiBETlMgcmVzcG9uc2UgaXMgbm90IHRydXN0ZWQgKCVzKVxuIiwKICAgICAgICAgICAgICAgICBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cykpOwogICAgICAgIC8qKiBjb250aW51ZSBhbnl3YXlzIGlmIEROU1NFQ19XQVJOX09OTFkgaXMgc2V0ICovCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0ROU1NFQ19XQVJOX09OTFkpKQogICAgICAgICAgICBocCA9IE5VTEw7CiAgICB9CiAgICBlbHNlIGlmICh2YWxfZG9lc19ub3RfZXhpc3QodmFsX3N0YXR1cykgJiYgaHApCiAgICAgICAgaHAgPSBOVUxMOwojZWxzZQogICAgaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGxlbiwgdHlwZSk7CiNlbmRpZgogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieWFkZHIiLCAiY291bGRuJ3QgcmVzb2x2ZSBhZGRyXG4iKSk7CiAgICB9IGVsc2UgaWYgKGhwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQpIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieWFkZHIiLAogICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nOiByZXNwb25zZSBmb3IgYWRkciBub3QgQUZfSU5FVCFcbiIpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnlhZGRyIiwgImFkZHIgcmVzb2x2ZWQgb2theVxuIikpOwogICAgfQogICAgcmV0dXJuIGhwOwojZWxzZQogICAgTkVUU05NUF9MT0dPTkNFKChMT0dfRVJSLCAiZ2V0aG9zdGJ5YWRkciBub3QgYXZhaWxhYmxlIikpOwogICAgcmV0dXJuIE5VTEw7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSEFWRV9TVFJOQ0FTRUNNUAoKLyoKICogdGVzdCBmb3IgTlVMTCBwb2ludGVycyBiZWZvcmUgYW5kIE5VTEwgY2hhcmFjdGVycyBhZnRlcgogKiAqIGNvbXBhcmluZyBwb3NzaWJseSBub24tTlVMTCBzdHJpbmdzLgogKiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgY2hlY2sgZm9yIGFycmF5IG92ZXJmbG93LgogKi8KaW50CnN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG5jaCkKewogICAgc2l6ZV90ICAgICAgICAgIGlpOwogICAgaW50ICAgICAgICAgICAgIHJlcyA9IC0xOwoKICAgIGlmICghczEpIHsKICAgICAgICBpZiAoIXMyKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmICghczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICBmb3IgKGlpID0gMDsgKGlpIDwgbmNoKSAmJiAqczEgJiYgKnMyOyBpaSsrLCBzMSsrLCBzMisrKSB7CiAgICAgICAgcmVzID0gKGludCkgKHRvbG93ZXIoKnMxKSAtIHRvbG93ZXIoKnMyKSk7CiAgICAgICAgaWYgKHJlcyAhPSAwKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoaWkgPT0gbmNoKSB7CiAgICAgICAgczEtLTsKICAgICAgICBzMi0tOwogICAgfQoKICAgIGlmICghKnMxKSB7CiAgICAgICAgaWYgKCEqczIpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWYgKCEqczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICByZXR1cm4gKHJlcyk7Cn0KCmludApzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKewogICAgcmV0dXJuIHN0cm5jYXNlY21wKHMxLCBzMiwgMTAwMDAwMCk7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJOQ0FTRUNNUCAqLwoKCiNpZm5kZWYgSEFWRV9TVFJEVVAKY2hhciAgICAgICAgICAgKgpzdHJkdXAoY29uc3QgY2hhciAqc3JjKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgY2hhciAgICAgICAgICAgKmRzdDsKCiAgICBsZW4gPSBzdHJsZW4oc3JjKSArIDE7CiAgICBpZiAoKGRzdCA9IChjaGFyICopIG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBzdHJjcHkoZHN0LCBzcmMpOwogICAgcmV0dXJuIChkc3QpOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJEVVAgKi8KCiNpZm5kZWYgSEFWRV9TRVRFTlYKaW50CnNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSkKewogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAob3ZlcndyaXRlID09IDApIHsKICAgICAgICBpZiAoZ2V0ZW52KG5hbWUpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyKTsKICAgIGlmIChjcCA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIHNwcmludGYoY3AsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKICAgIHJldCA9IHB1dGVudihjcCk7CiNpZmRlZiBXSU4zMgogICAgZnJlZShjcCk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU0VURU5WICovCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YoY2FsY3VsYXRlX3RpbWVfZGlmZiwgbmV0c25tcF91bnVzZWQpCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9DQUxDVUxBVEVfVElNRV9ESUZGCi8qKgogKiBDb21wdXRlICgqbm93IC0gKnRoZW4pIGluIGNlbnRpc2Vjb25kcy4KICovCmludApjYWxjdWxhdGVfdGltZV9kaWZmKGNvbnN0IHN0cnVjdCB0aW1ldmFsICpub3csIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aGVuKQp7CiAgICBzdHJ1Y3QgdGltZXZhbCAgZGlmZjsKCiAgICBORVRTTk1QX1RJTUVSU1VCKG5vdywgdGhlbiwgJmRpZmYpOwogICAgcmV0dXJuIChpbnQpKGRpZmYudHZfc2VjICogMTAwICsgZGlmZi50dl91c2VjIC8gMTAwMDApOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0NBTENVTEFURV9USU1FX0RJRkYgKi8KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9DQUxDVUxBVEVfU0VDVElNRV9ESUZGCi8qKiBDb21wdXRlIHJvdW5kZWQgKCpub3cgLSAqdGhlbikgaW4gc2Vjb25kcy4gKi8KdV9pbnQKY2FsY3VsYXRlX3NlY3RpbWVfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCAqbm93LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdGhlbikKewogICAgc3RydWN0IHRpbWV2YWwgIGRpZmY7CgogICAgTkVUU05NUF9USU1FUlNVQihub3csIHRoZW4sICZkaWZmKTsKICAgIHJldHVybiBkaWZmLnR2X3NlYyArIChkaWZmLnR2X3VzZWMgPj0gNTAwMDAwTCk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMQ1VMQVRFX1NFQ1RJTUVfRElGRiAqLwoKI2lmbmRlZiBIQVZFX1NUUkNBU0VTVFIKLyoKICogb25seSBnbGliYzIgaGFzIHRoaXMuCiAqLwpjaGFyICAgICAgICAgICAqCnN0cmNhc2VzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkKewogICAgY29uc3QgY2hhciAgICAgKmNwMSA9IGhheXN0YWNrLCAqY3AyID0gbmVlZGxlOwogICAgY29uc3QgY2hhciAgICAgKmN4OwogICAgaW50ICAgICAgICAgICAgIHRzdGNoMSwgdHN0Y2gyOwoKICAgIC8qCiAgICAgKiBwcmludGYoImxvb2tpbmcgZm9yICclcycgaW4gJyVzJ1xuIiwgbmVlZGxlLCBoYXlzdGFjayk7IAogICAgICovCiAgICBpZiAoY3AxICYmIGNwMiAmJiAqY3AxICYmICpjcDIpCiAgICAgICAgZm9yIChjcDEgPSBoYXlzdGFjaywgY3AyID0gbmVlZGxlOyAqY3AxOykgewogICAgICAgICAgICBjeCA9IGNwMTsKICAgICAgICAgICAgY3AyID0gbmVlZGxlOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcHJpbnRmKCJUJyVjJyAiLCAqY3AxKTsgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICghKmNwMikgeyAgICAvKiBmb3VuZCB0aGUgbmVlZGxlICovCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBwcmludGYoIlxuZm91bmQgJyVzJyBpbiAnJXMnXG4iLCBuZWVkbGUsIGN4KTsgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgY3gpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEqY3AxKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIHRzdGNoMSA9IHRvdXBwZXIoKmNwMSk7CiAgICAgICAgICAgICAgICB0c3RjaDIgPSB0b3VwcGVyKCpjcDIpOwogICAgICAgICAgICAgICAgaWYgKHRzdGNoMSAhPSB0c3RjaDIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcHJpbnRmKCJNJyVjJyAiLCAqY3AxKTsgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNwMSsrOwogICAgICAgICAgICAgICAgY3AyKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKDEpOwogICAgICAgICAgICBpZiAoKmNwMSkKICAgICAgICAgICAgICAgIGNwMSsrOwogICAgICAgIH0KICAgIC8qCiAgICAgKiBwcmludGYoIlxuIik7IAogICAgICovCiAgICBpZiAoY3AxICYmICpjcDEpCiAgICAgICAgcmV0dXJuIE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgY3AxKTsKCiAgICByZXR1cm4gTlVMTDsKfQojZW5kaWYKCmludApta2RpcmhpZXIoY29uc3QgY2hhciAqcGF0aG5hbWUsIG1vZGVfdCBtb2RlLCBpbnQgc2tpcGxhc3QpCnsKICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOwogICAgY2hhciAgICAgICAgICAgKm91cmNvcHkgPSBzdHJkdXAocGF0aG5hbWUpOwogICAgY2hhciAgICAgICAgICAgKmVudHJ5OwogICAgY2hhciAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAqc3QgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIHJlczsKCiAgICByZXMgPSBTTk1QRVJSX0dFTkVSUjsKICAgIGlmICghb3VyY29weSkKICAgICAgICBnb3RvIG91dDsKCiAgICBidWYgPSBtYWxsb2Moc3RybGVuKHBhdGhuYW1lKSArIDIpOwogICAgaWYgKCFidWYpCiAgICAgICAgZ290byBvdXQ7CgojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIC8qIGNvbnZlcnQgYmFja3NsYXNoIHRvIGZvcndhcmQgc2xhc2ggKi8KICAgIGZvciAoZW50cnkgPSBvdXJjb3B5OyAqZW50cnk7IGVudHJ5KyspCiAgICAgICAgaWYgKCplbnRyeSA9PSAnXFwnKQogICAgICAgICAgICAqZW50cnkgPSAnLyc7CiNlbmRpZgoKICAgIGVudHJ5ID0gc3RydG9rX3Iob3VyY29weSwgIi8iLCAmc3QpOwoKICAgIGJ1ZlswXSA9ICdcMCc7CgojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIC8qCiAgICAgKiBDaGVjayBpZiBmaXJzdCBlbnRyeSBjb250YWlucyBhIGRyaXZlLWxldHRlcgogICAgICogICBlLmcgICJjOi9wYXRoIgogICAgICovCiAgICBpZiAoKGVudHJ5KSAmJiAoJzonID09IGVudHJ5WzFdKSAmJgogICAgICAgICgoJ1wwJyA9PSBlbnRyeVsyXSkgfHwgKCcvJyA9PSBlbnRyeVsyXSkpKSB7CiAgICAgICAgc3RyY2F0KGJ1ZiwgZW50cnkpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgIi8iLCAmc3QpOwogICAgfQojZW5kaWYKCiAgICAvKgogICAgICogY2hlY2sgdG8gc2VlIGlmIGZpbGVuYW1lIGlzIGEgZGlyZWN0b3J5IAogICAgICovCiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBzdHJjYXQoYnVmLCAiLyIpOwogICAgICAgIHN0cmNhdChidWYsIGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsICIvIiwgJnN0KTsKICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCAmJiBza2lwbGFzdCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKHN0YXQoYnVmLCAmc2J1ZikgPCAwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIERORSwgbWFrZSBpdCAKICAgICAgICAgICAgICovCiNpZmRlZiBXSU4zMgogICAgICAgICAgICBpZiAoQ3JlYXRlRGlyZWN0b3J5KGJ1ZiwgTlVMTCkgPT0gMCkKI2Vsc2UKICAgICAgICAgICAgaWYgKG1rZGlyKGJ1ZiwgbW9kZSkgPT0gLTEpCiNlbmRpZgogICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAiQ3JlYXRlZCBkaXJlY3Rvcnk6ICVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGV4aXN0cywgaXMgaXQgYSBmaWxlPyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICgoc2J1Zi5zdF9tb2RlICYgU19JRkRJUikgPT0gMCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGFjayEgY2FuJ3QgbWFrZSBhIGRpcmVjdG9yeSBvbiB0b3Agb2YgYSBmaWxlIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJlcyA9IFNOTVBFUlJfU1VDQ0VTUzsKb3V0OgogICAgZnJlZShidWYpOwogICAgZnJlZShvdXJjb3B5KTsKICAgIHJldHVybiByZXM7Cn0KCi8qKgogKiBuZXRzbm1wX21rdGVtcCBjcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgYmFzZWQgb24gdGhlCiAqICAgICAgICAgICAgICAgICBjb25maWd1cmVkIHRlbXBGaWxlUGF0dGVybgogKgogKiBAcmV0dXJuIGZpbGUgZGVzY3JpcHRvcgogKi8KY29uc3QgY2hhciAgICAgKgpuZXRzbm1wX21rdGVtcCh2b2lkKQp7CiNpZmRlZiBQQVRIX01BWAogICAgc3RhdGljIGNoYXIgICAgIG5hbWVbUEFUSF9NQVhdOwojZWxzZQogICAgc3RhdGljIGNoYXIgICAgIG5hbWVbMjU2XTsKI2VuZGlmCiAgICBpbnQgICAgICAgICAgICAgZmQgPSAtMTsKCiAgICBzdHJsY3B5KG5hbWUsIGdldF90ZW1wX2ZpbGVfcGF0dGVybigpLCBzaXplb2YobmFtZSkpOwojaWZkZWYgSEFWRV9NS1NURU1QCiAgICB7CiAgICAgICAgbW9kZV90IG9sZG1hc2sgPSB1bWFzayh+KFNfSVJVU1IgfCBTX0lXVVNSKSk7CiAgICAgICAgbmV0c25tcF9hc3NlcnQob2xkbWFzayAhPSAobW9kZV90KSgtMSkpOwogICAgICAgIGZkID0gbWtzdGVtcChuYW1lKTsKICAgICAgICB1bWFzayhvbGRtYXNrKTsKICAgIH0KI2Vsc2UKICAgIGlmIChta3RlbXAobmFtZSkpIHsKIyBpZm5kZWYgV0lOMzIKICAgICAgICBmZCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7CiMgZWxzZQogICAgICAgIC8qCiAgICAgICAgICogV2luMzIgbmVlZHMgX1NfSVJFQUQgfCBfU19JV1JJVEUgdG8gc2V0IHBlcm1pc3Npb25zIG9uIGZpbGUKICAgICAgICAgKiBhZnRlciBjbG9zaW5nCiAgICAgICAgICovCiAgICAgICAgZmQgPSBfb3BlbihuYW1lLCBfT19DUkVBVCB8IF9PX0VYQ0wgfCBfT19XUk9OTFksIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKIyBlbmRpZgogICAgfQojZW5kaWYKICAgIGlmIChmZCA+PSAwKSB7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX21rdGVtcCIsICJ0ZW1wIGZpbGUgY3JlYXRlZDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSkpOwogICAgICAgIHJldHVybiBuYW1lOwogICAgfQogICAgc25tcF9sb2coTE9HX0VSUiwgIm5ldHNubXBfbWt0ZW1wOiBlcnJvciBjcmVhdGluZyBmaWxlICVzXG4iLAogICAgICAgICAgICAgbmFtZSk7CiAgICByZXR1cm4gTlVMTDsKfQoKLyoKICogVGhpcyBmdW5jdGlvbiB3YXMgY3JlYXRlZCB0byBkaWZmZXJlbnRpYXRlIGFjdGlvbnMKICogdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIExpbnV4IDIuNCBrZXJuZWxzLCBidXQgbm90IGxhdGVyIGtlcm5lbHMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gdGVzdCBrZXJuZWxzIG9uIGFueSBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHVuYW1lKCkuCiAqCiAqIElmIG5vdCBydW5uaW5nIGEgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB1bmFtZSgpLCByZXR1cm4gLTEuCiAqCiAqIElmIG9zcG5hbWUgbWF0Y2hlcywgYW5kIHRoZSByZWxlYXNlIG1hdGNoZXMgdXAgdGhyb3VnaCB0aGUgcHJlZml4LAogKiAgcmV0dXJuIDAuCiAqIElmIHRoZSByZWxlYXNlIGlzIG9yZGVyZWQgaGlnaGVyLCByZXR1cm4gMS4KICogQmUgYXdhcmUgdGhhdCAib3JkZXJlZCBoaWdoZXIiIGlzIG5vdCBhIGd1YXJhbnRlZSBvZiBjb3JyZWN0bmVzcy4KICovCmludApuZXRzbm1wX29zX3ByZW1hdGNoKGNvbnN0IGNoYXIgKm9zcG1uYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9zcG1yZWxwcmVmaXgpCnsKI2lmIEhBVkVfU1lTX1VUU05BTUVfSApzdGF0aWMgaW50IHByaW50T1NvbmNlID0gMTsKICBzdHJ1Y3QgdXRzbmFtZSB1dHNidWY7CiAgaWYgKCAwICE9IHVuYW1lKCZ1dHNidWYpKQogICAgcmV0dXJuIC0xOwoKICBpZiAocHJpbnRPU29uY2UpIHsKICAgIHByaW50T1NvbmNlID0gMDsKICAgIC8qIHNob3cgdGhlIGZvdXIgZWxlbWVudHMgdGhhdCB0aGUga2VybmVsIGNhbiBiZSBzdXJlIG9mICovCiAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwic3lzbmFtZSAnJXMnLFxucmVsZWFzZSAnJXMnLFxudmVyc2lvbiAnJXMnLFxubWFjaGluZSAnJXMnXG4iLAogICAgICB1dHNidWYuc3lzbmFtZSwgdXRzYnVmLnJlbGVhc2UsIHV0c2J1Zi52ZXJzaW9uLCB1dHNidWYubWFjaGluZSkpOwogIH0KICBpZiAoMCAhPSBzdHJjYXNlY21wKHV0c2J1Zi5zeXNuYW1lLCBvc3BtbmFtZSkpIHJldHVybiAtMTsKCiAgLyogUmVxdWlyZWQgdG8gbWF0Y2ggb25seSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzICovCiAgcmV0dXJuIHN0cm5jYXNlY21wKHV0c2J1Zi5yZWxlYXNlLCBvc3BtcmVscHJlZml4LCBzdHJsZW4ob3NwbXJlbHByZWZpeCkpOwoKI2Vsc2UKCiAgcmV0dXJuIC0xOwoKI2VuZGlmIC8qIEhBVkVfU1lTX1VUU05BTUVfSCAqLwp9CgovKioKICogbmV0c25tcF9vc19rZXJuZWxfd2lkdGggZGV0ZXJtaW5lcyBrZXJuZWwgd2lkdGggYXQgcnVudGltZQogKiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIElSSVgsIEFJWCBhbmQgVHJ1NjQgVW5peAogKgogKiBAcmV0dXJuIGtlcm5lbCB3aWR0aCAodXN1YWxseSAzMiBvciA2NCkgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKICovCmludApuZXRzbm1wX29zX2tlcm5lbF93aWR0aCh2b2lkKQp7CiNpZmRlZiBpcml4NgogIGNoYXIgYnVmWzhdOwogIHN5c2luZm8oX01JUFNfU0lfT1NfTkFNRSwgYnVmLCA3KTsKICBpZiAoc3RybmNtcCgiSVJJWDY0IiwgYnVmLCA2KSA9PSAwKSB7CiAgICByZXR1cm4gNjQ7CiAgfSBlbHNlIGlmIChzdHJuY21wKCJJUklYIiwgYnVmLCA0KSA9PSAwKSB7CiAgICByZXR1cm4gMzI7CiAgfSBlbHNlIHsKICAgIHJldHVybiAtMTsKICB9CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICByZXR1cm4gKF9fS0VSTkVMXzMyKCkgPyAzMiA6IChfX0tFUk5FTF82NCgpID8gNjQgOiAtMSkpOwojZWxpZiBkZWZpbmVkKG9zZjQpIHx8IGRlZmluZWQob3NmNSkgfHwgZGVmaW5lZChfX2FscGhhKQogIHJldHVybiA2NDsgLyogQWxwaGEgaXMgYWx3YXlzIDY0Yml0ICovCiNlbHNlCiAgLyoga2VybmVsIHdpZHRoIGRldGVjdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KICByZXR1cm4gLTE7CiNlbmRpZgp9CgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2Yoc3RyX3RvX3VpZCwgdXNlcl9pbmZvcm1hdGlvbikKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NUUl9UT19VSUQKLyoqCiAqIENvbnZlcnQgYSB1c2VyIG5hbWUgb3IgbnVtYmVyIGludG8gbnVtZXJpYyBmb3JtLgogKgogKiBAcGFyYW1baW5dIHVzZXJvcnVpZCBFaXRoZXIgYSBVbml4IHVzZXIgbmFtZSBvciB0aGUgQVNDSUkgcmVwcmVzZW50YXRpb24KICogICBvZiBhIHVzZXIgbnVtYmVyLgogKgogKiBAcmV0dXJuIEVpdGhlciBhIHVzZXIgbnVtYmVyID4gMCBvciAwIGlmIHVzZXJvcnVpZCBpcyBub3QgYSB2YWxpZCB1c2VyCiAqICAgbmFtZSwgbm90IGEgdmFsaWQgdXNlciBudW1iZXIgb3IgdGhlIG5hbWUgb2YgdGhlIHJvb3QgdXNlci4KICovCmludCBuZXRzbm1wX3N0cl90b191aWQoY29uc3QgY2hhciAqdXNlcm9ydWlkKSB7CiAgICBpbnQgdWlkOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICBzdHJ1Y3QgcGFzc3dkICpwd2Q7CiNlbmRpZgoKICAgIHVpZCA9IGF0b2kodXNlcm9ydWlkKTsKCiAgICBpZiAodWlkID09IDApIHsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgIHB3ZCA9IGdldHB3bmFtKHVzZXJvcnVpZCk7CiAgICAgICAgdWlkID0gcHdkID8gcHdkLT5wd191aWQgOiAwOwogICAgICAgIGVuZHB3ZW50KCk7CiNlbmRpZgogICAgICAgIGlmICh1aWQgPT0gMCkKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJDYW4ndCBpZGVudGlmeSB1c2VyICglcykuXG4iLCB1c2Vyb3J1aWQpOwogICAgfQogICAgcmV0dXJuIHVpZDsKICAgIAp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1NUUl9UT19VSUQgKi8KCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzdHJfdG9fZ2lkLCB1c2VyX2luZm9ybWF0aW9uKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX0dJRAovKioKICogQ29udmVydCBhIGdyb3VwIG5hbWUgb3IgbnVtYmVyIGludG8gbnVtZXJpYyBmb3JtLgogKgogKiBAcGFyYW1baW5dIGdyb3Vwb3JnaWQgRWl0aGVyIGEgVW5peCBncm91cCBuYW1lIG9yIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbgogKiAgIG9mIGEgZ3JvdXAgbnVtYmVyLgogKgogKiBAcmV0dXJuIEVpdGhlciBhIGdyb3VwIG51bWJlciA+IDAgb3IgMCBpZiBncm91cG9yZ2lkIGlzIG5vdCBhIHZhbGlkIGdyb3VwCiAqICAgbmFtZSwgbm90IGEgdmFsaWQgZ3JvdXAgbnVtYmVyIG9yIHRoZSByb290IGdyb3VwLgogKi8KaW50IG5ldHNubXBfc3RyX3RvX2dpZChjb25zdCBjaGFyICpncm91cG9yZ2lkKQp7CiAgICBpbnQgZ2lkOwoKICAgIGdpZCA9IGF0b2koZ3JvdXBvcmdpZCk7CgogICAgaWYgKGdpZCA9PSAwKSB7CiNpZiBIQVZFX0dFVEdSTkFNICYmIEhBVkVfR1JQX0gKICAgICAgICBzdHJ1Y3QgZ3JvdXAgICpncnA7CgogICAgICAgIGdycCA9IGdldGdybmFtKGdyb3Vwb3JnaWQpOwogICAgICAgIGdpZCA9IGdycCA/IGdycC0+Z3JfZ2lkIDogMDsKICAgICAgICBlbmRncmVudCgpOwojZW5kaWYKICAgICAgICBpZiAoZ2lkID09IDApCiAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAiQ2FuJ3QgaWRlbnRpZnkgZ3JvdXAgKCVzKS5cbiIsIGdyb3Vwb3JnaWQpOwogICAgfQoKICAgIHJldHVybiBnaWQ7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX0dJRCAqLwo=