submission 30576
KernelBot user 415 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
amd-fp8-mm-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-30576?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz
Benchmark evidence
18 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
69.9µs
#21 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
70.4µs
#21 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
120.5µs
#31 of 98
2025-06-02
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
168.8µs
#23 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
168.9µs
#31 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
194.0µs
#24 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
254.8µs
#18 of 98
2025-06-02
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
648.2µs
#12 of 98
2025-06-02
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:f5c9f4bbf5b929c12956685e3c99ce30339f617485a26661b4727eab52be1847
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
amd-fp8-mm-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMsIHRvcmNoOjpUZW5zb3IgY190bXApOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCg0KY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsNCg0KI2RlZmluZSBTV1pfMzJmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8zMngzMl8xNngxNl9mdDIoDQogICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzMyXVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlszMl1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAzMjsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMzI7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAxNjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAxNjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMzIgKyAodGhyZWFkSWR4LnggLyA4KSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDgpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsxXVsxXSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsxXVs0XVs0XSwgbGRnX2IgIFsxXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzFdWzRdWzRdLCBsZGdfYl90WzFdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzMyZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMzJmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMV1bMV0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzFdWzRdLCB0aWxlX2JbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8zMmZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzMyZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGluc2l0dV90cmFuc3Bvc2VfMTI4eDEyOChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwgaW50IG0sIGludCBuKSB7DQogICAgLy8gdHJhbnNwb3NlIGluIGV2ZXJ5IDEyOHgxMjggYmxvY2sNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHRocmVhZF9tID0gdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCB0aHJlYWRfbiA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogc21lbVsxMjhdWzEyOV07DQoNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGRhdGFbMTZdOw0KDQogICAgKihmbG9hdDQgKikmZGF0YVswXSA9ICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQogICAgICAgIHNtZW1bdGhyZWFkX24gKyBpXVt0aHJlYWRfbV0gPSBkYXRhW2ldOw0KICAgICAgICAvLyBzbWVtW3RocmVhZF9uICsgaV1bKCh0aHJlYWRfbiAvIDE2KSAqIDE2ICsgdGhyZWFkX20pICUgMTI4XSA9IGRhdGFbaV07IC8vIHN3aXp6bGUNCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXSA9ICooZmxvYXQ0ICopJnNtZW1bdGhyZWFkX21dW3RocmVhZF9uXTsNCiAgICAvLyAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXSA9ICooZmxvYXQ0ICopJnNtZW1bdGhyZWFkX21dWygodGhyZWFkX20gLyAxNikgKiAxNiArIHRocmVhZF9uKSAlIDEyOF07IC8vIHN3aXp6bGUNCn0NCg0KI2RlZmluZSBTV1pfMTI4cHQobSwgbikgKCgobSkgKiA4ICsgKG4pKSAlIDEyOCkNCl9fbGF1bmNoX2JvdW5kc19fKDUxMiwgMikNCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9wdCgNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGFzLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzEyOF1bMTI4XTsNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2JbMTI4XVsxMjhdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhdmVfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogMzI7DQogICAgaW50IHdhdmVfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSAgdGhyZWFkSWR4LnggJSAxNjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfbW4gPSB0aHJlYWRJZHgueSAqIDggKyB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHN0c19rICA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfazsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19rOw0KICAgIGludCBsZGdfayA9IHN0c19tbjsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FbMl1bMTZdLCBsZGdfYlsyXVsxNl07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKWxkZ19hW2lpXSA9ICooZmxvYXQ0ICopJmFbKGxkZ19rICsgaWIqQkxPQ0sgKyBpaSo2NCkgKiBtICsgbGRnX21dOw0KICAgICAgICAgICAgKihmbG9hdDQgKilsZGdfYltpaV0gPSAqKGZsb2F0NCAqKSZiWyhsZGdfayArIGliKkJMT0NLICsgaWkqNjQpICogbiArIGxkZ19uXTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Fbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICAgICldID0gKihsb25nICopJmxkZ19hW2lpXVswXTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYVtzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgKyA4KV0gPSAqKGxvbmcgKikmbGRnX2FbaWldWzhdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19iW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayAgICApXSA9ICoobG9uZyAqKSZsZGdfYltpaV1bMF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Jbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICsgOCldID0gKihsb25nICopJmxkZ19iW2lpXVs4XTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzJdWzRdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsyXVs0XSwgdGlsZV9iWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfMTI4cHQobGRzX20sIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbampdW2trXSA9ICoobG9uZyAqKSZsZHNfYltsZHNfbiArIGpqKjE2XVtTV1pfMTI4cHQobGRzX24sIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KI2RlZmluZSBTV1pfMTI4ZnQyKG0sIG4pICgoKG0pICogOCArICgobSkgLyAxNikgKiA4ICsgKG4pKSAlIDEyOCkNCl9fbGF1bmNoX2JvdW5kc19fKDUxMiwgMikNCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9mdDIoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX2sgID0gdGhyZWFkSWR4LnkgKiA4ICsgKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgc3RzX21uID0gKHRocmVhZElkeC54ICUgMzIpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsyXVs0XVs0XSwgbGRnX2IgIFsyXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzJdWzRdWzRdLCBsZGdfYl90WzJdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9IGxkZ19tIDwgbSA/ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXSA6IDA7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19iW2lpXVtqal0gPSBsZGdfbiA8IG4gPyAqKGZsb2F0ICopJmJbKGxkZ19rICsgaWkqNjQgKyBqaiArIGliKkJMT0NLKSAqIG4gKyBsZGdfbl0gOiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZmxvYXQgdGhpc19hc1syXVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopdGhpc19hc1tpaV0gPSBhc19tICsgaWkqMTYgPCBtID8gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl0gOiAwOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBsZGdfYV90W2lpXVtqal1ba2tdID0gbGRnX2FbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgICAgIGxkZ19iX3RbaWldW2pqXVtra10gPSBsZGdfYltpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Fbc3RzX21uICsgampdW1NXWl8xMjhmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2FfdFtpaV1bampdOw0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Jbc3RzX21uICsgampdW1NXWl8xMjhmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMl1bNF0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzJdWzRdLCB0aWxlX2JbNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8xMjhmdDIobGRzX20gKyBpaSoxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltqal1ba2tdID0gKihsb25nICopJmxkc19iW2xkc19uICsgamoqMTZdW1NXWl8xMjhmdDIobGRzX24gKyBqaioxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrX3RpbGVfZFtpaV1bampdID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHRpbGVfYVtpaV1ba2tdLCB0aWxlX2JbampdW2trXSwgYmxvY2tfdGlsZV9kW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2RbaWldW2pqXVtra10gKz0gYmxvY2tfdGlsZV9kW2lpXVtqal1ba2tdICogdGhpc19hc1tpaV1ba2tdICogdGhpc19iczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQogICAgfQ0KDQogICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIHJlc3VsdCBhcyBiZjE2DQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjE2IDwgbSAmJiBjX24gKyBqaioxNiA8IG4pIHsNCiAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMTYgKyBraykgKiBuICsgY19uICsgamoqMTZdID0gKF9faGlwX2JmbG9hdDE2KSh0aWxlX2RbaWldW2pqXVtra10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19sYXVuY2hfYm91bmRzX18oNTEyLCAyKQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8xMjh4MTI4X2Z0Ml9zcGxpdDQoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgZmxvYXQqIF9fcmVzdHJpY3RfXyBjLA0KICAgICAgICBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCBzcGxpdF9pZHggPSBibG9ja0lkeC56Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX2sgID0gdGhyZWFkSWR4LnkgKiA4ICsgKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgc3RzX21uID0gKHRocmVhZElkeC54ICUgMzIpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gc3BsaXRfaWR4ICogKGsvQkxPQ0svNCk7IGliIDwgKHNwbGl0X2lkeCArIDEpICogKGsvQkxPQ0svNCk7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYSAgWzJdWzRdWzRdLCBsZGdfYiAgWzJdWzRdWzRdOw0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hX3RbMl1bNF1bNF0sIGxkZ19iX3RbMl1bNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYVtpaV1bampdID0gbGRnX20gPCBtID8gKihmbG9hdCAqKSZhWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBtICsgbGRnX21dIDogMDsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9IGxkZ19uIDwgbiA/ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXSA6IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9IGFzX20gKyBpaSoxNiA8IG0gPyAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYV90W2lpXVtqal07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYltzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYl90W2lpXVtqal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daXzEyOGZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzEyOGZ0MihsZHNfbiArIGpqKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmbG9hdCAqc3BsaXRfYyA9IGMgKyBzcGxpdF9pZHggKiAobSAqIG4pOw0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIHNwbGl0X2NbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9ICh0aWxlX2RbaWldW2pqXVtra10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9mdDJfc3BsaXQ0X21lcmdlKGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gY19zcGxpdCwgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4pIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4LnggKiA4OyBpIDwgbjsgaSArPSBibG9ja0RpbS54ICogOCkgew0KICAgICAgICBmbG9hdDQgdmFsMFsyXSwgdmFsMVsyXSwgdmFsMlsyXSwgdmFsM1syXTsNCiAgICAgICAgdmFsMFswXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGldOw0KICAgICAgICB2YWwwWzFdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIDRdOw0KICAgICAgICB2YWwxWzBdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIG0gKiBuXTsNCiAgICAgICAgdmFsMVsxXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGkgKyA0ICsgbSAqIG5dOw0KICAgICAgICB2YWwyWzBdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIDIgKiBtICogbl07DQogICAgICAgIHZhbDJbMV0gPSAqKGZsb2F0NCAqKSZjX3NwbGl0W2lkeCAqIG4gKyBpICsgNCArIDIgKiBtICogbl07DQogICAgICAgIHZhbDNbMF0gPSAqKGZsb2F0NCAqKSZjX3NwbGl0W2lkeCAqIG4gKyBpICsgMyAqIG0gKiBuXTsNCiAgICAgICAgdmFsM1sxXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGkgKyA0ICsgMyAqIG0gKiBuXTsNCg0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBzdW1bOF07DQogICAgICAgIHN1bVswXSA9IHZhbDBbMF1bMF0gKyB2YWwxWzBdWzBdICsgdmFsMlswXVswXSArIHZhbDNbMF1bMF07DQogICAgICAgIHN1bVsxXSA9IHZhbDBbMF1bMV0gKyB2YWwxWzBdWzFdICsgdmFsMlswXVsxXSArIHZhbDNbMF1bMV07DQogICAgICAgIHN1bVsyXSA9IHZhbDBbMF1bMl0gKyB2YWwxWzBdWzJdICsgdmFsMlswXVsyXSArIHZhbDNbMF1bMl07DQogICAgICAgIHN1bVszXSA9IHZhbDBbMF1bM10gKyB2YWwxWzBdWzNdICsgdmFsMlswXVszXSArIHZhbDNbMF1bM107DQogICAgICAgIHN1bVs0XSA9IHZhbDBbMV1bMF0gKyB2YWwxWzFdWzBdICsgdmFsMlsxXVswXSArIHZhbDNbMV1bMF07DQogICAgICAgIHN1bVs1XSA9IHZhbDBbMV1bMV0gKyB2YWwxWzFdWzFdICsgdmFsMlsxXVsxXSArIHZhbDNbMV1bMV07DQogICAgICAgIHN1bVs2XSA9IHZhbDBbMV1bMl0gKyB2YWwxWzFdWzJdICsgdmFsMlsxXVsyXSArIHZhbDNbMV1bMl07DQogICAgICAgIHN1bVs3XSA9IHZhbDBbMV1bM10gKyB2YWwxWzFdWzNdICsgdmFsMlsxXVszXSArIHZhbDNbMV1bM107DQoNCiAgICAgICAgKihmbG9hdDQgKikmY1tpZHggKiBuICsgaV0gPSAqKGZsb2F0NCAqKSZzdW1bMF07DQogICAgfQ0KfQ0KDQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMsIHRvcmNoOjpUZW5zb3IgY190bXApIHsNCiAgICBpbnQgbSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgayA9IGEuc2l6ZSgxKTsNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6KiBhX3B0ciA9IChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCk7DQogICAgX19oaXBfZnA4X2U0bTNfZm51eiogYl9wdHIgPSAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpOw0KICAgIF9faGlwX2JmbG9hdDE2KiBjX3B0ciA9IChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpOw0KICAgIGZsb2F0KiBjX3RtcF9wdHIgPSAoZmxvYXQqKWNfdG1wLmRhdGFfcHRyKCk7DQogICAgZmxvYXQqIGFzX3B0ciA9IChmbG9hdCopYXMuZGF0YV9wdHIoKTsNCiAgICBmbG9hdCogYnNfcHRyID0gKGZsb2F0Kilicy5kYXRhX3B0cigpOw0KICAgIC8vIG1tc3BsaXRrDQogICAgLy8gMC4gbTogMTAyNDsgbjogMTUzNjsgazogNzE2ODsNCiAgICAvLyAyLiBtOiAxMDI0OyBuOiA1NzYgOyBrOiA3MTY4Ow0KICAgIC8vIDcuIG06IDEwMjQ7IG46IDUxMiA7IGs6IDcxNjg7DQogICAgaWYgKG0gPT0gMTAyNCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4IHx8DQogICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDU3NiAgJiYgayA9PSA3MTY4IHx8DQogICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDUxMiAgJiYgayA9PSA3MTY4KSB7DQogICAgICAgIGZwOF9tbV8xMjh4MTI4X2Z0Ml9zcGxpdDQ8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCwgNCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+IChhX3B0ciwgYl9wdHIsIGFzX3B0ciwgYnNfcHRyLCBjX3RtcF9wdHIsIG0sIG4sIGspOw0KICAgICAgICBmcDhfbW1fMTI4eDEyOF9mdDJfc3BsaXQ0X21lcmdlPDw8ZGltMyhtKSwgZGltMyg2NCksIDAsIDA+Pj4oY190bXBfcHRyLCBjX3B0ciwgbSwgbik7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgLy8gbW0xMjh4MTI4ZnQyDQogICAgLy8gMS4gbTogMTAyNDsgbjogMzA3MjsgazogMTUzNjsNCiAgICAvLyAzLiBtOiAxMDI0OyBuOiA3MTY4OyBrOiAyNTYgOw0KICAgIC8vIDQuIG06IDEwMjQ7IG46IDcxNjg7IGs6IDIwNDg7DQogICAgLy8gNS4gbTogMTAyNDsgbjogNDYwODsgazogNzE2ODsNCiAgICAvLyA4LiBtOiAxMDI0OyBuOiA0MDk2OyBrOiA1MTIgOw0KICAgIC8vIDExLiBtOiA2MTQ0OyBuOiA1NzYgOyBrOiA3MTY4Ow0KICAgIC8vIDE2LiBtOiA2MTQ0OyBuOiA1MTIgOyBrOiA3MTY4Ow0KICAgIGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2IHx8DQogICAgICAgICAgICAgbSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDI1NiAgfHwNCiAgICAgICAgICAgICBtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjA0OCB8fA0KICAgICAgICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDQ2MDggJiYgayA9PSA3MTY4IHx8DQogICAgICAgICAgICAgbSA9PSAxMDI0ICYmIG4gPT0gNDA5NiAmJiBrID09IDUxMiAgfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA1NzYgICYmIGsgPT0gNzE2OCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDUxMiAgJiYgayA9PSA3MTY4KSB7DQogICAgICAgIGZwOF9tbV8xMjh4MTI4X2Z0Mjw8PGRpbTMoKG0rMTI3KS8xMjgsIChuKzEyNykvMTI4KSwgZGltMyg2NCwgOCksIDAsIDA+Pj4gKGFfcHRyLCBiX3B0ciwgYXNfcHRyLCBic19wdHIsIGNfcHRyLCBtLCBuLCBrKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICAvLyBtbTEyOHgxMjhwdA0KICAgIC8vIDYuIG06IDEwMjQ7IG46IDcxNjg7IGs6IDIzMDQ7DQogICAgLy8gOS4gbTogNjE0NDsgbjogMTUzNjsgazogNzE2ODsNCiAgICAvLyAxMC4gbTogNjE0NDsgbjogMzA3MjsgazogMTUzNjsNCiAgICAvLyAxMi4gbTogNjE0NDsgbjogNzE2ODsgazogMjU2IDsNCiAgICAvLyAxMy4gbTogNjE0NDsgbjogNzE2ODsgazogMjA0ODsNCiAgICAvLyAxNC4gbTogNjE0NDsgbjogNDYwODsgazogNzE2ODsNCiAgICAvLyAxNS4gbTogNjE0NDsgbjogNzE2ODsgazogMjMwNDsNCiAgICAvLyAxNy4gbTogNjE0NDsgbjogNDA5NjsgazogNTEyIDsNCiAgICBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4IHx8DQogICAgICAgICAgICAgbSA9PSA2MTQ0ICYmIG4gPT0gMzA3MiAmJiBrID09IDE1MzYgfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2ICB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4IHx8DQogICAgICAgICAgICAgbSA9PSA2MTQ0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjggfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDQwOTYgJiYgayA9PSA1MTIpIHsNCiAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG0rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KGFfcHRyLCBrLCBtKTsNCiAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KGJfcHRyLCBrLCBuKTsNCiAgICAgICAgZnA4X21tXzEyOHgxMjhfcHQ8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+IChhX3B0ciwgYl9wdHIsIGFzX3B0ciwgYnNfcHRyLCBjX3B0ciwgbSwgbiwgayk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGZwOF9tbV8zMngzMl8xNngxNl9mdDI8PDxkaW0zKChtKzMxKS8zMiwgKG4rMzEpLzMyKSwgZGltMyg2NCwgNCksIDAsIDA+Pj4gKGFfcHRyLCBiX3B0ciwgYXNfcHRyLCBic19wdHIsIGNfcHRyLCBtLCBuLCBrKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQoNCm1vZHVsZSA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGENCiAgICBtLCBuLCBrID0gYS5zaGFwZVswXSwgYi5zaGFwZVswXSwgYS5zaGFwZVsxXQ0KICAgIGlmIChtID09IDEwMjQgYW5kIG4gPT0gMTUzNiBhbmQgayA9PSA3MTY4IG9yDQogICAgICAgIG0gPT0gMTAyNCBhbmQgbiA9PSA1NzYgIGFuZCBrID09IDcxNjggb3INCiAgICAgICAgbSA9PSAxMDI0IGFuZCBuID09IDUxMiAgYW5kIGsgPT0gNzE2OCk6DQogICAgICAgIGNfdG1wID0gdG9yY2guZW1wdHkobSAqIG4gKiA0LCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKQ0KICAgICAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMsIGNfdG1wKQ0KICAgIGVsc2U6DQogICAgICAgIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYywgYykNCiAgICByZXR1cm4gYw==Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 30355.
- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCkNQUF9XUkFQUEVSID0gIiIiDQp2b2lkIGZwOF9tbSh0b3JjaDo6VGVuc29yIGEsIHRvcmNoOjpUZW5zb3IgYiwgdG9yY2g6OlRlbnNvciBhcywgdG9yY2g6OlRlbnNvciBicywgdG9yY2g6OlRlbnNvciBjKTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+DQoNCmNvbnN0ZXhwciBjb25zdCBpbnQgQkxPQ0sgPSAxMjg7DQoNCiNkZWZpbmUgU1daXzMyZnQyKG0sIG4pICgoKG0pICogOCArICgobSkgLyAxNikgKiA4ICsgKG4pKSAlIDEyOCkNCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMzJ4MzJfMTZ4MTZfZnQyKA0KICAgICAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYXMsDQogICAgICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVszMl1bMTI4XTsNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2JbMzJdWzEyOF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMzI7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDMyOw0KDQogICAgaW50IHdhdmVfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogMTY7DQogICAgaW50IHdhdmVfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogMTY7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSAgdGhyZWFkSWR4LnggJSAxNjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfayAgPSB0aHJlYWRJZHgueSAqIDMyICsgKHRocmVhZElkeC54IC8gOCkgKiA0Ow0KICAgIGludCBzdHNfbW4gPSAodGhyZWFkSWR4LnggJSA4KSAqIDQ7DQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfbW47DQogICAgaW50IGxkZ19uID0gdGhyZWFkX2Jsb2NrX24gKyBzdHNfbW47DQogICAgaW50IGxkZ19rID0gc3RzX2s7DQoNCiAgICAvLyBMRFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgbGRzX20gPSB3YXZlX20gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfbiA9IHdhdmVfbiArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19rID0gKHRocmVhZElkeC54IC8gMTYpICogODsNCg0KICAgIC8vIEMmRCBQYXJhbWV0ZXJzDQogICAgaW50IGNfbSA9IHRocmVhZF9ibG9ja19tICsgd2F2ZV9tICsgdGhyZWFkX2NfbTsNCiAgICBpbnQgY19uID0gdGhyZWFkX2Jsb2NrX24gKyB3YXZlX24gKyB0aHJlYWRfY19uOw0KDQogICAgaW50IGFzX20gPSBjX207DQogICAgaW50IGJzX24gPSBjX24gLyBCTE9DSzsNCg0KICAgIGZsb2F0NCB0aWxlX2RbMV1bMV0gPSB7MH07DQoNCiAgICBmb3IgKGludCBpYiA9IDA7IGliIDwgay9CTE9DSzsgaWIrKykgew0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hICBbMV1bNF1bNF0sIGxkZ19iICBbMV1bNF1bNF07DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FfdFsxXVs0XVs0XSwgbGRnX2JfdFsxXVs0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDE7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19hW2lpXVtqal0gPSAqKGZsb2F0ICopJmFbKGxkZ19rICsgaWkqMzIgKyBqaiArIGliKkJMT0NLKSAqIG0gKyBsZGdfbV07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19iW2lpXVtqal0gPSAqKGZsb2F0ICopJmJbKGxkZ19rICsgaWkqMzIgKyBqaiArIGliKkJMT0NLKSAqIG4gKyBsZGdfbl07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzFdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9ICooZmxvYXQ0ICopJmFzW2liKm0gKyBhc19tICsgaWkqMTZdOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBsZGdfYV90W2lpXVtqal1ba2tdID0gbGRnX2FbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgICAgIGxkZ19iX3RbaWldW2pqXVtra10gPSBsZGdfYltpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Fbc3RzX21uICsgampdW1NXWl8zMmZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYV90W2lpXVtqal07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYltzdHNfbW4gKyBqal1bU1daXzMyZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19iX3RbaWldW2pqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzFdWzFdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsxXVs0XSwgdGlsZV9iWzFdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfMzJmdDIobGRzX20gKyBpaSoxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltqal1ba2tdID0gKihsb25nICopJmxkc19iW2xkc19uICsgamoqMTZdW1NXWl8zMmZ0MihsZHNfbiArIGpqKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDE7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMTsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KI2RlZmluZSBTV1pfNjRmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19sYXVuY2hfYm91bmRzX18oMjU2LCA0KQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV82NHg2NF8zMngzMl9mdDIoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVs2NF1bMTI4XTsNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2JbNjRdWzEyOF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogNjQ7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDY0Ow0KDQogICAgaW50IHdhdmVfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogMzI7DQogICAgaW50IHdhdmVfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogMzI7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSAgdGhyZWFkSWR4LnggJSAxNjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfayAgPSB0aHJlYWRJZHgueSAqIDE2ICsgKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgc3RzX21uID0gKHRocmVhZElkeC54ICUgMTYpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVsyXSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsyXVs0XVs0XSwgbGRnX2IgIFsyXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzJdWzRdWzRdLCBsZGdfYl90WzJdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9IGxkZ19tIDwgbSA/ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXSA6IDA7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19iW2lpXVtqal0gPSBsZGdfbiA8IG4gPyAqKGZsb2F0ICopJmJbKGxkZ19rICsgaWkqNjQgKyBqaiArIGliKkJMT0NLKSAqIG4gKyBsZGdfbl0gOiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZmxvYXQgdGhpc19hc1syXVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopdGhpc19hc1tpaV0gPSBhc19tICsgaWkqMTYgPCBtID8gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl0gOiAwOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBsZGdfYV90W2lpXVtqal1ba2tdID0gbGRnX2FbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgICAgIGxkZ19iX3RbaWldW2pqXVtra10gPSBsZGdfYltpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Fbc3RzX21uICsgampdW1NXWl82NGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYV90W2lpXVtqal07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYltzdHNfbW4gKyBqal1bU1daXzY0ZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19iX3RbaWldW2pqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzJdWzJdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsyXVs0XSwgdGlsZV9iWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfNjRmdDIobGRzX20gKyBpaSoxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltqal1ba2tdID0gKihsb25nICopJmxkc19iW2xkc19uICsgamoqMTZdW1NXWl82NGZ0MihsZHNfbiArIGpqKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAyOyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgMjsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMTYgPCBtICYmIGNfbiArIGpqKjE2IDwgbikgew0KICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4KGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLCBpbnQgbSwgaW50IG4pIHsNCiAgICAvLyB0cmFuc3Bvc2UgaW4gZXZlcnkgMTI4eDEyOCBibG9jaw0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgdGhyZWFkX20gPSB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHRocmVhZF9uID0gKHRocmVhZElkeC54ICUgOCkgKiAxNjsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBzbWVtWzEyOF1bMTI5XTsNCg0KICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogZGF0YVsxNl07DQoNCiAgICAqKGZsb2F0NCAqKSZkYXRhWzBdID0gKihmbG9hdDQgKikmYVsodGhyZWFkX2Jsb2NrX20gKyB0aHJlYWRfbSkgKiBuICsgdGhyZWFkX2Jsb2NrX24gKyB0aHJlYWRfbl07DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsNCiAgICAgICAgc21lbVt0aHJlYWRfbiArIGldW3RocmVhZF9tXSA9IGRhdGFbaV07DQogICAgICAgIC8vIHNtZW1bdGhyZWFkX24gKyBpXVsoKHRocmVhZF9uIC8gMTYpICogMTYgKyB0aHJlYWRfbSkgJSAxMjhdID0gZGF0YVtpXTsgLy8gc3dpenpsZQ0KICAgIH0NCg0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dID0gKihmbG9hdDQgKikmc21lbVt0aHJlYWRfbV1bdGhyZWFkX25dOw0KICAgIC8vICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dID0gKihmbG9hdDQgKikmc21lbVt0aHJlYWRfbV1bKCh0aHJlYWRfbSAvIDE2KSAqIDE2ICsgdGhyZWFkX24pICUgMTI4XTsgLy8gc3dpenpsZQ0KfQ0KDQojZGVmaW5lIFNXWl8xMjhwdChtLCBuKSAoKChtKSAqIDggKyAobikpICUgMTI4KQ0KX19sYXVuY2hfYm91bmRzX18oNTEyLCAyKQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8xMjh4MTI4X3B0KA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGIsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYXMsDQogICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgIF9faGlwX2JmbG9hdDE2KiBfX3Jlc3RyaWN0X18gYywgaW50IG0sIGludCBuLCBpbnQgaykgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2FbMTI4XVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlsxMjhdWzEyOF07DQoNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX20gPSBibG9ja0lkeC54ICogMTI4Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbiA9IGJsb2NrSWR4LnkgKiAxMjg7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAzMjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiA2NDsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19tbiA9IHRocmVhZElkeC55ICogOCArIHRocmVhZElkeC54IC8gODsNCiAgICBpbnQgc3RzX2sgID0gKHRocmVhZElkeC54ICUgOCkgKiAxNjsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19rOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX2s7DQogICAgaW50IGxkZ19rID0gc3RzX21uOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2F2ZV9tICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX24gPSB3YXZlX24gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDg7DQoNCiAgICAvLyBDJkQgUGFyYW1ldGVycw0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhdmVfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2F2ZV9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGludCBhc19tID0gY19tOw0KICAgIGludCBic19uID0gY19uIC8gQkxPQ0s7DQoNCiAgICBmbG9hdDQgdGlsZV9kWzJdWzRdID0gezB9Ow0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IGsvQkxPQ0s7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYVsyXVsxNl0sIGxkZ19iWzJdWzE2XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopbGRnX2FbaWldID0gKihmbG9hdDQgKikmYVsobGRnX2sgKyBpYipCTE9DSyArIGlpKjY0KSAqIG0gKyBsZGdfbV07DQogICAgICAgICAgICAqKGZsb2F0NCAqKWxkZ19iW2lpXSA9ICooZmxvYXQ0ICopJmJbKGxkZ19rICsgaWIqQkxPQ0sgKyBpaSo2NCkgKiBuICsgbGRnX25dOw0KICAgICAgICB9DQoNCiAgICAgICAgZmxvYXQgdGhpc19hc1syXVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopdGhpc19hc1tpaV0gPSAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XTsNCiAgICAgICAgfQ0KICAgICAgICBmbG9hdCB0aGlzX2JzID0gYnNbaWIgKiAoKG4rQkxPQ0stMSkvQkxPQ0spICsgYnNfbl07DQoNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYVtzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgICAgKV0gPSAqKGxvbmcgKikmbGRnX2FbaWldWzBdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19hW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayArIDgpXSA9ICoobG9uZyAqKSZsZGdfYVtpaV1bOF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Jbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICAgICldID0gKihsb25nICopJmxkZ19iW2lpXVswXTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYltzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgKyA4KV0gPSAqKGxvbmcgKikmbGRnX2JbaWldWzhdOw0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMl1bNF0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzJdWzRdLCB0aWxlX2JbNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8xMjhwdChsZHNfbSwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltqal1ba2tdID0gKihsb25nICopJmxkc19iW2xkc19uICsgamoqMTZdW1NXWl8xMjhwdChsZHNfbiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrX3RpbGVfZFtpaV1bampdID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHRpbGVfYVtpaV1ba2tdLCB0aWxlX2JbampdW2trXSwgYmxvY2tfdGlsZV9kW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2RbaWldW2pqXVtra10gKz0gYmxvY2tfdGlsZV9kW2lpXVtqal1ba2tdICogdGhpc19hc1tpaV1ba2tdICogdGhpc19iczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQogICAgfQ0KDQogICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIHJlc3VsdCBhcyBiZjE2DQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgY1soY19tICsgaWkqMTYgKyBraykgKiBuICsgY19uICsgamoqMTZdID0gKF9faGlwX2JmbG9hdDE2KSh0aWxlX2RbaWldW2pqXVtra10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQojZGVmaW5lIFNXWl8xMjhmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19sYXVuY2hfYm91bmRzX18oNTEyLCAyKQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8xMjh4MTI4X2Z0MigNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGFzLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzEyOF1bMTI4XTsNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2JbMTI4XVsxMjhdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhdmVfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogMzI7DQogICAgaW50IHdhdmVfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSAgdGhyZWFkSWR4LnggJSAxNjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfayAgPSB0aHJlYWRJZHgueSAqIDggKyAodGhyZWFkSWR4LnggLyAzMikgKiA0Ow0KICAgIGludCBzdHNfbW4gPSAodGhyZWFkSWR4LnggJSAzMikgKiA0Ow0KICAgIGludCBsZGdfbSA9IHRocmVhZF9ibG9ja19tICsgc3RzX21uOw0KICAgIGludCBsZGdfbiA9IHRocmVhZF9ibG9ja19uICsgc3RzX21uOw0KICAgIGludCBsZGdfayA9IHN0c19rOw0KDQogICAgLy8gTERTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IGxkc19tID0gd2F2ZV9tICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX24gPSB3YXZlX24gKyB0aHJlYWRJZHgueCAlIDE2Ow0KICAgIGludCBsZHNfayA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDg7DQoNCiAgICAvLyBDJkQgUGFyYW1ldGVycw0KICAgIGludCBjX20gPSB0aHJlYWRfYmxvY2tfbSArIHdhdmVfbSArIHRocmVhZF9jX207DQogICAgaW50IGNfbiA9IHRocmVhZF9ibG9ja19uICsgd2F2ZV9uICsgdGhyZWFkX2NfbjsNCg0KICAgIGludCBhc19tID0gY19tOw0KICAgIGludCBic19uID0gY19uIC8gQkxPQ0s7DQoNCiAgICBmbG9hdDQgdGlsZV9kWzJdWzRdID0gezB9Ow0KDQogICAgZm9yIChpbnQgaWIgPSAwOyBpYiA8IGsvQkxPQ0s7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYSAgWzJdWzRdWzRdLCBsZGdfYiAgWzJdWzRdWzRdOw0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hX3RbMl1bNF1bNF0sIGxkZ19iX3RbMl1bNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYVtpaV1bampdID0gbGRnX20gPCBtID8gKihmbG9hdCAqKSZhWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBtICsgbGRnX21dIDogMDsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9IGxkZ19uIDwgbiA/ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXSA6IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9IGFzX20gKyBpaSoxNiA8IG0gPyAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYV90W2lpXVtqal07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYltzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYl90W2lpXVtqal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daXzEyOGZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzEyOGZ0MihsZHNfbiArIGpqKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICBpZiAoY19tICsgaWkqMTYgPCBtICYmIGNfbiArIGpqKjE2IDwgbikgew0KICAgICAgICAgICAgICAgICAgICBjWyhjX20gKyBpaSoxNiArIGtrKSAqIG4gKyBjX24gKyBqaioxNl0gPSAoX19oaXBfYmZsb2F0MTYpKHRpbGVfZFtpaV1bampdW2trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQp2b2lkIGZwOF9tbSh0b3JjaDo6VGVuc29yIGEsIHRvcmNoOjpUZW5zb3IgYiwgdG9yY2g6OlRlbnNvciBhcywgdG9yY2g6OlRlbnNvciBicywgdG9yY2g6OlRlbnNvciBjKSB7DQogICAgaW50IG0gPSBhLnNpemUoMCk7DQogICAgaW50IG4gPSBiLnNpemUoMCk7DQogICAgaW50IGsgPSBhLnNpemUoMSk7DQogICAgaWYgKG0gKiBuIDwgNjQgKiAxMjggKiAxMjgpIHsgLy8gZ3JvdXAgMzJ4MzIgd2F2ZSAxNngxNiB0aWxpbmcNCiAgICAgICAgZnA4X21tXzMyeDMyXzE2eDE2X2Z0Mjw8PGRpbTMoKG0rMzEpLzMyLCAobiszMSkvMzIpLCBkaW0zKDY0LCA0KSwgMCwgMD4+PiAoDQogICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAoX19oaXBfYmZsb2F0MTYqKWMuZGF0YV9wdHIoKSwgbSwgbiwgayk7DQogICAgfQ0KICAgIGVsc2UgaWYgKG0gKiBuIDwgMTI4ICogMTI4ICogMTI4KSB7IC8vIGdyb3VwIDY0eDY0IHdhdmUgMzJ4MzIgdGlsaW5nDQogICAgICAgIGZwOF9tbV82NHg2NF8zMngzMl9mdDI8PDxkaW0zKChtKzYzKS82NCwgKG4rNjMpLzY0KSwgZGltMyg2NCwgNCksIDAsIDA+Pj4gKA0KICAgICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwNCiAgICAgICAgICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0sIG4sIGspOw0KICAgIH0NCiAgICBlbHNlIHsgLy8gZ3JvdXAgMTI4eDEyOCB3YXZlIDMyeDY0IHRpbGluZw0KICAgICAgICBpZiAobSAqIG4gPj0gMTAyNCAqIChtICsgbikgJiYgbSAlIDEyOCA9PSAwICYmIG4gJSAxMjggPT0gMCkgew0KICAgICAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG0rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIGssIG0pOw0KICAgICAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGssIG4pOw0KICAgICAgICAgICAgZnA4X21tXzEyOHgxMjhfcHQ8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+ICgNCiAgICAgICAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLA0KICAgICAgICAgICAgICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0sIG4sIGspOw0KICAgICAgICAgICAgLy8gaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG0rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIGssIG0pOw0KICAgICAgICAgICAgLy8gaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGssIG4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZnA4X21tXzEyOHgxMjhfZnQyPDw8ZGltMygobSsxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDY0LCA4KSwgMCwgMD4+PiAoDQogICAgICAgICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwNCiAgICAgICAgICAgICAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpLCBtLCBuLCBrKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KDQptb2R1bGUgPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdmcDhfbW0nLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQ10sDQogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sDQogICAgdmVyYm9zZT1UcnVlLA0KICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8zIl0sDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KICAgIHJldHVybiBjNo newline at end of file+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMsIHRvcmNoOjpUZW5zb3IgY190bXApOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCg0KY29uc3RleHByIGNvbnN0IGludCBCTE9DSyA9IDEyODsNCg0KI2RlZmluZSBTV1pfMzJmdDIobSwgbikgKCgobSkgKiA4ICsgKChtKSAvIDE2KSAqIDggKyAobikpICUgMTI4KQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8zMngzMl8xNngxNl9mdDIoDQogICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwNCiAgICAgICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gYnMsDQogICAgICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzMyXVsxMjhdOw0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYlszMl1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAzMjsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMzI7DQoNCiAgICBpbnQgd2F2ZV9tID0gKHRocmVhZElkeC55IC8gMikgKiAxNjsNCiAgICBpbnQgd2F2ZV9uID0gKHRocmVhZElkeC55ICUgMikgKiAxNjsNCg0KICAgIGludCB0aHJlYWRfY19tID0gKHRocmVhZElkeC54IC8gMTYpICogNDsNCiAgICBpbnQgdGhyZWFkX2NfbiA9ICB0aHJlYWRJZHgueCAlIDE2Ow0KDQogICAgLy8gTERHU1RTIEEmQiBQYXJhbWV0ZXJzDQogICAgaW50IHN0c19rICA9IHRocmVhZElkeC55ICogMzIgKyAodGhyZWFkSWR4LnggLyA4KSAqIDQ7DQogICAgaW50IHN0c19tbiA9ICh0aHJlYWRJZHgueCAlIDgpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsxXVsxXSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsxXVs0XVs0XSwgbGRnX2IgIFsxXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzFdWzRdWzRdLCBsZGdfYl90WzFdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSozMiArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzMyZnQyKHN0c19tbiArIGpqLCBzdHNfayArIGlpKjY0KV0gPSAqKGZsb2F0ICopJmxkZ19hX3RbaWldW2pqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopJmxkc19iW3N0c19tbiArIGpqXVtTV1pfMzJmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMV1bMV0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzFdWzRdLCB0aWxlX2JbMV1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8zMmZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzMyZnQyKGxkc19uICsgamoqMTYsIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMTsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDE7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAxOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCAxOyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGluc2l0dV90cmFuc3Bvc2VfMTI4eDEyOChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYSwgaW50IG0sIGludCBuKSB7DQogICAgLy8gdHJhbnNwb3NlIGluIGV2ZXJ5IDEyOHgxMjggYmxvY2sNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHRocmVhZF9tID0gdGhyZWFkSWR4LnggLyA4Ow0KICAgIGludCB0aHJlYWRfbiA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogc21lbVsxMjhdWzEyOV07DQoNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGRhdGFbMTZdOw0KDQogICAgKihmbG9hdDQgKikmZGF0YVswXSA9ICooZmxvYXQ0ICopJmFbKHRocmVhZF9ibG9ja19tICsgdGhyZWFkX20pICogbiArIHRocmVhZF9ibG9ja19uICsgdGhyZWFkX25dOw0KDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQogICAgICAgIHNtZW1bdGhyZWFkX24gKyBpXVt0aHJlYWRfbV0gPSBkYXRhW2ldOw0KICAgICAgICAvLyBzbWVtW3RocmVhZF9uICsgaV1bKCh0aHJlYWRfbiAvIDE2KSAqIDE2ICsgdGhyZWFkX20pICUgMTI4XSA9IGRhdGFbaV07IC8vIHN3aXp6bGUNCiAgICB9DQoNCiAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXSA9ICooZmxvYXQ0ICopJnNtZW1bdGhyZWFkX21dW3RocmVhZF9uXTsNCiAgICAvLyAqKGZsb2F0NCAqKSZhWyh0aHJlYWRfYmxvY2tfbSArIHRocmVhZF9tKSAqIG4gKyB0aHJlYWRfYmxvY2tfbiArIHRocmVhZF9uXSA9ICooZmxvYXQ0ICopJnNtZW1bdGhyZWFkX21dWygodGhyZWFkX20gLyAxNikgKiAxNiArIHRocmVhZF9uKSAlIDEyOF07IC8vIHN3aXp6bGUNCn0NCg0KI2RlZmluZSBTV1pfMTI4cHQobSwgbikgKCgobSkgKiA4ICsgKG4pKSAlIDEyOCkNCl9fbGF1bmNoX2JvdW5kc19fKDUxMiwgMikNCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9wdCgNCiAgICAgICAgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogX19yZXN0cmljdF9fIGEsDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBiLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGFzLA0KICAgICAgICBjb25zdCBmbG9hdCogX19yZXN0cmljdF9fIGJzLA0KICAgICAgICBfX2hpcF9iZmxvYXQxNiogX19yZXN0cmljdF9fIGMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19hWzEyOF1bMTI4XTsNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRzX2JbMTI4XVsxMjhdOw0KDQogICAgaW50IHRocmVhZF9ibG9ja19tID0gYmxvY2tJZHgueCAqIDEyODsNCiAgICBpbnQgdGhyZWFkX2Jsb2NrX24gPSBibG9ja0lkeC55ICogMTI4Ow0KDQogICAgaW50IHdhdmVfbSA9ICh0aHJlYWRJZHgueSAvIDIpICogMzI7DQogICAgaW50IHdhdmVfbiA9ICh0aHJlYWRJZHgueSAlIDIpICogNjQ7DQoNCiAgICBpbnQgdGhyZWFkX2NfbSA9ICh0aHJlYWRJZHgueCAvIDE2KSAqIDQ7DQogICAgaW50IHRocmVhZF9jX24gPSAgdGhyZWFkSWR4LnggJSAxNjsNCg0KICAgIC8vIExER1NUUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBzdHNfbW4gPSB0aHJlYWRJZHgueSAqIDggKyB0aHJlYWRJZHgueCAvIDg7DQogICAgaW50IHN0c19rICA9ICh0aHJlYWRJZHgueCAlIDgpICogMTY7DQogICAgaW50IGxkZ19tID0gdGhyZWFkX2Jsb2NrX20gKyBzdHNfazsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19rOw0KICAgIGludCBsZGdfayA9IHN0c19tbjsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2FbMl1bMTZdLCBsZGdfYlsyXVsxNl07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKWxkZ19hW2lpXSA9ICooZmxvYXQ0ICopJmFbKGxkZ19rICsgaWIqQkxPQ0sgKyBpaSo2NCkgKiBtICsgbGRnX21dOw0KICAgICAgICAgICAgKihmbG9hdDQgKilsZGdfYltpaV0gPSAqKGZsb2F0NCAqKSZiWyhsZGdfayArIGliKkJMT0NLICsgaWkqNjQpICogbiArIGxkZ19uXTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZsb2F0IHRoaXNfYXNbMl1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGZsb2F0NCAqKXRoaXNfYXNbaWldID0gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl07DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Fbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICAgICldID0gKihsb25nICopJmxkZ19hW2lpXVswXTsNCiAgICAgICAgICAgICoobG9uZyAqKSZsZHNfYVtzdHNfbW4gKyBpaSo2NF1bU1daXzEyOHB0KHN0c19tbiwgc3RzX2sgKyA4KV0gPSAqKGxvbmcgKikmbGRnX2FbaWldWzhdOw0KICAgICAgICAgICAgKihsb25nICopJmxkc19iW3N0c19tbiArIGlpKjY0XVtTV1pfMTI4cHQoc3RzX21uLCBzdHNfayAgICApXSA9ICoobG9uZyAqKSZsZGdfYltpaV1bMF07DQogICAgICAgICAgICAqKGxvbmcgKikmbGRzX2Jbc3RzX21uICsgaWkqNjRdW1NXWl8xMjhwdChzdHNfbW4sIHN0c19rICsgOCldID0gKihsb25nICopJmxkZ19iW2lpXVs4XTsNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBmbG9hdDQgYmxvY2tfdGlsZV9kWzJdWzRdID0gezB9Ow0KICAgICAgICBsb25nIHRpbGVfYVsyXVs0XSwgdGlsZV9iWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2FbaWldW2trXSA9ICoobG9uZyAqKSZsZHNfYVtsZHNfbSArIGlpKjE2XVtTV1pfMTI4cHQobGRzX20sIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICB0aWxlX2JbampdW2trXSA9ICoobG9uZyAqKSZsZHNfYltsZHNfbiArIGpqKjE2XVtTV1pfMTI4cHQobGRzX24sIGxkc19rICsga2sqMzIpXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBibG9ja190aWxlX2RbaWldW2pqXSA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MzJfZnA4X2ZwOCh0aWxlX2FbaWldW2trXSwgdGlsZV9iW2pqXVtra10sIGJsb2NrX3RpbGVfZFtpaV1bampdLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdGlsZV9kW2lpXVtqal1ba2tdICs9IGJsb2NrX3RpbGVfZFtpaV1bampdW2trXSAqIHRoaXNfYXNbaWldW2trXSAqIHRoaXNfYnM7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KICAgIH0NCg0KICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSByZXN1bHQgYXMgYmYxNg0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGNbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9IChfX2hpcF9iZmxvYXQxNikodGlsZV9kW2lpXVtqal1ba2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KI2RlZmluZSBTV1pfMTI4ZnQyKG0sIG4pICgoKG0pICogOCArICgobSkgLyAxNikgKiA4ICsgKG4pKSAlIDEyOCkNCl9fbGF1bmNoX2JvdW5kc19fKDUxMiwgMikNCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9mdDIoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX2sgID0gdGhyZWFkSWR4LnkgKiA4ICsgKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgc3RzX21uID0gKHRocmVhZElkeC54ICUgMzIpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gMDsgaWIgPCBrL0JMT0NLOyBpYisrKSB7DQogICAgICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogbGRnX2EgIFsyXVs0XVs0XSwgbGRnX2IgIFsyXVs0XVs0XTsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYV90WzJdWzRdWzRdLCBsZGdfYl90WzJdWzRdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2FbaWldW2pqXSA9IGxkZ19tIDwgbSA/ICooZmxvYXQgKikmYVsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbSArIGxkZ19tXSA6IDA7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKWxkZ19iW2lpXVtqal0gPSBsZGdfbiA8IG4gPyAqKGZsb2F0ICopJmJbKGxkZ19rICsgaWkqNjQgKyBqaiArIGliKkJMT0NLKSAqIG4gKyBsZGdfbl0gOiAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZmxvYXQgdGhpc19hc1syXVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgICooZmxvYXQ0ICopdGhpc19hc1tpaV0gPSBhc19tICsgaWkqMTYgPCBtID8gKihmbG9hdDQgKikmYXNbaWIqbSArIGFzX20gKyBpaSoxNl0gOiAwOw0KICAgICAgICB9DQogICAgICAgIGZsb2F0IHRoaXNfYnMgPSBic1tpYiAqICgobitCTE9DSy0xKS9CTE9DSykgKyBic19uXTsNCg0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICBsZGdfYV90W2lpXVtqal1ba2tdID0gbGRnX2FbaWldW2trXVtqal07DQogICAgICAgICAgICAgICAgICAgIGxkZ19iX3RbaWldW2pqXVtra10gPSBsZGdfYltpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Fbc3RzX21uICsgampdW1NXWl8xMjhmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2FfdFtpaV1bampdOw0KICAgICAgICAgICAgICAgICooZmxvYXQgKikmbGRzX2Jbc3RzX21uICsgampdW1NXWl8xMjhmdDIoc3RzX21uICsgamosIHN0c19rICsgaWkqNjQpXSA9ICooZmxvYXQgKikmbGRnX2JfdFtpaV1bampdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIGZsb2F0NCBibG9ja190aWxlX2RbMl1bNF0gPSB7MH07DQogICAgICAgIGxvbmcgdGlsZV9hWzJdWzRdLCB0aWxlX2JbNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYVtpaV1ba2tdID0gKihsb25nICopJmxkc19hW2xkc19tICsgaWkqMTZdW1NXWl8xMjhmdDIobGRzX20gKyBpaSoxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIHRpbGVfYltqal1ba2tdID0gKihsb25nICopJmxkc19iW2xkc19uICsgamoqMTZdW1NXWl8xMjhmdDIobGRzX24gKyBqaioxNiwgbGRzX2sgKyBrayozMildOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrX3RpbGVfZFtpaV1bampdID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8xNngxNngzMl9mcDhfZnA4KHRpbGVfYVtpaV1ba2tdLCB0aWxlX2JbampdW2trXSwgYmxvY2tfdGlsZV9kW2lpXVtqal0sIDAsIDAsIDApOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgICAgICB0aWxlX2RbaWldW2pqXVtra10gKz0gYmxvY2tfdGlsZV9kW2lpXVtqal1ba2tdICogdGhpc19hc1tpaV1ba2tdICogdGhpc19iczsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQogICAgfQ0KDQogICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIHJlc3VsdCBhcyBiZjE2DQogICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgaWYgKGNfbSArIGlpKjE2IDwgbSAmJiBjX24gKyBqaioxNiA8IG4pIHsNCiAgICAgICAgICAgICAgICAgICAgY1soY19tICsgaWkqMTYgKyBraykgKiBuICsgY19uICsgamoqMTZdID0gKF9faGlwX2JmbG9hdDE2KSh0aWxlX2RbaWldW2pqXVtra10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19sYXVuY2hfYm91bmRzX18oNTEyLCAyKQ0KX19nbG9iYWxfXyB2b2lkIGZwOF9tbV8xMjh4MTI4X2Z0Ml9zcGxpdDQoDQogICAgICAgIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIF9fcmVzdHJpY3RfXyBhLA0KICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBfX3Jlc3RyaWN0X18gYiwNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBhcywNCiAgICAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBicywNCiAgICAgICAgZmxvYXQqIF9fcmVzdHJpY3RfXyBjLA0KICAgICAgICBpbnQgbSwgaW50IG4sIGludCBrKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBsZHNfYVsxMjhdWzEyOF07DQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IGxkc19iWzEyOF1bMTI4XTsNCg0KICAgIGludCBzcGxpdF9pZHggPSBibG9ja0lkeC56Ow0KICAgIGludCB0aHJlYWRfYmxvY2tfbSA9IGJsb2NrSWR4LnggKiAxMjg7DQogICAgaW50IHRocmVhZF9ibG9ja19uID0gYmxvY2tJZHgueSAqIDEyODsNCg0KICAgIGludCB3YXZlX20gPSAodGhyZWFkSWR4LnkgLyAyKSAqIDMyOw0KICAgIGludCB3YXZlX24gPSAodGhyZWFkSWR4LnkgJSAyKSAqIDY0Ow0KDQogICAgaW50IHRocmVhZF9jX20gPSAodGhyZWFkSWR4LnggLyAxNikgKiA0Ow0KICAgIGludCB0aHJlYWRfY19uID0gIHRocmVhZElkeC54ICUgMTY7DQoNCiAgICAvLyBMREdTVFMgQSZCIFBhcmFtZXRlcnMNCiAgICBpbnQgc3RzX2sgID0gdGhyZWFkSWR4LnkgKiA4ICsgKHRocmVhZElkeC54IC8gMzIpICogNDsNCiAgICBpbnQgc3RzX21uID0gKHRocmVhZElkeC54ICUgMzIpICogNDsNCiAgICBpbnQgbGRnX20gPSB0aHJlYWRfYmxvY2tfbSArIHN0c19tbjsNCiAgICBpbnQgbGRnX24gPSB0aHJlYWRfYmxvY2tfbiArIHN0c19tbjsNCiAgICBpbnQgbGRnX2sgPSBzdHNfazsNCg0KICAgIC8vIExEUyBBJkIgUGFyYW1ldGVycw0KICAgIGludCBsZHNfbSA9IHdhdmVfbSArIHRocmVhZElkeC54ICUgMTY7DQogICAgaW50IGxkc19uID0gd2F2ZV9uICsgdGhyZWFkSWR4LnggJSAxNjsNCiAgICBpbnQgbGRzX2sgPSAodGhyZWFkSWR4LnggLyAxNikgKiA4Ow0KDQogICAgLy8gQyZEIFBhcmFtZXRlcnMNCiAgICBpbnQgY19tID0gdGhyZWFkX2Jsb2NrX20gKyB3YXZlX20gKyB0aHJlYWRfY19tOw0KICAgIGludCBjX24gPSB0aHJlYWRfYmxvY2tfbiArIHdhdmVfbiArIHRocmVhZF9jX247DQoNCiAgICBpbnQgYXNfbSA9IGNfbTsNCiAgICBpbnQgYnNfbiA9IGNfbiAvIEJMT0NLOw0KDQogICAgZmxvYXQ0IHRpbGVfZFsyXVs0XSA9IHswfTsNCg0KICAgIGZvciAoaW50IGliID0gc3BsaXRfaWR4ICogKGsvQkxPQ0svNCk7IGliIDwgKHNwbGl0X2lkeCArIDEpICogKGsvQkxPQ0svNCk7IGliKyspIHsNCiAgICAgICAgX19oaXBfZnA4X2U0bTNfZm51eiBsZGdfYSAgWzJdWzRdWzRdLCBsZGdfYiAgWzJdWzRdWzRdOw0KICAgICAgICBfX2hpcF9mcDhfZTRtM19mbnV6IGxkZ19hX3RbMl1bNF1bNF0sIGxkZ19iX3RbMl1bNF1bNF07DQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgICooZmxvYXQgKilsZGdfYVtpaV1bampdID0gbGRnX20gPCBtID8gKihmbG9hdCAqKSZhWyhsZGdfayArIGlpKjY0ICsgamogKyBpYipCTE9DSykgKiBtICsgbGRnX21dIDogMDsNCiAgICAgICAgICAgICAgICAqKGZsb2F0ICopbGRnX2JbaWldW2pqXSA9IGxkZ19uIDwgbiA/ICooZmxvYXQgKikmYlsobGRnX2sgKyBpaSo2NCArIGpqICsgaWIqQkxPQ0spICogbiArIGxkZ19uXSA6IDA7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBmbG9hdCB0aGlzX2FzWzJdWzRdOw0KICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgMjsgaWkrKykgew0KICAgICAgICAgICAgKihmbG9hdDQgKil0aGlzX2FzW2lpXSA9IGFzX20gKyBpaSoxNiA8IG0gPyAqKGZsb2F0NCAqKSZhc1tpYiptICsgYXNfbSArIGlpKjE2XSA6IDA7DQogICAgICAgIH0NCiAgICAgICAgZmxvYXQgdGhpc19icyA9IGJzW2liICogKChuK0JMT0NLLTEpL0JMT0NLKSArIGJzX25dOw0KDQogICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqaiA9IDA7IGpqIDwgNDsgamorKykgew0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIGxkZ19hX3RbaWldW2pqXVtra10gPSBsZGdfYVtpaV1ba2tdW2pqXTsNCiAgICAgICAgICAgICAgICAgICAgbGRnX2JfdFtpaV1bampdW2trXSA9IGxkZ19iW2lpXVtra11bampdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYVtzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYV90W2lpXVtqal07DQogICAgICAgICAgICAgICAgKihmbG9hdCAqKSZsZHNfYltzdHNfbW4gKyBqal1bU1daXzEyOGZ0MihzdHNfbW4gKyBqaiwgc3RzX2sgKyBpaSo2NCldID0gKihmbG9hdCAqKSZsZGdfYl90W2lpXVtqal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgZmxvYXQ0IGJsb2NrX3RpbGVfZFsyXVs0XSA9IHswfTsNCiAgICAgICAgbG9uZyB0aWxlX2FbMl1bNF0sIHRpbGVfYls0XVs0XTsNCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9hW2lpXVtra10gPSAqKGxvbmcgKikmbGRzX2FbbGRzX20gKyBpaSoxNl1bU1daXzEyOGZ0MihsZHNfbSArIGlpKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgamogPSAwOyBqaiA8IDQ7IGpqKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgdGlsZV9iW2pqXVtra10gPSAqKGxvbmcgKikmbGRzX2JbbGRzX24gKyBqaioxNl1bU1daXzEyOGZ0MihsZHNfbiArIGpqKjE2LCBsZHNfayArIGtrKjMyKV07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IDI7IGlpKyspIHsNCiAgICAgICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICAgICAgZm9yIChpbnQga2sgPSAwOyBrayA8IDQ7IGtrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdGlsZV9kW2lpXVtqal0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDMyX2ZwOF9mcDgodGlsZV9hW2lpXVtra10sIHRpbGVfYltqal1ba2tdLCBibG9ja190aWxlX2RbaWldW2pqXSwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAoaW50IGtrID0gMDsga2sgPCA0OyBraysrKSB7DQogICAgICAgICAgICAgICAgICAgIHRpbGVfZFtpaV1bampdW2trXSArPSBibG9ja190aWxlX2RbaWldW2pqXVtra10gKiB0aGlzX2FzW2lpXVtra10gKiB0aGlzX2JzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICB9DQoNCiAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgcmVzdWx0IGFzIGJmMTYNCiAgICBmbG9hdCAqc3BsaXRfYyA9IGMgKyBzcGxpdF9pZHggKiAobSAqIG4pOw0KICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7DQogICAgICAgIGZvciAoaW50IGpqID0gMDsgamogPCA0OyBqaisrKSB7DQogICAgICAgICAgICBmb3IgKGludCBrayA9IDA7IGtrIDwgNDsga2srKykgew0KICAgICAgICAgICAgICAgIGlmIChjX20gKyBpaSoxNiA8IG0gJiYgY19uICsgamoqMTYgPCBuKSB7DQogICAgICAgICAgICAgICAgICAgIHNwbGl0X2NbKGNfbSArIGlpKjE2ICsga2spICogbiArIGNfbiArIGpqKjE2XSA9ICh0aWxlX2RbaWldW2pqXVtra10pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCl9fZ2xvYmFsX18gdm9pZCBmcDhfbW1fMTI4eDEyOF9mdDJfc3BsaXQ0X21lcmdlKGNvbnN0IGZsb2F0KiBfX3Jlc3RyaWN0X18gY19zcGxpdCwgX19oaXBfYmZsb2F0MTYqIF9fcmVzdHJpY3RfXyBjLCBpbnQgbSwgaW50IG4pIHsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICBmb3IgKGludCBpID0gdGhyZWFkSWR4LnggKiA4OyBpIDwgbjsgaSArPSBibG9ja0RpbS54ICogOCkgew0KICAgICAgICBmbG9hdDQgdmFsMFsyXSwgdmFsMVsyXSwgdmFsMlsyXSwgdmFsM1syXTsNCiAgICAgICAgdmFsMFswXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGldOw0KICAgICAgICB2YWwwWzFdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIDRdOw0KICAgICAgICB2YWwxWzBdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIG0gKiBuXTsNCiAgICAgICAgdmFsMVsxXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGkgKyA0ICsgbSAqIG5dOw0KICAgICAgICB2YWwyWzBdID0gKihmbG9hdDQgKikmY19zcGxpdFtpZHggKiBuICsgaSArIDIgKiBtICogbl07DQogICAgICAgIHZhbDJbMV0gPSAqKGZsb2F0NCAqKSZjX3NwbGl0W2lkeCAqIG4gKyBpICsgNCArIDIgKiBtICogbl07DQogICAgICAgIHZhbDNbMF0gPSAqKGZsb2F0NCAqKSZjX3NwbGl0W2lkeCAqIG4gKyBpICsgMyAqIG0gKiBuXTsNCiAgICAgICAgdmFsM1sxXSA9ICooZmxvYXQ0ICopJmNfc3BsaXRbaWR4ICogbiArIGkgKyA0ICsgMyAqIG0gKiBuXTsNCg0KICAgICAgICBfX2hpcF9iZmxvYXQxNiBzdW1bOF07DQogICAgICAgIHN1bVswXSA9IHZhbDBbMF1bMF0gKyB2YWwxWzBdWzBdICsgdmFsMlswXVswXSArIHZhbDNbMF1bMF07DQogICAgICAgIHN1bVsxXSA9IHZhbDBbMF1bMV0gKyB2YWwxWzBdWzFdICsgdmFsMlswXVsxXSArIHZhbDNbMF1bMV07DQogICAgICAgIHN1bVsyXSA9IHZhbDBbMF1bMl0gKyB2YWwxWzBdWzJdICsgdmFsMlswXVsyXSArIHZhbDNbMF1bMl07DQogICAgICAgIHN1bVszXSA9IHZhbDBbMF1bM10gKyB2YWwxWzBdWzNdICsgdmFsMlswXVszXSArIHZhbDNbMF1bM107DQogICAgICAgIHN1bVs0XSA9IHZhbDBbMV1bMF0gKyB2YWwxWzFdWzBdICsgdmFsMlsxXVswXSArIHZhbDNbMV1bMF07DQogICAgICAgIHN1bVs1XSA9IHZhbDBbMV1bMV0gKyB2YWwxWzFdWzFdICsgdmFsMlsxXVsxXSArIHZhbDNbMV1bMV07DQogICAgICAgIHN1bVs2XSA9IHZhbDBbMV1bMl0gKyB2YWwxWzFdWzJdICsgdmFsMlsxXVsyXSArIHZhbDNbMV1bMl07DQogICAgICAgIHN1bVs3XSA9IHZhbDBbMV1bM10gKyB2YWwxWzFdWzNdICsgdmFsMlsxXVszXSArIHZhbDNbMV1bM107DQoNCiAgICAgICAgKihmbG9hdDQgKikmY1tpZHggKiBuICsgaV0gPSAqKGZsb2F0NCAqKSZzdW1bMF07DQogICAgfQ0KfQ0KDQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMsIHRvcmNoOjpUZW5zb3IgY190bXApIHsNCiAgICBpbnQgbSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgbiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgayA9IGEuc2l6ZSgxKTsNCiAgICBfX2hpcF9mcDhfZTRtM19mbnV6KiBhX3B0ciA9IChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCk7DQogICAgX19oaXBfZnA4X2U0bTNfZm51eiogYl9wdHIgPSAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpOw0KICAgIF9faGlwX2JmbG9hdDE2KiBjX3B0ciA9IChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpOw0KICAgIGZsb2F0KiBjX3RtcF9wdHIgPSAoZmxvYXQqKWNfdG1wLmRhdGFfcHRyKCk7DQogICAgZmxvYXQqIGFzX3B0ciA9IChmbG9hdCopYXMuZGF0YV9wdHIoKTsNCiAgICBmbG9hdCogYnNfcHRyID0gKGZsb2F0Kilicy5kYXRhX3B0cigpOw0KICAgIC8vIG1tc3BsaXRrDQogICAgLy8gMC4gbTogMTAyNDsgbjogMTUzNjsgazogNzE2ODsNCiAgICAvLyAyLiBtOiAxMDI0OyBuOiA1NzYgOyBrOiA3MTY4Ow0KICAgIC8vIDcuIG06IDEwMjQ7IG46IDUxMiA7IGs6IDcxNjg7DQogICAgaWYgKG0gPT0gMTAyNCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4IHx8DQogICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDU3NiAgJiYgayA9PSA3MTY4IHx8DQogICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDUxMiAgJiYgayA9PSA3MTY4KSB7DQogICAgICAgIGZwOF9tbV8xMjh4MTI4X2Z0Ml9zcGxpdDQ8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCwgNCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+IChhX3B0ciwgYl9wdHIsIGFzX3B0ciwgYnNfcHRyLCBjX3RtcF9wdHIsIG0sIG4sIGspOw0KICAgICAgICBmcDhfbW1fMTI4eDEyOF9mdDJfc3BsaXQ0X21lcmdlPDw8ZGltMyhtKSwgZGltMyg2NCksIDAsIDA+Pj4oY190bXBfcHRyLCBjX3B0ciwgbSwgbik7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgLy8gbW0xMjh4MTI4ZnQyDQogICAgLy8gMS4gbTogMTAyNDsgbjogMzA3MjsgazogMTUzNjsNCiAgICAvLyAzLiBtOiAxMDI0OyBuOiA3MTY4OyBrOiAyNTYgOw0KICAgIC8vIDQuIG06IDEwMjQ7IG46IDcxNjg7IGs6IDIwNDg7DQogICAgLy8gNS4gbTogMTAyNDsgbjogNDYwODsgazogNzE2ODsNCiAgICAvLyA4LiBtOiAxMDI0OyBuOiA0MDk2OyBrOiA1MTIgOw0KICAgIC8vIDExLiBtOiA2MTQ0OyBuOiA1NzYgOyBrOiA3MTY4Ow0KICAgIC8vIDE2LiBtOiA2MTQ0OyBuOiA1MTIgOyBrOiA3MTY4Ow0KICAgIGVsc2UgaWYgKG0gPT0gMTAyNCAmJiBuID09IDMwNzIgJiYgayA9PSAxNTM2IHx8DQogICAgICAgICAgICAgbSA9PSAxMDI0ICYmIG4gPT0gNzE2OCAmJiBrID09IDI1NiAgfHwNCiAgICAgICAgICAgICBtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjA0OCB8fA0KICAgICAgICAgICAgIG0gPT0gMTAyNCAmJiBuID09IDQ2MDggJiYgayA9PSA3MTY4IHx8DQogICAgICAgICAgICAgbSA9PSAxMDI0ICYmIG4gPT0gNDA5NiAmJiBrID09IDUxMiAgfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA1NzYgICYmIGsgPT0gNzE2OCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDUxMiAgJiYgayA9PSA3MTY4KSB7DQogICAgICAgIGZwOF9tbV8xMjh4MTI4X2Z0Mjw8PGRpbTMoKG0rMTI3KS8xMjgsIChuKzEyNykvMTI4KSwgZGltMyg2NCwgOCksIDAsIDA+Pj4gKGFfcHRyLCBiX3B0ciwgYXNfcHRyLCBic19wdHIsIGNfcHRyLCBtLCBuLCBrKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICAvLyBtbTEyOHgxMjhwdA0KICAgIC8vIDYuIG06IDEwMjQ7IG46IDcxNjg7IGs6IDIzMDQ7DQogICAgLy8gOS4gbTogNjE0NDsgbjogMTUzNjsgazogNzE2ODsNCiAgICAvLyAxMC4gbTogNjE0NDsgbjogMzA3MjsgazogMTUzNjsNCiAgICAvLyAxMi4gbTogNjE0NDsgbjogNzE2ODsgazogMjU2IDsNCiAgICAvLyAxMy4gbTogNjE0NDsgbjogNzE2ODsgazogMjA0ODsNCiAgICAvLyAxNC4gbTogNjE0NDsgbjogNDYwODsgazogNzE2ODsNCiAgICAvLyAxNS4gbTogNjE0NDsgbjogNzE2ODsgazogMjMwNDsNCiAgICAvLyAxNy4gbTogNjE0NDsgbjogNDA5NjsgazogNTEyIDsNCiAgICBlbHNlIGlmIChtID09IDEwMjQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4IHx8DQogICAgICAgICAgICAgbSA9PSA2MTQ0ICYmIG4gPT0gMzA3MiAmJiBrID09IDE1MzYgfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjU2ICB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDcxNjggJiYgayA9PSAyMDQ4IHx8DQogICAgICAgICAgICAgbSA9PSA2MTQ0ICYmIG4gPT0gNDYwOCAmJiBrID09IDcxNjggfHwNCiAgICAgICAgICAgICBtID09IDYxNDQgJiYgbiA9PSA3MTY4ICYmIGsgPT0gMjMwNCB8fA0KICAgICAgICAgICAgIG0gPT0gNjE0NCAmJiBuID09IDQwOTYgJiYgayA9PSA1MTIpIHsNCiAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG0rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KGFfcHRyLCBrLCBtKTsNCiAgICAgICAgaW5zaXR1X3RyYW5zcG9zZV8xMjh4MTI4PDw8ZGltMygoaysxMjcpLzEyOCwgKG4rMTI3KS8xMjgpLCBkaW0zKDEwMjQpLCAwLCAwPj4+KGJfcHRyLCBrLCBuKTsNCiAgICAgICAgZnA4X21tXzEyOHgxMjhfcHQ8PDxkaW0zKChtKzEyNykvMTI4LCAobisxMjcpLzEyOCksIGRpbTMoNjQsIDgpLCAwLCAwPj4+IChhX3B0ciwgYl9wdHIsIGFzX3B0ciwgYnNfcHRyLCBjX3B0ciwgbSwgbiwgayk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGZwOF9tbV8zMngzMl8xNngxNl9mdDI8PDxkaW0zKChtKzMxKS8zMiwgKG4rMzEpLzMyKSwgZGltMyg2NCwgNCksIDAsIDA+Pj4gKGFfcHRyLCBiX3B0ciwgYXNfcHRyLCBic19wdHIsIGNfcHRyLCBtLCBuLCBrKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQoNCm1vZHVsZSA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItTzMiXSwNCikNCg0KZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6DQogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGENCiAgICBtLCBuLCBrID0gYS5zaGFwZVswXSwgYi5zaGFwZVswXSwgYS5zaGFwZVsxXQ0KICAgIGlmIChtID09IDEwMjQgYW5kIG4gPT0gMTUzNiBhbmQgayA9PSA3MTY4IG9yDQogICAgICAgIG0gPT0gMTAyNCBhbmQgbiA9PSA1NzYgIGFuZCBrID09IDcxNjggb3INCiAgICAgICAgbSA9PSAxMDI0IGFuZCBuID09IDUxMiAgYW5kIGsgPT0gNzE2OCk6DQogICAgICAgIGNfdG1wID0gdG9yY2guZW1wdHkobSAqIG4gKiA0LCBkdHlwZT10b3JjaC5mbG9hdDMyLCBkZXZpY2U9J2N1ZGEnKQ0KICAgICAgICBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMsIGNfdG1wKQ0KICAgIGVsc2U6DQogICAgICAgIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYywgYykNCiAgICByZXR1cm4gYw==No newline at end of file
Best evidence level for this revision: reported
JSON