amd-mixture-of-experts · submission 30341
KernelBot user 7 · 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-moe-submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-30341?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:ccb131adf9a677efe35c46bb9ec6d33edcf2a89aa5aa92d5fba93c7cbd2c51a7
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
amd-moe-submission.py1 lines
IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIpOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnAxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3A0X25yZTMyKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA+PSBtKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBfX2hhbGYgcm93WzMyXTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDBdOw0KICAgICooZmxvYXQ0ICopJnJvd1s4XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgOF07DQogICAgKihmbG9hdDQgKikmcm93WzE2XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMTZdOw0KICAgICooZmxvYXQ0ICopJnJvd1syNF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDI0XTsNCg0KICAgIGludCB0b3BfaWR4WzRdID0gey0xLCAtMSwgLTEsIC0xfTsNCiAgICBfX2hhbGYgdG9wX3ZhbFs0XSA9IHtfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKX07DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG4pIHJldHVybjsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgICAgICAvLyBpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IGlucHV0W2lkeCAqIGRoICsgal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2OChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgX19oYWxmICppbnB1dF9yZW9yZGVyLCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogNCArIGldOw0KICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbYmxvY2tJZHgueCAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal0gPSB2YWw7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIG91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSksIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7IGkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopcmVzID0gKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal07DQogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChvdXRwdXRfZG93blsobiAqIChucmUgKyBpKSArIGlkeCkgKiBkaCArIGpdLCBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2OChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgew0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIDcxNjggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgfQ0KfQ0KDQppbnQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fcmUgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9yZS5kYXRhX3B0cigpOw0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fc2UgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9zZS5kYXRhX3B0cigpOw0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgsIG1heF9jb3VudCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICAjIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW2JzICogc2wgKiAobnJlICsgbnNlKSwgZGhdDQoNCiAgICBzY29yZSA9IHRvcmNoLnNvZnRtYXgoaW5wdXQudmlldyhicypzbCwgZGgpIEAgcm91dGVyLlQsIGRpbT0xKSAgIyBbYnMgKiBzbCwgbnJlXQ0KDQogICAgbWF4X2NvdW50ID0gbW9kdWxlLm1vZTEoaW5wdXQsIG91dHB1dCwgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgIyBoaWRkZW4gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkZV0NCiAgICAjIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKQ0KICAgICMgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkaF0NCiAgICAjIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bl9yZSkNCiAgICAjIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIGhpZGRlbl9yZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKSAjIFtucmUsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbl9zZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlX3NlKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9zZSkNCiAgICBvdXRwdXRfZG93bl9yZSA9IHRvcmNoLmJtbShoaWRkZW5fcmUsIGRvd25fcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBvdXRwdXRfZG93bl9zZSA9IHRvcmNoLmJtbShoaWRkZW5fc2UsIGRvd25fc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnNlLCBicyAqIHNsLCBkaF0NCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBtYXhfY291bnQpDQogICAgcmV0dXJuIG91dHB1dA==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 amd-mixture-of-experts · submission 30167.
- IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bik7DQppbnQgbW9lMih0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyLCB0b3JjaDo6VGVuc29yIHRfb3V0cHV0X2Rvd24pOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDE2Lmg+DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3BrKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtLCBpbnQgbiwgaW50IGspIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbSkgew0KICAgICAgICAvLyBGaW5kIHRvcC1rIGluZGljZXMgZm9yIHJvdyBpZHgNCiAgICAgICAgLy8gU2ltcGxlIHNlbGVjdGlvbiBzb3J0IGZvciBzbWFsbCBrDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgKytpKSB7DQogICAgICAgICAgICBfX2hhbGYgbWF4X3ZhbCA9IF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpOw0KICAgICAgICAgICAgaW50IG1heF9pZHggPSAtMTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7DQogICAgICAgICAgICAgICAgaWYgKF9faGd0KGlucHV0W2lkeCAqIG4gKyBqXSwgbWF4X3ZhbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGZvdW5kID0gMDsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpOyArK2wpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfaW5kaWNlc1tpZHggKiBrICsgbF0gPT0gaikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IGlucHV0W2lkeCAqIG4gKyBqXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pZHggPSBqOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG9wX2luZGljZXNbaWR4ICogayArIGldID0gbWF4X2lkeDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHRvcDRfbnJlMzIoY29uc3QgX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50IG0pIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG0pIHJldHVybjsNCg0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIF9faGFsZiByb3dbMzJdOw0KICAgICooZmxvYXQ0ICopJnJvd1swXSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMF07DQogICAgKihmbG9hdDQgKikmcm93WzhdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyA4XTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMTZdID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogMzIgKyAxNl07DQogICAgKihmbG9hdDQgKikmcm93WzI0XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMjRdOw0KDQogICAgaW50IHRvcF9pZHhbNF0gPSB7LTEsIC0xLCAtMSwgLTF9Ow0KICAgIF9faGFsZiB0b3BfdmFsWzRdID0ge19fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpfTsNCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoX19oZ3Qocm93W2pdLCB0b3BfdmFsWzBdKSkgew0KICAgICAgICAgICAgdG9wX3ZhbFswXSA9IHJvd1tqXTsNCiAgICAgICAgICAgIHRvcF9pZHhbMF0gPSBqOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgKytqKSB7DQogICAgICAgIGlmIChqID09IHRvcF9pZHhbMF0pIGNvbnRpbnVlOw0KICAgICAgICBpZiAoX19oZ3Qocm93W2pdLCB0b3BfdmFsWzFdKSkgew0KICAgICAgICAgICAgdG9wX3ZhbFsxXSA9IHJvd1tqXTsNCiAgICAgICAgICAgIHRvcF9pZHhbMV0gPSBqOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgKytqKSB7DQogICAgICAgIGlmIChqID09IHRvcF9pZHhbMF0gfHwgaiA9PSB0b3BfaWR4WzFdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsyXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMl0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzJdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSB8fCBqID09IHRvcF9pZHhbMl0pIGNvbnRpbnVlOw0KICAgICAgICBpZiAoX19oZ3Qocm93W2pdLCB0b3BfdmFsWzNdKSkgew0KICAgICAgICAgICAgdG9wX3ZhbFszXSA9IHJvd1tqXTsNCiAgICAgICAgICAgIHRvcF9pZHhbM10gPSBqOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogNF0gPSAqKGZsb2F0NCAqKSZ0b3BfaWR4WzBdOw0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgY2FsY3VsYXRlX2luZGV4KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXB0OyArK2opIHsNCiAgICAgICAgICAgIGludCBleHBlcnQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBqXTsNCiAgICAgICAgICAgIGludCBvZmZzZXQgPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W2V4cGVydF0sIDEpOw0KICAgICAgICAgICAgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGpdID0gb2Zmc2V0Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgY2FsY3VsYXRlX2luZGV4X25yZTMyX2VwdDQoDQogICAgY29uc3QgaW50ICp0b3BfaW5kaWNlcywgaW50ICp0b2tlbl9jb3VudCwgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuKSB7DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCg0KICAgIGNvbnN0IGludCBOUkUgPSAzMjsNCiAgICBjb25zdCBpbnQgRVBUID0gNDsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19jb3VudFtOUkVdOw0KICAgIF9fc2hhcmVkX18gaW50IGJsb2NrX29mZnNldFtOUkVdOw0KICAgIGludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54Ow0KICAgIGlmIChpZHggPj0gbikgcmV0dXJuOw0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX2NvdW50W3RocmVhZElkeC54XSA9IDA7DQogICAgfQ0KDQogICAgaW50IHRocmVhZF9vZmZzZXRbRVBUXTsNCiAgICBpbnQgdGhyZWFkX2V4cGVydFtFUFRdOw0KICAgICooZmxvYXQ0ICopJnRocmVhZF9leHBlcnRbMF0gPSAqKGZsb2F0NCAqKSZ0b3BfaW5kaWNlc1tpZHggKiBFUFQgKyAwXTsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gPSBhdG9taWNBZGQoJmJsb2NrX2NvdW50W3RocmVhZF9leHBlcnRbaV1dLCAxKTsNCiAgICB9DQoNCiAgICBpZiAodGhyZWFkSWR4LnggPCBOUkUpIHsNCiAgICAgICAgYmxvY2tfb2Zmc2V0W3RocmVhZElkeC54XSA9IGF0b21pY0FkZCgmdG9rZW5fY291bnRbdGhyZWFkSWR4LnhdLCBibG9ja19jb3VudFt0aHJlYWRJZHgueF0pOw0KICAgIH0NCg0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRVBUOyBpKyspIHsNCiAgICAgICAgdGhyZWFkX29mZnNldFtpXSArPSBibG9ja19vZmZzZXRbdGhyZWFkX2V4cGVydFtpXV07DQogICAgfQ0KDQogICAgKihmbG9hdDQgKikmaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIEVQVCArIDBdID0gKihmbG9hdDQgKikmdGhyZWFkX29mZnNldFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJlb3JkZXJfaW5wdXQoX19oYWxmICppbnB1dCwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIF9faGFsZiAqaW5wdXRfcmVvcmRlciwgaW50IG4sIGludCBlcHQsIGludCBucmUsIGludCBkaCkgew0KICAgIGludCBpZHggPSBibG9ja0lkeC54Ow0KICAgIHVzaW5nIGZsb2F0NCA9IGZsb2F0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOw0KICAgIGlmIChpZHggPCBuKSB7DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXB0OyArK2kpIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9pZCAqIG4gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIGZsb2F0NCB2YWwgPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gdmFsOw0KICAgICAgICAgICAgICAgIC8vIGlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdID0gaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHJlb3JkZXJfaW5wdXRfZXB0NG5yZTMyZGg3MTY4KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7DQogICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgIGludCB0b2tlbl9sb2NhdGlvbiA9IGV4cGVydF9pZCAqIG4gKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgNzE2ODsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgIGZsb2F0NCB2YWwgPSAqKGZsb2F0NCAqKSZpbnB1dFtibG9ja0lkeC54ICogNzE2OCArIGpdOw0KICAgICAgICAgICAgKihmbG9hdDQgKikmaW5wdXRfcmVvcmRlclt0b2tlbl9sb2NhdGlvbiAqIDcxNjggKyBqXSA9IHZhbDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0KGhhbGYgKm91dHB1dF9kb3duLCBfX2hhbGYgKm91dHB1dF9wdHIsIGNvbnN0IF9faGFsZiAqc2NvcmUsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IG5zZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgaGFsZjggPSBfX2ZwMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7DQogICAgaWYgKGlkeCA8IG4pIHsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcHQ7IGkrKykgew0KICAgICAgICAgICAgaW50IGV4cGVydF9pZCA9IHRvcF9pbmRpY2VzW2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgaW50IHRva2VuX2xvY2F0aW9uID0gZXhwZXJ0X2lkICogbiArIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBpXTsNCiAgICAgICAgICAgIF9faGFsZiB0aGlzX3Njb3JlID0gc2NvcmVbaWR4ICogbnJlICsgZXhwZXJ0X2lkXTsNCiAgICAgICAgICAgIF9faGFsZiB6ZXJvc1s4XSA9IHtfX2Zsb2F0MmhhbGYoMC4wZil9Ow0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIGlmIChpID09IDApICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXplcm9zOw0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93blt0b2tlbl9sb2NhdGlvbiAqIGRoICsgal07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXJlcyA9ICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgb3V0cHV0X2Rvd25bdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdKSwgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zZTsgaSsrKSB7DQogICAgICAgICAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICAgICAgX19oYWxmIHZhbFs4XSwgcmVzWzhdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duWyhuICogKG5yZSArIGkpICsgaWR4KSAqIGRoICsgal07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXJlcyA9ICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7DQogICAgICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQob3V0cHV0X2Rvd25bKG4gKiAobnJlICsgaSkgKyBpZHgpICogZGggKyBqXSwgb3V0cHV0X3B0cltpZHggKiBkaCArIGpdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjgoaGFsZiAqb3V0cHV0X2Rvd24sIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgICAgIF9faGFsZiB0aGlzX3Njb3JlID0gc2NvcmVbaWR4ICogMzIgKyBleHBlcnRfaWRdOw0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogNzE2OCArIGpdOw0KICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsNCiAgICAgICAgICAgIF9faGFsZiB2YWxbOF07DQogICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93blsobiAqICgzMiArIGkpICsgaWR4KSAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7DQogICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogNzE2OCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICB9DQp9DQoNCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bikgew0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIF9faGFsZiAqc2NvcmUgPSAoX19oYWxmICopdF9zY29yZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bikgew0KDQogICAgX19oYWxmICppbnB1dF9wdHIgICA9IChfX2hhbGYgKil0X2lucHV0LmRhdGFfcHRyKCk7ICAgICAgICAgICAgLy8gW24sIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X3B0ciAgPSAoX19oYWxmICopdF9vdXRwdXQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBkaF0NCg0KICAgIF9faGFsZiAqc2NvcmUgPSAoX19oYWxmICopdF9zY29yZS5kYXRhX3B0cigpOyAgICAgICAgICAgICAgICAgLy8gW24sIG5yZV0NCiAgICBpbnQgKnRvcF9pbmRpY2VzID0gKGludCAqKXRfdG9wX2luZGljZXMuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtuLCBlcHRdDQogICAgaW50ICp0b2tlbl9jb3VudCA9IChpbnQgKil0X3Rva2VuX2NvdW50LmRhdGFfcHRyKCk7ICAgICAgICAgICAvLyBbbnJlXQ0KICAgIGludCAqaW5kZXhfaW5fZXhwZXJ0ID0gKGludCAqKXRfaW5kZXhfaW5fZXhwZXJ0LmRhdGFfcHRyKCk7ICAgLy8gW24sIGVwdF0NCiAgICBfX2hhbGYgKmlucHV0X3Jlb3JkZXIgPSAoX19oYWxmICopdF9pbnB1dF9yZW9yZGVyLmRhdGFfcHRyKCk7IC8vIFtuICogZXB0LCBkaF0NCiAgICBfX2hhbGYgKm91dHB1dF9kb3duID0gKF9faGFsZiAqKXRfb3V0cHV0X2Rvd24uZGF0YV9wdHIoKTsgICAgIC8vIFtuICogKGVwdCArIG5zZSksIGRoXQ0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93biwgb3V0cHV0X3B0ciwgc2NvcmUsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIG4sIGVwdCwgbnJlLCBuc2UsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd24sIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBoaWRkZW4gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgIyBbYnMgKiBzbCAqIChucmUgKyBuc2UpLCBkZV0NCiAgICBvdXRwdXRfZG93biA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbYnMgKiBzbCAqIChucmUgKyBuc2UpLCBkaF0NCg0KICAgIHNjb3JlID0gdG9yY2guc29mdG1heChpbnB1dC52aWV3KGJzKnNsLCBkaCkgQCByb3V0ZXIuVCwgZGltPTEpICAjIFticyAqIHNsLCBucmVdDQoNCiAgICBtYXhfY291bnQgPSBtb2R1bGUubW9lMShpbnB1dCwgb3V0cHV0LCBkaCwgZGUsIG5yZSwgbnNlLCBlcHQsIGJzKnNsLA0KICAgICAgICBzY29yZSwgdG9wX2luZGljZXMsIHRva2VuX2NvdW50LCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG91dHB1dF9kb3duKQ0KDQogICAgaGlkZGVuID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBicyAqIHNsLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW25yZSArIG5zZSwgYnMgKiBzbCwgZGVdDQogICAgaGlkZGVuWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLmJtbShpbnB1dF9yZW9yZGVyWzosIDptYXhfY291bnQsIDpdLCBnYXRlX3JlKSkgKiB0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgdXBfcmUpDQogICAgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgIG91dHB1dF9kb3duID0gdG9yY2guZW1wdHkobnJlICsgbnNlLCBicyAqIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW25yZSArIG5zZSwgYnMgKiBzbCwgZGhdDQogICAgb3V0cHV0X2Rvd25bOm5yZSwgOm1heF9jb3VudCwgOl0gPSB0b3JjaC5ibW0oaGlkZGVuWzpucmUsIDptYXhfY291bnQsIDpdLCBkb3duX3JlKQ0KICAgIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd24pDQogICAgcmV0dXJuIG91dHB1dA==No newline at end of file+ IyBUaGlzIHNjcmlwdCBwcm92aWRlcyBhIHRlbXBsYXRlIGZvciB1c2luZyBsb2FkX2lubGluZSB0byBydW4gYSBISVAga2VybmVsIGZvcg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicNCmltcG9ydCB0b3JjaA0KZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQ0KZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdA0KQ1BQX1dSQVBQRVIgPSAiIiINCmludCBtb2UxKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIpOw0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KTsNCiIiIg0KDQpDVURBX1NSQyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnAxNi5oPg0KDQpfX2dsb2JhbF9fIHZvaWQgdG9wayhjb25zdCBfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgbSwgaW50IG4sIGludCBrKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA8IG0pIHsNCiAgICAgICAgLy8gRmluZCB0b3AtayBpbmRpY2VzIGZvciByb3cgaWR4DQogICAgICAgIC8vIFNpbXBsZSBzZWxlY3Rpb24gc29ydCBmb3Igc21hbGwgaw0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgew0KICAgICAgICAgICAgX19oYWxmIG1heF92YWwgPSBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKTsNCiAgICAgICAgICAgIGludCBtYXhfaWR4ID0gLTE7DQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgew0KICAgICAgICAgICAgICAgIGlmIChfX2hndChpbnB1dFtpZHggKiBuICsgal0sIG1heF92YWwpKSB7DQogICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgaTsgKytsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wX2luZGljZXNbaWR4ICogayArIGxdID09IGopIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBpbnB1dFtpZHggKiBuICsgal07DQogICAgICAgICAgICAgICAgICAgICAgICBtYXhfaWR4ID0gajsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRvcF9pbmRpY2VzW2lkeCAqIGsgKyBpXSA9IG1heF9pZHg7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCB0b3A0X25yZTMyKGNvbnN0IF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCBtKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7DQogICAgaWYgKGlkeCA+PSBtKSByZXR1cm47DQoNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBfX2hhbGYgcm93WzMyXTsNCiAgICAqKGZsb2F0NCAqKSZyb3dbMF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDBdOw0KICAgICooZmxvYXQ0ICopJnJvd1s4XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgOF07DQogICAgKihmbG9hdDQgKikmcm93WzE2XSA9ICooZmxvYXQ0ICopJmlucHV0W2lkeCAqIDMyICsgMTZdOw0KICAgICooZmxvYXQ0ICopJnJvd1syNF0gPSAqKGZsb2F0NCAqKSZpbnB1dFtpZHggKiAzMiArIDI0XTsNCg0KICAgIGludCB0b3BfaWR4WzRdID0gey0xLCAtMSwgLTEsIC0xfTsNCiAgICBfX2hhbGYgdG9wX3ZhbFs0XSA9IHtfX2Zsb2F0MmhhbGYoLUlORklOSVRZKSwgX19mbG9hdDJoYWxmKC1JTkZJTklUWSksIF9fZmxvYXQyaGFsZigtSU5GSU5JVFkpLCBfX2Zsb2F0MmhhbGYoLUlORklOSVRZKX07DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFswXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMF0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzBdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFsxXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbMV0gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzFdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgew0KICAgICAgICBpZiAoaiA9PSB0b3BfaWR4WzBdIHx8IGogPT0gdG9wX2lkeFsxXSkgY29udGludWU7DQogICAgICAgIGlmIChfX2hndChyb3dbal0sIHRvcF92YWxbMl0pKSB7DQogICAgICAgICAgICB0b3BfdmFsWzJdID0gcm93W2pdOw0KICAgICAgICAgICAgdG9wX2lkeFsyXSA9IGo7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsNCiAgICAgICAgaWYgKGogPT0gdG9wX2lkeFswXSB8fCBqID09IHRvcF9pZHhbMV0gfHwgaiA9PSB0b3BfaWR4WzJdKSBjb250aW51ZTsNCiAgICAgICAgaWYgKF9faGd0KHJvd1tqXSwgdG9wX3ZhbFszXSkpIHsNCiAgICAgICAgICAgIHRvcF92YWxbM10gPSByb3dbal07DQogICAgICAgICAgICB0b3BfaWR4WzNdID0gajsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJnRvcF9pbmRpY2VzW2lkeCAqIDRdID0gKihmbG9hdDQgKikmdG9wX2lkeFswXTsNCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleCgNCiAgICBjb25zdCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKnRva2VuX2NvdW50LCBpbnQgKmluZGV4X2luX2V4cGVydCwgaW50IG4sIGludCBlcHQsIGludCBucmUpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVwdDsgKytqKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0ID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgal07DQogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYXRvbWljQWRkKCZ0b2tlbl9jb3VudFtleHBlcnRdLCAxKTsNCiAgICAgICAgICAgIGluZGV4X2luX2V4cGVydFtpZHggKiBlcHQgKyBqXSA9IG9mZnNldDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KX19nbG9iYWxfXyB2b2lkIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0KA0KICAgIGNvbnN0IGludCAqdG9wX2luZGljZXMsIGludCAqdG9rZW5fY291bnQsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBpbnQgbikgew0KDQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQoNCiAgICBjb25zdCBpbnQgTlJFID0gMzI7DQogICAgY29uc3QgaW50IEVQVCA9IDQ7DQogICAgX19zaGFyZWRfXyBpbnQgYmxvY2tfY291bnRbTlJFXTsNCiAgICBfX3NoYXJlZF9fIGludCBibG9ja19vZmZzZXRbTlJFXTsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsNCiAgICBpZiAoaWR4ID49IG4pIHJldHVybjsNCg0KICAgIGlmICh0aHJlYWRJZHgueCA8IE5SRSkgew0KICAgICAgICBibG9ja19jb3VudFt0aHJlYWRJZHgueF0gPSAwOw0KICAgIH0NCg0KICAgIGludCB0aHJlYWRfb2Zmc2V0W0VQVF07DQogICAgaW50IHRocmVhZF9leHBlcnRbRVBUXTsNCiAgICAqKGZsb2F0NCAqKSZ0aHJlYWRfZXhwZXJ0WzBdID0gKihmbG9hdDQgKikmdG9wX2luZGljZXNbaWR4ICogRVBUICsgMF07DQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFUFQ7IGkrKykgew0KICAgICAgICB0aHJlYWRfb2Zmc2V0W2ldID0gYXRvbWljQWRkKCZibG9ja19jb3VudFt0aHJlYWRfZXhwZXJ0W2ldXSwgMSk7DQogICAgfQ0KDQogICAgaWYgKHRocmVhZElkeC54IDwgTlJFKSB7DQogICAgICAgIGJsb2NrX29mZnNldFt0aHJlYWRJZHgueF0gPSBhdG9taWNBZGQoJnRva2VuX2NvdW50W3RocmVhZElkeC54XSwgYmxvY2tfY291bnRbdGhyZWFkSWR4LnhdKTsNCiAgICB9DQoNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IEVQVDsgaSsrKSB7DQogICAgICAgIHRocmVhZF9vZmZzZXRbaV0gKz0gYmxvY2tfb2Zmc2V0W3RocmVhZF9leHBlcnRbaV1dOw0KICAgIH0NCg0KICAgICooZmxvYXQ0ICopJmluZGV4X2luX2V4cGVydFtpZHggKiBFUFQgKyAwXSA9ICooZmxvYXQ0ICopJnRocmVhZF9vZmZzZXRbMF07DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0KF9faGFsZiAqaW5wdXQsIGludCAqdG9wX2luZGljZXMsIGludCAqaW5kZXhfaW5fZXhwZXJ0LCBfX2hhbGYgKmlucHV0X3Jlb3JkZXIsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgZGgpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBmbG9hdDQgPSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgKytpKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIGVwdCArIGldOw0KICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGZsb2F0NCAqKSZpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IHZhbDsNCiAgICAgICAgICAgICAgICAvLyBpbnB1dF9yZW9yZGVyW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSA9IGlucHV0W2lkeCAqIGRoICsgal07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2OChfX2hhbGYgKmlucHV0LCBpbnQgKnRvcF9pbmRpY2VzLCBpbnQgKmluZGV4X2luX2V4cGVydCwgX19oYWxmICppbnB1dF9yZW9yZGVyLCBpbnQgbiwgaW50IGVwdCwgaW50IG5yZSwgaW50IGRoKSB7DQogICAgaW50IGlkeCA9IGJsb2NrSWR4Lng7DQogICAgdXNpbmcgZmxvYXQ0ID0gZmxvYXQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7DQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogNCArIGldOw0KICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBuICsgaW5kZXhfaW5fZXhwZXJ0W2lkeCAqIDQgKyBpXTsNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IDcxNjg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgICAgICBmbG9hdDQgdmFsID0gKihmbG9hdDQgKikmaW5wdXRbYmxvY2tJZHgueCAqIDcxNjggKyBqXTsNCiAgICAgICAgICAgICooZmxvYXQ0ICopJmlucHV0X3Jlb3JkZXJbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal0gPSB2YWw7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCl9fZ2xvYmFsX18gdm9pZCBwYWNrX291dHB1dChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBpZiAoaWR4IDwgbikgew0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVwdDsgaSsrKSB7DQogICAgICAgICAgICBpbnQgZXhwZXJ0X2lkID0gdG9wX2luZGljZXNbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogZXB0ICsgaV07DQogICAgICAgICAgICBfX2hhbGYgdGhpc19zY29yZSA9IHNjb3JlW2lkeCAqIG5yZSArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgemVyb3NbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgICAgIGZvciAoaW50IGogPSB0aHJlYWRJZHgueCAqIDg7IGogPCBkaDsgaiArPSA2NCAqIDgpIHsNCiAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9ICooaGFsZjggKil6ZXJvczsNCiAgICAgICAgICAgICAgICBfX2hhbGYgdmFsWzhdLCByZXNbOF07DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiBkaCArIGpdOw0KICAgICAgICAgICAgICAgICooaGFsZjggKilyZXMgPSAqKGhhbGY4ICopJm91dHB1dF9wdHJbaWR4ICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgICAgICByZXNba10gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIHZhbFtrXSksIHJlc1trXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICooaGFsZjggKikmb3V0cHV0X3B0cltpZHggKiBkaCArIGpdID0gKihoYWxmOCAqKXJlczsNCiAgICAgICAgICAgICAgICAvLyBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSBfX2hhZGQoX19obXVsKHRoaXNfc2NvcmUsIG91dHB1dF9kb3duW3Rva2VuX2xvY2F0aW9uICogZGggKyBqXSksIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2U7IGkrKykgew0KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRocmVhZElkeC54ICogODsgaiA8IGRoOyBqICs9IDY0ICogOCkgew0KICAgICAgICAgICAgICAgIF9faGFsZiB2YWxbOF0sIHJlc1s4XTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopdmFsID0gKihoYWxmOCAqKSZvdXRwdXRfZG93bl9zZVsobiAqIGkgKyBpZHgpICogZGggKyBqXTsNCiAgICAgICAgICAgICAgICAqKGhhbGY4ICopcmVzID0gKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal07DQogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzW2tdID0gX19oYWRkKHZhbFtrXSwgcmVzW2tdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0gPSAqKGhhbGY4ICopcmVzOw0KICAgICAgICAgICAgICAgIC8vIG91dHB1dF9wdHJbaWR4ICogZGggKyBqXSA9IF9faGFkZChvdXRwdXRfZG93blsobiAqIChucmUgKyBpKSArIGlkeCkgKiBkaCArIGpdLCBvdXRwdXRfcHRyW2lkeCAqIGRoICsgal0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQpfX2dsb2JhbF9fIHZvaWQgcGFja19vdXRwdXRfZXB0NG5yZTMybnNlMWRoNzE2OChoYWxmICpvdXRwdXRfZG93bl9yZSwgaGFsZiAqb3V0cHV0X2Rvd25fc2UsIF9faGFsZiAqb3V0cHV0X3B0ciwgY29uc3QgX19oYWxmICpzY29yZSwgaW50ICp0b3BfaW5kaWNlcywgaW50ICppbmRleF9pbl9leHBlcnQsIGludCBuLCBpbnQgZXB0LCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZGgsIGludCBtYXhfY291bnQpIHsNCiAgICBpbnQgaWR4ID0gYmxvY2tJZHgueDsNCiAgICB1c2luZyBoYWxmOCA9IF9fZnAxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsNCiAgICBmb3IgKGludCBqID0gdGhyZWFkSWR4LnggKiA4OyBqIDwgZGg7IGogKz0gNjQgKiA4KSB7DQogICAgICAgIF9faGFsZiByZXNbOF0gPSB7X19mbG9hdDJoYWxmKDAuMGYpfTsNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsNCiAgICAgICAgICAgIGludCBleHBlcnRfaWQgPSB0b3BfaW5kaWNlc1tpZHggKiA0ICsgaV07DQogICAgICAgICAgICBpbnQgdG9rZW5fbG9jYXRpb24gPSBleHBlcnRfaWQgKiBtYXhfY291bnQgKyBpbmRleF9pbl9leHBlcnRbaWR4ICogNCArIGldOw0KICAgICAgICAgICAgX19oYWxmIHRoaXNfc2NvcmUgPSBzY29yZVtpZHggKiAzMiArIGV4cGVydF9pZF07DQogICAgICAgICAgICBfX2hhbGYgdmFsWzhdOw0KICAgICAgICAgICAgKihoYWxmOCAqKXZhbCA9ICooaGFsZjggKikmb3V0cHV0X2Rvd25fcmVbdG9rZW5fbG9jYXRpb24gKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZChfX2htdWwodGhpc19zY29yZSwgdmFsW2tdKSwgcmVzW2tdKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgew0KICAgICAgICAgICAgX19oYWxmIHZhbFs4XTsNCiAgICAgICAgICAgICooaGFsZjggKil2YWwgPSAqKGhhbGY4ICopJm91dHB1dF9kb3duX3NlWyhuICogaSArIGlkeCkgKiA3MTY4ICsgal07DQogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgew0KICAgICAgICAgICAgICAgIHJlc1trXSA9IF9faGFkZCh2YWxba10sIHJlc1trXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgKihoYWxmOCAqKSZvdXRwdXRfcHRyW2lkeCAqIDcxNjggKyBqXSA9ICooaGFsZjggKilyZXM7DQogICAgfQ0KfQ0KDQppbnQgbW9lMSh0b3JjaDo6VGVuc29yIHRfaW5wdXQsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXQsDQogICAgICAgICBpbnQgZGgsIGludCBkZSwgaW50IG5yZSwgaW50IG5zZSwgaW50IGVwdCwgaW50IG4sDQogICAgICAgICB0b3JjaDo6VGVuc29yIHRfc2NvcmUsIHRvcmNoOjpUZW5zb3IgdF90b3BfaW5kaWNlcywNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF90b2tlbl9jb3VudCwgdG9yY2g6OlRlbnNvciB0X2luZGV4X2luX2V4cGVydCwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9pbnB1dF9yZW9yZGVyKSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KDQogICAgLy8gaW50ICp0b3BfaW5kaWNlczsgLy8gW24sIGVwdF0sIHRvcGsgc2NvcmUNCiAgICBpZiAoZXB0ID09IDQgJiYgbnJlID09IDMyKSB7DQogICAgICAgIHRvcDRfbnJlMzI8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHNjb3JlLCB0b3BfaW5kaWNlcywgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICB0b3BrPDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+PihzY29yZSwgdG9wX2luZGljZXMsIG4sIG5yZSwgZXB0KTsNCiAgICB9DQoNCiAgICAvLyBpbnQgKnRva2VuX2NvdW50OyAvLyBbbnJlXSwgdG9rZW4gY291bnQgb2YgZWFjaCBleHBlcnQNCiAgICAvLyBpbnQgKmluZGV4X2luX2V4cGVydDsgLy8gW24sIGVwdF0sIGluZGV4IGluIGV4cGVydCBvZiBlYWNoIHRva2VuLCBpIC0+IGV4cGVydCB0b2tlbiBpbmRleA0KICAgIC8vIGhpcE1lbXNldCh0b2tlbl9jb3VudCwgMCwgbnJlICogc2l6ZW9mKGludCkpOw0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJlOyBpKyspIHsNCiAgICAgICAgdG9rZW5fY291bnRbaV0gPSAwOw0KICAgIH0NCiAgICBpZiAobnJlID09IDMyICYmIGVwdCA9PSA0KSB7DQogICAgICAgIGNhbGN1bGF0ZV9pbmRleF9ucmUzMl9lcHQ0PDw8ZGltMygobis2MykvNjQpLCBkaW0zKDY0KT4+Pih0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgbik7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBjYWxjdWxhdGVfaW5kZXg8PDxkaW0zKChuKzYzKS82NCksIGRpbTMoNjQpPj4+KHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSk7DQogICAgfQ0KDQogICAgLy8gcmVvcmRlciBpbnB1dA0KICAgIC8vIF9faGFsZiAqaW5wdXRfcmVvcmRlcjsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIGlmIChlcHQgPT0gNCAmJiBucmUgPT0gMzIgJiYgZGggPT0gNzE2OCkgew0KICAgICAgICByZW9yZGVyX2lucHV0X2VwdDRucmUzMmRoNzE2ODw8PGRpbTMobiksIGRpbTMoNjQpPj4+KGlucHV0X3B0ciwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgbiwgZXB0LCBucmUsIGRoKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHJlb3JkZXJfaW5wdXQ8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihpbnB1dF9wdHIsIHRvcF9pbmRpY2VzLCBpbmRleF9pbl9leHBlcnQsIGlucHV0X3Jlb3JkZXIsIG4sIGVwdCwgbnJlLCBkaCk7DQogICAgfQ0KDQogICAgaGlwRGV2aWNlU3luY2hyb25pemUoKTsNCiAgICBpbnQgbWF4X3Rva2VuX2NvdW50ID0gMDsNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5yZTsgaSsrKSB7DQogICAgICAgIGlmICh0b2tlbl9jb3VudFtpXSA+IG1heF90b2tlbl9jb3VudCkgbWF4X3Rva2VuX2NvdW50ID0gdG9rZW5fY291bnRbaV07DQogICAgfQ0KDQogICAgcmV0dXJuIG1heF90b2tlbl9jb3VudDsNCn0NCg0Kdm9pZCBtb2UyKHRvcmNoOjpUZW5zb3IgdF9pbnB1dCwgdG9yY2g6OlRlbnNvciB0X291dHB1dCwNCiAgICAgICAgIGludCBkaCwgaW50IGRlLCBpbnQgbnJlLCBpbnQgbnNlLCBpbnQgZXB0LCBpbnQgbiwNCiAgICAgICAgIHRvcmNoOjpUZW5zb3IgdF9zY29yZSwgdG9yY2g6OlRlbnNvciB0X3RvcF9pbmRpY2VzLA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X3Rva2VuX2NvdW50LCB0b3JjaDo6VGVuc29yIHRfaW5kZXhfaW5fZXhwZXJ0LA0KICAgICAgICAgdG9yY2g6OlRlbnNvciB0X2lucHV0X3Jlb3JkZXIsIHRvcmNoOjpUZW5zb3IgdF9vdXRwdXRfZG93bl9yZSwgdG9yY2g6OlRlbnNvciB0X291dHB1dF9kb3duX3NlLCBpbnQgbWF4X2NvdW50KSB7DQoNCiAgICBfX2hhbGYgKmlucHV0X3B0ciAgID0gKF9faGFsZiAqKXRfaW5wdXQuZGF0YV9wdHIoKTsgICAgICAgICAgICAvLyBbbiwgZGhdDQogICAgX19oYWxmICpvdXRwdXRfcHRyICA9IChfX2hhbGYgKil0X291dHB1dC5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGRoXQ0KDQogICAgX19oYWxmICpzY29yZSA9IChfX2hhbGYgKil0X3Njb3JlLmRhdGFfcHRyKCk7ICAgICAgICAgICAgICAgICAvLyBbbiwgbnJlXQ0KICAgIGludCAqdG9wX2luZGljZXMgPSAoaW50ICopdF90b3BfaW5kaWNlcy5kYXRhX3B0cigpOyAgICAgICAgICAgLy8gW24sIGVwdF0NCiAgICBpbnQgKnRva2VuX2NvdW50ID0gKGludCAqKXRfdG9rZW5fY291bnQuZGF0YV9wdHIoKTsgICAgICAgICAgIC8vIFtucmVdDQogICAgaW50ICppbmRleF9pbl9leHBlcnQgPSAoaW50ICopdF9pbmRleF9pbl9leHBlcnQuZGF0YV9wdHIoKTsgICAvLyBbbiwgZXB0XQ0KICAgIF9faGFsZiAqaW5wdXRfcmVvcmRlciA9IChfX2hhbGYgKil0X2lucHV0X3Jlb3JkZXIuZGF0YV9wdHIoKTsgLy8gW24gKiBlcHQsIGRoXQ0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fcmUgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9yZS5kYXRhX3B0cigpOw0KICAgIF9faGFsZiAqb3V0cHV0X2Rvd25fc2UgPSAoX19oYWxmICopdF9vdXRwdXRfZG93bl9zZS5kYXRhX3B0cigpOw0KDQogICAgaWYgKGVwdCA9PSA0ICYmIG5yZSA9PSAzMiAmJiBuc2UgPT0gMSAmJiBkaCA9PSA3MTY4KSB7DQogICAgICAgIHBhY2tfb3V0cHV0X2VwdDRucmUzMm5zZTFkaDcxNjg8PDxkaW0zKG4pLCBkaW0zKDY0KT4+PihvdXRwdXRfZG93bl9yZSwgb3V0cHV0X2Rvd25fc2UsIG91dHB1dF9wdHIsIHNjb3JlLCB0b3BfaW5kaWNlcywgaW5kZXhfaW5fZXhwZXJ0LCBuLCBlcHQsIG5yZSwgbnNlLCBkaCwgbWF4X2NvdW50KTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIHBhY2tfb3V0cHV0PDw8ZGltMyhuKSwgZGltMyg2NCk+Pj4ob3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBvdXRwdXRfcHRyLCBzY29yZSwgdG9wX2luZGljZXMsIGluZGV4X2luX2V4cGVydCwgbiwgZXB0LCBucmUsIG5zZSwgZGgsIG1heF9jb3VudCk7DQogICAgfQ0KfQ0KIiIiDQoNCmltcG9ydCBvcw0Kb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyINCg0KbW9kdWxlID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nbW9lJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ21vZTEnLCAnbW9lMiddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMyIsICItdyJdLA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGENCg0KICAgIGRoID0gY29uZmlnWyJkX2hpZGRlbiJdDQogICAgZGUgPSBjb25maWdbImRfZXhwZXJ0Il0NCiAgICBucmUgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQ0KICAgIG5zZSA9IGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdDQogICAgZXB0ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0NCiAgICBicyA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdDQogICAgc2wgPSBjb25maWdbInNlcV9sZW4iXQ0KDQogICAgaW5wdXQgICA9IGlucHV0X3RlbnNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgcm91dGVyICA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgW25yZSwgZGhdDQogICAgZ2F0ZV9yZSA9IHRvcmNoLmVtcHR5KG5yZSwgZGgsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICMgW25yZSwgZGgsIGRlXQ0KICAgIHVwX3JlICAgPSB0b3JjaC5lbXB0eShucmUsIGRoLCBkZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAjIFtucmUsIGRoLCBkZV0NCiAgICBkb3duX3JlID0gdG9yY2guZW1wdHkobnJlLCBkZSwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgIyBbbnJlLCBkZSwgZGhdDQogICAgZ2F0ZV9zZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10udmlldyhkaCwgbnNlLCBkZSkudHJhbnNwb3NlKDAsIDEpICMgW25zZSwgZGgsIGRlXQ0KICAgIHVwX3NlICAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnZpZXcoZGgsIG5zZSwgZGUpLnRyYW5zcG9zZSgwLCAxKSAjIFtuc2UsIGRoLCBkZV0NCiAgICBkb3duX3NlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS52aWV3KG5zZSwgZGUsIGRoKSAgICAgICAgICAgICAgICAgIyBbbnNlLCBkZSwgZGhdDQogICAgb3V0cHV0ID0gdG9yY2guZW1wdHkoYnMsIHNsLCBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICMgW2JzLCBzbCwgZGhdDQogICAgZm9yIGkgaW4gcmFuZ2UobnJlKToNCiAgICAgICAgZ2F0ZV9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddDQogICAgICAgIHVwX3JlW2ldID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10NCiAgICAgICAgZG93bl9yZVtpXSA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddDQoNCiAgICB0b3BfaW5kaWNlcyA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiBlcHQsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9J2N1ZGEnKSAgICAgICAgICAgICAgICAgIyBbYnMgKiBzbCwgZXB0XQ0KICAgIHRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkobnJlLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPSdjdWRhJykgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFtucmVdDQogICAgaW5kZXhfaW5fZXhwZXJ0ID0gdG9yY2guZW1wdHkoYnMgKiBzbCAqIGVwdCwgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgICMgW2JzICogc2wsIGVwdF0NCiAgICBpbnB1dF9yZW9yZGVyID0gdG9yY2guZW1wdHkobnJlLCBicypzbCwgZGgsIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0nY3VkYScpICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICAjIGhpZGRlbiA9IHRvcmNoLmVtcHR5KGJzICogc2wgKiAobnJlICsgbnNlKSAqIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgICAgICAjIFticyAqIHNsICogKG5yZSArIG5zZSksIGRlXQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShicyAqIHNsICogKG5yZSArIG5zZSkgKiBkaCwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgICMgW2JzICogc2wgKiAobnJlICsgbnNlKSwgZGhdDQoNCiAgICBzY29yZSA9IHRvcmNoLnNvZnRtYXgoaW5wdXQudmlldyhicypzbCwgZGgpIEAgcm91dGVyLlQsIGRpbT0xKSAgIyBbYnMgKiBzbCwgbnJlXQ0KDQogICAgbWF4X2NvdW50ID0gbW9kdWxlLm1vZTEoaW5wdXQsIG91dHB1dCwgZGgsIGRlLCBucmUsIG5zZSwgZXB0LCBicypzbCwNCiAgICAgICAgc2NvcmUsIHRvcF9pbmRpY2VzLCB0b2tlbl9jb3VudCwgaW5kZXhfaW5fZXhwZXJ0LCBpbnB1dF9yZW9yZGVyKQ0KDQogICAgIyBoaWRkZW4gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRlLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkZV0NCiAgICAjIGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKQ0KICAgICMgaGlkZGVuW25yZTosIDosIDpdID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIGdhdGVfc2UpKSAqIHRvcmNoLm1hdG11bChpbnB1dC52aWV3KGJzKnNsLCBkaCksIHVwX3NlKQ0KICAgICMgb3V0cHV0X2Rvd24gPSB0b3JjaC5lbXB0eShucmUgKyBuc2UsIGJzICogc2wsIGRoLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAgIyBbbnJlICsgbnNlLCBicyAqIHNsLCBkaF0NCiAgICAjIG91dHB1dF9kb3duWzpucmUsIDptYXhfY291bnQsIDpdID0gdG9yY2guYm1tKGhpZGRlbls6bnJlLCA6bWF4X2NvdW50LCA6XSwgZG93bl9yZSkNCiAgICAjIG91dHB1dF9kb3duW25yZTosIDosIDpdID0gdG9yY2guYm1tKGhpZGRlbltucmU6LCA6LCA6XSwgZG93bl9zZSkNCg0KICAgIGhpZGRlbl9yZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5ibW0oaW5wdXRfcmVvcmRlcls6LCA6bWF4X2NvdW50LCA6XSwgZ2F0ZV9yZSkpICogdG9yY2guYm1tKGlucHV0X3Jlb3JkZXJbOiwgOm1heF9jb3VudCwgOl0sIHVwX3JlKSAjIFtucmUsIGJzICogc2wsIGRlXQ0KICAgIGhpZGRlbl9zZSA9IHRvcmNoLm5uLmZ1bmN0aW9uYWwuc2lsdSh0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCBnYXRlX3NlKSkgKiB0b3JjaC5tYXRtdWwoaW5wdXQudmlldyhicypzbCwgZGgpLCB1cF9zZSkNCiAgICBvdXRwdXRfZG93bl9yZSA9IHRvcmNoLmJtbShoaWRkZW5fcmUsIGRvd25fcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnJlLCBicyAqIHNsLCBkaF0NCiAgICBvdXRwdXRfZG93bl9zZSA9IHRvcmNoLmJtbShoaWRkZW5fc2UsIGRvd25fc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbbnNlLCBicyAqIHNsLCBkaF0NCg0KICAgIG1vZHVsZS5tb2UyKGlucHV0LCBvdXRwdXQsIGRoLCBkZSwgbnJlLCBuc2UsIGVwdCwgYnMqc2wsDQogICAgICAgIHNjb3JlLCB0b3BfaW5kaWNlcywgdG9rZW5fY291bnQsIGluZGV4X2luX2V4cGVydCwgaW5wdXRfcmVvcmRlciwgb3V0cHV0X2Rvd25fcmUsIG91dHB1dF9kb3duX3NlLCBtYXhfY291bnQpDQogICAgcmV0dXJuIG91dHB1dA==No newline at end of file
Best evidence level for this revision: reported
JSON