LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCiAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCiAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAogKiBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKLyoKICogVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICogdW5kZXIgcHJvcHJpZXRhcnkgdGVybXMgYmVmb3JlIENvcHlyaWdodCBvd25lcnNoaXAgd2FzIGFzc2lnbmVkCiAqIHRvIHRoZSBMaW51eCBGb3VuZGF0aW9uLgogKi8KCi8qKgoqIEBmaWxlIGlzb2NfaHdfZGVzYy5oCiogQGJyaWVmIERlZmluZSB0aGUgVHggQkQgYW5kIFJ4IEJEIHN0cnVjdHMKKi8KI2lmbmRlZiBfSVNPQ19IV19ERVNDX19IXwojZGVmaW5lIF9JU09DX0hXX0RFU0NfX0hfCgojaW5jbHVkZSA8YV90eXBlcy5oPiAgICAgIC8qIEFfVUlOVDMyICovCgojaW5jbHVkZSA8YWRmX29zX3R5cGVzLmg+IC8qIGFkZl9vc19wcmludCAqLwojaW5jbHVkZSA8YWRmX29zX3V0aWwuaD4gIC8qIGFkZl9vc19hc3NlcnQgKi8KCgovKioqCiAgICBOT1RFOiBGb3IgUHJvbnRvIGRlZmluaXRpb24sIG9ubHkgVjEgaXMgZGVmaW5lZC4gRm9yIFYyLCBpdCBuZWVkcyB0byBhZGQgb3RoZXIgZmllbGRzCioqKi8KCi8qKgoqIEBicmllZiBpc29jX3J4X2JkX3QgLSB0aGUgZm9ybWF0IG9mIHRoZSAiUlggQkQiIChyeCBidWZmZXIgZGVzY3JpcHRvcikKKi8KCnR5cGVkZWYgc3RydWN0CnsKICAgIC8qIDB4MDAgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAoKICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCiAgICBUaGlzIHJvdXRpbmcgZmxhZyBpbmRpY2F0ZXMgdGhlIFdRIG51bWJlciB0byB3aGljaCB0aGUgRFBVIHdpbGwgcHVzaCB0aGUKICAgIGZyYW1lIGFmdGVyIGl0IGZpbmlzaGVkIHByb2Nlc3NpbmcgaXQuICovCiAgICBBX1VJTlQzMiBkcHVfcm91dGluZ19mbGFnOjg7CgogICAgLyoqIFRoaXMgaXMgRFBVIHNpZyBpbnNlcnRlZCBieSBSWFAuIFNpZ25hdHVyZSBvbiBSQSdzIERQVSBkZXNjcmlwdG9yICovCiAgICBBX1VJTlQzMiBkcHVfc2lnbmF0dXJlOjM7CgogICAgLyoqIFdoZW4gc2V0IFN0YSBpcyBhdXRoZW50aWNhdGVkLiBTVyBuZWVkcyB0byBzZXQgYml0CiAgICBhZGRyMl9hdXRoX2V4dHJhY3RfZW5hYmxlIGluIHJ4cF9jb25maWcyIHJlZ2lzdGVyLiBUaGVuIFJYUCB3aWxsIHVzZSBiaXQgMwogICAgaW4gRFBVIHNpZyB0byBzYXkgd2hldGhlciBTVEEgaXMgYXV0aGVudGljYXRlZCBvciBub3QuIEluIHRoaXMgY2FzZSBvbmx5CiAgICBsb3dlciAyYml0cyBvZiBEUFUgU2lnIGlzIHZhbGlkICovCiAgICBBX1VJTlQzMiBzdGFfYXV0aGVudGljYXRlZDoxOwoKICAgIC8qKiBXaGVuIHNldCBhZGRyZXNzMiBpcyBub3QgdmFsaWQgKi8KICAgIEFfVUlOVDMyIGFkZHIyX2ludmFsaWQ6MTsKCiAgICAvKiogV2hlbiBzZXQgaXQgaW5kaWNhdGVzIFRQRSBoYXMgc2VudCB0aGUgQmVhY29uIGZyYW1lICovCiAgICBBX1VJTlQzMiBiZWFjb25fc2VudDoxOwoKICAgIC8qKiBUaGlzIGJpdCBmaWxsZWQgYnkgcnhwIHdoZW4gc2V0IGluZGljYXRlcyBpZiB0aGUgY3VycmVudCB0c2YgaXMgc21hbGxlcgogICAgdGhhbiByZWNlaXZlZCB0c2YgKi8KICAgIEFfVUlOVDMyIHJ4X3RzZl9sYXRlcjoxOwoKICAgIC8qKiBUaGVzZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IFNXIHRvIGNhcnJ5IHRoZSBSeCBDaGFubmVsIG51bWJlciBhbmQgU0NBTiBiaXQgaW4gUnhCRCovCiAgICBBX1VJTlQzMiByeF9jaGFubmVsOjQ7CiAgICAvKiogRm9yIFdNSSBob3N0LCB0aGlzIGJpdCBtZWFucyBiYW5kIDAgLSAyLjRHaHogMSAtIDVHSHoqLwogICAgQV9VSU5UMzIgYmFuZF81Z2h6OjE7CgogICAgQV9VSU5UMzIgcmVzZXJ2ZWQwOjE7CgogICAgLyoqIExMQyBSZW1vdmVkCiAgICBUaGlzIGJpdCBpcyBvbmx5IHVzZWQgaW4gTGlicmEgcnN2ZCBmb3IgVmlyZ28xLjAvVmlyZ28yLjAKICAgIEZpbGxlZCBieSBBRFUgd2hlbiBpdCBpcyBzZXQgTExDIGlzIHJlbW92ZWQgZnJvbSBwYWNrZXQgKi8KICAgIEFfVUlOVDMyIGxsY19yZW1vdmVkOjE7CgogICAgQV9VSU5UMzIgdW1hX2J5cGFzczoxOwoKICAgIC8qKiBUaGlzIGJpdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBWaXJnbzIuMC9saWJyYSBpdCBpcyByZXNlcnZlZCBpbiBWaXJnbzEuMAogICAgUm9idXN0IE1hbmFnZW1lbnQgZnJhbWUuIFRoaXMgYml0IGluZGljYXRlcyB0byBEUFUgdGhhdCB0aGUgcGFja2V0IGlzIGEKICAgIHJvYnVzdCBtYW5hZ2VtZW50IGZyYW1lIHdoaWNoIHJlcXVpcmVzIGRlY3J5cHRpb24odGhpcyBiaXQgaXMgb25seSB2YWxpZCBmb3IKICAgIG1hbmFnZW1lbnQgdW5pY2FzdCBlbmNyeXB0ZWQgZnJhbWVzKQogICAgMSAtIE5lZWRzIGRlY3J5cHRpb24KICAgIDAgLSBObyBkZWNyeXB0aW9uIHJlcXVpcmVkICovCiAgICBBX1VJTlQzMiByb2J1c3RfbWdtdDoxOwoKICAgIC8qKgogICAgVGhpcyBiaXQgaXMgb25seSBpbiBWaXJnbzIuMC9saWJyYSBpdCBpcyByZXNlcnZlZCBpbiBWaXJnbyAxLjAKICAgIFRoaXMgMS1iaXQgZmllbGQgaW5kaWNhdGVzIHRvIERQVSBVbmljYXN0L0JDL01DIHBhY2tldAogICAgMCAtIFVuaWNhc3QgcGFja2V0CiAgICAxIC0gQnJvYWRjYXN0L011bHRpY2FzdCBwYWNrZXQKICAgIFRoaXMgYml0IGlzIG9ubHkgdmFsaWQgd2hlbiByb2J1c3RfbWdtdCBiaXQgaXMgMSAqLwogICAgQV9VSU5UMzIgbm90X3VuaWNhc3Q6MTsKCiAgICAvKiogVGhpcyBpcyB0aGUgS0VZIElEIGV4dHJhY3RlZCBmcm9tIFdFUCBwYWNrZXRzIGFuZCBpcyB1c2VkIGZvciBkZXRlcm1pbmUKICAgIHRoZSBSWCBLZXkgSW5kZXggdG8gdXNlIGluIHRoZSBEUFUgRGVzY3JpcHRyb3IuCiAgICBUaGlzIGZpZWxkICBpcyAyYml0cyBmb3IgdmlyZ28gMS4wCiAgICBBbmQgMyBiaXRzIGluIHZpcmdvMi4wIGFuZCBMaWJyYQogICAgSW4gdmlyZ28yLjAvbGlicmEgaXQgaXMgM2JpdHMgZm9yIHRoZSBCQy9NQyBwYWNrZXRzICovCiAgICBBX1VJTlQzMiByeF9rZXlfaWQ6MzsKCiAgICAvKiogIChPbmx5IHVzZWQgYnkgdGhlIERQVSkKICAgIE5vIGVuY3J5cHRpb24vZGVjcnlwdGlvbgogICAgMDogTm8gYWN0aW9uCiAgICAxOiBEUFUgd2lsbCBub3QgZW5jcnlwdC9kZWNyeXB0IHRoZSBmcmFtZSwgYW5kIGRpc2NhcmQgYW55IGVuY3J5cHRpb24KICAgIHJlbGF0ZWQgc2V0dGluZ3MgaW4gdGhlIFBEVSBkZXNjcmlwdG9yLiAqLwogICAgQV9VSU5UMzIgZHB1X25vX2VuY3J5cHQ6MTsKCiAgICAvKioKICAgIFRoaXMgaXMgb25seSBhdmFpbGFibGUgaW4gbGlicmEvdmlyZ28yLjAgIGl0IGlzIHJlc2VydmVkIGZvciB2aXJnbzEuMAogICAgVGhpcyBiaXQgaXMgZmlsbGVkIGJ5IFJYUCBhbmQgbW9kaWZpZWQgYnkgQURVCiAgICBUaGlzIGJpdCBpbmRpY2F0ZXMgdG8gQURVL1VNQSBtb2R1bGUgdGhhdCB0aGUgcGFja2V0IHJlcXVpcmVzIDgwMi4xMW4gdG8KICAgIDgwMi4zIGZyYW1lIHRyYW5zbGF0aW9uLiBPbmNlIEFEVS9VTUEgaXMgZG9uZSB3aXRoIHRyYW5zbGF0aW9uIHRoZXkKICAgIG92ZXJ3cml0ZSBpdCB3aXRoIDEnYjAvMSdiMSBkZXBlbmRpbmcgb24gaG93IHRoZSB0cmFuc2xhdGlvbiByZXN1bHRlZAogICAgV2hlbiB1c2VkIGJ5IEFEVQogICAgMCAtIE5vIGZyYW1lIHRyYW5zbGF0aW9uIHJlcXVpcmVkCiAgICAxIC0gRnJhbWUgVHJhbnNsYXRpb24gcmVxdWlyZWQKICAgIFdoZW4gdXNlZCBieSBTVwogICAgMCAtIEZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lLCBNUERVIGhlYWRlciBvZmZzZXQgcG9pbnRzIHRvIDgwMi4xMSBoZWFkZXIuLgogICAgMSAtIEZyYW1lIHRyYW5zbGF0aW9uIGRvbmUgOyAgaGVuY2UgTVBEVSBoZWFkZXIgb2Zmc2V0IHdpbGwgcG9pbnQgdG8gYQogICAgODAyLjMgaGVhZGVyICovCiAgICBBX1VJTlQzMiBmcmFtZV90cmFuc2xhdGU6MTsKCiAgICAvKiogKE9ubHkgdXNlZCBieSB0aGUgRFBVKQogICAgQkQgVHlwZQogICAgMDA6ICdHZW5lcmljIEJEJywgYXMgaW5kaWN0ZWQgYWJvdmUKICAgIDAxOiBEZS1mcmFnbWVudGF0aW9uIGZvcm1hdAogICAgMTAtMTE6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLwogICAgQV9VSU5UMzIgYmRfdHlwZToyOwoKI2Vsc2UKICAgIEFfVUlOVDMyIGJkX3R5cGU6MjsKICAgIEFfVUlOVDMyIGZyYW1lX3RyYW5zbGF0ZToxOwogICAgQV9VSU5UMzIgZHB1X25vX2VuY3J5cHQ6MTsKICAgIEFfVUlOVDMyIHJ4X2tleV9pZDozOwogICAgQV9VSU5UMzIgbm90X3VuaWNhc3Q6MTsKICAgIEFfVUlOVDMyIHJvYnVzdF9tZ210OjE7CiAgICBBX1VJTlQzMiByZXNlcnZlZDE6MTsKICAgIEFfVUlOVDMyIGxsY19yZW1vdmVkOjE7CiAgICBBX1VJTlQzMiByZXNlcnZlZDA6MTsKICAgIC8qKiBGb3IgV01JIGhvc3QsIHRoaXMgYml0IG1lYW5zIGJhbmQgMCAtIDIuNEdoeiAxIC0gNUdIeiovCiAgICBBX1VJTlQzMiBiYW5kXzVnaHo6MTsKICAgIEFfVUlOVDMyIHJ4X2NoYW5uZWw6NDsKICAgIEFfVUlOVDMyIHJ4X3RzZl9sYXRlcjoxOwogICAgQV9VSU5UMzIgYmVhY29uX3NlbnQ6MTsKICAgIEFfVUlOVDMyIGFkZHIyX2ludmFsaWQ6MTsKICAgIEFfVUlOVDMyIHN0YV9hdXRoZW50aWNhdGVkOjE7CiAgICBBX1VJTlQzMiBkcHVfc2lnbmF0dXJlOjM7CiAgICBBX1VJTlQzMiBkcHVfcm91dGluZ19mbGFnOjg7CiNlbmRpZgoKICAgIC8qIDB4MDQgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAoKICAgIC8qKiBUaGlzIGlzIHVzZWQgZm9yIEFNU0RVIHRoaXMgaXMgdGhlIFBEVSBpbmRleCBvZiB0aGUgUERVIHdoaWNoIGlzIHRoZQogICAgb25lIGJlZm9yZSBsYXN0IFBEVTsgZm9yIGFsbCBub24gQU1TRFUgZnJhbWVzLCB0aGlzIGZpZWxkIFNIQUxMIGJlIDAuCiAgICBVc2VkIGluIEFEVSAoZm9yIEFNU0RVIGRlYWdncmVnYXRpb24pICovCiAgICBBX1VJTlQzMiBhbXNkdV9wZHVfaWR4OjE2OwoKI2lmZGVmIFFDQV9JU09DX1BST05UTwogICAgQV9VSU5UMzIgYWR1X2ZlZWRiYWNrOjc7CiAgICAvL1RvRE86IEFkZCBtZWFuaW5nIG9mIHRoaXMgYml0CiAgICBBX1VJTlQzMiBkcHVfbWFnaWNfcGFja2V0OiAxOwojZWxzZQogICAgQV9VSU5UMzIgYWR1X2ZlZWRiYWNrOjg7CiNlbmRpZiAvL1FDQV9JU09DX1BST05UTwoKICAgIC8qKiBEUFUgZmVlZGJhY2sgKi8KICAgIEFfVUlOVDMyIGRwdV9mZWVkYmFjazo4OwoKI2Vsc2UKICAgIEFfVUlOVDMyIGRwdV9mZWVkYmFjazo4OwojaWZkZWYgUUNBX0lTT0NfUFJPTlRPCiAgICBBX1VJTlQzMiBkcHVfbWFnaWNfcGFja2V0OiAxOwogICAgQV9VSU5UMzIgYWR1X2ZlZWRiYWNrOjc7CiNlbHNlCiAgICBBX1VJTlQzMiBhZHVfZmVlZGJhY2s6ODsKI2VuZGlmIC8vUUNBX0lTT0NfUFJPTlRPCgogICAgQV9VSU5UMzIgYW1zZHVfcGR1X2lkeDoxNjsKI2VuZGlmCgogICAgLyogMHgwOCAqLwojaWZkZWYgQklHX0VORElBTl9IT1NUCgogICAgLyoqIEluIGNhc2UgUERVcyBhcmUgbGlua2VkIHRvIHRoZSBCRCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mCiAgICB0aGUgZmlyc3QgUERVIGxpbmtlZCB0byB0aGUgQkQuIFdoZW4gUERVIGNvdW50IGlzIHplcm8sIHRoaXMgZmllbGQgaGFzIGFuCiAgICB1bmRlZmluZWQgdmFsdWUuICovCiAgICBBX1VJTlQzMiBoZWFkX3BkdV9pZHg6MTY7CgogICAgLyoqIEluIGNhc2UgUERVcyBhcmUgbGlua2VkIHRvIHRoZSBCRCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mCiAgICB0aGUgbGFzdCBQRFUuIFdoZW4gUERVIGNvdW50IGlzIHplcm8sIHRoaXMgZmllbGQgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZS4qLwogICAgQV9VSU5UMzIgdGFpbF9wZHVfaWR4OjE2OwoKI2Vsc2UKICAgIEFfVUlOVDMyIHRhaWxfcGR1X2lkeDoxNjsKICAgIEFfVUlOVDMyIGhlYWRfcGR1X2lkeDoxNjsKI2VuZGlmCgogICAgLyogMHgwYyAqLwojaWZkZWYgQklHX0VORElBTl9IT1NUCgogICAgLyoqIFRoZSBsZW5ndGggKGluIG51bWJlciBvZiBieXRlcykgb2YgdGhlIE1QRFUgaGVhZGVyLgogICAgTGltaXRhdGlvbjogVGhlIE1QRFUgaGVhZGVyIG9mZnNldCArIE1QRFUgaGVhZGVyIGxlbmd0aCBjYW4gbmV2ZXIgZ28gYmV5b25kCiAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBQRFUgKi8KICAgIEFfVUlOVDMyIG1wZHVfaGVhZGVyX2xlbmd0aDo4OwoKICAgIC8qKiBUaGUgc3RhcnQgYnl0ZSBudW1iZXIgb2YgdGhlIE1QRFUgaGVhZGVyLgogICAgVGhlIGJ5dGUgbnVtYmVyaW5nIGlzIGRvbmUgaW4gdGhlIEJFIGZvcm1hdC4gV29yZCAweDAsIGJpdHMgWzMxOjI0XSBoYXMKICAgIGJ5dGUgaW5kZXggMC4gKi8KICAgIEFfVUlOVDMyIG1wZHVfaGVhZGVyX29mZnNldDo4OwoKICAgIC8qKiBUaGUgc3RhcnQgYnl0ZSBudW1iZXIgb2YgdGhlIE1QRFUgZGF0YS4KICAgIFRoZSBieXRlIG51bWJlcmluZyBpcyBkb25lIGluIHRoZSBCRSBmb3JtYXQuIFdvcmQgMHgwLCBiaXRzIFszMToyNF0gaGFzCiAgICBieXRlIGluZGV4IDAuIE5vdGUgdGhhdCB0aGlzIG9mZnNldCBjYW4gcG9pbnQgYWxsIHRoZSB3YXkgaW50byB0aGUgZmlyc3QKICAgIGxpbmtlZCBQRFUuCiAgICBMaW1pdGF0aW9uOiBNUERVIERBVEEgT0ZGU0VUIGNhbiBub3QgcG9pbnQgaW50byB0aGUgMm5kIGxpbmtlZCBQRFUgKi8KICAgIEFfVUlOVDMyIG1wZHVfZGF0YV9vZmZzZXQ6OTsKCiAgICAvKiogVGhlIG51bWJlciBvZiBQRFVzIGxpbmtlZCB0byB0aGUgQkQuCiAgICBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgaW5kaWNhdGUgdGhlIGNvcnJlY3QgYW1vdW50LiAqLwogICAgQV9VSU5UMzIgcGR1X2NvdW50Ojc7CiNlbHNlCgogICAgQV9VSU5UMzIgcGR1X2NvdW50Ojc7CiAgICBBX1VJTlQzMiBtcGR1X2RhdGFfb2Zmc2V0Ojk7CiAgICBBX1VJTlQzMiBtcGR1X2hlYWRlcl9vZmZzZXQ6ODsKICAgIEFfVUlOVDMyIG1wZHVfaGVhZGVyX2xlbmd0aDo4OwojZW5kaWYKCiAgICAvKiAweDEwICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKCiAgICAvKiogVGhpcyBpcyB0aGUgbGVuZ3RoIChpbiBudW1iZXIgb2YgYnl0ZXMpIG9mIHRoZSBlbnRpcmUgTVBEVQogICAgKGhlYWRlciBhbmQgZGF0YSkuIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgRkNTIGZpZWxkLiAqLwogICAgQV9VSU5UMzIgbXBkdV9sZW5ndGg6MTY7CgogICAgQV9VSU5UMzIgcmVzZXJ2ZWQzOiAzOwogICAgLy9Ub0RPOiBBZGQgbWVhbmluZyBvZiB0aGlzIGJpdAogICAgQV9VSU5UMzIgcnhfZHhlX3ByaW9yaXR5X3JvdXRpbmc6MTsKCiAgICAvKiogVHJhZmZpYyBJZGVudGlmaWVyCiAgICBJbmRpY2F0ZXMgdGhlIHRyYWZmaWMgY2xhc3MgdGhlIGZyYW1lIGJlbG9uZ3MgdG8uIEZvciBub24gUW9TIGZyYW1lcywKICAgIHRoaXMgZmllbGQgaXMgc2V0IHRvIHplcm8uICovCiAgICBBX1VJTlQzMiB0aWQ6NDsKCiAgICAvKgogICAgICogRm9yIHRoZSBIVyBhbmQgRlcsIHJlc2VydmVkNCBpcyA2IGJpdHMgbG9uZy4KICAgICAqIEhvd2V2ZXIsIHRoZSBob3N0IFNXIHVzZXMgdHdvIG9mIHRoZXNlIGJpdHMgYXMgZmxhZ3MgdG8gcmVtZW1iZXIgd2hhdAogICAgICogdG8gZG8gd2l0aCB0aGUgcnggZnJhbWUuICBIZW5jZSwgZm9yIHRoZSBTVywgcmVzZXJ2ZWQ0IGlzIG9ubHkgNCBiaXRzLgogICAgICovCiAgICBBX1VJTlQzMiBzd19mbGFnX2ZvcndhcmQ6MTsgLyogU1ctb25seSBmaWVsZCwgdW51c2VkIGJ5IEZXK0hXICovCiAgICBBX1VJTlQzMiBzd19mbGFnX2Rpc2NhcmQ6MTsgLyogU1ctb25seSBmaWVsZCwgdW51c2VkIGJ5IEZXK0hXICovCiAgICBBX1VJTlQzMiByZXNlcnZlZDQ6NDsgICAvKiBTVyBwZXJzcGVjdGl2ZTogICAgNCBiaXRzIHJlc2VydmVkICovCiAgICAvL0FfVUlOVDMyIHJlc2VydmVkNDo2OyAvKiBGVytIVyBwZXJzcGVjaXR2ZTogNiBiaXRzIHJlc2VydmVkICovCiAgICBBX1VJTlQzMiBodHRfdDJoX21zZzoxOwogICAgQV9VSU5UMzIgZmxvd19jb250cm9sOjE7CiNlbHNlCiAgICBBX1VJTlQzMiBmbG93X2NvbnRyb2w6MTsKICAgIEFfVUlOVDMyIGh0dF90MmhfbXNnOjE7CiAgICAvL0FfVUlOVDMyIHJlc2VydmVkNDo2OyAvKiBGVytIVyBwZXJzcGVjaXR2ZTogNiBiaXRzIHJlc2VydmVkICovCiAgICBBX1VJTlQzMiByZXNlcnZlZDQ6NDsgICAvKiBTVyBwZXJzcGVjdGl2ZTogICAgNCBiaXRzIHJlc2VydmVkICovCiAgICBBX1VJTlQzMiBzd19mbGFnX2Rpc2NhcmQ6MTsKICAgIEFfVUlOVDMyIHN3X2ZsYWdfZm9yd2FyZDoxOwogICAgQV9VSU5UMzIgdGlkOjQ7CiAgICBBX1VJTlQzMiByeF9keGVfcHJpb3JpdHlfcm91dGluZzoxOwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQzOiAzOwogICAgQV9VSU5UMzIgbXBkdV9sZW5ndGg6MTY7CiNlbmRpZgoKICAgIC8qIDB4MTQgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAoKICAgIC8qKiAoT25seSB1c2VkIGJ5IHRoZSBEUFUpCiAgICBUaGUgRFBVIGRlc2NyaXB0b3IgaW5kZXggaXMgdXNlZCB0byBjYWxjdWxhdGUgd2hlcmUgaW4gbWVtb3J5IHRoZSBEUFUgY2FuCiAgICBmaW5kIHRoZSBEUFUgZGVzY3JpcHRvciByZWxhdGVkIHRvIHRoaXMgZnJhbWUuIFRoZSBEUFUgY2FsY3VsYXRlcyB0aGUKICAgIGFkZHJlc3MgYnkgbXVsdGlwbHlpbmcgdGhpcyBpbmRleCB3aXRoIHRoZSBEUFUgZGVzY3JpcHRvciBzaXplIGFuZCBhZGRpbmcKICAgIHRoZSBEUFUgZGVzY3JpcHRvcnMgYmFzZSBhZGRyZXNzLiBUaGUgRFBVIGRlc2NyaXB0b3IgY29udGFpbnMgaW5mb3JtYXRpb24KICAgIHNwZWNpZnlpbmcgdGhlIGVuY3J5cHRpb24gYW5kIGNvbXByZXNzaW9uIHR5cGUgYW5kIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8KICAgIHdoZXJlIGVuY3J5cHRpb24ga2V5cyBjYW4gYmUgZm91bmQuICovCiAgICBBX1VJTlQzMiBkcHVfZGVzY19pZHg6ODsKCiAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIxIG9mIHRoZSBpbmNvbWluZwogICAgZnJhbWUuIFNlZSBjaGFwdGVyOiBSWFAgZmlsdGVyIGZvciBlbmNvZGluZyBvZiB0aGlzIGZpZWxkLiAqLwogICAgQV9VSU5UMzIgYWRkcjFfaW5kZXg6ODsKCiAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIyIG9mIHRoZSBpbmNvbWluZwogICAgZnJhbWUuIFNlZSBjaGFwdGVyOiBSWFAgZmlsdGVyIGZvciBlbmNvZGluZyBvZiB0aGlzIGZpZWxkLiAqLwogICAgQV9VSU5UMzIgYWRkcjJfaW5kZXg6ODsKCiAgICAvKiogVGhlIHJlc3VsdCBmcm9tIHRoZSBiaW5hcnkgYWRkcmVzcyBzZWFyY2ggb24gdGhlIEFERFIzIG9mIHRoZSBpbmNvbWluZwogICAgZnJhbWUuIFNlZSBjaGFwdGVyOiBSWFAgZmlsdGVyIGZvciBlbmNvZGluZyBvZiB0aGlzIGZpZWxkLiAqLwogICAgQV9VSU5UMzIgYWRkcjNfaW5kZXg6ODsKI2Vsc2UKICAgIEFfVUlOVDMyIGFkZHIzX2luZGV4Ojg7CiAgICBBX1VJTlQzMiBhZGRyMl9pbmRleDo4OwogICAgQV9VSU5UMzIgYWRkcjFfaW5kZXg6ODsKICAgIEFfVUlOVDMyIGRwdV9kZXNjX2lkeDo4OwojZW5kaWYKCiAgICAvKiAweDE4ICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKCiAgICAvKiogSW5kaWNhdGVzIFJhdGUgSW5kZXggb2YgcGFja2V0IHJlY2VpdmVkICAqLwogICAgQV9VSU5UMzIgcmF0ZV9pbmRleDo5OwoKICAgIC8qKiBBbiBvdmVydmlldyBvZiBSWFAgc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcmVjZWl2aW5nIHRoZSBmcmFtZS4qLwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2hhc19mY3NfZW46MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19zZXRfbmF2OjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfY2xlYXJfbmF2OjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3Nfcm1mX2tleWlkX3ZsZDoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2FkZHIzX2luZGV4X2ludmFsaWQ6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19hZGRyMl9pbmRleF9pbnZhbGlkOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYWRkcjFfaW5kZXhfaW52YWxpZDoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2Vycm9yZWRfcm1mX2ZyYW1lOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYW1wZHVfZmxhZzoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX3JtZl9rZXlpZDozOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2xhc3RfbXBkdToxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2ZpcnN0X21wZHU6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19oYXNfcGh5X2NtZDoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2hhc19waHlfc3RhdHM6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19oYXNfZGxtOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYnlwX2RsbV9wcm9jOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYnlwX21wZHVfcHJvYzoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2ZhaWxfZmlsdGVyOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfZmFpbF9tYXhfcHRrbGVuOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfZmNzX2VycjoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2VycjoxOwoKI2Vsc2UKCiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfZXJyOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfZmNzX2VycjoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2ZhaWxfbWF4X3B0a2xlbjoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2ZhaWxfZmlsdGVyOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYnlwX21wZHVfcHJvYzoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2J5cF9kbG1fcHJvYzoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2hhc19kbG06MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19oYXNfcGh5X3N0YXRzOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfaGFzX3BoeV9jbWQ6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19maXJzdF9tcGR1OjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfbGFzdF9tcGR1OjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3Nfcm1mX2tleWlkOjM7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYW1wZHVfZmxhZzoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2Vycm9yZWRfcm1mX2ZyYW1lOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3NfYWRkcjFfaW5kZXhfaW52YWxpZDoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2FkZHIyX2luZGV4X2ludmFsaWQ6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19hZGRyM19pbmRleF9pbnZhbGlkOjE7CiAgICBBX1VJTlQzMiByeHBfZmxhZ3Nfcm1mX2tleWlkX3ZsZDoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX2NsZWFyX25hdjoxOwogICAgQV9VSU5UMzIgcnhwX2ZsYWdzX3NldF9uYXY6MTsKICAgIEFfVUlOVDMyIHJ4cF9mbGFnc19oYXNfZmNzX2VuOjE7CgogICAgQV9VSU5UMzIgcmF0ZV9pbmRleDo5OwoKI2VuZGlmCiAgICAvKiAweDFjICovCiAgICAvKiogVGhlIFBIWSBjYW4gYmUgcHJvZ3JhbW1lZCB0byBwdXQgYWxsIHRoZSBQSFkgU1RBVFMgcmVjZWl2ZWQgZnJvbSB0aGUKICAgIFBIWSB3aGVuIHJlY2VpdmluZyBhIGZyYW1lIGluIHRoZSBCRC4gICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKICAgIEFfVUlOVDMyIHJzc2kwOjg7CiAgICBBX1VJTlQzMiByc3NpMTo4OwogICAgQV9VSU5UMzIgcnNzaTI6ODsKICAgIEFfVUlOVDMyIHJzc2kzOjg7CiNlbHNlCiAgICBBX1VJTlQzMiByc3NpMzo4OwogICAgQV9VSU5UMzIgcnNzaTI6ODsKICAgIEFfVUlOVDMyIHJzc2kxOjg7CiAgICBBX1VJTlQzMiByc3NpMDo4OwojZW5kaWYKCiAgICAvKiAweDIwICovCiAgICBBX1VJTlQzMiBwaHlfc3RhdHMxOyAgICAgICAgICAgICAgICAgICAgICAvKiBQSFkgc3RhdHVzIHdvcmQgMTogc25yICovCgogICAgLyogMHgyNCAqLwogICAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgVFNGWzMxOjBdIGJpdHMgYXQgdGhlIG1vbWVudCB0aGF0IHRoZSBSWFAgc3RhcnQKICAgIHJlY2VpdmluZyBhIGZyYW1lIGZyb20gdGhlIFBIWSBSWC4gKi8KICAgIEFfVUlOVDMyIHJ4X3RpbWVzdGFtcDsgICAgICAgICAgICAgICAgLyogUnggdGltZXN0YW1wLCBtaWNyb3NlY29uZCBiYXNlZCovCgogICAgLyogMHgyOH4weDM4ICovCiAgICAvKiogVGhlIGJpdHMgZnJvbSB0aGUgUE1JIGNvbW1hbmQgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgUEhZIFJYLiAqLwogICAgQV9VSU5UMzIgcG1pX2NtZDR0bzIzWzVdOyAgICAgICAgICAgICAgIC8qIFBNSSBjbWQgcmN2ZCBmcm9tIFJ4UCAqLwoKICAgIC8qIDB4M2MgKi8KICAgIC8qKiBUaGUgYml0cyBmcm9tIHRoZSBQTUkgY29tbWFuZCBhcyByZWNlaXZlZCBmcm9tIHRoZSBQSFkgUlguICovCiNpZmRlZiBRQ0FfSVNPQ19fUFJPTlRPCgojaWZkZWYgQklHX0VORElBTl9IT1NUCiAgICAvKiogVGhlIGJpdHMgZnJvbSB0aGUgUE1JIGNvbW1hbmQgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgUEhZIFJYLiAqLwogICAgQV9VSU5UMzIgcG1pX2NtZDI0dG8yNToxNjsKCiAgICAvKiAxNi1iaXQgQ1NVIENoZWNrc3VtIHZhbHVlIGZvciB0aGUgZnJhZ21lbnRlZCByZWNlaXZlIGZyYW1lcyAqLwogICAgQV9VSU5UMzIgY3N1X2NoZWNrc3VtOjE2OwojZWxzZQogICAgQV9VSU5UMzIgY3N1X2NoZWNrc3VtOjE2OwogICAgQV9VSU5UMzIgcG1pX2NtZDI0dG8yNToxNjsKI2VuZGlmCgojZWxzZQogICAgLyoqIFRoZSBiaXRzIGZyb20gdGhlIFBNSSBjb21tYW5kIGFzIHJlY2VpdmVkIGZyb20gdGhlIFBIWSBSWC4gKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAogICAgQV9VSU5UMzIgcG1pX2NtZDI0dG8yNToxNjsKICAgIEFfVUlOVDMyIHBtaV9jbWQyNnRvMjc6MTY7CiNlbHNlCiAgICBBX1VJTlQzMiBwbWlfY21kMjZ0bzI3OjE2OwogICAgQV9VSU5UMzIgcG1pX2NtZDI0dG8yNToxNjsKI2VuZGlmCgojZW5kaWYgLy8gUUNBX0lTT0NfX1BST05UTwoKICAgIC8qIDB4NDAgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAoKICAgIC8qKiBHaXZlcyBjb21tYW5kcyB0byBzb2Z0d2FyZSB1cG9uIHdoaWNoIGhvc3Qgd2lsbCBwZXJmb3JtIHNvbWUgY29tbWFuZHMuCiAgICBQbGVhc2UgcmVmZXIgdG8gZm9sbG93aW5nIFJQRSBkb2N1bWVudCBmb3IgZGVzY3JpcHRpb24gb2YgYWxsIGRpZmZlcmVudAogICAgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLwogICAgQV9VSU5UMzIgcmVvcmRlcl9vcGNvZGU6NDsgLyogaXNvY19yeF9vcGNvZGUgKi8KCiAgICBBX1VJTlQzMiByZXNlcnZlZDY6MTI7CgogICAgLyoqIEZpbGxlZCBieSBSUEUgdG8gSW5kaWNhdGUgdG8gdGhlIGhvc3QgdXAgdG8gd2hpY2ggc2xvdCB0aGUgaG9zdCBuZWVkcwogICAgdG8gZm9yd2FyZCB0aGUgcGFja2V0cyB0byB1cHBlciBNYWMgbGF5ZXIuIFRoaXMgZmllbGQgbW9zdGx5IHVzZWQgZm9yIEFNRFBVCiAgICBwYWNrZXRzICovCiAgICBBX1VJTlQzMiByZW9yZGVyX2Z3ZF9pZHg6NjsKCiAgICAvKiogRmlsbGVkIGJ5IFJQRSB3aGljaCBpbmRpY2F0ZXMgdG8gdGhlIGhvc3Qgd2hpY2ggb25lIG9mIHNsb3RzIGluIHRoZQogICAgYXZhaWxhYmxlIDY0IHNsb3RzIHNob3VsZCB0aGUgaG9zdCBRdWV1ZSB0aGUgcGFja2V0LiBUaGlzIGZpZWxkIG9ubHkKICAgIGFwcGxpZWQgdG8gQU1QRFUgcGFja2V0cy4gKi8KICAgIEFfVUlOVDMyIHJlb3JkZXJfc2xvdF9pZHg6NjsKCiAgICBBX1VJTlQzMiByZXNlcnZlZDc6IDI7CiAgICAvL1RvRG86IEFkZCBtZWFuaW5nIHRvIHRoZSBiaXRzCiAgICBBX1VJTlQzMiBvdXRfb2Zfb3JkZXJfZm9yd2FyZDogMTsKICAgIEFfVUlOVDMyIHJlb3JkZXJfZW5hYmxlOiAxOwoKI2Vsc2UKCiAgICBBX1VJTlQzMiByZW9yZGVyX2VuYWJsZTogMTsKICAgIEFfVUlOVDMyIG91dF9vZl9vcmRlcl9mb3J3YXJkOiAxOwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ3OiAyOwoKICAgIEFfVUlOVDMyIHJlb3JkZXJfc2xvdF9pZHg6NjsKICAgIEFfVUlOVDMyIHJlb3JkZXJfZndkX2lkeDo2OwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ2OjEyOwogICAgQV9VSU5UMzIgcmVvcmRlcl9vcGNvZGU6NDsKI2VuZGlmCgogICAgLyogMHg0NCAqLwojaWZkZWYgQklHX0VORElBTl9IT1NUCiAgICAvKiogcmVzZXJ2ZWQ4IGZyb20gYSBoYXJkd2FyZSBwZXJzcGVjdGl2ZS4KICAgIFVzZWQgYnkgU1cgdG8gcHJvcG9nYXRlIGZyYW1lIHR5cGUvc3VidHlwZSBpbmZvcm1hdGlvbiAqLwogICAgQV9VSU5UMzIgZnJhbWVfdHlwZV9zdWJ0eXBlOjg7CgogICAgLyoqIEZpbGxlZCBSUEUgZ2l2ZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGluIGJpdG1hcCAqLwogICAgQV9VSU5UMzIgY3VycmVudF9wa3Rfc2Vxbm86MTI7CgogICAgLyoqIEZpbGxlZCBieSBSUEUgd2hpY2ggZ2l2ZXMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiBuZXh0IGV4cGVjdGVkIHBhY2tldAogICAgaW4gYml0bWFwICovCiAgICBBX1VJTlQzMiBleHBlY3RlZF9wa3Rfc2Vxbm86MTI7CiNlbHNlCiAgICBBX1VJTlQzMiBleHBlY3RlZF9wa3Rfc2Vxbm86MTI7CiAgICBBX1VJTlQzMiBjdXJyZW50X3BrdF9zZXFubzoxMjsKICAgIEFfVUlOVDMyIGZyYW1lX3R5cGVfc3VidHlwZTo4OwojZW5kaWYKCiAgICAvKiAweDQ4ICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKCiAgICAvKiogV2hlbiBzZXQgaXQgaXMgdGhlIEFNU0RVIHN1YmZyYW1lICovCiAgICBBX1VJTlQzMiBhbXNkdToxOwoKICAgIC8qKiBXaGVuIHNldCBpdCBpcyB0aGUgRmlyc3Qgc3ViZnJhbWUgb2YgdGhlIEFNU0RVIHBhY2tldCAqLwogICAgQV9VSU5UMzIgYW1zZHVfZmlyc3Q6MTsKCiAgICAvKiogV2hlbiBzZXQgaXQgaXMgdGhlIGxhc3Qgc3ViZnJhbWUgb2YgdGhlIEFNU0RVIHBhY2tldCAqLwogICAgQV9VSU5UMzIgYW1zZHVfbGFzdDoxOwoKICAgIC8qKiBXaGVuIHNldCBpdCBpbmRpY2F0ZXMgYW4gRXJyb3JlZCBBTVNEVSBwYWNrZXQgKi8KICAgIEFfVUlOVDMyIGFtc2R1X2Vycm9yOjE7CgogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ5OjQ7CgogICAgLyoqIEl0IGdpdmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgQU1TRFUgcGFja2V0IGlzIHByb2Nlc3NlZAogICAgQmFzaWNhbGx5IHRoaXMgaXMgYSBudW1iZXIgd2hpY2ggaW5jcmVtZW50cyBieSBvbmUgZm9yIGV2ZXJ5IEFNU0RVIGZyYW1lCiAgICByZWNlaXZlZC4gTWFpbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4gKi8KICAgIEFfVUlOVDMyIHByb2Nlc3Nfb3JkZXI6NDsKCiAgICAvKiogSXQgaXMgdGhlIG9yZGVyIG9mIHRoZSBzdWJmcmFtZSBvZiBBTVNEVSB0aGF0IGlzIHByb2Nlc3NlZCBieSBBRFUuCiAgICBUaGlzIGlzIHJlc2V0IHRvIDAgd2hlbiBBRFUgZGVhZ2dyZWdhdGVzIHRoZSBmaXJzdCBzdWJmcmFtZSBmcm9tIGEgbmV3CiAgICBBTVNEVSBhbmQgaW5jcmVtZW50cyBieSAxIGZvciBldmVyeSBuZXcgc3ViZnJhbWUgZGVhZ2dyZWdhdGVkIHdpdGhpbiB0aGUKICAgIEFNU0RVLCBhZnRlciBpdCByZWFjaGVzIDQnaGYgaXQgc3RvcHMgaW5jcmVtZW50aW5nLiBUaGF0IG1lYW5zIGhvc3Qgc2hvdWxkCiAgICBub3QgcmVseSBvbiB0aGlzIGZpZWxkIGFzIGluZGV4IGZvciBzdWJmcmFtZSBxdWV1aW5nLiAgVGhlb3JldGljYWxseSB0aGVyZQogICAgY2FuIGJlIHdheSBtb3JlIHRoYW4gMTYgc3ViZnJhbWVzIGluIGFuIEFNU0RVLiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVidWcKICAgIHB1cnBvc2UsIFNXIHNob3VsZCB1c2UgTFNGIGFuZCBGU0YgYml0cyB0byBkZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QKICAgIHN1YmZyYW1lcy4gKi8KICAgIEFfVUlOVDMyIGFtc2R1X2lkeDo0OwoKICAgIC8qKiBGaWxsZWQgYnkgQURVIHRoaXMgaXMgdGhlIHRvdGFsIEFNU0RVIHNpemUgKi8KICAgIEFfVUlOVDMyIHRvdGFsX2Ftc2R1X3NpemU6MTY7CiNlbHNlCiAgICBBX1VJTlQzMiB0b3RhbF9hbXNkdV9zaXplOjE2OwogICAgQV9VSU5UMzIgYW1zZHVfaWR4OjQ7CiAgICBBX1VJTlQzMiBwcm9jZXNzX29yZGVyOjQ7CiAgICBBX1VJTlQzMiByZXNlcnZlZDk6NDsKICAgIEFfVUlOVDMyIGFtc2R1X2Vycm9yOjE7CiAgICBBX1VJTlQzMiBhbXNkdV9sYXN0OjE7CiAgICBBX1VJTlQzMiBhbXNkdV9maXJzdDoxOwogICAgQV9VSU5UMzIgYW1zZHU6MTsKI2VuZGlmCgp9IGlzb2NfcnhfYmRfdDsKCgovKioKKiBAYnJpZWYgc3BlY2lmeSB3aGV0aGVyIHRvIHByb2Nlc3Mgb3IgZGVmZXIgcnggTVBEVXMKKiBAZGV0YWlscwoqICBUaGUgcnggcmVvcmRlciBvcGNvZGUgaW5kaWNhdGVzIHdoaWNoIHJ4IE1QRFVzIHNob3VsZCBiZSBkZWZlcnJlZCwKKiAgZHVlIHRvIHByaW9yIE1QRFVzIHRoYXQgaGF2ZSBub3QgeWV0IGFycml2ZWQsIGFuZCB3aGljaCBzaG91ZGwgYmUKKiAgcHJvY2Vzc2VkLCBkdWUgdG8gaGF2aW5nIGFsbCBwcmlvciBNUERVcyBhbHJlYWR5IHJlY2VpdmVkLgoqICBUaGUgcG9zc2liaWxpdGllcyBhcmU6CiogICAgLSBUaGVyZSB3ZXJlIG5vIG1pc3NpbmcgTVBEVXMsIGFuZCBhIG5ldyBpbi1vcmRlciBNUERVIGlzIHJlY2VpdmVkOgoqICAgICAgcmVsZWFzZSB0aGUgbmV3IE1QRFUKKiAgICAtIEEgc2luZ2xlIG1pc3NpbmcgTVBEVSBpcyByZWNlaXZlZDoKKiAgICAgIHJlbGVhc2UgdGhlIHF1ZXVlZCBvbGQgTVBEVXMgdGhhdCB3ZXJlIHdhaXRpbmcgb24gdGhpcyBuZXcgTVBEVSwKKiAgICAgIGFuZCBhbHNvIHJlbGVhc2UgdGhpcyBuZXcgTVBEVQoqICAgIC0gQSBNUERVIHRoYXQgaXMgbm90IHRoZSBpbml0aWFsIG1pc3NpbmcgTVBEVSBpcyByZWNlaXZlZDoKKiAgICAgIHN0b3JlIHRoZSBuZXcgTVBEVSBpbiB0aGUgcnggcmVvcmRlcmluZyBxdWV1ZSB1bnRpbCBtaXNzaW5nCiogICAgICBwcmlvciBNUERVcyBoYXZlIGJlZW4gcmVjZWl2ZWQKKiAgICAtIEEgbmV3IE1QRFUgc2hpZnRzIHRoZSBibG9jayBhY2sgd2luZG93LCBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcuLi4KKiAgICAgICAgLSBBbGwgb2xkIE1QRFVzIGFyZSBubyBsb25nZXIgY292ZXJlZCBieSB0aGUgc2hpZnRlZCBibG9jayBhY2sKKiAgICAgICAgICB3aW5kb3cuCiogICAgICAgICAgUmVsZWFzZSBhbGwgb2xkIE1QRFVzLCBhbmQgc3RvcmUgdGhlIG5ldyBNUERVLgoqICAgICAgICAtIFRoZSBtaXNzaW5nIE1QRFUgdGhhdCBvbGQgTVBEVXMgd2VyZSB3YWl0aW5nIGZvciBpcyBubyBsb25nZXIKKiAgICAgICAgICBjb3ZlcmVkIGJ5IHRoZSBzaGlmdGVkIGJsb2NrIGFjayB3aW5kb3cuICBSZWxlYXNlIGFsbCBzdWNoCiogICAgICAgICAgb2xkIE1QRFVzLCBhbmQgaWYgdGhlIG5ldyBNUERVIGlzIGluLW9yZGVyLCByZWxlYXNlIGl0IHRvby4KKiAgICAgICAgLSBTb21lIG9sZCBNUERVcyBhcmUgc3RpbGwgY292ZXJlZCBieSB0aGUgc2hpZnRlZCBibG9jayBhY2sKKiAgICAgICAgICB3aW5kb3csIGFuZCBzbyBpcyBhIG1pc3NpbmcgTVBEVSBwcmVjZWRpbmcgdGhlIG9sZCBNUERVcy4KKiAgICAgICAgICBBbnkgb2xkIE1QRFVzIHRoYXQgYXJlIG5vIGxvbmdlciBjb3ZlcmVkIGJ5IHRoZSBzaGlmdGVkIGJsb2NrCiogICAgICAgICAgYWNrIHdpbmRvdyBhcmUgcmVsZWFzZWQsIGFzIGFyZSBhbnkgb2xkIE1QRFVzIHRoYXQgZG9uJ3QgaGF2ZQoqICAgICAgICAgIGFueSBtaXNzaW5nIHByaW9yIE1QRFUuICBBbGwgcmVtYWluZyBNUERVcywgaW5jbHVkaW5nIHRoZSBuZXcKKiAgICAgICAgICBNUERVLCBhcmUgbGVmdCBxdWV1ZWQgaW4gdGhlIHJ4IHJlb3JkZXIgYXJyYXkuCiogICAgLSBBIGJsb2NrIGFjayByZXF1ZXN0IGNvbnRyb2wgbWVzc2FnZSBjYXVzZXMgdGhlIGJsb2NrIGFjayB3aW5kb3cKKiAgICAgIHRvIHNoaWZ0OiByZWxlYXNlIHF1ZXVlZCBNUERVcyB0aGF0IGFyZSBubyBsb25nZXIgY292ZXJlZCBieSB0aGUKKiAgICAgIHNoaWZ0ZWQgYmxvY2sgYWNrIHdpbmRvdy4KKi8KdHlwZWRlZiBlbnVtCnsKICAgIElTT0NfUlhfT1BDT0RFX0lOVkFMSUQgICAgICAgICA9IDAsCgogICAgLyogUVVFVUVDVVJfRldEQlVGCiAgICAgKiBUaGUgbmV3IE1QRFUgZmlsbHMgYSBob2xlIChvciBpcyBhdCB0aGUgZnJvbnQgb2YgdGhlIGJsb2NrIGFjawogICAgICogd2luZG93KSAtIHJlbGVhc2UgYW55IGJ1ZmZlcmVkIE1QRFVzIHRoYXQgd2VyZSB3YWl0aW5nIGZvciB0aGlzCiAgICAgKiBuZXcgTVBEVSAoYW5kIHRoZW4gcmVsZWFzZSB0aGlzIG5ldyBNUERVIHRvbykuCiAgICAgKi8KICAgIElTT0NfUlhfT1BDT0RFX1FVRVVFQ1VSX0ZXREJVRiA9IDEsCgogICAgLyogRldEQlVGX0ZXRENVUgogICAgICogVGhlIG5ldyBNUERVIHNoaWZ0cyB0aGUgYmxvY2sgYWNrIHdpbmRvdywgY2F1c2luZyBhbGwgb2xkIE1QRFVzCiAgICAgKiB0byBubyBsb25nZXIgYmUgd2l0aGluIHRoZSBzaGlmdGVkIGJsb2NrIGFjayB3aW5kb3cuCiAgICAgKiBUaHVzLCBhbGwgYnVmZmVyZW5kIE1QRFVzIGFyZSByZWxlYXNlZC4gIFNpbmNlIHRoZSBuZXcgTVBEVSBpcyBhdAogICAgICogdGhlIGZyb250IG9mIHRoZSBzaGlmdGVkIGJsb2NrIGFjayB3aW5kb3csIGl0IHRvbyBpcyByZWxlYXNlZC4KICAgICAqLwogICAgSVNPQ19SWF9PUENPREVfRldEQlVGX0ZXRENVUiAgID0gMiwKCiAgICAvKiBRVUVVRUNVUgogICAgICogVGhlIG5ldyBNUERVIGlzIHdhaXRpbmcgZm9yIG1pc3NpbmcgcHJpb3IgTVBEVXMuCiAgICAgKi8KICAgIElTT0NfUlhfT1BDT0RFX1FVRVVFQ1VSICAgICAgICA9IDMsCgogICAgLyogRldEQlVGX1FVRVVFQ1VSCiAgICAgKiBUaGUgbmV3IE1QRFUgcmVzdWx0cyBpbiB0aGUgYmxvY2sgYWNrIHdpbmRvdyBiZWluZyBzaGlmdGVkLAogICAgICogYW5kIHRoZSBuZXcgTVBEVSdzIHBvc2l0aW9uIHdpdGhpbiB0aGUgbmV3IGJsb2NrIGFjayB3aW5kb3cKICAgICAqIHBvdGVudGlhbGx5IGZhbGxzIG9uIHRvcCBvZiBhbiBvbGQgTVBEVSdzIHBvc2l0aW9uIHdpdGhpbiB0aGUKICAgICAqIG9sZCBibG9jayBhY2sgd2luZG93LgogICAgICogVGhlIG5ldyBNUERVIGlzIHdhaXRpbmcgZm9yIGEgbWlzc2luZyBwcmlvciBNUERVIHRoYXQgZmFsbHMgd2l0aGluCiAgICAgKiB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBibG9jayBhY2sgd2luZG93LgogICAgICogVGh1cywgZmlyc3QgcmVsZWFzZSBhbGwgdGhlIE1QRFVzIHRoYXQgYXJlIG5vIGxvbmdlciBjb3ZlcmVkIGJ5IHRoZQogICAgICogc2hpZnRlZCBibG9jayBhY2sgd2luZG93LCB0aGVuIHN0b3JlIHRoZSBuZXcgTVBEVS4KICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgRldEQUxMX1FVRVVFQ1VSLCBleGNlcHQgdGhhdCBpbiB0aGlzIGNhc2Ugc29tZQogICAgICogb2YgdGhlIG9sZCBNUERVcyBzdGlsbCBhcmUgY292ZXJlZCBieSB0aGUgc2hpZnRlZCBibG9jayBhY2sgd2luZG93CiAgICAgKiBhbmQgaGF2ZSBhIG1pc3NpbmcgTVBEVSB0aGF0IHRoZXkgYXJlIHdhaXRpbmcgZm9yLgogICAgICovCiAgICBJU09DX1JYX09QQ09ERV9GV0RCVUZfUVVFVUVDVVIgPSA0LAoKICAgIC8qIEZXREJVRl9EUk9QQ1VSCiAgICAgKiBBIGJsb2NrIGFjayByZXF1ZXN0IGNvbnRyb2wgbWVzc2FnZSBzaGlmdHMgdGhlIGJsb2NrIGFjayB3aW5kb3csCiAgICAgKiBjYXVzaW5nIHNvbWUgb2YgdGhlIHF1ZXVlZCBNUERVcyB0byBiZSBubyBsb25nZXIgY292ZXJlZCBieSB0aGUKICAgICAqIHNoaWZ0ZWQgYmxvY2sgYWNrIHdpbmRvdy4KICAgICAqIFJlbGVhc2UgdGhlc2UgTVBEVXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHdpdGhpbiB0aGUgYmxvY2sgYWNrIHdpbmRvdywKICAgICAqIGFuZCBhbnkgTVBEVXMgdGhhdCBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXcgd2luZG93LCB3aGlsZSByZXRhaW5pbmcKICAgICAqIE1QRFVzIHdpdGhpbiB0aGUgd2luZG93IHRoYXQgYXJlIHByZWNlZGVkIGJ5IGEgbWlzc2luZyBNUERVLgogICAgICovCiAgICBJU09DX1JYX09QQ09ERV9GV0RCVUZfRFJPUENVUiAgPSA1LAoKICAgIC8qIEZXREFMTF9EUk9QQ1VSCiAgICAgKiBBIGJsb2NrIGFjayByZXF1ZXN0IGNvbnRyb2wgbWVzc2FnZSBzaGlmdHMgdGhlIGJsb2NrIGFjayB3aW5kb3csCiAgICAgKiBjYXVzaW5nIGFsbCBvZiB0aGUgcXVldWVkIE1QRFVzIHRvIGJlIG5vIGxvbmdlciBjb3ZlcmVkIGJ5IHRoZQogICAgICogc2hpZnRlZCBibG9jayBhY2sgd2luZG93LiAgUmVsZWFzZSBhbGwgcXVldWVkIE1QRFVzLgogICAgICovCiAgICBJU09DX1JYX09QQ09ERV9GV0RBTExfRFJPUENVUiAgPSA2LAoKICAgIC8qIEZXREFMTF9RVUVVRUNVUgogICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIEZXREJVRl9RVUVVRUNVUiwgYnV0IGFsbCBvbGQgTVBEVXMgYXJlIHJlbGVhc2VkLAogICAgICogZWl0aGVyIGJlY2F1ZXMgdGhleSBhbGwgYXJlIG5vIGxvbmdlciBjb3ZlcmVkIGJ5IHRoZSBzaGlmdGVkIGJsb2NrIGFjawogICAgICogd2luZG93LCBvciBiZWNhdXNlIHRoZSBtaXNzaW5nIE1QRFUgdGhleSB3ZXJlIHdhaXRpbmcgZm9yIGlzIG5vIGxvbmdlcgogICAgICogY292ZXJlZCBieSB0aGUgc2hpZnRlZCBibG9jayBhY2sgd2luZG93LCBzbyB0aG91Z2ggKHNvbWUgb2YpIHRoZSBvbGQKICAgICAqIE1QRFVzIGFyZSBzdGlsbCBjb3ZlcmVkIGJ5IHRoZSBzaGlmdGVkIGJsb2NrIGFjayB3aW5kb3csIHRoZXkgbm8gbG9uZ2VyCiAgICAgKiBoYXZlIGEgbWlzc2luZyBwcmlvciBNUERVIHdpdGhpbiB0aGUgYmxvY2sgYWNrIHdpbmRvdy4KICAgICAqLwogICAgSVNPQ19SWF9PUENPREVfRldEQUxMX1FVRVVFQ1VSID0gNywKCiAgICBJU09DX1JYX09QQ09ERV9URUFSRE9XTiAgICAgICAgPSA4LCAvKiBub3QgdXNlZD8gKi8KCiAgICBJU09DX1JYX09QQ09ERV9EUk9QQ1VSICAgICAgICAgPSA5LCAvKiBub3QgdXNlZD8gKi8KCiAgICBJU09DX1JYX09QQ09ERV9NQVgKfSBpc29jX3J4X29wY29kZTsKCgovKiBiZF90eXBlIGRlZmluZWQgKi8KZW51bSB7CiAgICBJU09DX0JEX1RZUEVfR0VORVJJQyA9IDAsCiAgICBJU09DX0JEX1RZUEVfREVGUkFHID0gMSwKfTsKCi8qIGRwdV9mZWVkYmFjayBkZWZpbmVkICovCmVudW0gewogICAgSVNPQ19EUFVfRkVFREJBQ0tfTVVMVElfRVJST1IgPSAwLCAgIC8qIERQVSBkZXRlY3RlZCBtdWx0aXBsZSBlcnJvcnMuIFNob3VsZCBuZXZlciBvY2N1ci4gKi8KICAgIElTT0NfRFBVX0ZFRURCQUNLX0JBRF9UQUcsICAgICAgICAgICAvKiBUYWcgZmllbGRzIGluIHRoZSBCRCBhbmQgYXNzb2NpYXRlZCBEUFUgZGVzY3JpcHRvciBkaWQgbm90IG1hdGNoLiAqLwogICAgSVNPQ19EUFVfRkVFREJBQ0tfQkFEX0JELCAgICAgICAgICAgIC8qICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFwcGxpZWQ6CiAgICAqIFRoZSBCRCB0eXBlIHdhcyBub3QgMCAobm9ybWFsIEJEKSBpbiBhIFRYIHBhY2tldC4KICAgICogVGhlIEJEIHR5cGUgd2FzIG5vdCBlaXRoZXIgMCBvciAxIChub3JtYWwgb3IgZGVmcmFnIEJEKSBpbiBhbiBSWCBwYWNrZXQuCiAgICAqIFRoZSBNUERVIExlbmd0aCBmaWVsZCB3YXMgbGVzcyB0aGFuIHRoZSBNUERVIEhlYWRlciBMZW5ndGggZmllbGQuCiAgICAqIFRoZSBNUERVIGhlYWRlciB3YXMgbm90IGxvY2F0ZWQgZW50aXJlbHkgd2l0aGluIHRoZSBCRC4KICAgICogVGhlIE1QRFUgRGF0YSBPZmZzZXQgcG9pbnRlZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IFBEVS4KICAgICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19CQURfVEtJUF9NSUMsICAgICAvKiBUaGUgVEtJUCBNSUMgb2YgYSByZWNlaXZlZCBwYWNrZXQgaXMgaW5jb3JyZWN0LiAqLwogICAgSVNPQ19EUFVfRkVFREJBQ0tfQkFEX0RFQ1JZUFQsICAgICAgLyogRGVjcnlwdGlvbiBvZiBhbiBSWCBmcmFnbWVudCBoYXMgZmFpbGVkLlRoaXMgZXJyb3Igb2NjdXJzIG9ubHkgaWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIG1vcmUgc3BlY2lmaWMgY29uZGl0aW9ucyBhcHBsaWVkLiAqLwogICAgSVNPQ19EUFVfRkVFREJBQ0tfRU5WRUxPUEVfT05MWSwgICAgLyogVGhlIHJlY2VpdmVkIHByb3RlY3RlZCBmcmFnbWVudCBoYWQgZXhhY3RseSBzdWZmaWNpZW50IE1QRFUgZGF0YSBmb3IgYW4gZW1wdHkgY3J5cHRvZ3JhcGhpYyBlbnZlbG9wZSBvZiB0aGUgc2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlLiAqLwogICAgSVNPQ19EUFVfRkVFREJBQ0tfRU5WRUxPUEVfUEFSVCwgICAgLyogVGhlIHJlY2VpdmVkIHByb3RlY3RlZCBmcmFnbWVudCBoYWQgbGVzcyBNUERVIGRhdGEgdGhhbiByZXF1aXJlZCBmb3IgdGhlIGNyeXB0b2dyYXBoaWMgZW52ZWxvcGUgb2YgdGhlIHNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZS4gKi8KICAgIElTT0NfRFBVX0ZFRURCQUNLX1pFUk9fTEVOR1RILCAgICAgIC8qIFRoZSByZWNlaXZlZCBmcmFnbWVudCBoYWQgbm8gTVBEVSBkYXRhIGF0IGFsbC4gKi8KICAgIElTT0NfRFBVX0ZFRURCQUNLX0JBRF9FWFRJViwgICAgICAgIC8qIFRoZSByZWNlaXZlZCBBRVMgb3IgVEtJUCBmcmFnbWVudCBkaWQgbm90IGhhdmUgdGhlIEVYVElWIGJpdCBzZXQgaW4gdGhlIElWIGZpZWxkIG9mIHRoZSBjcnlwdG9ncmFwaGljIGVudmVsb3BlLiAqLwogICAgSVNPQ19EUFVfRkVFREJBQ0tfQkFEX0tJRCwgICAgICAgICAgLyogVGhlIEtJRCBmaWVsZCBleHRyYWN0ZWQgZnJvbSB0aGUgcmVjZWl2ZWQgZnJhZ21lbnQgZGlkIG5vdCBtYXRjaCB0aGF0IGluIHRoZSBEUFUgZGVzY3JpcHRvciAob3IgdGhlIEJEIGZvciBXRVAgZW5jcnlwdGlvbiBtb2RlcykuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19CQURfV0VQX1NFRUQsICAgICAvKiBUaGUgcmVjZWl2ZWQgVEtJUCBmcmFnbWVudJJzIGNvbXB1dGVkIFdFUCBTZWVkIGRpZCBub3QgbWF0Y2ggdGhhdCBpbiB0aGUgSVYuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19VTlBST1RFQ1RFRCwgICAgICAvKiBUaGUgcmVjZWl2ZWQgcGFja2V0IHdhcyB1bnByb3RlY3RlZCwgYnV0IHRoZSBhc3NvY2lhdGVkIERQVSBkZXNjcmlwdG9yIGhhZCBlbmNyeXB0aW9uIGVuYWJsZWQuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19QUk9URUNURUQsICAgICAgICAvKiBUaGUgcmVjZWl2ZWQgcGFja2V0IHdhcyBwcm90ZWN0ZWQsIGJ1dCB0aGUgYXNzb2NpYXRlZCBEUFUgZGVzY3JpcHRvciBkaWQgbm90IGhhdmUgYW4gZW5jcnlwdGlvbiBtb2RlIGVuYWJsZWQuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19CQURfUkVQTEFZLCAgICAgICAvKiBUaGUgcmVjZWl2ZWQgcGFja2V0IGZhaWxlZCByZXBsYXkgY291bnQgY2hlY2tpbmcuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19EUFVfU1RBTEwsICAgICAgICAvKiBUaGUgRFBVIHN0YWxsZWQgd2l0aCBhIHdhdGNoZG9nIHRpbWVvdXQgYW5kIHRoZSBmb3JjZWQgcGFja2V0IGNvbXBsZXRpb24gZXZlbnQgb2NjdXJyZWQuICovCiAgICBJU09DX0RQVV9GRUVEQkFDS19XQVBJX1dBSV9GUkFNRSwgICAvKiBJZiB0aGUgZW5jcnlwdGlvbiBtb2RlIGlzIFdBUEkgYW5kIHRoZSByZWNpdmVkIGZyYW1lIGlzIFdBSSAqLwp9OwoKLyoqCiogQGJyaWVmIGlzb2NfdHhfYmRfdCAtIHRoZSBmb3JtYXQgb2YgdGhlICJUWCBCRCIgKHR4IGJ1ZmZlciBkZXNjcmlwdG9yKQoqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICAvKiBieXRlIG9mZnNldCAweDAgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAogICAgLyoqCiAgICAqIChPbmx5IHVzZWQgYnkgdGhlIERQVSkgVGhpcyByb3V0aW5nIGZsYWcgaW5kaWNhdGVzIHRoZSBXUSBudW1iZXIgdG8KICAgICogd2hpY2ggdGhlIERQVSB3aWxsIHB1c2ggdGhlIGZyYW1lIGFmdGVyIGl0IGZpbmlzaGVkIHByb2Nlc3NpbmcgaXQuCiAgICAqLwogICAgQV9VSU5UMzIgZHB1X3JvdXRpbmdfZmxhZzogODsKCiAgICAvKioKICAgICogRFBVIHNpZ25hdHVyZQogICAgKiBUaGUgRFBVIHNpZ25hdHVyZSBpcyB1c2VkIGJ5IHRoZSBUeCBNQUMgSFcgZm9yIGEgc2FuaXR5IGNoZWNrCiAgICAqIHRoYXQgdGhlIHNwZWNpZmllZCBEUFUgaW5kZXggKGkuZS4gc2VjdXJpdHkga2V5IElEKSBpcyB2YWxpZC4KICAgICovCiAgICBBX1VJTlQzMiBkcHVfc2lnbmF0dXJlOiAzOwoKICAgIC8qKiBSZXNlcnZlZCAgKi8KICAgIEFfVUlOVDMyIHJlc2VydmVkMDoyOwoKICAgIC8qKiBTZXQgdG8gJzEnIHRvIHRlcm1pbmF0ZSB0aGUgY3VycmVudCBBTVBEVSBzZXNzaW9uLiBBZGRlZCBiYXNlZCBvbiB0aGUKICAgIHJlcXVlc3QgZm9yIFdpRmkgRGlzcGxheSAqLwogICAgQV9VSU5UMzIgdGVybWluYXRlX2FtcGR1OjE7CgogICAgLyoqIEJzc2lkIGluZGV4IHRvIGluZGljYXRlIEFEVSB0byB1c2Ugd2hpY2ggb2YgdGhlIDQgZGVmYXVsdCBNQUMgYWRkcmVzcwogICAgdG8gdXNlIHdoaWxlIDgwMi4zIHRvIDgwMi4xMSB0cmFuc2xhdGlvbiBpbiBjYXNlIHNlYXJjaCBpbiBBRFUgVU1BIHRhYmxlCiAgICBmYWlscy4gVGhlIGRlZmF1bHQgTUFDIGFkZHJlc3Mgc2hvdWxkIGJlIGFwcHJvcHJpYXRlbHkgcHJvZ3JhbW1lZCBpbiB0aGUKICAgIHVtYV90eF9kZWZhdWx0X3dtYWNhZGRyX3UoXzEsXzIsXzMpIGFuZCB1bWFfdHhfZGVmYXVsdF93bWFjYWRkcl9sKF8xLF8yLF8zKQogICAgIHJlZ2lzdGVycyAqLwogICAgQV9VSU5UMzIgdW1hX2Jzc2lkX2lkeDoyOwoKICAgIC8qKiBTZXQgdG8gMSB0byBlbmFibGUgdW1hIGZpbGxpbmcgdGhlIEJEIHdoZW4gRlQgaXMgbm90IGVuYWJsZWQuCiAgICBJZ25vcmVkIHdoZW4gRlQgaXMgZW5hYmxlZC4gKi8KICAgIEFfVUlOVDMyIHVtYV9iZF9lbmFibGU6MTsKCiAgICAvKiogKE9ubHkgdXNlZCBieSB0aGUgQ1NVKQogICAgMDogTm8gYWN0aW9uCiAgICAxOiBIb3N0IHdpbGwgaW5kaWNhdGUgVENQL1VQRCBoZWFkZXIgc3RhcnQgbG9jYXRpb24gYW5kIHByb3ZpZGUgcHNldWRvIGhlYWRlciB2YWx1ZSBpbiBCRC4KICAgICovCiAgICBBX1VJTlQzMiBjc3Vfc3dfbW9kZToxOwoKICAgIC8qKiBFbmFibGUvRGlzYWJsZSBDU1Ugb24gVFggZGlyZWN0aW9uLgogICAgMDogRGlzYWJsZSBDaGVja3N1bSBVbml0IChDU1UpIGZvciBUcmFuc21pdC4KICAgIDE6IEVuYWJsZQogICAgKi8KICAgIEFfVUlOVDMyIGNzdV90eF9lbmFibGU6MTsKCiAgICAvKiogRW5hYmxlL0Rpc2FibGUgVHJhbnNwb3J0IGxheWVyIENoZWNrc3VtIGluIENTVQogICAgMDogRGlzYWJsZSBUQ1AgVURQIGNoZWNrc3VtIGdlbmVyYXRpb24gZm9yIFRYLgogICAgMTogRW5hYmxlIFRDUCBVRFAgY2hlY2tzdW0gZ2VuZXJhdGlvbiBmb3IgVFguCiAgICAqLwogICAgQV9VSU5UMzIgY3N1X2VuYWJsZV90bF9jaGVja3N1bToxOwoKICAgIC8qKiBFbmFibGUvRGlzYWJsZSBJUCBsYXllciBDaGVja3N1bSBpbiBDU1UKICAgIDA6IERpc2FibGUgSVB2NC9JUHY2IGNoZWNrc3VtIGdlbmVyYXRpb24gZm9yIFRYCiAgICAxOiBFbmFibGUgIElQdjQvSVB2NiBjaGVja3N1bSBnZW5lcmF0aW9uIGZvciBUWAogICAgKi8KICAgIEFfVUlOVDMyIGNzdV9lbmFibGVfaXBfY2hlY2tzdW06MTsKCiAgICAvKiogRmlsbGVkIGJ5IENTVSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRyYW5zcG9ydCBsYXllciBDaGVja3N1bSBpcyBnZW5lcmF0ZWQgYnkgQ1NVIG9yIG5vdAogICAgMDogVENQL1VEUCBjaGVja3N1bSBpcyBiZWluZyBnZW5lcmF0ZWQgZm9yIFRYLgogICAgMTogVENQL1VEUCBjaGVja3N1bSBpcyBOT1QgYmVpbmcgZ2VuZXJhdGVkIGZvciBUWC4KICAgICAqLwogICAgQV9VSU5UMzIgY3N1X3RsX2NoZWNrc3VtX2dlbmVyYXRlZDoxOwoKICAgIC8qKiBGaWxsZWQgYnkgQ1NVIGluIGVycm9yIHNjZW5hcmlvCiAgICAxOiBObyB2YWxpZCBoZWFkZXIgZm91bmQgZHVyaW5nIHBhcnNpbmcuIFRoZXJlZm9yZSBubyBjaGVja3N1bSB3YXMgdmFsaWRhdGVkLgogICAgMDogVmFsaWQgaGVhZGVyIGZvdW5kCiAgICAqLwogICAgQV9VSU5UMzIgY3N1X25vX3ZhbGlkX2hlYWRlcjoxOwoKICAgIC8qKgogICAgKiBSb2J1c3QgTWFuYWdlbWVudCBGcmFtZXMKICAgICogVGhpcyBiaXQgaW5kaWNhdGVzIHRvIERQVSB0aGF0IHRoZSBwYWNrZXQgaXMgYSByb2J1c3QgbWFuYWdlbWVudAogICAgKiBmcmFtZSB3aGljaCByZXF1aXJlcyBlbmNyeXB0aW9uICh0aGlzIGJpdCBpcyBvbmx5IHZhbGlkIGZvcgogICAgKiBjZXJ0YWluIG1hbmFnZW1lbnQgZnJhbWVzKQogICAgKiAxIC0gTmVlZHMgZW5jcnlwdGlvbgogICAgKiAwIC0gTm8gZW5jcnl0aW9uIHJlcXVpcmVkCiAgICAqIEl0IGlzIG9ubHkgc2V0IHdoZW4gUHJpdmFjeSBiaXQ9MSBBTkQgdHlwZS9zdWJ0eXBlPURlYXV0aCwgQWN0aW9uLAogICAgKiBEaXNhc3NvYy4gT3RoZXJ3aXNlIGl0IHNob3VsZCBhbHdheXMgYmUgMC4KICAgICovCiAgICBBX1VJTlQzMiByb2J1c3RfbWdtdDogMTsKCiAgICAvKioKICAgICogVGhpcyAxLWJpdCBmaWVsZCBpbmRpY2F0ZXMgdG8gRFBVIFVuaWNhc3QvQkMvTUMgcGFja2V0CiAgICAqIDAgLSBVbmljYXN0IHBhY2tldAogICAgKiAxIC0gQnJvYWRjYXN0L011bHRpY2FzdCBwYWNrZXQKICAgICogVGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBSTUYgYml0IGlzIHNldAogICAgKi8KICAgIEFfVUlOVDMyIG5vdF91bmljYXN0OiAxOwoKICAgIEFfVUlOVDMyIHJlc2VydmVkMTogMTsKCiAgICAvKioKICAgICogVGhpcyBiaXQgaW5kaWNhdGVzIFRQRSBoYXMgdG8gYXNzZXJ0IHRoZSBUWCBjb21wbGV0ZSBpbnRlcnJ1cHQuCiAgICAqIDAgLSBubyBpbnRlcnJ1cHQKICAgICogMSAtIGdlbmVyYXRlIGludGVycnVwdCAqLwogICAgQV9VSU5UMzIgdHhfY29tcGxldGVfaW50cjogMTsKCiAgICBBX1VJTlQzMiBmd190eF9jb21wbGV0ZV9pbnRyOiAxOwoKICAgIC8qKgogICAgKiBObyBlbmNyeXB0aW9uL2RlY3J5cHRpb24KICAgICogMDogTm8gYWN0aW9uCiAgICAqIDE6IERQVSB3aWxsIG5vdCBlbmNyeXB0L2RlY3J5cHQgdGhlIGZyYW1lLCBhbmQgZGlzY2FyZCBhbnkgZW5jcnlwdGlvbgogICAgKiByZWxhdGVkIHNldHRpbmdzIGluIHRoZSBQRFUgZGVzY3JpcHRvci4KICAgICogKE9ubHkgdXNlZCBieSB0aGUgRFBVKQogICAgKi8KICAgIEFfVUlOVDMyIGRwdV9ub19lbmNyeXB0OiAxOwoKICAgIC8qKgogICAgKiBUaGlzIGJpdCBpbmRpY2F0ZXMgdG8gQURVL1VNQSBtb2R1bGUgdGhhdCB0aGUgcGFja2V0IHJlcXVpcmVzIDgwMi4xMW4KICAgICogdG8gODAyLjMgZnJhbWUgdHJhbnNsYXRpb24uIFdoZW4gdXNlZCBieSBBRFUKICAgICogMCAtIE5vIGZyYW1lIHRyYW5zbGF0aW9uIHJlcXVpcmVkCiAgICAqIDEgLSBGcmFtZSBUcmFuc2xhdGlvbiByZXF1aXJlZAogICAgKi8KICAgIEFfVUlOVDMyIGZyYW1lX3RyYW5zbGF0ZTogMTsKCiAgICAvKioKICAgICogQkQgVHlwZQogICAgKiAwMDogJ0dlbmVyaWMgQkQnLCBhcyBpbmRpY3RlZCBhYm92ZQogICAgKiAwMTogRGUtZnJhZ21lbnRhdGlvbiBmb3JtYXQKICAgICogMTAtMTE6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgogICAgKi8KICAgIEFfVUlOVDMyIGJkX3R5cGU6IDI7CiNlbHNlCiAgICBBX1VJTlQzMiBiZF90eXBlOiAgICAgICAgICAgICAgIDI7CiAgICBBX1VJTlQzMiBmcmFtZV90cmFuc2xhdGU6ICAgICAgIDE7CiAgICBBX1VJTlQzMiBkcHVfbm9fZW5jcnlwdDogICAgICAgIDE7CiAgICBBX1VJTlQzMiBmd190eF9jb21wbGV0ZV9pbnRyOiAgIDE7CiAgICBBX1VJTlQzMiB0eF9jb21wbGV0ZV9pbnRyOiAgICAgIDE7CiAgICBBX1VJTlQzMiByZXNlcnZlZDE6ICAgICAgICAgICAgIDE7CiAgICBBX1VJTlQzMiBub3RfdW5pY2FzdDogICAgICAgICAgIDE7CiAgICBBX1VJTlQzMiByb2J1c3RfbWdtdDogICAgICAgICAgIDE7CgogICAgQV9VSU5UMzIgY3N1X25vX3ZhbGlkX2hlYWRlcjoxOwogICAgQV9VSU5UMzIgY3N1X3RsX2NoZWNrc3VtX2dlbmVyYXRlZDoxOwogICAgQV9VSU5UMzIgY3N1X2VuYWJsZV9pcF9jaGVja3N1bToxOwogICAgQV9VSU5UMzIgY3N1X2VuYWJsZV90bF9jaGVja3N1bToxOwogICAgQV9VSU5UMzIgY3N1X3R4X2VuYWJsZToxOwogICAgQV9VSU5UMzIgY3N1X3N3X21vZGU6MTsKICAgIEFfVUlOVDMyIHVtYV9iZF9lbmFibGU6MTsKICAgIEFfVUlOVDMyIHVtYV9ic3NpZF9pZHg6MjsKICAgIEFfVUlOVDMyIHRlcm1pbmF0ZV9hbXBkdToxOwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQwOjI7CgogICAgQV9VSU5UMzIgZHB1X3NpZ25hdHVyZTogICAgICAgICAzOwogICAgQV9VSU5UMzIgZHB1X3JvdXRpbmdfZmxhZzogICAgICA4OwojZW5kaWYKCiAgICAvKiBieXRlIG9mZnNldCAweDQgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAogICAgQV9VSU5UMzIgcmVzZXJ2ZWQyOiAgICAxNjsgLyogTVVTVCBCRSAwIG90aGVyd2lzZSB0cmlnZ2VycyBCTVUgZXJyb3IqLwogICAgQV9VSU5UMzIgYWR1X2ZlZWRiYWNrOiAgODsKICAgIC8qIERQVSBmZWVkYmFjayBpbiBUeCBwYXRoLiovCiAgICBBX1VJTlQzMiBkcHVfZmVlZGJhY2s6ICA4OwoKI2Vsc2UKICAgIEFfVUlOVDMyIGRwdV9mZWVkYmFjazogIDg7CiAgICBBX1VJTlQzMiBhZHVfZmVlZGJhY2s6ICA4OwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQyOiAgICAxNjsKI2VuZGlmCgogICAgLyogYnl0ZSBvZmZzZXQgMHg4ICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKICAgIC8qKgogICAgKiBoZWFkIFBEVSBpbmRleAogICAgKiBJdCBpcyBpbml0aWFsbHkgZmlsbGVkIGJ5IERYRSB0aGVuIGlmIGVuY3J5cHRpb24gaXMgb24sCiAgICAqIHRoZW4gRFBVIHdpbGwgb3ZlcndyaXRlIHRoZXNlIGZpZWxkcy4KICAgICogSW4gY2FzZSBQRFVzIGFyZSBsaW5rZWQgdG8gdGhlIEJELCB0aGlzIGZpZWxkIGluZGljYXRlcwogICAgKiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IFBEVSBsaW5rZWQgdG8gdGhlIEJELgogICAgKiBXaGVuIFBEVSBjb3VudCBpcyB6ZXJvLCB0aGlzIGZpZWxkIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUuCiAgICAqLwogICAgQV9VSU5UMzIgaGVhZF9wZHVfaWR4OiAxNjsKCiAgICAvKioKICAgICogaGVhZCBQRFUgaW5kZXgKICAgICogSXQgaXMgaW5pdGlhbGx5IGZpbGxlZCBieSBEWEUgdGhlbiBpZiBlbmNyeXB0aW9uIGlzIG9uLAogICAgKiB0aGVuIERQVSB3aWxsIG92ZXJ3cml0ZSB0aGVzZSBmaWVsZHMuCiAgICAqIEluIGNhc2UgUERVcyBhcmUgbGlua2VkIHRvIHRoZSBCRCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMKICAgICogdGhlIGluZGV4IG9mIHRoZSBsYXN0IFBEVS4KICAgICogV2hlbiBQRFUgY291bnQgaXMgemVybywgdGhpcyBmaWVsZCBoYXMgYW4gdW5kZWZpbmVkIHZhbHVlLgogICAgKi8KICAgIEFfVUlOVDMyIHRhaWxfcGR1X2lkeDogMTY7CiNlbHNlCiAgICBBX1VJTlQzMiB0YWlsX3BkdV9pZHg6IDE2OwogICAgQV9VSU5UMzIgaGVhZF9wZHVfaWR4OiAxNjsKI2VuZGlmCgogICAgLyogYnl0ZSBvZmZzZXQgMHhjICovCiNpZmRlZiBCSUdfRU5ESUFOX0hPU1QKICAgIC8qKgogICAgKiBUaGUgbGVuZ3RoIChpbiBudW1iZXIgb2YgYnl0ZXMpIG9mIHRoZSBNUERVIGhlYWRlci4KICAgICogTGltaXRhdGlvbjogVGhlIE1QRFUgaGVhZGVyIG9mZnNldCArIE1QRFUgaGVhZGVyIGxlbmd0aAogICAgKiBjYW4gbmV2ZXIgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpcnN0IFBEVQogICAgKi8KICAgIEFfVUlOVDMyIG1wZHVfaGVhZGVyX2xlbmd0aDogODsKCiAgICAvKioKICAgICogVGhlIHN0YXJ0IGJ5dGUgbnVtYmVyIG9mIHRoZSBNUERVIGhlYWRlci4KICAgICogVGhlIGJ5dGUgbnVtYmVyaW5nIGlzIGRvbmUgaW4gdGhlIEJFIGZvcm1hdC4KICAgICogV29yZCAweDAsIGJpdHMgWzMxOjI0XSBoYXMgYnl0ZSBpbmRleCAwLgogICAgKi8KICAgIEFfVUlOVDMyIG1wZHVfaGVhZGVyX29mZnNldDogODsKCiAgICAvKioKICAgICogVGhlIHN0YXJ0IGJ5dGUgbnVtYmVyIG9mIHRoZSBNUERVIGRhdGEuCiAgICAqIFRoZSBieXRlIG51bWJlcmluZyBpcyBkb25lIGluIHRoZSBCRSBmb3JtYXQuCiAgICAqIFdvcmQgMHgwLCBiaXRzIFszMToyNF0gaGFzIGJ5dGUgaW5kZXggMC4KICAgICogTm90ZSB0aGF0IHRoaXMgb2Zmc2V0IGNhbiBwb2ludCBhbGwgdGhlIHdheSBpbnRvIHRoZQogICAgKiBmaXJzdCBsaW5rZWQgUERVLgogICAgKiBMaW1pdGF0aW9uOiBNUERVIERBVEEgT0ZGU0VUIGNhbiBub3QgcG9pbnQgaW50byB0aGUKICAgICogMm5kIGxpbmtlZCBQRFUKICAgICovCiAgICBBX1VJTlQzMiBtcGR1X2RhdGFfb2Zmc2V0OiA5OwoKICAgIC8qKgogICAgKiBQRFUgY291bnQKICAgICogSXQgaXMgaW5pdGlhbGx5IGZpbGxlZCBieSBEWEUgdGhlbiBpZiBlbmNyeXB0aW9uIGlzIG9uLAogICAgKiBEUFUgd2lsbCBvdmVyd3JpdGUgdGhlc2UgZmllbGRzLgogICAgKiBUaGUgbnVtYmVyIG9mIFBEVXMgbGlua2VkIHRvIHRoZSBCRC4KICAgICogVGhpcyBmaWVsZCBzaG91bGQgYWx3YXlzIGluZGljYXRlIHRoZSBjb3JyZWN0IGFtb3VudC4KICAgICovCiAgICBBX1VJTlQzMiBwZHVfY291bnQ6ICAgICAgICAgIDc7CiNlbHNlCiAgICBBX1VJTlQzMiBwZHVfY291bnQ6ICAgICAgICAgIDc7CiAgICBBX1VJTlQzMiBtcGR1X2RhdGFfb2Zmc2V0OiAgIDk7CiAgICBBX1VJTlQzMiBtcGR1X2hlYWRlcl9vZmZzZXQ6IDg7CiAgICBBX1VJTlQzMiBtcGR1X2hlYWRlcl9sZW5ndGg6IDg7CiNlbmRpZgoKICAgIC8qIGJ5dGUgb2Zmc2V0IDB4MTAgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAogICAgLyoqCiAgICAqIFRoaXMgY292ZXJzIE1QRFUgaGVhZGVyIGxlbmd0aCArIE1QRFUgZGF0YSBsZW5ndGguCiAgICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBGQ1MuCiAgICAqIEZvciBzaW5nbGUgZnJhbWUgdHJhbnNtaXNzaW9uLCBQU0RVIHNpemUgaXMgbXBkdV9sZW5ndGggKyA0LgogICAgKi8KICAgIEFfVUlOVDMyIG1wZHVfbGVuZ3RoOiAxNjsKCiAgICBBX1VJTlQzMiByZXNlcnZlZDM6IDI7CgogICAgLyoqCiAgICAqIFNlcXVlbmNlIG51bWJlciBpbnNlcnRpb24gYnkgRFBVCiAgICAqIDAwOiBMZWF2ZSBzZXF1ZW5jZSBudW1iZXIgYXMgaXMsIGFzIGZpbGxlZCBieSBob3N0CiAgICAqIDAxOiBEUFUgdG8gaW5zZXJ0IG5vbiBUSUQgYmFzZWQgc2VxdWVuY2UgbnVtYmVyCiAgICAqICAgICAoSWYgbm90IFRJRCBiYXNlZCwgdGhlbiBob3cgZG9lcyBEUFUga25vdyB3aGF0IHNlcSB0byBmaWxsPwogICAgKiAgICAgSXMgdGhpcyB0aGUgbm9uLVFvcy9NZ210IHNlcXVlbmNlIG51bWJlcj8pCiAgICAqIDEwOiBEUFUgdG8gaW5zZXJ0IGEgc2VxdWVuY2UgbnVtYmVyIGJhc2VkIG9uIFRJRC4KICAgICogMTE6IFJlc2VydmVkCiAgICAqLwogICAgQV9VSU5UMzIgYmRfc2VxX251bV9zcmM6MjsKCiAgICAvKioKICAgICogVHJhZmZpYyBJZGVudGlmaWVyCiAgICAqIEluZGljYXRlcyB0aGUgdHJhZmZpYyBjbGFzcyB0aGUgZnJhbWUgYmVsb25ncyB0by4KICAgICogRm9yIG5vbiBRb1MgZnJhbWVzLCB0aGlzIGZpZWxkIGlzIHNldCB0byB6ZXJvLgogICAgKi8KICAgIEFfVUlOVDMyIHRpZDogNDsKCiAgICBBX1VJTlQzMiByZXNlcnZlZDQ6IDg7CiNlbHNlCiAgICBBX1VJTlQzMiByZXNlcnZlZDQ6ICAgICAgIDg7CiAgICBBX1VJTlQzMiB0aWQ6ICAgICAgICAgICAgIDQ7CiAgICBBX1VJTlQzMiBiZF9zZXFfbnVtX3NyYzogIDI7CiAgICBBX1VJTlQzMiByZXNlcnZlZDM6ICAgICAgIDI7CiAgICBBX1VJTlQzMiBtcGR1X2xlbmd0aDogICAgMTY7CiNlbmRpZgoKICAgIC8qIGJ5dGUgb2Zmc2V0IDB4MTQgKi8KI2lmZGVmIEJJR19FTkRJQU5fSE9TVAogICAgLyoqCiAgICAqIChPbmx5IHVzZWQgYnkgdGhlIERQVSkKICAgICogVGhlIERQVSBkZXNjcmlwdG9yIGluZGV4IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHdoZXJlIGluCiAgICAqIG1lbW9yeSB0aGUgRFBVIGNhbiBmaW5kIHRoZSBEUFUgZGVzY3JpcHRvciByZWxhdGVkIHRvIHRoaXMgZnJhbWUuCiAgICAqIFRoZSBEUFUgY2FsY3VsYXRlcyB0aGUgYWRkcmVzcyBieSBtdWx0aXBseWluZyB0aGlzIGluZGV4CiAgICAqIHdpdGggdGhlIERQVSBkZXNjcmlwdG9yIHNpemUgYW5kIGFkZGluZyB0aGUgRFBVIGRlc2NyaXB0b3IKICAgICogYXJyYXkncyBiYXNlIGFkZHJlc3MuCiAgICAqIFRoZSBEUFUgZGVzY3JpcHRvciBjb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZ5aW5nIHRoZSBlbmNyeXB0aW9uCiAgICAqIGFuZCBjb21wcmVzc2lvbiB0eXBlIGFuZCBjb250YWlucyByZWZlcmVuY2VzIHRvIHdoZXJlIGVuY3J5cHRpb24KICAgICoga2V5cyBjYW4gYmUgZm91bmQuCiAgICAqLwogICAgQV9VSU5UMzIgZHB1X2Rlc2NfaWR4OiA4OwoKICAgIC8qKgogICAgKiBUaGUgU1RBaWQgb2YgdGhlIFJBIGFkZHJlc3MsIGEuay5hLiBwZWVyIElECiAgICAqLwogICAgQV9VSU5UMzIgc3RhX2luZGV4OiA4OwoKICAgIC8qKgogICAgKiBBIGZpZWxkIHBhc3NlZCBvbiB0byBUUEUgd2hpY2ggaW5mbHVlbmNlcyB0aGUgQUNLIHBvbGljeQogICAgKiB0byBiZSB1c2VkIGZvciB0aGlzIGZyYW1lCiAgICAqIDAwIC0gYWNrCiAgICAqIDAxLDEwLDExIC0gTm8gQWNrCiAgICAqLwogICAgQV9VSU5UMzIgYWNrX3BvbGljeTogMjsKCiAgICAvKioKICAgICogT3ZlcndyaXRlIG9wdGlvbiBmb3IgdGhlIHRyYW5zbWl0IHJhdGUKICAgICogMDA6IFVzZSByYXRlIHByb2dyYW1tZWQgaW4gdGhlIFRQRSBTVEEgZGVzY3JpcHRvcgogICAgKiAwMTogVXNlIFRQRSBCRCByYXRlIDEKICAgICogMTA6IFVzZSBUUEUgQkQgcmF0ZSAyCiAgICAqIDExOiBEZWxheWVkIFVzZSBUUEUgQkQgcmF0ZSAzCiAgICAqLwogICAgQV9VSU5UMzIgYmRfcmF0ZTogMjsKCiAgICAvKioKICAgICogV2hpY2ggSFcgdHggcXVldWUgdGhlIGZyYW1lIHNob3VsZCBnbyBpbnRvCiAgICAqLwogICAgQV9VSU5UMzIgcXVldWVfaWQ6IDU7CgogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ1OiA3OwojZWxzZQogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ1OiAgICA3OwogICAgQV9VSU5UMzIgcXVldWVfaWQ6ICAgICA1OwogICAgQV9VSU5UMzIgYmRfcmF0ZTogICAgICAyOwogICAgQV9VSU5UMzIgYWNrX3BvbGljeTogICAyOwogICAgQV9VSU5UMzIgc3RhX2luZGV4OiAgICA4OwogICAgQV9VSU5UMzIgZHB1X2Rlc2NfaWR4OiA4OwojZW5kaWYKCiAgICAvKiBieXRlIG9mZnNldCAweDE4ICovCiAgICBBX1VJTlQzMiB0eF9iZF9zaWduYXR1cmU7CgogICAgLyogYnl0ZSBvZmZzZXQgMHgxYyAqLwogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ2OwoKICAgIC8qIGJ5dGUgb2Zmc2V0IDB4MjAgKi8KICAgIC8qIFRpbWVzdGFtcCBmaWxsZWQgYnkgRFhFLiBUaW1lc3RhbXAgZm9yIGN1cnJlbnQgdHJhbnNmZXIgKi8KICAgIEFfVUlOVDMyIGR4ZV9oMmJfc3RhcnRfdGltZXN0YW1wOwoKICAgIC8qIGJ5dGUgb2Zmc2V0IDB4MjQgKi8KICAgIC8qIFRpbWVzdGFtcCBmaWxsZWQgYnkgRFhFLiBUaW1lc3RhbXAgZm9yIHByZXZpb3VzIHRyYW5zZmVyICovCiAgICBBX1VJTlQzMiBkeGVfaDJiX2VuZF90aW1lc3RhbXA7CgojaWZkZWYgUUNBX0lTT0NfUFJPTlRPCgogICAgLyogYnl0ZSBvZmZzZXQgMHgyOCAqLwojaWZkZWYgQklHX0VORElBTl9IT1NUCiAgICAvKiogMTAgYml0IHZhbHVlIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBUQ1AgVURQIGZyYW1lIHJlbGF0aXZlIHRvCiAgICAgICAgICAgICAqIHRoZSBmaXJzdCBJUCBmcmFtZSBoZWFkZXIgKi8KICAgIEFfVUlOVDMyIGNzdV90Y3BfdWRwX3N0YXJ0X29mZnNldDoxMDsKCiAgICAvKiogMTYgYml0IHBzZXVkbyBoZWFkZXIgZm9yIFRDUCBVRFAgdXNlZCBieSBDU1UgdG8gZ2VuZXJhdGUgVENQL1VEUAogICAgICogZnJhbWUgY2hlY2tzdW0gKi8KICAgIEFfVUlOVDMyIGNzdV9wc2V1ZG9faGVhZGVyX2NoZWNrc3VtOjE2OwoKICAgIEFfVUlOVDMyIHJlc2VydmVkNzo2OwojZWxzZQogICAgQV9VSU5UMzIgcmVzZXJ2ZWQ3OjY7CiAgICBBX1VJTlQzMiBjc3VfcHNldWRvX2hlYWRlcl9jaGVja3N1bToxNjsKICAgIEFfVUlOVDMyIGNzdV90Y3BfdWRwX3N0YXJ0X29mZnNldDoxMDsKI2VuZGlmCgojZW5kaWYgLypRQ0FfSVNPQ19QUk9OVE8qLwoKfSBpc29jX3R4X2JkX3Q7CgovKioKKiBAYnJpZWYgdXRpbGl0eSBmdW5jdGlvbiB0byBzd2FwIGJ5dGVzIHdpdGhpbiBhIHNlcmllcyBvZiB1X2ludDMyX3Qgd29yZHMKKiBAZGV0YWlscwoqICBUaGlzIGZ1bmN0aW9uIHN3YXBzIGJ5dGVzIDAgPC0+IDMgYW5kIGJ5dGVzIDEgPC0+IDIgd2l0aGluIGVhY2ggNC1ieXRlCiogIHdvcmQgd2l0aGluIGEgc3BlY2lmaWVkIGFkZHJlc3MgcmFuZ2UuCiogIFRoZSBhZGRyZXNzIHJhbmdlIGlzIGFzc3VtZWQgdG8gYmUgYWxpZ25lZCB0byBhIDQtYnl0ZSBib3VuZGFyeSwgYW5kCiogIHRvIGhhdmUgYSBsZW5ndGggdGhhdCBpcyBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCiogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGVuZGlhbm5lc3MgY29ycmVjdGlvbiAtIGFmdGVyIHN3YXBwaW5nCiogIHRoZSBieXRlcyB3aXRoaW4gYSA0LWJ5dGUgd29yZCwgdGhlIG5hdGl2ZSB1X2ludDMyX3QgdmFsdWUgd2lsbCBoYXZlCiogIGJpdGZpZWxkcyB3aXRoaW4gdGhlIHVfaW50MzJfdCB3b3JkIGluIHRoZSBleHBlY3RlZCBwb3NpdGlvbnMuCiogIEZvciBleGFtcGxlLCBpZiBhIHN0cnVjdHVyZSB0aGF0IGlzIGluaXRpYWxseSBzdG9yZWQgaW4gYmlnLWVuZGlhbgoqICBmb3JtYXQgbmVlZHMgdG8gYmUgaW50ZXJwcmV0ZWQgaW4gYSBsaXR0bGUtZW5kaWFuIHByb2Nlc3NvcjoKKgoqICBvcmlnaW5hbCAzMi1iaXQgd29yZDoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IG51bWJlcgoqICAgMzEgICAgICAgICAgMjQgMjMgICAgICAgICAgICAxNiAxNSAgICAgICAgICAgICA4IDcgICAgICAgICAgICAgMAoqICB8LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLXwKKiAgfCAgICAgIEMgICAgICAgfCAgICAgICBCICAgICAgICB8ICAgICAgIEFfaGkgICAgIHwgICAgICBBX2xvICAgICB8CiogIHwtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tfAoqCiogIHN0b3JlZCBpbgoqICBiaWctZW5kaWFuIGZvcm1hdDoKKiAgYnl0ZSAgIGNvbnRlbnRzCiogICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rCiogICAgIDAgfCAgICBDICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICBBX2xvICB8CiogICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rCiogICAgIDEgfCAgICBCICAgIHwgICAgYnl0ZS1zd2FwcGVkICAgIHwgICBBX2hpICB8CiogICAgICAgKy0tLS0tLS0tLSsgID09PT09PT09PT09PT09PT0+ICstLS0tLS0tLS0rCiogICAgIDIgfCAgIEFfaGkgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgQiAgICB8CiogICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rCiogICAgIDMgfCAgIEFfbG8gIHwgICAgICAgICAgICAgICAgICAgIHwgICAgQyAgICB8CiogICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rCioKKiBieXRlLXN3YXBwZWQgdmFsdWVzIHJlYWQgaW50byBhIDMyLWJpdCB3b3JkIG9uIGEgbGl0dGxlLWVuZGlhbiBwcm9jZXNzb3I6CiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCBudW1iZXIKKiAgIDMxICAgICAgICAgIDI0IDIzICAgICAgICAgICAgMTYgMTUgICAgICAgICAgICAgOCA3ICAgICAgICAgICAgIDAKKiAgfC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS18CiogIHwgICAgICBDICAgICAgIHwgICAgICAgQiAgICAgICAgfCAgICAgICBBX2hpICAgICB8ICAgICAgQV9sbyAgICAgfAoqICB8LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLXwKKi8Kc3RhdGljIGlubGluZSB2b2lkCiAgICBpc29jX2h3X2JkX3N3YXBfYnl0ZXMzMihjaGFyICphZGRyLCBpbnQgYnl0ZXMpCnsKICAgIHVfaW50MzJfdCAqcDMyID0gKHVfaW50MzJfdCAqKSBhZGRyOwogICAgaW50IGksIG51bV93b3JkczMyOwoKICAgIC8qIGNvbmZpcm0gdGhhdCB0aGUgYWRkcmVzcyByYW5nZSBoYXMgdGhlIGV4cGVjdGVkIGFsaWdubWVudCAqLwogICAgYWRmX29zX2Fzc2VydCgoKCh1bnNpZ25lZCkgYWRkcikgJiAweDMpID09IDApOwogICAgLyogY29uZmlybSB0aGF0IHRoZSBhZGRyZXNzIHJhbmdlIGhhcyB0aGUgZXhwZWN0ZWQgbGVuZ3RoIHF1YW50dW0gKi8KICAgIGFkZl9vc19hc3NlcnQoKGJ5dGVzICYgMHgzKSA9PSAwKTsKCiAgICBudW1fd29yZHMzMiA9IGJ5dGVzID4+IDI7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dvcmRzMzI7IGkrKywgcDMyKyspIHsKICAgICAgICB1X2ludDMyX3Qgd29yZCA9ICpwMzI7CiAgICAgICAgKnAzMiA9CiAgICAgICAgICAgICgod29yZCAmIDB4MDAwMDAwZmYpIDw8IDI0KSB8IC8qIG1vdmUgYnl0ZSAwIC0tPiBieXRlIDMgKi8KICAgICAgICAgICAgKCh3b3JkICYgMHgwMDAwZmYwMCkgPDwgIDgpIHwgLyogbW92ZSBieXRlIDEgLS0+IGJ5dGUgMiAqLwogICAgICAgICAgICAoKHdvcmQgJiAweDAwZmYwMDAwKSA+PiAgOCkgfCAvKiBtb3ZlIGJ5dGUgMiAtLT4gYnl0ZSAxICovCiAgICAgICAgICAgICgod29yZCAmIDB4ZmYwMDAwMDApID4+IDI0KTsgIC8qIG1vdmUgYnl0ZSAzIC0tPiBieXRlIDAgKi8KICAgIH0KfQoKc3RhdGljIGlubGluZSB2b2lkCiAgICBpc29jX3R4X2JkX2R1bXAoaXNvY190eF9iZF90ICp0eF9iZCkKewogICAgY2hhciAqcDsKICAgIGludCBpOwoKICAgIGFkZl9vc19wcmludCgiVHggQkQgKCVwSylcbiIsIHR4X2JkKTsKCiAgICBhZGZfb3NfcHJpbnQoInN0cnVjdHVyZWQgdmlldzpcbiIpOwogICAgYWRmX29zX3ByaW50KCIgIEJEIHR5cGU6ICVkXG4iLCB0eF9iZC0+YmRfdHlwZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgZnJhbWUgdHJhbnNsYXRlOiAlZFxuIiwgdHhfYmQtPmZyYW1lX3RyYW5zbGF0ZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgRFBVIG5vLWVuY3J5cHQ6ICVkXG4iLCB0eF9iZC0+ZHB1X25vX2VuY3J5cHQpOwogICAgYWRmX29zX3ByaW50KCIgIEZXIHR4IGNvbXBsZXRlIGludHI6ICVkXG4iLCB0eF9iZC0+ZndfdHhfY29tcGxldGVfaW50cik7CiAgICBhZGZfb3NfcHJpbnQoIiAgdHggY29tcGxldGUgaW50cjogJWRcbiIsIHR4X2JkLT50eF9jb21wbGV0ZV9pbnRyKTsKICAgIGFkZl9vc19wcmludCgiICBub3QgdW5pY2FzdDogJWRcbiIsIHR4X2JkLT5ub3RfdW5pY2FzdCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgcm9idXN0IG1nbXQ6ICVkXG4iLCB0eF9iZC0+cm9idXN0X21nbXQpOwogICAgYWRmX29zX3ByaW50KCIgIERQVSBzaWduYXR1cmU6ICVkXG4iLCB0eF9iZC0+ZHB1X3NpZ25hdHVyZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgRFBVIHJvdXRpbmcgZmxhZzogJWRcbiIsIHR4X2JkLT5kcHVfcm91dGluZ19mbGFnKTsKICAgIGFkZl9vc19wcmludCgiICBEUFUgZmVlZGJhY2s6ICUjeFxuIiwgdHhfYmQtPmRwdV9mZWVkYmFjayk7CiAgICBhZGZfb3NfcHJpbnQoIiAgQURVIGZlZWRiYWNrOiAlI3hcbiIsIHR4X2JkLT5hZHVfZmVlZGJhY2spOwogICAgYWRmX29zX3ByaW50KCIgIHRhaWwgUERVIGlkeDogJWRcbiIsIHR4X2JkLT50YWlsX3BkdV9pZHgpOwogICAgYWRmX29zX3ByaW50KCIgIGhlYWQgUERVIGlkeDogJWRcbiIsIHR4X2JkLT5oZWFkX3BkdV9pZHgpOwogICAgYWRmX29zX3ByaW50KCIgIFBEVSBjb3VudDogJWRcbiIsIHR4X2JkLT5wZHVfY291bnQpOwogICAgYWRmX29zX3ByaW50KCIgIE1QRFUgZGF0YSBvZmZzZXQ6ICVkXG4iLCB0eF9iZC0+bXBkdV9kYXRhX29mZnNldCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgTVBEVSBoZWFkZXIgb2Zmc2V0OiAlZFxuIiwgdHhfYmQtPm1wZHVfaGVhZGVyX29mZnNldCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgTVBEVSBoZWFkZXIgbGVuZ3RoOiAlZFxuIiwgdHhfYmQtPm1wZHVfaGVhZGVyX2xlbmd0aCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgVElEOiAlZFxuIiwgdHhfYmQtPnRpZCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgQkQgc2VxIG51bSBzcmM6ICVkXG4iLCB0eF9iZC0+YmRfc2VxX251bV9zcmMpOwogICAgYWRmX29zX3ByaW50KCIgIE1QRFUgbGVuZ3RoOiAlZFxuIiwgdHhfYmQtPm1wZHVfbGVuZ3RoKTsKICAgIGFkZl9vc19wcmludCgiICBxdWV1ZSBJRDogJWRcbiIsIHR4X2JkLT5xdWV1ZV9pZCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgQkQgcmF0ZTogJWRcbiIsIHR4X2JkLT5iZF9yYXRlKTsKICAgIGFkZl9vc19wcmludCgiICBhY2sgcG9saWN5OiAlZFxuIiwgdHhfYmQtPmFja19wb2xpY3kpOwogICAgYWRmX29zX3ByaW50KCIgIFNUQSBpbmRleDogJWRcbiIsIHR4X2JkLT5zdGFfaW5kZXgpOwogICAgYWRmX29zX3ByaW50KCIgIERQVSBkZXNjIGlkeDogJWRcbiIsIHR4X2JkLT5kcHVfZGVzY19pZHgpOwogICAgYWRmX29zX3ByaW50KCIgIFR4IEJEIHNpZ25hdHVyZTogJWRcbiIsIHR4X2JkLT50eF9iZF9zaWduYXR1cmUpOwogICAgYWRmX29zX3ByaW50KCIgIERYRSBzdGFydCB0aW1lc3RhbXA6ICVkXG4iLCB0eF9iZC0+ZHhlX2gyYl9zdGFydF90aW1lc3RhbXApOwogICAgYWRmX29zX3ByaW50KCIgIERYRSBlbmQgdGltZXN0YW1wOiAlZFxuIiwgdHhfYmQtPmR4ZV9oMmJfZW5kX3RpbWVzdGFtcCk7CgogICAgYWRmX29zX3ByaW50KCJyYXcgdmlldzpcbiAgIik7CiAgICBwID0gKGNoYXIgKikgdHhfYmQ7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCp0eF9iZCk7IGkrKywgcCsrKSB7CiAgICAgICAgYWRmX29zX3ByaW50KCIlIzAyeCAiLCAqcCk7CiAgICAgICAgaWYgKChpKzEpICUgOCA9PSAwKSB7CiAgICAgICAgICAgIGFkZl9vc19wcmludCgiXG4gICIpOwogICAgICAgIH0KICAgIH0KICAgIGFkZl9vc19wcmludCgiXG4iKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCiAgICBpc29jX3J4X2JkX2R1bXAoaXNvY19yeF9iZF90ICpyeF9iZCkKewogICAgY2hhciAqcDsKICAgIGludCBpOwoKICAgIGFkZl9vc19wcmludCgiUnggQkQgKCVwSylcbiIsIHJ4X2JkKTsKCiAgICBhZGZfb3NfcHJpbnQoInN0cnVjdHVyZWQgdmlldzpcbiIpOwogICAgYWRmX29zX3ByaW50KCIgIEJEIHR5cGU6ICVkXG4iLCByeF9iZC0+YmRfdHlwZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgZnJhbWUgdHJhbnNsYXRlOiAlZFxuIiwgcnhfYmQtPmZyYW1lX3RyYW5zbGF0ZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgRFBVIG5vLWVuY3J5cHQ6ICVkXG4iLCByeF9iZC0+ZHB1X25vX2VuY3J5cHQpOwogICAgYWRmX29zX3ByaW50KCIgIG5vdCB1bmljYXN0OiAlZFxuIiwgcnhfYmQtPm5vdF91bmljYXN0KTsKICAgIGFkZl9vc19wcmludCgiICByb2J1c3QgbWdtdDogJWRcbiIsIHJ4X2JkLT5yb2J1c3RfbWdtdCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgTExDIHJlbW92ZWQ6ICVkXG4iLCByeF9iZC0+bGxjX3JlbW92ZWQpOwogICAgYWRmX29zX3ByaW50KCIgIERQVSBzaWduYXR1cmU6ICVkXG4iLCByeF9iZC0+ZHB1X3NpZ25hdHVyZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgRFBVIHJvdXRpbmcgZmxhZzogJWRcbiIsIHJ4X2JkLT5kcHVfcm91dGluZ19mbGFnKTsKICAgIGFkZl9vc19wcmludCgiICBhZGRyMSBpbmRleDogJWRcbiIsIHJ4X2JkLT5hZGRyMV9pbmRleCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgYWRkcjIgaW5kZXggaW52YWxpZDogJWRcbiIsIHJ4X2JkLT5hZGRyMl9pbnZhbGlkKTsKICAgIGFkZl9vc19wcmludCgiICBhZGRyMiBpbmRleDogJWRcbiIsIHJ4X2JkLT5hZGRyMl9pbmRleCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgYWRkcjMgaW5kZXg6ICVkXG4iLCByeF9iZC0+YWRkcjNfaW5kZXgpOwogICAgYWRmX29zX3ByaW50KCIgIERQVSBmZWVkYmFjazogJSN4XG4iLCByeF9iZC0+ZHB1X2ZlZWRiYWNrKTsKICAgIGFkZl9vc19wcmludCgiICBBRFUgZmVlZGJhY2s6ICUjeFxuIiwgcnhfYmQtPmFkdV9mZWVkYmFjayk7CiAgICBhZGZfb3NfcHJpbnQoIiAgdGFpbCBQRFUgaWR4OiAlZFxuIiwgcnhfYmQtPnRhaWxfcGR1X2lkeCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgaGVhZCBQRFUgaWR4OiAlZFxuIiwgcnhfYmQtPmhlYWRfcGR1X2lkeCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgUERVIGNvdW50OiAlZFxuIiwgcnhfYmQtPnBkdV9jb3VudCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgTVBEVSBkYXRhIG9mZnNldDogJWRcbiIsIHJ4X2JkLT5tcGR1X2RhdGFfb2Zmc2V0KTsKICAgIGFkZl9vc19wcmludCgiICBNUERVIGhlYWRlciBvZmZzZXQ6ICVkXG4iLCByeF9iZC0+bXBkdV9oZWFkZXJfb2Zmc2V0KTsKICAgIGFkZl9vc19wcmludCgiICBNUERVIGhlYWRlciBsZW5ndGg6ICVkXG4iLCByeF9iZC0+bXBkdV9oZWFkZXJfbGVuZ3RoKTsKICAgIGFkZl9vc19wcmludCgiICBUSUQ6ICVkXG4iLCByeF9iZC0+dGlkKTsKICAgIGFkZl9vc19wcmludCgiICBNUERVIGxlbmd0aDogJWRcbiIsIHJ4X2JkLT5tcGR1X2xlbmd0aCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgRFBVIGRlc2MgaWR4OiAlZFxuIiwgcnhfYmQtPmRwdV9kZXNjX2lkeCk7CiAgICBhZGZfb3NfcHJpbnQoIiAgSFRUIFQySCBNc2c6ICVkXG4iLCByeF9iZC0+aHR0X3QyaF9tc2cpOwogICAgYWRmX29zX3ByaW50KCIgIEZsb3cgQ29udHJvbDogJWRcbiIsIHJ4X2JkLT5mbG93X2NvbnRyb2wpOwogICAgYWRmX29zX3ByaW50KCIgIEN1cnJlbnQgUGt0IFNlcXVlbmNlIE5vOiAlZFxuIiwgcnhfYmQtPmN1cnJlbnRfcGt0X3NlcW5vKTsKICAgIGFkZl9vc19wcmludCgiICBFeHBlY3RlZCBQa3QgU2VxdWVuY2UgTm86ICVkXG4iLCByeF9iZC0+ZXhwZWN0ZWRfcGt0X3NlcW5vKTsKICAgIGFkZl9vc19wcmludCgiICBmcmFtZSBzdWJ0eXBlOiAlZFxuIiwgcnhfYmQtPmZyYW1lX3R5cGVfc3VidHlwZSk7CiAgICBhZGZfb3NfcHJpbnQoIiAgUlNTSTA6ICVkXG4iLCByeF9iZC0+cnNzaTApOwogICAgYWRmX29zX3ByaW50KCIgIHJlb3JkZXIgb3Bjb2RlOiAlZFxuIiwgcnhfYmQtPnJlb3JkZXJfb3Bjb2RlKTsKICAgIGFkZl9vc19wcmludCgiICByZW9yZGVyIGZ3ZCBpbmRleDogJWRcbiIsIHJ4X2JkLT5yZW9yZGVyX2Z3ZF9pZHgpOwogICAgYWRmX29zX3ByaW50KCIgIHJlb3JkZXIgc2xvdCBpbmRleDogJWRcbiIsIHJ4X2JkLT5yZW9yZGVyX3Nsb3RfaWR4KTsKICAgIGFkZl9vc19wcmludCgiICBBTVNEVSBTaXplOiAlZFxuIiwgcnhfYmQtPnRvdGFsX2Ftc2R1X3NpemUpOwogICAgYWRmX29zX3ByaW50KCIgIEFNU0RVIElEWDogJWRcbiIsIHJ4X2JkLT5hbXNkdV9pZHgpOwogICAgYWRmX29zX3ByaW50KCIgIEFNU0RVOiAlZFxuIiwgcnhfYmQtPmFtc2R1KTsKICAgIGFkZl9vc19wcmludCgiICBBTVNEVSBmaXJzdCBzdWJmcm06ICVkXG4iLCByeF9iZC0+YW1zZHVfZmlyc3QpOwogICAgYWRmX29zX3ByaW50KCIgIEFNU0RVIGxhc3Qgc3ViZnJtOiAlZFxuIiwgcnhfYmQtPmFtc2R1X2xhc3QpOwogICAgYWRmX29zX3ByaW50KCIgIEFNU0RVIGVycm9yOiAlZFxuIiwgcnhfYmQtPmFtc2R1X2Vycm9yKTsKICAgIGFkZl9vc19wcmludCgiICBSWCB0aW1lc3RhbXA6ICVkXG4iLCByeF9iZC0+cnhfdGltZXN0YW1wKTsKCiAgICBhZGZfb3NfcHJpbnQoInJhdyB2aWV3IHN0YXJ0OlxuICAiKTsKICAgIHAgPSAoY2hhciAqKSByeF9iZDsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoKnJ4X2JkKTsgaSsrLCBwKyspIHsKICAgICAgICBhZGZfb3NfcHJpbnQoIiUjMDJ4ICIsICpwKTsKICAgICAgICBpZiAoKGkrMSkgJSA4ID09IDApIHsKICAgICAgICAgICAgYWRmX29zX3ByaW50KCJcbiAgIik7CiAgICAgICAgfQogICAgfQogICAgYWRmX29zX3ByaW50KCJyYXcgdmlldyBlbmRcbiIpOwp9CgojZW5kaWYgLyogX0lTT0NfSFdfREVTQ19fSF8gKi8K