LyoKICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxtcGM4MjYwLmg+CiNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KI2luY2x1ZGUgPGlvcG9ydHMuaD4KCkRFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKI2lmIGRlZmluZWQoQ09ORklHX0JPQVJEX0dFVF9DUFVfQ0xLX0YpCmV4dGVybiB1bnNpZ25lZCBsb25nIGJvYXJkX2dldF9jcHVfY2xrX2YgKHZvaWQpOwojZW5kaWYKCnN0YXRpYyB2b2lkIGNvbmZpZ184MjYwX2lvcG9ydHMgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQp7CglpbnQgcG9ydG51bTsKCglmb3IgKHBvcnRudW0gPSAwOyBwb3J0bnVtIDwgNDsgcG9ydG51bSsrKSB7CgkJdWludCBwbXNrID0gMCwKCQkgICAgIHBwYXIgPSAwLAoJCSAgICAgcHNvciA9IDAsCgkJICAgICBwZGlyID0gMCwKCQkgICAgIHBvZHIgPSAwLAoJCSAgICAgcGRhdCA9IDA7CgkJaW9wX2NvbmZfdCAqaW9wYyA9IChpb3BfY29uZl90ICopICYgaW9wX2NvbmZfdGFiW3BvcnRudW1dWzBdOwoJCWlvcF9jb25mX3QgKmVpb3BjID0gaW9wYyArIDMyOwoJCXVpbnQgbXNrID0gMTsKCgkJLyoKCQkgKiBOT1RFOgoJCSAqIGluZGV4IDAgcmVmZXJzIHRvIHBpbiAzMSwKCQkgKiBpbmRleCAzMSByZWZlcnMgdG8gcGluIDAKCQkgKi8KCQl3aGlsZSAoaW9wYyA8IGVpb3BjKSB7CgkJCWlmIChpb3BjLT5jb25mKSB7CgkJCQlwbXNrIHw9IG1zazsKCQkJCWlmIChpb3BjLT5wcGFyKQoJCQkJCXBwYXIgfD0gbXNrOwoJCQkJaWYgKGlvcGMtPnBzb3IpCgkJCQkJcHNvciB8PSBtc2s7CgkJCQlpZiAoaW9wYy0+cGRpcikKCQkJCQlwZGlyIHw9IG1zazsKCQkJCWlmIChpb3BjLT5wb2RyKQoJCQkJCXBvZHIgfD0gbXNrOwoJCQkJaWYgKGlvcGMtPnBkYXQpCgkJCQkJcGRhdCB8PSBtc2s7CgkJCX0KCgkJCW1zayA8PD0gMTsKCQkJaW9wYysrOwoJCX0KCgkJaWYgKHBtc2sgIT0gMCkgewoJCQl2b2xhdGlsZSBpb3BvcnRfdCAqaW9wID0gaW9wb3J0X2FkZHIgKGltbXIsIHBvcnRudW0pOwoJCQl1aW50IHRwbXNrID0gfnBtc2s7CgoJCQkvKgoJCQkgKiB0aGUgKHNvbWV3aGF0IGNvbmZ1c2VkKSBwYXJhZ3JhcGggYXQgdGhlCgkJCSAqIGJvdHRvbSBvZiBwYWdlIDM1LTUgd2FybnMgdGhhdCB0aGVyZSBtaWdodAoJCQkgKiBiZSAidW5rbm93biBiZWhhdmlvdXIiIHdoZW4gcHJvZ3JhbW1pbmcKCQkJICogUFNPUnggYW5kIFBESVJ4LCBpZiBQUEFSeCA9IDEsIHNvIEkKCQkJICogZGVjaWRlZCB0aGlzIG1lYW50IEkgaGFkIHRvIGRpc2FibGUgdGhlCgkJCSAqIGRlZGljYXRlZCBmdW5jdGlvbiBmaXJzdCwgYW5kIGVuYWJsZSBpdAoJCQkgKiBsYXN0LgoJCQkgKi8KCQkJaW9wLT5wcGFyICY9IHRwbXNrOwoJCQlpb3AtPnBzb3IgPSAoaW9wLT5wc29yICYgdHBtc2spIHwgcHNvcjsKCQkJaW9wLT5wb2RyID0gKGlvcC0+cG9kciAmIHRwbXNrKSB8IHBvZHI7CgkJCWlvcC0+cGRhdCA9IChpb3AtPnBkYXQgJiB0cG1zaykgfCBwZGF0OwoJCQlpb3AtPnBkaXIgPSAoaW9wLT5wZGlyICYgdHBtc2spIHwgcGRpcjsKCQkJaW9wLT5wcGFyIHw9IHBwYXI7CgkJfQoJfQp9CgojZGVmaW5lIFNFVF9WQUxfTUFTSyhhLCBiLCBtYXNrKSAoKGEgJiBtYXNrKSB8IChiICYgfm1hc2spKQovKgogKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIENQVS4uLgogKgogKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsCiAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMsCiAqIGluaXRpYWxpemUgdGhlIFVQTSdzCiAqLwp2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQp7CiNpZiAhZGVmaW5lZChDT05GSUdfQ09HRU5UKQkJLyogZG9uZSBpbiBzdGFydC5TIGZvciB0aGUgY29nZW50ICovCgl1aW50IHNjY3I7CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfQk9BUkRfR0VUX0NQVV9DTEtfRikKCXVuc2lnbmVkIGxvbmcgY3B1X2NsazsKI2VuZGlmCgl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7CglleHRlcm4gdm9pZCBtODI2MF9jcG1fcmVzZXQgKHZvaWQpOwoKCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2NhdGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovCglnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CgoJLyogQ2xlYXIgaW5pdGlhbCBnbG9iYWwgZGF0YSAqLwoJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CgoJLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIC0gY2xlYXIgYWxsIHN0YXR1cyAoNS00KSAqLwoJZ2QtPnJlc2V0X3N0YXR1cyA9IGltbXItPmltX2Nsa3JzdC5jYXJfcnNyOwoJaW1tci0+aW1fY2xrcnN0LmNhcl9yc3IgPSBSU1JfQUxMQklUUzsKCgkvKiBSTVIgLSBSZXNldCBNb2RlIFJlZ2lzdGVyIC0gY29udGFpbnMgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoNS01KSAqLwoJaW1tci0+aW1fY2xrcnN0LmNhcl9ybXIgPSBDT05GSUdfU1lTX1JNUjsKCgkvKiBCQ1IgLSBCdXMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoNC0yNSkgKi8KI2lmIGRlZmluZWQoQ09ORklHX1NZU19CQ1JfNjB4KSAmJiAoQ09ORklHX1NZU19CQ1JfU0lOR0xFKQoJaWYgKGltbXItPmltX3NpdV9jb25mLnNjX2JjciAmIEJDUl9FQk0pIHsKCQlpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyLCBDT05GSUdfU1lTX0JDUl82MHgsIDB4ODAwMDAwMTApOwoJfSBlbHNlIHsKCQlpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyLCBDT05GSUdfU1lTX0JDUl9TSU5HTEUsIDB4ODAwMDAwMTApOwoJfQojZWxzZQoJaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyID0gQ09ORklHX1NZU19CQ1I7CiNlbmRpZgoKCS8qIFNJVU1DUiAtIGNvbnRhaW5zIGRlYnVnIHBpbiBjb25maWd1cmF0aW9uICg0LTMxKSAqLwojaWYgZGVmaW5lZChDT05GSUdfU1lTX1NJVU1DUl9MT1cpICYmIChDT05GSUdfU1lTX1NJVU1DUl9ISUdIKQoJY3B1X2NsayA9IGJvYXJkX2dldF9jcHVfY2xrX2YgKCk7CglpZiAoY3B1X2NsayA+PSAxMDAwMDAwMDApIHsKCQlpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyLCBDT05GSUdfU1lTX1NJVU1DUl9ISUdILCAweDlmM2NjMDAwKTsKCX0gZWxzZSB7CgkJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyID0gU0VUX1ZBTF9NQVNLKGltbXItPmltX3NpdV9jb25mLnNjX3NpdW1jciwgQ09ORklHX1NZU19TSVVNQ1JfTE9XLCAweDlmM2NjMDAwKTsKCX0KI2Vsc2UKCWltbXItPmltX3NpdV9jb25mLnNjX3NpdW1jciA9IENPTkZJR19TWVNfU0lVTUNSOwojZW5kaWYKCgljb25maWdfODI2MF9pb3BvcnRzIChpbW1yKTsKCgkvKiBpbml0aWFsaXplIHRpbWUgY291bnRlciBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKDQtNDApICovCglpbW1yLT5pbV9zaXQuc2l0X3RtY250c2MgPSBDT05GSUdfU1lTX1RNQ05UU0M7CgoJLyogaW5pdGlhbGl6ZSB0aGUgUElUICg0LTQyKSAqLwoJaW1tci0+aW1fc2l0LnNpdF9waXNjciA9IENPTkZJR19TWVNfUElTQ1I7CgojaWYgIWRlZmluZWQoQ09ORklHX0NPR0VOVCkJCS8qIGRvbmUgaW4gc3RhcnQuUyBmb3IgdGhlIGNvZ2VudCAqLwoJLyogU3lzdGVtIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgKDktOCkgKi8KCXNjY3IgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3IgJgoJCShTQ0NSX1BDSV9NT0RFIHwgU0NDUl9QQ0lfTU9EQ0sgfCBTQ0NSX1BDSURGX01TSyk7CglpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3IgPSBzY2NyIHwKCQkoQ09ORklHX1NZU19TQ0NSICYgfihTQ0NSX1BDSV9NT0RFIHwgU0NDUl9QQ0lfTU9EQ0sgfCBTQ0NSX1BDSURGX01TSykgKTsKI2VuZGlmIC8qICFDT05GSUdfQ09HRU5UICovCgoJLyoKCSAqIE1lbW9yeSBDb250cm9sbGVyOgoJICovCgoJLyogTWFwIGJhbmtzIDAgYW5kIDEgdG8gdGhlIEZMQVNIIGJhbmtzIDAgYW5kIDEgYXQgcHJlbGltaW5hcnkKCSAqIGFkZHJlc3NlcyAtIHRoZXNlIGhhdmUgdG8gYmUgbW9kaWZpZWQgbGF0ZXIgd2hlbiBGTEFTSCBzaXplCgkgKiBoYXMgYmVlbiBkZXRlcm1pbmVkCgkgKi8KCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IwX1JFTUFQKQoJbWVtY3RsLT5tZW1jX29yMCA9IENPTkZJR19TWVNfT1IwX1JFTUFQOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1NZU19PUjFfUkVNQVApCgltZW1jdGwtPm1lbWNfb3IxID0gQ09ORklHX1NZU19PUjFfUkVNQVA7CiNlbmRpZgoKCS8qIG5vdyByZXN0cmljdCB0byBwcmVsaW1pbmFyeSByYW5nZSAqLwoJLyogdGhlIFBTIGNhbWUgZnJvbSB0aGUgSFJDVywgZG9utHQgY2hhbmdlIGl0ICovCgltZW1jdGwtPm1lbWNfYnIwID0gU0VUX1ZBTF9NQVNLKG1lbWN0bC0+bWVtY19icjAgLCBDT05GSUdfU1lTX0JSMF9QUkVMSU0sIEJSeF9QU19NU0spOwoJbWVtY3RsLT5tZW1jX29yMCA9IENPTkZJR19TWVNfT1IwX1BSRUxJTTsKCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIxX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9QUkVMSU0pCgltZW1jdGwtPm1lbWNfb3IxID0gQ09ORklHX1NZU19PUjFfUFJFTElNOwoJbWVtY3RsLT5tZW1jX2JyMSA9IENPTkZJR19TWVNfQlIxX1BSRUxJTTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMl9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjJfUFJFTElNKQoJbWVtY3RsLT5tZW1jX29yMiA9IENPTkZJR19TWVNfT1IyX1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjIgPSBDT05GSUdfU1lTX0JSMl9QUkVMSU07CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjNfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IzX1BSRUxJTSkKCW1lbWN0bC0+bWVtY19vcjMgPSBDT05GSUdfU1lTX09SM19QUkVMSU07CgltZW1jdGwtPm1lbWNfYnIzID0gQ09ORklHX1NZU19CUjNfUFJFTElNOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI0X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNF9QUkVMSU0pCgltZW1jdGwtPm1lbWNfb3I0ID0gQ09ORklHX1NZU19PUjRfUFJFTElNOwoJbWVtY3RsLT5tZW1jX2JyNCA9IENPTkZJR19TWVNfQlI0X1BSRUxJTTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSNV9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjVfUFJFTElNKQoJbWVtY3RsLT5tZW1jX29yNSA9IENPTkZJR19TWVNfT1I1X1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjUgPSBDT05GSUdfU1lTX0JSNV9QUkVMSU07CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjZfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I2X1BSRUxJTSkKCW1lbWN0bC0+bWVtY19vcjYgPSBDT05GSUdfU1lTX09SNl9QUkVMSU07CgltZW1jdGwtPm1lbWNfYnI2ID0gQ09ORklHX1NZU19CUjZfUFJFTElNOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI3X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SN19QUkVMSU0pCgltZW1jdGwtPm1lbWNfb3I3ID0gQ09ORklHX1NZU19PUjdfUFJFTElNOwoJbWVtY3RsLT5tZW1jX2JyNyA9IENPTkZJR19TWVNfQlI3X1BSRUxJTTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSOF9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjhfUFJFTElNKQoJbWVtY3RsLT5tZW1jX29yOCA9IENPTkZJR19TWVNfT1I4X1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjggPSBDT05GSUdfU1lTX0JSOF9QUkVMSU07CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjlfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I5X1BSRUxJTSkKCW1lbWN0bC0+bWVtY19vcjkgPSBDT05GSUdfU1lTX09SOV9QUkVMSU07CgltZW1jdGwtPm1lbWNfYnI5ID0gQ09ORklHX1NZU19CUjlfUFJFTElNOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIxMF9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjEwX1BSRUxJTSkKCW1lbWN0bC0+bWVtY19vcjEwID0gQ09ORklHX1NZU19PUjEwX1BSRUxJTTsKCW1lbWN0bC0+bWVtY19icjEwID0gQ09ORklHX1NZU19CUjEwX1BSRUxJTTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMTFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IxMV9QUkVMSU0pCgltZW1jdGwtPm1lbWNfb3IxMSA9IENPTkZJR19TWVNfT1IxMV9QUkVMSU07CgltZW1jdGwtPm1lbWNfYnIxMSA9IENPTkZJR19TWVNfQlIxMV9QUkVMSU07CiNlbmRpZgoKCW04MjYwX2NwbV9yZXNldCAoKTsKfQoKLyoKICogaW5pdGlhbGl6ZSBoaWdoZXIgbGV2ZWwgcGFydHMgb2YgQ1BVIGxpa2UgdGltZSBiYXNlIGFuZCB0aW1lcnMKICovCmludCBjcHVfaW5pdF9yICh2b2lkKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgZ2QtPmJkLT5iaV9pbW1yX2Jhc2U7CgoJaW1tci0+aW1fY3BtLmNwX3JjY3IgPSBDT05GSUdfU1lTX1JDQ1I7CgoJcmV0dXJuICgwKTsKfQoKLyoKICogcHJpbnQgb3V0IHRoZSByZWFzb24gZm9yIHRoZSByZXNldAogKi8KaW50IHBydF84MjYwX3JzciAodm9pZCkKewoJc3RhdGljIHN0cnVjdCB7CgkJdWxvbmcgbWFzazsKCQljaGFyICpkZXNjOwoJfSBiaXRzW10gPSB7CgkJewoJCVJTUl9KVFJTLCAiSlRBRyJ9LCB7CgkJUlNSX0NTUlMsICJDaGVjayBTdG9wIn0sIHsKCQlSU1JfU1dSUywgIlNvZnR3YXJlIFdhdGNoZG9nIn0sIHsKCQlSU1JfQk1SUywgIkJ1cyBNb25pdG9yIn0sIHsKCQlSU1JfRVNSUywgIkV4dGVybmFsIFNvZnQifSwgewoJCVJTUl9FSFJTLCAiRXh0ZXJuYWwgSGFyZCJ9Cgl9OwoJc3RhdGljIGludCBuID0gc2l6ZW9mIGJpdHMgLyBzaXplb2YgYml0c1swXTsKCXVsb25nIHJzciA9IGdkLT5yZXNldF9zdGF0dXM7CglpbnQgaTsKCWNoYXIgKnNlcDsKCglwdXRzIChDUFVfSURfU1RSICIgUmVzZXQgU3RhdHVzOiIpOwoKCXNlcCA9ICIgIjsKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJaWYgKHJzciAmIGJpdHNbaV0ubWFzaykgewoJCQlwcmludGYgKCIlcyVzIiwgc2VwLCBiaXRzW2ldLmRlc2MpOwoJCQlzZXAgPSAiLCAiOwoJCX0KCglwdXRzICgiXG5cbiIpOwoJcmV0dXJuICgwKTsKfQo=