ZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1M2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5NThkMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNyBAQAorIyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVM6PSBhcHAtbGludXguYyBkZW1vLmMuYXJtCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkVHTCBsaWJHTEVTdjFfQ00gbGlidWkKK0xPQ0FMX01PRFVMRTo9IGFuZ2VsZXMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUzo9IGdwdXN0YXRlLmMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliRUdMIGxpYkdMRVN2MV9DTQorTE9DQUxfTU9EVUxFOj0gZ3B1c3RhdGUKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI4YTRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDc3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQ0KK1dlYjogaHR0cDovL2lraS5maS9qZXRyby8NCitTZWUgZmlsZSBsaWNlbnNlLnR4dCBmb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoaXMgaXMgYW4gT3BlbkdMIEVTIHBvcnQgb2YgdGhlIHNtYWxsIHNlbGYtcnVubmluZyBkZW1vbnN0cmF0aW9uDQorY2FsbGVkICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiIsIHdoaWNoIHdhcyBmaXJzdCBwcmVzZW50ZWQgaW4gdGhlDQorQXNzZW1ibHknMjAwNCBldmVudC4gSXQgd29uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgNCBLQiBpbnRybw0KK2NvbXBldGl0aW9uIGNhdGVnb3J5Lg0KKw0KK1RoZSBkZW1vbnN0cmF0aW9uIGZlYXR1cmVzIGEgc2lnaHRzZWVpbmcgb2YgYSBmdXR1cmlzdGljIGNpdHkNCitoYXZpbmcgbWFueSBkaWZmZXJlbnQga2luZCBvZiBidWlsZGluZ3MgYW5kIGl0ZW1zLiBFdmVyeXRoaW5nIGlzDQorZmxhdCBzaGFkZWQgd2l0aCB0aHJlZSBkaWZmZXJlbnQgbGlnaHRzLg0KKw0KK1RoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBtYWRlIGZvciBkZXNrdG9wIHdpdGggT3BlbkdMLiBJdCB3YXMNCituYXR1cmFsbHkgaGVhdmlseSBzaXplIG9wdGltaXplZCBpbiBvcmRlciB0byBmaXQgaXQgaW4gdGhlIHNpemUNCitsaW1pdC4gRm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSBtdWNoIG9mIHRoZSBjb2RlIGlzDQorY2xlYW5lZCB1cCBhbmQgdGhlIHNvdW5kIGlzIHJlbW92ZWQuIEFsc28gZGV0YWlsIGxldmVsIGlzIGxvd2VyZWQsDQorYWx0aG91Z2ggaXQgc3RpbGwgY29udGFpbnMgb3ZlciA2MDAwMCBmYWNlcy4NCisNCitUaGUgV2luMzIgKDIwMDAvWFApIGJpbmFyeSBwYWNrYWdlIG9mIG9yaWdpbmFsIHZlcnNpb24gaXMNCithdmFpbGFibGUgZnJvbSB0aGlzIGFkZHJlc3M6IGh0dHA6Ly9qZXQucm8vZmlsZXMvYW5nZWxlcy56aXANCisNCitGaXJzdCB2ZXJzaW9uIG9mIHRoaXMgT3BlbkdMIEVTIHBvcnQgd2FzIHN1Ym1pdHRlZCB0byB0aGUgS2hyb25vcw0KK09wZW5HTCBFUyBDb2RpbmcgQ2hhbGxlbmdlIGhlbGQgaW4gMjAwNC0yMDA1Lg0KKw0KK0FzIGEgY29kZSBleGFtcGxlLCB0aGlzIHNvdXJjZSBzaG93cyB0aGUgZm9sbG93aW5nOg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgbWluaW1hbCBhbmQgcG9ydGFibGUgYWQgaG9jIGZyYW1ld29yaw0KKyAgICBmb3Igc21hbGwgdGVzdGluZy9kZW1vbnN0cmF0aW9uIHByb2dyYW1zLiBUaGlzIGZyYW1ld29yaw0KKyAgICBjb21waWxlcyBmb3IgYm90aCBkZXNrdG9wIGFuZCBQb2NrZXRQQyBXaW4zMiBlbnZpcm9ubWVudCwNCisgICAgYW5kIGEgc2VwYXJhdGUgc291cmNlIGlzIGluY2x1ZGVkIGZvciBMaW51eCB3aXRoIFgxMS4NCisgICogSG93IHRvIGR5bmFtaWNhbGx5IGZpbmQgYW5kIHVzZSB0aGUgT3BlbkdMIEVTIERMTCBvcg0KKyAgICBzaGFyZWQgb2JqZWN0LCBzbyB0aGF0IHRoZSBsaWJyYXJ5IGlzIG5vdCBuZWVkZWQgYXQNCisgICAgdGhlIGNvbXBpbGUvbGluayBzdGFnZS4NCisgICogSG93IHRvIHVzZSB0aGUgYmFzaWMgZmVhdHVyZXMgb2YgT3BlbkdMIEVTIDEuMC8xLjENCisgICAgQ29tbW9uIExpdGUsIHN1Y2ggYXMgdmVydGV4IGFycmF5cywgY29sb3IgYXJyYXlzIGFuZA0KKyAgICBsaWdodGluZy4NCisgICogSG93IHRvIGNyZWF0ZSBhIHNlbGYgY29udGFpbmVkIHNtYWxsIGRlbW9uc3RyYXRpb24NCisgICAgYXBwbGljYXRpb24gd2l0aCBvYmplY3RzIGdlbmVyYXRlZCB1c2luZyBwcm9jZWR1cmFsDQorICAgIGFsZ29yaXRobXMuDQorDQorQXMgdGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG9wdGltaXplZCBmb3Igc2l6ZSBpbnN0ZWFkIG9mDQorcGVyZm9ybWFuY2UsIHRoYXQgaG9sZHMgdHJ1ZSBmb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBhcw0KK3dlbGwuIFRodXMgdGhlIHBlcmZvcm1hbmNlIGNvdWxkIGJlIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkLA0KK2ZvciBleGFtcGxlIGJ5IGNoYW5naW5nIHRoZSBjb2RlIHRvIHVzZSBnbERyYXdFbGVtZW50cw0KK2luc3RlYWQgb2YgZ2xEcmF3QXJyYXlzLiBUaGUgY29kZSB1c2VzIG9ubHkgT3BlbkdMIEVTIDEuMA0KK0NvbW1vbiBMaXRlIC1sZXZlbCBmdW5jdGlvbiBjYWxscyB3aXRob3V0IGFueSBleHRlbnNpb25zLg0KKw0KK1RoZSByZWZlcmVuY2UgT3BlbkdMIEVTIGltcGxlbWVudGF0aW9ucyB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uOg0KKyAgKiBIeWJyaWQncyBPcGVuR0wgRVMgQVBJIEltcGxlbWVudGF0aW9uIChHZXJiZXJhKSB2ZXJzaW9uIDIuMC40DQorICAgIFByZWJ1aWx0IFdpbjMyIFBDIGV4ZWN1dGFibGU6IFNhbk9HTEVTLUdlcmJlcmEuZXhlDQorICAqIFBvd2VyVlIgTUJYIFNESywgT3BlbkdMIEVTIFdpbmRvd3MgUEMgRW11bGF0aW9uIHZlcnNpb24gMS4wNC4xNC4wMTcwDQorICAgIFByZWJ1aWx0IFdpbjMyIFBDIGV4ZWN1dGFibGU6IFNhbk9HTEVTLVBWUlNESy5leGUNCisNCitOb3RlIHRoYXQgRElTQUJMRV9JTVBPUlRHTCBwcmVwcm9jZXNzb3IgbWFjcm8gY2FuIGJlIHVzZWQNCit0byBzcGVjaWZ5IG5vdCB0byB1c2UgZHluYW1pYyBydW50aW1lIGJpbmRpbmcgb2YgdGhlIGxpYnJhcnkuDQorWW91IGFsc28gbmVlZCB0byBkZWZpbmUgcHJlcHJvY2Vzc29yIG1hY3JvIFBWUlNESyB0byBjb21waWxlDQordGhlIHNvdXJjZSB3aXRoIFBvd2VyVlIgT3BlbkdMIEVTIFNESy4NCisNCitUaGUgZGVtbyBhcHBsaWNhdGlvbiBpcyBicmllZmx5IHRlc3RlZCB3aXRoIGEgZmV3IG90aGVyIE9wZW5HTCBFUw0KK2ltcGxlbWVudGF0aW9ucyBhcyB3ZWxsIChlLmcuIFZpbmNlbnQsIEdMRVNvbkdMIG9uIExpbnV4LCBEZWxsDQorQXhpbSBYNTB2KS4gTW9zdCBvZiB0aGVzZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgcmVuZGVyZWQgdGhlIGRlbW8NCitlcnJvbmVvdXNseSBpbiBzb21lIGFzcGVjdC4gVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgZGVtbyBzb3VyY2UNCitjb3VsZCBzdGlsbCBoYXZlIHNvbWUgd29yayB0byBkbyB3aXRoIGNvbXBhdGliaWxpdHkgYW5kIGNvcnJlY3QNCitBUEkgdXNhZ2UsIGFsdGhvdWdoIHRoZSBub24tY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMgYXJlIG1vc3QNCitwcm9iYWJseSB1bmZpbmlzaGVkIGFzIHdlbGwuDQorDQorVGhhbmtzIGFuZCBBY2tub3dsZWRnZW1lbnRzOg0KKw0KKyogVG9uaSBM9m5uYmVyZyAoIUN1YmUpIGNyZWF0ZWQgdGhlIG11c2ljIGZvciBvcmlnaW5hbCB2ZXJzaW9uLCB3aGljaA0KKyAgaXMgbm90IGZlYXR1cmVkIGluIHRoaXMgT3BlbkdMIEVTIHBvcnQuDQorKiBTYXJhIEthcGxpIChzdCBSYW5hKSBmb3IgYWRkaXRpb25hbCBjYW1lcmEgd29yay4NCisqIFBhdWwgQm91cmtlIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwZXJzaGFwZXMuDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDBkMzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGFwcC1saW51eC5jLHYgMS40IDIwMDUvMDIvMDggMTg6NDI6NDggdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIHNvdXJjZSBmaWxlIGlzIGJhc2VkIG9uIHRlc3QvZXhhbXBsZSBjb2RlIGZyb20KKyAqIEdMRVNvbkdMIGltcGxlbWVudGF0aW9uIGJ5IERhdmlkIEJseXRoZS4gSGVyZSBpcyBjb3B5IG9mIHRoZQorICogbGljZW5zZSBub3RpY2UgZnJvbSB0aGF0IHNvdXJjZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkIEJseXRoZSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBEQVZJRCBCTFlUSEUgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgImFwcC5oIgorCisKK2ludCBnQXBwQWxpdmUgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBzQXBwTmFtZVtdID0KKyAgICAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSAoTGludXgpIjsKKworc3RhdGljIGludCBzV2luZG93V2lkdGggPSBXSU5ET1dfREVGQVVMVF9XSURUSDsKK3N0YXRpYyBpbnQgc1dpbmRvd0hlaWdodCA9IFdJTkRPV19ERUZBVUxUX0hFSUdIVDsKK3N0YXRpYyBFR0xEaXNwbGF5IHNFZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7CitzdGF0aWMgRUdMQ29udGV4dCBzRWdsQ29udGV4dCA9IEVHTF9OT19DT05URVhUOworc3RhdGljIEVHTFN1cmZhY2Ugc0VnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKKworY29uc3QgY2hhciAqZWdsX3N0cmVycm9yKHVuc2lnbmVkIGVycikKK3sKKyAgICBzd2l0Y2goZXJyKXsKKyAgICBjYXNlIEVHTF9TVUNDRVNTOiByZXR1cm4gIlNVQ0NFU1MiOworICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogcmV0dXJuICJOT1QgSU5JVElBTElaRUQiOworICAgIGNhc2UgRUdMX0JBRF9BQ0NFU1M6IHJldHVybiAiQkFEIEFDQ0VTUyI7CisgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiByZXR1cm4gIkJBRCBBTExPQyI7CisgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURTogcmV0dXJuICJCQURfQVRUUklCVVRFIjsKKyAgICBjYXNlIEVHTF9CQURfQ09ORklHOiByZXR1cm4gIkJBRCBDT05GSUciOworICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiByZXR1cm4gIkJBRCBDT05URVhUIjsKKyAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiByZXR1cm4gIkJBRCBDVVJSRU5UIFNVUkZBQ0UiOworICAgIGNhc2UgRUdMX0JBRF9ESVNQTEFZOiByZXR1cm4gIkJBRCBESVNQTEFZIjsKKyAgICBjYXNlIEVHTF9CQURfTUFUQ0g6IHJldHVybiAiQkFEIE1BVENIIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJuICJCQUQgTkFUSVZFIFBJWE1BUCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9XSU5ET1c6IHJldHVybiAiQkFEIE5BVElWRSBXSU5ET1ciOworICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6IHJldHVybiAiQkFEIFBBUkFNRVRFUiI7CisgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6IHJldHVybiAiQkFEX1NVUkZBQ0UiOworLy8gICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiByZXR1cm4gIkNPTlRFWFQgTE9TVCI7CisgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKK3ZvaWQgZWdsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgdW5zaWduZWQgZXJyID0gZWdsR2V0RXJyb3IoKTsKKyAgICBpZihlcnIgIT0gRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzKCk6IGVnbCBlcnJvciAweCV4ICglcylcbiIsIAorICAgICAgICAgICAgICAgIG5hbWUsIGVyciwgZWdsX3N0cmVycm9yKGVycikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tHTEVycm9ycygpCit7CisgICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnJvciAhPSBHTF9OT19FUlJPUikKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworCitzdGF0aWMgdm9pZCBjaGVja0VHTEVycm9ycygpCit7CisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICAvLyBHTEVTb25HTCBzZWVtcyB0byBiZSByZXR1cm5pbmcgMCB3aGVuIHRoZXJlIGlzIG5vIGVycm9ycz8KKyAgICBpZiAoZXJyb3IgJiYgZXJyb3IgIT0gRUdMX1NVQ0NFU1MpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRUdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOworfQorCitzdGF0aWMgaW50IGluaXRHcmFwaGljcygpCit7CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICNpZiAxCisgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIDE2LAorICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICAwLAorICNlbHNlCisgICAgICAgICBFR0xfQUxQSEFfU0laRSwgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgIEVHTF9ET05UX0NBUkUsCisgI2VuZGlmCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xfZXJyb3IoImVnbEdldERpc3BsYXkiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsImRweSA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkKSBkcHkpOworICAgICAKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xfZXJyb3IoImVnbEluaXRpYWxpemUiKTsKKworICAgICBlZ2xHZXRDb25maWdzKGRweSwgTlVMTCwgMCwgJm51bUNvbmZpZ3MpOworICAgICBlZ2xfZXJyb3IoImVnbEdldENvbmZpZ3MiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsIm51bSBjb25maWdzICVkXG4iLCBudW1Db25maWdzKTsKKyAgICAgCisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBlZ2xfZXJyb3IoImVnbENob29zZUNvbmZpZyIpOworCisgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGVnbF9lcnJvcigiZWdsTWFwV2luZG93U3VyZmFjZSIpOworCisgICAgIGZwcmludGYoc3RkZXJyLCJzdXJmYWNlID0gJXBcbiIsIHN1cmZhY2UpOworCisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7CisgICAgIGZwcmludGYoc3RkZXJyLCJjb250ZXh0ID0gJXBcbiIsIGNvbnRleHQpOworICAgICAKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsX2Vycm9yKCJlZ2xNYWtlQ3VycmVudCIpOworCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJnNXaW5kb3dXaWR0aCk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZzV2luZG93SGVpZ2h0KTsKKworICAgIHNFZ2xEaXNwbGF5ID0gZHB5OworICAgIHNFZ2xTdXJmYWNlID0gc3VyZmFjZTsKKyAgICBzRWdsQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKworc3RhdGljIHZvaWQgZGVpbml0R3JhcGhpY3MoKQoreworICAgIGVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBlZ2xEZXN0cm95Q29udGV4dChzRWdsRGlzcGxheSwgc0VnbENvbnRleHQpOworICAgIGVnbERlc3Ryb3lTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgZWdsVGVybWluYXRlKHNFZ2xEaXNwbGF5KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIC8vIG5vdCByZWZlcmVuY2VkOgorICAgIGFyZ2MgPSBhcmdjOworICAgIGFyZ3YgPSBhcmd2OworCisgICAgaWYgKCFpbml0R3JhcGhpY3MoKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR3JhcGhpY3MgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgYXBwSW5pdCgpOworICAgIAorICAgIHdoaWxlIChnQXBwQWxpdmUpCisgICAgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lTm93OworCisgICAgICAgIGlmIChnQXBwQWxpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdGltZU5vdywgTlVMTCk7CisgICAgICAgICAgICBhcHBSZW5kZXIodGltZU5vdy50dl9zZWMgKiAxMDAwICsgdGltZU5vdy50dl91c2VjIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBzV2luZG93V2lkdGgsIHNXaW5kb3dIZWlnaHQpOworICAgICAgICAgICAgY2hlY2tHTEVycm9ycygpOworICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIGNoZWNrRUdMRXJyb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcHBEZWluaXQoKTsKKyAgICBkZWluaXRHcmFwaGljcygpOworCisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYmQzNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGFwcC5oLHYgMS4xNCAyMDA1LzAyLzA2IDIxOjEzOjU0IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTQgJAorICovCisKKyNpZm5kZWYgQVBQX0hfSU5DTFVERUQKKyNkZWZpbmUgQVBQX0hfSU5DTFVERUQKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBXSU5ET1dfREVGQVVMVF9XSURUSCAgICA2NDAKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfSEVJR0hUICAgNDgwCisKKyNkZWZpbmUgV0lORE9XX0JQUCAgICAgICAgICAgICAgMTYKKworCisvLyBUaGUgc2ltcGxlIGZyYW1ld29yayBleHBlY3RzIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRvIGRlZmluZSB0aGVzZSBmdW5jdGlvbnMuCitleHRlcm4gdm9pZCBhcHBJbml0KCk7CitleHRlcm4gdm9pZCBhcHBEZWluaXQoKTsKK2V4dGVybiB2b2lkIGFwcFJlbmRlcihsb25nIHRpY2ssIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qIFZhbHVlIGlzIG5vbi16ZXJvIHdoZW4gYXBwbGljYXRpb24gaXMgYWxpdmUsIGFuZCAwIHdoZW4gaXQgaXMgY2xvc2luZy4KKyAqIERlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZyYW1ld29yay4KKyAqLworZXh0ZXJuIGludCBnQXBwQWxpdmU7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLy8gIUFQUF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxYWNiMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApAQCAtMCwwICsxLDY1IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBjYW1zLmgsdiAxLjcgMjAwNS8wMS8zMSAyMjoxNToxNSB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjcgJAorICovCisKKyNpZm5kZWYgQ0FNU19IX0lOQ0xVREVECisjZGVmaW5lIENBTVNfSF9JTkNMVURFRAorCisKKy8qIExlbmd0aCBpbiBtaWxsaXNlY29uZHMgb2Ygb25lIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQuCisgKiBUaGUgdmFsdWUgb3JpZ2luYXRlcyBmcm9tIHRoZSBtdXNpYyBzeW5jaHJvbml6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0FNVFJBQ0tfTEVOICAgIDU0NDIKKworCisvLyBDYW1lcmEgdHJhY2sgZGVmaW5pdGlvbiBmb3Igb25lIGNhbWVyYSB0cnVja2luZyBzaG90LgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBGaXZlIHBhcmFtZXRlcnMgb2Ygc3JjWzVdIGFuZCBkZXN0WzVdOgorICAgICAqIGV5ZVgsIGV5ZVksIGV5ZVosIHZpZXdBbmdsZSwgdmlld0hlaWdodE9mZnMKKyAgICAgKi8KKyAgICBzaG9ydCBzcmNbNV0sIGRlc3RbNV07CisgICAgdW5zaWduZWQgY2hhciBkaXN0OyAgICAgLy8gaWYgPjAsIGNhbSByb3RhdGVzIGFyb3VuZCBleWUgeHkgb24gZGlzdCAqIDAuMQorICAgIHVuc2lnbmVkIGNoYXIgbGVuOyAgICAgIC8vIGxlbmd0aCBtdWx0aXBsaWVyCit9IENBTVRSQUNLOworCitzdGF0aWMgQ0FNVFJBQ0sgc0NhbVRyYWNrc1tdID0KK3sKKyAgICB7IHsgNDUwMCwgMjcwMCwgMTAwLCA3MCwgLTMwIH0sIHsgNTAsIDUwLCAtOTAsIC0xMDAsIDAgfSwgMjAsIDEgfSwKKyAgICB7IHsgLTE0NDgsIDQyOTQsIDI1LCAzNjMsIDAgfSwgeyAtMTM2LCAyMDIsIDEyNSwgLTk4LCAxMDAgfSwgMCwgMSB9LAorICAgIHsgeyAxNDM3LCA0OTMwLCAyMDAsIC0yNzUsIC0yMCB9LCB7IDE2ODQsIDAsIDAsIDksIDAgfSwgMCwgMSB9LAorICAgIHsgeyAxODAwLCAzNjA5LCAyMDAsIDAsIDY3NSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCAwLCAxIH0sCisgICAgeyB7IDkyMywgOTk2LCA1MCwgMjMzNiwgLTgwIH0sIHsgMCwgLTIwLCAtNTAsIDAsIDE3MCB9LCAwLCAxIH0sCisgICAgeyB7IC0xNjYzLCAtNDMsIDYwMCwgMjE3MCwgMCB9LCB7IDIwLCAwLCAtNjAwLCAwLCAxMDAgfSwgMCwgMSB9LAorICAgIHsgeyAxMDQ5LCAtMTQyMCwgMTc1LCAyMTExLCAtMTcgfSwgeyAwLCAwLCAwLCAtMzM0LCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMCwgMCwgNTAsIDMwMCwgMjUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgNzAsIDIgfSwKKyAgICB7IHsgLTQ3MywgLTk1MywgMzUwMCwgLTM1MywgLTM1MCB9LCB7IDAsIDAsIC0yODAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMTkxLCAxOTM4LCAzNSwgMTEzOSwgLTE3IH0sIHsgMTIwNSwgLTI5MDksIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAtMTQ0OSwgLTI3MDAsIDE1MCwgMCwgMCB9LCB7IDAsIDIwMDAsIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyA1MjczLCA0OTkyLCA2NTAsIDM3MywgLTUwIH0sIHsgLTQ1OTgsIC0zMDcyLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMzIyMywgLTMyODIsIDEwNzUsIC0zOTMsIC0yNSB9LCB7IDE2NDksIC0xNjQ5LCAwLCAwLCAwIH0sIDAsIDIgfQorfTsKKyNkZWZpbmUgQ0FNVFJBQ0tfQ09VTlQgKHNpemVvZihjYW1UcmFja3MpIC8gc2l6ZW9mKGNhbVRyYWNrc1swXSkpCisKKworI2VuZGlmIC8vICFDQU1TX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJmMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCkBAIC0wLDAgKzEsNzkyIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBkZW1vLmMsdiAxLjEwIDIwMDUvMDIvMDggMjA6NTQ6MzkgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xMCAkCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiYXBwLmgiCisjaW5jbHVkZSAic2hhcGVzLmgiCisjaW5jbHVkZSAiY2Ftcy5oIgorCisKKy8vIFRvdGFsIHJ1biBsZW5ndGggaXMgMjAgKiBjYW1lcmEgdHJhY2sgYmFzZSB1bml0IGxlbmd0aCAoc2VlIGNhbXMuaCkuCisjZGVmaW5lIFJVTl9MRU5HVEggICgyMCAqIENBTVRSQUNLX0xFTikKKyN1bmRlZiBQSQorI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzJmCisjZGVmaW5lIFJBTkRPTV9VSU5UX01BWCA2NTUzNQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNSYW5kb21TZWVkID0gMDsKKworc3RhdGljIHZvaWQgc2VlZFJhbmRvbSh1bnNpZ25lZCBsb25nIHNlZWQpCit7CisgICAgc1JhbmRvbVNlZWQgPSBzZWVkOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kb21VSW50KCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNSYW5kb21TZWVkICogMHgzNDNmZCArIDB4MjY5ZWMzOworICAgIHJldHVybiBzUmFuZG9tU2VlZCA+PiAxNjsKK30KKworCisvLyBDYXBwZWQgY29udmVyc2lvbiBmcm9tIGZsb2F0IHRvIGZpeGVkLgorc3RhdGljIGxvbmcgZmxvYXRUb0ZpeGVkKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA8IC0zMjc2OCkgdmFsdWUgPSAtMzI3Njg7CisgICAgaWYgKHZhbHVlID4gMzI3NjcpIHZhbHVlID0gMzI3Njc7CisgICAgcmV0dXJuIChsb25nKSh2YWx1ZSAqIDY1NTM2KTsKK30KKworI2RlZmluZSBGSVhFRCh2YWx1ZSkgZmxvYXRUb0ZpeGVkKHZhbHVlKQorCisKKy8vIERlZmluaXRpb24gb2Ygb25lIEdMIG9iamVjdCBpbiB0aGlzIGRlbW8uCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogVmVydGV4IGFycmF5IGFuZCBjb2xvciBhcnJheSBhcmUgZW5hYmxlZCBmb3IgYWxsIG9iamVjdHMsIHNvIHRoZWlyCisgICAgICogcG9pbnRlcnMgbXVzdCBhbHdheXMgYmUgdmFsaWQgYW5kIG5vbi1OVUxMLiBOb3JtYWwgYXJyYXkgaXMgbm90CisgICAgICogdXNlZCBieSB0aGUgZ3JvdW5kIHBsYW5lLCBzbyB3aGVuIGl0cyBwb2ludGVyIGlzIE5VTEwgdGhlbiBub3JtYWwKKyAgICAgKiBhcnJheSB1c2FnZSBpcyBkaXNhYmxlZC4KKyAgICAgKgorICAgICAqIFZlcnRleCBhcnJheSBpcyBzdXBwb3NlZCB0byB1c2UgR0xfRklYRUQgZGF0YXR5cGUgYW5kIHN0cmlkZSAwCisgICAgICogKGkuZS4gdGlnaHRseSBwYWNrZWQgYXJyYXkpLiBDb2xvciBhcnJheSBpcyBzdXBwb3NlZCB0byBoYXZlIDQKKyAgICAgKiBjb21wb25lbnRzIHBlciBjb2xvciB3aXRoIEdMX1VOU0lHTkVEX0JZVEUgZGF0YXR5cGUgYW5kIHN0cmlkZSAwLgorICAgICAqIE5vcm1hbCBhcnJheSBpcyBzdXBwb3NlZCB0byB1c2UgR0xfRklYRUQgZGF0YXR5cGUgYW5kIHN0cmlkZSAwLgorICAgICAqLworICAgIEdMZml4ZWQgKnZlcnRleEFycmF5OworICAgIEdMdWJ5dGUgKmNvbG9yQXJyYXk7CisgICAgR0xmaXhlZCAqbm9ybWFsQXJyYXk7CisgICAgR0xpbnQgdmVydGV4Q29tcG9uZW50czsKKyAgICBHTHNpemVpIGNvdW50OworfSBHTE9CSkVDVDsKKworCitzdGF0aWMgbG9uZyBzU3RhcnRUaWNrID0gMDsKK3N0YXRpYyBsb25nIHNUaWNrID0gMDsKKworc3RhdGljIGludCBzQ3VycmVudENhbVRyYWNrID0gMDsKK3N0YXRpYyBsb25nIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IDB4N2ZmZmZmZmY7CisKK3N0YXRpYyBHTE9CSkVDVCAqc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlRdID0geyBOVUxMIH07CitzdGF0aWMgR0xPQkpFQ1QgKnNHcm91bmRQbGFuZSA9IE5VTEw7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHgsIHksIHo7Cit9IFZFQ1RPUjM7CisKKworc3RhdGljIHZvaWQgZnJlZUdMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZnJlZShvYmplY3QtPm5vcm1hbEFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+Y29sb3JBcnJheSk7CisgICAgZnJlZShvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBmcmVlKG9iamVjdCk7Cit9CisKKworc3RhdGljIEdMT0JKRUNUICogbmV3R0xPYmplY3QobG9uZyB2ZXJ0aWNlcywgaW50IHZlcnRleENvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlTm9ybWFsQXJyYXkpCit7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICByZXN1bHQgPSAoR0xPQkpFQ1QgKiltYWxsb2Moc2l6ZW9mKEdMT0JKRUNUKSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQtPmNvdW50ID0gdmVydGljZXM7CisgICAgcmVzdWx0LT52ZXJ0ZXhDb21wb25lbnRzID0gdmVydGV4Q29tcG9uZW50czsKKyAgICByZXN1bHQtPnZlcnRleEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiB2ZXJ0ZXhDb21wb25lbnRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEdMZml4ZWQpKTsKKyAgICByZXN1bHQtPmNvbG9yQXJyYXkgPSAoR0x1Ynl0ZSAqKW1hbGxvYyh2ZXJ0aWNlcyAqIDQgKiBzaXplb2YoR0x1Ynl0ZSkpOworICAgIGlmICh1c2VOb3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIDMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEdMZml4ZWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gTlVMTDsKKyAgICBpZiAocmVzdWx0LT52ZXJ0ZXhBcnJheSA9PSBOVUxMIHx8CisgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9PSBOVUxMIHx8CisgICAgICAgICh1c2VOb3JtYWxBcnJheSAmJiByZXN1bHQtPm5vcm1hbEFycmF5ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgZnJlZUdMT2JqZWN0KHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQoreworICAgIGFzc2VydChvYmplY3QgIT0gTlVMTCk7CisKKyAgICBnbFZlcnRleFBvaW50ZXIob2JqZWN0LT52ZXJ0ZXhDb21wb25lbnRzLCBHTF9GSVhFRCwKKyAgICAgICAgICAgICAgICAgICAgMCwgb2JqZWN0LT52ZXJ0ZXhBcnJheSk7CisgICAgZ2xDb2xvclBvaW50ZXIoNCwgR0xfVU5TSUdORURfQllURSwgMCwgb2JqZWN0LT5jb2xvckFycmF5KTsKKworICAgIC8vIEFscmVhZHkgZG9uZSBpbiBpbml0aWFsaXphdGlvbjoKKyAgICAvL2dsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAvL2dsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgaWYgKG9iamVjdC0+bm9ybWFsQXJyYXkpCisgICAgeworICAgICAgICBnbE5vcm1hbFBvaW50ZXIoR0xfRklYRUQsIDAsIG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBvYmplY3QtPmNvdW50KTsKK30KKworCitzdGF0aWMgdm9pZCB2ZWN0b3IzU3ViKFZFQ1RPUjMgKmRlc3QsIFZFQ1RPUjMgKnYxLCBWRUNUT1IzICp2MikKK3sKKyAgICBkZXN0LT54ID0gdjEtPnggLSB2Mi0+eDsKKyAgICBkZXN0LT55ID0gdjEtPnkgLSB2Mi0+eTsKKyAgICBkZXN0LT56ID0gdjEtPnogLSB2Mi0+ejsKK30KKworCitzdGF0aWMgdm9pZCBzdXBlclNoYXBlTWFwKFZFQ1RPUjMgKnBvaW50LCBmbG9hdCByMSwgZmxvYXQgcjIsIGZsb2F0IHQsIGZsb2F0IHApCit7CisgICAgLy8gc3BoZXJlLW1hcHBpbmcgb2Ygc3VwZXJzaGFwZSBwYXJhbWV0ZXJzCisgICAgcG9pbnQtPnggPSAoZmxvYXQpKGNvcyh0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT55ID0gKGZsb2F0KShzaW4odCkgKiBjb3MocCkgLyByMSAvIHIyKTsKKyAgICBwb2ludC0+eiA9IChmbG9hdCkoc2luKHApIC8gcjIpOworfQorCisKK3N0YXRpYyBmbG9hdCBzc0Z1bmMoY29uc3QgZmxvYXQgdCwgY29uc3QgZmxvYXQgKnApCit7CisgICAgcmV0dXJuIChmbG9hdCkocG93KHBvdyhmYWJzKGNvcyhwWzBdICogdCAvIDQpKSAvIHBbMV0sIHBbNF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgcG93KGZhYnMoc2luKHBbMF0gKiB0IC8gNCkpIC8gcFsyXSwgcFs1XSksIDEgLyBwWzNdKSk7Cit9CisKKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN1cGVyc2hhcGUgb2JqZWN0LgorLy8gQmFzZWQgb24gUGF1bCBCb3Vya2UncyBQT1YtUmF5IGltcGxlbWVudGF0aW9uLgorLy8gaHR0cDovL2FzdHJvbm9teS5zd2luLmVkdS5hdS9+cGJvdXJrZS9wb3ZyYXkvc3VwZXJzaGFwZS8KK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZVN1cGVyU2hhcGUoY29uc3QgZmxvYXQgKnBhcmFtcykKK3sKKyAgICBjb25zdCBpbnQgcmVzb2wxID0gKGludClwYXJhbXNbU1VQRVJTSEFQRV9QQVJBTVMgLSAzXTsKKyAgICBjb25zdCBpbnQgcmVzb2wyID0gKGludClwYXJhbXNbU1VQRVJTSEFQRV9QQVJBTVMgLSAyXTsKKyAgICAvLyBsYXRpdHVkZSAwIHRvIHBpLzIgZm9yIG5vIG1pcnJvcmVkIGJvdHRvbQorICAgIC8vIChsYXRpdHVkZUJlZ2luPT0wIGZvciAtcGkvMiB0byBwaS8yIG9yaWdpbmFsbHkpCisgICAgY29uc3QgaW50IGxhdGl0dWRlQmVnaW4gPSByZXNvbDIgLyA0OworICAgIGNvbnN0IGludCBsYXRpdHVkZUVuZCA9IHJlc29sMiAvIDI7ICAgIC8vIG5vbi1pbmNsdXNpdmUKKyAgICBjb25zdCBpbnQgbG9uZ2l0dWRlQ291bnQgPSByZXNvbDE7CisgICAgY29uc3QgaW50IGxhdGl0dWRlQ291bnQgPSBsYXRpdHVkZUVuZCAtIGxhdGl0dWRlQmVnaW47CisgICAgY29uc3QgbG9uZyB0cmlhbmdsZUNvdW50ID0gbG9uZ2l0dWRlQ291bnQgKiBsYXRpdHVkZUNvdW50ICogMjsKKyAgICBjb25zdCBsb25nIHZlcnRpY2VzID0gdHJpYW5nbGVDb3VudCAqIDM7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICBmbG9hdCBiYXNlQ29sb3JbM107CisgICAgaW50IGEsIGxvbmdpdHVkZSwgbGF0aXR1ZGU7CisgICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKKworICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAzLCAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChhID0gMDsgYSA8IDM7ICsrYSkKKyAgICAgICAgYmFzZUNvbG9yW2FdID0gKChyYW5kb21VSW50KCkgJSAxNTUpICsgMTAwKSAvIDI1NS5mOworCisgICAgY3VycmVudFF1YWQgPSAwOworICAgIGN1cnJlbnRWZXJ0ZXggPSAwOworCisgICAgLy8gbG9uZ2l0dWRlIC1waSB0byBwaQorICAgIGZvciAobG9uZ2l0dWRlID0gMDsgbG9uZ2l0dWRlIDwgbG9uZ2l0dWRlQ291bnQ7ICsrbG9uZ2l0dWRlKQorICAgIHsKKworICAgICAgICAvLyBsYXRpdHVkZSAwIHRvIHBpLzIKKyAgICAgICAgZm9yIChsYXRpdHVkZSA9IGxhdGl0dWRlQmVnaW47IGxhdGl0dWRlIDwgbGF0aXR1ZGVFbmQ7ICsrbGF0aXR1ZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHQxID0gLVBJICsgbG9uZ2l0dWRlICogMiAqIFBJIC8gcmVzb2wxOworICAgICAgICAgICAgZmxvYXQgdDIgPSAtUEkgKyAobG9uZ2l0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCBwMSA9IC1QSSAvIDIgKyBsYXRpdHVkZSAqIDIgKiBQSSAvIHJlc29sMjsKKyAgICAgICAgICAgIGZsb2F0IHAyID0gLVBJIC8gMiArIChsYXRpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcjAsIHIxLCByMiwgcjM7CisKKyAgICAgICAgICAgIHIwID0gc3NGdW5jKHQxLCBwYXJhbXMpOworICAgICAgICAgICAgcjEgPSBzc0Z1bmMocDEsICZwYXJhbXNbNl0pOworICAgICAgICAgICAgcjIgPSBzc0Z1bmModDIsIHBhcmFtcyk7CisgICAgICAgICAgICByMyA9IHNzRnVuYyhwMiwgJnBhcmFtc1s2XSk7CisKKyAgICAgICAgICAgIGlmIChyMCAhPSAwICYmIHIxICE9IDAgJiYgcjIgIT0gMCAmJiByMyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZFQ1RPUjMgcGEsIHBiLCBwYywgcGQ7CisgICAgICAgICAgICAgICAgVkVDVE9SMyB2MSwgdjIsIG47CisgICAgICAgICAgICAgICAgZmxvYXQgY2E7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgLy9mbG9hdCBsZW5TcSwgaW52TGVuU3E7CisKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYSwgcjAsIHIxLCB0MSwgcDEpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBiLCByMiwgcjEsIHQyLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGMsIHIyLCByMywgdDIsIHAyKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwZCwgcjAsIHIzLCB0MSwgcDIpOworCisgICAgICAgICAgICAgICAgLy8ga2x1ZGdlIHRvIHNldCBsb3dlciBlZGdlIG9mIHRoZSBvYmplY3QgdG8gZml4ZWQgbGV2ZWwKKyAgICAgICAgICAgICAgICBpZiAobGF0aXR1ZGUgPT0gbGF0aXR1ZGVCZWdpbiArIDEpCisgICAgICAgICAgICAgICAgICAgIHBhLnogPSBwYi56ID0gMDsKKworICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYxLCAmcGIsICZwYSk7CisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjIsICZwZCwgJnBhKTsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBub3JtYWwgd2l0aCBjcm9zcyBwcm9kdWN0LgorICAgICAgICAgICAgICAgIC8qICAgaSAgICBqICAgIGsgICAgICBpICAgIGoKKyAgICAgICAgICAgICAgICAgKiB2MS54IHYxLnkgdjEueiB8IHYxLnggdjEueQorICAgICAgICAgICAgICAgICAqIHYyLnggdjIueSB2Mi56IHwgdjIueCB2Mi55CisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBuLnggPSB2MS55ICogdjIueiAtIHYxLnogKiB2Mi55OworICAgICAgICAgICAgICAgIG4ueSA9IHYxLnogKiB2Mi54IC0gdjEueCAqIHYyLno7CisgICAgICAgICAgICAgICAgbi56ID0gdjEueCAqIHYyLnkgLSB2MS55ICogdjIueDsKKworICAgICAgICAgICAgICAgIC8qIFByZS1ub3JtYWxpemF0aW9uIG9mIHRoZSBub3JtYWxzIGlzIGRpc2FibGVkIGhlcmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqIHRoZXkgd2lsbCBiZSBub3JtYWxpemVkIGFueXdheSBsYXRlciBkdWUgdG8gYXV0b21hdGljCisgICAgICAgICAgICAgICAgICogbm9ybWFsaXphdGlvbiAoR0xfTk9STUFMSVpFKS4gSXQgaXMgZW5hYmxlZCBiZWNhdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIG9iamVjdHMgYXJlIHNjYWxlZCB3aXRoIGdsU2NhbGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBsZW5TcSA9IG4ueCAqIG4ueCArIG4ueSAqIG4ueSArIG4ueiAqIG4uejsKKyAgICAgICAgICAgICAgICBpbnZMZW5TcSA9IChmbG9hdCkoMSAvIHNxcnQobGVuU3EpKTsKKyAgICAgICAgICAgICAgICBuLnggKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi55ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgIG4ueiAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgY2EgPSBwYS56ICsgMC41ZjsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiAzOworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiAzOworICAgICAgICAgICAgICAgICAgICAgaSArPSAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpXSA9IEZJWEVEKG4ueCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDFdID0gRklYRUQobi55KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMl0gPSBGSVhFRChuLnopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogNDsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsKKyAgICAgICAgICAgICAgICAgICAgIGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhLCBjb2xvclszXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDM7ICsrYSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JbYV0gPSAoaW50KShjYSAqIGJhc2VDb2xvclthXSAqIDI1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JbYV0gPiAyNTUpIGNvbG9yW2FdID0gMjU1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IChHTHVieXRlKWNvbG9yWzBdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gKEdMdWJ5dGUpY29sb3JbMV07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMl0gPSAoR0x1Ynl0ZSljb2xvclsyXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGEueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGEueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGEueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGIueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGIueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGIueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGQueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGQueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGQueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGIueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGIueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGIueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGMueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGMueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGMueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGQueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGQueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGQueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgfSAvLyByMCAmJiByMSAmJiByMiAmJiByMworICAgICAgICAgICAgKytjdXJyZW50UXVhZDsKKyAgICAgICAgfSAvLyBsYXRpdHVkZQorICAgIH0gLy8gbG9uZ2l0dWRlCisKKyAgICAvLyBTZXQgbnVtYmVyIG9mIHZlcnRpY2VzIGluIG9iamVjdCB0byB0aGUgYWN0dWFsIGFtb3VudCBjcmVhdGVkLgorICAgIHJlc3VsdC0+Y291bnQgPSBjdXJyZW50VmVydGV4OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVHcm91bmRQbGFuZSgpCit7CisgICAgY29uc3QgaW50IHNjYWxlID0gNDsKKyAgICBjb25zdCBpbnQgeUJlZ2luID0gLTE1LCB5RW5kID0gMTU7ICAgIC8vIGVuZHMgYXJlIG5vbi1pbmNsdXNpdmUKKyAgICBjb25zdCBpbnQgeEJlZ2luID0gLTE1LCB4RW5kID0gMTU7CisgICAgY29uc3QgbG9uZyB0cmlhbmdsZUNvdW50ID0gKHlFbmQgLSB5QmVnaW4pICogKHhFbmQgLSB4QmVnaW4pICogMjsKKyAgICBjb25zdCBsb25nIHZlcnRpY2VzID0gdHJpYW5nbGVDb3VudCAqIDM7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICBpbnQgeCwgeTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDIsIDApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICBmb3IgKHkgPSB5QmVnaW47IHkgPCB5RW5kOyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSB4QmVnaW47IHggPCB4RW5kOyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdMdWJ5dGUgY29sb3I7CisgICAgICAgICAgICBpbnQgaSwgYTsKKyAgICAgICAgICAgIGNvbG9yID0gKEdMdWJ5dGUpKChyYW5kb21VSW50KCkgJiAweDVmKSArIDgxKTsgIC8vIDEwMSAxMTExCisgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogNDsgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OyBpICs9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMl0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXhpcyBiaXRzIGZvciBxdWFkIHRyaWFuZ2xlczoKKyAgICAgICAgICAgIC8vIHg6IDAxMTEwMCAoMHgxYyksIHk6IDExMDAwMSAoMHgzMSkgIChjbG9ja3dpc2UpCisgICAgICAgICAgICAvLyB4OiAwMDExMTAgKDB4MGUpLCB5OiAxMDAwMTEgKDB4MjMpICAoY291bnRlci1jbG9ja3dpc2UpCisgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgNjsgKythKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB4bSA9IHggKyAoKDB4MWMgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeW0gPSB5ICsgKCgweDMxID4+IGEpICYgMSk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbSA9IChmbG9hdCkoY29zKHhtICogMikgKiBzaW4oeW0gKiA0KSAqIDAuNzVmKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAyXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHhtICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAyICsgMV0gPQorICAgICAgICAgICAgICAgICAgICBGSVhFRCh5bSAqIHNjYWxlICsgbSk7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjdXJyZW50UXVhZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdHcm91bmRQbGFuZSgpCit7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CisKKyAgICBkcmF3R0xPYmplY3Qoc0dyb3VuZFBsYW5lKTsKKworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdGYWRlUXVhZCgpCit7CisgICAgc3RhdGljIGNvbnN0IEdMZml4ZWQgcXVhZFZlcnRpY2VzW10gPSB7CisgICAgICAgIC0weDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAtMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsICAweDEwMDAwLAorICAgICAgICAtMHgxMDAwMCwgIDB4MTAwMDAKKyAgICB9OworCisgICAgY29uc3QgaW50IGJlZ2luRmFkZSA9IHNUaWNrIC0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljazsKKyAgICBjb25zdCBpbnQgZW5kRmFkZSA9IHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgLSBzVGljazsKKyAgICBjb25zdCBpbnQgbWluRmFkZSA9IGJlZ2luRmFkZSA8IGVuZEZhZGUgPyBiZWdpbkZhZGUgOiBlbmRGYWRlOworCisgICAgaWYgKG1pbkZhZGUgPCAxMDI0KQorICAgIHsKKyAgICAgICAgY29uc3QgR0xmaXhlZCBmYWRlQ29sb3IgPSBtaW5GYWRlIDw8IDY7CisgICAgICAgIGdsQ29sb3I0eChmYWRlQ29sb3IsIGZhZGVDb2xvciwgZmFkZUNvbG9yLCAwKTsKKworICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHF1YWRWZXJ0aWNlcyk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDYpOworCisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCisgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgfQorfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBJbml0KCkKK3sKKyAgICBpbnQgYTsKKworICAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQxKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDIpOworCisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgc2VlZFJhbmRvbSgxNSk7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgU1VQRVJTSEFQRV9DT1VOVDsgKythKQorICAgIHsKKyAgICAgICAgc1N1cGVyU2hhcGVPYmplY3RzW2FdID0gY3JlYXRlU3VwZXJTaGFwZShzU3VwZXJTaGFwZVBhcmFtc1thXSk7CisgICAgICAgIGFzc2VydChzU3VwZXJTaGFwZU9iamVjdHNbYV0gIT0gTlVMTCk7CisgICAgfQorICAgIHNHcm91bmRQbGFuZSA9IGNyZWF0ZUdyb3VuZFBsYW5lKCk7CisgICAgYXNzZXJ0KHNHcm91bmRQbGFuZSAhPSBOVUxMKTsKK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KK3ZvaWQgYXBwRGVpbml0KCkKK3sKKyAgICBpbnQgYTsKKyAgICBmb3IgKGEgPSAwOyBhIDwgU1VQRVJTSEFQRV9DT1VOVDsgKythKQorICAgICAgICBmcmVlR0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2FdKTsKKyAgICBmcmVlR0xPYmplY3Qoc0dyb3VuZFBsYW5lKTsKK30KKworCitzdGF0aWMgdm9pZCBnbHVQZXJzcGVjdGl2ZShHTGZsb2F0IGZvdnksIEdMZmxvYXQgYXNwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQoreworICAgIEdMZmxvYXQgeG1pbiwgeG1heCwgeW1pbiwgeW1heDsKKworICAgIHltYXggPSB6TmVhciAqIChHTGZsb2F0KXRhbihmb3Z5ICogUEkgLyAzNjApOworICAgIHltaW4gPSAteW1heDsKKyAgICB4bWluID0geW1pbiAqIGFzcGVjdDsKKyAgICB4bWF4ID0geW1heCAqIGFzcGVjdDsKKworICAgIGdsRnJ1c3R1bXgoKEdMZml4ZWQpKHhtaW4gKiA2NTUzNiksIChHTGZpeGVkKSh4bWF4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgKEdMZml4ZWQpKHltaW4gKiA2NTUzNiksIChHTGZpeGVkKSh5bWF4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgKEdMZml4ZWQpKHpOZWFyICogNjU1MzYpLCAoR0xmaXhlZCkoekZhciAqIDY1NTM2KSk7Cit9CisKKworc3RhdGljIHZvaWQgcHJlcGFyZUZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCisgICAgZ2xDbGVhckNvbG9yeCgoR0xmaXhlZCkoMC4xZiAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjJmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuM2YgKiA2NTUzNiksIDB4MTAwMDApOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2x1UGVyc3BlY3RpdmUoNDUsIChmbG9hdCl3aWR0aCAvIGhlaWdodCwgMC41ZiwgMTUwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKK30KKworCitzdGF0aWMgdm9pZCBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCkKK3sKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBQb3NpdGlvbltdID0geyAtMHg0MDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MERpZmZ1c2VbXSA9IHsgMHgxMDAwMCwgMHg2NjY2LCAwLCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQxUG9zaXRpb25bXSA9IHsgMHgxMDAwMCwgLTB4MjAwMDAsIC0weDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQxRGlmZnVzZVtdID0geyAweDExZWIsIDB4MjNkNywgMHg1OTk5LCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQyUG9zaXRpb25bXSA9IHsgLTB4MTAwMDAsIDAsIC0weDQwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQyRGlmZnVzZVtdID0geyAweDExZWIsIDB4MmI4NSwgMHgyM2Q3LCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbWF0ZXJpYWxTcGVjdWxhcltdID0geyAweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwIH07CisKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9QT1NJVElPTiwgbGlnaHQwUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX0RJRkZVU0UsIGxpZ2h0MERpZmZ1c2UpOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX1BPU0lUSU9OLCBsaWdodDFQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfRElGRlVTRSwgbGlnaHQxRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfUE9TSVRJT04sIGxpZ2h0MlBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9ESUZGVVNFLCBsaWdodDJEaWZmdXNlKTsKKyAgICBnbE1hdGVyaWFseHYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSLCBtYXRlcmlhbFNwZWN1bGFyKTsKKworICAgIGdsTWF0ZXJpYWx4KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIDYwIDw8IDE2KTsKKyAgICBnbEVuYWJsZShHTF9DT0xPUl9NQVRFUklBTCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd01vZGVscyhmbG9hdCB6U2NhbGUpCit7CisgICAgY29uc3QgaW50IHRyYW5zbGF0aW9uU2NhbGUgPSA5OworICAgIGludCB4LCB5OworCisgICAgc2VlZFJhbmRvbSg5KTsKKworICAgIGdsU2NhbGV4KDEgPDwgMTYsIDEgPDwgMTYsIChHTGZpeGVkKSh6U2NhbGUgKiA2NTUzNikpOworCisgICAgZm9yICh5ID0gLTU7IHkgPD0gNTsgKyt5KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gLTU7IHggPD0gNTsgKyt4KQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBidWlsZGluZ1NjYWxlOworICAgICAgICAgICAgR0xmaXhlZCBmaXhlZFNjYWxlOworCisgICAgICAgICAgICBpbnQgY3VyU2hhcGUgPSByYW5kb21VSW50KCkgJSBTVVBFUlNIQVBFX0NPVU5UOworICAgICAgICAgICAgYnVpbGRpbmdTY2FsZSA9IHNTdXBlclNoYXBlUGFyYW1zW2N1clNoYXBlXVtTVVBFUlNIQVBFX1BBUkFNUyAtIDFdOworICAgICAgICAgICAgZml4ZWRTY2FsZSA9IChHTGZpeGVkKShidWlsZGluZ1NjYWxlICogNjU1MzYpOworCisgICAgICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgICAgIGdsVHJhbnNsYXRleCgoeCAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHkgKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgZ2xSb3RhdGV4KChHTGZpeGVkKSgocmFuZG9tVUludCgpICUgMzYwKSA8PCAxNiksIDAsIDAsIDEgPDwgMTYpOworICAgICAgICAgICAgZ2xTY2FsZXgoZml4ZWRTY2FsZSwgZml4ZWRTY2FsZSwgZml4ZWRTY2FsZSk7CisKKyAgICAgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbY3VyU2hhcGVdKTsKKyAgICAgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHggPSAtMjsgeCA8PSAyOyArK3gpCisgICAgeworICAgICAgICBjb25zdCBpbnQgc2hpcFNjYWxlMTAwID0gdHJhbnNsYXRpb25TY2FsZSAqIDUwMDsKKyAgICAgICAgY29uc3QgaW50IG9mZnMxMDAgPSB4ICogc2hpcFNjYWxlMTAwICsgKHNUaWNrICUgc2hpcFNjYWxlMTAwKTsKKyAgICAgICAgZmxvYXQgb2ZmcyA9IG9mZnMxMDAgKiAwLjAxZjsKKyAgICAgICAgR0xmaXhlZCBmaXhlZE9mZnMgPSAoR0xmaXhlZCkob2ZmcyAqIDY1NTM2KTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleChmaXhlZE9mZnMsIC00ICogNjU1MzYsIDIgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBnbFRyYW5zbGF0ZXgoLTQgKiA2NTUzNiwgZml4ZWRPZmZzLCA0IDw8IDE2KTsKKyAgICAgICAgZ2xSb3RhdGV4KDkwIDw8IDE2LCAwLCAwLCAxIDw8IDE2KTsKKyAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOworICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgIH0KK30KKworCisvKiBGb2xsb3dpbmcgZ2x1TG9va0F0IGltcGxlbWVudGF0aW9uIGlzIGFkYXB0ZWQgZnJvbSB0aGUKKyAqIE1lc2EgM0QgR3JhcGhpY3MgbGlicmFyeS4gaHR0cDovL3d3dy5tZXNhM2Qub3JnCisgKi8KK3N0YXRpYyB2b2lkIGdsdUxvb2tBdChHTGZsb2F0IGV5ZXgsIEdMZmxvYXQgZXlleSwgR0xmbG9hdCBleWV6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCBjZW50ZXJ4LCBHTGZsb2F0IGNlbnRlcnksIEdMZmxvYXQgY2VudGVyeiwKKwkgICAgICAgICAgICAgIEdMZmxvYXQgdXB4LCBHTGZsb2F0IHVweSwgR0xmbG9hdCB1cHopCit7CisgICAgR0xmbG9hdCBtWzE2XTsKKyAgICBHTGZsb2F0IHhbM10sIHlbM10sIHpbM107CisgICAgR0xmbG9hdCBtYWc7CisKKyAgICAvKiBNYWtlIHJvdGF0aW9uIG1hdHJpeCAqLworCisgICAgLyogWiB2ZWN0b3IgKi8KKyAgICB6WzBdID0gZXlleCAtIGNlbnRlcng7CisgICAgelsxXSA9IGV5ZXkgLSBjZW50ZXJ5OworICAgIHpbMl0gPSBleWV6IC0gY2VudGVyejsKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh6WzBdICogelswXSArIHpbMV0gKiB6WzFdICsgelsyXSAqIHpbMl0pOworICAgIGlmIChtYWcpIHsJCQkvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KKyAgICAgICAgelswXSAvPSBtYWc7CisgICAgICAgIHpbMV0gLz0gbWFnOworICAgICAgICB6WzJdIC89IG1hZzsKKyAgICB9CisKKyAgICAvKiBZIHZlY3RvciAqLworICAgIHlbMF0gPSB1cHg7CisgICAgeVsxXSA9IHVweTsKKyAgICB5WzJdID0gdXB6OworCisgICAgLyogWCB2ZWN0b3IgPSBZIGNyb3NzIFogKi8KKyAgICB4WzBdID0geVsxXSAqIHpbMl0gLSB5WzJdICogelsxXTsKKyAgICB4WzFdID0gLXlbMF0gKiB6WzJdICsgeVsyXSAqIHpbMF07CisgICAgeFsyXSA9IHlbMF0gKiB6WzFdIC0geVsxXSAqIHpbMF07CisKKyAgICAvKiBSZWNvbXB1dGUgWSA9IFogY3Jvc3MgWCAqLworICAgIHlbMF0gPSB6WzFdICogeFsyXSAtIHpbMl0gKiB4WzFdOworICAgIHlbMV0gPSAtelswXSAqIHhbMl0gKyB6WzJdICogeFswXTsKKyAgICB5WzJdID0gelswXSAqIHhbMV0gLSB6WzFdICogeFswXTsKKworICAgIC8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgIC8qIGNyb3NzIHByb2R1Y3QgZ2l2ZXMgYXJlYSBvZiBwYXJhbGxlbG9ncmFtLCB3aGljaCBpcyA8IDEuMCBmb3IKKyAgICAgKiBub24tcGVycGVuZGljdWxhciB1bml0LWxlbmd0aCB2ZWN0b3JzOyBzbyBub3JtYWxpemUgeCwgeSBoZXJlCisgICAgICovCisKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh4WzBdICogeFswXSArIHhbMV0gKiB4WzFdICsgeFsyXSAqIHhbMl0pOworICAgIGlmIChtYWcpIHsKKyAgICAgICAgeFswXSAvPSBtYWc7CisgICAgICAgIHhbMV0gLz0gbWFnOworICAgICAgICB4WzJdIC89IG1hZzsKKyAgICB9CisKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh5WzBdICogeVswXSArIHlbMV0gKiB5WzFdICsgeVsyXSAqIHlbMl0pOworICAgIGlmIChtYWcpIHsKKyAgICAgICAgeVswXSAvPSBtYWc7CisgICAgICAgIHlbMV0gLz0gbWFnOworICAgICAgICB5WzJdIC89IG1hZzsKKyAgICB9CisKKyNkZWZpbmUgTShyb3csY29sKSAgbVtjb2wqNCtyb3ddCisgICAgTSgwLCAwKSA9IHhbMF07CisgICAgTSgwLCAxKSA9IHhbMV07CisgICAgTSgwLCAyKSA9IHhbMl07CisgICAgTSgwLCAzKSA9IDAuMDsKKyAgICBNKDEsIDApID0geVswXTsKKyAgICBNKDEsIDEpID0geVsxXTsKKyAgICBNKDEsIDIpID0geVsyXTsKKyAgICBNKDEsIDMpID0gMC4wOworICAgIE0oMiwgMCkgPSB6WzBdOworICAgIE0oMiwgMSkgPSB6WzFdOworICAgIE0oMiwgMikgPSB6WzJdOworICAgIE0oMiwgMykgPSAwLjA7CisgICAgTSgzLCAwKSA9IDAuMDsKKyAgICBNKDMsIDEpID0gMC4wOworICAgIE0oMywgMikgPSAwLjA7CisgICAgTSgzLCAzKSA9IDEuMDsKKyN1bmRlZiBNCisgICAgeworICAgICAgICBpbnQgYTsKKyAgICAgICAgR0xmaXhlZCBmaXhlZE1bMTZdOworICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMTY7ICsrYSkKKyAgICAgICAgICAgIGZpeGVkTVthXSA9IChHTGZpeGVkKShtW2FdICogNjU1MzYpOworICAgICAgICBnbE11bHRNYXRyaXh4KGZpeGVkTSk7CisgICAgfQorCisgICAgLyogVHJhbnNsYXRlIEV5ZSB0byBPcmlnaW4gKi8KKyAgICBnbFRyYW5zbGF0ZXgoKEdMZml4ZWQpKC1leWV4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXkgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleiAqIDY1NTM2KSk7Cit9CisKKworc3RhdGljIHZvaWQgY2FtVHJhY2soKQoreworICAgIGZsb2F0IGxlcnBbNV07CisgICAgZmxvYXQgZVgsIGVZLCBlWiwgY1gsIGNZLCBjWjsKKyAgICBmbG9hdCB0cmFja1BvczsKKyAgICBDQU1UUkFDSyAqY2FtOworICAgIGxvbmcgY3VycmVudENhbVRpY2s7CisgICAgaW50IGE7CisKKyAgICBpZiAoc05leHRDYW1UcmFja1N0YXJ0VGljayA8PSBzVGljaykKKyAgICB7CisgICAgICAgICsrc0N1cnJlbnRDYW1UcmFjazsKKyAgICAgICAgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IHNOZXh0Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgfQorICAgIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NhbVRyYWNrc1tzQ3VycmVudENhbVRyYWNrXS5sZW4gKiBDQU1UUkFDS19MRU47CisKKyAgICBjYW0gPSAmc0NhbVRyYWNrc1tzQ3VycmVudENhbVRyYWNrXTsKKyAgICBjdXJyZW50Q2FtVGljayA9IHNUaWNrIC0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB0cmFja1BvcyA9IChmbG9hdCljdXJyZW50Q2FtVGljayAvIChDQU1UUkFDS19MRU4gKiBjYW0tPmxlbik7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgNTsgKythKQorICAgICAgICBsZXJwW2FdID0gKGNhbS0+c3JjW2FdICsgY2FtLT5kZXN0W2FdICogdHJhY2tQb3MpICogMC4wMWY7CisKKyAgICBpZiAoY2FtLT5kaXN0KQorICAgIHsKKyAgICAgICAgZmxvYXQgZGlzdCA9IGNhbS0+ZGlzdCAqIDAuMWY7CisgICAgICAgIGNYID0gbGVycFswXTsKKyAgICAgICAgY1kgPSBsZXJwWzFdOworICAgICAgICBjWiA9IGxlcnBbMl07CisgICAgICAgIGVYID0gY1ggLSAoZmxvYXQpY29zKGxlcnBbM10pICogZGlzdDsKKyAgICAgICAgZVkgPSBjWSAtIChmbG9hdClzaW4obGVycFszXSkgKiBkaXN0OworICAgICAgICBlWiA9IGNaIC0gbGVycFs0XTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZVggPSBsZXJwWzBdOworICAgICAgICBlWSA9IGxlcnBbMV07CisgICAgICAgIGVaID0gbGVycFsyXTsKKyAgICAgICAgY1ggPSBlWCArIChmbG9hdCljb3MobGVycFszXSk7CisgICAgICAgIGNZID0gZVkgKyAoZmxvYXQpc2luKGxlcnBbM10pOworICAgICAgICBjWiA9IGVaICsgbGVycFs0XTsKKyAgICB9CisgICAgZ2x1TG9va0F0KGVYLCBlWSwgZVosIGNYLCBjWSwgY1osIDAsIDAsIDEpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgorLyogVGhlIHRpY2sgaXMgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcywgd2lkdGggYW5kIGhlaWdodAorICogYXJlIHRoZSBpbWFnZSBkaW1lbnNpb25zIHRvIGJlIHJlbmRlcmVkLgorICovCit2b2lkIGFwcFJlbmRlcihsb25nIHRpY2ssIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoc1N0YXJ0VGljayA9PSAwKQorICAgICAgICBzU3RhcnRUaWNrID0gdGljazsKKyAgICBpZiAoIWdBcHBBbGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQWN0dWFsIHRpY2sgdmFsdWUgaXMgImJsdXJyZWQiIGEgbGl0dGxlIGJpdC4KKyAgICBzVGljayA9IChzVGljayArIHRpY2sgLSBzU3RhcnRUaWNrKSA+PiAxOworCisgICAgLy8gVGVybWluYXRlIGFwcGxpY2F0aW9uIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCB0aGUgZGVtb25zdHJhdGlvbiBvbmNlLgorICAgIGlmIChzVGljayA+PSBSVU5fTEVOR1RIKQorICAgIHsKKyAgICAgICAgZ0FwcEFsaXZlID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFByZXBhcmUgT3BlbkdMIEVTIGZvciByZW5kZXJpbmcgb2YgdGhlIGZyYW1lLgorICAgIHByZXBhcmVGcmFtZSh3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY2FtZXJhIHBvc2l0aW9uIGFuZCBzZXQgdGhlIGxvb2thdC4KKyAgICBjYW1UcmFjaygpOworCisgICAgLy8gQ29uZmlndXJlIGVudmlyb25tZW50LgorICAgIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKTsKKworICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24gYnkgZHJhd2luZyBtb2RlbHMgd2l0aCBuZWdhdGVkIFotYXhpcy4KKyAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICBkcmF3TW9kZWxzKC0xKTsKKyAgICBnbFBvcE1hdHJpeCgpOworCisgICAgLy8gQmxlbmQgdGhlIGdyb3VuZCBwbGFuZSB0byB0aGUgd2luZG93LgorICAgIGRyYXdHcm91bmRQbGFuZSgpOworCisgICAgLy8gRHJhdyBhbGwgdGhlIG1vZGVscyBub3JtYWxseS4KKyAgICBkcmF3TW9kZWxzKDEpOworCisgICAgLy8gRHJhdyBmYWRlIHF1YWQgb3ZlciB3aG9sZSB3aW5kb3cgKHdoZW4gY2hhbmdpbmcgY2FtZXJhcykuCisgICAgZHJhd0ZhZGVRdWFkKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzU0MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIHZvaWQgKm1hcF9tZW1vcnkoY29uc3QgY2hhciAqZm4sIHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIHNpemUpCit7CisgICAgaW50IGZkOworICAgIHZvaWQgKnB0cjsKKyAgICAKKyAgICBmZCA9IG9wZW4oZm4sIE9fUkRXUiB8IE9fU1lOQyk7CisgICAgaWYoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiY2Fubm90IG9wZW4gJXMgZm9yIG1hcHBpbmciKTsKKyAgICAgICAgcmV0dXJuIE1BUF9GQUlMRUQ7CisgICAgfQorCisgICAgcHRyID0gbW1hcCgwLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQsIGJhc2UpOworICAgIGNsb3NlKGZkKTsKKyAgICAKKyAgICBpZihwdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiY2Fubm90IG1hcCAlcyAoQCUwOHgsJTA4eClcbiIsIGZuLCBiYXNlLCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsgICAgCit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHZvaWQgKmdycF9yZWdzID0gbWFwX21lbW9yeSgiL2Rldi9odzNkIiwgMCwgMTAyNCAqIDEwMjQpOworICAgIHByaW50ZigiR1BVIGJhc2UgbWFwcGVkIGF0ICVwXG4iLCBncnBfcmVncyk7CisgICAgaW50IHN0YXRlX29mZnNldCA9IDB4MTAxNDA7CisgICAgcHJpbnRmKCJHUFUgc3RhdGUgPSAlMDhseFxuIiwKKyAgICAgICAgICAgICooKGxvbmcqKSgoY2hhciopZ3JwX3JlZ3MgKyBzdGF0ZV9vZmZzZXQpKSAgKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjg0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKQEAgLTAsMCArMSwyMjkgQEAKKyNpZm5kZWYgX19lZ2xfaF8KKyNkZWZpbmUgX19lZ2xfaF8KKworLyoKKyoqIExpY2Vuc2UgQXBwbGljYWJpbGl0eS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZQorKiogbWFkZSBzdWJqZWN0IHRvIGFuIGFsdGVybmF0aXZlIGxpY2Vuc2UgYXMgcGVybWl0dGVkIGluIHRoZSBTR0kgRnJlZQorKiogU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIiksIHRoZSBjb250ZW50cyBvZiB0aGlzCisqKiBmaWxlIGFyZSBzdWJqZWN0IG9ubHkgdG8gdGhlIHByb3Zpc2lvbnMgb2YgdGhlIExpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZQorKiogdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorKiogb2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDAKKyoqIEFtcGhpdGhlYXRyZSBQYXJrd2F5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0My0xMzUxLCBvciBhdDoKKyoqCisqKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKKyoqCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKgorKiogT3JpZ2luYWwgQ29kZS4gVGhlIE9yaWdpbmFsIENvZGUgaXM6IE9wZW5HTCBTYW1wbGUgSW1wbGVtZW50YXRpb24sCisqKiBWZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcywKKyoqIEluYy4gVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChjKSAxOTkxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorKiogQ29weXJpZ2h0IGluIGFueSBwb3J0aW9ucyBjcmVhdGVkIGJ5IHRoaXJkIHBhcnRpZXMgaXMgYXMgaW5kaWNhdGVkCisqKiBlbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioKKyoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCisqKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCisqKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAorKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCisqKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKKyoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQorKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgorKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCisqKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9lZ2x0eXBlcy5oPgorCisvKgorKiogZWdsdHlwZXMuaCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuIEl0IGRlZmluZXM6CisqKgorKiogICAgIC0gRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMKKyoqICAgICAtIE5hdGl2ZSB0eXBlcworKiogICAgIC0gRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKioKKyoqIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzIGFyZSB0byBiZSB0eXBlZGVmJ2VkIHdpdGggYXBwcm9wcmlhdGUgcGxhdGZvcm0KKyoqIGRlcGVuZGVudCByZXNvdXJjZSBoYW5kbGUgdHlwZXMuIEVHTGludCBtdXN0IGJlIGFuIGludGVnZXIgb2YgYXQgbGVhc3QKKyoqIDMyLWJpdC4KKyoqCisqKiBOYXRpdmVEaXNwbGF5VHlwZSwgTmF0aXZlV2luZG93VHlwZSBhbmQgTmF0aXZlUGl4bWFwVHlwZSBhcmUgdG8gYmUKKyoqIHJlcGxhY2VkIHdpdGggY29ycmVzcG9uZGluZyB0eXBlcyBvZiB0aGUgbmF0aXZlIHdpbmRvdyBzeXN0ZW0gaW4gZWdsLmguCisqKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcyBtdXN0IG1hdGNoIHRoZWlyIHR5cGVzLgorKioKKyoqIEV4YW1wbGUgZWdsdHlwZXMuaDoKKyovCisKKyNpZiAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuYXRpdmVfd2luZG93X3N5c3RlbS5oPgorCisvKgorKiogVHlwZXMgYW5kIHJlc291cmNlcworKi8KK3R5cGVkZWYgaW50IEVHTEJvb2xlYW47Cit0eXBlZGVmIGludDMyX3QgRUdMaW50OwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7CisKKy8qCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqLworI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZICgoTmF0aXZlRGlzcGxheVR5cGUpMCkKKyNkZWZpbmUgRUdMX05PX0NPTlRFWFQgKChFR0xDb250ZXh0KTApCisjZGVmaW5lIEVHTF9OT19ESVNQTEFZICgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAoKEVHTFN1cmZhY2UpMCkKKworI2VuZGlmCisKKy8qCisqKiBWZXJzaW9uaW5nIGFuZCBleHRlbnNpb25zCisqLworI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCSAgICAgICAxCisKKy8qCisqKiBCb29sZWFuCisqLworI2RlZmluZSBFR0xfRkFMU0UJCSAgICAgICAwCisjZGVmaW5lIEVHTF9UUlVFCQkgICAgICAgMQorCisvKgorKiogRXJyb3JzCisqLworI2RlZmluZSBFR0xfU1VDQ0VTUwkJICAgICAgIDB4MzAwMAorI2RlZmluZSBFR0xfTk9UX0lOSVRJQUxJWkVECSAgICAgICAweDMwMDEKKyNkZWZpbmUgRUdMX0JBRF9BQ0NFU1MJCSAgICAgICAweDMwMDIKKyNkZWZpbmUgRUdMX0JBRF9BTExPQwkJICAgICAgIDB4MzAwMworI2RlZmluZSBFR0xfQkFEX0FUVFJJQlVURQkgICAgICAgMHgzMDA0CisjZGVmaW5lIEVHTF9CQURfQ09ORklHCQkgICAgICAgMHgzMDA1CisjZGVmaW5lIEVHTF9CQURfQ09OVEVYVAkJICAgICAgIDB4MzAwNgorI2RlZmluZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSAgICAgICAgMHgzMDA3CisjZGVmaW5lIEVHTF9CQURfRElTUExBWQkJICAgICAgIDB4MzAwOAorI2RlZmluZSBFR0xfQkFEX01BVENICQkgICAgICAgMHgzMDA5CisjZGVmaW5lIEVHTF9CQURfTkFUSVZFX1BJWE1BUAkgICAgICAgMHgzMDBBCisjZGVmaW5lIEVHTF9CQURfTkFUSVZFX1dJTkRPVwkgICAgICAgMHgzMDBCCisjZGVmaW5lIEVHTF9CQURfUEFSQU1FVEVSCSAgICAgICAweDMwMEMKKyNkZWZpbmUgRUdMX0JBRF9TVVJGQUNFCQkgICAgICAgMHgzMDBECisvKiAweDMwMEUgLSAweDMwMUYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgZXJyb3JzLiAqLworCisvKgorKiogQ29uZmlnIGF0dHJpYnV0ZXMKKyovCisjZGVmaW5lIEVHTF9CVUZGRVJfU0laRQkJICAgICAgIDB4MzAyMAorI2RlZmluZSBFR0xfQUxQSEFfU0laRQkJICAgICAgIDB4MzAyMQorI2RlZmluZSBFR0xfQkxVRV9TSVpFCQkgICAgICAgMHgzMDIyCisjZGVmaW5lIEVHTF9HUkVFTl9TSVpFCQkgICAgICAgMHgzMDIzCisjZGVmaW5lIEVHTF9SRURfU0laRQkJICAgICAgIDB4MzAyNAorI2RlZmluZSBFR0xfREVQVEhfU0laRQkJICAgICAgIDB4MzAyNQorI2RlZmluZSBFR0xfU1RFTkNJTF9TSVpFCSAgICAgICAweDMwMjYKKyNkZWZpbmUgRUdMX0NPTkZJR19DQVZFQVQJICAgICAgIDB4MzAyNworI2RlZmluZSBFR0xfQ09ORklHX0lECQkgICAgICAgMHgzMDI4CisjZGVmaW5lIEVHTF9MRVZFTAkJICAgICAgIDB4MzAyOQorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUCSAgICAgICAweDMwMkEKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1BJWEVMUwkgICAgICAgMHgzMDJCCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9XSURUSAkgICAgICAgMHgzMDJDCisjZGVmaW5lIEVHTF9OQVRJVkVfUkVOREVSQUJMRQkgICAgICAgMHgzMDJECisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX0lECSAgICAgICAweDMwMkUKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfVFlQRQkgICAgICAgMHgzMDJGCisvKiNkZWZpbmUgRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMJIDB4MzAzMCovCisjZGVmaW5lIEVHTF9TQU1QTEVTCQkgICAgICAgMHgzMDMxCisjZGVmaW5lIEVHTF9TQU1QTEVfQlVGRkVSUwkgICAgICAgMHgzMDMyCisjZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUJICAgICAgIDB4MzAzMworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRQkgICAgICAgMHgzMDM0CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFICAgICAweDMwMzUKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFICAgIDB4MzAzNgorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFICAgICAgMHgzMDM3CisKKy8qCisqKiBDb25maWcgYXR0cmlidXRlIGFuZCB2YWx1ZQorKi8KKyNkZWZpbmUgRUdMX05PTkUJCSAgICAgICAweDMwMzgKKy8qIDB4MzAzOSAtIDB4MzA0RiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBjb25maWcgYXR0cmlidXRlcy4gKi8KKworLyoKKyoqIENvbmZpZyB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ET05UX0NBUkUJCSAgICAgICAoKEVHTGludCkgLTEpCisjZGVmaW5lIEVHTF9QQlVGRkVSX0JJVAkJICAgICAgIDB4MDEKKyNkZWZpbmUgRUdMX1BJWE1BUF9CSVQJCSAgICAgICAweDAyCisjZGVmaW5lIEVHTF9XSU5ET1dfQklUCQkgICAgICAgMHgwNAorI2RlZmluZSBFR0xfU0xPV19DT05GSUcJCSAgICAgICAweDMwNTAKKyNkZWZpbmUgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRyAgICAgIDB4MzA1MQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkdCCSAgICAgICAweDMwNTIKKworLyoKKyoqIFN0cmluZyBuYW1lcworKi8KKyNkZWZpbmUgRUdMX1ZFTkRPUgkJICAgICAgIDB4MzA1MworI2RlZmluZSBFR0xfVkVSU0lPTgkJICAgICAgIDB4MzA1NAorI2RlZmluZSBFR0xfRVhURU5TSU9OUwkJICAgICAgIDB4MzA1NQorCisvKgorKiogU3VyZmFjZSBhdHRyaWJ1dGVzCisqLworI2RlZmluZSBFR0xfSEVJR0hUCQkgICAgICAgMHgzMDU2CisjZGVmaW5lIEVHTF9XSURUSAkJICAgICAgIDB4MzA1NworI2RlZmluZSBFR0xfTEFSR0VTVF9QQlVGRkVSCSAgICAgICAweDMwNTgKKworLyoKKyoqIEN1cnJlbnQgc3VyZmFjZXMKKyovCisjZGVmaW5lIEVHTF9EUkFXCQkgICAgICAgMHgzMDU5CisjZGVmaW5lIEVHTF9SRUFECQkgICAgICAgMHgzMDVBCisKKy8qCisqKiBFbmdpbmVzCisqLworI2RlZmluZSBFR0xfQ09SRV9OQVRJVkVfRU5HSU5FCSAgICAgICAweDMwNUIKKworLyogMHgzMDVDLTB4M0ZGRkYgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworLyoKKyoqIEZ1bmN0aW9ucworKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworR0xBUEkgRUdMaW50IEFQSUVOVFJZIGVnbEdldEVycm9yICh2b2lkKTsKKworR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXREaXNwbGF5IChOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsSW5pdGlhbGl6ZSAoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xUZXJtaW5hdGUgKEVHTERpc3BsYXkgZHB5KTsKK0dMQVBJIGNvbnN0IGNoYXIgKiBBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyAoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKTsKK0dMQVBJIHZvaWQgKCogQVBJRU5UUlkgZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKTsKKworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xHZXRDb25maWdzIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbENob29zZUNvbmZpZyAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xHZXRDb25maWdBdHRyaWIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgTmF0aXZlUGl4bWFwVHlwZSBwaXhtYXAsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsQ3JlYXRlQ29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgc2hhcmVfbGlzdCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xNYWtlQ3VycmVudCAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdywgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCk7CitHTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbEdldEN1cnJlbnRDb250ZXh0ICh2b2lkKTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsR2V0Q3VycmVudFN1cmZhY2UgKEVHTGludCByZWFkZHJhdyk7CitHTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldEN1cnJlbnREaXNwbGF5ICh2b2lkKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFdhaXRHTCAodm9pZCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFdhaXROYXRpdmUgKEVHTGludCBlbmdpbmUpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xTd2FwQnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbENvcHlCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBOYXRpdmVQaXhtYXBUeXBlIHRhcmdldCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX19lZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMzZjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisqKiBUeXBlcyBhbmQgcmVzb3VyY2VzCisqLwordHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgbG9uZyBFR0xpbnQ7Cit0eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZVBpeG1hcFR5cGU7CisKKy8qCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqLworI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZICgoTmF0aXZlRGlzcGxheVR5cGUpMCkKKyNkZWZpbmUgRUdMX05PX0NPTlRFWFQgKChFR0xDb250ZXh0KTApCisjZGVmaW5lIEVHTF9OT19ESVNQTEFZICgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAoKEVHTFN1cmZhY2UpMCkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1NDgyMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oCkBAIC0wLDAgKzEsNTg0IEBACisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKiAKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKiogCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKiAKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqIAorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgQVBJRU5UUlkKKyNkZWZpbmUgQVBJRU5UUlkKKyNlbmRpZgorI2lmbmRlZiBHTEFQSQorI2RlZmluZSBHTEFQSSBleHRlcm4KKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0xib29sZWFuOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xiaXRmaWVsZDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgR0xieXRlOwordHlwZWRlZiBzaG9ydCBHTHNob3J0OwordHlwZWRlZiBpbnQgR0xpbnQ7Cit0eXBlZGVmIGludCBHTHNpemVpOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMdWJ5dGU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0x1aW50OwordHlwZWRlZiBmbG9hdCBHTGZsb2F0OwordHlwZWRlZiBmbG9hdCBHTGNsYW1wZjsKK3R5cGVkZWYgdm9pZCBHTHZvaWQ7Cit0eXBlZGVmIGludCBHTGludHB0ckFSQjsKK3R5cGVkZWYgaW50IEdMc2l6ZWlwdHJBUkI7Cit0eXBlZGVmIGludCBHTGZpeGVkOwordHlwZWRlZiBpbnQgR0xjbGFtcHg7CisvKiBJbnRlcm5hbCBjb252ZW5pZW5jZSB0eXBlZGVmcyAqLwordHlwZWRlZiB2b2lkICgqX0dMZnVuY3B0cikoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgR0xfT0VTX1ZFUlNJT05fMV8wICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCisKKy8qIENsZWFyQnVmZmVyTWFzayAqLworI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorCisvKiBCb29sZWFuICovCisjZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEJlZ2luTW9kZSAqLworI2RlZmluZSBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgMHgwMDA2CisKKy8qIEFscGhhRnVuY3Rpb24gKi8KKyNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisKKy8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqLworI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQorCisvKiBCbGVuZGluZ0ZhY3RvclNyYyAqLworLyogICAgICBHTF9aRVJPICovCisvKiAgICAgIEdMX09ORSAqLworI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAorLyogICAgICBHTF9TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9EU1RfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLworCisvKiBDb2xvck1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCisvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KKworLyogQ29sb3JQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIEN1bGxGYWNlTW9kZSAqLworI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAorCisvKiBEZXB0aEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBFbmFibGVDYXAgKi8KKyNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAorI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCisjZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKKyNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorLyogICAgICBHTF9MSUdIVDAgKi8KKy8qICAgICAgR0xfTElHSFQxICovCisvKiAgICAgIEdMX0xJR0hUMiAqLworLyogICAgICBHTF9MSUdIVDMgKi8KKy8qICAgICAgR0xfTElHSFQ0ICovCisvKiAgICAgIEdMX0xJR0hUNSAqLworLyogICAgICBHTF9MSUdIVDYgKi8KKy8qICAgICAgR0xfTElHSFQ3ICovCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKKyNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKKyNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQorI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisKKy8qIEVycm9yQ29kZSAqLworI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorCisvKiBGb2dNb2RlICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKKworLyogRm9nUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKKyNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MworI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0CisjZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKKyNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgorCisvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KKyNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAorI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCisKKy8qIEdldFBOYW1lICovCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgorI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKKyNkZWZpbmUgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgIDB4MEQzNgorI2RlZmluZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgMHgwRDM4CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAweDBEMzkKKyNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAweDgwRTkKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAorI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCisjZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKKyNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAorI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1CisjZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKKyNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NworCisvKiBIaW50TW9kZSAqLworI2RlZmluZSBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwCisjZGVmaW5lIEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDExMDEKKyNkZWZpbmUgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMgorCisvKiBIaW50VGFyZ2V0ICovCisjZGVmaW5lIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAweDBDNTAKKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIX0hJTlQgICAgICAgICAgICAgIDB4MEM1MQorI2RlZmluZSBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgMHgwQzUyCisjZGVmaW5lIEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAweDBDNTMKKyNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAorCisvKiBMaWdodE1vZGVsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0FNQklFTlQgICAgICAgICAgICAweDBCNTMKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgIDB4MEI1MgorCisvKiBMaWdodFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAwCisjZGVmaW5lIEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDEKKyNkZWZpbmUgR0xfU1BFQ1VMQVIgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMgorI2RlZmluZSBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAzCisjZGVmaW5lIEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAweDEyMDQKKyNkZWZpbmUgR0xfU1BPVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgIDB4MTIwNQorI2RlZmluZSBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgMHgxMjA2CisjZGVmaW5lIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAweDEyMDcKKyNkZWZpbmUgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgIDB4MTIwOAorI2RlZmluZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgMHgxMjA5CisKKy8qIERhdGFUeXBlICovCisjZGVmaW5lIEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgIDB4MTQwMQorI2RlZmluZSBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAweDE0MDMKKyNkZWZpbmUgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNgorI2RlZmluZSBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCisKKy8qIExvZ2ljT3AgKi8KKyNkZWZpbmUgR0xfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMAorI2RlZmluZSBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAxCisjZGVmaW5lIEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAweDE1MDIKKyNkZWZpbmUgR0xfQ09QWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMworI2RlZmluZSBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgMHgxNTA0CisjZGVmaW5lIEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDUKKyNkZWZpbmUgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNgorI2RlZmluZSBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA3CisjZGVmaW5lIEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDgKKyNkZWZpbmUgR0xfRVFVSVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOQorI2RlZmluZSBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBBCisjZGVmaW5lIEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAweDE1MEIKKyNkZWZpbmUgR0xfQ09QWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgIDB4MTUwQworI2RlZmluZSBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgMHgxNTBECisjZGVmaW5lIEdMX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEUKKyNkZWZpbmUgR0xfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRgorCisvKiBNYXRlcmlhbEZhY2UgKi8KKy8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKworLyogTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRU1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMAorI2RlZmluZSBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgMHgxNjAxCisjZGVmaW5lIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAweDE2MDIKKy8qICAgICAgR0xfQU1CSUVOVCAqLworLyogICAgICBHTF9ESUZGVVNFICovCisvKiAgICAgIEdMX1NQRUNVTEFSICovCisKKy8qIE1hdHJpeE1vZGUgKi8KKyNkZWZpbmUgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMAorI2RlZmluZSBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgMHgxNzAxCisjZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKKworLyogTm9ybWFsUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfQllURSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworCisvKiBQaXhlbEZvcm1hdCAqLworI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2CisjZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKKyNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKKworLyogUGl4ZWxTdG9yZVBhcmFtZXRlciAqLworI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1CisjZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKKworLyogUGl4ZWxUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKworLyogU2hhZGluZ01vZGVsICovCisjZGVmaW5lIEdMX0ZMQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDAKKyNkZWZpbmUgR0xfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMQorCisvKiBTdGVuY2lsRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIFN0ZW5jaWxPcCAqLworLyogICAgICBHTF9aRVJPICovCisjZGVmaW5lIEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMQorI2RlZmluZSBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAyCisjZGVmaW5lIEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDMKKy8qICAgICAgR0xfSU5WRVJUICovCisKKy8qIFN0cmluZ05hbWUgKi8KKyNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCisjZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKKyNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMworCisvKiBUZXhDb29yZFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisvKiAgICAgIEdMX0JZVEUgKi8KKworLyogVGV4dHVyZUVudk1vZGUgKi8KKyNkZWZpbmUgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMAorI2RlZmluZSBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAxCisvKiAgICAgIEdMX0JMRU5EICovCisjZGVmaW5lIEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKy8qICAgICAgR0xfUkVQTEFDRSAqLworCisvKiBUZXh0dXJlRW52UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAweDIyMDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfQ09MT1IgICAgICAgICAgICAgIDB4MjIwMQorCisvKiBUZXh0dXJlRW52VGFyZ2V0ICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAweDIzMDAKKworLyogVGV4dHVyZU1hZ0ZpbHRlciAqLworI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCisjZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKKworLyogVGV4dHVyZU1pbkZpbHRlciAqLworLyogICAgICBHTF9ORUFSRVNUICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgMHgyNzAwCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAweDI3MDEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgIDB4MjcwMgorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgMHgyNzAzCisKKy8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDB4MjgwMQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgMHgyODAyCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAweDI4MDMKKworLyogVGV4dHVyZVRhcmdldCAqLworLyogICAgICBHTF9URVhUVVJFXzJEICovCisKKy8qIFRleHR1cmVVbml0ICovCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorCisvKiBUZXh0dXJlV3JhcE1vZGUgKi8KKyNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisKKy8qIFBpeGVsSW50ZXJuYWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5MAorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4QjkxCisjZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTIKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5MworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk0CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTUKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5NgorI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4Qjk3CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTgKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5OQorCisvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIExpZ2h0TmFtZSAqLworI2RlZmluZSBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKKyNkZWZpbmUgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDcKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aHggKEdMY2xhbXB4IGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR4IChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoTWFzayAoR0xib29sZWFuIGZsYWcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZXggKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlIChHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2YgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3h2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJvbnRGYWNlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW14IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIGNvbnN0IEdMdWJ5dGUgKiBBUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aHggKEdMZml4ZWQgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRJZGVudGl0eSAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2dpY09wIChHTGVudW0gb3Bjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHh2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE1vZGUgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHggKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDN4IChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG9mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob3ggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemUgKEdMZmxvYXQgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXpleCAoR0xmaXhlZCBzaXplKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldHggKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb3BNYXRyaXggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFB1c2hNYXRyaXggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZXggKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4IChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZU1vZGVsIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19nbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjRlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKQEAgLTAsMCArMSwzNCBAQAorVGhpcyBpcyB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm9yIHRoZSAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iDQorT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSBzb3VyY2UgY29kZQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgSmV0cm8gTGF1aGENCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KK2FyZSBtZXQ6DQorDQorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4NCisgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorICAgICAgZGlzdHJpYnV0aW9uLg0KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHNvZnR3YXJlIHByb2R1Y3QncyBjb3B5cmlnaHQgb3duZXIgbm9yDQorICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlDQorICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuDQorICAgICAgcGVybWlzc2lvbi4NCisNCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRA0KK1RPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1INCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMNCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzZjVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dApAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCisgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKKyB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKK2NhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKK3RoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCitzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKK2EgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKK2FsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCitwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgorb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgorRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA4NDFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQKQEAgLTAsMCArMSwxOSBAQAorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KK1dlYjogaHR0cDovL2lraS5maS9qZXRyby8NCisNCitUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoNCisgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KKyAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0DQorICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3Nlcg0KKyAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUNCisgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuDQorICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbg0KKyAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4NCisNCitUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzDQorTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZmYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogc2hhcGVzLmgsdiAxLjYgMjAwNS8wMS8zMSAyMjoxNTozMCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICovCisKKyNpZm5kZWYgU0hBUEVTX0hfSU5DTFVERUQKKyNkZWZpbmUgU0hBUEVTX0hfSU5DTFVERUQKKworCisjZGVmaW5lIFNVUEVSU0hBUEVfUEFSQU1TIDE1CisKK3N0YXRpYyBjb25zdCBmbG9hdCBzU3VwZXJTaGFwZVBhcmFtc1tdW1NVUEVSU0hBUEVfUEFSQU1TXSA9Cit7CisgICAgLy8gbSAgYSAgICAgYiAgICAgbjEgICAgICBuMiAgICAgbjMgICAgIG0gICAgIGEgICAgIGIgICAgIG4xICAgICBuMiAgICAgIG4zICAgcmVzMSByZXMyIHNjYWxlICAob3JnLnJlczEscmVzMikKKyAgICB7IDEwLCAxLCAgICAyLCAgICA5MCwgICAgICAxLCAgIC00NSwgICAgOCwgICAgMSwgICAgMSwgICAgLTEsICAgICAxLCAgLTAuNGYsICAgMjAsICAzMCwgMiB9LCAvLyA0MCwgNjAKKyAgICB7IDEwLCAxLCAgICAyLCAgICA5MCwgICAgICAxLCAgIC00NSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgICAxLCAgLTAuNGYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7IDEwLCAxLCAgICAyLCAgICA2MCwgICAgICAxLCAgIC0xMCwgICAgNCwgICAgMSwgICAgMSwgICAgLTEsICAgIC0yLCAgLTAuNGYsICAgNDEsICA0MSwgMSB9LCAvLyA4MiwgODIKKyAgICB7ICA2LCAxLCAgICAxLCAgICA2MCwgICAgICAxLCAgIC03MCwgICAgOCwgICAgMSwgICAgMSwgIDAuNGYsICAgICAzLCAgMC4yNWYsICAgMjAsICAyMCwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAyMCwgICAxMiwgICAgMSwgICAgMSwgIDAuNGYsICAgICAzLCAgMC4yNWYsICAgMTAsICAzMCwgMSB9LCAvLyAyMCwgNjAKKyAgICB7ICA4LCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAtNCwgICAgOCwgICAgMiwgICAgMSwgICAgLTEsICAgICA1LCAgIDAuNWYsICAgMjUsICAyNiwgMSB9LCAvLyA2MCwgNjAKKyAgICB7IDEzLCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAtNCwgICAxMywgICAgMSwgICAgMSwgICAgIDEsICAgICA1LCAgICAgIDEsICAgMzAsICAzMCwgNiB9LCAvLyA2MCwgNjAKKyAgICB7IDEwLCAxLCAxLjFmLCAtMC41ZiwgICAwLjFmLCAgICA3MCwgICA2MCwgICAgMSwgICAgMSwgICAtOTAsICAgICAwLCAtMC4yNWYsICAgMjAsICA2MCwgOCB9LCAvLyA2MCwgMTgwCisgICAgeyAgNywgMSwgICAgMSwgICAgMjAsICAtMC4zZiwgLTMuNWYsICAgIDYsICAgIDEsICAgIDEsICAgIC0xLCAgNC41ZiwgICAwLjVmLCAgIDEwLCAgMjAsIDQgfSwgLy8gNjAsIDgwCisgICAgeyAgNCwgMSwgICAgMSwgICAgMTAsICAgICAxMCwgICAgMTAsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMjAsIDEgfSwgLy8gMjAsIDQwCisgICAgeyAgNCwgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDQsICAgIDEsICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgIDEwLCAgMTAsIDIgfSwgLy8gMTAsIDEwCisgICAgeyAgMSwgMSwgICAgMSwgICAgMzgsIC0wLjI1ZiwgICAgMTksICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMTUsIDIgfSwgLy8gMjAsIDQwCisgICAgeyAgMiwgMSwgICAgMSwgIDAuN2YsICAgMC4zZiwgIDAuMmYsICAgIDMsICAgIDEsICAgIDEsICAgMTAwLCAgIDEwMCwgICAgMTAwLCAgIDEwLCAgMjUsIDIgfSwgLy8gMjAsIDUwCisgICAgeyAgNiwgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDMsICAgIDEsICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgIDMwLCAgMzAsIDIgfSwgLy8gNjAsIDYwCisgICAgeyAgMywgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDYsICAgIDEsICAgIDEsICAgICAyLCAgICAgMSwgICAgICAxLCAgIDEwLCAgMjAsIDIgfSwgLy8gMjAsIDQwCisgICAgeyAgNiwgMSwgICAgMSwgICAgIDYsICAgNS41ZiwgICAxMDAsICAgIDYsICAgIDEsICAgIDEsICAgIDI1LCAgICAxMCwgICAgIDEwLCAgIDMwLCAgMjAsIDIgfSwgLy8gNjAsIDQwCisgICAgeyAgMywgMSwgICAgMSwgIDAuNWYsICAgMS43ZiwgIDEuN2YsICAgIDIsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDIwLCAgMjAsIDIgfSwgLy8gNDAsIDQwCisgICAgeyAgNSwgMSwgICAgMSwgIDAuMWYsICAgMS43ZiwgIDEuN2YsICAgIDEsICAgIDEsICAgIDEsICAwLjNmLCAgMC41ZiwgICAwLjVmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCisgICAgeyAgMiwgMSwgICAgMSwgICAgIDYsICAgNS41ZiwgICAxMDAsICAgIDYsICAgIDEsICAgIDEsICAgICA0LCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMjIsIDEgfSwgLy8gNDAsIDQwCisgICAgeyAgNiwgMSwgICAgMSwgICAgLTEsICAgICA3MCwgIDAuMWYsICAgIDksICAgIDEsIDAuNWYsICAgLTk4LCAwLjA1ZiwgICAgLTQ1LCAgIDIwLCAgMzAsIDQgfSwgLy8gNjAsIDkxCisgICAgeyAgNiwgMSwgICAgMSwgICAgLTEsICAgICA5MCwgLTAuMWYsICAgIDcsICAgIDEsICAgIDEsICAgIDkwLCAgMS4zZiwgICAgIDM0LCAgIDEzLCAgMTYsIDEgfSwgLy8gMzIsIDYwCit9OworI2RlZmluZSBTVVBFUlNIQVBFX0NPVU5UIChzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXMpIC8gc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zWzBdKSkKKworCisjZW5kaWYgLy8gIVNIQVBFU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0OGYwZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZmlsdGVyLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MV9DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmlsdGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5NzExOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMKQEAgLTAsMCArMSwxMzAgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoYXJnYyE9MiAmJiBhcmdjIT0zKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIDwwLTY+IFtwYnVmZmVyXVxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCBpbnQgdGVzdCA9IGF0b2koYXJndlsxXSk7CisgICAgaW50IHVzZVBidWZmZXIgPSBhcmdjPT0zICYmICFzdHJjbXAoYXJndlsyXSwgInBidWZmZXIiKTsKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfUEJVRkZFUl9CSVR8RUdMX1dJTkRPV19CSVQsCisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgaWYgKCF1c2VQYnVmZmVyKSB7CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIHByaW50ZigidXNpbmcgcGJ1ZmZlclxuIik7CisgICAgICAgICBFR0xpbnQgYXR0cmlic1tdID0geyBFR0xfV0lEVEgsIDMyMCwgRUdMX0hFSUdIVCwgNDgwLCBFR0xfTk9ORSB9OworICAgICAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJzKTsKKyAgICAgICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSBlcnJvciAleFxuIiwgZWdsR2V0RXJyb3IoKSk7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworICAgICBzd2l0Y2godGVzdCkgCisgICAgIHsKKyAgICAgY2FzZSAxOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAyOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDM6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDQ6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA1OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIHQ1NTUxKTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDY6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCBkaW0sIGRpbSk7CisKKyAgICAgaWYgKCF1c2VQYnVmZmVyKSB7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9IGVsc2UgeworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgfQorICAgICAKKyAgICAgZWdsVGVybWluYXRlKGRweSk7CisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODM2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWZpbmlzaC5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliRUdMIFwKKyAgICBsaWJHTEVTdjFfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbmlzaAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmM3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworCitsb25nIGxvbmcgc3lzdGVtVGltZSgpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X25zZWMgPSAwOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIChsb25nIGxvbmcpKHQudHZfc2VjKSoxMDAwMDAwMDAwTEwgKyB0LnR2X25zZWM7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICAgIGxvbmcgbG9uZyBub3csIHQ7CisgICAgIGludCBpOworCisgICAgIGNoYXIqIHRleGVscyA9IG1hbGxvYyg1MTIqNTEyKjIpOworICAgICBtZW1zZXQodGV4ZWxzLDB4RkYsNTEyKjUxMioyKTsKKyAgICAgCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgNTEyLCA1MTIsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHRleGVscyk7CisKKyAgICAgY2hhciogZHN0ID0gbWFsbG9jKDMyMCo0ODAqMik7CisgICAgIG1lbXNldChkc3QsIDAsIDMyMCo0ODAqMik7CisgICAgIHByaW50ZigiMzA3MjAwIGJ5dGVzIG1lbWNweVxuIik7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBtZW1jcHkoZHN0LCB0ZXhlbHMsIDMyMCo0ODAqMik7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJtZW1jcHkoKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICB9CisgICAgIGZyZWUoZHN0KTsKKworICAgICBmcmVlKHRleGVscyk7CisKKyAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMjApOworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQgKHgyKTpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworCisgICAgIGludDE2X3QgdGV4ZWwgPSAweEY4MDA7CisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgMSwgMSwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJnRleGVsKTsKKworICAgICBwcmludGYoIjF4MSB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiMXgxICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM2MjIwOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0ZXh0dXJlcy5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliRUdMIFwKKyAgICBsaWJHTEVTdjFfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXRleHR1cmVzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQyOTFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7CisgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCAwLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICBnbERyYXdUZXhpT0VTKDAsIGRpbS8yLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QxZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0cml0ZXguYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YxX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10cml0ZXgKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE3ZmViCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYwpAQCAtMCwwICsxLDI3MyBAQAorLy8gQ2FsbHMgZ2xEcmF3RWxlbWVudHMoKSB0aGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZCBieQorLy8gSVRFUkFUSU9OUy4gU2hvdWxkIGRyYXcgYSBjaGVja2VyYm9hcmQgb24gdGhlIHNjcmVlbiBhZnRlcgorLy8gYSBmZXcgc2Vjb25kcy4KKy8vCisvLyBQb3J0ZWQgZnJvbSBhIEphdmEgdmVyc2lvbiBieSBHb29nbGUuCisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+DQorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKw0KK0VHTERpc3BsYXkgZWdsRGlzcGxheTsNCitFR0xTdXJmYWNlIGVnbFN1cmZhY2U7DQorRUdMQ29udGV4dCBlZ2xDb250ZXh0Ow0KK0dMdWludCB0ZXh0dXJlOw0KKw0KKyNkZWZpbmUgRklYRURfT05FIDB4MTAwMDAKKyNkZWZpbmUgSVRFUkFUSU9OUyA1MA0KKw0KK2ludCBpbml0X2dsX3N1cmZhY2Uodm9pZCk7DQordm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCk7DQordm9pZCBpbml0X3NjZW5lKHZvaWQpOw0KK3ZvaWQgcmVuZGVyKGludCBxdWFkcyk7DQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKTsKK2ludCByZWFkVGltZXIodm9pZCk7DQorCitzdGF0aWMgdm9pZCBnbHVMb29rQXQoZmxvYXQgZXllWCwgZmxvYXQgZXllWSwgZmxvYXQgZXllWiwKKyAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCisgICAgICAgIGZsb2F0IHVwWikKK3sKKyAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgorICAgIC8vIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6CisKKyAgICBmbG9hdCBmeCA9IGNlbnRlclggLSBleWVYOworICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7CisgICAgZmxvYXQgZnogPSBjZW50ZXJaIC0gZXllWjsKKworICAgIC8vIE5vcm1hbGl6ZSBmCisgICAgZmxvYXQgcmxmID0gMS4wZiAvIHNxcnRmKGZ4KmZ4ICsgZnkqZnkgKyBmeipmeik7CisgICAgZnggKj0gcmxmOworICAgIGZ5ICo9IHJsZjsKKyAgICBmeiAqPSBybGY7CisKKyAgICAvLyBOb3JtYWxpemUgdXAKKyAgICBmbG9hdCBybHVwID0gMS4wZiAvIHNxcnRmKHVwWCp1cFggKyB1cFkqdXBZICsgdXBaKnVwWik7CisgICAgdXBYICo9IHJsdXA7CisgICAgdXBZICo9IHJsdXA7CisgICAgdXBaICo9IHJsdXA7CisKKyAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQorCisgICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOworICAgIGZsb2F0IHN5ID0gZnogKiB1cFggLSBmeCAqIHVwWjsKKyAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7CisKKyAgICAvLyBjb21wdXRlIHUgPSBzIHggZgorICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7CisgICAgZmxvYXQgdXkgPSBzeiAqIGZ4IC0gc3ggKiBmejsKKyAgICBmbG9hdCB1eiA9IHN4ICogZnkgLSBzeSAqIGZ4OworCisgICAgZmxvYXQgbVsxNl0gOworICAgIG1bMF0gPSBzeDsKKyAgICBtWzFdID0gdXg7CisgICAgbVsyXSA9IC1meDsKKyAgICBtWzNdID0gMC4wZjsKKworICAgIG1bNF0gPSBzeTsKKyAgICBtWzVdID0gdXk7CisgICAgbVs2XSA9IC1meTsKKyAgICBtWzddID0gMC4wZjsKKworICAgIG1bOF0gPSBzejsKKyAgICBtWzldID0gdXo7CisgICAgbVsxMF0gPSAtZno7CisgICAgbVsxMV0gPSAwLjBmOworCisgICAgbVsxMl0gPSAwLjBmOworICAgIG1bMTNdID0gMC4wZjsKKyAgICBtWzE0XSA9IDAuMGY7CisgICAgbVsxNV0gPSAxLjBmOworCisgICAgZ2xNdWx0TWF0cml4ZihtKTsKKyAgICBnbFRyYW5zbGF0ZWYoLWV5ZVgsIC1leWVZLCAtZXllWik7Cit9CisNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQorew0KKyAgICBpbnQgcTsKKyAgICBpbnQgc3RhcnQsIGVuZDsNCisKKyAgICBwcmludGYoIkluaXRpYWxpemluZyBFR0wuLi5cbiIpOworDQorICAgIGlmKCFpbml0X2dsX3N1cmZhY2UoKSkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJHTCBpbml0aWFsaXNhdGlvbiBmYWlsZWQgLSBleGl0aW5nXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGluaXRfc2NlbmUoKTsNCisNCisgICAgY3JlYXRlX3RleHR1cmUoKTsNCisNCisgICAgcHJpbnRmKCJTdGFydCB0ZXN0Li4uXG4iKTsKKworICAgIHJlbmRlcihhcmdjPT0yID8gYXRvaShhcmd2WzFdKSA6IElURVJBVElPTlMpOw0KKw0KKyAgICBmcmVlX2dsX3N1cmZhY2UoKTsNCisNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBpbml0X2dsX3N1cmZhY2Uodm9pZCkNCit7DQorICAgIEVHTGludCBudW1Db25maWdzID0gMTsNCisgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9Ow0KKyAgICBFR0xpbnQgYXR0cmliW10gPQ0KKyAgICB7DQorICAgICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwNCisgICAgICAgICAgICBFR0xfTk9ORQ0KKyAgICB9Ow0KKw0KKyAgICBpZiAoIChlZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKSkgPT0gRUdMX05PX0RJU1BMQVkgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCBOVUxMLCBOVUxMKSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgYXR0cmliLCAmbXlDb25maWcsIDEsICZudW1Db25maWdzKSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIChlZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBteUNvbmZpZywKKyAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgMCkpID09IEVHTF9OT19TVVJGQUNFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIChlZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBteUNvbmZpZywgMCwgMCkpID09IEVHTF9OT19DT05URVhUICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIGVnbFN1cmZhY2UsIGVnbFN1cmZhY2UsIGVnbENvbnRleHQpICE9IEVHTF9UUlVFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgcmV0dXJuIDE7DQorfQ0KKw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBpZiAoZWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkNCisgICAgew0KKyAgICAgICAgZWdsTWFrZUN1cnJlbnQoIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSwNCisgICAgICAgICAgICAgICAgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUICk7DQorICAgICAgICBlZ2xEZXN0cm95Q29udGV4dCggZWdsRGlzcGxheSwgZWdsQ29udGV4dCApOw0KKyAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UoIGVnbERpc3BsYXksIGVnbFN1cmZhY2UgKTsNCisgICAgICAgIGVnbFRlcm1pbmF0ZSggZWdsRGlzcGxheSApOw0KKyAgICAgICAgZWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOw0KKyAgICB9DQorfQ0KKw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKQ0KK3sNCisgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIGZsb2F0IHJhdGlvID0gMzIwLjBmIC8gNDgwLjBmOworICAgIGdsVmlld3BvcnQoMCwgMCwgMzIwLCA0ODApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMSwgMTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7DQorICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2x1TG9va0F0KAorICAgICAgICAgICAgMCwgMCwgMywgIC8vIGV5ZQorICAgICAgICAgICAgMCwgMCwgMCwgIC8vIGNlbnRlcgorICAgICAgICAgICAgMCwgMSwgMCk7IC8vIHVwCisNCisgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsNCisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKK30NCisNCit2b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpDQorew0KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb24gPSAweGZmMDAwMGZmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmYgPSAweGZmZmZmZmZmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbHNbXSA9CisgICAgeworICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgfTsNCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZSk7DQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7DQorICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA4LCA4LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOw0KKyAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7DQorfQ0KKw0KK3ZvaWQgcmVuZGVyKGludCBxdWFkcykNCit7DQorICAgIGludCBpLCBqOw0KKw0KKyAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7DQorICAgICAgICAgICAgLTEsICAtMSwgIDAsDQorICAgICAgICAgICAgIDEsICAtMSwgIDAsDQorICAgICAgICAgICAgIDEsICAgMSwgIDAsDQorICAgICAgICAgICAgLTEsICAgMSwgIDANCisgICAgfTsNCisNCisgICAgY29uc3QgR0xmaXhlZCB0ZXhDb29yZHNbXSA9IHsNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgRklYRURfT05FLCAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgRklYRURfT05FLA0KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgRklYRURfT05FDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMdXNob3J0IHRlbXBsYXRlW10gPSB7IDAsIDEsIDIsICAwLCAyLCAzIH07CisKKworICAgIEdMdXNob3J0KiBpbmRpY2VzID0gKEdMdXNob3J0KiltYWxsb2MocXVhZHMqc2l6ZW9mKHRlbXBsYXRlKSk7CisgICAgZm9yIChpPTAgOyBpPHF1YWRzIDsgaSsrKQorICAgICAgICBtZW1jcHkoaW5kaWNlcysoc2l6ZW9mKHRlbXBsYXRlKS9zaXplb2YoaW5kaWNlc1swXSkpKmksIHRlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKKw0KKyAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsNCisgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHRleENvb3Jkcyk7CisKKyAgICAvLyBtYWtlIHN1cmUgdG8gZG8gYSBjb3VwbGUgZWdsU3dhcEJ1ZmZlcnMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZQorICAgIC8vIG5vIHByb2JsZW1zIHdpdGggdGhlIHZlcnkgZmlyc3Qgb25lcyAod2hvIGtub3dzKQorICAgIGdsQ2xlYXJDb2xvcigwLjQsIDAuNCwgMC40LCAwLjQpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOworICAgIGdsQ2xlYXJDb2xvcigwLjYsIDAuNiwgMC42LCAwLjYpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOworICAgIGdsQ2xlYXJDb2xvcigxLjAsIDEuMCwgMS4wLCAxLjApOworCisgICAgZm9yIChqPTAgOyBqPDEwIDsgaisrKSB7CisgICAgICAgIHByaW50ZigibG9vcCAlZCAvIDEwICglZCBxdWFkcyAvIGxvb3ApXG4iLCBqLCBxdWFkcyk7CisKKyAgICAgICAgaW50IG5lbGVtID0gc2l6ZW9mKHRlbXBsYXRlKS9zaXplb2YodGVtcGxhdGVbMF0pOworICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBuZWxlbSpxdWFkcywgR0xfVU5TSUdORURfU0hPUlQsIGluZGljZXMpOworICAgICAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICB9CisKKyAgICBmcmVlKGluZGljZXMpOw0KK30NCisK