Iy8vCiMvLyBCb29zdC5Qb2ludGVyIENvbnRhaW5lcgojLy8KIy8vICBDb3B5cmlnaHQgVGhvcnN0ZW4gT3R0b3NlbiAyMDAzLTIwMDUuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAojLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCiMvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CiMvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQojLy8KIy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9wdHJfY29udGFpbmVyLwojLy8KCjEuIHVzZSBzcGxpY2UoKSB0byBzcGVlZCB1cCB0cmFuc2ZlciBmb3IgbGlzdAoKNS4gc21hbGwgdXNhZ2UgZXhtYXBsZSB3aXRoIGVhY2ggY2xhc3MKCjEwLiB1cGRhdGUgdHV0b3JpYWwgdG8gc2hvdyBib29zdDo6YXNzaWduIGxpbmsgKyBhdXRvX3B0cgoKCjExLiBzaG91bGQgZmluZF9rZXkoKSBiZSBhZGRlZCB0byBwdHJfbWFwPwoKCgoxMy4gdHJhbnNmZXIgZm9yIHNldC9tYXAgbWF5IG5lZWQgdG8KYmUgcmV2aXN0ZWQgKHJnLiAhZnJvbS5lbXB0eSgpIHByZWNvbmRpdGlvbikKCgoxNS4gU29tZSBvZiB0aGUgaGVhZGxpbmVzIGFyZSB0b28gIGJpZy4uLgoKCjE4LiByYW5nZS1iYXNlZCBzb3J0KCkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgZm9yIGxpc3QuIHVzZSBzdGFibGVfc29ydCBmb3IgdGhpcyBwdXJwb3NlLgoKCjE5LiB1c2UgZmxhdF9zZXQsZmxhdF9tYXAgaW50ZXJuYWxseSB3aGVuIGNlcnRhaW4gc2l0dWF0aW9ucyBhcmlzZSwgZWcuIHdoZW4gdGhlIHNpemUgb2YgdGhlIG9iamVjdHMKICAgIGlzIHNtYWxsLCBlZy4gNGJ5dGVzIChkb2VzIHRoaXMgYWZmZWN0IGtleT1zdHJpbmc/CgoKCjIxLiBtYXA6OmF0KCkgc2hvdWxkIHRocm93IGJhZF9pbmRleAoKYXV0b190eXBlIHNrYWwgduZyZSBjb252ZXJ0ZXItYmFyIHRpbCBzdGQ6OmF1dG9fcHRyPFU+LCBpZiB0aGUgZGVsZXRlciBpcwp0cml2aWFsIChoZWFwX2Nsb25lX2FsbG9jYXRvcikKCihTcPhyZyBUaG9tYXMgV2l0dCBvbSBkZW5uZSDmbmRyaW5nIGNhbiBrb21tZSBtZWQuLi5rYW4gaWtrZSD4ZGVs5mdnZSBleGlzdGVyZW5kZSBrb2RlLCBzb20KdmlsbCBoYXZlIGthbGR0IC5yZWxlYXNlKCkpIEty5nZlIGVuIGhlbCBkZWwgYW1iaWd1aXR5IHJlc29sdXRpb24gcGdhIGF1dG9fcHRyIGF1Z3VtZW50IGVyCnRlbXBsYXRlcyBvZyBpa2tlIG5vbi10ZW1wbGF0ZXMhIERlc3VkZW4ga2FuIHZpIGlra2UgYnJ1Z2Ugbm9uLXRlbXBsYXRlIGFyZ3VtZW50LCBkYSBhbGxlCmNvbnZlcnRlcmluZ3Mgb3BlcmF0b3JlciBmb3IgYXV0b19wdHIgdGFnZXIgZW4gJiBhcmd1bWVudCBvZyBpa2tlIGVuIGJ5LXZhbHVlISEhIG3lc2tlCnNrYWwgZGVyIGJsb3QgZXQgaGFjayB0aWwsIGh2b3IgdmkgdGlsZvhqZXIgZW4gbnkgdWtlbmt0IGtsYXNzZSBvZyBvdmVybG9hZGVyIGt1biBmb3IgCmRlbiwgb2cgc+UgbGF2ZXIgZW4gaW1wbGljaXQga29udmVydGVyaW5nIHRpbCBkZW5uZSBpIHN0YXRpY19tb3ZlX3B0cgoKVGhlIGVhc2llcnQgaW1wbGVtZW50YXRpb24gd291bGQgYmUgdG8gZGV0ZWN0IGl0cyBwcmVzZW5jZSBpbiB0aGUKYm9keSBvZiB0aGUgcmFuZ2UgYmFzZWQgb3ZlcmxvYWRzIGFuZCB0aGVuIGRpc3BhdGNoIHRvIHRoYXQgaW1wbGVtZW50YXRpb24uCgoKMjIuIGh2b3IgZ29kZSBlciBrb21waWxlcmUgdGlsIGF0IG9wdGltZXJlIHJlbGVhc2UoKSBmb3IgZW4gYXV0b19wdHIuIEh2b3JkYW4gbWVkIG1vdmVfcHRyCmFuZCBhdXRvX3B0ciBpbnRlcmFjdGlvbj8gQ29udHJhY3RzIG3lIGt1bm5lIGZvcnTmbGxlIGtvbXBpbGVyZW4gYXQgZGVuIHNrYWwKZ2VuZXJlIG9wdGltZXJldCBrb2RlCgp0ZW1wbGF0ZTwgY2xhc3MgVCA+CmNsYXNzIGF1dG9fcHRyCnsKICAgVCogZ2V0KCkgY29uc3Q7CgogICAvLwogICAvLyB0aGlzIGV4cHJlc3NlcyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBhIG5vLW9wIGlmCiAgIC8vIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4gVGhpcyBtaWdodCBiZSB1c2VmdWwgaW4gbWFueSBvdGhlciAKICAgLy8gY29udGV4dAogICAvLwogICB+YXV0b19wdHIoKQogICAgIHByZWNvbmRpdGlvbiB7IGlmKCBnZXQoKSA9PSAwICkgcmV0dXJuOyB9CgogICBUKiByZWxlYXNlKCkKICAgIHBvc3Rjb25kaXRpb24geyBnZXQoKSA9PSAwOyB9Cn0KCi4uLgoKc3RkOjphdXRvX3B0cjxUPiBwKCBuZXcgVCApOwpmb28oIHAucmVsZWFzZSgpICk7Ci8vIGRvbid0IGdlbmVyYXRlIGRlc3RydWN0b3IKCkRvZXMgcmF3X3N0b3JhZ2UgaXRlcmF0b3IgaGF2ZSBhbiBpbXBhY3Qgb24gaW4tcGxhY2UgY29uc3J0Y3V0aW9uCgoK