LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCiNlbHNlCiMgZGVmaW5lIGRpcmVudCBkaXJlY3QKIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCiMgaWYgSEFWRV9TWVNfTkRJUl9ICiMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX1NZU19ESVJfSAojICBpbmNsdWRlIDxzeXMvZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX05ESVJfSAojICBpbmNsdWRlIDxuZGlyLmg+CiMgZW5kaWYKI2VuZGlmCgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX2FwaSwgbGlibmV0c25tcCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zdHJpbmdzX2FsbCwgbWliX2FwaSkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc25wcmludCwgbWliX3N0cmluZ3NfYWxsKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobWliX3NucHJpbnRfZGVzY3JpcHRpb24sIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKG1pYl9zbnByaW50X3ZhcmlhYmxlLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfc3RyaW5nX2NvbnZlcnNpb25zLCBtaWJfc3RyaW5nc19hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihwcmludF9taWIsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfb2JqaWQsIG1pYl9zdHJpbmdzX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNucHJpbnRfdmFsdWUsIG1pYl9zdHJpbmdzX2FsbCkKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihtaWJfdG9fYXNuX3R5cGUsIG1pYl9hcGkpCgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqdHJlZV9oZWFkOwpzdGF0aWMgc3RydWN0IHRyZWUgKnRyZWVfdG9wOwoKTkVUU05NUF9JTVBPUlQgc3RydWN0IHRyZWUgKk1pYjsKc3RydWN0IHRyZWUgICAgKk1pYjsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgpvaWQgICAgICAgICAgICAgUkZDMTIxM19NSUJbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSB9OwpzdGF0aWMgY2hhciAgICAgU3RhbmRhcmRfUHJlZml4W10gPSAiLjEuMy42LjEuMi4xIjsKCi8qCiAqIFNldCBkZWZhdWx0IGhlcmUgYXMgc29tZSB1c2VzIG9mIHJlYWRfb2JqaWQgcmVxdWlyZSB2YWxpZCBwb2ludGVyLiAKICovCnN0YXRpYyBjaGFyICAgICpQcmVmaXggPSAmU3RhbmRhcmRfUHJlZml4WzBdOwp0eXBlZGVmIHN0cnVjdCBfUHJlZml4TGlzdCB7CiAgICBjb25zdCBjaGFyICAgICAqc3RyOwogICAgaW50ICAgICAgICAgICAgIGxlbjsKfSAgICAgICAgICAgICAgKlByZWZpeExpc3RQdHIsIFByZWZpeExpc3Q7CgovKgogKiBIZXJlIGFyZSB0aGUgcHJlZml4IHN0cmluZ3MuCiAqIE5vdGUgdGhhdCB0aGUgZmlyc3Qgb25lIGZpbmRzIHRoZSB2YWx1ZSBvZiBQcmVmaXggb3IgU3RhbmRhcmRfUHJlZml4LgogKiBBbnkgb2YgdGhlc2UgTUFZIHN0YXJ0IHdpdGggcGVyaW9kOyBhbGwgd2lsbCBOT1QgZW5kIHdpdGggcGVyaW9kLgogKiBQZXJpb2QgaXMgYWRkZWQgd2hlcmUgbmVlZGVkLiAgU2VlIHVzZSBvZiBQcmVmaXggaW4gdGhpcyBtb2R1bGUuCiAqLwpQcmVmaXhMaXN0ICAgICAgbWliX3ByZWZpeGVzW10gPSB7CiAgICB7JlN0YW5kYXJkX1ByZWZpeFswXX0sICAgICAgLyogcGxhY2Vob2xkZXIgZm9yIFByZWZpeCBkYXRhICovCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5tZ210Lm1pYi0yIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5leHBlcmltZW50YWwifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnByaXZhdGUifSwKICAgIHsiLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBQYXJ0aWVzIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wU2VjcmV0cyJ9LAogICAge05VTEwsIDB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBsaXN0ICovCn07CgplbnVtIGluZXRfYWRkcmVzc190eXBlIHsKICAgIElQVjQgPSAxLAogICAgSVBWNiA9IDIsCiAgICBJUFY0WiA9IDMsCiAgICBJUFY2WiA9IDQsCiAgICBETlMgPSAxNgp9OwoKCi8qKgogKiBAaW50ZXJuYWwKICogQ29udmVydHMgdGltZXRpY2tzIHRvIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIHN0cmluZy4KICoKICogQHBhcmFtIHRpbWV0aWNrcyAgICBUaGUgdGltZXRpY2tzIHRvIGNvbnZlcnQuCiAqIEBwYXJhbSBidWYgICAgICAgICAgQnVmZmVyIHRvIHdyaXRlIHRvLCBoYXMgdG8gYmUgYXQgCiAqICAgICAgICAgICAgICAgICAgICAgbGVhc3QgNDAgQnl0ZXMgbGFyZ2UuCiAqICAgICAgIAogKiBAcmV0dXJuIFRoZSBidWZmZXIuCiAqLwpzdGF0aWMgY2hhciAgICAqCnVwdGltZVN0cmluZyh1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIGludCAgICAgICAgICAgICBjZW50aXNlY3MsIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBkYXlzOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpKSB7CiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlbHUiLCB0aW1ldGlja3MpOwogICAgICAgIHJldHVybiBidWY7CiAgICB9CgoKICAgIGNlbnRpc2VjcyA9IHRpbWV0aWNrcyAlIDEwMDsKICAgIHRpbWV0aWNrcyAvPSAxMDA7CiAgICBkYXlzID0gdGltZXRpY2tzIC8gKDYwICogNjAgKiAyNCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjAgKiAyNCk7CgogICAgaG91cnMgPSB0aW1ldGlja3MgLyAoNjAgKiA2MCk7CiAgICB0aW1ldGlja3MgJT0gKDYwICogNjApOwoKICAgIG1pbnV0ZXMgPSB0aW1ldGlja3MgLyA2MDsKICAgIHNlY29uZHMgPSB0aW1ldGlja3MgJSA2MDsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkKICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgZWxzZSB7CiAgICAgICAgaWYgKGRheXMgPT0gMCkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMgPT0gMSkgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheSwgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWQgZGF5cywgJWQ6JTAyZDolMDJkLiUwMmQiLAogICAgICAgICAgICAgICAgICAgIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBjZW50aXNlY3MpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBidWY7Cn0KCgoKLyoqCiAqIEBpbnRlcm5hbAogKiBQcmludHMgdGhlIGNoYXJhY3RlciBwb2ludGVkIHRvIGlmIGluIGh1bWFuLXJlYWRhYmxlIEFTQ0lJIHJhbmdlLAogKiBvdGhlcndpc2UgcHJpbnRzIGEgZG90LgogKgogKiBAcGFyYW0gYnVmIEJ1ZmZlciB0byBwcmludCB0aGUgY2hhcmFjdGVyIHRvLgogKiBAcGFyYW0gY2ggIENoYXJhY3RlciB0byBwcmludC4KICovCnN0YXRpYyB2b2lkCnNwcmludF9jaGFyKGNoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyIGNoKQp7CiAgICBpZiAoaXNwcmludChjaCkgfHwgaXNzcGFjZShjaCkpIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKGludCkgY2gpOwogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKGJ1ZiwgIi4iKTsKICAgIH0KfQoKCgovKioKICogUHJpbnRzIGEgaGV4YWRlY2ltYWwgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSBjaGFyYWN0ZXJzIHBvaW50ZWQgYnkgKmNwIGFyZSBlbmNvZGVkIGFzIGhleGFkZWNpbWFsIHN0cmluZy4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGluZV9sZW4gdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKX3NwcmludF9oZXhzdHJpbmdfbGluZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxpbmVfbGVuKQp7CiAgICBjb25zdCB1X2NoYXIgICAqdHA7CiAgICBjb25zdCB1X2NoYXIgICAqY3AyID0gY3A7CiAgICBzaXplX3QgICAgICAgICAgbGVubGVmdCA9IGxpbmVfbGVuOwoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgdGhlIGhleCBvdXRwdXQuLi4uCiAgICAgKi8KICAgIHdoaWxlICgoKm91dF9sZW4gKyBsaW5lX2xlbiozKzEpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIGFuZCBkaXNwbGF5IHRoZSBoZXggdmFsdWVzIHRoZW1zZWx2ZXMuLi4uCiAgICAgKi8KICAgIGZvciAoOyBsZW5sZWZ0ID49IDg7IGxlbmxlZnQtPTgpIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLAogICAgICAgICAgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAiLCBjcFswXSwgY3BbMV0sCiAgICAgICAgICAgICAgICBjcFsyXSwgY3BbM10sIGNwWzRdLCBjcFs1XSwgY3BbNl0sIGNwWzddKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGNwICAgICAgICs9IDg7CiAgICB9CiAgICBmb3IgKDsgbGVubGVmdCA+IDA7IGxlbmxlZnQtLSkgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYICIsICpjcCsrKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQoKICAgIC8qCiAgICAgKiAuLi4uIHBsdXMgKG9wdGlvbmFsbHkpIGRvIHRoZSBzYW1lIGZvciB0aGUgQVNDSUkgZXF1aXZhbGVudC4KICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCkpIHsKICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4rNSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIgIFsiKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgICAgIGZvciAodHAgPSBjcDI7IHRwIDwgY3A7IHRwKyspIHsKICAgICAgICAgICAgc3ByaW50X2NoYXIoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICp0cCk7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIl0iKTsKICAgICAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludApzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBjb25zdCB1X2NoYXIgKiBjcCwgc2l6ZV90IGxlbikKewogICAgaW50IGxpbmVfbGVuID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7CiAgICBpZiAoIWxpbmVfbGVuKQogICAgICAgIGxpbmVfbGVuPWxlbjsKCiAgICBmb3IgKDsgKGludClsZW4gPiBsaW5lX2xlbjsgbGVuIC09IGxpbmVfbGVuKSB7CiAgICAgICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGluZV9sZW4pKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xuJzsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgICAgIGNwICs9IGxpbmVfbGVuOwogICAgfQogICAgaWYoIV9zcHJpbnRfaGV4c3RyaW5nX2xpbmUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCwgbGVuKSkKICAgICAgICByZXR1cm4gMDsKICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IDA7CiAgICByZXR1cm4gMTsKfQoKCgovKioKICogUHJpbnRzIGFuIGFzY2lpIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBhbiBhc2NpaSBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIGFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSBjcCAgICAgICB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyB0byBlbmNvZGUuCiAqIEBwYXJhbSBsZW4gICAgICB0aGUgYXJyYXkgbGVuZ3RoIG9mIGNwLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19hc2NpaXN0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBsZW47IGkrKykgewogICAgICAgIGlmIChpc3ByaW50KCpjcCkgfHwgaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJ1xcJyB8fCAqY3AgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnXFwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gKmNwKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICgqb3V0X2xlbikrKykgPSAnLic7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgfQogICAgfQogICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgcmV0dXJuIDE7Cn0KCi8qKgogKiBQcmludHMgYW4gb2N0ZXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBvY3RldCBzdHJpbmcuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgc2F2ZWRfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgY29uc3QgY2hhciAgICAgKnNhdmVkX2hpbnQgPSBoaW50OwogICAgaW50ICAgICAgICAgICAgIGhleCA9IDAsIHggPSAwOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQsIGNudDsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGNvbnN0IGNoYXIgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT0NURVQgU1RSSU5HKTogIjsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCgogICAgaWYgKGhpbnQpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgcmVwZWF0LCB3aWR0aCA9IDE7CiAgICAgICAgbG9uZyAgICAgICAgICAgIHZhbHVlOwogICAgICAgIGNoYXIgICAgICAgICAgICBjb2RlID0gJ2QnLCBzZXBhciA9IDAsIHRlcm0gPSAwLCBjaCwgaW50YnVmWzMyXTsKI2RlZmluZSBIRVgyRElHSVRfTkVFRF9JTklUIDMKICAgICAgICBjaGFyICAgICAgICAgICAgaGV4MmRpZ2l0ID0gSEVYMkRJR0lUX05FRURfSU5JVDsKICAgICAgICB1X2NoYXIgICAgICAgICAqZWNwOwoKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3AgPSB2YXItPnZhbC5zdHJpbmc7CiAgICAgICAgZWNwID0gY3AgKyB2YXItPnZhbF9sZW47CgogICAgICAgIHdoaWxlIChjcCA8IGVjcCkgewogICAgICAgICAgICByZXBlYXQgPSAxOwogICAgICAgICAgICBpZiAoKmhpbnQpIHsKICAgICAgICAgICAgICAgIGlmICgqaGludCA9PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAqY3ArKzsKICAgICAgICAgICAgICAgICAgICBoaW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoJzAnIDw9ICpoaW50ICYmICpoaW50IDw9ICc5JykKICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICh3aWR0aCAqIDEwKSArICgqaGludCsrIC0gJzAnKTsKICAgICAgICAgICAgICAgIGNvZGUgPSAqaGludCsrOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHNlcGFyID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzZXBhciA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGNoID0gKmhpbnQpICYmIGNoICE9ICcqJyAmJiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCiAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICE9IDAKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoICE9ICd4JyAmJiBjaCAhPSAnZCcgJiYgY2ggIT0gJ28nKSkpCiAgICAgICAgICAgICAgICAgICAgdGVybSA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgdGVybSA9IDA7CiAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIC8qIEhhbmRsZSBtYWxmb3JtZWQgaGludCBzdHJpbmdzICovCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAocmVwZWF0ICYmIGNwIDwgZWNwKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAnYScgJiYgY29kZSAhPSAndCcpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMjU2ICsgKmNwKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICBpZiAoSEVYMkRJR0lUX05FRURfSU5JVCA9PSBoZXgyZGlnaXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGhleDJkaWdpdCA9IG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIGlmIHZhbHVlIGlzIDwgMTYsIGl0IHdpbGwgYmUgYSBzaW5nbGUgaGV4IGRpZ2l0LiBJZiB0aGUKICAgICAgICAgICAgICAgICAgICAgKiB3aWR0aCBpcyAxICh3ZSBhcmUgb3V0cHV0dGluZyBhIGJ5dGUgYXQgYSB0aW1lKSwgcGF0IGl0CiAgICAgICAgICAgICAgICAgICAgICogdG8gMiBkaWdpdHMgaWYgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQgaXMgc2V0CiAgICAgICAgICAgICAgICAgICAgICogb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgICAgICAgICAgICAgICAgICAgICogIC0gd2UgZG8gbm90IGhhdmUgYSBzZXBhcmF0aW9uIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgICAgICAqICAtIHRoZXJlIGlzIG5vIGhpbnQgbGVmdCAob3IgdGhlcmUgbmV2ZXIgd2FzIGEgaGludCkKICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAqIGUuZy4gZm9yIHRoZSBkYXRhIDB4QUEwMUJCLCB3b3VsZCBhbnlvbmUgcmVhbGx5IGV2ZXIKICAgICAgICAgICAgICAgICAgICAgKiB3YW50IHRoZSBzdHJpbmcgIkFBMUJCIj8/CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKCgodmFsdWUgPCAxNikgJiYgKDEgPT0gd2lkdGgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoaGV4MmRpZ2l0IHx8ICgoMCA9PSBzZXBhcikgJiYgKDAgPT0gKmhpbnQpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIwJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx4IiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxkIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbG8iLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd0JzogLyogbmV3IGluIHJmYyAzNDExICovCiAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgICAgICBjbnQgPSBTTk1QX01JTih3aWR0aCwgZWNwIC0gY3ApOwogICAgICAgICAgICAgICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgY3AsIGNudCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIGNwICs9IGNudDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgKm91dF9sZW4gPSBzYXZlZF9vdXRfbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihCYWQgaGludCBpZ25vcmVkOiAiKQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCBzYXZlZF9oaW50KQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiKSAiKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGNwIDwgZWNwICYmIHNlcGFyKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBzZXBhcjsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcGVhdC0tOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGVybSAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDEpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gdGVybTsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh1bml0cykgewogICAgICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgICAgIH0KICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX1NUUklOR19PVVRQVVRfR1VFU1M7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgZm9yIChjcCA9IHZhci0+dmFsLnN0cmluZywgeCA9IDA7IHggPCAoaW50KSB2YXItPnZhbF9sZW47IHgrKywgY3ArKykgewogICAgICAgICAgICBpZiAoIWlzcHJpbnQoKmNwKSAmJiAhaXNzcGFjZSgqY3ApKSB7CiAgICAgICAgICAgICAgICBoZXggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0FTQ0lJOgogICAgICAgIGhleCA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX1NUUklOR19PVVRQVVRfSEVYOgogICAgICAgIGhleCA9IDE7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHZhci0+dmFsX2xlbiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlwiIik7CiAgICB9CgogICAgaWYgKGhleCkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJIZXgtU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcsIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSSU5HOiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdmFyLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKCi8qKgogKiBQcmludHMgYSBmbG9hdCBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZmxvYXQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0ZMT0FUKSAmJgogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBGbG9hdCk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogRmxvYXQ6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqIEhvdyBtdWNoIHNwYWNlIG5lZWRlZCBmb3IgbWF4LiBsZW5ndGggZmxvYXQ/ICAxMjggaXMgb3ZlcmtpbGwuICAKICAgICAqLwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAxMjggKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWYiLCAqdmFyLT52YWwuZmxvYXRWYWwpOwogICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBkb3VibGUgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZG91YmxlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRE9VQkxFKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGlmIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIERvdWJsZSk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogRmxvYXQ6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSG93IG11Y2ggc3BhY2UgbmVlZGVkIGZvciBtYXguIGxlbmd0aCBkb3VibGU/ICAxMjggaXMgb3ZlcmtpbGwuICAKICAgICAqLwoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAxMjggKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWYiLCAqdmFyLT52YWwuZG91YmxlVmFsKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KCgovKioKICogUHJpbnRzIGEgY291bnRlciBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgYSBjb3VudGVyIHZhbHVlLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIGE2NGJ1ZltJNjRDSEFSU1ogKyAxXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUjY0CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9DT1VOVEVSNjQKICAgICAgICAmJiB2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9JNjQgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfVTY0CiNlbmRpZgogICAgICAgICkgJiYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQ291bnRlcjY0KTogIikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIGlmICh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NCkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk9wYXF1ZTogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJVSW50NjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjY0OgogICAgICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiNlbmRpZgogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIkNvdW50ZXI2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICB9CiNlbmRpZgogICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICBpZiAodmFyLT50eXBlID09IEFTTl9PUEFRVUVfSTY0KSB7CiAgICAgICAgcHJpbnRJNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICBwcmludFU2NChhNjRidWYsIHZhci0+dmFsLmNvdW50ZXI2NCk7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBhNjRidWYpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgfQojZW5kaWYKCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vcGFxdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09QQVFVRQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfVTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRkxPQVQgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfRE9VQkxFCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICAgICAgKSAmJiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgT3BhcXVlKTogIikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX09QQVFVRV9DT1VOVEVSNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfVTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19mbG9hdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRToKI2VuZGlmCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPUEFRVUU6ICI7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgfQojZW5kaWYKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PQkpFQ1RfSUQpICYmCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPQogICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9CSkVDVCBJREVOVElGSUVSKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk9JRDogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvaWQgKikgKHZhci0+dmFsLm9iamlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSk7CgogICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCgovKioKICogUHJpbnRzIGEgdGltZXRpY2sgdmFyaWFibGUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY190aW1ldGlja3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRpbWVidWZbNDBdOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9USU1FVElDS1MpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBUaW1ldGlja3MpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiJWx1IiwgKih1X2xvbmcgKikgdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICJUaW1ldGlja3M6ICglbHUpICIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHVwdGltZVN0cmluZygqKHVfbG9uZyAqKSAodmFyLT52YWwuaW50ZWdlciksIHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSk7CiAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0aW1lYnVmKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpbnRlZ2VyIGFjY29yZGluZyB0byB0aGUgaGludCBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YWwgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZGVjaW1hbHR5cGUgJ2QnIG9yICd1JyBkZXBlbmRpbmcgb24gaW50ZWdlciB0eXBlCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgX05PVF8gYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbCwgY29uc3QgY2hhciBkZWNpbWFsdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICBmbXRbMTBdID0gIiVsQCIsIHRtcFsyNTZdOwogICAgaW50ICAgICAgICAgICAgIHNoaWZ0ID0gMCwgbGVuLCBuZWdhdGl2ZSA9IDA7CgogICAgaWYgKGhpbnRbMF0gPT0gJ2QnKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSBtaWdodCAqYWN0dWFsbHkqIHdhbnQgYSAndScgaGVyZS4gIAogICAgICAgICAqLwogICAgICAgIGlmIChoaW50WzFdID09ICctJykKICAgICAgICAgICAgc2hpZnQgPSBhdG9pKGhpbnQgKyAyKTsKICAgICAgICBmbXRbMl0gPSBkZWNpbWFsdHlwZTsKICAgICAgICBpZiAodmFsIDwgMCkgewogICAgICAgICAgICBuZWdhdGl2ZSA9IDE7CiAgICAgICAgICAgIHZhbCA9IC12YWw7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIERJU1BMQVktSElOVCBjaGFyYWN0ZXIgaXMgJ2InLCAnbycsIG9yICd4Jy4gIAogICAgICAgICAqLwogICAgICAgIGZtdFsyXSA9IGhpbnRbMF07CiAgICB9CgogICAgaWYgKGhpbnRbMF0gPT0gJ2InKSB7Cgl1bnNpZ25lZCBsb25nIGludCBiaXQgPSAweDgwMDAwMDAwTFU7CgljaGFyICpicCA9IHRtcDsKCXdoaWxlIChiaXQpIHsKCSAgICAqYnArKyA9IHZhbCAmIGJpdCA/ICcxJyA6ICcwJzsKCSAgICBiaXQgPj49IDE7Cgl9CgkqYnAgPSAwOwogICAgfQogICAgZWxzZQoJc3ByaW50Zih0bXAsIGZtdCwgdmFsKTsKCiAgICBpZiAoc2hpZnQgIT0gMCkgewogICAgICAgIGxlbiA9IHN0cmxlbih0bXApOwogICAgICAgIGlmIChzaGlmdCA8PSBsZW4pIHsKICAgICAgICAgICAgdG1wW2xlbiArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0LS0pIHsKICAgICAgICAgICAgICAgIHRtcFtsZW5dID0gdG1wW2xlbiAtIDFdOwogICAgICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1wW2xlbl0gPSAnLic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG1wW3NoaWZ0ICsgMV0gPSAwOwogICAgICAgICAgICB3aGlsZSAoc2hpZnQpIHsKICAgICAgICAgICAgICAgIGlmIChsZW4tLSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gdG1wW2xlbl07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRtcFtzaGlmdF0gPSAnMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzaGlmdC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFswXSA9ICcuJzsKICAgICAgICB9CiAgICB9CiAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKSsxOwogICAgICAgIHdoaWxlIChsZW4pIHsKICAgICAgICAgICAgdG1wW2xlbl0gPSB0bXBbbGVuLTFdOwogICAgICAgICAgICBsZW4tLTsKICAgICAgICB9CiAgICAgICAgdG1wWzBdID0gJy0nOwogICAgfQogICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKHVfY2hhciAqKXRtcCk7Cn0KCgovKioKICogUHJpbnRzIGFuIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmcgPSBOVUxMOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9JTlRFR0VSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgSU5URUdFUik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZm9yICg7IGVudW1zOyBlbnVtcyA9IGVudW1zLT5uZXh0KSB7CiAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAqdmFyLT52YWwuaW50ZWdlcikgewogICAgICAgICAgICBlbnVtX3N0cmluZyA9IGVudW1zLT5sYWJlbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiSU5URUdFUjogIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbnVtX3N0cmluZyA9PSBOVUxMIHx8CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoIShzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAnZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHVuaXRzKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWxkIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiKCVsZCkiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIHVuc2lnbmVkIGludGVnZXIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY191aW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZyA9IE5VTEw7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX1VJTlRFR0VSKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVUludGVnZXIzMik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKnZhci0+dmFsLmludGVnZXIpIHsKICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCEoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ3UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiglbHUpIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGdhdWdlIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfZ2F1Z2UodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fR0FVR0UpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0KICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBHYXVnZTMyIG9yIFVuc2lnbmVkMzIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiR2F1Z2UzMjogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaGludCkgewogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyLCAndScsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgKHVuc2lnbmVkIGludCkoKnZhci0+dmFsLmludGVnZXIgJiAweGZmZmZmZmZmKSk7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRtcCkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgdmFsdWUgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19jb3VudGVyKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgdG1wWzMyXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fQ09VTlRFUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXIzMik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJDb3VudGVyMzI6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgc3ByaW50Zih0bXAsICIldSIsICh1bnNpZ25lZCBpbnQpKCp2YXItPnZhbC5pbnRlZ2VyICYgMHhmZmZmZmZmZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdG1wKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhIG5ldHdvcmsgYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIGk7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5ldHdvcmtBZGRyZXNzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5ldHdvcmsgQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKCgqb3V0X2xlbiArICh2YXItPnZhbF9sZW4gKiAzKSArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCB2YXItPnZhbF9sZW47IGkrKykgewogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICIlMDJYIiwgdmFyLT52YWwuc3RyaW5nW2ldKTsKICAgICAgICAqb3V0X2xlbiArPSAyOwogICAgICAgIGlmIChpIDwgdmFyLT52YWxfbGVuIC0gMSkgewogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnOic7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaXAtYWRkcmVzcyBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2lwYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAqaXAgPSB2YXItPnZhbC5zdHJpbmc7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0lQQUREUkVTUykgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIElwQWRkcmVzcyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJJcEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKCgqb3V0X2xlbiArIDE3KSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpcCkKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJWQuJWQuJWQuJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzBdLCBpcFsxXSwgaXBbMl0sIGlwWzNdKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBudWxsIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfbnVsbCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX05VTEwpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOVUxMKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOVUxMIjsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwogICAgfQp9CgoKLyoqCiAqIFByaW50cyBhIGJpdCBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaW50ICAgICAgICAgICAgIGxlbiwgYml0OwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9CSVRfU1RSICYmIHZhci0+dHlwZSAhPSBBU05fT0NURVRfU1RSKSAmJgogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBCSVRTKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiXCIiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkJJVFM6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuYml0c3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiXCIiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY3AgPSB2YXItPnZhbC5iaXRzdHJpbmc7CiAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAoaW50KSB2YXItPnZhbF9sZW47IGxlbisrKSB7CiAgICAgICAgICAgIGZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKICAgICAgICAgICAgICAgIGlmICgqY3AgJiAoMHg4MCA+PiBiaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09IChsZW4gKiA4KSArIGJpdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlZCAiLCAobGVuICogOCkgKyBiaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIoJWQpICIsIChsZW4gKiA4KSArIGJpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjcCsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fTlNBUCkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE5zYXBBZGRyZXNzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIk5zYXBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pOwp9CgoKLyoqCiAqIEZhbGxiYWNrIHJvdXRpbmUgZm9yIGEgYmFkIHR5cGUsIHByaW50cyAiVmFyaWFibGUgaGFzIGJhZCB0eXBlIiBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2JhZHR5cGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJWYXJpYWJsZSBoYXMgYmFkIHR5cGUiOwoKICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cik7Cn0KCgoKLyoqCiAqIFVuaXZlcnNhbCBwcmludCByb3V0aW5lLCBwcmludHMgYSB2YXJpYWJsZSBpbnRvIGEgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgdmFyaWFibGUgCiAqIHR5cGUuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYnlfdHlwZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgREVCVUdNU0dUTCgoIm91dHB1dCIsICJzcHJpbnRfYnlfdHlwZSwgdHlwZSAlZFxuIiwgdmFyLT50eXBlKSk7CgogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2N0ZXRfc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9CSVRfU1RSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX09QQVFVRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb3BhcXVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX3RpbWV0aWNrcyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fR0FVR0U6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2dhdWdlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3MoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX05VTEw6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX251bGwoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY191aW50ZWdlcihidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19mbG9hdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX09QQVFVRV9ET1VCTEU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2RvdWJsZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzcHJpbnRfYnlfdHlwZSIsICJiYWQgdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19iYWR0eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICB9Cn0KCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKioKICogUmV0cmlldmVzIHRoZSB0cmVlIGhlYWQuCiAqCiAqIEByZXR1cm4gdGhlIHRyZWUgaGVhZC4KICovCnN0cnVjdCB0cmVlICAgICoKZ2V0X3RyZWVfaGVhZCh2b2lkKQp7CiAgICByZXR1cm4gKHRyZWVfaGVhZCk7Cn0KCnN0YXRpYyBjaGFyICAgICpjb25mbWliZGlyID0gTlVMTDsKc3RhdGljIGNoYXIgICAgKmNvbmZtaWJzID0gTlVMTDsKCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjdG1wOwoKICAgIGlmIChjb25mbWliZGlyKSB7CiAgICAgICAgaWYgKCgqbGluZSA9PSAnKycpIHx8ICgqbGluZSA9PSAnLScpKSB7CiAgICAgICAgICAgIGN0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNvbmZtaWJkaXIpICsgc3RybGVuKGxpbmUpICsgMik7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pYmRpciBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKmxpbmUrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBjb25mbWliZGlyLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGxpbmUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBsaW5lLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGNvbmZtaWJkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGNvbmZtaWJkaXIpOwogICAgfSBlbHNlIHsKICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGNvbmZtaWJkaXIgPSBjdG1wOwogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAidXNpbmcgbWliZGlyczogJXNcbiIsIGNvbmZtaWJkaXIpKTsKfQoKc3RhdGljIHZvaWQKaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY2hhciAgICAgICAgICAgKmN0bXA7CgogICAgaWYgKGNvbmZtaWJzKSB7CiAgICAgICAgaWYgKCgqbGluZSA9PSAnKycpIHx8ICgqbGluZSA9PSAnLScpKSB7CiAgICAgICAgICAgIGN0bXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGNvbmZtaWJzKSArIHN0cmxlbihsaW5lKSArIDIpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCpsaW5lKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgY29uZm1pYnMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgbGluZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGxpbmUsIEVOVl9TRVBBUkFUT1JfQ0hBUiwgY29uZm1pYmRpcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoY29uZm1pYnMpOwogICAgfSBlbHNlIHsKICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGNvbmZtaWJzID0gY3RtcDsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInVzaW5nIG1pYnM6ICVzXG4iLCBjb25mbWlicykpOwp9CgoKc3RhdGljIHZvaWQKaGFuZGxlX21pYmZpbGVfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAicmVhZGluZyBtaWJmaWxlOiAlc1xuIiwgbGluZSkpOwogICAgcmVhZF9taWIobGluZSk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZApoYW5kbGVfcHJpbnRfbnVtZXJpYyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICBjaGFyICAgICAgICpzdDsKCiAgICB2YWx1ZSA9IHN0cnRva19yKGxpbmUsICIgXHRcbiIsICZzdCk7CiAgICBpZiAodmFsdWUgJiYgKAoJICAgIChzdHJjYXNlY21wKHZhbHVlLCAieWVzIikgID09IDApIHx8IAoJICAgIChzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpID09IDApIHx8CgkgICAgKCp2YWx1ZSA9PSAnMScpICkpIHsKCiAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMpOwogICAgfQp9CgpjaGFyICAgICAgICAgICAqCnNubXBfb3V0X3RvZ2dsZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMpCnsKICAgIHdoaWxlICgqb3B0aW9ucykgewogICAgICAgIHN3aXRjaCAoKm9wdGlvbnMrKykgewogICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl8yRElHSVRfSEVYX09VVFBVVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0FTQ0lJKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdRJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCwgMSk7CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTlVNRVJJQ19USU1FVElDS1MpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0hFWF9URVhUKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfVUNEKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX1NUUklOR19PVVRQVVRfSEVYKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBvcHRpb25zIC0gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdm9pZApzbm1wX291dF90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXMwOiAgcHJpbnQgbGVhZGluZyAwIGZvciBzaW5nbGUtZGlnaXQgaGV4IGNoYXJhY3RlcnNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNhOiAgcHJpbnQgYWxsIHN0cmluZ3MgaW4gYXNjaWkgZm9ybWF0XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYjogIGRvIG5vdCBicmVhayBPSUQgaW5kZXhlcyBkb3duXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZTogIHByaW50IGVudW1zIG51bWVyaWNhbGx5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzRTogIGVzY2FwZSBxdW90ZXMgaW4gc3RyaW5nIGluZGljZXNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNmOiAgcHJpbnQgZnVsbCBPSURzIG9uIG91dHB1dFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc246ICBwcmludCBPSURzIG51bWVyaWNhbGx5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzcTogIHF1aWNrIHByaW50IGZvciBlYXNpZXIgcGFyc2luZ1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1E6ICBxdWljayBwcmludCB3aXRoIGVxdWFsLXNpZ25zXG4iLCBsZWFkKTsgICAgLyogQEBKRFcgKi8KICAgIGZwcmludGYob3V0ZiwgIiVzczogIHByaW50IG9ubHkgbGFzdCBzeW1ib2xpYyBlbGVtZW50IG9mIE9JRFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1M6ICBwcmludCBNSUIgbW9kdWxlLWlkIHBsdXMgbGFzdCBlbGVtZW50XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdDogIHByaW50IHRpbWV0aWNrcyB1bnBhcnNlZCBhcyBudW1lcmljIGludGVnZXJzXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzVDogIHByaW50IGh1bWFuLXJlYWRhYmxlIHRleHQgYWxvbmcgd2l0aCBoZXggc3RyaW5nc1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3U6ICBwcmludCBPSURzIHVzaW5nIFVDRC1zdHlsZSBwcmVmaXggc3VwcHJlc3Npb25cbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNVOiAgZG9uJ3QgcHJpbnQgdW5pdHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN2OiAgcHJpbnQgdmFsdWVzIG9ubHkgKG5vdCBPSUQgPSB2YWx1ZSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN4OiAgcHJpbnQgYWxsIHN0cmluZ3MgaW4gaGV4IGZvcm1hdFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1g6ICBleHRlbmRlZCBpbmRleCBmb3JtYXRcbiIsIGxlYWQpOwp9CgpjaGFyICoKc25tcF9pbl9vcHRpb25zKGNoYXIgKm9wdGFyZywgaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQp7CiAgICBjaGFyICpjcDsKCiAgICBmb3IgKGNwID0gb3B0YXJnOyAqY3A7IGNwKyspIHsKICAgICAgICBzd2l0Y2ggKCpjcCkgewogICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkVHRVhfQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SQU5ET01fQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0NIRUNLX1JBTkdFKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAvKiBXaGF0IGlmIGFyZ2MvYXJndiBhcmUgbnVsbCA/ICovCiAgICAgICAgICAgIGlmICghKigrK2NwKSkKICAgICAgICAgICAgICAgIGNwID0gYXJndltvcHRpbmQrK107CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgLyogV2hhdCBpZiBhcmdjL2FyZ3YgYXJlIG51bGwgPyAqLwogICAgICAgICAgICBpZiAoISooKytjcCkpCiAgICAgICAgICAgICAgICBjcCA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAvKgogICAgICAgICAgICAqICBIZXJlPyAgT3IgaW4gc25tcF9wYXJzZV9hcmdzPwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5rbm93biBpbnB1dCBvcHRpb24gcGFzc2VkIHRvIC1JOiAlYy5cbiIsICpjcCk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIHJldHVybiBjcDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKY2hhciAgICAgICAgICAgKgpzbm1wX2luX3RvZ2dsZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMpCnsKICAgIHJldHVybiBzbm1wX2luX29wdGlvbnMoIG9wdGlvbnMsIDAsIE5VTEwgKTsKfQoKCi8qKgogKiBQcmludHMgb3V0IGEgaGVscCB1c2FnZSBmb3IgdGhlIGluKiB0b2dnbGUgb3B0aW9ucy4KICoKICogQHBhcmFtIGxlYWQgICAgICBUaGUgbGVhZCB0byBwcmludCBmb3IgZXZlcnkgbGluZS4KICogQHBhcmFtIG91dGYgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRvLgogKiAKICovCnZvaWQKc25tcF9pbl90b2dnbGVfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgZnByaW50ZihvdXRmLCAiJXNiOiAgZG8gYmVzdC9yZWdleCBtYXRjaGluZyB0byBmaW5kIGEgTUlCIG5vZGVcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNoOiAgZG9uJ3QgYXBwbHkgRElTUExBWS1ISU5Uc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3I6ICBkbyBub3QgY2hlY2sgdmFsdWVzIGZvciByYW5nZS90eXBlIGxlZ2FsaXR5XG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzUjogIGRvIHJhbmRvbSBhY2Nlc3MgdG8gT0lEIGxhYmVsc1xuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc3U6ICB0b3AtbGV2ZWwgT0lEcyBtdXN0IGhhdmUgJy4nIHByZWZpeCAoVUNELXN0eWxlKVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc3MgU1VGRklYOiAgQXBwZW5kIGFsbCB0ZXh0dWFsIE9JRHMgd2l0aCBTVUZGSVggYmVmb3JlIHBhcnNpbmdcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNTIFBSRUZJWDogIFByZXBlbmQgYWxsIHRleHR1YWwgT0lEcyB3aXRoIFBSRUZJWCBiZWZvcmUgcGFyc2luZ1xuIiwKICAgICAgICAgICAgbGVhZCk7Cn0KCi8qKioKICoKICovIAp2b2lkCnJlZ2lzdGVyX21pYl9oYW5kbGVycyh2b2lkKQp7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgIm1pYmRpcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWliZGlyc19jb25mLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW21pYi1kaXJzfCttaWItZGlyc3wtbWliLWRpcnNdIik7CiAgICByZWdpc3Rlcl9wcmVuZXRzbm1wX21pYl9oYW5kbGVyKCJzbm1wIiwgIm1pYnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWlic19jb25mLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW21pYi10b2tlbnN8K21pYi10b2tlbnNdIik7CiAgICByZWdpc3Rlcl9jb25maWdfaGFuZGxlcigic25tcCIsICJtaWJmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9taWJmaWxlX2NvbmYsIE5VTEwsICJtaWJmaWxlLXRvLXJlYWQiKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciB0aGUgc25tcC5jb25mIGNvbmZpZ3VyYXRpb24gaGFuZGxlcnMgZm9yIGRlZmF1bHQKICAgICAqIHBhcnNpbmcgYmVoYXZpb3VyIAogICAgICovCgogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInNob3dNaWJFcnJvcnMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX0VSUk9SUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAiY29tbWVudFRvRU9MIiwgICAgIC8qIERlc2NyaWJlcyBhY3R1YWwgYmVoYXZpb3VyICovCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJfQ09NTUVOVF9URVJNKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzdHJpY3RDb21tZW50VGVybSIsICAgIC8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYkFsbG93VW5kZXJsaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAibWliV2FybmluZ0xldmVsIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibWliUmVwbGFjZVdpdGhMYXRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwojZW5kaWYKCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnROdW1lcmljRW51bXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAicHJpbnROdW1lcmljT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3ByaW50X251bWVyaWMsIE5VTEwsICIoMXx5ZXN8dHJ1ZXwwfG5vfGZhbHNlKSIpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImVzY2FwZVF1b3RlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250QnJlYWtkb3duT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJxdWlja1ByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJudW1lcmljVGltZXRpY2tzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJvaWRPdXRwdXRGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgInN1ZmZpeFByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJleHRlbmRlZEluZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludEhleFRleHQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50VmFsdWVPbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImRvbnRQcmludFVuaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgImhleE91dHB1dExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeQogKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIGFyZ3VtZW50czogY29uc3QgY2hhciAqZGlyLCB3aGljaCBhcmUgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcikKewogICAgY29uc3QgY2hhciAqbmV3ZGlyOwogICAgY2hhciAqb2xkZGlyLCAqdG1wZGlyID0gTlVMTDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKE5VTEwgPT0gZGlyKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBvbGRkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICBpZiAob2xkZGlyKSB7CiAgICAgICAgaWYgKCgqZGlyID09ICcrJykgfHwgKCpkaXIgPT0gJy0nKSkgewogICAgICAgICAgICAvKiogTmV3IGRpciBzdGFydHMgd2l0aCAnKycsIHRodXMgd2UgYWRkIGl0LiAqLwogICAgICAgICAgICB0bXBkaXIgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGlyKSArIHN0cmxlbihvbGRkaXIpICsgMik7CiAgICAgICAgICAgIGlmICghdG1wZGlyKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJzZXQgbWliZGlyIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpkaXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIG9sZGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBkaXIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBvbGRkaXIpOwogICAgICAgICAgICBuZXdkaXIgPSB0bXBkaXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3ZGlyID0gZGlyOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoqIElmIGRpciBzdGFydHMgd2l0aCAnKycgc2tpcCAnKycgaXQuICovCiAgICAgICAgbmV3ZGlyID0gKCgqZGlyID09ICcrJykgPyArK2RpciA6IGRpcik7CiAgICB9CiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2Rpcik7CgogICAgLyoqIHNldF9zdHJpbmcgY2FsbHMgc3RyZHVwLCBzbyBpZiB3ZSBhbGxvY2F0ZWQgbWVtb3J5LCBmcmVlIGl0ICovCiAgICBpZiAodG1wZGlyID09IG5ld2RpcikgewogICAgICAgIFNOTVBfRlJFRSh0bXBkaXIpOwogICAgfQp9CgovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBzdGlsbCBkb2VzIG5vdCBleGlzdHMsIGl0IHdpbGwgYmUgbWFkZQogKiAgICAgICAgICAgICAgZnJvbSB0aGUgZXZpcm9ubWVudCB2YXJpYWJsZSAnTUlCRElSUycgYW5kL29yIHRoZQogKiAgICAgICAgICAgICAgZGVmYXVsdC4KICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogY2hhciAqIG9mIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0aGUgTUlCIG1vZHVsZXMKICogICAgICAgICAgICB3aWxsIGJlIHNlYXJjaGVkL2xvYWRlZC4KICovCgpjaGFyICoKbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSh2b2lkKQp7CiAgICBjaGFyICpkaXI7CgogICAgREVCVUdUUkFDRTsKICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXRcbiIpKTsKCiAgICAgICAgLyoqIENoZWNrIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgKi8KICAgICAgICBkaXIgPSBuZXRzbm1wX2dldGVudigiTUlCRElSUyIpOwogICAgICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICAvKiogTm90IHNldCB1c2UgaGFyZCBjb2RlZCBwYXRoICovCiAgICAgICAgICAgIGlmIChjb25mbWliZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCpjb25mbWliZGlyID09ICcrJykgfHwgKCpjb25mbWliZGlyID09ICctJykpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZyAoYnV0IGFkZGVkKVxuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnQgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfQogICAgICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgfQogICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgJyVzJ1xuIiwgZGlyKSk7CiAgICByZXR1cm4oZGlyKTsKfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkKICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqaG9tZXBhdGggPSBuZXRzbm1wX2dldGVudigiSE9NRSIpOwogICAgY2hhciAqbWlicGF0aCA9IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKTsKICAgIGNoYXIgKm9sZG1pYnBhdGggPSBOVUxMOwogICAgY2hhciAqcHRyX2hvbWU7CiAgICBjaGFyICpuZXdfbWlicGF0aDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKGhvbWVwYXRoICYmIG1pYnBhdGgpIHsKICAgICAgICBERUJVR01TR1RMKCgiZml4dXBfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgJyVzJ1xuIiwgbWlicGF0aCkpOwogICAgICAgIHdoaWxlICgocHRyX2hvbWUgPSBzdHJzdHIobWlicGF0aCwgIiRIT01FIikpKSB7CiAgICAgICAgICAgIG5ld19taWJwYXRoID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKG1pYnBhdGgpIC0gc3RybGVuKCIkSE9NRSIpICsKCQkJCQkgc3RybGVuKGhvbWVwYXRoKSsxKTsKICAgICAgICAgICAgaWYgKG5ld19taWJwYXRoKSB7CiAgICAgICAgICAgICAgICAqcHRyX2hvbWUgPSAwOyAvKiBudWxsIG91dCB0aGUgc3BvdCB3aGVyZSB3ZSBzdG9wIGNvcHlpbmcgKi8KICAgICAgICAgICAgICAgIHNwcmludGYobmV3X21pYnBhdGgsICIlcyVzJXMiLCBtaWJwYXRoLCBob21lcGF0aCwKCQkJcHRyX2hvbWUgKyBzdHJsZW4oIiRIT01FIikpOwogICAgICAgICAgICAgICAgLyoqIHN3YXAgaW4gdGhlIG5ldyB2YWx1ZSBhbmQgcmVwZWF0ICovCiAgICAgICAgICAgICAgICBtaWJwYXRoID0gbmV3X21pYnBhdGg7CgkJaWYgKG9sZG1pYnBhdGggIT0gTlVMTCkgewoJCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7CgkJfQoJCW9sZG1pYnBhdGggPSBuZXdfbWlicGF0aDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KG1pYnBhdGgpOwoJCgkvKiAgVGhlIGFib3ZlIGNvcGllcyB0aGUgbWlicGF0aCBmb3IgdXMsIHNvLi4uICAqLwoKCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7Cgl9CgogICAgfQoKfQoKLyoqCiAqIEluaXRpYWxpc2VzIHRoZSBtaWIgcmVhZGVyLgogKgogKiBSZWFkcyBpbiBhbGwgc2V0dGluZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAqLwp2b2lkCm5ldHNubXBfaW5pdF9taWIodm9pZCkKewogICAgY29uc3QgY2hhciAgICAgKnByZWZpeDsKICAgIGNoYXIgICAgICAgICAgICplbnZfdmFyLCAqZW50cnk7CiAgICBQcmVmaXhMaXN0UHRyICAgcHAgPSAmbWliX3ByZWZpeGVzWzBdOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKCiAgICBpZiAoTWliKQogICAgICAgIHJldHVybjsKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIEluaXRpYWxpc2UgdGhlIE1JQiBkaXJlY3RvcnkvaWVzIAogICAgICovCiAgICBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkoKTsKICAgIGVudl92YXIgPSBzdHJkdXAobmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpKTsKICAgIG5ldHNubXBfbWliaW5kZXhfbG9hZCgpOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBNSUJESVJTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBkaXJzIC4uLlxuIiwKICAgICAgICAgICAgICAgIGVudl92YXIpKTsKCiAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICBhZGRfbWliZGlyKGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB9CiAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJGSUxFUyIpOwogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIGlmICgqZW52X3ZhciA9PSAnKycpCiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhcisxLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICBhZGRfbWliZmlsZShlbnRyeSwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB9CiAgICB9CgogICAgbmV0c25tcF9pbml0X21pYl9pbnRlcm5hbHMoKTsKCiAgICAvKgogICAgICogUmVhZCBpbiBhbnkgbW9kdWxlcyBvciBtaWJzIHJlcXVlc3RlZCAKICAgICAqLwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCUyIpOwogICAgaWYgKGVudl92YXIgPT0gTlVMTCkgewogICAgICAgIGlmIChjb25mbWlicyAhPSBOVUxMKQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGNvbmZtaWJzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoTkVUU05NUF9ERUZBVUxUX01JQlMpOwogICAgfSBlbHNlIHsKICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIpOwogICAgfQogICAgaWYgKGVudl92YXIgJiYgKCgqZW52X3ZhciA9PSAnKycpIHx8ICgqZW52X3ZhciA9PSAnLScpKSkgewogICAgICAgIGVudHJ5ID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihORVRTTk1QX0RFRkFVTFRfTUlCUykgKyBzdHJsZW4oZW52X3ZhcikgKyAyKTsKICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJlbnYgbWlicyBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKmVudl92YXIgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIE5FVFNOTVBfREVGQVVMVF9NSUJTLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXIrMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBlbnZfdmFyKzEsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9ERUZBVUxUX01JQlMgKTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgIGVudl92YXIgPSBlbnRyeTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gTUlCUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZmlsZXMgLi4uXG4iLAogICAgICAgICAgICAgICAgZW52X3ZhcikpOwogICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgaWYgKHN0cmNhc2VjbXAoZW50cnksIERFQlVHX0FMV0FZU19UT0tFTikgPT0gMCkgewogICAgICAgICAgICByZWFkX2FsbF9taWJzKCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZW50cnksICIvIikgIT0gTlVMTCkgewogICAgICAgICAgICByZWFkX21pYihlbnRyeSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9yZWFkX21vZHVsZShlbnRyeSk7CiAgICAgICAgfQogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoTlVMTCwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIH0KICAgIGFkb3B0X29ycGhhbnMoKTsKICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQkZJTEVTIik7CiAgICBpZiAoZW52X3ZhciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCgqZW52X3ZhciA9PSAnKycpIHx8ICgqZW52X3ZhciA9PSAnLScpKSB7CiNpZmRlZiBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMKICAgICAgICAgICAgZW50cnkgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZW52X3ZhcikgKyAyKTsKICAgICAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgImVudiBtaWJmaWxlcyBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCplbnZfdmFyKysgPT0gJysnKQogICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXIgKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgZW52X3ZhciwgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgICAgICBlbnZfdmFyID0gZW50cnk7CiNlbHNlCiAgICAgICAgICAgIGVudl92YXIgPSBzdHJkdXAoZW52X3ZhciArIDEpOwojZW5kaWYKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNpZmRlZiBORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMKICAgICAgICBlbnZfdmFyID0gc3RyZHVwKE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUyk7CiNlbmRpZgogICAgfQoKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgICAgICJTZWVuIE1JQkZJTEVTOiBMb29raW5nIGluICclcycgZm9yIG1pYiBmaWxlcyAuLi5cbiIsCiAgICAgICAgICAgICAgICAgICAgZW52X3ZhcikpOwogICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgcmVhZF9taWIoZW50cnkpOwogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgIH0KCiAgICBwcmVmaXggPSBuZXRzbm1wX2dldGVudigiUFJFRklYIik7CgogICAgaWYgKCFwcmVmaXgpCiAgICAgICAgcHJlZml4ID0gU3RhbmRhcmRfUHJlZml4OwoKICAgIFByZWZpeCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4ocHJlZml4KSArIDIpOwogICAgaWYgKCFQcmVmaXgpCiAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwgIlByZWZpeCBtYWxsb2MgZmFpbGVkIikpOwogICAgZWxzZQogICAgICAgIHN0cmNweShQcmVmaXgsIHByZWZpeCk7CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIFBSRUZJWDogTG9va2luZyBpbiAnJXMnIGZvciBwcmVmaXggLi4uXG4iLCBQcmVmaXgpKTsKCiAgICAvKgogICAgICogcmVtb3ZlIHRyYWlsaW5nIGRvdCAKICAgICAqLwogICAgaWYgKFByZWZpeCkgewogICAgICAgIGVudl92YXIgPSAmUHJlZml4W3N0cmxlbihQcmVmaXgpIC0gMV07CiAgICAgICAgaWYgKCplbnZfdmFyID09ICcuJykKICAgICAgICAgICAgKmVudl92YXIgPSAnXDAnOwogICAgfQoKICAgIHBwLT5zdHIgPSBQcmVmaXg7ICAgICAgICAgICAvKiBmaXh1cCBmaXJzdCBtaWJfcHJlZml4IGVudHJ5ICovCiAgICAvKgogICAgICogbm93IHRoYXQgdGhlIGxpc3Qgb2YgcHJlZml4ZXMgaXMgYnVpbHQsIHNhdmUgZWFjaCBzdHJpbmcgbGVuZ3RoLiAKICAgICAqLwogICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICBwcC0+bGVuID0gc3RybGVuKHBwLT5zdHIpOwogICAgICAgIHBwKys7CiAgICB9CgogICAgTWliID0gdHJlZV9oZWFkOyAgICAgICAgICAgIC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAgICB0cmVlX3RvcCA9IChzdHJ1Y3QgdHJlZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB0cmVlKSk7CiAgICAvKgogICAgICogWFggZXJyb3IgY2hlY2sgPyAKICAgICAqLwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgdHJlZV90b3AtPmxhYmVsID0gc3RyZHVwKCIodG9wKSIpOwogICAgICAgIHRyZWVfdG9wLT5jaGlsZF9saXN0ID0gdHJlZV9oZWFkOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCnZvaWQKaW5pdF9taWIodm9pZCkKewogICAgbmV0c25tcF9pbml0X21pYigpOwp9CiNlbmRpZgoKCi8qCiAqIEhhbmRsZSBNSUIgaW5kZXhlcyBjZW50cmFsbHkKICovCnN0YXRpYyBpbnQgX21pYmluZGV4ICAgICA9IDA7ICAgLyogTGFzdCBpbmRleCBpbiB1c2UgKi8Kc3RhdGljIGludCBfbWliaW5kZXhfbWF4ID0gMDsgICAvKiBTaXplIG9mIGluZGV4IGFycmF5ICovCmNoYXIgICAgICoqX21pYmluZGV4ZXMgICA9IE5VTEw7CgppbnQgX21pYmluZGV4X2FkZCggY29uc3QgY2hhciAqZGlybmFtZSwgaW50IGkgKTsKdm9pZApuZXRzbm1wX21pYmluZGV4X2xvYWQoIHZvaWQgKQp7CiAgICBESVIgKmRpcjsKICAgIHN0cnVjdCBkaXJlbnQgKmZpbGU7CiAgICBGSUxFICpmcDsKICAgIGNoYXIgdG1wYnVmWyAzMDBdOwogICAgY2hhciB0bXBidWYyWzMwMF07CiAgICBpbnQgIGk7CiAgICBjaGFyICpjcDsKCiAgICAvKgogICAgICogT3BlbiB0aGUgTUlCIGluZGV4IGRpcmVjdG9yeSwgb3IgY3JlYXRlIGl0IChlbXB0eSkKICAgICAqLwogICAgc25wcmludGYoIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcyIsCiAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCkpOwogICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgIGRpciA9IG9wZW5kaXIoIHRtcGJ1ZiApOwogICAgaWYgKCBkaXIgPT0gTlVMTCApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9hZDogKG5ldylcbiIpKTsKICAgICAgICBta2RpcmhpZXIoIHRtcGJ1ZiwgTkVUU05NUF9BR0VOVF9ESVJFQ1RPUllfTU9ERSwgMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIHdoaWNoIGRpcmVjdG9yeSBlYWNoIGZpbGUgcmVmZXJzIHRvCiAgICAgKi8KICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoIGRpciApKSkgewogICAgICAgIGlmICggIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKGZpbGUtPmRfbmFtZVswXSkpKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpID0gYXRvaSggZmlsZS0+ZF9uYW1lICk7CgogICAgICAgIHNucHJpbnRmKCB0bXBidWYsIHNpemVvZih0bXBidWYpLCAiJXMvbWliX2luZGV4ZXMvJWQiLAogICAgICAgICAgICAgIGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpLCBpICk7CiAgICAgICAgdG1wYnVmW3NpemVvZih0bXBidWYpLTFdID0gMDsKICAgICAgICBmcCA9IGZvcGVuKCB0bXBidWYsICJyIiApOwogICAgICAgIGlmICghZnApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNwID0gZmdldHMoIHRtcGJ1ZjIsIHNpemVvZih0bXBidWYyKSwgZnAgKTsKICAgICAgICBpZiAoICFjcCApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgIkVtcHR5IE1JQiBpbmRleCAoJWQpXG4iLCBpKSk7CiAgICAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0bXBidWYyW3N0cmxlbih0bXBidWYyKS0xXSA9IDA7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvYWQ6ICglZCkgJXNcbiIsIGksIHRtcGJ1ZjIpKTsKICAgICAgICAodm9pZClfbWliaW5kZXhfYWRkKCB0bXBidWYyKzQsIGkgKTsgIC8qIFNraXAgJ0RJUiAnICovCiAgICAgICAgZmNsb3NlKCBmcCApOwogICAgfQogICAgY2xvc2VkaXIoIGRpciApOwp9CgpjaGFyICoKbmV0c25tcF9taWJpbmRleF9sb29rdXAoIGNvbnN0IGNoYXIgKmRpcm5hbWUgKQp7CiAgICBpbnQgaTsKICAgIHN0YXRpYyBjaGFyIHRtcGJ1ZlszMDBdOwoKICAgIGZvciAoaT0wOyBpPF9taWJpbmRleDsgaSsrKSB7CiAgICAgICAgaWYgKCBfbWliaW5kZXhlc1tpXSAmJgogICAgICAgICAgICAgc3RyY21wKCBfbWliaW5kZXhlc1tpXSwgZGlybmFtZSApID09IDApIHsKICAgICAgICAgICAgIHNucHJpbnRmKHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZiksICIlcy9taWJfaW5kZXhlcy8lZCIsCiAgICAgICAgICAgICAgICAgICAgICBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgaSk7CiAgICAgICAgICAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImxvb2t1cDogJXMgKCVkKSAlc1xuIiwgZGlybmFtZSwgaSwgdG1wYnVmICkpOwogICAgICAgICAgICAgcmV0dXJuIHRtcGJ1ZjsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliaW5kZXgiLCAibG9va3VwOiAobm9uZSlcbiIpKTsKICAgIHJldHVybiBOVUxMOwp9CgppbnQKX21pYmluZGV4X2FkZCggY29uc3QgY2hhciAqZGlybmFtZSwgaW50IGkgKQp7CiAgICBjb25zdCBpbnQgb2xkX21pYmluZGV4X21heCA9IF9taWJpbmRleF9tYXg7CgogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgImFkZDogJXMgKCVkKVxuIiwgZGlybmFtZSwgaSApKTsKICAgIGlmICggaSA9PSAtMSApCiAgICAgICAgaSA9IF9taWJpbmRleCsrOwogICAgaWYgKCBpID49IF9taWJpbmRleF9tYXggKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJZiB0aGUgaW5kZXggYXJyYXkgaXMgZnVsbCAob3Igbm9uLWV4aXN0ZW50KQogICAgICAgICAqICAgdGhlbiBleHBhbmQgKG9yIGNyZWF0ZSkgaXQKICAgICAgICAgKi8KICAgICAgICBfbWliaW5kZXhfbWF4ID0gaSArIDEwOwogICAgICAgIF9taWJpbmRleGVzID0gcmVhbGxvYyhfbWliaW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21pYmluZGV4X21heCAqIHNpemVvZihfbWliaW5kZXhlc1swXSkpOwogICAgICAgIG5ldHNubXBfYXNzZXJ0KF9taWJpbmRleGVzKTsKICAgICAgICBtZW1zZXQoX21pYmluZGV4ZXMgKyBvbGRfbWliaW5kZXhfbWF4LCAwLAogICAgICAgICAgICAgICAoX21pYmluZGV4X21heCAtIG9sZF9taWJpbmRleF9tYXgpICogc2l6ZW9mKF9taWJpbmRleGVzWzBdKSk7CiAgICB9CgogICAgX21pYmluZGV4ZXNbIGkgXSA9IHN0cmR1cCggZGlybmFtZSApOwogICAgaWYgKCBpID49IF9taWJpbmRleCApCiAgICAgICAgX21pYmluZGV4ID0gaSsxOwoKICAgIERFQlVHTVNHVEwoKCJtaWJpbmRleCIsICJhZGQ6ICVkLyVkLyVkXG4iLCBpLCBfbWliaW5kZXgsIF9taWJpbmRleF9tYXggKSk7CiAgICByZXR1cm4gaTsKfQogICAgCkZJTEUgKgpuZXRzbm1wX21pYmluZGV4X25ldyggY29uc3QgY2hhciAqZGlybmFtZSApCnsKICAgIEZJTEUgKmZwOwogICAgY2hhciAgdG1wYnVmWzMwMF07CiAgICBjaGFyICpjcDsKICAgIGludCAgIGk7CgogICAgY3AgPSBuZXRzbm1wX21pYmluZGV4X2xvb2t1cCggZGlybmFtZSApOwogICAgaWYgKCFjcCkgewogICAgICAgIGkgID0gX21pYmluZGV4X2FkZCggZGlybmFtZSwgLTEgKTsKICAgICAgICBzbnByaW50ZiggdG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiVzL21pYl9pbmRleGVzLyVkIiwKICAgICAgICAgICAgICAgICAgZ2V0X3BlcnNpc3RlbnRfZGlyZWN0b3J5KCksIGkgKTsKICAgICAgICB0bXBidWZbc2l6ZW9mKHRtcGJ1ZiktMV0gPSAwOwogICAgICAgIGNwID0gdG1wYnVmOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYmluZGV4IiwgIm5ldzogJXMgKCVzKVxuIiwgZGlybmFtZSwgY3AgKSk7CiAgICBmcCA9IGZvcGVuKCBjcCwgInciICk7CiAgICBpZiAoZnApCiAgICAgICAgZnByaW50ZiggZnAsICJESVIgJXNcbiIsIGRpcm5hbWUgKTsKICAgIHJldHVybiBmcDsKfQoKCi8qKgogKiBVbmxvYWRzIGFsbCBtaWJzLgogKi8Kdm9pZApzaHV0ZG93bl9taWIodm9pZCkKewogICAgdW5sb2FkX2FsbF9taWJzKCk7CiAgICBpZiAodHJlZV90b3ApIHsKICAgICAgICBpZiAodHJlZV90b3AtPmxhYmVsKQogICAgICAgICAgICBTTk1QX0ZSRUUodHJlZV90b3AtPmxhYmVsKTsKICAgICAgICBTTk1QX0ZSRUUodHJlZV90b3ApOwogICAgfQogICAgdHJlZV9oZWFkID0gTlVMTDsKICAgIE1pYiA9IE5VTEw7CiAgICBpZiAoX21pYmluZGV4ZXMpIHsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX21pYmluZGV4OyArK2kpCiAgICAgICAgICAgIFNOTVBfRlJFRShfbWliaW5kZXhlc1tpXSk7CiAgICAgICAgZnJlZShfbWliaW5kZXhlcyk7CiAgICAgICAgX21pYmluZGV4ID0gMDsKICAgICAgICBfbWliaW5kZXhfbWF4ID0gMDsKICAgICAgICBfbWliaW5kZXhlcyA9IE5VTEw7CiAgICB9CiAgICBpZiAoUHJlZml4ICE9IE5VTEwgJiYgUHJlZml4ICE9ICZTdGFuZGFyZF9QcmVmaXhbMF0pCiAgICAgICAgU05NUF9GUkVFKFByZWZpeCk7CiAgICBpZiAoUHJlZml4KQogICAgICAgIFByZWZpeCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUoY29uZm1pYnMpOwogICAgU05NUF9GUkVFKGNvbmZtaWJkaXIpOwp9CgovKioKICogUHJpbnRzIHRoZSBNSUJzIHRvIHRoZSBmaWxlIGZwLgogKgogKiBAcGFyYW0gZnAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKi8KI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1BSSU5UX01JQgp2b2lkCnByaW50X21pYihGSUxFICogZnApCnsKICAgIHByaW50X3N1YnRyZWUoZnAsIHRyZWVfaGVhZCwgMCk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUFJJTlRfTUlCICovCgp2b2lkCnByaW50X2FzY2lpX2R1bXAoRklMRSAqIGZwKQp7CiAgICBmcHJpbnRmKGZwLCAiZHVtcCBERUZJTklUSU9OUyA6Oj0gQkVHSU5cbiIpOwogICAgcHJpbnRfYXNjaWlfZHVtcF90cmVlKGZwLCB0cmVlX2hlYWQsIDApOwogICAgZnByaW50ZihmcCwgIkVORFxuIik7Cn0KCgovKioKICogU2V0J3MgdGhlIHByaW50aW5nIGZ1bmN0aW9uIHByaW50b21hdCBpbiBhIHN1YnRyZWUgYWNjb3JkaW5nCiAqIGl0J3MgdHlwZQogKgogKiBAcGFyYW0gc3VidHJlZSAgICBUaGUgc3VidHJlZSB0byBzZXQuCiAqLwp2b2lkCnNldF9mdW5jdGlvbihzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3VidHJlZS0+cHJpbnRlciA9IE5VTEw7CiAgICBzd2l0Y2ggKHN1YnRyZWUtPnR5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vYmplY3RfaWRlbnRpZmllcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbmV0d29ya2FkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2lwYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfZ2F1Z2U7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX3RpbWV0aWNrczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PUEFRVUU6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2Nfb3BhcXVlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnVsbDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19jb3VudGVyNjQ7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdWludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9PVEhFUjoKICAgIGRlZmF1bHQ6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfYnlfdHlwZTsKICAgICAgICBicmVhazsKICAgIH0KfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKLyoqCiAqIFJlYWRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYW4gaW5wdXQgc3RyaW5nIGludG8gaW50ZXJuYWwgT0lEIGZvcm0uCiAqIAogKiBXaGVuIGNhbGxlZCwgb3V0X2xlbiBtdXN0IGhvbGQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYXJyYXkuCiAqCiAqIEBwYXJhbSBpbnB1dCAgICAgdGhlIGlucHV0IHN0cmluZy4KICogQHBhcmFtIG91dHB1dCAgICB0aGUgb2lkIHdpcnRlLgogKiBAcGFyYW0gb3V0X2xlbiAgIG51bWJlciBvZiBzdWJpZCdzIGluIG91dHB1dC4KICogCiAqIEByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLgogKiAKICogSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCBhbmQgTUFZIHNldCBzbm1wX2Vycm5vLgogKiBzbm1wX2Vycm5vIGlzIE5PVCBzZXQgaWYgU0VUX1NOTVBfRVJST1IgZXZhbHVhdGVzIHRvIG5vdGhpbmcuCiAqIFRoaXMgY2FuIG1ha2UgbXVsdGktdGhyZWFkZWQgdXNlIGEgdGlueSBiaXQgbW9yZSByb2J1c3QuCiAqLwppbnQKcmVhZF9vYmppZChjb25zdCBjaGFyICppbnB1dCwgb2lkICogb3V0cHV0LCBzaXplX3QgKiBvdXRfbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZCdzIGluICJvdXRwdXQiICovCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqcm9vdCA9IHRyZWVfdG9wOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBjaGFyICAgICAgICAgICAgYnVmW1NQUklOVF9NQVhfTEVOXTsKICAgIGludCAgICAgICAgICAgICByZXQsIG1heF9vdXRfbGVuOwogICAgY2hhciAgICAgICAgICAgKm5hbWUsIGNoOwogICAgY29uc3QgY2hhciAgICAgKmNwOwoKICAgIGNwID0gaW5wdXQ7CiAgICB3aGlsZSAoKGNoID0gKmNwKSkgewogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChjaCA9PSAnOicpCiAgICAgICAgcmV0dXJuIGdldF9ub2RlKGlucHV0LCBvdXRwdXQsIG91dF9sZW4pOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgogICAgaWYgKCppbnB1dCA9PSAnLicpCiAgICAgICAgaW5wdXQrKzsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBnZXQgcGFzdCBsZWFkaW5nICcuJywgYXBwZW5kICcuJyB0byBQcmVmaXguIAogICAgICAgICAqLwogICAgICAgIGlmICgqUHJlZml4ID09ICcuJykKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCArIDEsIHNpemVvZihidWYpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0cmxjcHkoYnVmLCBQcmVmaXgsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgIi4iLCBzaXplb2YoYnVmKSk7CiAgICAgICAgc3RybGNhdChidWYsIGlucHV0LCBzaXplb2YoYnVmKSk7CiAgICAgICAgaW5wdXQgPSBidWY7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBpZiAoKHJvb3QgPT0gTlVMTCkgJiYgKHRyZWVfaGVhZCAhPSBOVUxMKSkgewogICAgICAgIHJvb3QgPSB0cmVlX2hlYWQ7CiAgICB9CiAgICBlbHNlIGlmIChyb290ID09IE5VTEwpIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX05PTUlCKTsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIG5hbWUgPSBzdHJkdXAoaW5wdXQpOwogICAgbWF4X291dF9sZW4gPSAqb3V0X2xlbjsKICAgICpvdXRfbGVuID0gMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocmV0ID0KICAgICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZChyb290LCBuYW1lLCBvdXRwdXQsIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X291dF9sZW4pKSA8PSAwKQojZWxzZQogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKE5VTEwsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHsKICAgICAgICBpZiAocmV0ID09IDApCiAgICAgICAgICAgIHJldCA9IFNOTVBFUlJfVU5LTk9XTl9PQkpJRDsKICAgICAgICBTRVRfU05NUF9FUlJPUihyZXQpOwogICAgICAgIFNOTVBfRlJFRShuYW1lKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIFNOTVBfRlJFRShuYW1lKTsKCiAgICByZXR1cm4gMTsKfQoKLyoqCiAqIAogKi8Kdm9pZApuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgdV9jaGFyICAgICAgICAgKnRidWYgPSBOVUxMLCAqY3AgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIHRidWZfbGVuID0gMjU2LCB0b3V0X2xlbiA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzsKICAgIH0KICAgIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkgewogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfRlVMTDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUM6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKfQoKLyoqCiAqIAogKi8KI2lmZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7Cn0KI2Vsc2UKc3RydWN0IHRyZWUgICAgKgpuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSA1MTIsIHRvdXRfbGVuID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwogICAgc2l6ZV90ICAgICAgICAgIG1pZHBvaW50X29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgdGJ1Zl9vdmVyZmxvdyA9IDA7CiAgICBpbnQgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDsKCiAgICBpZiAoKHRidWYgPSAodV9jaGFyICopIGNhbGxvYyh0YnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICB0YnVmX292ZXJmbG93ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgKnRidWYgPSAnLic7CiAgICAgICAgdG91dF9sZW4gPSAxOwogICAgfQoKICAgIHN1YnRyZWUgPSBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YnVmLCAmdGJ1Zl9sZW4sICZ0b3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ0YnVmX292ZXJmbG93LCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pZHBvaW50X29mZnNldCk7CgogICAgaWYgKHRidWZfb3ZlcmZsb3cpIHsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0YnVmKTsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgIH0KCiAgICBvdXRwdXRfZm9ybWF0ID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgaWYgKDAgPT0gb3V0cHV0X2Zvcm1hdCkgewogICAgICAgIG91dHB1dF9mb3JtYXQgPSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfU1VGRklYOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFOgogICAgICAgIGZvciAoY3AgPSB0YnVmOyAqY3A7IGNwKyspOwoKICAgICAgICBpZiAobWlkcG9pbnRfb2Zmc2V0ICE9IDApIHsKICAgICAgICAgICAgY3AgPSB0YnVmICsgbWlkcG9pbnRfb2Zmc2V0IC0gMjsgICAgLyogIGJleW9uZCB0aGUgJy4nICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNhbHBoYSgqY3ApKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjcC0tOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoY3AgPj0gdGJ1ZikgewogICAgICAgICAgICBpZiAoKmNwID09ICcuJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AtLTsKICAgICAgICB9CgogICAgICAgIGNwKys7CgogICAgICAgIGlmICgoTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRSA9PSBvdXRwdXRfZm9ybWF0KQogICAgICAgICAgICAmJiBjcCA+IHRidWYpIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdID0geyAwIH0sICptb2QgPQogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUoc3VidHJlZS0+bW9kaWQsIG1vZGJ1Zik7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEb24ndCBhZGQgdGhlIG1vZHVsZSBJRCBpZiBpdCdzIGp1c3QgbnVtZXJpYyAoaS5lLiB3ZSBjb3VsZG4ndCBsb29rCiAgICAgICAgICAgICAqIGl0IHVwIHByb3Blcmx5LiAgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmIG1vZGJ1ZlswXSAhPSAnIycpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIG1vZCkKICAgICAgICAgICAgICAgICAgICB8fCAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICI6OiIpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfVUNEOgogICAgewogICAgICAgIFByZWZpeExpc3RQdHIgICBwcCA9ICZtaWJfcHJlZml4ZXNbMF07CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGlsZW4sIHRsZW47CiAgICAgICAgY29uc3QgY2hhciAgICAgKnRlc3RjcDsKCiAgICAgICAgY3AgPSB0YnVmOwogICAgICAgIHRsZW4gPSBzdHJsZW4oKGNoYXIgKikgdGJ1Zik7CgogICAgICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgICAgIGlsZW4gPSBwcC0+bGVuOwogICAgICAgICAgICB0ZXN0Y3AgPSBwcC0+c3RyOwoKICAgICAgICAgICAgaWYgKCh0bGVuID4gaWxlbikgJiYgbWVtY21wKHRidWYsIHRlc3RjcCwgaWxlbikgPT0gMCkgewogICAgICAgICAgICAgICAgY3AgKz0gKGlsZW4gKyAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBwKys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX05PTkU6CiAgICBkZWZhdWx0OgogICAgICAgIGNwID0gTlVMTDsKICAgIH0KCiAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYKICAgICAgICAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpIHsKICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgIH0KICAgIFNOTVBfRlJFRSh0YnVmKTsKICAgIHJldHVybiBzdWJ0cmVlOwp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCmludApzcHJpbnRfcmVhbGxvY19vYmppZCh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgcmV0dXJuICFidWZfb3ZlcmZsb3c7Cn0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TUFJJTlRfT0JKSUQKaW50CnNucHJpbnRfb2JqaWQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamlkKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1BSSU5UX09CSklEICovCgovKioKICogUHJpbnRzIGFuIG9pZCB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgIFRoZSBvaWQgdG8gcHJpbnQKICogQHBhcmFtIG9iamlkbGVuICAgVGhlIGxlbmd0aCBvZiBvaWRpZC4KICovCnZvaWQKcHJpbnRfb2JqaWQoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIGZwcmludF9vYmppZChzdGRvdXQsIG9iamlkLCBvYmppZGxlbik7Cn0KCgovKioKICogUHJpbnRzIGFuIG9pZCB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApmcHJpbnRfb2JqaWQoRklMRSAqIGYsIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX292ZXJmbG93LCBvYmppZCwgb2JqaWRsZW4pOwogICAgICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFyaWFibGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKCiAgICBzdWJ0cmVlID0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbik7CgogICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSkpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgPSAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kIGlmLWVsc2UgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQgKi8KICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgKm91dF9sZW4gPSAwOwogICAgfQoKICAgIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSE9CSkVDVCkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggT2JqZWN0IGF2YWlsYWJsZSBvbiB0aGlzIGFnZW50IGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNISU5TVEFOQ0UpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIEluc3RhbmNlIGN1cnJlbnRseSBleGlzdHMgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9FTkRPRk1JQlZJRVcpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIHZhcmlhYmxlcyBsZWZ0IGluIHRoaXMgTUlCIFZpZXcgKEl0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgTUlCIHRyZWUpIik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICB9IGVsc2UgaWYgKHN1YnRyZWUpIHsKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgY29uc3QgY2hhciAqaGludCA9IE5VTEw7CiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CgoJCWlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCkpIHsKCQkJaGludCA9IHN1YnRyZWUtPmhpbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3VidHJlZS0+cHJpbnRvbWF0KSB7CiAgICAgICAgICAgIHJldHVybiAoKnN1YnRyZWUtPnByaW50b21hdCkgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWUtPmVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBIYW5kbGUgcmFyZSBjYXNlIHdoZXJlIHRyZWUgaXMgZW1wdHkuICAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU05QUklOVF9WQVJBQkxFCmludApzbnByaW50X3ZhcmlhYmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TTlBSSU5UX1ZBUkFCTEUgKi8KCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBzdGRvdXQuCiAqCiAqIEBwYXJhbSBvYmppZCAgICAgVGhlIG9iamVjdCBpZC4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgbGVuZ3RoIG9mIHRlaCBvYmplY3QgaWQuCiAqIEBwYXJhbSB2YXJpYWJsZSAgVGhlIHZhcmlhYmxlIHRvIHByaW50LgogKi8Kdm9pZApwcmludF92YXJpYWJsZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhcmlhYmxlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCgovKioKICogUHJpbnRzIGEgdmFyaWFibGUgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCiAqCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCmZwcmludF92YXJpYWJsZShGSUxFICogZiwKICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKaW50CnNwcmludF9yZWFsbG9jX3ZhbHVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKICAgIH0gZWxzZSB7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICAgICAgY29uc3QgY2hhciAqdW5pdHMgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmVlICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoJc3VidHJlZSA9IGdldF90cmVlKG9iamlkLCBvYmppZGxlbiwgc3VidHJlZSk7CiAgICAgICAgaWYgKHN1YnRyZWUgJiYgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpKSB7CiAgICAgICAgICAgIHVuaXRzID0gc3VidHJlZS0+dW5pdHM7CiAgICAgICAgfQogICAgICAgIGlmIChzdWJ0cmVlKSB7CgkgICAgaWYoc3VidHJlZS0+cHJpbnRvbWF0KSB7CgkJcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9IGVsc2UgewoJCXJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKCQkJCQkgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKCQkJCQkgICAgICBzdWJ0cmVlLT5lbnVtcywgc3VidHJlZS0+aGludCwKCQkJCQkgICAgICB1bml0cyk7CgkgICAgfQoJfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU05QUklOVF9WQUxVRQovKiB1c2VkIGluIHRoZSBwZXJsIG1vZHVsZSAqLwppbnQKc25wcmludF92YWx1ZShjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdmFsdWUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU05QUklOVF9WQUxVRSAqLwoKdm9pZApwcmludF92YWx1ZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhbHVlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCnZvaWQKZnByaW50X3ZhbHVlKEZJTEUgKiBmLAogICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhbHVlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgoKLyoqCiAqIFRha2VzIHRoZSB2YWx1ZSBpbiBWQVIgYW5kIHR1cm5zIGl0IGludG8gYW4gT0lEIHNlZ21lbnQgaW4gdmFyLT5uYW1lLgogKiAgCiAqIEBwYXJhbSB2YXIgICAgVGhlIHZhcmlhYmxlLgogKgogKiBAcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSX0dFTkVSUiAKICovCmludApidWlsZF9vaWRfc2VnbWVudChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgdWludDMyX3QgICAgICAgIGlwYWRkcjsKCiAgICBpZiAodmFyLT5uYW1lICYmIHZhci0+bmFtZSAhPSB2YXItPm5hbWVfbG9jKQogICAgICAgIFNOTVBfRlJFRSh2YXItPm5hbWUpOwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDE7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICB2YXItPm5hbWVbMF0gPSAqKHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gNDsKICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIG1lbWNweSgmaXBhZGRyLCB2YXItPnZhbC5zdHJpbmcsIHNpemVvZihpcGFkZHIpKTsKICAgICAgICB2YXItPm5hbWVbMF0gPSAoaXBhZGRyID4+IDI0KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzFdID0gKGlwYWRkciA+PiAxNikgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsyXSA9IChpcGFkZHIgPj4gIDgpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbM10gPSAoaXBhZGRyID4+ICAwKSAmIDB4ZmY7CiAgICAgICAgYnJlYWs7CiAgICAgICAgCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IHZhci0+dmFsLm9iamlkW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkgKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gdmFyLT5uYW1lX2xlbmd0aCAtIDE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+bmFtZV9sZW5ndGggLSAxOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpICsgMV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW47CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT52YWxfbGVuOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiArIDE7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICB2YXItPm5hbWVbMF0gPSAob2lkKSB2YXItPnZhbF9sZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gKG9pZCkgdmFyLT52YWwuc3RyaW5nW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IE1BWF9PSURfTEVOKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHRlcnJpYmx5IHdyb25nLCBuYW1lbGVuID0gJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApidWlsZF9vaWRfbm9hbGxvYyhvaWQgKiBpbiwgc2l6ZV90IGluX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogaW5kZXhlcykKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXI7CgogICAgaWYgKHByZWZpeCkgewogICAgICAgIGlmIChpbl9sZW4gPCBwcmVmaXhfbGVuKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgbWVtY3B5KGluLCBwcmVmaXgsIHByZWZpeF9sZW4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgKm91dF9sZW4gPSBwcmVmaXhfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgICAgaWYgKGJ1aWxkX29pZF9zZWdtZW50KHZhcikgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggKyAqb3V0X2xlbiA8PSBpbl9sZW4pIHsKICAgICAgICAgICAgbWVtY3B5KCYoaW5bKm91dF9sZW5dKSwgdmFyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiB2YXItPm5hbWVfbGVuZ3RoKTsKICAgICAgICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgfQogICAgfQoKICAgIERFQlVHTVNHVEwoKCJidWlsZF9vaWRfbm9hbGxvYyIsICJnZW5lcmF0ZWQ6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiYnVpbGRfb2lkX25vYWxsb2MiLCBpbiwgKm91dF9sZW4pKTsKICAgIERFQlVHTVNHKCgiYnVpbGRfb2lkX25vYWxsb2MiLCAiXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgppbnQKYnVpbGRfb2lkKG9pZCAqKiBvdXQsIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKCiAgICAvKgogICAgICogeHh4LXJrczogaW5lZmZpY2VudC4gdHJ5IG9ubHkgYnVpbGRpbmcgc2VnbWVudHMgdG8gZmluZCBpbmRleCBsZW46CiAgICAgKiAgIGZvciAodmFyID0gaW5kZXhlczsgdmFyICE9IE5VTEw7IHZhciA9IHZhci0+bmV4dF92YXJpYWJsZSkgewogICAgICogICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgKiAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAqICAgICAgKm91dF9sZW4gKz0gdmFyLT5uYW1lX2xlbmd0aDsKICAgICAqCiAgICAgKiB0aGVuIHNlZSBpZiBpdCBmaXRzIGluIGV4aXN0aW5nIGJ1ZmZlciwgb3IgcmVhbGxvYyBidWZmZXIuCiAgICAgKi8KICAgIGlmIChidWlsZF9vaWRfbm9hbGxvYyh0bXBvdXQsIHNpemVvZih0bXBvdXQpLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgaW5kZXhlcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAvKiogeHh4LXJrczogc2hvdWxkIGZyZWUgcHJldmlvdXMgdmFsdWU/ICovCiAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgb3V0LCAodm9pZCAqKSB0bXBvdXQsICpvdXRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIHZibGlzdF9vdXQgbXVzdCBjb250YWluIGEgcHJlLWFsbG9jYXRlZCBzdHJpbmcgb2YgdmFyaWFibGVzIGludG8KICogd2hpY2ggaW5kZXhlcyBjYW4gYmUgZXh0cmFjdGVkIGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nCiAqIHR5cGVzIGluIHRoZSB2YXJpYWJsZSBjaGFpbgogKiByZXR1cm5zOgogKiBTTk1QRVJSX0dFTkVSUiAgb24gZXJyb3IKICogU05NUEVSUl9TVUNDRVNTIG9uIHN1Y2Nlc3MKICovCgppbnQKcGFyc2Vfb2lkX2luZGV4ZXMob2lkICogb2lkSW5kZXgsIHNpemVfdCBvaWRMZW4sCiAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyID0gZGF0YTsKCiAgICB3aGlsZSAodmFyICYmIG9pZExlbiA+IDApIHsKCiAgICAgICAgaWYgKHBhcnNlX29uZV9vaWRfaW5kZXgoJm9pZEluZGV4LCAmb2lkTGVuLCB2YXIsIDApICE9CiAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KCiAgICBpZiAodmFyICE9IE5VTEwgfHwgb2lkTGVuICE9IDApCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludApwYXJzZV9vbmVfb2lkX2luZGV4KG9pZCAqKiBvaWRTdGFydCwgc2l6ZV90ICogb2lkTGVuLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGRhdGEsIGludCBjb21wbGV0ZSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwogICAgb2lkICAgICAgICAgICAgIHRtcG91dFtNQVhfT0lEX0xFTl07CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKICAgIHVuc2lnbmVkIGludCAgICB1aXRtcCA9IDA7CgogICAgb2lkICAgICAgICAgICAgKm9pZEluZGV4ID0gKm9pZFN0YXJ0OwoKICAgIGlmICh2YXIgPT0gTlVMTCB8fCAoKCpvaWRMZW4gPT0gMCkgJiYgKGNvbXBsZXRlID09IDApKSkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICBlbHNlIHsKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgY2FzZSBBU05fQ09VTlRFUjoKICAgICAgICBjYXNlIEFTTl9HQVVHRToKICAgICAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgICAgIGlmICgqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZExlbiwgc2l6ZW9mKGxvbmcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGludCglZCk6ICVsZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlcikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fSVBBRERSRVNTOgogICAgICAgICAgICBpZiAoKDQgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBpIDwgKm9pZExlbjsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAob2lkSW5kZXhbaV0gPiAyNTUpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIG9pZCBpbiBpbmRleDogJSIgTkVUU05NUF9QUklvICJkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZEluZGV4WzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHN1Yi1pZGVudGlmaWVyIHRvbyBsYXJnZSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IHVpdG1wICsgKG9pZEluZGV4W2ldIDw8ICg4KigzLWkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICg0ID4gKGludCkgKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBvaWRJbmRleCArPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IDQ7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICB1aXRtcCA9IGh0b25sKHVpdG1wKTsgLyogcHV0IGl0IGluIHByb3BlciBvcmRlciBmb3IgYnl0ZSBjb3BpZXMgKi8KICAgICAgICAgICAgdWl0bXAgPSAKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgJnVpdG1wLCA0KTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBpcGFkZHIoJWQpOiAlZC4lZC4lZC4lZFxuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMF0sIHZhci0+dmFsLnN0cmluZ1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nWzJdLCB2YXItPnZhbC5zdHJpbmdbM10pKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIG9pZFxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICBpZiAodWl0bXAgPiAqb2lkTGVuKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkodG1wb3V0LCBvaWRJbmRleCwgc2l6ZW9mKG9pZCkgKiAoKm9pZExlbikpOwogICAgICAgICAgICAgICAgbWVtc2V0KCZ0bXBvdXRbKm9pZExlbl0sIDB4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKiAodWl0bXAgLSAqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIHRtcG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSBvaWRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHVpdG1wKTsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9IHVpdG1wOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiUGFyc2VkIG9pZDogIikpOwogICAgICAgICAgICBERUJVR01TR09JRCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLm9iamlkLCB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKSkpOwogICAgICAgICAgICBERUJVR01TRygoInBhcnNlX29pZF9pbmRleGVzIiwgIlxuIikpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT1BBUVVFOgogICAgICAgIGNhc2UgQVNOX09DVEVUX1NUUjoKICAgICAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgICAgICBpZiAodmFyLT50eXBlID09IEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWlnaHQgbm90IGJlIGltcGxpZWQsIG1pZ2h0IGJlIGZpeGVkIGxlbi4gY2hlY2sgaWYKICAgICAgICAgICAgICAgICAqIGNhbGxlciBzZXQgdXAgdmFsIGxlbiwgYW5kIHVzZSBpdCBpZiB0aGV5IGRpZC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKDAgPT0gdmFyLT52YWxfbGVuKQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZExlbjsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlczpmaXgiLCAiZml4ZWQgbGVuIHN0clxuIikpOwogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdmFyLT52YWxfbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9ICpvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIC0tKCpvaWRMZW4pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB1aXRtcCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHVpdG1wID4gKm9pZExlbikgJiYgKGNvbXBsZXRlID09IDApKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogd2UgaGFuZGxlIHRoaXMgb25lIG91cnNlbHZlcyBzaW5jZSB3ZSBkb24ndCBoYXZlCiAgICAgICAgICAgICAqIHByZS1hbGxvY2F0ZWQgbWVtb3J5IHRvIGNvcHkgZnJvbSB1c2luZwogICAgICAgICAgICAgKiBzbm1wX3NldF92YXJfdmFsdWUoKSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAodWl0bXAgPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGxlbmd0aCBzdHJpbmdzIHNob3VsZG4ndCBtYWxsb2MgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+IE1BWF9PSURfTEVOKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogdG9vIGJpZyBhbmQgaWxsZWdhbCAqLwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbWFsbG9jIGJ5IHNpemUrMSB0byBhbGxvdyBhIG51bGwgdG8gYmUgYXBwZW5kZWQuIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFyLT52YWxfbGVuID0gdWl0bXA7CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZyA9ICh1X2NoYXIgKikgY2FsbG9jKDEsIHVpdG1wICsgMSk7CiAgICAgICAgICAgIGlmICh2YXItPnZhbC5zdHJpbmcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgICAgIGlmICgoc2l6ZV90KXVpdG1wID4gKCpvaWRMZW4pKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKm9pZExlbjsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICh1X2NoYXIpICogb2lkSW5kZXgrKzsKICAgICAgICAgICAgICAgIGZvciAoaSA9ICpvaWRMZW47IGkgPCB1aXRtcDsgKytpKQogICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1tpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgKCpvaWRMZW4pIC09IHVpdG1wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1t1aXRtcF0gPSAnXDAnOwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBzdHIoJWQpOiAlc1xuIiwgdmFyLT50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmcpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFzbiB0eXBlOiAlZFxuIiwgdmFyLT50eXBlKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICB9CiAgICB9CiAgICAoKm9pZFN0YXJ0KSA9IG9pZEluZGV4OwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzczoKICogICByZXR1cm4gMCBmb3IgZmFpbHVyZSwKICogICByZXR1cm4gMSBmb3Igc3VjY2VzcywKICogICByZXR1cm4gMiBmb3Igbm90IGhhbmRsZWQKICovCgppbnQgCmR1bXBfcmVhbGxvY19vaWRfdG9faW5ldGFkZHJlc3MoY29uc3QgaW50IGFkZHJfdHlwZSwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBxdW90ZWNoYXIpCnsKICAgIGludCAgICAgICAgICAgICBpLCBsZW47CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XSwgKnA7CiAgICBjaGFyICpjb25zdCAgICAgZW5kID0gaW50YnVmICsgc2l6ZW9mKGludGJ1Zik7CiAgICB1bnNpZ25lZCBjaGFyICAqemM7CiAgICB1bnNpZ25lZCBsb25nICAgem9uZTsKCiAgICBpZiAoIWJ1ZikKICAgICAgICByZXR1cm4gMTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgb2JqaWRsZW47IGkrKykKICAgICAgICBpZiAob2JqaWRbaV0gPCAwIHx8IG9iamlkW2ldID4gMjU1KQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICBwID0gaW50YnVmOwogICAgKnArKyA9IHF1b3RlY2hhcjsKCiAgICBzd2l0Y2ggKGFkZHJfdHlwZSkgewogICAgY2FzZSBJUFY0OgogICAgY2FzZSBJUFY0WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY0ICAmJiBvYmppZGxlbiAhPSA0KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjRaICYmIG9iamlkbGVuICE9IDgpKQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICAgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUiLAogICAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgIHAgKz0gbGVuOwogICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY0WikgewogICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgemNbMF0gPSBvYmppZFs0XTsKICAgICAgICAgICAgemNbMV0gPSBvYmppZFs1XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFs2XTsKICAgICAgICAgICAgemNbM10gPSBvYmppZFs3XTsKICAgICAgICAgICAgem9uZSA9IG50b2hsKHpvbmUpOwogICAgICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSUlbHUiLCB6b25lKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJUFY2OgogICAgY2FzZSBJUFY2WjoKICAgICAgICBpZiAoKGFkZHJfdHlwZSA9PSBJUFY2ICYmIG9iamlkbGVuICE9IDE2KSB8fAogICAgICAgICAgICAoYWRkcl90eXBlID09IElQVjZaICYmIG9iamlkbGVuICE9IDIwKSkKICAgICAgICAgICAgcmV0dXJuIDI7CgogICAgICAgIGxlbiA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICsrKSB7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlcyUwMiIgTkVUU05NUF9QUklvICJ4IiwgaSA/ICI6IiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZFtpXSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGlmIChhZGRyX3R5cGUgPT0gSVBWNlopIHsKICAgICAgICAgICAgemMgPSAodW5zaWduZWQgY2hhciopJnpvbmU7CiAgICAgICAgICAgIHpjWzBdID0gb2JqaWRbMTZdOwogICAgICAgICAgICB6Y1sxXSA9IG9iamlkWzE3XTsKICAgICAgICAgICAgemNbMl0gPSBvYmppZFsxOF07CiAgICAgICAgICAgIHpjWzNdID0gb2JqaWRbMTldOwogICAgICAgICAgICB6b25lID0gbnRvaGwoem9uZSk7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBjYXNlIEROUzoKICAgIGRlZmF1bHQ6IAogICAgICAgIC8qIEROUyBjYW4ganVzdCBiZSBoYW5kbGVkIGJ5IGR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nKCkgKi8KICAgICAgICByZXR1cm4gMjsKICAgIH0KCiAgICAqcCsrID0gcXVvdGVjaGFyOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgICpwKysgPSAnXDAnOwogICAgaWYgKHAgPj0gZW5kKQogICAgICAgIHJldHVybiAyOwoKICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpOwp9CgppbnQKZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcoY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcXVvdGVjaGFyKQp7CiAgICBpZiAoYnVmKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGksIGFsZW47CgogICAgICAgIGZvciAoaSA9IDAsIGFsZW4gPSAwOyBpIDwgKGludCkgb2JqaWRsZW47IGkrKykgewogICAgICAgICAgICBvaWQgICAgICAgICAgICAgdHN0ID0gb2JqaWRbaV07CiAgICAgICAgICAgIGlmICgodHN0ID4gMjU0KSB8fCAoIWlzcHJpbnQodHN0KSkpIHsKICAgICAgICAgICAgICAgIHRzdCA9IChvaWQpICcuJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGFsZW4gPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1xcJzsKICAgICAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSBxdW90ZWNoYXI7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAoY2hhcikgdHN0OwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIGFsZW4rKzsKICAgICAgICB9CgogICAgICAgIGlmIChhbGVuKSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcXCc7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHF1b3RlY2hhcjsKICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgIH0KCiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKdm9pZApfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpIHsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdOwogICAgaWYgKCpidWYgIT0gTlVMTCAmJiAqKCpidWYgKyAqb3V0X2xlbiAtIDEpICE9ICcuJykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgd2hpbGUgKG9iamlkbGVuLS0gPiAwKSB7ICAgIC8qIG91dHB1dCByZXN0IG9mIG5hbWUsIHVuaW50ZXJwcmV0ZWQgKi8KICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4iLCAqb2JqaWQrKyk7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoKmJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4gLSAxKSA9ICdcMCc7ICAvKiByZW1vdmUgdHJhaWxpbmcgZG90ICovCiAgICAgICAgKm91dF9sZW4gPSAqb3V0X2xlbiAtIDE7CiAgICB9Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqCl9nZXRfcmVhbGxvY19zeW1ib2woY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqc3VidHJlZSwKICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsIHNpemVfdCAqIGVuZF9vZl9rbm93bikKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBleHRlbmRlZF9pbmRleCA9CiAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0ID0KICAgICAgICBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBjaGFyICAgICAgICAgICAgaW50YnVmWzY0XTsKCiAgICBpZiAoIW9iamlkIHx8ICFidWYpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKCSAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQoJCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmIChzdWJ0cmVlLT5pbmRleGVzKSB7CiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHN1YnRyZWUtPmluZGV4ZXM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VidHJlZS0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDIgPQogICAgICAgICAgICAgICAgICAgIGZpbmRfdHJlZV9ub2RlKHN1YnRyZWUtPmF1Z21lbnRzLCAtMSk7CiAgICAgICAgICAgICAgICBpZiAodHAyKSB7CiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc3RybmNtcChzdWJ0cmVlLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pIHx8CiAgICAgICAgICAgICAgICAoTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMgPT0gb3V0cHV0X2Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1Iiwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChvYmppZGxlbiA+IDEpIHsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm5fdHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+Y2hpbGRfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csIGluX2RpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9vZl9rbm93bik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZXR1cm5fdHJlZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuX3RyZWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VidHJlZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgaWYgKGVuZF9vZl9rbm93bikgewogICAgICAgICplbmRfb2Zfa25vd24gPSAqb3V0X2xlbjsKICAgIH0KCiAgICAvKgogICAgICogU3VidHJlZSBub3QgZm91bmQuICAKICAgICAqLwoKICAgIHdoaWxlIChpbl9kaWNlcyAmJiAob2JqaWRsZW4gPiAwKSAmJgogICAgICAgICAgIChORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyAhPSBvdXRwdXRfZm9ybWF0KSAmJgogICAgICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUykpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbnVtaWRzOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZShpbl9kaWNlcy0+aWxhYmVsLCAtMSk7CgogICAgICAgIGlmICghdHApIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQ2FuJ3QgZmluZCBhbiBpbmRleCBpbiB0aGUgbWliIHRyZWUuICBCYWlsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICB9CgogICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICBpZiAoKmJ1ZiAhPSBOVUxMICYmICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJbIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXggJiYgdHAtPmhpbnQpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCB2YXI7CiAgICAgICAgICAgICAgICB1X2NoYXIgICAgICAgICAgYnVmZmVyWzEwMjRdOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGk7CgogICAgICAgICAgICAgICAgbWVtc2V0KCZ2YXIsIDAsIHNpemVvZiB2YXIpOwogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSBvYmppZGxlbjsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRwLT5yYW5nZXMtPmxvdyA9PSB0cC0+cmFuZ2VzLT5oaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9ICpvYmppZDsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtaWRzID49IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbnVtaWRzOyBpKyspCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKHVfY2hhcikgb2JqaWRbaV07CiAgICAgICAgICAgICAgICB2YXIudHlwZSA9IEFTTl9PQ1RFVF9TVFI7CiAgICAgICAgICAgICAgICB2YXIudmFsLnN0cmluZyA9IGJ1ZmZlcjsKICAgICAgICAgICAgICAgIHZhci52YWxfbGVuID0gbnVtaWRzOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICZ2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgdHAtPmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwoKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkLCBudW1pZHMsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICdcJycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICh0cC0+cmFuZ2VzICYmICF0cC0+cmFuZ2VzLT5uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhIGZpeGVkLWxlbmd0aCBvY3RldCBzdHJpbmcgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG51bWlkcyA9IHRwLT5yYW5nZXMtPmxvdzsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKCiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWR1bXBfcmVhbGxvY19vaWRfdG9fc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCwgbnVtaWRzLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnXCcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSAoc2l6ZV90KSAqIG9iamlkICsgMTsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuCiAgICAgICAgICAgICAgICAgICAgICAgIChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlxcIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlwiIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKiBuZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3JtYWxfaGFuZGxpbmcgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGVlciA9IHRwLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSBoYW5kbGluZyB0aGUgSW5ldEFkZHJlc3MgaW4gdGhlIE9JRCwgaW4gY2FzZSBvZiBmYWlsdXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2UgdGhlIG5vcm1hbF9oYW5kbGluZy4gCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPm5leHRfcGVlciAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BlZXItPnRjX2luZGV4ICE9IC0xICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZ2V0X3RjX2Rlc2NyaXB0b3IodHAtPnRjX2luZGV4KSwgIkluZXRBZGRyZXNzIikgPT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGdldF90Y19kZXNjcmlwdG9yKG5leHRfcGVlci0+dGNfaW5kZXgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZXRBZGRyZXNzVHlwZSIpID09IDAgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyX3R5cGUgPSAqKG9iamlkIC0gMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhhZGRyX3R5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLCBudW1pZHMgLSAxLCBidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsX2hhbmRsaW5nID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbF9oYW5kbGluZyAmJiAhZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmppZCArIDEsIG51bWlkcyAtIDEsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAnIicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCArPSBudW1pZHM7CiAgICAgICAgICAgIG9iamlkbGVuIC09IG51bWlkczsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgICAgICB3aGlsZSAoZXAgJiYgZXAtPnZhbHVlICE9IChpbnQpICgqb2JqaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlcCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZXAtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKiBJbiBhbiBpbmRleCwgdGhpcyBpcyBwcm9iYWJseSBhIHRpbWVmaWx0ZXIgKi8KICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgICAgICB1cHRpbWVTdHJpbmcoICpvYmppZCwgaW50YnVmLCBzaXplb2YoIGludGJ1ZiApICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidSIsICpvYmppZCk7CiAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50YnVmKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbnVtaWRzID0gKHNpemVfdCkgKiBvYmppZCArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGluX2RpY2VzLT5pc2ltcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1pZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWlkcyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCwgbnVtaWRzLCBOVUxMLCBidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQgKz0gKG51bWlkcyk7CiAgICAgICAgICAgIG9iamlkbGVuIC09IChudW1pZHMpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX0lQQUREUjoKICAgICAgICAgICAgaWYgKG9iamlkbGVuIDwgNCkKICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiUiIE5FVFNOTVBfUFJJbyAidS4lIiBORVRTTk1QX1BSSW8gInUuIgogICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6ewogICAgICAgICAgICAgICAgb2lkICAgICAgICAgICAgIG50eXBlID0gKm9iamlkKys7CgogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1LiIsIG50eXBlKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobnR5cGUgPT0gMSAmJiBvYmppZGxlbiA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1LiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiBORVRTTk1QX1BSSW8gInUuJSIgTkVUU05NUF9QUklvICJ1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkWzBdLCBvYmppZFsxXSwgb2JqaWRbMl0sIG9iamlkWzNdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRsZW4gLT0gNDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICJdIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIuIikpIHsKICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGluX2RpY2VzID0gaW5fZGljZXMtPm5leHQ7CiAgICB9CgogIGZpbmlzaF9pdDoKICAgIF9vaWRfZmluaXNoX3ByaW50aW5nKG9iamlkLCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGJ1Zl9vdmVyZmxvdyk7CiAgICByZXR1cm4gTlVMTDsKfQoKc3RydWN0IHRyZWUgICAgKgpnZXRfdHJlZShjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKewogICAgc3RydWN0IHRyZWUgICAgKnJldHVybl90cmVlID0gTlVMTDsKCiAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpCiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7CgogIGZvdW5kOgogICAgd2hpbGUgKHN1YnRyZWUtPm5leHRfcGVlciAmJiBzdWJ0cmVlLT5uZXh0X3BlZXItPnN1YmlkID09ICpvYmppZCkKCXN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICBpZiAob2JqaWRsZW4gPiAxKQogICAgICAgIHJldHVybl90cmVlID0KICAgICAgICAgICAgZ2V0X3RyZWUob2JqaWQgKyAxLCBvYmppZGxlbiAtIDEsIHN1YnRyZWUtPmNoaWxkX2xpc3QpOwogICAgaWYgKHJldHVybl90cmVlICE9IE5VTEwpCiAgICAgICAgcmV0dXJuIHJldHVybl90cmVlOwogICAgZWxzZQogICAgICAgIHJldHVybiBzdWJ0cmVlOwp9CgovKioKICogUHJpbnRzIG9uIG9pZCBkZXNjcmlwdGlvbiBvbiBzdGRvdXQuCiAqCiAqIEBzZWUgZnByaW50X2Rlc2NyaXB0aW9uCiAqLwp2b2lkCnByaW50X2Rlc2NyaXB0aW9uKG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIGZwcmludF9kZXNjcmlwdGlvbihzdGRvdXQsIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpOwp9CgoKLyoqCiAqIFByaW50cyBvbiBvaWQgZGVzY3JpcHRpb24gaW50byBhIGZpbGUgZGVzY3JpcHRvci4KICogCiAqIEBwYXJhbSBmICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byBwcmludCB0by4KICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkZW50aWZpZXIuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIG9iamVjdCBpZCBsZW5ndGguCiAqIEBwYXJhbSB3aWR0aCAgICAgTnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzLgogKi8Kdm9pZApmcHJpbnRfZGVzY3JpcHRpb24oRklMRSAqIGYsIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpCnsKICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwoKICAgIGlmICgoYnVmID0gKHVfY2hhciAqKSBjYWxsb2MoYnVmX2xlbiwgMSkpID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKGYsICJbVFJVTkNBVEVEXVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2Rlc2NyaXB0aW9uKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU05QUklOVF9ERVNDUklQVElPTgppbnQKc25wcmludF9kZXNjcmlwdGlvbihjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIGludCB3aWR0aCkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbigodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCwgb2JqaWRsZW4sIHdpZHRoKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NOUFJJTlRfREVTQ1JJUFRJT04gKi8KCmludApzcHJpbnRfcmVhbGxvY19kZXNjcmlwdGlvbih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgaW50IHdpZHRoKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAgPSBnZXRfdHJlZShvYmppZCwgb2JqaWRsZW4sIHRyZWVfaGVhZCk7CiAgICBzdHJ1Y3QgdHJlZSAgICAqc3VidHJlZSA9IHRyZWVfaGVhZDsKICAgIGludCAgICAgICAgICAgICBwb3MsIGxlbjsKICAgIGNoYXIgICAgICAgICAgICB0bXBidWZbMTI4XTsKICAgIGNvbnN0IGNoYXIgICAgICpjcDsKCiAgICBpZiAoTlVMTCA9PSB0cCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAodHAtPnR5cGUgPD0gVFlQRV9TSU1QTEVfTEFTVCkKICAgICAgICBjcCA9ICIgT0JKRUNULVRZUEUiOwogICAgZWxzZQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfVFJBUFRZUEU6CiAgICAgICAgICAgIGNwID0gIiBUUkFQLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTk9USUZUWVBFOgogICAgICAgICAgICBjcCA9ICIgTk9USUZJQ0FUSU9OLVRZUEUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKR1JPVVA6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtR1JPVVAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQUdFTlRDQVA6CiAgICAgICAgICAgIGNwID0gIiBBR0VOVC1DQVBBQklMSVRJRVMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9ESUQ6CiAgICAgICAgICAgIGNwID0gIiBNT0RVTEUtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT0JKSURFTlRJVFk6CiAgICAgICAgICAgIGNwID0gIiBPQkpFQ1QtSURFTlRJVFkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTU9EQ09NUDoKICAgICAgICAgICAgY3AgPSAiIE1PRFVMRS1DT01QTElBTkNFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50Zih0bXBidWYsICIgdHlwZV8lZCIsIHRwLT50eXBlKTsKICAgICAgICAgICAgY3AgPSB0bXBidWY7CiAgICAgICAgfQoKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmxhYmVsKSB8fAogICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICghcHJpbnRfdHJlZV9ub2RlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAsIHdpZHRoKSkKICAgICAgICByZXR1cm4gMDsKICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIjo6PSB7IikpCiAgICAgICAgcmV0dXJuIDA7CiAgICBwb3MgPSA1OwogICAgd2hpbGUgKG9iamlkbGVuID4gMSkgewogICAgICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgICAgIGlmICgqb2JqaWQgPT0gc3VidHJlZS0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCiAgICAgICAgICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKHN1YnRyZWUtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgICAgICBzbnByaW50Zih0bXBidWYsIHNpemVvZih0bXBidWYpLCAiICVzKCVsdSkiLCBzdWJ0cmVlLT5sYWJlbCwgc3VidHJlZS0+c3ViaWQpOwogICAgICAgICAgICAgICAgICAgIHRtcGJ1Zlsgc2l6ZW9mKHRtcGJ1ZiktMSBdID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wYnVmLCAiICVsdSIsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgICAgIG9iamlkbGVuLS07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3VidHJlZSkKICAgICAgICAgICAgc3VidHJlZSA9IHN1YnRyZWUtPmNoaWxkX2xpc3Q7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHdoaWxlIChvYmppZGxlbiA+IDEpIHsKICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlIiBORVRTTk1QX1BSSW8gInUiLCAqb2JqaWQpOwogICAgICAgIGxlbiA9IHN0cmxlbih0bXBidWYpOwogICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDU7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdG1wYnVmKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICBvYmppZCsrOwogICAgICAgIG9iamlkbGVuLS07CiAgICB9CiAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlIiBORVRTTk1QX1BSSW8gInUgfSIsICpvYmppZCk7CiAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiAgICAgIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyA9IDU7CiAgICB9CiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIGludApwcmludF90cmVlX25vZGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgc3RyW01BWFRPS0VOXTsKICAgIGludCAgICAgICAgICAgICBpLCBwcmV2bW9kLCBwb3MsIGxlbjsKCiAgICBpZiAodHApIHsKICAgICAgICBtb2R1bGVfbmFtZSh0cC0+bW9kaWQsIHN0cik7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICAtLSBGUk9NXHQiKSB8fAogICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcG9zID0gMTYrc3RybGVuKHN0cik7CiAgICAgICAgZm9yIChpID0gMSwgcHJldm1vZCA9IHRwLT5tb2RpZDsgaSA8IHRwLT5udW1iZXJfbW9kdWxlczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmV2bW9kICE9IHRwLT5tb2R1bGVfbGlzdFtpXSkgewogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZHVsZV9saXN0W2ldLCBzdHIpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixcbiAgLS1cdFx0IikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByZXZtb2QgPSB0cC0+bW9kdWxlX2xpc3RbaV07CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtLSBURVhUVUFMIENPTlZFTlRJT04gIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGNfZGVzY3JpcHRvcih0cC0+dGNfaW5kZXgpKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfT0JKSUQ6CiAgICAgICAgICAgIGNwID0gIk9CSkVDVCBJREVOVElGSUVSIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBjcCA9ICJPQ1RFVCBTVFJJTkciOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICAgICAgY3AgPSAiSU5URUdFUiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9ORVRBRERSOgogICAgICAgICAgICBjcCA9ICJOZXR3b3JrQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIGNwID0gIklwQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSOgogICAgICAgICAgICBjcCA9ICJDb3VudGVyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfR0FVR0U6CiAgICAgICAgICAgIGNwID0gIkdhdWdlMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICBjcCA9ICJUaW1lVGlja3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgICAgICBjcCA9ICJPcGFxdWUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICAgICAgY3AgPSAiTlVMTCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9DT1VOVEVSNjQ6CiAgICAgICAgICAgIGNwID0gIkNvdW50ZXI2NCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgICAgIGNwID0gIkJJVFMiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgICAgIGNwID0gIk5zYXBBZGRyZXNzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICBjcCA9ICJVSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgICAgIGNwID0gIlVuc2lnbmVkMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICBjcCA9ICJJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjcCA9IE5VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2lmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmICghY3AgJiYgKHRwLT5yYW5nZXMgfHwgdHAtPmVudW1zKSkgeyAvKiByYW5nZXMgd2l0aG91dCB0eXBlID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzICVzID8iLAogICAgICAgICAgICAgICAgICAgIHRwLT5yYW5nZXMgPyAiUmFuZ2UiIDogIiIsIHRwLT5lbnVtcyA/ICJFbnVtIiA6ICIiKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFNZTlRBWFx0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnAgPSB0cC0+cmFuZ2VzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgKCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHdoaWxlIChycCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0cC0+dHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJWQiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwgcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyVkLi4lZCIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwLT5sb3csIHJwLT5oaWdoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgICAgICAgICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVzJXUiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcnAtPmxvdyApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyV1Li4ldSIsIChmaXJzdCA/ICIiIDogIiB8ICIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClycC0+bG93LCAodW5zaWduZWQpcnAtPmhpZ2gpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAvKiBObyBvdGhlciByYW5nZSB0eXBlcyBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIpICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB7IikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyBzdHJsZW4oY3ApICsgMjsKICAgICAgICAgICAgd2hpbGUgKGVwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzKCVkKSIsIGVwLT5sYWJlbCwgZXAtPnZhbHVlKTsKICAgICAgICAgICAgICAgIHN0clsgc2l6ZW9mKHN0ciktMSBdID0gMDsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICJcblx0XHQgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgZXAgPSBlcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJ9ICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aGludCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERJU1BMQVktSElOVFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5oaW50KSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnVuaXRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgVU5JVFNcdFx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT51bml0cykgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3dpdGNoICh0cC0+YWNjZXNzKSB7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURPTkxZOgogICAgICAgICAgICBjcCA9ICJyZWFkLW9ubHkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRFdSSVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLXdyaXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1dSSVRFT05MWToKICAgICAgICAgICAgY3AgPSAid3JpdGUtb25seSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT0FDQ0VTUzoKICAgICAgICAgICAgY3AgPSAibm90LWFjY2Vzc2libGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9USUZZOgogICAgICAgICAgICBjcCA9ICJhY2Nlc3NpYmxlLWZvci1ub3RpZnkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfQ1JFQVRFOgogICAgICAgICAgICBjcCA9ICJyZWFkLWNyZWF0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgImFjY2Vzc18lZCIsIHRwLT5hY2Nlc3MpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgTUFYLUFDQ0VTU1x0IikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBjcCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN3aXRjaCAodHAtPnN0YXR1cykgewogICAgICAgIGNhc2UgTUlCX1NUQVRVU19NQU5EQVRPUlk6CiAgICAgICAgICAgIGNwID0gIm1hbmRhdG9yeSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19PUFRJT05BTDoKICAgICAgICAgICAgY3AgPSAib3B0aW9uYWwiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfT0JTT0xFVEU6CiAgICAgICAgICAgIGNwID0gIm9ic29sZXRlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX0RFUFJFQ0FURUQ6CiAgICAgICAgICAgIGNwID0gImRlcHJlY2F0ZWQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfQ1VSUkVOVDoKICAgICAgICAgICAgY3AgPSAiY3VycmVudCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBzcHJpbnRmKHN0ciwgInN0YXR1c18lZCIsIHRwLT5zdGF0dXMpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNpZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgICAgICBpZiAoIWNwICYmICh0cC0+aW5kZXhlcykpIHsgICAgIC8qIGluZGV4IHdpdGhvdXQgc3RhdHVzID8gKi8KICAgICAgICAgICAgc3ByaW50ZihzdHIsICI/MCB3aXRoICVzID8iLCB0cC0+aW5kZXhlcyA/ICJJbmRleCIgOiAiIik7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTVEFUVVNcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmF1Z21lbnRzKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQVVHTUVOVFNcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+YXVnbWVudHMpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICh0cC0+aW5kZXhlcykgewogICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaXAgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIElOREVYXHRcdHsgIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICB3aGlsZSAoaXApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJXMlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pc2ltcGxpZWQgPyAiSU1QTElFRCAiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlwLT5pbGFiZWwpOwogICAgICAgICAgICAgICAgc3RyWyBzaXplb2Yoc3RyKS0xIF0gPSAwOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICBpcCA9IGlwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPnZhcmJpbmRzKSB7CiAgICAgICAgICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnZwID0gdHAtPnZhcmJpbmRzOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwoKICAgICAgICAgICAgaWYgKHRwLT50eXBlID09IFRZUEVfVFJBUFRZUEUpIHsKICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAiICBWQVJJQUJMRVNcdHsgIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIiAgT0JKRUNUU1x0eyAiKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3MgPSAxNiArIDI7CiAgICAgICAgICAgIHdoaWxlICh2cCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHN0cmxjcHkoc3RyLCB2cC0+dmJsYWJlbCwgc2l6ZW9mKHN0cikpOwogICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CiAgICAgICAgICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDI7CiAgICAgICAgICAgICAgICB2cCA9IHZwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiB9XG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPmRlc2NyaXB0aW9uKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERFU0NSSVBUSU9OXHRcIiIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmRlc2NyaXB0aW9uKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmRlZmF1bHRWYWx1ZSkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBERUZWQUxcdHsgIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+ZGVmYXVsdFZhbHVlKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIk5vIGRlc2NyaXB0aW9uXG4iKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKaW50CmdldF9tb2R1bGVfbm9kZShjb25zdCBjaGFyICpmbmFtZSwKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbW9kaWQsIHJjID0gMDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGNoYXIgICAgICAgICAgICpuYW1lLCAqY3A7CgogICAgaWYgKCFzdHJjbXAobW9kdWxlLCAiQU5ZIikpCiAgICAgICAgbW9kaWQgPSAtMTsKICAgIGVsc2UgewogICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUobW9kdWxlKTsKICAgICAgICBtb2RpZCA9IHdoaWNoX21vZHVsZShtb2R1bGUpOwogICAgICAgIGlmIChtb2RpZCA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIElzb2xhdGUgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbmFtZSAuLi4gCiAgICAgKi8KICAgIG5hbWUgPSBzdHJkdXAoZm5hbWUpOwogICAgY3AgPSBzdHJjaHIobmFtZSwgJy4nKTsKICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgKmNwID0gJ1wwJzsKICAgICAgICBjcCsrOwogICAgfQogICAgLyoKICAgICAqIC4uLiBhbmQgbG9jYXRlIGl0IGluIHRoZSB0cmVlLiAKICAgICAqLwogICAgdHAgPSBmaW5kX3RyZWVfbm9kZShuYW1lLCBtb2RpZCk7CiAgICBpZiAodHApIHsKICAgICAgICBzaXplX3QgICAgICAgICAgbWF4bGVuID0gKm9iamlkbGVuOwoKICAgICAgICAvKgogICAgICAgICAqIFNldCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgb2JqZWN0IElEIAogICAgICAgICAqLwogICAgICAgIGlmIChub2RlX3RvX29pZCh0cCwgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgICAgICByYyA9IDE7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiB0aGUgbmFtZSByZXF1ZXN0ZWQgd2FzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwKICAgICAgICAgICAgICogdGFnIG9uIHRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICAgICByYyA9IF9hZGRfc3RyaW5nc190b19vaWQodHAsIGNwLCBvYmppZCwgb2JqaWRsZW4sIG1heGxlbik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShuYW1lKTsKICAgIHJldHVybiAocmMpOwp9CgoKLyoqCiAqIEBpbnRlcm5hbAogKgogKiBQb3B1bGF0ZXMgdGhlIG9iamVjdCBpZGVudGlmaWVyIGZyb20gYSBub2RlIGluIHRoZSBNSUIgaGllcmFyY2h5LgogKiBCdWlsZHMgdXAgdGhlIG9iamVjdCBJRCwgd29ya2luZyBiYWNrd2FyZHMsCiAqIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgb2JqaWQgYnVmZmVyLgogKiBXaGVuIHRoZSB0b3Agb2YgdGhlIE1JQiB0cmVlIGlzIHJlYWNoZWQsIHRoZSBidWZmZXIgaXMgYWRqdXN0ZWQuCiAqCiAqIFRoZSBidWZmZXIgbGVuZ3RoIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzCiAqIGZvciB0aGUgb2JqZWN0IGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBNSUIgbm9kZS4KICogCiAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyBjb3BpZWQuCiAqCiAqIElmIDAgaXMgcmV0dXJuZWQsIHRoZSBvYmppZCBidWZmZXIgaXMgdG9vIHNtYWxsLAogKiBhbmQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUgaW5kZXRlcm1pbmF0ZS4KICogVGhlIGJ1ZmZlciBsZW5ndGggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlci4KICovCnN0YXRpYyBpbnQKbm9kZV90b19vaWQoc3RydWN0IHRyZWUgKnRwLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIGludCAgICAgICAgICAgICBudW1pZHMsIGxlbmlkczsKICAgIG9pZCAgICAgICAgICAgICpvcDsKCiAgICBpZiAoIXRwIHx8ICFvYmppZCB8fCAhb2JqaWRsZW4pCiAgICAgICAgcmV0dXJuIDA7CgogICAgbGVuaWRzID0gKGludCkgKm9iamlkbGVuOwogICAgb3AgPSBvYmppZCArIGxlbmlkczsgICAgICAgIC8qIHBvaW50cyBhZnRlciB0aGUgbGFzdCBlbGVtZW50ICovCgogICAgZm9yIChudW1pZHMgPSAwOyB0cDsgdHAgPSB0cC0+cGFyZW50LCBudW1pZHMrKykgewogICAgICAgIGlmIChudW1pZHMgPj0gbGVuaWRzKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAtLW9wOwogICAgICAgICpvcCA9IHRwLT5zdWJpZDsKICAgIH0KCiAgICAqb2JqaWRsZW4gPSAoc2l6ZV90KSBudW1pZHM7CiAgICBpZiAobnVtaWRzID4gbGVuaWRzKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG51bWlkcyA8IGxlbmlkcykKICAgICAgICBtZW1tb3ZlKG9iamlkLCBvcCwgbnVtaWRzICogc2l6ZW9mKG9pZCkpOwoKICAgIHJldHVybiAobnVtaWRzKTsKfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKgogKiBSZXBsYWNlIFx4IHdpdGggeCBzdG9wIGF0IGVvc19tYXJrZXIKICogcmV0dXJuIE5VTEwgaWYgZW9zX21hcmtlciBub3QgZm91bmQKICovCnN0YXRpYyBjaGFyICpfYXBwbHlfZXNjYXBlcyhjaGFyICpzcmMsIGNoYXIgZW9zX21hcmtlcikKewogICAgY2hhciAqZHN0OwogICAgaW50IGJhY2tzbGFzaCA9IDA7CiAgICAKICAgIGRzdCA9IHNyYzsKICAgIHdoaWxlICgqc3JjKSB7CglpZiAoYmFja3NsYXNoKSB7CgkgICAgYmFja3NsYXNoID0gMDsKCSAgICAqZHN0KysgPSAqc3JjOwoJfSBlbHNlIHsKCSAgICBpZiAoZW9zX21hcmtlciA9PSAqc3JjKSBicmVhazsKCSAgICBpZiAoJ1xcJyA9PSAqc3JjKSB7CgkJYmFja3NsYXNoID0gMTsKCSAgICB9IGVsc2UgewoJCSpkc3QrKyA9ICpzcmM7CgkgICAgfQoJfQoJc3JjKys7CiAgICB9CiAgICBpZiAoISpzcmMpIHsKCS8qIG5ldmVyIGZvdW5kIGVvc19tYXJrZXIgKi8KCXJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKCSpkc3QgPSAwOwoJcmV0dXJuIHNyYzsKICAgIH0KfQoKc3RhdGljIGludAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICp0cCwgY2hhciAqY3AsCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuLCBzaXplX3QgbWF4bGVuKQojZWxzZQpfYWRkX3N0cmluZ3NfdG9fb2lkKHZvaWQgKnRwLCBjaGFyICpjcCwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4sIHNpemVfdCBtYXhsZW4pCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KewogICAgb2lkICAgICAgICAgICAgIHN1YmlkOwogICAgaW50ICAgICAgICAgICAgIGxlbl9pbmRleCA9IDEwMDAwMDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAyID0gTlVMTDsKICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcyA9IE5VTEw7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICpmY3AsICplY3AsICpjcDIgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgIGRvaW5ncXVvdGU7CiAgICBpbnQgICAgICAgICAgICAgbGVuID0gLTEsIHBvcyA9IC0xOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaW50ICAgICAgICAgICAgIGNoZWNrID0KICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UpOwogICAgaW50ICAgICAgICAgICAgIGRvX2hpbnQgPSAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCk7CgogICAgd2hpbGUgKGNwICYmIHRwICYmIHRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgdHAyID0gdHAtPmNoaWxkX2xpc3Q7CiAgICAgICAgLyoKICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAqY3AyKysgPSAnXDAnOwoKICAgICAgICAvKgogICAgICAgICAqIFNlYXJjaCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIAogICAgICAgICAqLwogICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqY3ApKSkgewogICAgICAgICAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICBpZiAoKmVjcCkKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB3aGlsZSAodHAyICYmIHRwMi0+c3ViaWQgIT0gc3ViaWQpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGlsZSAodHAyICYmIHN0cmNtcCh0cDItPmxhYmVsLCBmY3ApKQogICAgICAgICAgICAgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgICAgIGlmICghdHAyKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHN1YmlkID0gdHAyLT5zdWJpZDsKICAgICAgICB9CiAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwoJd2hpbGUgKHRwMiAmJiB0cDItPm5leHRfcGVlciAmJiB0cDItPm5leHRfcGVlci0+c3ViaWQgPT0gc3ViaWQpCgkgICAgdHAyID0gdHAyLT5uZXh0X3BlZXI7CiAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICgqb2JqaWRsZW4pKys7CgogICAgICAgIGNwID0gY3AyOwogICAgICAgIGlmICghdHAyKQogICAgICAgICAgICBicmVhazsKICAgICAgICB0cCA9IHRwMjsKICAgIH0KCiAgICBpZiAodHAgJiYgIXRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgaWYgKCh0cDIgPSB0cC0+cGFyZW50KSkgewogICAgICAgICAgICBpZiAodHAyLT5pbmRleGVzKQogICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIGVsc2UgaWYgKHRwMi0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHRwMiA9IGZpbmRfdHJlZV9ub2RlKHRwMi0+YXVnbWVudHMsIC0xKTsKICAgICAgICAgICAgICAgIGlmICh0cDIpCiAgICAgICAgICAgICAgICAgICAgaW5fZGljZXMgPSB0cDItPmluZGV4ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHAgPSBOVUxMOwogICAgfQoKICAgIHdoaWxlIChjcCAmJiBpbl9kaWNlcykgewogICAgICAgIGZjcCA9IGNwOwoKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKGluX2RpY2VzLT5pbGFiZWwsIC0xKTsKICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSXNvbGF0ZSB0aGUgbmV4dCBlbnRyeSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICpjcDIrKyA9ICdcMCc7CiAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqY3ApKSkgewogICAgICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcCAmJiBzdHJjbXAoZXAtPmxhYmVsLCBjcCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViaWQgPSBlcC0+dmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hlY2sgJiYgdHAtPnJhbmdlcykgewogICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSIHx8CiAgICAgICAgICAgICAgICAgICAgdHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSMzIpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgocnAtPmxvdyA8PSAoaW50KSBzdWJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChpbnQpIHN1YmlkIDw9IHJwLT5oaWdoKSkKICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogY2hlY2sgdW5zaWduZWQgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgoKHVuc2lnbmVkIGludClycC0+bG93IDw9IHN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3ViaWQgPD0gKHVuc2lnbmVkIGludClycC0+aGlnaCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgNCA+IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBmb3IgKHN1YmlkID0gMDsgY3AgJiYgc3ViaWQgPCA0OyBzdWJpZCsrKSB7CiAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgaWYgKGNoZWNrICYmIG9iamlkWypvYmppZGxlbl0gPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpCiAgICAgICAgICAgICAgICBsZW4gPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxlbiA9IC0xOwogICAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgICBpZiAoKmNwID09ICciJyB8fCAqY3AgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgZG9pbmdxdW90ZSA9ICpjcCsrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGluc2VydCBsZW5ndGggaWYgcmVxdWVzdGVkIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQgJiYgbGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvaW5ncXVvdGUgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiJy1xdW90ZSBpcyBmb3IgZml4ZWQgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBsZW5faW5kZXggPSAqb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgKCJcIi1xdW90ZSBpcyBmb3IgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KCgkJY3AyID0gX2FwcGx5X2VzY2FwZXMoY3AsIGRvaW5ncXVvdGUpOwoJCWlmICghY3AyKSBnb3RvIGJhZF9pZDsKCQllbHNlIHsKCQkgICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKCQkgICAgaW50IG5ld192YWxfbGVuOwoJCSAgICBpbnQgcGFyc2VkX2hpbnQgPSAwOwoJCSAgICBjb25zdCBjaGFyICpwYXJzZWRfdmFsdWU7CgoJCSAgICBpZiAoZG9faGludCAmJiB0cC0+aGludCkgewoJCQlwYXJzZWRfdmFsdWUgPSBwYXJzZV9vY3RldF9oaW50KHRwLT5oaW50LCBjcCwKCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKCQkJcGFyc2VkX2hpbnQgPSBwYXJzZWRfdmFsdWUgPT0gTlVMTDsKCQkgICAgfQoJCSAgICBpZiAocGFyc2VkX2hpbnQpIHsKCQkJaW50IGk7CgkJCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSBuZXdfdmFsW2ldOwoJCQkgICAgKCpvYmppZGxlbikrKzsKCQkJICAgIHBvcysrOwoJCQl9CgkJCVNOTVBfRlJFRShuZXdfdmFsKTsKCQkgICAgfSBlbHNlIHsKCQkJd2hpbGUoKmNwKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSAqY3ArKzsKCQkJICAgICgqb2JqaWRsZW4pKys7CgkJCSAgICBwb3MrKzsKCQkJfQoJCSAgICB9CgkJfQoJCQoJCWNwMisrOwogICAgICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgICAgIGNwMiA9IE5VTEw7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgqY3AyICE9ICcuJykKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjcDIrKzsKCQlpZiAoY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChycCAmJiAhb2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA8PSBwb3MgJiYgcG9zIDw9IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkW2xlbl9pbmRleF0gPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgIT0gbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKCQl9CgkJZWxzZSBpZiAobGVuID09IC0xICYmICFpbl9kaWNlcy0+aXNpbXBsaWVkKQoJCSAgICBvYmppZFtsZW5faW5kZXhdID0gcG9zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkICYmIGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgbGVuICsgMSA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gJiYgY3ApIHsKICAgICAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGVjayAmJiBvYmppZFsqb2JqaWRsZW5dID4gMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaW5fZGljZXMgPSBOVUxMOwogICAgICAgICAgICBjcDIgPSBjcDsKICAgICAgICAgICAgYnJlYWs7CgljYXNlIFRZUEVfTkVUQUREUjoKCSAgICBmY3AgPSBjcDsKCSAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CgkgICAgaWYgKGNwMikKCQkqY3AyKysgPSAwOwoJICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CgkgICAgaWYgKCplY3ApCgkJZ290byBiYWRfaWQ7CgkgICAgaWYgKCpvYmppZGxlbiArIDEgPj0gbWF4bGVuKQoJCWdvdG8gYmFkX2lkOwoJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCSAgICAoKm9iamlkbGVuKSsrOwoJICAgIGNwID0gY3AyOwoJICAgIGlmIChzdWJpZCA9PSAxKSB7CgkJZm9yIChsZW4gPSAwOyBjcCAmJiBsZW4gPCA0OyBsZW4rKykgewoJCSAgICBmY3AgPSBjcDsKCQkgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwoJCSAgICBpZiAoY3AyKQoJCQkqY3AyKysgPSAwOwoJCSAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwoJCSAgICBpZiAoKmVjcCkKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmICgqb2JqaWRsZW4gKyAxID49IG1heGxlbikKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmIChjaGVjayAmJiBzdWJpZCA+IDI1NSkKCQkJZ290byBiYWRfaWQ7CgkJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCQkgICAgKCpvYmppZGxlbikrKzsKCQkgICAgY3AgPSBjcDI7CgkJfQoJICAgIH0KCSAgICBlbHNlIHsKCQlpbl9kaWNlcyA9IE5VTEw7CgkgICAgfQoJICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIGluZGV4IHR5cGU6ICVkICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICB0cC0+dHlwZSwgaW5fZGljZXMtPmlsYWJlbCwgY3ApOwogICAgICAgICAgICBpbl9kaWNlcyA9IE5VTEw7CiAgICAgICAgICAgIGNwMiA9IGNwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKGluX2RpY2VzKQogICAgICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgd2hpbGUgKGNwKSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICBjYXNlICcxJzoKICAgICAgICBjYXNlICcyJzoKICAgICAgICBjYXNlICczJzoKICAgICAgICBjYXNlICc0JzoKICAgICAgICBjYXNlICc1JzoKICAgICAgICBjYXNlICc2JzoKICAgICAgICBjYXNlICc3JzoKICAgICAgICBjYXNlICc4JzoKICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICciJzoKICAgICAgICBjYXNlICdcJyc6CiAgICAgICAgICAgIGRvaW5ncXVvdGUgPSAqY3ArKzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaW5zZXJ0IGxlbmd0aCBpZiByZXF1ZXN0ZWQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IGxlbiA9IHN0cmNocihjcCwgZG9pbmdxdW90ZSkgLSBjcDsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gZG9pbmdxdW90ZSkgewogICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gKmNwKys7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwMiA9IGNwICsgMTsKICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgY3AyID0gTlVMTDsKICAgICAgICAgICAgZWxzZSBpZiAoKmNwMiA9PSAnLicpCiAgICAgICAgICAgICAgICBjcDIrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgIH0KICAgICAgICBjcCA9IGNwMjsKICAgIH0KICAgIHJldHVybiAxOwoKICBiYWRfaWQ6CiAgICB7CiAgICAgICAgY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgIGlmIChpbl9kaWNlcykKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkluZGV4IG91dCBvZiByYW5nZTogJXMgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgZmNwLCBpbl9kaWNlcy0+aWxhYmVsKTsKICAgICAgICBlbHNlIGlmICh0cCkKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlN1Yi1pZCBub3QgZm91bmQ6ICVzIC0+ICVzIiwgdHAtPmxhYmVsLCBmY3ApOwogICAgICAgIGVsc2UKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCBmY3ApOwogICAgICAgIGJ1Zlsgc2l6ZW9mKGJ1ZiktMSBdID0gMDsKCiAgICAgICAgc25tcF9zZXRfZGV0YWlsKGJ1Zik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBAc2VlIGNvbW1lbnRzIG9uIGZpbmRfYmVzdF90cmVlX25vZGUgZm9yIHVzYWdlIGFmdGVyIGZpcnN0IHRpbWUuCiAqLwppbnQKZ2V0X3dpbGRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGZpbmRfYmVzdF90cmVlX25vZGUobmFtZSwgdHJlZV9oZWFkLCBOVUxMKTsKICAgIGlmICghdHApCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gZ2V0X25vZGUodHAtPmxhYmVsLCBvYmppZCwgb2JqaWRsZW4pOwp9CgppbnQKZ2V0X25vZGUoY29uc3QgY2hhciAqbmFtZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwoKICAgIGNwID0gbmFtZTsKICAgIHdoaWxlICgoY2ggPSAqY3ApKQogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIGlmIChjaCAhPSAnOicpCiAgICAgICAgaWYgKCpuYW1lID09ICcuJykKICAgICAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKG5hbWUgKyAxLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShuYW1lLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgIGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICptb2R1bGU7CiAgICAgICAgLyoKICAgICAgICAgKiAgcmVxdWVzdGVkIG5hbWUgaXMgb2YgdGhlIGZvcm0KICAgICAgICAgKiAgICAgICJtb2R1bGU6c3ViaWRlbnRpZmllciIKICAgICAgICAgKi8KICAgICAgICBtb2R1bGUgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgKGNwIC0gbmFtZSArIDEpKTsKICAgICAgICBpZiAoIW1vZHVsZSkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIHNwcmludGYobW9kdWxlLCAiJS4qcyIsIChpbnQpIChjcCAtIG5hbWUpLCBuYW1lKTsKICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAvKiBjcCBub3cgcG9pbnQgdG8gdGhlIHN1YmlkZW50aWZpZXIgKi8KICAgICAgICBpZiAoKmNwID09ICc6JykKICAgICAgICAgICAgY3ArKzsKCiAgICAgICAgLyoKICAgICAgICAgKiAnY3AnIGFuZCAnbmFtZScgKmRvKiBnbyB0aGF0IHdheSByb3VuZCEgCiAgICAgICAgICovCiAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKGNwLCBtb2R1bGUsIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgU05NUF9GUkVFKG1vZHVsZSk7CiAgICB9CiAgICBpZiAocmVzID09IDApIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX1VOS05PV05fT0JKSUQpOwogICAgfQoKICAgIHJldHVybiByZXM7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RpbmcKCm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgb2lkICAgICAgICAgICAgIG9iamlkW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBvYmppZGxlbiA9IE1BWF9PSURfTEVOOwogICAgaW50ICAgICAgICAgICAgIGNvdW50OwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0IHZhcmlhYmxlOwoKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKICAgIGlmIChhcmdjIDwgMikKICAgICAgICBwcmludF9zdWJ0cmVlKHN0ZG91dCwgdHJlZV9oZWFkLCAwKTsKICAgIHZhcmlhYmxlLnR5cGUgPSBBU05fSU5URUdFUjsKICAgIHZhcmlhYmxlLnZhbC5pbnRlZ2VyID0gMzsKICAgIHZhcmlhYmxlLnZhbF9sZW4gPSA0OwogICAgZm9yIChhcmdjLS07IGFyZ2M7IGFyZ2MtLSwgYXJndisrKSB7CiAgICAgICAgb2JqaWRsZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBwcmludGYoInJlYWRfb2JqaWQoJXMpID0gJWRcbiIsCiAgICAgICAgICAgICAgIGFyZ3ZbMV0sIHJlYWRfb2JqaWQoYXJndlsxXSwgb2JqaWQsICZvYmppZGxlbikpOwogICAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9iamlkbGVuOyBjb3VudCsrKQogICAgICAgICAgICBwcmludGYoIiVkLiIsIG9iamlkW2NvdW50XSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHByaW50X3ZhcmlhYmxlKG9iamlkLCBvYmppZGxlbiwgJnZhcmlhYmxlKTsKICAgIH0KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0aW5nICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBpbml0aWFsaXplOiBubyBwZWVycyBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiAKICovCnZvaWQKY2xlYXJfdHJlZV9mbGFncyhyZWdpc3RlciBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGZvciAoOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgdHAtPnJlcG9ydGVkID0gMDsKICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIGNsZWFyX3RyZWVfZmxhZ3ModHAtPmNoaWxkX2xpc3QpOwogICAgIC8qUkVDVVJTRSovfQp9CgovKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqLwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAwOwoKLyoKICogVGhlc2UgbWV0aG9kcyByZWN1cnNlLiAKICovCnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X29pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWwoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChGSUxFICosIHN0cnVjdCB0cmVlICosIGludCk7CgoKdm9pZApwcmludF9vaWRfcmVwb3J0KEZJTEUgKiBmcCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZnAsIHRwLCAwKTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9sYWJlbGVkb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9vaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfc3VmZml4KHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX3N5bWJvbGljKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYyA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfbWliY2hpbGRvaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMTsKfQoKLyoKICogaGVscGVyIG1ldGhvZHMgZm9yIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydCgpCiAqIGVhY2ggb25lIHRyYXZlcnNlcyBiYWNrIHVwIHRoZSBub2RlIHRyZWUKICogdW50aWwgdGhlcmUgaXMgbm8gcGFyZW50LiAgVGhlbiwgdGhlIGxhYmVsIGNvbWJpbmF0aW9uCiAqIGlzIG91dHB1dCwgc3VjaCB0aGF0IHRoZSBwYXJlbnQgaXMgZGlzcGxheWVkIGZpcnN0LgogKgogKiBXYXJuaW5nOiB0aGVzZSBtZXRob2RzIGFyZSBhbGwgcmVjdXJzaXZlLgogKi8KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9sYWJlbGVkb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJXMoJWx1KSIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X29pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJWx1IiwgdHAtPnN1YmlkKTsKICAgIH0KfQoKCnN0YXRpYyB2b2lkIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBzdGF0aWMgc3RydWN0IHRyZWUgKnRlbXA7CiAgICB1bnNpZ25lZCBsb25nIGVsZW1zWzEwMF07CiAgICBpbnQgZWxlbV9jbnQgPSAwOwogICAgaW50IGkgPSAwOwogICAgdGVtcCA9IHRwOwogICAgaWYgKHRlbXApIHsKICAgICAgICB3aGlsZSAodGVtcC0+cGFyZW50KSB7CiAgICAgICAgICAgICAgICBlbGVtc1tlbGVtX2NudCsrXSA9IHRlbXAtPnN1YmlkOwogICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAtPnBhcmVudDsKICAgICAgICB9CiAgICAgICAgZWxlbXNbZWxlbV9jbnQrK10gPSB0ZW1wLT5zdWJpZDsKICAgIH0KICAgIGZvciAoaSA9IGVsZW1fY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAoaSA9PSBlbGVtX2NudCAtIDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJWx1IiwgZWxlbXNbaV0pOyAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIi4lbHUiLCBlbGVtc1tpXSk7ICAgICAgICAgIAogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X2xhYmVsKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVzIiwgdHAtPmxhYmVsKTsKICAgIH0KfQoKLyoqCiAqIEBpbnRlcm5hbAogKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGVzIHZhcmlhdGlvbnMgb24gdGhlIG9yaWdpbmFsIHByaW50X3N1YnRyZWUoKSByZXBvcnQuCiAqIFRyYXZlcnNlIHRoZSB0cmVlIGRlcHRoIGZpcnN0LCBmcm9tIGxlYXN0IHRvIGdyZWF0ZXN0IHN1Yi1pZGVudGlmaWVyLgogKiBXYXJuaW5nOiB0aGlzIG1ldGhvZHMgcmVjdXJzZXMgYW5kIGNhbGxzIG1ldGhvZHMgdGhhdCByZWN1cnNlLgogKgogKiBAcGFyYW0gZiAgICAgICBGaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSB0cmVlICAgID8/PwogKiBAcGFyYW0gY291bnQgICA/Pz8KICovCgpzdGF0aWMgdm9pZApwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cmVlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICBjb3VudCsrOwoKICAgIC8qCiAgICAgKiBzYW5pdHkgY2hlY2sgCiAgICAgKi8KICAgIGlmICghdHJlZSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogZmluZCB0aGUgbm90IHJlcG9ydGVkIHBlZXIgd2l0aCB0aGUgbG93ZXN0IHN1Yi1pZGVudGlmaWVyLgogICAgICogaWYgbm8gbW9yZSwgYnJlYWsgdGhlIGxvb3AgYW5kIGNsZWFudXAuCiAgICAgKiBzZXQgInJlcG9ydGVkIiBmbGFnLCBhbmQgY3JlYXRlIHJlcG9ydCBmb3IgdGhpcyBwZWVyLgogICAgICogcmVjdXJzZSB1c2luZyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwZWVyLCBpZiBhbnkuCiAgICAgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHRyZWUgKm50cDsKCiAgICAgICAgdHAgPSBOVUxMOwogICAgICAgIGZvciAobnRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgbnRwOyBudHAgPSBudHAtPm5leHRfcGVlcikgewogICAgICAgICAgICBpZiAobnRwLT5yZXBvcnRlZCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKCF0cCB8fCAodHAtPnN1YmlkID4gbnRwLT5zdWJpZCkpCiAgICAgICAgICAgICAgICB0cCA9IG50cDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHRwLT5yZXBvcnRlZCA9IDE7CgogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9vaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQpIHsKCSAgICBmcHJpbnRmKGYsICJcIiVzXCJcdCIsIHRwLT5sYWJlbCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlx0XHRcIiIpOwogICAgICAgICAgICBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4KSB7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzKCVsZCkgdHlwZT0lZCIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgdGM9JWQiLCB0cC0+dGNfaW5kZXgpOwogICAgICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgaGludD0lcyIsIHRwLT5oaW50KTsKICAgICAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CgogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZiwgdHAsIGNvdW50KTsKICAgICAvKlJFQ1VSU0UqL30KfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgoKLyoqCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyCiAqCiAqIEBzZWUgdXB0aW1lU3RyaW5nCiAqLwpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmKQp7CiAgICByZXR1cm4gdXB0aW1lX3N0cmluZ19uKCB0aW1ldGlja3MsIGJ1ZiwgNDApOwp9CgpjaGFyICAgICAgICAgICAqCnVwdGltZV9zdHJpbmdfbih1X2xvbmcgdGltZXRpY2tzLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKICAgIHVwdGltZVN0cmluZyh0aW1ldGlja3MsIGJ1ZiwgYnVmbGVuKTsKICAgIHJldHVybiBidWY7Cn0KCi8qKgogKiBHaXZlbiBhIHN0cmluZywgcGFyc2VzIGFuIG9pZCBvdXQgb2YgaXQgKGlmIHBvc3NpYmxlKS4KICogSXQgd2lsbCB0cnkgdG8gcGFyc2UgaXQgYmFzZWQgb24gcHJlZGV0ZXJtaW5lZCBjb25maWd1cmF0aW9uIGlmCiAqIHByZXNlbnQgb3IgYnkgZXZlcnkgbWV0aG9kIHBvc3NpYmxlIG90aGVyd2lzZS4KICogSWYgYSBzdWZmaXggaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgsIGl0CiAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGlucHV0IHN0cmluZyBiZWZvcmUgcHJvY2Vzc2luZy4KICoKICogQHBhcmFtIGFyZ3YgICAgVGhlIE9JRCB0byBzdHJpbmcgcGFyc2UKICogQHBhcmFtIHJvb3QgICAgQW4gT0lEIGFycmF5IHdoZXJlIHRoZSByZXN1bHRzIGFyZSBzdG9yZWQuCiAqIEBwYXJhbSByb290bGVuIFRoZSBtYXggbGVuZ3RoIG9mIHRoZSBhcnJheSBnb2luZyBpbiBhbmQgdGhlIGRhdGEKICogICAgICAgICAgICAgICAgbGVuZ3RoIGNvbWluZyBvdXQuCiAqCiAqIEByZXR1cm4gICAgICAgIFRoZSByb290IG9pZCBwb2ludGVyIGlmIHN1Y2Nlc3NmdWwsIG9yIE5VTEwgb3RoZXJ3aXNlLgogKi8KIApvaWQgICAgICAgICAgICAqCnNubXBfcGFyc2Vfb2lkKGNvbnN0IGNoYXIgKmFyZ3YsIG9pZCAqIHJvb3QsIHNpemVfdCAqIHJvb3RsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBzYXZsZW4gPSAqcm9vdGxlbjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBidWZfbGVuID0gMDsKICAgIHN0YXRpYyBjaGFyICAgICp0bXBidWY7CiAgICBjb25zdCBjaGFyICAgICAqc3VmZml4LCAqcHJlZml4OwoKICAgIHN1ZmZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYKTsKICAgIHByZWZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYKTsKICAgIGlmICgoc3VmZml4ICYmIHN1ZmZpeFswXSkgfHwgKHByZWZpeCAmJiBwcmVmaXhbMF0pKSB7CiAgICAgICAgaWYgKCFzdWZmaXgpCiAgICAgICAgICAgIHN1ZmZpeCA9ICIiOwogICAgICAgIGlmICghcHJlZml4KQogICAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICBpZiAoKHN0cmxlbihzdWZmaXgpICsgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4oYXJndikgKyAyKSA+IHRtcGJ1Zl9sZW4pIHsKICAgICAgICAgICAgdG1wYnVmX2xlbiA9IHN0cmxlbihzdWZmaXgpICsgc3RybGVuKGFyZ3YpICsgc3RybGVuKHByZWZpeCkgKyAyOwogICAgICAgICAgICB0bXBidWYgPSAoY2hhciAqKXJlYWxsb2ModG1wYnVmLCB0bXBidWZfbGVuKTsKICAgICAgICB9CiAgICAgICAgc25wcmludGYodG1wYnVmLCB0bXBidWZfbGVuLCAiJXMlcyVzJXMiLCBwcmVmaXgsIGFyZ3YsCiAgICAgICAgICAgICAgICAgKChzdWZmaXhbMF0gPT0gJy4nIHx8IHN1ZmZpeFswXSA9PSAnXDAnKSA/ICIiIDogIi4iKSwKICAgICAgICAgICAgICAgICBzdWZmaXgpOwogICAgICAgIGFyZ3YgPSB0bXBidWY7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBfcGFyc2Vfb2lkIiwiUGFyc2luZzogJXNcbiIsYXJndikpOwogICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUykKICAgICAgICB8fCBzdHJjaHIoYXJndiwgJzonKSkgewogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpKSB7CgljbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICAgICAgaWYgKGdldF93aWxkX25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIGlmIChyZWFkX29iamlkKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICAqcm9vdGxlbiA9IHNhdmxlbjsKICAgICAgICBpZiAoZ2V0X25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWQiLCAid2lsZGx5IHBhcnNpbmdcbiIpKTsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHJldHVybiBOVUxMOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBVc2UgRElTUExBWS1ISU5UIHRvIHBhcnNlIGEgdmFsdWUgaW50byBhbiBvY3RldCBzdHJpbmcuCiAqCiAqIG5vdGUgdGhhdCAiMWQxZCIsICIxMSIgY291bGQgaGF2ZSBjb21lIGZyb20gYW4gb2N0ZXQgc3RyaW5nIHRoYXQKICogbG9va2VkIGxpa2UgeyAxLCAxIH0gb3IgYW4gb2N0ZXQgc3RyaW5nIHRoYXQgbG9va2VkIGxpa2UgeyAxMSB9CiAqIGJlY2F1c2Ugb2YgdGhpcywgaXQncyBkb3VidGZ1bCB0aGF0IGFueW9uZSB3b3VsZCB1c2Ugc3VjaCBhIGRpc3BsYXkKICogc3RyaW5nLiBUaGVyZWZvcmUsIHRoZSBwYXJzZXIgaWdub3JlcyB0aGlzIGNhc2UuCiAqLwoKc3RydWN0IHBhcnNlX2hpbnRzIHsKICAgIGludCBsZW5ndGg7CiAgICBpbnQgcmVwZWF0OwogICAgaW50IGZvcm1hdDsKICAgIGludCBzZXBhcmF0b3I7CiAgICBpbnQgdGVybWluYXRvcjsKICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdDsKICAgIGludCByZXN1bHRfbWF4OwogICAgaW50IHJlc3VsdF9sZW47Cn07CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19yZXNldChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwaC0+bGVuZ3RoID0gMDsKICAgIHBoLT5yZXBlYXQgPSAwOwogICAgcGgtPmZvcm1hdCA9IDA7CiAgICBwaC0+c2VwYXJhdG9yID0gMDsKICAgIHBoLT50ZXJtaW5hdG9yID0gMDsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfY3RvcihzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwYXJzZV9oaW50c19yZXNldChwaCk7CiAgICBwaC0+cmVzdWx0ID0gTlVMTDsKICAgIHBoLT5yZXN1bHRfbWF4ID0gMDsKICAgIHBoLT5yZXN1bHRfbGVuID0gMDsKfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIHVuc2lnbmVkIGNoYXIgb2N0ZXQpCnsKICAgIGlmICghKHBoLT5yZXN1bHRfbGVuIDwgcGgtPnJlc3VsdF9tYXgpKSB7CglwaC0+cmVzdWx0X21heCA9IHBoLT5yZXN1bHRfbGVuICsgMzI7CglpZiAoIXBoLT5yZXN1bHQpIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MocGgtPnJlc3VsdF9tYXgpOwoJfSBlbHNlIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKilyZWFsbG9jKHBoLT5yZXN1bHQsIHBoLT5yZXN1bHRfbWF4KTsKCX0KICAgIH0KICAgIAogICAgaWYgKCFwaC0+cmVzdWx0KSB7CglyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwogICAgfQoKICAgIHBoLT5yZXN1bHRbcGgtPnJlc3VsdF9sZW4rK10gPSBvY3RldDsKICAgIHJldHVybiAxOwkJCS8qIHN1Y2Nlc3MgKi8KfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19wYXJzZShzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBjb25zdCBjaGFyICoqdl9pbl9vdXQpCnsKICAgIGNvbnN0IGNoYXIgKnYgPSAqdl9pbl9vdXQ7CiAgICBjaGFyICpudjsKICAgIGludCBiYXNlOwogICAgaW50IHJlcGVhdHMgPSAwOwogICAgaW50IHJlcGVhdF9maXh1cCA9IHBoLT5yZXN1bHRfbGVuOwogICAgCiAgICBpZiAocGgtPnJlcGVhdCkgewoJaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAwKSkgewoJICAgIHJldHVybiAwOwoJfQogICAgfQogICAgZG8gewoJYmFzZSA9IDA7Cglzd2l0Y2ggKHBoLT5mb3JtYXQpIHsKCWNhc2UgJ3gnOiBiYXNlICs9IDY7CS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnZCc6IGJhc2UgKz0gMjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdvJzogYmFzZSArPSA4OwkvKiBmYWxsIHRocm91Z2ggKi8KCSAgICB7CgkJaW50IGk7CgkJdW5zaWduZWQgbG9uZyBudW1iZXIgPSBzdHJ0b2wodiwgJm52LCBiYXNlKTsKCQlpZiAobnYgPT0gdikgcmV0dXJuIDA7CgkJdiA9IG52OwoJCWZvciAoaSA9IDA7IGkgPCBwaC0+bGVuZ3RoOyBpKyspIHsKCQkgICAgaW50IHNoaWZ0ID0gOCAqIChwaC0+bGVuZ3RoIC0gMSAtIGkpOwoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICh1X2NoYXIpKG51bWJlciA+PiBzaGlmdCkgKSkgewoJCQlyZXR1cm4gMDsgLyogZmFpbGVkICovCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgJ2EnOgoJICAgIHsKCQlpbnQgaTsKCQkgICAgCgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGggJiYgKnY7IGkrKykgewoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICp2KyspKSB7CgkJCXJldHVybiAwOwkvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CgoJcmVwZWF0cysrOwoKCWlmIChwaC0+c2VwYXJhdG9yICYmICp2KSB7CgkgICAgaWYgKCp2ID09IHBoLT5zZXBhcmF0b3IpIHsKCQl2Kys7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwoJICAgIH0KCX0KCglpZiAocGgtPnRlcm1pbmF0b3IpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnRlcm1pbmF0b3IpIHsKCQl2Kys7CgkJYnJlYWs7CgkgICAgfQoJfQogICAgfSB3aGlsZSAocGgtPnJlcGVhdCAmJiAqdik7CiAgICBpZiAocGgtPnJlcGVhdCkgewoJcGgtPnJlc3VsdFtyZXBlYXRfZml4dXBdID0gcmVwZWF0czsKICAgIH0KCiAgICAqdl9pbl9vdXQgPSB2OwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgaW50IGRpZ2l0KQp7CiAgICBwaC0+bGVuZ3RoICo9IDEwOwogICAgcGgtPmxlbmd0aCArPSBkaWdpdCAtICcwJzsKfQoKY29uc3QgY2hhciAqcGFyc2Vfb2N0ZXRfaGludChjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgY2hhciAqKm5ld192YWwsIGludCAqbmV3X3ZhbF9sZW4pCnsKICAgIGNvbnN0IGNoYXIgKmggPSBoaW50OwogICAgY29uc3QgY2hhciAqdiA9IHZhbHVlOwogICAgc3RydWN0IHBhcnNlX2hpbnRzIHBoOwogICAgaW50IHJldHZhbCA9IDE7CiAgICAvKiBTZWUgUkZDIDE0NDMgKi8KICAgIGVudW0gewoJSElOVF8xXzIsCglISU5UXzJfMywKCUhJTlRfMV8yXzQsCglISU5UXzFfMl81CiAgICB9IHN0YXRlID0gSElOVF8xXzI7CgogICAgcGFyc2VfaGludHNfY3RvcigmcGgpOwogICAgd2hpbGUgKCpoICYmICp2ICYmIHJldHZhbCkgewoJc3dpdGNoIChzdGF0ZSkgewoJY2FzZSBISU5UXzFfMjoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXJldHVybiB2OwkvKiBmYWlsZWQgKi8KCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBISU5UXzJfMzoKCSAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJLyogc3RhdGUgPSBISU5UXzJfMyAqLwoJICAgIH0gZWxzZSBpZiAoJ3gnID09ICpoIHx8ICdkJyA9PSAqaCB8fCAnbycgPT0gKmggfHwgJ2EnID09ICpoKSB7CgkJcGguZm9ybWF0ID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl80OwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHY7CS8qIGZhaWxlZCAqLwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzQ6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGguc2VwYXJhdG9yID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl81OwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzU6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikoKmgpKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGgudGVybWluYXRvciA9ICpoOwoKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoKCQlzdGF0ZSA9IEhJTlRfMV8yOwoJICAgIH0KCSAgICBicmVhazsKCX0KCWgrKzsKICAgIH0KICAgIHdoaWxlICgqdiAmJiByZXR2YWwpIHsKCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwogICAgfQogICAgaWYgKHJldHZhbCkgewoJKm5ld192YWwgPSBwaC5yZXN1bHQ7CgkqbmV3X3ZhbF9sZW4gPSBwaC5yZXN1bHRfbGVuOwogICAgfSBlbHNlIHsKCWlmIChwaC5yZXN1bHQpIHsKCSAgICBTTk1QX0ZSRUUocGgucmVzdWx0KTsKCX0KCSpuZXdfdmFsID0gTlVMTDsKCSpuZXdfdmFsX2xlbiA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0dmFsID8gTlVMTCA6IHY7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RfZGlzcGxheV9oaW50CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCnsKICAgIGNvbnN0IGNoYXIgKmhpbnQ7CiAgICBjb25zdCBjaGFyICp2YWx1ZTsKICAgIHVuc2lnbmVkIGNoYXIgKm5ld192YWw7CiAgICBpbnQgbmV3X3ZhbF9sZW47CiAgICBjaGFyICpyOwogICAgCiAgICBpZiAoYXJnYyA8IDMpIHsKCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGRoIDxoaW50PiA8dmFsdWU+XG4iKTsKCWV4aXQoMik7CiAgICB9CiAgICBoaW50ID0gYXJndlsxXTsKICAgIHZhbHVlID0gYXJndlsyXTsKICAgIHIgPSBwYXJzZV9vY3RldF9oaW50KGhpbnQsIHZhbHVlLCAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKICAgIHByaW50Zigie1wiJXNcIiwgXCIlc1wifTogXG5cdCIsIGhpbnQsIHZhbHVlKTsKICAgIGlmIChyKSB7CiAgICAgICAgKnIgPSAwOwogICAgCXByaW50ZigicmV0dXJuZWQgZmFpbGVkXG4iKTsKCXByaW50ZigidmFsdWUgc3ludGF4IGVycm9yIGF0OiAlc1xuIiwgdmFsdWUpOwogICAgfQogICAgZWxzZSB7CglpbnQgaTsKCXByaW50ZigicmV0dXJuZWQgc3VjY2Vzc1xuIik7Cglmb3IgKGkgPSAwOyBpIDwgbmV3X3ZhbF9sZW47IGkrKykgewoJICAgIGludCBjID0gbmV3X3ZhbFtpXSAmIDB4RkY7CgkgICAgcHJpbnRmKCIlMDJYKCVjKSAiLCBjLCBpc3ByaW50KGMpID8gYyA6ICcgJyk7Cgl9CglTTk1QX0ZSRUUobmV3X3ZhbCk7CiAgICB9CiAgICBwcmludGYoIlxuIik7CiAgICBleGl0KDApOwp9CgojZW5kaWYgLyogdGVzdF9kaXNwbGF5X2hpbnQgKi8KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfVE9fQVNOX1RZUEUKdV9jaGFyCm1pYl90b19hc25fdHlwZShpbnQgbWliX3R5cGUpCnsKICAgIHN3aXRjaCAobWliX3R5cGUpIHsKICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICByZXR1cm4gQVNOX09CSkVDVF9JRDsKCiAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgcmV0dXJuIEFTTl9PQ1RFVF9TVFI7CgogICAgY2FzZSBUWVBFX05FVEFERFI6CiAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgIHJldHVybiBBU05fSVBBRERSRVNTOwoKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICByZXR1cm4gQVNOX0lOVEVHRVI7CgogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIEFTTl9DT1VOVEVSOwoKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICByZXR1cm4gQVNOX0dBVUdFOwoKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgcmV0dXJuIEFTTl9USU1FVElDS1M7CgogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICByZXR1cm4gQVNOX09QQVFVRTsKCiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICByZXR1cm4gQVNOX05VTEw7CgogICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICByZXR1cm4gQVNOX0NPVU5URVI2NDsKCiAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgIHJldHVybiBBU05fQklUX1NUUjsKCiAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICByZXR1cm4gQVNOX1VOU0lHTkVEOwoKICAgIGNhc2UgVFlQRV9OU0FQQUREUkVTUzoKICAgICAgICByZXR1cm4gQVNOX05TQVA7CgogICAgfQogICAgcmV0dXJuIC0xOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9UT19BU05fVFlQRSAqLwoKLyoqCiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGl0cyBPSUQgZm9ybS4KICogaW4gZXhhbXBsZSAgImhlbGxvIiA9IDUgLiAnaCcgLiAnZScgLiAnbCcgLiAnbCcgLiAnbycKICoKICogQHBhcmFtIFMgICBUaGUgc3RyaW5nLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NUUklOR19DT05WRVJTSU9OUwppbnQKbmV0c25tcF9zdHIyb2lkKGNvbnN0IGNoYXIgKlMsIG9pZCAqIE8sIGludCBMKQp7CiAgICBjb25zdCBjaGFyICAgICAqYyA9IFM7CiAgICBvaWQgICAgICAgICAgICAqbyA9ICZPWzFdOwoKICAgIC0tTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWF2ZSByb29tIGZvciBsZW5ndGggcHJlZml4ICovCgogICAgZm9yICg7ICpjICYmIEw7IC0tTCwgKytvLCArK2MpCiAgICAgICAgKm8gPSAqYzsKCiAgICAvKgogICAgICogbWFrZSBzdXJlIHdlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgCiAgICAgKi8KICAgIGlmICgqYyAhPSAwKQogICAgICAgIHJldHVybiAxOwoKICAgIC8qCiAgICAgKiBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2lkIAogICAgICovCiAgICAqTyA9IGMgLSBTOwoKICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBjaGFyYWN0ZXIgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuIDEgLiAyIC4gMyAuIDQgLiA1ID0gMTIzNDUKICoKICogQHBhcmFtIEMgICBUaGUgY2hhcmFjdGVyIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIuCiAqIEBwYXJhbSBPICAgVGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfb2lkMmNoYXJzKGNoYXIgKkMsIGludCBMLCBjb25zdCBvaWQgKiBPKQp7CiAgICBjaGFyICAgICAgICAgICAqYyA9IEM7CiAgICBjb25zdCBvaWQgICAgICAqbyA9ICZPWzFdOwoKICAgIGlmIChMIDwgKGludCkqTykKICAgICAgICByZXR1cm4gMTsKCiAgICBMID0gKk87IC8qKiBsZW5ndGggKi8KICAgIGZvciAoOyBMOyAtLUwsICsrbywgKytjKSB7CiAgICAgICAgaWYgKCpvID4gMHhGRikKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgKmMgPSAoY2hhcikqbzsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioKICogQ29udmVydHMgYW4gT0lEIHRvIGl0cyBzdHJpbmcgZm9ybS4KICogaW4gZXhhbXBsZSAgNSAuICdoJyAuICdlJyAuICdsJyAuICdsJyAuICdvJyA9ICJoZWxsb1wwIiAobnVsbCB0ZXJtaW5hdGVkKQogKgogKiBAcGFyYW0gUyAgIFRoZSBjaGFyYWN0ZXIgc3RyaW5nIGJ1ZmZlci4KICogQHBhcmFtIEwgICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYnVmZmVyLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX29pZDJzdHIoY2hhciAqUywgaW50IEwsIG9pZCAqIE8pCnsKICAgIGludCAgICAgICAgICAgIHJjOwoKICAgIGlmIChMIDw9IChpbnQpKk8pCiAgICAgICAgcmV0dXJuIDE7CgogICAgcmMgPSBuZXRzbm1wX29pZDJjaGFycyhTLCBMLCBPKTsKICAgIGlmIChyYykKICAgICAgICByZXR1cm4gMTsKCiAgICBTWyAqTyBdID0gMDsKCiAgICByZXR1cm4gMDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9NSUJfU1RSSU5HX0NPTlZFUlNJT05TICovCgoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX01JQl9TTlBSSU5UCmludApzbnByaW50X2J5X3R5cGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19ieV90eXBlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9oZXhzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9hc2NpaXN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vY3RldF9zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb3BhcXVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb3BhcXVlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29iamVjdF9pZGVudGlmaWVyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfdGltZXRpY2tzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2hpbnRlZF9pbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFsLCAnZCcsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2ludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2ludGVnZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X3VpbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfZ2F1Z2UoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZ2F1Z2UoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9jb3VudGVyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19jb3VudGVyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9uZXR3b3JrYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2lwYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2lwYWRkcmVzcygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9udWxsKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19udWxsKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9iaXRzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbnNhcGFkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3MKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfY291bnRlcjY0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2JhZHR5cGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2JhZHR5cGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKaW50CnNucHJpbnRfZmxvYXQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZmxvYXQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9kb3VibGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19kb3VibGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQojZW5kaWYKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTUlCX1NOUFJJTlQgKi8KLyoqIEB9ICovCgo=