LyogQ29weXJpZ2h0IChjKSAyMDA1IENyeXN0YWxDbGVhciBTb2Z0d2FyZSwgSW5jLgogKiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlCiAqIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogKiBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqIEF1dGhvcjogSmVmZiBHYXJsYW5kLCBCYXJ0IEdhcnN0CiAqICREYXRlOiAyMDA5LTA2LTA0IDA0OjI0OjQ5IC0wNDAwIChUaHUsIDA0IEp1biAyMDA5KSAkCiAqLwoKI2luY2x1ZGUgImJvb3N0L2RhdGVfdGltZS9ncmVnb3JpYW4vZ3JlZ29yaWFuLmhwcCIKI2luY2x1ZGUgIi4uL3Rlc3Rmcm13ay5ocHAiCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CgojaWZuZGVmIFVTRV9EQVRFX1RJTUVfUFJFXzFfMzNfRkFDRVRfSU8KLy8gZm9yIHRlc3RzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGZhaWwgYW5kIHRocm93IGV4Y2VwdGlvbnMKdGVtcGxhdGU8Y2xhc3MgdGVtcG9yYWxfdHlwZSwgY2xhc3MgZXhjZXB0aW9uX3R5cGU+CmJvb2wgZmFpbHVyZV90ZXN0KHRlbXBvcmFsX3R5cGUgY29tcG9uZW50LAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl90eXBlIGNvbnN0JiAvKmV4Y2VwdCovLAogICAgICAgICAgICAgICAgICBib29zdDo6Z3JlZ29yaWFuOjpkYXRlX2lucHV0X2ZhY2V0KiBmYWNldCkKewogIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6Z3JlZ29yaWFuOwogIGJvb2wgcmVzdWx0ID0gZmFsc2U7CiAgc3RkOjppc3RyaW5nc3RyZWFtIGlzcyhpbnB1dCk7CiAgaXNzLmV4Y2VwdGlvbnMoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7IC8vIHR1cm4gb24gZXhjZXB0aW9ucwogIGlzcy5pbWJ1ZShzdGQ6OmxvY2FsZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpLCBmYWNldCkpOwogIHRyeSB7CiAgICBpc3MgPj4gY29tcG9uZW50OwogIH0KICBjYXRjaChleGNlcHRpb25fdHlwZSYgZSkgewogICAgc3RkOjpjb3V0IDw8ICJFeHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0OiBcIiIgCiAgICAgICAgICAgICAgPDwgZS53aGF0KCkgPDwgIlwiIiA8PCBzdGQ6OmVuZGw7CiAgICByZXN1bHQgPSBpc3MuZmFpbCgpOyAvLyBmYWlsYml0IG11c3QgYmUgc2V0IHRvIHBhc3MgdGVzdAogIH0KICBjYXRjaCguLi4pIHsKICAgIHJlc3VsdCA9IGZhbHNlOwogIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8gZm9yIHRlc3RzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcXVpZXRseQp0ZW1wbGF0ZTxjbGFzcyB0ZW1wb3JhbF90eXBlPgpib29sIGZhaWx1cmVfdGVzdCh0ZW1wb3JhbF90eXBlIGNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0LAogICAgICAgICAgICAgICAgICBib29zdDo6Z3JlZ29yaWFuOjpkYXRlX2lucHV0X2ZhY2V0KiBmYWNldCkKewogIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6Z3JlZ29yaWFuOwogIHN0ZDo6aXN0cmluZ3N0cmVhbSBpc3MoaW5wdXQpOwogIC8qIGxlYXZlIGV4Y2VwdGlvbnMgdHVybmVkIG9mZgogICAqIGlzcy5leGNlcHRpb25zKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOyAqLwogIGlzcy5pbWJ1ZShzdGQ6OmxvY2FsZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpLCBmYWNldCkpOwogIHRyeSB7CiAgICBpc3MgPj4gY29tcG9uZW50OwogIH0KICBjYXRjaCguLi4pIHsKICAgIHN0ZDo6Y291dCA8PCAiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICByZXR1cm4gaXNzLmZhaWwoKTsgLy8gZmFpbGJpdCBtdXN0IGJlIHNldCB0byBwYXNzIHRlc3QKfQoKI2VuZGlmCgoKCmludCBtYWluKCl7CiNpZm5kZWYgIFVTRV9EQVRFX1RJTUVfUFJFXzFfMzNfRkFDRVRfSU8KICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmdyZWdvcmlhbjsKCiAgewogICAgLy8gdmVyaWZ5IG5vIGV4dHJhIGNoYXJhY3RlciBhcmUgY29uc3VtZWQKICAgIGdyZWdfbW9udGggbSgxKTsKICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKCJNYXIuIik7CiAgICBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4gc2l0cihzcyksIHN0cl9lbmQ7CgogICAgZGF0ZV9pbnB1dF9mYWNldCogZiA9IG5ldyBkYXRlX2lucHV0X2ZhY2V0KCk7CiAgICBmLT5nZXQoc2l0ciwgc3RyX2VuZCwgc3MsIG0pOwogICAgY2hlY2soIk5vIGV4dHJhIGNoYXJhY3RlcnMgY29uc3VtZWQiLCBtID0gZ3JlZ19tb250aChNYXIpICYmICpzaXRyID09ICcuJyk7CiAgfQogCiAgLy8gc2V0IHVwIGluaXRpYWwgb2JqZWN0cwogIGRhdGUgZChub3RfYV9kYXRlX3RpbWUpOwogIGRheXMgZGQobm90X2FfZGF0ZV90aW1lKTsKICBncmVnX21vbnRoIG0oMSk7CiAgZ3JlZ193ZWVrZGF5IGd3KDApOwogIGdyZWdfZGF5IGdkKDEpOwogIGdyZWdfeWVhciBneSgyMDAwKTsKICAvLyBleGNlcHRpb25zIGZvciBmYWlsdXJlX3Rlc3RzCiAgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSBlX2ZhaWx1cmUoImRlZmF1bHQiKTsKICBiYWRfbW9udGggZV9iYWRfbW9udGg7CiAgYmFkX3llYXIgZV9iYWRfeWVhcjsKICBiYWRfZGF5X29mX21vbnRoIGVfYmFkX2RheV9vZl9tb250aDsKICBiYWRfd2Vla2RheSBlX2JhZF93ZWVrZGF5OwogIGJhZF9kYXlfb2ZfeWVhciBlX2JhZF9kYXlfb2ZfeWVhcjsKCiAgLy8gZGVmYXVsdCBmb3JtYXQgdGVzdHM6IGRhdGUsIGRheXMsIG1vbnRoLCB3ZWVrZGF5LCBkYXksIHllYXIKICBzdGQ6OmlzdHJpbmdzdHJlYW0gaXNzKCIyMDA1LUphbi0xNSAyMSBGZWIgVHVlIDQgMjAwMiIpOwogIGlzcyA+PiBkOwogIGNoZWNrX2VxdWFsKCJEZWZhdWx0IGZvcm1hdCBkYXRlIiwgZCwgZGF0ZSgyMDA1LEphbiwxNSkpOwogIGlzcyA+PiBkZDsKICBjaGVja19lcXVhbCgiRGVmYXVsdCAob25seSkgZm9ybWF0IHBvc2l0aXZlIGRheXMiLCBkZCwgZGF5cygyMSkpOwogIGlzcyA+PiBtOwogIGNoZWNrX2VxdWFsKCJEZWZhdWx0IGZvcm1hdCBtb250aCIsIG0sIGdyZWdfbW9udGgoMikpOwogIGlzcyA+PiBndzsKICBjaGVja19lcXVhbCgiRGVmYXVsdCBmb3JtYXQgd2Vla2RheSIsIGd3LCBncmVnX3dlZWtkYXkoMikpOwogIGlzcyA+PiBnZDsKICBjaGVja19lcXVhbCgiRGVmYXVsdCAob25seSkgZm9ybWF0IGRheSBvZiBtb250aCIsIGdkLCBncmVnX2RheSg0KSk7CiAgaXNzID4+IGd5OwogIGNoZWNrX2VxdWFsKCJEZWZhdWx0IGZvcm1hdCB5ZWFyIiwgZ3ksIGdyZWdfeWVhcigyMDAyKSk7CiAgLy8gZmFpbHVyZSB0ZXN0cwogIGNoZWNrKCJJbnB1dCBNaXNzcGVsbGVkIGluIHllYXIgKGRhdGUpIHcvZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwNS1KYW4tMTUiLCBlX2JhZF95ZWFyLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIklucHV0IE1pc3NwZWxsZWQgaW4geWVhciAoZGF0ZSkgbm8tZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwNS1KYW4tMTUiLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIklucHV0IE1pc3NwZWxsZWQgaW4gbW9udGggKGRhdGUpIHcvZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwMDUtSnNuLTE1IiwgZV9iYWRfbW9udGgsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5wdXQgTWlzc3BlbGxlZCBpbiBtb250aCAoZGF0ZSkgbm8tZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwMDUtSnNuLTE1IiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwogIGNoZWNrKCJJbnB1dCBNaXNzcGVsbGVkIGluIGRheSAoZGF0ZSkgdy9leGNlcHRpb25zIiwgCiAgICAgIGZhaWx1cmVfdGVzdChkLCAiMjAwNS1KYW4tNTEiLCBlX2JhZF9kYXlfb2ZfbW9udGgsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5wdXQgTWlzc3BlbGxlZCBpbiBkYXkgKGRhdGUpIG5vLWV4Y2VwdGlvbnMiLCAKICAgICAgZmFpbHVyZV90ZXN0KGQsICIyMDA1LUphbi01MSIsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5wdXQgTWlzc3BlbGxlZCBncmVnX3dlZWtkYXkgdy9leGNlcHRpb25zIiwgCiAgICAgIGZhaWx1cmVfdGVzdChndywgIlNhbiIsIGVfYmFkX3dlZWtkYXksIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5wdXQgTWlzc3BlbGxlZCBncmVnX3dlZWtkYXkgbm8tZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZ3csICJTYW4iLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIklucHV0IE1pc3NwZWxsZWQgbW9udGggdy9leGNlcHRpb25zIiwgCiAgICAgIGZhaWx1cmVfdGVzdChtLCAiSnNuIiwgZV9iYWRfbW9udGgsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5wdXQgTWlzc3BlbGxlZCBtb250aCBuby1leGNlcHRpb25zIiwgCiAgICAgIGZhaWx1cmVfdGVzdChtLCAiSnNuIiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwogIGNoZWNrKCJCYWQgSW5wdXQgZ3JlZ19kYXkgdy9leGNlcHRpb25zIiwgCiAgICAgIGZhaWx1cmVfdGVzdChnZCwgIlN1biIsIGVfYmFkX2RheV9vZl9tb250aCwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwogIGNoZWNrKCJCYWQgSW5wdXQgZ3JlZ19kYXkgbm8tZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZ2QsICJTdW4iLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIklucHV0IE1pc3NwZWxsZWQgZ3JlZ195ZWFyIHcvZXhjZXB0aW9ucyIsIAogICAgICBmYWlsdXJlX3Rlc3QoZ3ksICIyMDUiLCBlX2JhZF95ZWFyLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIklucHV0IE1pc3NwZWxsZWQgZ3JlZ195ZWFyIG5vLWV4Y2VwdGlvbnMiLCAKICAgICAgZmFpbHVyZV90ZXN0KGd5LCAiMjA1IiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwoKICAvLyBjaGFuZ2UgdG8gZnVsbCBsZW5ndGggbmFtZXMsIGlzbyBkYXRlIGZvcm1hdCwgYW5kIDIgZGlnaXQgeWVhcgogIGRhdGVfaW5wdXRfZmFjZXQqIGZhY2V0ID0gbmV3IGRhdGVfaW5wdXRfZmFjZXQoKTsKICBmYWNldC0+c2V0X2lzb19mb3JtYXQoKTsKICBmYWNldC0+bW9udGhfZm9ybWF0KCIlQiIpOwogIGZhY2V0LT53ZWVrZGF5X2Zvcm1hdCgiJUEiKTsKICBmYWNldC0+eWVhcl9mb3JtYXQoIiV5Iik7CiAgaXNzLnN0cigiMjAwNTAxMTUgLTU1IEZlYnJ1YXJ5IFR1ZXNkYXkgMDIiKTsKICBpc3MuaW1idWUoc3RkOjpsb2NhbGUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSwgZmFjZXQpKTsKCiAgaXNzID4+IGQ7CiAgY2hlY2tfZXF1YWwoIklTTyBmb3JtYXQgZGF0ZSIsIGQsIGRhdGUoMjAwNSxKYW4sMTUpKTsKICBpc3MgPj4gZGQ7CiAgY2hlY2tfZXF1YWwoIkRlZmF1bHQgKG9ubHkpIGZvcm1hdCBuZWdhdGl2ZSBkYXlzIiwgZGQsIGRheXMoLTU1KSk7CiAgaXNzID4+IG07CiAgY2hlY2tfZXF1YWwoIkZ1bGwgZm9ybWF0IG1vbnRoIiwgbSwgZ3JlZ19tb250aCgyKSk7CiAgaXNzID4+IGd3OwogIGNoZWNrX2VxdWFsKCJGdWxsIGZvcm1hdCB3ZWVrZGF5IiwgZ3csIGdyZWdfd2Vla2RheSgyKSk7CiAgaXNzID4+IGd5OwogIGNoZWNrX2VxdWFsKCIyIGRpZ2l0IGZvcm1hdCB5ZWFyIiwgZ3ksIGdyZWdfeWVhcigyMDAyKSk7CgogIGRhdGVfaW5wdXRfZmFjZXQqIGYxID0gbmV3IGRhdGVfaW5wdXRfZmFjZXQoKTsKICBkYXRlX2lucHV0X2ZhY2V0KiBmMiA9IG5ldyBkYXRlX2lucHV0X2ZhY2V0KCk7CiAgZjEtPnNldF9pc29fZm9ybWF0KCk7CiAgZjItPnNldF9pc29fZm9ybWF0KCk7CiAgY2hlY2soIk1pc3NpbmcgZGlnaXQocykgaW4gSVNPIHN0cmluZyIsIGZhaWx1cmVfdGVzdChkLCIyMDA1MDcxIiwgZjEpKTsKICBjaGVjaygiTWlzc2luZyBkaWdpdChzKSBpbiBJU08gc3RyaW5nIiwgCiAgICAgICAgZmFpbHVyZV90ZXN0KGQsIjIwMDUwNzEiLCBlX2JhZF9kYXlfb2ZfbW9udGgsIGYyKSk7CgogIHsgLy8gbGl0ZXJhbCAlIGluIGZvcm1hdCB0ZXN0cwogICAgZGF0ZSBkKG5vdF9hX2RhdGVfdGltZSk7CiAgICBncmVnX21vbnRoIG0oMSk7CiAgICBncmVnX3dlZWtkYXkgZ3coMCk7CiAgICBncmVnX3llYXIgeSgxNDAwKTsKICAgIGRhdGVfaW5wdXRfZmFjZXQqIGYgPSBuZXcgZGF0ZV9pbnB1dF9mYWNldCgiJSVkICVZLSViLSVkIik7CiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgIHNzLmltYnVlKHN0ZDo6bG9jYWxlKHNzLmdldGxvYygpLCBmKSk7CgogICAgc3Muc3RyKCIlZCAyMDA1LUp1bi0xNCIpOwogICAgc3MgPj4gZDsKICAgIGNoZWNrX2VxdWFsKCJMaXRlcmFsICclJyBpbiBkYXRlIGZvcm1hdCIsIGQsIGRhdGUoMjAwNSxKdW4sMTQpKTsKICAgIGYtPmZvcm1hdCgiJSUlZCAlWS0lYi0lZCIpOwogICAgc3Muc3RyKCIlMTQgMjAwNS1KdW4tMTQiKTsKICAgIHNzID4+IGQ7CiAgICBjaGVja19lcXVhbCgiTXVsdGlwbGUgbGl0ZXJhbCAnJSdzIGluIGRhdGUgZm9ybWF0IiwgZCwgZGF0ZSgyMDA1LEp1biwxNCkpOwoKICAgIGYtPm1vbnRoX2Zvcm1hdCgiJSViICViIik7CiAgICBzcy5zdHIoIiViIEp1biIpOwogICAgc3MgPj4gbTsKICAgIGNoZWNrX2VxdWFsKCJMaXRlcmFsICclJyBpbiBtb250aCBmb3JtYXQiLCBtLCBncmVnX21vbnRoKDYpKTsKICAgIGYtPm1vbnRoX2Zvcm1hdCgiJSUlYiIpOwogICAgc3Muc3RyKCIlSnVuIik7CiAgICBzcyA+PiBtOwogICAgY2hlY2tfZXF1YWwoIk11bHRpcGxlIGxpdGVyYWwgJyUncyBpbiBtb250aCBmb3JtYXQiLCBtLCBncmVnX21vbnRoKDYpKTsKCiAgICBmLT53ZWVrZGF5X2Zvcm1hdCgiJSVhICVhIik7CiAgICBzcy5zdHIoIiVhIFR1ZSIpOwogICAgc3MgPj4gZ3c7CiAgICBjaGVja19lcXVhbCgiTGl0ZXJhbCAnJScgaW4gd2Vla2RheSBmb3JtYXQiLCBndywgZ3JlZ193ZWVrZGF5KDIpKTsKICAgIGYtPndlZWtkYXlfZm9ybWF0KCIlJSVhIik7CiAgICBzcy5zdHIoIiVUdWUiKTsKICAgIHNzID4+IGd3OwogICAgY2hlY2tfZXF1YWwoIk11bHRpcGxlIGxpdGVyYWwgJyUncyBpbiB3ZWVrZGF5IGZvcm1hdCIsIGd3LCBncmVnX3dlZWtkYXkoMikpOwoKICAgIGYtPnllYXJfZm9ybWF0KCIlJVkgJVkiKTsKICAgIHNzLnN0cigiJVkgMjAwNSIpOwogICAgc3MgPj4geTsKICAgIGNoZWNrX2VxdWFsKCJMaXRlcmFsICclJyBpbiB5ZWFyIGZvcm1hdCIsIHksIGdyZWdfeWVhcigyMDA1KSk7CiAgICBmLT55ZWFyX2Zvcm1hdCgiJSUlWSIpOwogICAgc3Muc3RyKCIlMjAwNSIpOwogICAgc3MgPj4geTsKICAgIGNoZWNrX2VxdWFsKCJNdWx0aXBsZSBsaXRlcmFsICclJ3MgaW4geWVhciBmb3JtYXQiLCB5LCBncmVnX3llYXIoMjAwNSkpOwogIH0KCiAgLy8gQWxsIGRheXMsIG1vbnRoLCB3ZWVrZGF5LCBkYXksIGFuZCB5ZWFyIGZvcm1hdHMgaGF2ZSBiZWVuIHRlc3RlZAogIC8vIGJlZ2luIHRlc3Rpbmcgb3RoZXIgZGF0ZSBmb3JtYXRzCiAgZmFjZXQtPnNldF9pc29fZXh0ZW5kZWRfZm9ybWF0KCk7CiAgaXNzLnN0cigiMjAwNS0wMS0xNSIpOwogIGlzcyA+PiBkOwogIGNoZWNrX2VxdWFsKCJJU08gRXh0ZW5kZWQgZm9ybWF0IGRhdGUiLCBkLCBkYXRlKDIwMDUsSmFuLDE1KSk7CgogIGZhY2V0LT5mb3JtYXQoIiVCICVkLCAlWSIpOwogIGlzcy5zdHIoIk1hcmNoIDE1LCAyMDA2Iik7CiAgaXNzID4+IGQ7CiAgY2hlY2tfZXF1YWwoIkN1c3RvbSBkYXRlIGZvcm1hdDogXCIlQiAlZCwgJVlcIiA9PiAnTWFyY2ggMTUsIDIwMDYnIiwKICAgICAgZCwgZGF0ZSgyMDA2LE1hciwxNSkpOwoKICBmYWNldC0+Zm9ybWF0KCIlWS0laiIpOyAvLyBPcmRpbmFsIGZvcm1hdCBJU084NjAxKDIwMDAgc2VjdCA1LjIuMi4xIGV4dGVuZGVkKQogIGlzcy5zdHIoIjIwMDYtMDc0Iik7CiAgaXNzID4+IGQ7CiAgY2hlY2tfZXF1YWwoIkN1c3RvbSBkYXRlIGZvcm1hdDogXCIlWS0lalwiID0+ICcyMDA2LTA3NCciLAogICAgICBkLCBkYXRlKDIwMDYsTWFyLDE1KSk7CiAgY2hlY2soIkJhZCBpbnB1dCBDdXN0b20gZGF0ZSBmb3JtYXQ6IFwiJVktJWpcIiA9PiAnMjAwNi03NCcgKHcvZXhjZXB0aW9ucykiLAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwMDYtNzQiLCBlX2JhZF9kYXlfb2ZfeWVhciwgZmFjZXQpKTsKICBjaGVjaygiQmFkIGlucHV0IEN1c3RvbSBkYXRlIGZvcm1hdDogXCIlWS0lalwiID0+ICcyMDA2LTc0JyAobm8gZXhjZXB0aW9ucykiLAogICAgICBmYWlsdXJlX3Rlc3QoZCwgIjIwMDYtNzQiLCBmYWNldCkpOwoKICAvLyBkYXRlX3BlcmlvZCB0ZXN0cwoKICAvLyBBIGRhdGVfcGVyaW9kIGlzIGNvbnN0cnVjdGVkIHdpdGggYW4gb3BlbiByYW5nZS4gU28gdGhlIHBlcmlvZHMKICAvLyBbMjAwMC0wNy0tMDQvMjAwMC0wNy0yNSkgPC0tIG9wZW4gcmFuZ2UKICAvLyBBbmQKICAvLyBbMjAwMC0wNy0tMDQvMjAwMC0wNy0yNF0gPC0tIGNsb3NlZCByYW5nZQogIC8vIEFyZSBlcXVhbAogIGRhdGUgYmVnaW4oMjAwMiwgSnVsLCA0KTsKICBkYXlzIGxlbigyMSk7CiAgZGF0ZV9wZXJpb2QgZHAoZGF0ZSgyMDAwLEphbiwxKSwgZGF5cygxKSk7CiAgaXNzLnN0cigiWzIwMDItMDctMDQvMjAwMi0wNy0yNF0iKTsKICBmYWNldC0+c2V0X2lzb19leHRlbmRlZF9mb3JtYXQoKTsKICBpc3MgPj4gZHA7CiAgY2hlY2tfZXF1YWwoIkRlZmF1bHQgcGVyaW9kIChjbG9zZWQgcmFuZ2UpIiwgZHAsIGRhdGVfcGVyaW9kKGJlZ2luLGxlbikpOwogIHsKICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgZGF0ZSBkKG5vdF9hX2RhdGVfdGltZSk7CiAgICBkYXRlIGQyID0gZGF5X2Nsb2NrOjpsb2NhbF9kYXkoKTsKICAgIGRhdGUgZDMobmVnX2luZmluKTsKICAgIGRhdGUgZDQocG9zX2luZmluKTsKICAgIGRhdGVfcGVyaW9kIGRwKGQyLCBkKTsgLy8gZGF0ZS9uYWR0CiAgICBkYXRlX3BlcmlvZCBkcDIoZCwgZCk7IC8vIG5hZHQvbmFkdAogICAgZGF0ZV9wZXJpb2QgZHAzKGQzLCBkNCk7CiAgICBzcyA8PCBkcDsKICAgIHNzID4+IGRwMjsKICAgIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcyBwZXJpb2QgKHJldmVyc2liaWxpdHkgdGVzdCkiLCBkcCwgZHAyKTsKICAgIHNzLnN0cigiWy1pbmZpbml0eS8raW5maW5pdHldIik7CiAgICBzcyA+PiBkcDI7CiAgICBjaGVja19lcXVhbCgiU3BlY2lhbCB2YWx1ZXMgcGVyaW9kIChpbmZpbml0aWVzKSIsIGRwMywgZHAyKTsKICB9CgoKICAvLyBvcGVuIHJhbmdlCiAgcGVyaW9kX3BhcnNlciBwcChwZXJpb2RfcGFyc2VyOjpBU19PUEVOX1JBTkdFKTsKICBpc3Muc3RyKCJbMjAwMi0wNy0wNC8yMDAyLTA3LTI1KSIpOwogIGZhY2V0LT5wZXJpb2RfcGFyc2VyKHBwKTsKICBpc3MgPj4gZHA7CiAgY2hlY2tfZXF1YWwoIk9wZW4gcmFuZ2UgcGVyaW9kIiwgZHAsIGRhdGVfcGVyaW9kKGJlZ2luLGxlbikpOwogIC8vIGN1c3RvbSBwZXJpb2QgZGVsaW1pdGVycwogIHBwLmRlbGltaXRlcl9zdHJpbmdzKCIgdG8gIiwgImZyb20gIiwgIiBleGNsdXNpdmUiLCAiIGluY2x1c2l2ZSIpOwogIGlzcy5zdHIoImZyb20gMjAwMi0wNy0wNCB0byAyMDAyLTA3LTI1IGV4Y2x1c2l2ZSIpOwogIGZhY2V0LT5wZXJpb2RfcGFyc2VyKHBwKTsKICBpc3MgPj4gZHA7CiAgY2hlY2tfZXF1YWwoIk9wZW4gcmFuZ2UgcGVyaW9kIC0gY3VzdG9tIGRlbGltaXRlcnMiLCBkcCwgZGF0ZV9wZXJpb2QoYmVnaW4sbGVuKSk7CiAgcHAucmFuZ2Vfb3B0aW9uKHBlcmlvZF9wYXJzZXI6OkFTX0NMT1NFRF9SQU5HRSk7CiAgaXNzLnN0cigiZnJvbSAyMDAyLTA3LTA0IHRvIDIwMDItMDctMjQgaW5jbHVzaXZlIik7CiAgZmFjZXQtPnBlcmlvZF9wYXJzZXIocHApOwogIGlzcyA+PiBkcDsKICBjaGVja19lcXVhbCgiQ2xvc2VkIHJhbmdlIHBlcmlvZCAtIGN1c3RvbSBkZWxpbWl0ZXJzIiwgZHAsIGRhdGVfcGVyaW9kKGJlZ2luLGxlbikpOwoKCiAgLy8gZGF0ZV9nZW5lcmF0b3IgdGVzdHMKCiAgLy8gZGF0ZV9nZW5lcmF0b3JzIHVzZSBmb3JtYXRzIGNvbnRhaW5lZCBpbiB0aGUgCiAgLy8gZGF0ZV9pbnB1dF9mYWNldCBmb3Igd2Vla2RheXMgYW5kIG1vbnRocwogIC8vIHJlc2V0IG1vbnRoICYgd2Vla2RheSBmb3JtYXRzIHRvIGRlZmF1bHRzCiAgZmFjZXQtPm1vbnRoX2Zvcm1hdCgiJWIiKTsKICBmYWNldC0+d2Vla2RheV9mb3JtYXQoIiVhIik7CgogIHBhcnRpYWxfZGF0ZSBwZCgxLEphbik7CiAgbnRoX2tkYXlfb2ZfbW9udGggbmtkKG50aF9rZGF5X29mX21vbnRoOjpmaXJzdCwgU3VuZGF5LCBKYW4pOwogIGZpcnN0X2tkYXlfb2ZfbW9udGggZmtkKFN1bmRheSwgSmFuKTsKICBsYXN0X2tkYXlfb2ZfbW9udGggbGtkKFN1bmRheSwgSmFuKTsKICBmaXJzdF9rZGF5X2JlZm9yZSBma2IoU3VuZGF5KTsKICBmaXJzdF9rZGF5X2FmdGVyIGZrYShTdW5kYXkpOwogIC8vIHVzaW5nIGRlZmF1bHQgZGF0ZV9nZW5lcmF0b3JfcGFyc2VyICJudGhfc3RyaW5ncyIKICBpc3Muc3RyKCIyOSBGZWIiKTsKICBpc3MgPj4gcGQ7CiAgLy8gRmViLTI5IGlzIGEgdmFsaWQgZGF0ZV9nZW5lcmF0b3IsIGdldF9kYXRlKCkgd2lsbCBmYWlsIGluIGEgbm9uLWxlYXAgeWVhcgogIGNoZWNrX2VxdWFsKCJEZWZhdWx0IHN0cmluZ3MsIHBhcnRpYWxfZGF0ZSIsCiAgICAgIHBkLmdldF9kYXRlKDIwMDQpLCBkYXRlKDIwMDQsRmViLDI5KSk7CiAgaXNzLnN0cigic2Vjb25kIE1vbiBvZiBNYXIiKTsKICBpc3MgPj4gbmtkOyAKICBjaGVja19lcXVhbCgiRGVmYXVsdCBzdHJpbmdzLCBudGhfZGF5X29mX3RoZV93ZWVrX2luX21vbnRoIiwKICAgICAgbmtkLmdldF9kYXRlKDIwMDQpLCBkYXRlKDIwMDQsTWFyLDgpKTsKICBpc3Muc3RyKCJmaXJzdCBUdWUgb2YgQXByIik7CiAgaXNzID4+IGZrZDsKICBjaGVja19lcXVhbCgiRGVmYXVsdCBzdHJpbmdzLCBmaXJzdF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICBma2QuZ2V0X2RhdGUoMjAwNCksIGRhdGUoMjAwNCxBcHIsNikpOwogIGlzcy5zdHIoImxhc3QgV2VkIG9mIE1heSIpOwogIGlzcyA+PiBsa2Q7CiAgY2hlY2tfZXF1YWwoIkRlZmF1bHQgc3RyaW5ncywgbGFzdF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICBsa2QuZ2V0X2RhdGUoMjAwNCksIGRhdGUoMjAwNCxNYXksMjYpKTsKICBpc3Muc3RyKCJUaHUgYmVmb3JlIik7CiAgaXNzID4+IGZrYjsKICBjaGVja19lcXVhbCgiRGVmYXVsdCBzdHJpbmdzLCBmaXJzdF9kYXlfb2ZfdGhlX3dlZWtfYmVmb3JlIiwKICAgICAgZmtiLmdldF9kYXRlKGRhdGUoMjAwNCxGZWIsOCkpLCBkYXRlKDIwMDQsRmViLDUpKTsKICBpc3Muc3RyKCJGcmkgYWZ0ZXIiKTsKICBpc3MgPj4gZmthOwogIGNoZWNrX2VxdWFsKCJEZWZhdWx0IHN0cmluZ3MsIGZpcnN0X2RheV9vZl90aGVfd2Vla19hZnRlciIsCiAgICAgIGZrYS5nZXRfZGF0ZShkYXRlKDIwMDQsRmViLDEpKSwgZGF0ZSgyMDA0LEZlYiw2KSk7CiAgLy8gZmFpbHVyZSB0ZXN0cwogIGNoZWNrKCJJbmNvcnJlY3QgZWxlbWVudHMgKGRhdGVfZ2VuZXJhdG9yKSB3L2V4Y2VwdGlvbnMiLCAvLyBhZnRlci9iZWZvcmUgdHlwZSBtaXh1cAogICAgICBmYWlsdXJlX3Rlc3QoZmtiLCAiRnJpIGFmdGVyIiwgZV9mYWlsdXJlLCBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpKSk7CiAgY2hlY2soIkluY29ycmVjdCBlbGVtZW50cyAoZGF0ZV9nZW5lcmF0b3IpIG5vIGV4Y2VwdGlvbnMiLCAvLyBhZnRlci9iZWZvcmUgdHlwZSBtaXh1cAogICAgICBmYWlsdXJlX3Rlc3QoZmtiLCAiRnJpIGFmdGVyIiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwogIGNoZWNrKCJJbmNvcnJlY3QgZWxlbWVudHMgKGRhdGVfZ2VuZXJhdG9yKSB3L2V4Y2VwdGlvbnMiLCAvLyBmaXJzdC9sYXN0IHR5cGUgbWl4dXAKICAgICAgZmFpbHVyZV90ZXN0KGxrZCwgImZpcnN0IFR1ZSBvZiBBcHIiLCBlX2ZhaWx1cmUsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5jb3JyZWN0IGVsZW1lbnRzIChkYXRlX2dlbmVyYXRvcikgbm8gZXhjZXB0aW9ucyIsIC8vIGZpcnN0L2xhc3QgdHlwZSBtaXh1cAogICAgICBmYWlsdXJlX3Rlc3QobGtkLCAiZmlyc3QgVHVlIG9mIEFwciIsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5jb3JyZWN0IGVsZW1lbnRzIChkYXRlX2dlbmVyYXRvcikgdy9leGNlcHRpb25zIiwgLy8gJ2luJyBpcyB3cm9uZwogICAgICBmYWlsdXJlX3Rlc3QobmtkLCAic2Vjb25kIE1vbiBpbiBNYXIiLCBlX2ZhaWx1cmUsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiSW5jb3JyZWN0IGVsZW1lbnRzIChkYXRlX2dlbmVyYXRvcikgbm8gZXhjZXB0aW9ucyIsIC8vICdpbicgaXMgd3JvbmcKICAgICAgZmFpbHVyZV90ZXN0KG5rZCwgInNlY29uZCBNb24gaW4gTWFyIiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwoKICAvLyBkYXRlX2dlbmVyYXRvcnMgLSBjdXN0b20gZWxlbWVudCBzdHJpbmdzCiAgZmFjZXQtPmRhdGVfZ2VuX2VsZW1lbnRfc3RyaW5ncygiMXN0IiwiMm5kIiwiM3JkIiwiNHRoIiwiNXRoIiwiZmluYWwiLCJwcmlvciB0byIsInBhc3QiLCJpbiIpOwogIGlzcy5zdHIoIjNyZCBTYXQgaW4gSnVsIik7CiAgaXNzID4+IG5rZDsKICBjaGVja19lcXVhbCgiQ3VzdG9tIHN0cmluZ3MsIG50aF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICBua2QuZ2V0X2RhdGUoMjAwNCksIGRhdGUoMjAwNCxKdWwsMTcpKTsKICBpc3Muc3RyKCIxc3QgV2VkIGluIE1heSIpOwogIGlzcyA+PiBma2Q7CiAgY2hlY2tfZXF1YWwoIkN1c3RvbSBzdHJpbmdzLCBmaXJzdF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICBma2QuZ2V0X2RhdGUoMjAwNCksIGRhdGUoMjAwNCxNYXksNSkpOwogIGlzcy5zdHIoImZpbmFsIFR1ZSBpbiBBcHIiKTsKICBpc3MgPj4gbGtkOwogIGNoZWNrX2VxdWFsKCJDdXN0b20gc3RyaW5ncywgbGFzdF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICBsa2QuZ2V0X2RhdGUoMjAwNCksIGRhdGUoMjAwNCxBcHIsMjcpKTsKICBpc3Muc3RyKCJGcmkgcHJpb3IgdG8iKTsKICBpc3MgPj4gZmtiOwogIGNoZWNrX2VxdWFsKCJDdXN0b20gc3RyaW5ncywgZmlyc3RfZGF5X29mX3RoZV93ZWVrX2JlZm9yZSIsCiAgICAgIGZrYi5nZXRfZGF0ZShkYXRlKDIwMDQsRmViLDgpKSwgZGF0ZSgyMDA0LEZlYiw2KSk7CiAgaXNzLnN0cigiVGh1IHBhc3QiKTsKICBpc3MgPj4gZmthOwogIGNoZWNrX2VxdWFsKCJDdXN0b20gc3RyaW5ncywgZmlyc3RfZGF5X29mX3RoZV93ZWVrX2FmdGVyIiwKICAgICAgZmthLmdldF9kYXRlKGRhdGUoMjAwNCxGZWIsMSkpLCBkYXRlKDIwMDQsRmViLDUpKTsKCiAgLy8gZGF0ZV9nZW5lcmF0b3JzIC0gc3BlY2lhbCBjYXNlIHdpdGggZW1wdHkgZWxlbWVudCBzdHJpbmcKICAvKiBEb2Vzbid0IHdvcmsuIEVtcHR5IHN0cmluZyByZXR1cm5zIC0xIGZyb20gc3RyaW5nX3BhcnNlX3RyZWUgCiAgICogYmVjYXVzZSBpdCBhdHRlbXB0cyB0byBtYXRjaCB0aGUgbmV4dCBzZXQgb2YgY2hhcmFjdGVycyBpbiB0aGUgCiAgICogc3RyZWFtIHRvIHRoZSB3cm9uZyBlbGVtZW50LiBFeC4gSXQgYXR0ZW1wdHMgdG8gbWF0Y2ggIk1hciIgdG8gCiAgICogdGhlICdvZicgZWxlbWVudCBpbiB0aGUgdGVzdCBiZWxvdy4KICAgKgogIGZhY2V0LT5kYXRlX2dlbl9lbGVtZW50X3N0cmluZ3MoIjFzdCIsIjJuZCIsIjNyZCIsIjR0aCIsIjV0aCIsImZpbmFsIiwicHJpb3IgdG8iLCJwYXN0IiwiIik7IC8vIHRoZSAnb2YnIHN0cmluZyBpcyBhbiBlbXB0eSBzdHJpbmcKICBpc3Muc3RyKCJmaW5hbCBNb24gTWFyIik7CiAgaXNzID4+IGxrZDsKICBjaGVja19lcXVhbCgiU3BlY2lhbCBjYXNlLCBlbXB0eSBlbGVtZW50IHN0cmluZyIsCiAgICAgIGxrZC5nZXRfZGF0ZSgyMDA1KSwgZGF0ZSgyMDA1LE1hciwyOCkpOwogICAgICAqLwoKCiAgLy8gc3BlY2lhbCB2YWx1ZXMgdGVzdHMgKGRhdGUgYW5kIGRheXMgb25seSkKICBpc3Muc3RyKCJtaW5pbXVtLWRhdGUtdGltZSAraW5maW5pdHkiKTsKICBpc3MgPj4gZDsKICBpc3MgPj4gZGQ7CiAgY2hlY2tfZXF1YWwoIlNwZWNpYWwgdmFsdWVzLCBkZWZhdWx0IHN0cmluZ3MsIG1pbl9kYXRlX3RpbWUgZGF0ZSIsCiAgICAgIGQsIGRhdGUobWluX2RhdGVfdGltZSkpOwogIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcywgZGVmYXVsdCBzdHJpbmdzLCBwb3NfaW5maW4gZGF5cyIsCiAgICAgIGRkLCBkYXlzKHBvc19pbmZpbikpOwogIGlzcy5zdHIoIi1pbmZpbml0eSBtYXhpbXVtLWRhdGUtdGltZSIpOwogIGlzcyA+PiBkOwogIGlzcyA+PiBkZDsKICBjaGVja19lcXVhbCgiU3BlY2lhbCB2YWx1ZXMsIGRlZmF1bHQgc3RyaW5ncywgbmVnX2luZmluIGRhdGUiLAogICAgICBkLCBkYXRlKG5lZ19pbmZpbikpOwogIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcywgZGVmYXVsdCBzdHJpbmdzLCBtYXhfZGF0ZV90aW1lIGRheXMiLAogICAgICBkZCwgZGF5cyhtYXhfZGF0ZV90aW1lKSk7CiAgaXNzLnN0cigibm90LWEtZGF0ZS10aW1lIik7CiAgaXNzID4+IGQ7CiAgY2hlY2tfZXF1YWwoIlNwZWNpYWwgdmFsdWVzLCBkZWZhdWx0IHN0cmluZ3MsIG5vdF9hX2RhdGVfdGltZSBkYXRlIiwKICAgICAgZCwgZGF0ZShub3RfYV9kYXRlX3RpbWUpKTsKCiAgLy8gaW4gYWRkaXRpb24gY2hlY2sgdGhhdCBzcGVjaWFsX3ZhbHVlX2Zyb21fc3RyaW5nIGFsc28gd29ya3MgY29ycmVjdGx5IGZvciBvdGhlciBzcGVjaWFsIHZhbHVlcwogIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcywgZGVmYXVsdCBzdHJpbmdzLCBub3Rfc3BlY2lhbCB0ZXN0IiwKICAgICAgc3BlY2lhbF92YWx1ZV9mcm9tX3N0cmluZygibm90X3NwZWNpYWwiKSwgbm90X3NwZWNpYWwpOwogIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcywgZGVmYXVsdCBzdHJpbmdzLCBqdW5rIHRlc3QiLAogICAgICBzcGVjaWFsX3ZhbHVlX2Zyb21fc3RyaW5nKCJqdW5rIiksIG5vdF9zcGVjaWFsKTsKCiAgLy8gc3BlY2lhbCB2YWx1ZXMgY3VzdG9tLCBzdHJpbmdzCiAgc3BlY2lhbF92YWx1ZXNfcGFyc2VyIHN2cCgiTkFEVCIsICJNSU5GIiwgIklORiIsICJNSU5EVCIsICJNQVhEVCIpOwogIGZhY2V0LT5zcGVjaWFsX3ZhbHVlc19wYXJzZXIoc3ZwKTsKICBpc3Muc3RyKCJNSU5EVCBJTkYiKTsKICBpc3MgPj4gZDsKICBpc3MgPj4gZGQ7CiAgY2hlY2tfZXF1YWwoIlNwZWNpYWwgdmFsdWVzLCBjdXN0b20gc3RyaW5ncywgbWluX2RhdGVfdGltZSBkYXRlIiwKICAgICAgZCwgZGF0ZShtaW5fZGF0ZV90aW1lKSk7CiAgY2hlY2tfZXF1YWwoIlNwZWNpYWwgdmFsdWVzLCBjdXN0b20gc3RyaW5ncywgcG9zX2luZmluIGRheXMiLAogICAgICBkZCwgZGF5cyhwb3NfaW5maW4pKTsKICBpc3Muc3RyKCJNSU5GIE1BWERUIik7CiAgaXNzID4+IGQ7CiAgaXNzID4+IGRkOwogIGNoZWNrX2VxdWFsKCJTcGVjaWFsIHZhbHVlcywgY3VzdG9tIHN0cmluZ3MsIG5lZ19pbmZpbiBkYXRlIiwKICAgICAgZCwgZGF0ZShuZWdfaW5maW4pKTsKICBjaGVja19lcXVhbCgiU3BlY2lhbCB2YWx1ZXMsIGN1c3RvbSBzdHJpbmdzLCBtYXhfZGF0ZV90aW1lIGRheXMiLAogICAgICBkZCwgZGF5cyhtYXhfZGF0ZV90aW1lKSk7CiAgaXNzLnN0cigiTkFEVCIpOwogIGlzcyA+PiBkZDsKICBjaGVja19lcXVhbCgiU3BlY2lhbCB2YWx1ZXMsIGN1c3RvbSBzdHJpbmdzLCBub3RfYV9kYXRlX3RpbWUgZGF5cyIsCiAgICAgIGRkLCBkYXlzKG5vdF9hX2RhdGVfdGltZSkpOwogIC8vIGZhaWx1cmUgdGVzdAogIGNoZWNrKCJNaXNzcGVsbGVkIGlucHV0LCBzcGVjaWFsX3ZhbHVlIGRhdGUgdy9leGNlcHRpb25zIiwKICAgICAgZmFpbHVyZV90ZXN0KGQsICJOU0RUIiwgZV9iYWRfeWVhciwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwogIGNoZWNrKCJNaXNzcGVsbGVkIGlucHV0LCBzcGVjaWFsX3ZhbHVlIGRhdGUgbm8gZXhjZXB0aW9ucyIsCiAgICAgIGZhaWx1cmVfdGVzdChkLCAiTlNEVCIsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiTWlzc3BlbGxlZCBpbnB1dCwgc3BlY2lhbF92YWx1ZSBkYXlzIHcvZXhjZXB0aW9ucyIsCiAgICAgIGZhaWx1cmVfdGVzdChkZCwgIk5TRFQiLCBlX2ZhaWx1cmUsIG5ldyBkYXRlX2lucHV0X2ZhY2V0KCkpKTsKICBjaGVjaygiTWlzc3BlbGxlZCBpbnB1dCwgc3BlY2lhbF92YWx1ZSBkYXlzIG5vIGV4Y2VwdGlvbnMiLAogICAgICBmYWlsdXJlX3Rlc3QoZGQsICJOU0RUIiwgbmV3IGRhdGVfaW5wdXRfZmFjZXQoKSkpOwoKICB7CiAgICAvLyBHZXJtYW4gbmFtZXMuIFBsZWFzZSBleGN1c2UgYW55IGVycm9ycywgSSBkb24ndCBzcGVhayBHZXJtYW4gYW5kCiAgICAvLyBoYWQgdG8gcmVseSBvbiBhbiBvbi1saW5lIHRyYW5zbGF0aW9uIHNlcnZpY2UuCiAgICAvLyBUaGVzZSB0ZXN0cyBjaGVjayBvbmUgb2YgZWFjaCAoYXQgbGVhc3QpIGZyb20gYWxsIHNldHMgb2YgY3VzdG9tIHN0cmluZ3MKCiAgICAvLyBjcmVhdGUgYSBjdXN0b20gZm9ybWF0X2RhdGVfcGFyc2VyCiAgICBzdGQ6OnN0cmluZyBtX2FbXSA9IHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifTsKICAgIHN0ZDo6c3RyaW5nIG1fZltdID0geyJKYW51YXIiLCJGZWJydWFyIiwiTWFyeiIsIkFwcmlsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJNYWkiLCJKdW5pIiwiSnVsaSIsIkF1Z3VzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiU2VwdGVtYmVyIiwiT2t0b2JlciIsIk5vdmVtYmVyIiwiRGV6ZW1iZXIifTsKICAgIHN0ZDo6c3RyaW5nIHdfYVtdID0geyJTb24iLCAiTW9uIiwgIkRpZSIsIk1pdCIsICJEb24iLCAiRnJlIiwgIlNhbSJ9OwogICAgc3RkOjpzdHJpbmcgd19mW10gPSB7IlNvbm50YWciLCAiTW9udGFnIiwgIkRpZW5zdGFnIiwiTWl0dHdvY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRvbm5lcnN0YWciLCAiRnJlaXRhZyIsICJTYW1zdGFnIn07CiAgICB0eXBlZGVmIGJvb3N0OjpkYXRlX3RpbWU6OmZvcm1hdF9kYXRlX3BhcnNlcjxkYXRlLCBjaGFyPiBkYXRlX3BhcnNlcjsKICAgIGRhdGVfcGFyc2VyOjppbnB1dF9jb2xsZWN0aW9uX3R5cGUgbW9udGhzX2FiYnJldjsKICAgIGRhdGVfcGFyc2VyOjppbnB1dF9jb2xsZWN0aW9uX3R5cGUgbW9udGhzX2Z1bGw7CiAgICBkYXRlX3BhcnNlcjo6aW5wdXRfY29sbGVjdGlvbl90eXBlIHdrZGF5c19hYmJyZXY7CiAgICBkYXRlX3BhcnNlcjo6aW5wdXRfY29sbGVjdGlvbl90eXBlIHdrZGF5c19mdWxsOwogICAgbW9udGhzX2FiYnJldi5hc3NpZ24obV9hLCBtX2ErMTIpOwogICAgbW9udGhzX2Z1bGwuYXNzaWduKG1fZiwgbV9mKzEyKTsKICAgIHdrZGF5c19hYmJyZXYuYXNzaWduKHdfYSwgd19hKzcpOwogICAgd2tkYXlzX2Z1bGwuYXNzaWduKHdfZiwgd19mKzcpOwogICAgZGF0ZV9wYXJzZXIgZF9wYXJzZXIoIiVCICVkICVZIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoc19hYmJyZXYsIG1vbnRoc19mdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgd2tkYXlzX2FiYnJldiwgd2tkYXlzX2Z1bGwpOwoKICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWxfdmFsdWVzIHBhcnNlcgogICAgc3BlY2lhbF92YWx1ZXNfcGFyc2VyIHN2X3BhcnNlcigiTmljaHREYXR1bXplaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdiBVbmVuZGxpY2hrZWl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc2l0aXYgVW5lbmRsaWNoa2VpdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZW5pZ3N0ZXMgRGF0dW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW1hbGVzIERhdHVtIik7CgogICAgLy8gY3JlYXRlIGEgcGVyaW9kX3BhcnNlcgogICAgcGVyaW9kX3BhcnNlciBwX3BhcnNlcjsgLy8gZGVmYXVsdCB3aWxsIGRvCiAgICAvLyBjcmVhdGUgZGF0ZV9nZW5lcmF0b3JfcGFyc2VyCiAgICB0eXBlZGVmIGJvb3N0OjpkYXRlX3RpbWU6OmRhdGVfZ2VuZXJhdG9yX3BhcnNlcjxkYXRlLGNoYXI+IGRhdGVfZ2VuX3BhcnNlcjsKICAgIGRhdGVfZ2VuX3BhcnNlciBkZ19wYXJzZXIoIlp1ZXJzdCIsIlp3ZWl0ZW5zIiwiRHJpdHQiLCJWaWVydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJG/G5mdCIsIkxldHp0IiwiVm9yIiwiTmFjaCIsIlZvbiIpOwoKICAgIC8vIGNyZWF0ZSB0aGUgZGF0ZV9pbnB1dF9mYWNldAogICAgZGF0ZV9pbnB1dF9mYWNldCogZGVfZmFjZXQgPQogICAgICBuZXcgZGF0ZV9pbnB1dF9mYWNldCgiJUIgJWQgJVkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkX3BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfcGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGdfcGFyc2VyKTsKICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpc3M7CiAgICBpc3MuaW1idWUoc3RkOjpsb2NhbGUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSwgZGVfZmFjZXQpKTsKICAgIC8vIEp1bmUgMDYgMjAwNSwgRGVjLCBtaW5pbXVtIGRhdGUsIFR1ZXMKICAgIGlzcy5zdHIoIkp1bmkgMDYgMjAwNSBEZXogV2VuaWdzdGVzIERhdHVtIERpZSIpOwogICAgaXNzID4+IGQ7CiAgICBpc3MgPj4gbTsKICAgIGNoZWNrX2VxdWFsKCJHZXJtYW4gbmFtZXM6IGRhdGUiLCBkLCBkYXRlKDIwMDUsIEp1biwgNikpOwogICAgY2hlY2tfZXF1YWwoIkdlcm1hbiBuYW1lczogbW9udGgiLCBtLCBncmVnX21vbnRoKERlYykpOwogICAgaXNzID4+IGQ7CiAgICBpc3MgPj4gZ3c7CiAgICBjaGVja19lcXVhbCgiR2VybWFuIG5hbWVzOiBzcGVjaWFsIHZhbHVlIGRhdGUiLCBkLCBkYXRlKG1pbl9kYXRlX3RpbWUpKTsKICAgIGNoZWNrX2VxdWFsKCJHZXJtYW4gbmFtZXM6IHNob3J0IHdlZWtkYXkiLCBndywgZ3JlZ193ZWVrZGF5KFR1ZXNkYXkpKTsKICAgIGRlX2ZhY2V0LT53ZWVrZGF5X2Zvcm1hdCgiJUEiKTsgLy8gbG9uZyB3ZWVrZGF5CiAgICAvLyBUdWVzZGF5LCBTZWNvbmQgVHVlc2RheSBvZiBNYXIKICAgIGlzcy5zdHIoIkRpZW5zdGFnIFp3ZWl0ZW5zIERpZW5zdGFnIHZvbiBNYXIiKTsKICAgIGlzcyA+PiBndzsKICAgIGlzcyA+PiBua2Q7CiAgICBjaGVja19lcXVhbCgiR2VybWFuIG5hbWVzOiBsb25nIHdlZWtkYXkiLCBndywgZ3JlZ193ZWVrZGF5KFR1ZXNkYXkpKTsKICAgIGNoZWNrX2VxdWFsKCJHZXJtYW4gbmFtZXMsIG50aF9kYXlfb2ZfdGhlX3dlZWtfaW5fbW9udGgiLAogICAgICAgIG5rZC5nZXRfZGF0ZSgyMDA1KSwgZGF0ZSgyMDA1LE1hciw4KSk7CiAgICAvLyBUdWVzZGF5IGFmdGVyCiAgICBpc3Muc3RyKCJEaWVuc3RhZyBOYWNoIik7CiAgICBpc3MgPj4gZmthOwogICAgY2hlY2tfZXF1YWwoIkdlcm1hbiBuYW1lcywgZmlyc3RfZGF5X29mX3RoZV93ZWVrX2FmdGVyIiwKICAgICAgICBma2EuZ2V0X2RhdGUoZGF0ZSgyMDA1LEFwciw1KSksIGRhdGUoMjAwNSxBcHIsMTIpKTsKICB9CgogIHsKICAgIC8vIHRlc3QgbmFtZSByZXBsYWNlbWVudCBmdW5jdGlvbnMKCiAgICAvLyBjb2xsZWN0aW9ucyBmb3IgYWRkaW5nIHRvIGZhY2V0CiAgICBjb25zdCBjaGFyKiBjb25zdCBtb250aF9zaG9ydF9uYW1lc1tdPXsiKmphbioiLCIqZmViKiIsIiptYXIqIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqYXByKiIsIiptYXkqIiwiKmp1bioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIipqdWwqIiwiKmF1ZyoiLCIqc2VwKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKm9jdCoiLCIqbm92KiIsIipkZWMqIn07CiAgICBjb25zdCBjaGFyKiBjb25zdCBtb250aF9sb25nX25hbWVzW109eyIqKkphbnVhcnkqKiIsIioqRmVicnVhcnkqKiIsIioqTWFyY2gqKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqKkFwcmlsKioiLCIqKk1heSoqIiwiKipKdW5lKioiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKipKdWx5KioiLCIqKkF1Z3VzdCoqIiwiKipTZXB0ZW1iZXIqKiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqKk9jdG9iZXIqKiIsIioqTm92ZW1iZXIqKiIsIioqRGVjZW1iZXIqKiJ9OwogICAgY29uc3QgY2hhciogY29uc3Qgd2Vla2RheV9zaG9ydF9uYW1lc1tdPXsiZGF5MSIsICJkYXkyIiwiZGF5MyIsImRheTQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF5NSIsImRheTYiLCJkYXk3In07CiAgICBjb25zdCBjaGFyKiBjb25zdCB3ZWVrZGF5X2xvbmdfbmFtZXNbXT0geyJTdW4tMCIsICJNb24tMSIsICJUdWUtMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZWQtMyIsICJUaHUtNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmktNSIsICJTYXQtNiJ9OwoKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+ID4gc2hvcnRfd2Vla2RheV9uYW1lczsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+ID4gbG9uZ193ZWVrZGF5X25hbWVzOwogICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8Y2hhcj4gPiBzaG9ydF9tb250aF9uYW1lczsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+ID4gbG9uZ19tb250aF9uYW1lczsKCiAgICBzdGQ6OmNvcHkoJndlZWtkYXlfc2hvcnRfbmFtZXNbMF0sCiAgICAgICAgICAgICAgJndlZWtkYXlfc2hvcnRfbmFtZXNbN10sCiAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHNob3J0X3dlZWtkYXlfbmFtZXMpKTsKICAgIHN0ZDo6Y29weSgmd2Vla2RheV9sb25nX25hbWVzWzBdLAogICAgICAgICAgICAgICZ3ZWVrZGF5X2xvbmdfbmFtZXNbN10sCiAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGxvbmdfd2Vla2RheV9uYW1lcykpOwogICAgc3RkOjpjb3B5KCZtb250aF9zaG9ydF9uYW1lc1swXSwKICAgICAgICAgICAgICAmbW9udGhfc2hvcnRfbmFtZXNbMTJdLAogICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihzaG9ydF9tb250aF9uYW1lcykpOwogICAgc3RkOjpjb3B5KCZtb250aF9sb25nX25hbWVzWzBdLAogICAgICAgICAgICAgICZtb250aF9sb25nX25hbWVzWzEyXSwKICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIobG9uZ19tb250aF9uYW1lcykpOwoKICAgIGRhdGUgZChub3RfYV9kYXRlX3RpbWUpOwogICAgZGF0ZV9pbnB1dF9mYWNldCogZmFjZXQgPSBuZXcgZGF0ZV9pbnB1dF9mYWNldCgpOwogICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICBzcy5pbWJ1ZShzdGQ6OmxvY2FsZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpLCBmYWNldCkpOwogICAgZmFjZXQtPnNob3J0X21vbnRoX25hbWVzKHNob3J0X21vbnRoX25hbWVzKTsKICAgIGZhY2V0LT5zaG9ydF93ZWVrZGF5X25hbWVzKHNob3J0X3dlZWtkYXlfbmFtZXMpOwogICAgZmFjZXQtPmxvbmdfbW9udGhfbmFtZXMobG9uZ19tb250aF9uYW1lcyk7CiAgICBmYWNldC0+bG9uZ193ZWVrZGF5X25hbWVzKGxvbmdfd2Vla2RheV9uYW1lcyk7CiAgICBmYWNldC0+Zm9ybWF0KCIlYSAlYiAlZCwgJVkiKTsKICAgIHNzLnN0cigiZGF5NyAqYXByKiAyMywgMjAwNSIpOwogICAgc3MgPj4gZDsKICAgIGNoZWNrX2VxdWFsKCJTaG9ydCBjdXN0b20gbmFtZXMsIHNldCB2aWEgYWNjZXNzb3IgZnVuY3Rpb24iLCBkLmRheV9vZl93ZWVrKCksIGdyZWdfd2Vla2RheSg2KSk7CiAgICBjaGVja19lcXVhbCgiU2hvcnQgY3VzdG9tIG5hbWVzLCBzZXQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9uIiwgZC5tb250aCgpLCBncmVnX21vbnRoKDQpKTsKICAgIHNzLnN0cigiIik7CiAgICBzcy5zdHIoIlN1bi0wICoqQXByaWwqKiAyNCwgMjAwNSIpOwogICAgZmFjZXQtPmZvcm1hdCgiJUEgJUIgJWQsICVZIik7CiAgICBzcyA+PiBkOwogICAgY2hlY2tfZXF1YWwoIkxvbmcgY3VzdG9tIG5hbWVzLCBzZXQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9uIiwgZC5kYXlfb2Zfd2VlaygpLCBncmVnX3dlZWtkYXkoMCkpOwogICAgY2hlY2tfZXF1YWwoIkxvbmcgY3VzdG9tIG5hbWVzLCBzZXQgdmlhIGFjY2Vzc29yIGZ1bmN0aW9uIiwgZC5tb250aCgpLCBncmVnX21vbnRoKDQpKTsKCiAgfQojZWxzZQogICAgY2hlY2soIlRoaXMgdGVzdCBpcyBhIG5vcCBmb3IgcGxhdGZvcm1zIHdpdGggVVNFX0RBVEVfVElNRV9QUkVfMV8zM19GQUNFVF9JTyIsCiAgICAgICAgICB0cnVlKTsKI2VuZGlmCiAgcmV0dXJuIHByaW50VGVzdFN0YXRzKCk7Cn0KCg==