Skip to content
KernelIndex
Search⌘K

submission 24311

KernelBot user 292 · 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.

hipmode.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-24311?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, 512]
AMD Instinct MI300X
41.4µs
#31 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
42.4µs
#32 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
60.3µs
#41 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
89.5µs
#36 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
98.3µs
#39 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
101.5µs
#32 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
116.2µs
#32 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
117.9µs
#39 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
127.6µs
#35 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
159.1µs
#43 of 98
2025-05-18
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
173.0µs
#34 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
177.1µs
#35 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
182.0µs
#33 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
207.6µs
#34 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
367.9µs
#40 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
444.0µs
#34 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
497.1µs
#37 of 98
2025-05-18
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
990.4µs
#38 of 98
2025-05-18

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:d52b7455ef126eec8d8e48c0d3beaf9486242eabd29f85984b785c67fd0c0ee5
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

hipmode.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgICAgICBmbG9hdDIgdmFsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDIqPihBc19wdHIgKyBibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIE0gKiAoa2Jhc2UgLyAxMjgpKVt0NjR4XTsNCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IG1ha2VfZmxvYXQyKHZhbC54ICogdGlsZUJzLCB2YWwueSAqIHRpbGVCcyk7DQogICAgICAgIH0gICAgICAgDQoNCiAgICAgICAgLy8gaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAvLyAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgIC8vICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Mio+KHRpbGVBcylbdDY0eF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdICogdGlsZUJzOw0KICAgICAgICAvLyB9DQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsgDQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIDY0ICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyA2NF07DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaV9sb2FkIDwgS19KVU1QDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICAgLy8gQXBwbHkgc2NhbGVyDQoNCg0KICAgICAgICAvLyBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgaW50IHBsYWNlID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIDQgKiAodDY0eCAvIDMyKTs7DQoNCiAgICAgICAgLy8gaSA9IDANCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMF0gICs9IHRpbGVBc1twbGFjZSArIDBdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzFdICArPSB0aWxlQXNbcGxhY2UgKyAxXSAgKiBmcmFnX2FjY19ibG9jay54WzFdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsyXSAgKz0gdGlsZUFzW3BsYWNlICsgMl0gICogZnJhZ19hY2NfYmxvY2sueFsyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbM10gICs9IHRpbGVBc1twbGFjZSArIDNdICAqIGZyYWdfYWNjX2Jsb2NrLnhbM107DQoNCiAgICAgICAgLy8gaSA9IDENCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNF0gICs9IHRpbGVBc1twbGFjZSArIDhdICAqIGZyYWdfYWNjX2Jsb2NrLnhbNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzVdICArPSB0aWxlQXNbcGxhY2UgKyA5XSAgKiBmcmFnX2FjY19ibG9jay54WzVdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs2XSAgKz0gdGlsZUFzW3BsYWNlICsgMTBdICogZnJhZ19hY2NfYmxvY2sueFs2XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbN10gICs9IHRpbGVBc1twbGFjZSArIDExXSAqIGZyYWdfYWNjX2Jsb2NrLnhbN107DQoNCiAgICAgICAgLy8gaSA9IDINCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOF0gICs9IHRpbGVBc1twbGFjZSArIDE2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzldICArPSB0aWxlQXNbcGxhY2UgKyAxN10gKiBmcmFnX2FjY19ibG9jay54WzldOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMF0gKz0gdGlsZUFzW3BsYWNlICsgMThdICogZnJhZ19hY2NfYmxvY2sueFsxMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzExXSArPSB0aWxlQXNbcGxhY2UgKyAxOV0gKiBmcmFnX2FjY19ibG9jay54WzExXTsNCg0KICAgICAgICAvLyBpID0gMw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMl0gKz0gdGlsZUFzW3BsYWNlICsgMjRdICogZnJhZ19hY2NfYmxvY2sueFsxMl07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEzXSArPSB0aWxlQXNbcGxhY2UgKyAyNV0gKiBmcmFnX2FjY19ibG9jay54WzEzXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTRdICs9IHRpbGVBc1twbGFjZSArIDI2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTRdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNV0gKz0gdGlsZUFzW3BsYWNlICsgMjddICogZnJhZ19hY2NfYmxvY2sueFsxNV07DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOyAvLyBXZSBuZWVkIHRoaXMgc3ludGhyZWFkcygpDQogICAgfSAvLyBlbmQgZm9yIGtiYXNlDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTSkgcmV0dXJuOw0KDQogICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICAgYXV0byBmcmFnX3Jlc3VsdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9QTEFDRUhPTERFUiwgcm9jd21tYTo6YmZsb2F0MTZfdD4oKTsgLy9QbGFjZWhvbGRlciBmcmFnDQogICAgDQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICAgfQ0KICAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQogICAgLy8gaW50IHNuID0gTiAvIDEyODsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQls2NF1bMjY0XTsgLy8gcm93LW1hag0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs2NF1bMjMyXTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBpbnQgbGRiID0gMjY0Ow0KICAgIGludCBsZGEgPSAyMzI7DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQogDQogICAgICAgIC8vIExvYWQgdGlsZXMNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGlsZUJbdDY0eF1bMjI0ICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyMjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4XVsyNDAgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDI0MCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07IA0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsga21pbmksIGxkYik7ICAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsgDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgIGZsb2F0IHRpbGVBcyA9IEFzX3B0clsoa2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBmbG9hdCBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDEyODsga21pbmkgPCBLX0pVTVAgLSAzMjsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9ICANCg0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsgS19KVU1QIC0gMzIsIGxkYik7ICAgICAgICANCiAgICAgICAgDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyBLX0pVTVAgLSAzMikgKiBNICsgY29sX2Jhc2VfQywgTSk7DQogICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYl9sZWZ0LCBmcmFnX2FjY19ibG9jayk7DQoNCiAgICAgICAgdGlsZUFzID0gQXNfcHRyWygoa2Jhc2UgKyAxMjgpIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIHRpbGVCcyA9IEJzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAvLyBUT0RPOiBwcmFnbWEgdW5yb2xsIDQgbGVhZHMgdG8gcmVnaXN0ZXIgc3BpbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9IA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICB9Ly8gZW5kIGZvciAoaW50IGtiYXNlID0gMDsga2Jhc2UgPCBLOyBrYmFzZSArPSAxMjgpIA0KDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE0pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KfQ0KDQpjb25zdGV4cHIgaW50IEtfVkFMVUUgPSA3MTY4Ow0KY29uc3RleHByIGludCBNX1ZBTFVFID0gNjE0NDsNCmNvbnN0ZXhwciBpbnQgTl9WQUxVRSA9IDQ2MDg7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgTiA9PSBOX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICANCiAgICBpZiAoTSAqIE4gPD0gVEhSRVNIT0xEKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeCAqIDE2KSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeSAqIDE2KSk7DQogICAgICAgIGtfbGFyZ2Vfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQoNCiAgICBlbHNlIHsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMzIgLSAxKSAvIChudW1fd2FycF94ICogMzIpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMzIgLSAxKSAvIChudW1fd2FycF95ICogMzIpKTsNCiAgICAgICAgYmFsYW5jZV9uZXdfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICByZXR1cm47ICAgIA0KICAgIH0NCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQppbXBvcnQgdG9yY2gNCmJsb2NrX3NoYXBlID0gMTI4DQoNCg0KIyBiaWcgb25lLCB1c2VkIHdoZW4gTiBpcyA+PSAzMDcyDQptb2R1bGVfYmlnID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMjAiXSwgICAgDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgbW9kdWxlX2JpZy5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykgDQogICAgcmV0dXJuIGMNCg==

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 18428.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDMyA9ICIiIg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+DQojaW5jbHVkZSA8cm9jd21tYS9yb2N3bW1hLmhwcD4NCiNpbmNsdWRlIDxjb29wZXJhdGl2ZV9ncm91cHMuaD4NCm5hbWVzcGFjZSBjZyA9IGNvb3BlcmF0aXZlX2dyb3VwczsNCg0KLy91c2luZyBmbG9hdHgxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygxNiAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7DQoNCiNkZWZpbmUgS19KVU1QIDY0DQojZGVmaW5lIFdNTUFfTSAxNg0KI2RlZmluZSBXTU1BX04gMTYNCiNkZWZpbmUgV01NQV9LIDMyDQojZGVmaW5lIE5VTV9XQVJQX1ggNA0KI2RlZmluZSBOVU1fV0FSUF9ZIDENCiNkZWZpbmUgV0FSUF9TSVpFIDY0DQojZGVmaW5lIFdNTUFfUExBQ0VIT0xERVIgOA0KDQpfX2dsb2JhbF9fIHZvaWQgY3VzdG9tX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAoMTZ4NCkgeCAoMTZ4MSkgPSA2NHgxNiA9IDEwMjQgZWxlbXMNCiAgICBudW1fd2FycF94ID0gNA0KICAgIG51bV93YXJwX3kgPSAxDQogICAgYmxvY2sgc2l6ZSA9ICgoNjQgKiBudW1fd2FycF94KSwgbnVtX3dhcnBfeSkgPSAyNTYgdGhyZWFkcw0KICAgIGdyaWQgc2l6ZSA9IChOIC8gKG51bV93YXJwX3ggKiBXTU1BX04pLCBNIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKQ0KICAgIC0+IGJsb2NrRGltLnggPSA2NCAqIDQsIGJsb2NrRGltLnkgPSAxDQoNCiAgICBvciBjZWlsIGRpdmlzaW9uDQogICAgZGltMyBncmlkX3NpemUoKE4gKyBudW1fd2FycF94ICogV01NQV9OIC0gMSkgLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIA0KICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIFdNTUFfTSAtIDEpIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKTsNCg0KICAgIEE6IE0geCBLIGNvbC1tYWogIC0tLSBBcyAoMXgxMjggc2NhbGluZyk6IE0geCBLLzEyOCBjb2wtbWFqDQogICAgQjogSyB4IE4gcm93LW1haiAgLS0tIEJzICgxMjh4MTI4IHNjYWxpbmcpOiBLLzEyOCB4IE4vMTI4IHJvdy1tYWoNCiAgICBDOiBNIHggTiByb3ctbWFqDQogICAgTSwgTiBpcyBkaXZpc2libGUgYnkgNjQgKHNvbWUgYXJlIG9ubHkgZGl2aXNpYmxlIGJ5IDMyKQ0KICAgIEsgaXMgZGl2aXNpYmxlIGJ5IDEyOA0KICAgICovICAgICAgDQovLyAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAvLyA9IDANCiAgIGludCByb3dfYmFzZV9DID0gYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKiBXTU1BX007DQogICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgIA0KICAgDQogICAvLyBTTUVNOiAoIDE2ICogNzIgKyA2NCAqIDcyKSAvIDEwMjQgKyAxNiAqIDIwICogNCAvIDEwMjQgPSA1LjYyNSArIDEuMjUgPSA2Ljg3NSBLQiBvZiBMRFMgbWVtb3J5IHBlciBibG9jaywgOCBibG9ja3MgPSA1NUtCDQoNCiAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVsxNl1bNzJdOyAvLyByb3ctbWFqb3INCiAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQls2NF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgIF9fc2hhcmVkX18gZmxvYXQgdGlsZUFCc1sxNl1bMjBdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5wb3NlZCwgcGFkZGluZyA0DQoNCiAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgIC8vIGludCBsZGEgPSBNOw0KICAgLy8gaW50IGxkYiA9IE47DQoNCiAgIGZvciAoaW50IGtiYXNlID0gMDsga2Jhc2UgPCBLOyBrYmFzZSArPSBLX0pVTVApIHsNCg0KICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQNCiAgICAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMjU2IHRocmVhZHMgLT4gNjQgeCA0DQogICAgICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyAgICAgICAgDQoNCiAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgS19KVU1QOyBrbWluaV9sb2FkICs9IDQpeyAgLy8gNCBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgIGF1dG8gZ3JvdXAxNiA9IGNnOjp0aWxlZF9wYXJ0aXRpb248MTY+KHRoaXNfdGIpOyAvLyAyNTYgdGhyZWFkcyAtPiAxNiB4IDE2DQogICAgICAgaW50IHQxNnggPSBncm91cDE2LnRocmVhZF9yYW5rKCk7DQogICAgICAgaW50IHQxNnkgPSBncm91cDE2Lm1ldGFfZ3JvdXBfcmFuaygpOw0KICAgICAgIA0KICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgS19KVU1QOyBrbWluaV9sb2FkICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0MTZ4XVtrbWluaV9sb2FkICsgdDE2eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQxNnggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQxNnkpXTsNCiAgICAgICB9DQoNCiAgICAgICANCiAgICAgICBpZiAodDE2eSA9PSAwKXsNCiAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsNCiAgICAgICAgICAgZmxvYXQgc2NhbGVCID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIChibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCAvIDEyOCldOw0KICAgICAgICAgICBmbG9hdCB2YWwgPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0MTZ4ICsgTSAqIChrYmFzZSAvIDEyOCldICogc2NhbGVCOw0KICAgICAgICAgICAvLyBUUlk6ICNwcmFnbWEgdW5yb2xsIGlmIG5vIHJlZ2lzdGVyIHByZXNzdXJlDQogICAgICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICB0aWxlQUJzW2ldW3QxNnhdID0gdmFsOw0KICAgICAgICAgICB9IC8vIGVuZCBmb3IgaSA8IDE2ICAgICAgICAgICAgDQogICAgICAgfSAvLyBlbmQgaWYgKHQ2NHkgPT0gMCkNCg0KDQoNCiAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCg0KICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyAgDQoNCiAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCBLX0pVTVA7IGttaW5pICs9IFdNTUFfSykgeyAgICAgICAgICAgDQogICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gICsga21pbmksIDcyKTsgICAgICAgICAgICANCiAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgNzIgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIDcyKTsNCiAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgfSAvLyBlbmQgZm9yIGttaW5pDQogICAgICAgDQogICAgICAgYXV0byBmcmFnX3NjYWxlQSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfc2NhbGVBLCAmdGlsZUFCc1swXVswXSwgMjAsIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQogICAgICAgLy8gQXBwbHkgc2NhbGVyDQogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgICAgLy9mcmFnX2FjY19tYXN0ZXIueFtpXSArPSBmcmFnX3NjYWxlQS54W2ldICogZnJhZ19hY2NfYmxvY2sueFtpXTsNCiAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKGZyYWdfc2NhbGVBLnhbaV0sIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICB9DQoNCiAgICAgICBfX3N5bmN0aHJlYWRzKCk7ICAgICAgICANCiAgIH0gLy8gZW5kIGZvciBrYmFzZQ0KICANCiAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgYXV0byBmcmFnX3Jlc3VsdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9QTEFDRUhPTERFUiwgcm9jd21tYTo6YmZsb2F0MTZfdD4oKTsgLy9QbGFjZWhvbGRlciBmcmFnDQogICANCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgfQ0KDQogICBpbnQgbGRjID0gTjsNCiAgICAgIA0KICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICogbGRjICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIGxkYywgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsNCiAgICBpbnQgTSA9IGEuc2l6ZSgwKTsNCiAgICBpbnQgTiA9IGIuc2l6ZSgwKTsNCiAgICBpbnQgSyA9IGEuc2l6ZSgxKTsNCg0KICAgIGludCBudW1fd2FycF94ID0gTlVNX1dBUlBfWDsNCiAgICBpbnQgbnVtX3dhcnBfeSA9IE5VTV9XQVJQX1k7DQogICAgZGltMyBibG9ja19zaXplKChXQVJQX1NJWkUgKiBudW1fd2FycF94KSwgbnVtX3dhcnBfeSk7DQogICAgZGltMyBncmlkX3NpemUoKE4gKyBudW1fd2FycF94ICogV01NQV9OIC0gMSkgLyAobnVtX3dhcnBfeCAqIFdNTUFfTiksIA0KICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIFdNTUFfTSAtIDEpIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKTsNCg0KICAgIGN1c3RvbV9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIA0KICAgIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgLy9DMTBfQ1VEQV9DSEVDSyhjdWRhR2V0TGFzdEVycm9yKCkpOw0KfQ0KIiIiDQoNCg0KQ1VEQV9TUkMyID0gIiIiDQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPg0KI2luY2x1ZGUgPGNvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KbmFtZXNwYWNlIGNnID0gY29vcGVyYXRpdmVfZ3JvdXBzOw0KDQovL3VzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsNCg0KI2RlZmluZSBLX0pVTVAgMTI4DQojZGVmaW5lIFdNTUFfTSAxNg0KI2RlZmluZSBXTU1BX04gMTYNCiNkZWZpbmUgV01NQV9LIDMyDQojZGVmaW5lIE5VTV9XQVJQX1ggNA0KI2RlZmluZSBOVU1fV0FSUF9ZIDQNCiNkZWZpbmUgV0FSUF9TSVpFIDY0DQojZGVmaW5lIFdNTUFfUExBQ0VIT0xERVIgOA0KDQpfX2dsb2JhbF9fIHZvaWQgY3VzdG9tX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAoMTZ4NCkgeCAoMTZ4NCkgPSA2NHg2NCBlbGVtcw0KICAgIG51bV93YXJwX3ggPSA0DQogICAgbnVtX3dhcnBfeSA9IDQNCiAgICBibG9jayBzaXplID0gKCg2NCAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KSA9IDEwMjQgdGhyZWFkcw0KICAgIGdyaWQgc2l6ZSA9IChOIC8gKG51bV93YXJwX3ggKiBXTU1BX04pLCBNIC8gKG51bV93YXJwX3kgKiBXTU1BX00pKQ0KICAgIC0+IGJsb2NrRGltLnggPSA2NCAqIDQsIGJsb2NrRGltLnkgPSA2NA0KDQogICAgb3IgY2VpbCBkaXZpc2lvbg0KICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIFdNTUFfTiAtIDEpIC8gKG51bV93YXJwX3ggKiBXTU1BX04pLCANCiAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiBXTU1BX00gLSAxKSAvIChudW1fd2FycF95ICogV01NQV9NKSk7DQoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAqLyAgICAgIA0KDQogICAgLy8gVFJZOiBicmluZyB3YXJwX2lkeF95IGFuZCB4IGluc2lkZSBmb3IgbG9vcCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAvLyBUUlk6IHJlbW92ZSB3YXJwX2lkeF95IGlmIGl0IGNhdXNlcyBleHRyZW1lIHNsb3cgZG93biBsaWtlIGJlZm9yZQ0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgIA0KICAgIA0KICAgIC8vIFNNRU06IDY0ICogMTM2ICogMiAvIDEwMjQgKyAxNiAqIDY4ICogNCAvIDEwMjQgPSAxNyArIDQuMjUgPSAyMS4yNSBLQiBvZiBMRFMgbWVtb3J5IHBlciBibG9jaw0KICAgIC8vIFBhZGRpbmcgZnJvbSAxMjggdG8gMTM2IHRvIG1pbmltaXplIGJhbmsgY29uZmxpY3QgYW5kIHByZXNlcnZlIGxkcyAxMjgNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzEzNl07IC8vIHJvdy1tYWpvcg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQls2NF1bMTM2XTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFuc3Bvc2VkDQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQUJzWzE2XVs2OF07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnBvc2VkLCBwYWRkaW5nIDQNCiAgICAvL19fc2hhcmVkX18gZmxvYXQgdGlsZUFCc1s2NF1bMjBdOyAvLyByb3ctbWFqb3IsIHBhZGRpbmcgNA0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICAvLyBpbnQgbGRhID0gTTsNCiAgICAvLyBpbnQgbGRiID0gTjsNCg0KICAgIGZvciAoaW50IGtiYXNlID0gMDsga2Jhc2UgPCBLOyBrYmFzZSArPSBLX0pVTVApIHsNCg0KICAgICAgICAvLyBMb2FkIFNNRU06IHRpbGVBLCB0aWxlQiwgdGlsZUFzLCB0aWxlQnMNCiAgICAgICAgLy8gVFJZOiB0ZXN0IHRpbGVkIHBhcnRpdGlvbiA2NA0KICAgICAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICAgICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgICAgIC8vY2c6OmNvYWxlc2NlZF9ncm91cCBncm91cDY0ID0gY2c6OmNvYWxlc2NlZF90aHJlYWRzKCk7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgICAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7ICAgICAgICANCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaV9sb2FkID0gMDsga21pbmlfbG9hZCA8IEtfSlVNUDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIC8vIGlmICgoYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4KSA8IE0gJiYgKGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCkgPCBOKXsNCiAgICAgICAgICAgIC8vICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIC8vICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAvLyB9DQogICAgICAgICAgICAvLyBlbHNlew0KICAgICAgICAgICAgLy8gICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IDA7DQogICAgICAgICAgICAvLyAgICAgdGlsZUJbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gMDsNCiAgICAgICAgICAgIC8vIH0NCg0KICAgICAgICAgICAgLy8gSXQgd2lsbCBsb2FkIHRoZSBib3VuZGFyeSwgYnV0IG5vIE1GTUEgd2lsbCBiZSBjYWxjdWxhdGVkDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KDQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaV9sb2FkIDwgS19KVU1QDQoNCiAgICAgICAgaWYgKHQ2NHkgPT0gMCl7DQogICAgICAgICAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgICAgICAgICAgZmxvYXQgc2NhbGVCID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIChibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCAvIDEyOCldOw0KICAgICAgICAgICAgZmxvYXQgdmFsID0gQXNfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHNjYWxlQjsNCiAgICAgICAgICAgIC8vIFRSWTogI3ByYWdtYSB1bnJvbGwgaWYgbm8gcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpeyAgICAgIA0KICAgICAgICAgICAgICAgIHRpbGVBQnNbaV1bdDY0eF0gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvL3RpbGVBQnNbdDY0eF1baV0gPSB2YWw7DQogICAgICAgICAgICB9IC8vIGVuZCBmb3IgaSA8IDE2ICAgICAgICAgICAgDQogICAgICAgIH0gLy8gZW5kIGlmICh0NjR5ID09IDApDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCBLX0pVTVA7IGttaW5pICs9IFdNTUFfSykgeyAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVBWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogMTM2ICsga21pbmksIDEzNik7ICAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVCWzBdWzBdICsga21pbmkgKyAxMzYgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIDEzNik7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfc2NhbGVBID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfc2NhbGVBLCAmdGlsZUFCc1swXVswXSArIHdhcnBfaWR4X3kgKiBXTU1BX00sIDY4LCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCiAgICAgICAgLy9yb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfc2NhbGVBLCAmdGlsZUFCc1swXVswXSArIHdhcnBfaWR4X3kgKiBXTU1BX00gKiAyMCwgMjAsIHJvY3dtbWE6Om1lbV9yb3dfbWFqb3IpOw0KDQogICAgICAgIC8vIEFwcGx5IHNjYWxlcg0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICAgICAgLy9mcmFnX2FjY19tYXN0ZXIueFtpXSArPSBmcmFnX3NjYWxlQS54W2ldICogZnJhZ19hY2NfYmxvY2sueFtpXTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihmcmFnX3NjYWxlQS54W2ldLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIE5vIG5lZWQgZm9yIHRoaXMgc3ludGhyZWFkcygpLCBidXQgaXQncyBmYXN0ZXIgd2l0aCBpdCA/Pz8gICAgICAgDQogICAgfSAvLyBlbmQgZm9yIGtiYXNlDQogICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICAgfQ0KICAgICAgIA0KICAgIF9fc2hhcmVkX18gcm9jd21tYTo6YmZsb2F0MTZfdCByZXN1bHRbNjRdWzY4XTsgLy8gY29sLW1ham9yLCA9IHJvdy1tYWpvciB0cmFuc3Bvc2VkDQogICAgICAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKCZyZXN1bHRbMF1bMF0gKyB3YXJwX2lkeF95ICogV01NQV9NICsgNjggKiB3YXJwX2lkeF94ICogV01NQV9OLCBmcmFnX3Jlc3VsdCwgNjgsIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsNCg0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQga21pbmlfc3RvcmUgPSAwOyBrbWluaV9zdG9yZSA8IDY0OyBrbWluaV9zdG9yZSArPSAxNil7DQogICAgICAgIENfcHRyWyhibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIGttaW5pX3N0b3JlICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XSA9IHJlc3VsdFt0NjR4XVtrbWluaV9zdG9yZSArIHQ2NHldOw0KICAgIH0NCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiBXTU1BX04gLSAxKSAvIChudW1fd2FycF94ICogV01NQV9OKSwgDQogICAgICAgICAgICAgICAgICAgKE0gKyBudW1fd2FycF95ICogV01NQV9NIC0gMSkgLyAobnVtX3dhcnBfeSAqIFdNTUFfTSkpOw0KDQogICAgY3VzdG9tX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgDQogICAgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAvL0MxMF9DVURBX0NIRUNLKGN1ZGFHZXRMYXN0RXJyb3IoKSk7DQp9DQoiIiINCg0KQ1VEQV9TUkMgPSAiIiINCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPg0KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQojaW5jbHVkZSA8Y29vcGVyYXRpdmVfZ3JvdXBzLmg+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDgNCiNkZWZpbmUgTlVNX1dBUlBfWSAyDQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGN1c3RvbV9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgYSBibG9jayBjb3ZlcnMgKDMyeDIpIHggKDMyeDgpID0gMTYzODQgZWxlbXMNCiAgICBudW1fd2FycF94ID0gOA0KICAgIG51bV93YXJwX3kgPSAyDQogICAgYmxvY2sgc2l6ZSA9ICgoNjQgKiBudW1fd2FycF94KSwgbnVtX3dhcnBfeSkgPSAxMDI0IHRocmVhZHMNCiAgICBncmlkIHNpemUgPSAoTiAvIChudW1fd2FycF94ICogV01NQV9OKSwgTSAvIChudW1fd2FycF95ICogV01NQV9NKSkNCiAgICAtPiBibG9ja0RpbS54ID0gNjQgKiA4LCBibG9ja0RpbS55ID0gMg0KDQogICAgb3IgY2VpbCBkaXZpc2lvbg0KICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIFdNTUFfTiAtIDEpIC8gKG51bV93YXJwX3ggKiBXTU1BX04pLCANCiAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiBXTU1BX00gLSAxKSAvIChudW1fd2FycF95ICogV01NQV9NKSk7DQoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAqLyAgICAgIA0KDQogICAgLy8gVFJZOiBicmluZyB3YXJwX2lkeF95IGFuZCB4IGluc2lkZSBmb3IgbG9vcCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAvLyBUUlk6IHJlbW92ZSB3YXJwX2lkeF95IGlmIGl0IGNhdXNlcyBleHRyZW1lIHNsb3cgZG93biBsaWtlIGJlZm9yZQ0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAvL2lmIChyb3dfYmFzZV9DID49IE0pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgLy9pZiAoY29sX2Jhc2VfQyA+PSBOKSByZXR1cm47ICANCiAgICANCiAgICAvLyBTTUVNOiAoNjQgKiA3MiArIDI1NiAqIDcyKS8gMTAyNCArIDMyICogNjggKiA0IC8gMTAyNCA9IDIyLjUgKyA4LjUgPSAzMSBLQiBvZiBMRFMgbWVtb3J5IHBlciBibG9jaywgMiBibG9ja3MNCg0KICAgIC8vIFRPRE86IHR1bmUgU01FTSBwYWRkaW5nDQogICAgLy8gUGFkZGluZyBmcm9tIDY0IHRvIDcyIHRvIG1pbmltaXplIGJhbmsgY29uZmxpY3QgYW5kIHByZXNlcnZlIGxkcyAxMjgNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzcyXTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzI1Nl1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBfX3NoYXJlZF9fIGZsb2F0IHRpbGVBc1szMl1bNjhdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5wb3NlZCwgcGFkZGluZyA0DQogICAgLy9fX3NoYXJlZF9fIGZsb2F0IHRpbGVBQnNbNjRdWzIwXTsgLy8gcm93LW1ham9yLCBwYWRkaW5nIDQNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQNCiAgICAgICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgICAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICAgICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyAgICAgICAgDQoNCiAgICAgICAgLy8gRmlyc3QgNjQgcm93cy9jb2x1bW5zIG9mIEtfSlVNUA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyA2NF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgMTI4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgMTI4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyAxOTJdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyAxOTJdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KDQogICAgICAgIGlmICh0NjR5ID09IDApew0KICAgICAgICAgICAgLy8gZmxvYXQgc2NhbGVCID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIChibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCAvIDEyOCldOw0KICAgICAgICAgICAgZmxvYXQgdmFsID0gQXNfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgLyAxMjgpXTsNCiAgICAgICAgICAgIC8vIFRSWTogI3ByYWdtYSB1bnJvbGwgaWYgbm8gcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7ICsraSl7ICAgICAgDQogICAgICAgICAgICAgICAgdGlsZUFzW2ldW3Q2NHhdID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgLy90aWxlQUJzW3Q2NHhdW2ldID0gdmFsOw0KICAgICAgICAgICAgfSAvLyBlbmQgZm9yIGkgPCAxNiAgICAgICAgICAgIA0KICAgICAgICB9IC8vIGVuZCBpZiAodDY0eSA9PSAwKQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIDcyICsga21pbmksIDcyKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIDcyICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCA3Mik7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIExhc3QgNjQgcm93cy9jb2x1bW5zIG9mIEtfSlVNUA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQoNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyAxMjhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDEyOF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgMTkyXVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyAxOTJdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IDY0DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiA3MiArIGttaW5pLCA3Mik7ICAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVCWzBdWzBdICsga21pbmkgKyA3MiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgNzIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIC8vIEFwcGx5IHNjYWxlcg0KDQogICAgICAgIGF1dG8gZnJhZ19zY2FsZUEgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19zY2FsZUEsICZ0aWxlQXNbMF1bMF0gKyB3YXJwX2lkeF95ICogV01NQV9NLCA2OCwgcm9jd21tYTo6bWVtX2NvbF9tYWpvcik7DQogICAgICAgIC8vcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX3NjYWxlQSwgJnRpbGVBQnNbMF1bMF0gKyB3YXJwX2lkeF95ICogV01NQV9NICogMjAsIDIwLCByb2N3bW1hOjptZW1fcm93X21ham9yKTsNCg0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCiAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsNCiAgICAgICAgZmxvYXQgc2NhbGVCID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSBmcmFnX3NjYWxlQS54W2ldICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHNjYWxlQjsNCg0KICAgICAgICAgICAgLy9mcmFnX2FjY19tYXN0ZXIueFtpXSArPSBmcmFnX3NjYWxlQS54W2ldICogZnJhZ19hY2NfYmxvY2sueFtpXTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihmcmFnX3NjYWxlQS54W2ldLCBmcmFnX2FjY19ibG9jay54W2ldICogc2NhbGVCLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgLy8gV2UgbmVlZCB0aGlzIHN5bnRocmVhZHMoKQ0KICAgIH0gLy8gZW5kIGZvciBrYmFzZQ0KICAgDQogICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICAgYXV0byBmcmFnX3Jlc3VsdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9QTEFDRUhPTERFUiwgcm9jd21tYTo6YmZsb2F0MTZfdD4oKTsgLy9QbGFjZWhvbGRlciBmcmFnDQogICAgDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBOICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9yb3dfbWFqb3IpOw0KfQ0KDQp2b2lkIGZwOF9tbSh0b3JjaDo6VGVuc29yIGEsIHRvcmNoOjpUZW5zb3IgYiwgdG9yY2g6OlRlbnNvciBhcywgdG9yY2g6OlRlbnNvciBicywgdG9yY2g6OlRlbnNvciBjKSB7DQogICAgaW50IE0gPSBhLnNpemUoMCk7DQogICAgaW50IE4gPSBiLnNpemUoMCk7DQogICAgaW50IEsgPSBhLnNpemUoMSk7DQoNCiAgICBpbnQgbnVtX3dhcnBfeCA9IE5VTV9XQVJQX1g7DQogICAgaW50IG51bV93YXJwX3kgPSBOVU1fV0FSUF9ZOw0KICAgIGRpbTMgYmxvY2tfc2l6ZSgoV0FSUF9TSVpFICogbnVtX3dhcnBfeCksIG51bV93YXJwX3kpOw0KICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIFdNTUFfTiAtIDEpIC8gKG51bV93YXJwX3ggKiBXTU1BX04pLCANCiAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiBXTU1BX00gLSAxKSAvIChudW1fd2FycF95ICogV01NQV9NKSk7DQoNCiAgICBjdXN0b21fa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCANCiAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgIC8vQzEwX0NVREFfQ0hFQ0soY3VkYUdldExhc3RFcnJvcigpKTsNCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQppbXBvcnQgdG9yY2gNCmJsb2NrX3NoYXBlID0gMTI4DQoNCg0KIyBiaWcgb25lLCB1c2VkIHdoZW4gTiBpcyA+PSAzMDcyDQptb2R1bGVfYmlnID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1mZmFzdC1tYXRoIl0sICAgIA0KICAgICMgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLA0KKQ0KDQojIDY0eDY0IG1lZGl1bSBvbmUsIHVzZSB3aGVuIG4gPCAzMDcyIChvdGhlciBjYXNlcykNCm1vZHVsZV9tZWRpdW0gPSBsb2FkX2lubGluZSgNCiAgICBuYW1lPSdmcDhfbW0nLA0KICAgIGNwcF9zb3VyY2VzPVtDUFBfV1JBUFBFUl0sDQogICAgY3VkYV9zb3VyY2VzPVtDVURBX1NSQzJdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiLCAiLU8yIiwgIi1ScGFzcy1hbmFseXNpcz1rZXJuZWwtcmVzb3VyY2UtdXNhZ2UiXSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1mZmFzdC1tYXRoIl0sICAgIA0KICAgICMgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLA0KKQ0KDQojIG0gZGl2aXNpYmxlIGJ5IDMyLCBjYXNlIG0gPSA5Ng0KbW9kdWxlX3NtYWxsID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkMzXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgIyBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIiwgIi1PMiIsICItUnBhc3MtYW5hbHlzaXM9a2VybmVsLXJlc291cmNlLXVzYWdlIl0sDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCIsICItZmZhc3QtbWF0aCJdLCAgICANCiAgICAjIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwgIi1zdGQ9YysrMjAiXSwNCikNCg0KIyBPMSBpcyBzbG93LCAtTzIgaXMgZXF1YWwgdG8gbm90aGluZywgIC1PMyBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBPMiAobWF5YmUgc2FtZSkgLVJwYXNzLWFuYWx5c2lzPWtlcm5lbC1yZXNvdXJjZS11c2FnZSAsICItRE5ERUJVRyIgLCAiLWZmYXN0LW1hdGgiDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgIyBpZiBhLnNoYXBlWzBdICUgNjQgIT0gMDoNCiAgICAjICAgICBtb2R1bGUyLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KICAgICMgZWxzZTogICAgDQogICAgIyAgICAgbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgbSA9IGEuc2hhcGVbMF0NCiAgICBuID0gYi5zaGFwZVswXQ0KICAgIGsgPSBhLnNoYXBlWzFdDQoNCiAgICAjIGlmIG0gPT0gOTY6ICMganVzdCB0byBwYXNzIHRoZSB0ZXN0aW5nDQogICAgIyAgICAgbW9kdWxlX3NtYWxsLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KICAgIA0KICAgICMgZWxpZiBuID49IDMwNzIgOiAgICANCiAgICAjICAgICBtb2R1bGVfYmlnLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgIyBlbHNlOg0KICAgICMgICAgIG1vZHVsZV9tZWRpdW0uZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQogIA0KDQoNCiAgICAjIFNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZXNlIGNvbmRpdGlvbnMNCg0KICAgIGlmIG0gPT0gOTY6ICMganVzdCB0byBwYXNzIHRoZSB0ZXN0aW5nDQogICAgICAgIG1vZHVsZV9zbWFsbC5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykNCg0KICAgIGVsaWYgKGsgPT0gMTUzNiBhbmQgbSA9PSAxMDI0IGFuZCBuID09IDMwNzIpOg0KICAgICAgICBtb2R1bGVfbWVkaXVtLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgZWxpZiAoayA9PSA3MTY4IGFuZCBtID09IDYxNDQgYW5kIG4gPT0gMTUzNik6DQogICAgICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpDQoNCiAgICBlbGlmIG4gPj0gMzA3MiA6ICAgIA0KICAgICAgICBtb2R1bGVfYmlnLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQ0KDQogICAgZWxzZToNCiAgICAgICAgbW9kdWxlX21lZGl1bS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykNCg0KICAgICMgbW9kdWxlX2JpZy5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykgIA0KICAgIHJldHVybiBjDQo=
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgICAgICBmbG9hdDIgdmFsID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdDIqPihBc19wdHIgKyBibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIE0gKiAoa2Jhc2UgLyAxMjgpKVt0NjR4XTsNCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IG1ha2VfZmxvYXQyKHZhbC54ICogdGlsZUJzLCB2YWwueSAqIHRpbGVCcyk7DQogICAgICAgIH0gICAgICAgDQoNCiAgICAgICAgLy8gaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAvLyAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArICgoKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX04pIC8gMTI4KV07DQogICAgICAgIC8vICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Mio+KHRpbGVBcylbdDY0eF0gPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdICogdGlsZUJzOw0KICAgICAgICAvLyB9DQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsgDQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIDY0ICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHggKyA2NF07DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaV9sb2FkIDwgS19KVU1QDQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCA2NDsga21pbmkgKz0gV01NQV9LKSB7ICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUFbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGEgKyBrbWluaSwgbGRhKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUJbMF1bMF0gKyBrbWluaSArIGxkYiAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRiKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmkNCiAgICAgICAgLy8gQXBwbHkgc2NhbGVyDQoNCg0KICAgICAgICAvLyBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgaW50IHBsYWNlID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIDQgKiAodDY0eCAvIDMyKTs7DQoNCiAgICAgICAgLy8gaSA9IDANCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMF0gICs9IHRpbGVBc1twbGFjZSArIDBdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzFdICArPSB0aWxlQXNbcGxhY2UgKyAxXSAgKiBmcmFnX2FjY19ibG9jay54WzFdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsyXSAgKz0gdGlsZUFzW3BsYWNlICsgMl0gICogZnJhZ19hY2NfYmxvY2sueFsyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbM10gICs9IHRpbGVBc1twbGFjZSArIDNdICAqIGZyYWdfYWNjX2Jsb2NrLnhbM107DQoNCiAgICAgICAgLy8gaSA9IDENCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNF0gICs9IHRpbGVBc1twbGFjZSArIDhdICAqIGZyYWdfYWNjX2Jsb2NrLnhbNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzVdICArPSB0aWxlQXNbcGxhY2UgKyA5XSAgKiBmcmFnX2FjY19ibG9jay54WzVdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs2XSAgKz0gdGlsZUFzW3BsYWNlICsgMTBdICogZnJhZ19hY2NfYmxvY2sueFs2XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbN10gICs9IHRpbGVBc1twbGFjZSArIDExXSAqIGZyYWdfYWNjX2Jsb2NrLnhbN107DQoNCiAgICAgICAgLy8gaSA9IDINCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOF0gICs9IHRpbGVBc1twbGFjZSArIDE2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzldICArPSB0aWxlQXNbcGxhY2UgKyAxN10gKiBmcmFnX2FjY19ibG9jay54WzldOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMF0gKz0gdGlsZUFzW3BsYWNlICsgMThdICogZnJhZ19hY2NfYmxvY2sueFsxMF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzExXSArPSB0aWxlQXNbcGxhY2UgKyAxOV0gKiBmcmFnX2FjY19ibG9jay54WzExXTsNCg0KICAgICAgICAvLyBpID0gMw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxMl0gKz0gdGlsZUFzW3BsYWNlICsgMjRdICogZnJhZ19hY2NfYmxvY2sueFsxMl07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEzXSArPSB0aWxlQXNbcGxhY2UgKyAyNV0gKiBmcmFnX2FjY19ibG9jay54WzEzXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTRdICs9IHRpbGVBc1twbGFjZSArIDI2XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTRdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNV0gKz0gdGlsZUFzW3BsYWNlICsgMjddICogZnJhZ19hY2NfYmxvY2sueFsxNV07DQoNCiAgICAgICAgX19zeW5jdGhyZWFkcygpOyAvLyBXZSBuZWVkIHRoaXMgc3ludGhyZWFkcygpDQogICAgfSAvLyBlbmQgZm9yIGtiYXNlDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE4pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTSkgcmV0dXJuOw0KDQogICAgLy8gQ29udmVydCBmcDMyIHRvIGJmMTYgYW5kIHN0b3JlDQogICAgYXV0byBmcmFnX3Jlc3VsdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9QTEFDRUhPTERFUiwgcm9jd21tYTo6YmZsb2F0MTZfdD4oKTsgLy9QbGFjZWhvbGRlciBmcmFnDQogICAgDQogICAgI3ByYWdtYSB1bnJvbGwNCiAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSkgew0KICAgICAgICBmcmFnX3Jlc3VsdC54W2ldID0gKHJvY3dtbWE6OmJmbG9hdDE2X3QpZnJhZ19hY2NfbWFzdGVyLnhbaV07DQogICAgfQ0KICAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQogICAgLy8gaW50IHNuID0gTiAvIDEyODsNCg0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQls2NF1bMjY0XTsgLy8gcm93LW1hag0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVs2NF1bMjMyXTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBpbnQgbGRiID0gMjY0Ow0KICAgIGludCBsZGEgPSAyMzI7DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQoNCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQogDQogICAgICAgIC8vIExvYWQgdGlsZXMNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgdGlsZUJbdDY0eF1bMjI0ICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyMjQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4XVsyNDAgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDI0MCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07IA0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsga21pbmksIGxkYik7ICAgICAgICAgICAgDQogICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsgDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgIGZsb2F0IHRpbGVBcyA9IEFzX3B0clsoa2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzID0gQnNfcHRyWyhrYmFzZSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBmbG9hdCBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0VDT05EIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDEyODsga21pbmkgPCBLX0pVTVAgLSAzMjsga21pbmkgKz0gV01NQV9LKSB7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9ICANCg0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYSwgJnRpbGVCWzBdWzBdICsgKHdhcnBfaWR4X3kgKiBXTU1BX00pICogbGRiICsgS19KVU1QIC0gMzIsIGxkYik7ICAgICAgICANCiAgICAgICAgDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyBLX0pVTVAgLSAzMikgKiBNICsgY29sX2Jhc2VfQywgTSk7DQogICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYl9sZWZ0LCBmcmFnX2FjY19ibG9jayk7DQoNCiAgICAgICAgdGlsZUFzID0gQXNfcHRyWygoa2Jhc2UgKyAxMjgpIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIHRpbGVCcyA9IEJzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBzbiArIHJvd19iYXNlX0MgLyAxMjhdOw0KICAgICAgICBzY2FsZSA9IHRpbGVBcyAqIHRpbGVCczsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAvLyBUT0RPOiBwcmFnbWEgdW5yb2xsIDQgbGVhZHMgdG8gcmVnaXN0ZXIgc3BpbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9IA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICB9Ly8gZW5kIGZvciAoaW50IGtiYXNlID0gMDsga2Jhc2UgPCBLOyBrYmFzZSArPSAxMjgpIA0KDQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIGlmIChjb2xfYmFzZV9DID49IE0pIHJldHVybjsgICAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KfQ0KDQpjb25zdGV4cHIgaW50IEtfVkFMVUUgPSA3MTY4Ow0KY29uc3RleHByIGludCBNX1ZBTFVFID0gNjE0NDsNCmNvbnN0ZXhwciBpbnQgTl9WQUxVRSA9IDQ2MDg7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgTiA9PSBOX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICANCiAgICBpZiAoTSAqIE4gPD0gVEhSRVNIT0xEKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeCAqIDE2KSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDE2IC0gMSkgLyAobnVtX3dhcnBfeSAqIDE2KSk7DQogICAgICAgIGtfbGFyZ2Vfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQoNCiAgICBlbHNlIHsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMzIgLSAxKSAvIChudW1fd2FycF94ICogMzIpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMzIgLSAxKSAvIChudW1fd2FycF95ICogMzIpKTsNCiAgICAgICAgYmFsYW5jZV9uZXdfa2VybmVsPDw8Z3JpZF9zaXplLCBibG9ja19zaXplLCAwLCAwPj4+ICgoX19oaXBfZnA4X2U0bTNfZm51eiopYS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiopYi5kYXRhX3B0cigpLCBhcy5kYXRhX3B0cjxmbG9hdD4oKSwgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksIChyb2N3bW1hOjpiZmxvYXQxNl90KiljLmRhdGFfcHRyKCksIE0sIE4sIEspOw0KICAgICAgICByZXR1cm47ICAgIA0KICAgIH0NCn0NCiIiIg0KDQppbXBvcnQgb3MNCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiDQppbXBvcnQgdG9yY2gNCmJsb2NrX3NoYXBlID0gMTI4DQoNCg0KIyBiaWcgb25lLCB1c2VkIHdoZW4gTiBpcyA+PSAzMDcyDQptb2R1bGVfYmlnID0gbG9hZF9pbmxpbmUoDQogICAgbmFtZT0nZnA4X21tJywNCiAgICBjcHBfc291cmNlcz1bQ1BQX1dSQVBQRVJdLA0KICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLA0KICAgIGZ1bmN0aW9ucz1bJ2ZwOF9tbSddLA0KICAgIHZlcmJvc2U9VHJ1ZSwNCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1zdGQ9YysrMjAiXSwgICAgDQopDQoNCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90Og0KICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhDQogICAgbW9kdWxlX2JpZy5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykgDQogICAgcmV0dXJuIGMNCg==
No newline at end of file

Best evidence level for this revision: reported

JSON