I2lmbmRlZiBHSU1fQk9YX1NFVF9IX0lOQ0xVREVECiNkZWZpbmUgR0lNX0JPWF9TRVRfSF9JTkNMVURFRAoKLyohIFxmaWxlIGdpbV9ib3hfc2V0LmgKXGF1dGhvciBGcmFuY2lzY28gTGV/biBO32plcmEKKi8KLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGhpcyBzb3VyY2UgZmlsZSBpcyBwYXJ0IG9mIEdJTVBBQ1QgTGlicmFyeS4KCkZvciB0aGUgbGF0ZXN0IGluZm8sIHNlZSBodHRwOi8vZ2ltcGFjdC5zb3VyY2Vmb3JnZS5uZXQvCgpDb3B5cmlnaHQgKGMpIDIwMDYgRnJhbmNpc2NvIExlb24gTmFqZXJhLiBDLkMuIDgwMDg3MzcxLgplbWFpbDogcHJvamVjdGlsZW1hbkB5YWhvby5jb20KCiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgbGlicmFyeSBpbiB0aGUKICAgICAgIGZpbGUgR0lNUEFDVC1MSUNFTlNFLUxHUEwuVFhULgogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIGxpYnJhcnkgaW4KICAgICAgIHRoZSBmaWxlIEdJTVBBQ1QtTElDRU5TRS1CU0QuVFhULgogICAoMykgVGhlIHpsaWIvbGlicG5nIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgbGlicmFyeSBpbgogICAgICAgdGhlIGZpbGUgR0lNUEFDVC1MSUNFTlNFLVpMSUIuVFhULgoKIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcwogR0lNUEFDVC1MSUNFTlNFLUxHUEwuVFhULCBHSU1QQUNULUxJQ0VOU0UtWkxJQi5UWFQgYW5kIEdJTVBBQ1QtTElDRU5TRS1CU0QuVFhUIGZvciBtb3JlIGRldGFpbHMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoqLwoKCiNpbmNsdWRlICJnaW1fYXJyYXkuaCIKI2luY2x1ZGUgImdpbV9yYWRpeHNvcnQuaCIKI2luY2x1ZGUgImdpbV9ib3hfY29sbGlzaW9uLmgiCiNpbmNsdWRlICJnaW1fdHJpX2NvbGxpc2lvbi5oIgoKCgovLyEgT3ZlcmxhcHBpbmcgcGFpcgpzdHJ1Y3QgR0lNX1BBSVIKewogICAgR1VJTlQgbV9pbmRleDE7CiAgICBHVUlOVCBtX2luZGV4MjsKICAgIEdJTV9QQUlSKCkKICAgIHt9CgogICAgR0lNX1BBSVIoY29uc3QgR0lNX1BBSVIgJiBwKQogICAgewogICAgCW1faW5kZXgxID0gcC5tX2luZGV4MTsKICAgIAltX2luZGV4MiA9IHAubV9pbmRleDI7Cgl9CgoJR0lNX1BBSVIoR1VJTlQgaW5kZXgxLCBHVUlOVCBpbmRleDIpCiAgICB7CiAgICAJbV9pbmRleDEgPSBpbmRleDE7CiAgICAJbV9pbmRleDIgPSBpbmRleDI7Cgl9Cn07CgovLyEgQSBwYWlyc2V0IGFycmF5CmNsYXNzIGdpbV9wYWlyX3NldDogcHVibGljIGdpbV9hcnJheTxHSU1fUEFJUj4KewpwdWJsaWM6CglnaW1fcGFpcl9zZXQoKTpnaW1fYXJyYXk8R0lNX1BBSVI+KDMyKQoJewoJfQoJaW5saW5lIHZvaWQgcHVzaF9wYWlyKEdVSU5UIGluZGV4MSxHVUlOVCBpbmRleDIpCgl7CgkJcHVzaF9iYWNrKEdJTV9QQUlSKGluZGV4MSxpbmRleDIpKTsKCX0KCglpbmxpbmUgdm9pZCBwdXNoX3BhaXJfaW52KEdVSU5UIGluZGV4MSxHVUlOVCBpbmRleDIpCgl7CgkJcHVzaF9iYWNrKEdJTV9QQUlSKGluZGV4MixpbmRleDEpKTsKCX0KfTsKCgovLyEgUHJvdG90eXBlIEJhc2UgY2xhc3MgZm9yIHByaW1pdGl2ZSBjbGFzc2lmaWNhdGlvbgovKiEKVGhpcyBjbGFzcyBpcyBhIHdyYXBwZXIgZm9yIHByaW1pdGl2ZSBjb2xsZWN0aW9ucy4KVGhpcyB0ZWxscyByZWxldmFudCBpbmZvIGZvciB0aGUgQm91bmRpbmcgQm94IHNldCBjbGFzc2VzLCB3aGljaCB0YWtlIGNhcmUgb2Ygc3BhY2UgY2xhc3NpZmljYXRpb24uClRoaXMgY2xhc3MgY2FuIG1hbmFnZSBDb21wb3VuZCBzaGFwZXMgYW5kIHRyaW1lc2hlcywgYW5kIGlmIGl0IGlzIG1hbmFnaW5nIHRyaW1lc2ggdGhlbiB0aGUgIEhpZXJhcmNoeSBCb3VuZGluZyBCb3ggY2xhc3NlcyB3aWxsIHRha2UgYWR2YW50YWdlIG9mIHByaW1pdGl2ZSBWcyBCb3ggb3ZlcmxhcHBpbmcgdGVzdHMgZm9yIGdldHRpbmcgb3B0aW1hbCByZXN1bHRzIGFuZCBsZXNzIFBlciBCb3ggY29tcGFpcmlzb25zLgoqLwpjbGFzcyBHSU1fUFJJTUlUSVZFX01BTkFHRVJfUFJPVE9UWVBFCnsKcHVibGljOgoKCS8vISBkZXRlcm1pbmVzIGlmIHRoaXMgbWFuYWdlciBjb25zaXN0IG9uIG9ubHkgdHJpYW5nbGVzLCB3aGljaCBzcGVjaWFsIGNhc2Ugd2lsbCBiZSBvcHRpbWl6ZWQKCXZpcnR1YWwgYm9vbCBpc190cmltZXNoKCkgPSAwOwoJdmlydHVhbCBHVUlOVCBnZXRfcHJpbWl0aXZlX2NvdW50KCkgPSAwOwoJdmlydHVhbCB2b2lkIGdldF9wcmltaXRpdmVfYm94KEdVSU5UIHByaW1faW5kZXggLEdJTV9BQUJCICYgcHJpbWJveCkgPSAwOwoJdmlydHVhbCB2b2lkIGdldF9wcmltaXRpdmVfdHJpYW5nbGUoR1VJTlQgcHJpbV9pbmRleCxHSU1fVFJJQU5HTEUgJiB0cmlhbmdsZSkgPSAwOwp9OwoKCnN0cnVjdCBHSU1fQUFCQl9EQVRBCnsKCUdJTV9BQUJCIG1fYm91bmQ7CglHVUlOVCBtX2RhdGE7Cn07CgovLyEgTm9kZSBTdHJ1Y3R1cmUgZm9yIHRyZWVzCnN0cnVjdCBHSU1fQk9YX1RSRUVfTk9ERQp7CglHSU1fQUFCQiBtX2JvdW5kOwoJR1VJTlQgbV9sZWZ0Oy8vITwgTGVmdCBzdWJ0cmVlCglHVUlOVCBtX3JpZ2h0Oy8vITwgUmlnaHQgc3VidHJlZQoJR1VJTlQgbV9lc2NhcGVJbmRleDsvLyE8IFNjYXBlIGluZGV4IGZvciB0cmF2ZXJzaW5nCglHVUlOVCBtX2RhdGE7Ly8hPCBwcmltaXRpdmUgaW5kZXggaWYgYXBwbHkKCglHSU1fQk9YX1RSRUVfTk9ERSgpCgl7CgkgICAgbV9sZWZ0ID0gMDsKCSAgICBtX3JpZ2h0ID0gMDsKCSAgICBtX2VzY2FwZUluZGV4ID0gMDsKCSAgICBtX2RhdGEgPSAwOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgaXNfbGVhZl9ub2RlKCkgY29uc3QKCXsKCSAgICByZXR1cm4gICghbV9sZWZ0ICYmICFtX3JpZ2h0KTsKCX0KfTsKCi8vISBCYXNpYyBCb3ggdHJlZSBzdHJ1Y3R1cmUKY2xhc3MgR0lNX0JPWF9UUkVFCnsKcHJvdGVjdGVkOgoJR1VJTlQgbV9udW1fbm9kZXM7CglnaW1fYXJyYXk8R0lNX0JPWF9UUkVFX05PREU+IG1fbm9kZV9hcnJheTsKcHJvdGVjdGVkOgoJR1VJTlQgX3NvcnRfYW5kX2NhbGNfc3BsaXR0aW5nX2luZGV4KAoJCWdpbV9hcnJheTxHSU1fQUFCQl9EQVRBPiAmIHByaW1pdGl2ZV9ib3hlcywKCQkgR1VJTlQgc3RhcnRJbmRleCwgIEdVSU5UIGVuZEluZGV4LCBHVUlOVCBzcGxpdEF4aXMpOwoKCUdVSU5UIF9jYWxjX3NwbGl0dGluZ19heGlzKGdpbV9hcnJheTxHSU1fQUFCQl9EQVRBPiAmIHByaW1pdGl2ZV9ib3hlcywgR1VJTlQgc3RhcnRJbmRleCwgIEdVSU5UIGVuZEluZGV4KTsKCgl2b2lkIF9idWlsZF9zdWJfdHJlZShnaW1fYXJyYXk8R0lNX0FBQkJfREFUQT4gJiBwcmltaXRpdmVfYm94ZXMsIEdVSU5UIHN0YXJ0SW5kZXgsICBHVUlOVCBlbmRJbmRleCk7CnB1YmxpYzoKCUdJTV9CT1hfVFJFRSgpCgl7CgkJbV9udW1fbm9kZXMgPSAwOwoJfQoKCS8vISBwcm90b3R5cGUgZnVuY3Rpb25zIGZvciBib3ggdHJlZSBtYW5hZ2VtZW50CgkvLyFAewoJdm9pZCBidWlsZF90cmVlKGdpbV9hcnJheTxHSU1fQUFCQl9EQVRBPiAmIHByaW1pdGl2ZV9ib3hlcyk7CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBjbGVhck5vZGVzKCkKCXsKCQltX25vZGVfYXJyYXkuY2xlYXIoKTsKCQltX251bV9ub2RlcyA9IDA7Cgl9CgoJLy8hIG5vZGUgY291bnQKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldE5vZGVDb3VudCgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fbnVtX25vZGVzOwoJfQoKCS8vISB0ZWxscyBpZiB0aGUgbm9kZSBpcyBhIGxlYWYKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgaXNMZWFmTm9kZShHVUlOVCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fbm9kZV9hcnJheVtub2RlaW5kZXhdLmlzX2xlYWZfbm9kZSgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldE5vZGVEYXRhKEdVSU5UIG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ub2RlX2FycmF5W25vZGVpbmRleF0ubV9kYXRhOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgZ2V0Tm9kZUJvdW5kKEdVSU5UIG5vZGVpbmRleCwgR0lNX0FBQkIgJiBib3VuZCkgY29uc3QKCXsKCQlib3VuZCA9IG1fbm9kZV9hcnJheVtub2RlaW5kZXhdLm1fYm91bmQ7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBzZXROb2RlQm91bmQoR1VJTlQgbm9kZWluZGV4LCBjb25zdCBHSU1fQUFCQiAmIGJvdW5kKQoJewoJCW1fbm9kZV9hcnJheVtub2RlaW5kZXhdLm1fYm91bmQgPSBib3VuZDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBHVUlOVCBnZXRMZWZ0Tm9kZUluZGV4KEdVSU5UIG5vZGVpbmRleCkgIGNvbnN0Cgl7CgkJcmV0dXJuIG1fbm9kZV9hcnJheVtub2RlaW5kZXhdLm1fbGVmdDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBHVUlOVCBnZXRSaWdodE5vZGVJbmRleChHVUlOVCBub2RlaW5kZXgpICBjb25zdAoJewoJCXJldHVybiBtX25vZGVfYXJyYXlbbm9kZWluZGV4XS5tX3JpZ2h0OwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldFNjYXBlTm9kZUluZGV4KEdVSU5UIG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ub2RlX2FycmF5W25vZGVpbmRleF0ubV9lc2NhcGVJbmRleDsKCX0KCgkvLyFAfQp9OwoKCi8vISBHZW5lcmljIEJveCBUcmVlIFRlbXBsYXRlCi8qIQpUaGlzIGNsYXNzIG9mZmVycyBhbiBzdHJ1Y3R1cmUgZm9yIG1hbmFnaW5nIGEgYm94IHRyZWUgb2YgcHJpbWl0aXZlcy4KUmVxdWlyZXMgYSBQcmltaXRpdmUgcHJvdG90eXBlIChsaWtlIEdJTV9QUklNSVRJVkVfTUFOQUdFUl9QUk9UT1RZUEUgKSBhbmQKYSBCb3ggdHJlZSBzdHJ1Y3R1cmUgKCBsaWtlIEdJTV9CT1hfVFJFRSkuCiovCnRlbXBsYXRlPHR5cGVuYW1lIF9HSU1fUFJJTUlUSVZFX01BTkFHRVJfUFJPVE9UWVBFLCB0eXBlbmFtZSBfR0lNX0JPWF9UUkVFX1BST1RPVFlQRT4KY2xhc3MgR0lNX0JPWF9UUkVFX1RFTVBMQVRFX1NFVAp7CnByb3RlY3RlZDoKCV9HSU1fUFJJTUlUSVZFX01BTkFHRVJfUFJPVE9UWVBFIG1fcHJpbWl0aXZlX21hbmFnZXI7CglfR0lNX0JPWF9UUkVFX1BST1RPVFlQRSBtX2JveF90cmVlOwpwcm90ZWN0ZWQ6CgkvL3N0YWNrbGVzcyByZWZpdAoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCByZWZpdCgpCgl7CgkJR1VJTlQgbm9kZWNvdW50ID0gZ2V0Tm9kZUNvdW50KCk7CgkJd2hpbGUobm9kZWNvdW50LS0pCgkJewoJCQlpZihpc0xlYWZOb2RlKG5vZGVjb3VudCkpCgkJCXsKCQkJCUdJTV9BQUJCIGxlYWZib3g7CgkJCQltX3ByaW1pdGl2ZV9tYW5hZ2VyLmdldF9wcmltaXRpdmVfYm94KGdldE5vZGVEYXRhKG5vZGVjb3VudCksbGVhZmJveCk7CgkJCQlzZXROb2RlQm91bmQobm9kZWNvdW50LGxlYWZib3gpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLy9nZXQgbGVmdCBib3VuZAoJCQkJR1VJTlQgY2hpbGRpbmRleCA9IGdldExlZnROb2RlSW5kZXgobm9kZWNvdW50KTsKCQkJCUdJTV9BQUJCIGJvdW5kOwoJCQkJZ2V0Tm9kZUJvdW5kKGNoaWxkaW5kZXgsYm91bmQpOwoJCQkJLy9nZXQgcmlnaHQgYm91bmQKCQkJCWNoaWxkaW5kZXggPSBnZXRSaWdodE5vZGVJbmRleChub2RlY291bnQpOwoJCQkJR0lNX0FBQkIgYm91bmQyOwoJCQkJZ2V0Tm9kZUJvdW5kKGNoaWxkaW5kZXgsYm91bmQyKTsKCQkJCWJvdW5kLm1lcmdlKGJvdW5kMik7CgoJCQkJc2V0Tm9kZUJvdW5kKG5vZGVjb3VudCxib3VuZCk7CgkJCX0KCQl9Cgl9CnB1YmxpYzoKCglHSU1fQk9YX1RSRUVfVEVNUExBVEVfU0VUKCkKCXsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSBHSU1fQUFCQiBnZXRHbG9iYWxCb3goKSAgY29uc3QKCXsKCQlHSU1fQUFCQiB0b3RhbGJveDsKCQlnZXROb2RlQm91bmQoMCwgdG90YWxib3gpOwoJCXJldHVybiB0b3RhbGJveDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHNldFByaW1pdGl2ZU1hbmFnZXIoY29uc3QgX0dJTV9QUklNSVRJVkVfTUFOQUdFUl9QUk9UT1RZUEUgJiBwcmltaXRpdmVfbWFuYWdlcikKCXsKCQltX3ByaW1pdGl2ZV9tYW5hZ2VyID0gcHJpbWl0aXZlX21hbmFnZXI7Cgl9CgoJY29uc3QgX0dJTV9QUklNSVRJVkVfTUFOQUdFUl9QUk9UT1RZUEUgJiBnZXRQcmltaXRpdmVNYW5hZ2VyKCkgY29uc3QKCXsKCQlyZXR1cm4gbV9wcmltaXRpdmVfbWFuYWdlcjsKCX0KCglfR0lNX1BSSU1JVElWRV9NQU5BR0VSX1BST1RPVFlQRSAmIGdldFByaW1pdGl2ZU1hbmFnZXIoKQoJewoJCXJldHVybiBtX3ByaW1pdGl2ZV9tYW5hZ2VyOwoJfQoKLy8hIG5vZGUgbWFuYWdlciBwcm90b3R5cGUgZnVuY3Rpb25zCi8vL0B7CgoJLy8hIHRoaXMgYXR0ZW1wcyB0byByZWZpdCB0aGUgYm94IHNldC4KCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgdXBkYXRlKCkKCXsKCQlyZWZpdCgpOwoJfQoKCS8vISB0aGlzIHJlYnVpbGQgdGhlIGVudGlyZSBzZXQKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgYnVpbGRTZXQoKQoJewoJCS8vb2J0YWluIHByaW1pdGl2ZSBib3hlcwoJCWdpbV9hcnJheTxHSU1fQUFCQl9EQVRBPiBwcmltaXRpdmVfYm94ZXM7CgkJcHJpbWl0aXZlX2JveGVzLnJlc2l6ZShtX3ByaW1pdGl2ZV9tYW5hZ2VyLmdldF9wcmltaXRpdmVfY291bnQoKSxmYWxzZSk7CgoJCWZvciAoR1VJTlQgaSA9IDA7aTxwcmltaXRpdmVfYm94ZXMuc2l6ZSgpIDtpKysgKQoJCXsKCQkJIG1fcHJpbWl0aXZlX21hbmFnZXIuZ2V0X3ByaW1pdGl2ZV9ib3goaSxwcmltaXRpdmVfYm94ZXNbaV0ubV9ib3VuZCk7CgkJCSBwcmltaXRpdmVfYm94ZXNbaV0ubV9kYXRhID0gaTsKCQl9CgoJCW1fYm94X3RyZWUuYnVpbGRfdHJlZShwcmltaXRpdmVfYm94ZXMpOwoJfQoKCS8vISByZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBwcmltaXRpdmVzIGluIHRoZSBtX3ByaW1pdGl2ZV9tYW5hZ2VyCglTSU1EX0ZPUkNFX0lOTElORSBib29sIGJveFF1ZXJ5KGNvbnN0IEdJTV9BQUJCICYgYm94LCBnaW1fYXJyYXk8R1VJTlQ+ICYgY29sbGlkZWRfcmVzdWx0cykgY29uc3QKCXsKCQlHVUlOVCBjdXJJbmRleCA9IDA7CgkJR1VJTlQgbnVtTm9kZXMgPSBnZXROb2RlQ291bnQoKTsKCgkJd2hpbGUgKGN1ckluZGV4IDwgbnVtTm9kZXMpCgkJewoJCQlHSU1fQUFCQiBib3VuZDsKCQkJZ2V0Tm9kZUJvdW5kKGN1ckluZGV4LGJvdW5kKTsKCgkJCS8vY2F0Y2ggYnVncyBpbiB0cmVlIGRhdGEKCgkJCWJvb2wgYWFiYk92ZXJsYXAgPSBib3VuZC5oYXNfY29sbGlzaW9uKGJveCk7CgkJCWJvb2wgaXNsZWFmbm9kZSA9IGlzTGVhZk5vZGUoY3VySW5kZXgpOwoKCQkJaWYgKGlzbGVhZm5vZGUgJiYgYWFiYk92ZXJsYXApCgkJCXsKCQkJCWNvbGxpZGVkX3Jlc3VsdHMucHVzaF9iYWNrKGdldE5vZGVEYXRhKGN1ckluZGV4KSk7CgkJCX0KCgkJCWlmIChhYWJiT3ZlcmxhcCB8fCBpc2xlYWZub2RlKQoJCQl7CgkJCQkvL25leHQgc3Vibm9kZQoJCQkJY3VySW5kZXgrKzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vc2tpcCBub2RlCgkJCQljdXJJbmRleCs9IGdldFNjYXBlTm9kZUluZGV4KGN1ckluZGV4KTsKCQkJfQoJCX0KCQlpZihjb2xsaWRlZF9yZXN1bHRzLnNpemUoKT4wKSByZXR1cm4gdHJ1ZTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLy8hIHJldHVybnMgdGhlIGluZGljZXMgb2YgdGhlIHByaW1pdGl2ZXMgaW4gdGhlIG1fcHJpbWl0aXZlX21hbmFnZXIKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgYm94UXVlcnlUcmFucyhjb25zdCBHSU1fQUFCQiAmIGJveCwKCQkgY29uc3QgYnRUcmFuc2Zvcm0gJiB0cmFuc2Zvcm0sIGdpbV9hcnJheTxHVUlOVD4gJiBjb2xsaWRlZF9yZXN1bHRzKSBjb25zdAoJewoJCUdJTV9BQUJCIHRyYW5zYm94PWJveDsKCQl0cmFuc2JveC5hcHB5X3RyYW5zZm9ybSh0cmFuc2Zvcm0pOwoJCXJldHVybiBib3hRdWVyeSh0cmFuc2JveCxjb2xsaWRlZF9yZXN1bHRzKTsKCX0KCgkvLyEgcmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgcHJpbWl0aXZlcyBpbiB0aGUgbV9wcmltaXRpdmVfbWFuYWdlcgoJU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCByYXlRdWVyeSgKCQljb25zdCBidFZlY3RvcjMgJiByYXlfZGlyLGNvbnN0IGJ0VmVjdG9yMyAmIHJheV9vcmlnaW4gLAoJCWdpbV9hcnJheTxHVUlOVD4gJiBjb2xsaWRlZF9yZXN1bHRzKSBjb25zdAoJewoJCUdVSU5UIGN1ckluZGV4ID0gMDsKCQlHVUlOVCBudW1Ob2RlcyA9IGdldE5vZGVDb3VudCgpOwoKCQl3aGlsZSAoY3VySW5kZXggPCBudW1Ob2RlcykKCQl7CgkJCUdJTV9BQUJCIGJvdW5kOwoJCQlnZXROb2RlQm91bmQoY3VySW5kZXgsYm91bmQpOwoKCQkJLy9jYXRjaCBidWdzIGluIHRyZWUgZGF0YQoKCQkJYm9vbCBhYWJiT3ZlcmxhcCA9IGJvdW5kLmNvbGxpZGVfcmF5KHJheV9vcmlnaW4scmF5X2Rpcik7CgkJCWJvb2wgaXNsZWFmbm9kZSA9IGlzTGVhZk5vZGUoY3VySW5kZXgpOwoKCQkJaWYgKGlzbGVhZm5vZGUgJiYgYWFiYk92ZXJsYXApCgkJCXsKCQkJCWNvbGxpZGVkX3Jlc3VsdHMucHVzaF9iYWNrKGdldE5vZGVEYXRhKCBjdXJJbmRleCkpOwoJCQl9CgoJCQlpZiAoYWFiYk92ZXJsYXAgfHwgaXNsZWFmbm9kZSkKCQkJewoJCQkJLy9uZXh0IHN1Ym5vZGUKCQkJCWN1ckluZGV4Kys7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvL3NraXAgbm9kZQoJCQkJY3VySW5kZXgrPSBnZXRTY2FwZU5vZGVJbmRleChjdXJJbmRleCk7CgkJCX0KCQl9CgkJaWYoY29sbGlkZWRfcmVzdWx0cy5zaXplKCk+MCkgcmV0dXJuIHRydWU7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8vISB0ZWxscyBpZiB0aGlzIHNldCBoYXMgaGllcmFyY2h0CglTSU1EX0ZPUkNFX0lOTElORSBib29sIGhhc0hpZXJhcmNoeSgpIGNvbnN0Cgl7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8hIHRlbGxzIGlmIHRoaXMgc2V0IGlzIGEgdHJpbWVzaAoJU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCBpc1RyaW1lc2goKSAgY29uc3QKCXsKCQlyZXR1cm4gbV9wcmltaXRpdmVfbWFuYWdlci5pc190cmltZXNoKCk7Cgl9CgoJLy8hIG5vZGUgY291bnQKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldE5vZGVDb3VudCgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fYm94X3RyZWUuZ2V0Tm9kZUNvdW50KCk7Cgl9CgoJLy8hIHRlbGxzIGlmIHRoZSBub2RlIGlzIGEgbGVhZgoJU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCBpc0xlYWZOb2RlKEdVSU5UIG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ib3hfdHJlZS5pc0xlYWZOb2RlKG5vZGVpbmRleCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgR1VJTlQgZ2V0Tm9kZURhdGEoR1VJTlQgbm9kZWluZGV4KSBjb25zdAoJewoJCXJldHVybiBtX2JveF90cmVlLmdldE5vZGVEYXRhKG5vZGVpbmRleCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCBnZXROb2RlQm91bmQoR1VJTlQgbm9kZWluZGV4LCBHSU1fQUFCQiAmIGJvdW5kKSAgY29uc3QKCXsKCQltX2JveF90cmVlLmdldE5vZGVCb3VuZChub2RlaW5kZXgsIGJvdW5kKTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHNldE5vZGVCb3VuZChHVUlOVCBub2RlaW5kZXgsIGNvbnN0IEdJTV9BQUJCICYgYm91bmQpCgl7CgkJbV9ib3hfdHJlZS5zZXROb2RlQm91bmQobm9kZWluZGV4LCBib3VuZCk7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgR1VJTlQgZ2V0TGVmdE5vZGVJbmRleChHVUlOVCBub2RlaW5kZXgpIGNvbnN0Cgl7CgkJcmV0dXJuIG1fYm94X3RyZWUuZ2V0TGVmdE5vZGVJbmRleChub2RlaW5kZXgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldFJpZ2h0Tm9kZUluZGV4KEdVSU5UIG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ib3hfdHJlZS5nZXRSaWdodE5vZGVJbmRleChub2RlaW5kZXgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIEdVSU5UIGdldFNjYXBlTm9kZUluZGV4KEdVSU5UIG5vZGVpbmRleCkgY29uc3QKCXsKCQlyZXR1cm4gbV9ib3hfdHJlZS5nZXRTY2FwZU5vZGVJbmRleChub2RlaW5kZXgpOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgZ2V0Tm9kZVRyaWFuZ2xlKEdVSU5UIG5vZGVpbmRleCxHSU1fVFJJQU5HTEUgJiB0cmlhbmdsZSkgY29uc3QKCXsKCQltX3ByaW1pdGl2ZV9tYW5hZ2VyLmdldF9wcmltaXRpdmVfdHJpYW5nbGUoZ2V0Tm9kZURhdGEobm9kZWluZGV4KSx0cmlhbmdsZSk7Cgl9Cgp9OwoKLy8hIENsYXNzIGZvciBCb3ggVHJlZSBTZXRzCi8qIQp0aGlzIGhhcyB0aGUgR0lNX0JPWF9UUkVFIGltcGxlbWVudGF0aW9uIGZvciBib3VuZGluZyBib3hlcy4KKi8KdGVtcGxhdGU8dHlwZW5hbWUgX0dJTV9QUklNSVRJVkVfTUFOQUdFUl9QUk9UT1RZUEU+CmNsYXNzIEdJTV9CT1hfVFJFRV9TRVQ6IHB1YmxpYyBHSU1fQk9YX1RSRUVfVEVNUExBVEVfU0VUPCBfR0lNX1BSSU1JVElWRV9NQU5BR0VSX1BST1RPVFlQRSwgR0lNX0JPWF9UUkVFPgp7CnB1YmxpYzoKCn07CgoKCgoKLy8vIEdJTV9CT1hfU0VUIGNvbGxpc2lvbiBtZXRob2RzCnRlbXBsYXRlPHR5cGVuYW1lIEJPWF9TRVRfQ0xBU1MwLHR5cGVuYW1lIEJPWF9TRVRfQ0xBU1MxPgpjbGFzcyBHSU1fVFJFRV9UUkVFX0NPTExJREVSCnsKcHVibGljOgoJZ2ltX3BhaXJfc2V0ICogbV9jb2xsaXNpb25fcGFpcnM7CglCT1hfU0VUX0NMQVNTMCAqIG1fYm94c2V0MDsKCUJPWF9TRVRfQ0xBU1MxICogbV9ib3hzZXQxOwoJR1VJTlQgY3VycmVudF9ub2RlMDsKCUdVSU5UIGN1cnJlbnRfbm9kZTE7Cglib29sIG5vZGUwX2lzX2xlYWY7Cglib29sIG5vZGUxX2lzX2xlYWY7Cglib29sIHQwX2lzX3RyaW1lc2g7Cglib29sIHQxX2lzX3RyaW1lc2g7Cglib29sIG5vZGUwX2hhc190cmlhbmdsZTsKCWJvb2wgbm9kZTFfaGFzX3RyaWFuZ2xlOwoJR0lNX0FBQkIgbV9ib3gwOwoJR0lNX0FBQkIgbV9ib3gxOwoJR0lNX0JPWF9CT1hfVFJBTlNGT1JNX0NBQ0hFIHRyYW5zX2NhY2hlXzF0bzA7CglidFRyYW5zZm9ybSB0cmFuc19jYWNoZV8wdG8xOwoJR0lNX1RSSUFOR0xFIG1fdHJpMDsKCWJ0VmVjdG9yNCBtX3RyaTBfcGxhbmU7CglHSU1fVFJJQU5HTEUgbV90cmkxOwoJYnRWZWN0b3I0IG1fdHJpMV9wbGFuZTsKCgpwdWJsaWM6CglHSU1fVFJFRV9UUkVFX0NPTExJREVSKCkKCXsKCQljdXJyZW50X25vZGUwID0gR19VSU5UX0lORklOSVRZOwoJCWN1cnJlbnRfbm9kZTEgPSBHX1VJTlRfSU5GSU5JVFk7Cgl9CnByb3RlY3RlZDoKCVNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgcmV0cmlldmVfbm9kZTBfdHJpYW5nbGUoR1VJTlQgbm9kZTApCgl7CgkJaWYobm9kZTBfaGFzX3RyaWFuZ2xlKSByZXR1cm47CgkJbV9ib3hzZXQwLT5nZXROb2RlVHJpYW5nbGUobm9kZTAsbV90cmkwKTsKCQkvL3RyYW5zZm9ybSB0cmlhbmdsZQoJCW1fdHJpMC5tX3ZlcnRpY2VzWzBdID0gdHJhbnNfY2FjaGVfMHRvMShtX3RyaTAubV92ZXJ0aWNlc1swXSk7CgkJbV90cmkwLm1fdmVydGljZXNbMV0gPSB0cmFuc19jYWNoZV8wdG8xKG1fdHJpMC5tX3ZlcnRpY2VzWzFdKTsKCQltX3RyaTAubV92ZXJ0aWNlc1syXSA9IHRyYW5zX2NhY2hlXzB0bzEobV90cmkwLm1fdmVydGljZXNbMl0pOwoJCW1fdHJpMC5nZXRfcGxhbmUobV90cmkwX3BsYW5lKTsKCgkJbm9kZTBfaGFzX3RyaWFuZ2xlID0gdHJ1ZTsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHJldHJpZXZlX25vZGUxX3RyaWFuZ2xlKEdVSU5UIG5vZGUxKQoJewoJCWlmKG5vZGUxX2hhc190cmlhbmdsZSkgcmV0dXJuOwoJCW1fYm94c2V0MS0+Z2V0Tm9kZVRyaWFuZ2xlKG5vZGUxLG1fdHJpMSk7CgkJLy90cmFuc2Zvcm0gdHJpYW5nbGUKCQltX3RyaTEubV92ZXJ0aWNlc1swXSA9IHRyYW5zX2NhY2hlXzF0bzAudHJhbnNmb3JtKG1fdHJpMS5tX3ZlcnRpY2VzWzBdKTsKCQltX3RyaTEubV92ZXJ0aWNlc1sxXSA9IHRyYW5zX2NhY2hlXzF0bzAudHJhbnNmb3JtKG1fdHJpMS5tX3ZlcnRpY2VzWzFdKTsKCQltX3RyaTEubV92ZXJ0aWNlc1syXSA9IHRyYW5zX2NhY2hlXzF0bzAudHJhbnNmb3JtKG1fdHJpMS5tX3ZlcnRpY2VzWzJdKTsKCQltX3RyaTEuZ2V0X3BsYW5lKG1fdHJpMV9wbGFuZSk7CgoJCW5vZGUxX2hhc190cmlhbmdsZSA9IHRydWU7Cgl9CgoJU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCByZXRyaWV2ZV9ub2RlMF9pbmZvKEdVSU5UIG5vZGUwKQoJewoJCWlmKG5vZGUwID09IGN1cnJlbnRfbm9kZTApIHJldHVybjsKCQltX2JveHNldDAtPmdldE5vZGVCb3VuZChub2RlMCxtX2JveDApOwoJCW5vZGUwX2lzX2xlYWYgPSBtX2JveHNldDAtPmlzTGVhZk5vZGUobm9kZTApOwoJCW5vZGUwX2hhc190cmlhbmdsZSA9IGZhbHNlOwoJCWN1cnJlbnRfbm9kZTAgPSBub2RlMDsKCX0KCglTSU1EX0ZPUkNFX0lOTElORSB2b2lkIHJldHJpZXZlX25vZGUxX2luZm8oR1VJTlQgbm9kZTEpCgl7CgkJaWYobm9kZTEgPT0gY3VycmVudF9ub2RlMSkgcmV0dXJuOwoJCW1fYm94c2V0MS0+Z2V0Tm9kZUJvdW5kKG5vZGUxLG1fYm94MSk7CgkJbm9kZTFfaXNfbGVhZiA9IG1fYm94c2V0MS0+aXNMZWFmTm9kZShub2RlMSk7CgkJbm9kZTFfaGFzX3RyaWFuZ2xlID0gZmFsc2U7CgkJY3VycmVudF9ub2RlMSA9IG5vZGUxOwoJfQoKCVNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgbm9kZV9jb2xsaXNpb24oR1VJTlQgbm9kZTAgLEdVSU5UIG5vZGUxKQoJewoJCXJldHJpZXZlX25vZGUwX2luZm8obm9kZTApOwoJCXJldHJpZXZlX25vZGUxX2luZm8obm9kZTEpOwoJCWJvb2wgcmVzdWx0ID0gbV9ib3gwLm92ZXJsYXBwaW5nX3RyYW5zX2NhY2hlKG1fYm94MSx0cmFuc19jYWNoZV8xdG8wLHRydWUpOwoJCWlmKCFyZXN1bHQpIHJldHVybiBmYWxzZTsKCgkJaWYodDBfaXNfdHJpbWVzaCAmJiBub2RlMF9pc19sZWFmKQoJCXsKCQkJLy9wZXJmb3JtIHByaW1pdGl2ZSB2cyBib3ggY29sbGlzaW9uCgkJCXJldHJpZXZlX25vZGUwX3RyaWFuZ2xlKG5vZGUwKTsKCQkJLy9kbyB0cmlhbmdsZSB2cyBib3ggY29sbGlzaW9uCgkJCW1fYm94MS5pbmNyZW1lbnRfbWFyZ2luKG1fdHJpMC5tX21hcmdpbik7CgoJCQlyZXN1bHQgPSBtX2JveDEuY29sbGlkZV90cmlhbmdsZV9leGFjdCgKCQkJCW1fdHJpMC5tX3ZlcnRpY2VzWzBdLG1fdHJpMC5tX3ZlcnRpY2VzWzFdLG1fdHJpMC5tX3ZlcnRpY2VzWzJdLG1fdHJpMF9wbGFuZSk7CgoJCQltX2JveDEuaW5jcmVtZW50X21hcmdpbigtbV90cmkwLm1fbWFyZ2luKTsKCgkJCWlmKCFyZXN1bHQpIHJldHVybiBmYWxzZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UgaWYodDFfaXNfdHJpbWVzaCAmJiBub2RlMV9pc19sZWFmKQoJCXsKCQkJLy9wZXJmb3JtIHByaW1pdGl2ZSB2cyBib3ggY29sbGlzaW9uCgkJCXJldHJpZXZlX25vZGUxX3RyaWFuZ2xlKG5vZGUxKTsKCQkJLy9kbyB0cmlhbmdsZSB2cyBib3ggY29sbGlzaW9uCgkJCW1fYm94MC5pbmNyZW1lbnRfbWFyZ2luKG1fdHJpMS5tX21hcmdpbik7CgoJCQlyZXN1bHQgPSBtX2JveDAuY29sbGlkZV90cmlhbmdsZV9leGFjdCgKCQkJCW1fdHJpMS5tX3ZlcnRpY2VzWzBdLG1fdHJpMS5tX3ZlcnRpY2VzWzFdLG1fdHJpMS5tX3ZlcnRpY2VzWzJdLG1fdHJpMV9wbGFuZSk7CgoJCQltX2JveDAuaW5jcmVtZW50X21hcmdpbigtbV90cmkxLm1fbWFyZ2luKTsKCgkJCWlmKCFyZXN1bHQpIHJldHVybiBmYWxzZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCS8vc3RhY2tsZXNzIGNvbGxpc2lvbiByb3V0aW5lCgl2b2lkIGZpbmRfY29sbGlzaW9uX3BhaXJzKCkKCXsKCQlnaW1fcGFpcl9zZXQgc3RhY2tfY29sbGlzaW9uczsKCQlzdGFja19jb2xsaXNpb25zLnJlc2VydmUoMzIpOwoKCQkvL2FkZCB0aGUgZmlyc3QgcGFpcgoJCXN0YWNrX2NvbGxpc2lvbnMucHVzaF9wYWlyKDAsMCk7CgoKCQl3aGlsZShzdGFja19jb2xsaXNpb25zLnNpemUoKSkKCQl7CgkJCS8vcmV0cmlldmUgdGhlIGxhc3QgcGFpciBhbmQgcG9wCgkJCUdVSU5UIG5vZGUwID0gc3RhY2tfY29sbGlzaW9ucy5iYWNrKCkubV9pbmRleDE7CgkJCUdVSU5UIG5vZGUxID0gc3RhY2tfY29sbGlzaW9ucy5iYWNrKCkubV9pbmRleDI7CgkJCXN0YWNrX2NvbGxpc2lvbnMucG9wX2JhY2soKTsKCQkJaWYobm9kZV9jb2xsaXNpb24obm9kZTAsbm9kZTEpKSAvLyBhIGNvbGxpc2lvbiBpcyBmb3VuZAoJCQl7CgkJCQlpZihub2RlMF9pc19sZWFmKQoJCQkJewoJCQkJCWlmKG5vZGUxX2lzX2xlYWYpCgkJCQkJewoJCQkJCQltX2NvbGxpc2lvbl9wYWlycy0+cHVzaF9wYWlyKG1fYm94c2V0MC0+Z2V0Tm9kZURhdGEobm9kZTApLG1fYm94c2V0MS0+Z2V0Tm9kZURhdGEobm9kZTEpKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy9jb2xsaWRlIGxlZnQKCQkJCQkJc3RhY2tfY29sbGlzaW9ucy5wdXNoX3BhaXIobm9kZTAsbV9ib3hzZXQxLT5nZXRMZWZ0Tm9kZUluZGV4KG5vZGUxKSk7CgoJCQkJCQkvL2NvbGxpZGUgcmlnaHQKCQkJCQkJc3RhY2tfY29sbGlzaW9ucy5wdXNoX3BhaXIobm9kZTAsbV9ib3hzZXQxLT5nZXRSaWdodE5vZGVJbmRleChub2RlMSkpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZihub2RlMV9pc19sZWFmKQoJCQkJCXsKCQkJCQkJLy9jb2xsaWRlIGxlZnQKCQkJCQkJc3RhY2tfY29sbGlzaW9ucy5wdXNoX3BhaXIobV9ib3hzZXQwLT5nZXRMZWZ0Tm9kZUluZGV4KG5vZGUwKSxub2RlMSk7CgkJCQkJCS8vY29sbGlkZSByaWdodAoJCQkJCQlzdGFja19jb2xsaXNpb25zLnB1c2hfcGFpcihtX2JveHNldDAtPmdldFJpZ2h0Tm9kZUluZGV4KG5vZGUwKSxub2RlMSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCUdVSU5UIGxlZnQwID0gbV9ib3hzZXQwLT5nZXRMZWZ0Tm9kZUluZGV4KG5vZGUwKTsKCQkJCQkJR1VJTlQgcmlnaHQwID0gbV9ib3hzZXQwLT5nZXRSaWdodE5vZGVJbmRleChub2RlMCk7CgkJCQkJCUdVSU5UIGxlZnQxID0gbV9ib3hzZXQxLT5nZXRMZWZ0Tm9kZUluZGV4KG5vZGUxKTsKCQkJCQkJR1VJTlQgcmlnaHQxID0gbV9ib3hzZXQxLT5nZXRSaWdodE5vZGVJbmRleChub2RlMSk7CgkJCQkJCS8vY29sbGlkZSBsZWZ0CgkJCQkJCXN0YWNrX2NvbGxpc2lvbnMucHVzaF9wYWlyKGxlZnQwLGxlZnQxKTsKCQkJCQkJLy9jb2xsaWRlIHJpZ2h0CgkJCQkJCXN0YWNrX2NvbGxpc2lvbnMucHVzaF9wYWlyKGxlZnQwLHJpZ2h0MSk7CgkJCQkJCS8vY29sbGlkZSBsZWZ0CgkJCQkJCXN0YWNrX2NvbGxpc2lvbnMucHVzaF9wYWlyKHJpZ2h0MCxsZWZ0MSk7CgkJCQkJCS8vY29sbGlkZSByaWdodAoJCQkJCQlzdGFja19jb2xsaXNpb25zLnB1c2hfcGFpcihyaWdodDAscmlnaHQxKTsKCgkJCQkJfS8vIGVsc2UgaWYgbm9kZTEgaXMgbm90IGEgbGVhZgoJCQkJfS8vIGVsc2UgaWYgbm9kZTAgaXMgbm90IGEgbGVhZgoKCQkJfS8vIGlmKG5vZGVfY29sbGlzaW9uKG5vZGUwLG5vZGUxKSkKCQl9Ly93aGlsZShzdGFja19jb2xsaXNpb25zLnNpemUoKSkKCX0KcHVibGljOgoJdm9pZCBmaW5kX2NvbGxpc2lvbihCT1hfU0VUX0NMQVNTMCAqIGJveHNldDEsIGNvbnN0IGJ0VHJhbnNmb3JtICYgdHJhbnMxLAoJCUJPWF9TRVRfQ0xBU1MxICogYm94c2V0MiwgY29uc3QgYnRUcmFuc2Zvcm0gJiB0cmFuczIsCgkJZ2ltX3BhaXJfc2V0ICYgY29sbGlzaW9uX3BhaXJzLCBib29sIGNvbXBsZXRlX3ByaW1pdGl2ZV90ZXN0cyA9IHRydWUpCgl7CgkJbV9jb2xsaXNpb25fcGFpcnMgPSAmY29sbGlzaW9uX3BhaXJzOwoJCW1fYm94c2V0MCA9IGJveHNldDE7CgkJbV9ib3hzZXQxID0gYm94c2V0MjsKCgkJdHJhbnNfY2FjaGVfMXRvMC5jYWxjX2Zyb21faG9tb2dlbmljKHRyYW5zMSx0cmFuczIpOwoKCQl0cmFuc19jYWNoZV8wdG8xID0gIHRyYW5zMi5pbnZlcnNlKCk7CgkJdHJhbnNfY2FjaGVfMHRvMSAqPSB0cmFuczE7CgoKCQlpZihjb21wbGV0ZV9wcmltaXRpdmVfdGVzdHMpCgkJewoJCQl0MF9pc190cmltZXNoID0gYm94c2V0MS0+Z2V0UHJpbWl0aXZlTWFuYWdlcigpLmlzX3RyaW1lc2goKTsKCQkJdDFfaXNfdHJpbWVzaCA9IGJveHNldDItPmdldFByaW1pdGl2ZU1hbmFnZXIoKS5pc190cmltZXNoKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXQwX2lzX3RyaW1lc2ggPSBmYWxzZTsKCQkJdDFfaXNfdHJpbWVzaCA9IGZhbHNlOwoJCX0KCgkJZmluZF9jb2xsaXNpb25fcGFpcnMoKTsKCX0KfTsKCgojZW5kaWYgLy8gR0lNX0JPWFBSVU5JTkdfSF9JTkNMVURFRAo=