From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lan Tianyu Subject: [PATCH V3 11/29] x86/hvm: Introduce a emulated VTD for HVM Date: Thu, 21 Sep 2017 23:01:52 -0400 Message-ID: <1506049330-11196-12-git-send-email-tianyu.lan@intel.com> References: <1506049330-11196-1-git-send-email-tianyu.lan@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1506049330-11196-1-git-send-email-tianyu.lan@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xen.org Cc: Lan Tianyu , kevin.tian@intel.com, sstabellini@kernel.org, wei.liu2@citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, tim@xen.org, jbeulich@suse.com, roger.pau@citrix.com, Chao Gao List-Id: xen-devel@lists.xenproject.org RnJvbTogQ2hhbyBHYW8gPGNoYW8uZ2FvQGludGVsLmNvbT4KClRoaXMgcGF0Y2ggYWRkcyBjcmVh dGUvZGVzdHJveSBmdW5jdGlvbiBmb3IgdGhlIGVtdWxhdGVkIFZURAphbmQgYWRhcHRzIGl0IHRv IHRoZSBjb21tb24gVklPTU1VIGFic3RyYWN0aW9uLgoKU2lnbmVkLW9mZi1ieTogQ2hhbyBHYW8g PGNoYW8uZ2FvQGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogTGFuIFRpYW55dSA8dGlhbnl1Lmxh bkBpbnRlbC5jb20+Ci0tLQogeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvdnRkL01ha2VmaWxlIHwg ICA3ICstCiB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvaW9tbXUuaCAgfCAgMjMgKysrKyst CiB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvdnZ0ZC5jICAgfCAxNDcgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTcwIGluc2VydGlvbnMo KyksIDcgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgeGVuL2RyaXZlcnMvcGFzc3Ro cm91Z2gvdnRkL3Z2dGQuYwoKZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0 ZC9NYWtlZmlsZSBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9NYWtlZmlsZQppbmRleCBm MzAyNjUzLi4xNjNjN2ZlIDEwMDY0NAotLS0gYS94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQv TWFrZWZpbGUKKysrIGIveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvdnRkL01ha2VmaWxlCkBAIC0x LDggKzEsOSBAQAogc3ViZGlyLSQoQ09ORklHX1g4NikgKz0geDg2CiAKLW9iai15ICs9IGlvbW11 Lm8KIG9iai15ICs9IGRtYXIubwotb2JqLXkgKz0gdXRpbHMubwotb2JqLXkgKz0gcWludmFsLm8K IG9iai15ICs9IGludHJlbWFwLm8KK29iai15ICs9IGlvbW11Lm8KK29iai15ICs9IHFpbnZhbC5v CiBvYmoteSArPSBxdWlya3Mubworb2JqLXkgKz0gdXRpbHMubworb2JqLSQoQ09ORklHX1ZJT01N VSkgKz0gdnZ0ZC5vCmRpZmYgLS1naXQgYS94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC92dGQvaW9t bXUuaCBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9pb21tdS5oCmluZGV4IGQ3ZTQzM2Uu LmVmMDM4YzkgMTAwNjQ0Ci0tLSBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9pb21tdS5o CisrKyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9pb21tdS5oCkBAIC02Niw2ICs2Niwx MiBAQAogI2RlZmluZSBWRVJfTUFKT1IodikgICAgICAgICgoKHYpICYgMHhmMCkgPj4gNCkKICNk ZWZpbmUgVkVSX01JTk9SKHYpICAgICAgICAoKHYpICYgMHgwZikKIAorLyogU3VwcG9ydGVkIEFk anVzdGVkIEd1ZXN0IEFkZHJlc3MgV2lkdGhzICovCisjZGVmaW5lIERNQV9DQVBfU0FHQVdfU0hJ RlQgICAgICAgICA4CisgLyogMzktYml0IEFHQVcsIDMtbGV2ZWwgcGFnZS10YWJsZSAqLworI2Rl ZmluZSBETUFfQ0FQX1NBR0FXXzM5Yml0ICAgICAgICAgKDB4MlVMTCA8PCBETUFfQ0FQX1NBR0FX X1NISUZUKQorI2RlZmluZSBETUFfQ0FQX05EXzY0SyAgICAgICAgICAgICAgNlVMTAorCiAvKgog ICogRGVjb2RpbmcgQ2FwYWJpbGl0eSBSZWdpc3RlcgogICovCkBAIC03NCw2ICs4MCw3IEBACiAj ZGVmaW5lIGNhcF93cml0ZV9kcmFpbihjKSAgICAgKCgoYykgPj4gNTQpICYgMSkKICNkZWZpbmUg Y2FwX21heF9hbWFza192YWwoYykgICAoKChjKSA+PiA0OCkgJiAweDNmKQogI2RlZmluZSBjYXBf bnVtX2ZhdWx0X3JlZ3MoYykgICgoKChjKSA+PiA0MCkgJiAweGZmKSArIDEpCisjZGVmaW5lIGNh cF9zZXRfbnVtX2ZhdWx0X3JlZ3MoYykgICgoKChjKSAtIDEpICYgMHhmZikgPDwgNDApCiAjZGVm aW5lIGNhcF9wZ3NlbF9pbnYoYykgICAgICAgKCgoYykgPj4gMzkpICYgMSkKIAogI2RlZmluZSBj YXBfc3VwZXJfcGFnZV92YWwoYykgICgoKGMpID4+IDM0KSAmIDB4ZikKQEAgLTg1LDExICs5Miwx MyBAQAogI2RlZmluZSBjYXBfc3BzXzF0YihjKSAgICAgICAgICgoYyA+PiAzNykgJiAxKQogCiAj ZGVmaW5lIGNhcF9mYXVsdF9yZWdfb2Zmc2V0KGMpICAgICgoKChjKSA+PiAyNCkgJiAweDNmZikg KiAxNikKKyNkZWZpbmUgY2FwX3NldF9mYXVsdF9yZWdfb2Zmc2V0KGMpICgoKChjKSAvIDE2KSAm IDB4M2ZmKSA8PCAyNCApCiAKICNkZWZpbmUgY2FwX2lzb2NoKGMpICAgICAgICAoKChjKSA+PiAy MykgJiAxKQogI2RlZmluZSBjYXBfcW9zKGMpICAgICAgICAoKChjKSA+PiAyMikgJiAxKQogI2Rl ZmluZSBjYXBfbWdhdyhjKSAgICAgICAgKCgoKGMpID4+IDE2KSAmIDB4M2YpICsgMSkKLSNkZWZp bmUgY2FwX3NhZ2F3KGMpICAgICAgICAoKChjKSA+PiA4KSAmIDB4MWYpCisjZGVmaW5lIGNhcF9z ZXRfbWdhdyhjKSAgICAgKCgoKGMpIC0gMSkgJiAweDNmKSA8PCAxNikKKyNkZWZpbmUgY2FwX3Nh Z2F3KGMpICAgICAgICAoKChjKSA+PiBETUFfQ0FQX1NBR0FXX1NISUZUKSAmIDB4MWYpCiAjZGVm aW5lIGNhcF9jYWNoaW5nX21vZGUoYykgICAgKCgoYykgPj4gNykgJiAxKQogI2RlZmluZSBjYXBf cGhtcihjKSAgICAgICAgKCgoYykgPj4gNikgJiAxKQogI2RlZmluZSBjYXBfcGxtcihjKSAgICAg ICAgKCgoYykgPj4gNSkgJiAxKQpAQCAtMTA0LDEwICsxMTMsMTYgQEAKICNkZWZpbmUgZWNhcF9u aW90bGJfaXVuaXRzKGUpICAgICgoKChlKSA+PiAyNCkgJiAweGZmKSArIDEpCiAjZGVmaW5lIGVj YXBfaW90bGJfb2Zmc2V0KGUpICAgICAoKCgoZSkgPj4gOCkgJiAweDNmZikgKiAxNikKICNkZWZp bmUgZWNhcF9jb2hlcmVudChlKSAgICAgICAgICgoZSA+PiAwKSAmIDB4MSkKLSNkZWZpbmUgZWNh cF9xdWV1ZWRfaW52YWwoZSkgICAgICgoZSA+PiAxKSAmIDB4MSkKKyNkZWZpbmUgRE1BX0VDQVBf UUlfU0hJRlQgICAgICAgIDEKKyNkZWZpbmUgRE1BX0VDQVBfUUkgICAgICAgICAgICAgICgxVUxM IDw8IERNQV9FQ0FQX1FJX1NISUZUKQorI2RlZmluZSBlY2FwX3F1ZXVlZF9pbnZhbChlKSAgICAg KChlID4+IERNQV9FQ0FQX1FJX1NISUZUKSAmIDB4MSkKICNkZWZpbmUgZWNhcF9kZXZfaW90bGIo ZSkgICAgICAgICgoZSA+PiAyKSAmIDB4MSkKLSNkZWZpbmUgZWNhcF9pbnRyX3JlbWFwKGUpICAg ICAgICgoZSA+PiAzKSAmIDB4MSkKLSNkZWZpbmUgZWNhcF9laW0oZSkgICAgICAgICAgICAgICgo ZSA+PiA0KSAmIDB4MSkKKyNkZWZpbmUgRE1BX0VDQVBfSVJfU0hJRlQgICAgICAgIDMKKyNkZWZp bmUgRE1BX0VDQVBfSVIgICAgICAgICAgICAgICgxVUxMIDw8IERNQV9FQ0FQX0lSX1NISUZUKQor I2RlZmluZSBlY2FwX2ludHJfcmVtYXAoZSkgICAgICAgKChlID4+IERNQV9FQ0FQX0lSX1NISUZU KSAmIDB4MSkKKyNkZWZpbmUgRE1BX0VDQVBfRUlNX1NISUZUICAgICAgIDQKKyNkZWZpbmUgRE1B X0VDQVBfRUlNICAgICAgICAgICAgICgxVUxMIDw8IERNQV9FQ0FQX0VJTV9TSElGVCkKKyNkZWZp bmUgZWNhcF9laW0oZSkgICAgICAgICAgICAgICgoZSA+PiBETUFfRUNBUF9FSU1fU0hJRlQpICYg MHgxKQogI2RlZmluZSBlY2FwX2NhY2hlX2hpbnRzKGUpICAgICAgKChlID4+IDUpICYgMHgxKQog I2RlZmluZSBlY2FwX3Bhc3NfdGhydShlKSAgICAgICAgKChlID4+IDYpICYgMHgxKQogI2RlZmlu ZSBlY2FwX3NucF9jdGwoZSkgICAgICAgICAgKChlID4+IDcpICYgMHgxKQpkaWZmIC0tZ2l0IGEv eGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvdnRkL3Z2dGQuYyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJv dWdoL3Z0ZC92dnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1MWVj NwotLS0gL2Rldi9udWxsCisrKyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC92dnRkLmMK QEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiB2dnRkLmMKKyAqCisgKiB2aXJ0dWFsaXplIFZURCBm b3IgSFZNLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBDaGFvIEdhbywgSW50ZWwgQ29ycG9y YXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29u ZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLCB2ZXJzaW9uIDIs IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9n cmFtOyBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKwor I2luY2x1ZGUgPHhlbi9kb21haW5fcGFnZS5oPgorI2luY2x1ZGUgPHhlbi9zY2hlZC5oPgorI2lu Y2x1ZGUgPHhlbi90eXBlcy5oPgorI2luY2x1ZGUgPHhlbi92aW9tbXUuaD4KKyNpbmNsdWRlIDx4 ZW4veG1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2h2 bS9kb21haW4uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSAiaW9tbXUuaCIK KworLyogU3VwcG9ydGVkIGNhcGFiaWxpdGllcyBieSB2dnRkICovCit1bnNpZ25lZCBpbnQgdnZ0 ZF9jYXBzID0gVklPTU1VX0NBUF9JUlFfUkVNQVBQSU5HOworCit1bmlvbiBodm1faHdfdnZ0ZF9y ZWdzIHsKKyAgICB1aW50MzJfdCBkYXRhMzJbMjU2XTsKKyAgICB1aW50NjRfdCBkYXRhNjRbMTI4 XTsKK307CisKK3N0cnVjdCB2dnRkIHsKKyAgICAvKiBBZGRyZXNzIHJhbmdlIG9mIHJlbWFwcGlu ZyBoYXJkd2FyZSByZWdpc3Rlci1zZXQgKi8KKyAgICB1aW50NjRfdCBiYXNlX2FkZHI7CisgICAg dWludDY0X3QgbGVuZ3RoOworICAgIC8qIFBvaW50IGJhY2sgdG8gdGhlIG93bmVyIGRvbWFpbiAq LworICAgIHN0cnVjdCBkb21haW4gKmRvbWFpbjsKKyAgICB1bmlvbiBodm1faHdfdnZ0ZF9yZWdz ICpyZWdzOworICAgIHN0cnVjdCBwYWdlX2luZm8gKnJlZ3NfcGFnZTsKK307CisKK3N0YXRpYyBp bmxpbmUgdm9pZCB2dnRkX3NldF9yZWcoc3RydWN0IHZ2dGQgKnZ0ZCwgdWludDMyX3QgcmVnLCB1 aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB2dGQtPnJlZ3MtPmRhdGEzMltyZWcvc2l6ZW9mKHVpbnQz Ml90KV0gPSB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB2dnRkX2dldF9yZWco c3RydWN0IHZ2dGQgKnZ0ZCwgdWludDMyX3QgcmVnKQoreworICAgIHJldHVybiB2dGQtPnJlZ3Mt PmRhdGEzMltyZWcvc2l6ZW9mKHVpbnQzMl90KV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2 dnRkX3NldF9yZWdfcXVhZChzdHJ1Y3QgdnZ0ZCAqdnRkLCB1aW50MzJfdCByZWcsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpCit7CisgICAgdnRk LT5yZWdzLT5kYXRhNjRbcmVnL3NpemVvZih1aW50NjRfdCldID0gdmFsdWU7Cit9CisKK3N0YXRp YyBpbmxpbmUgdWludDY0X3QgdnZ0ZF9nZXRfcmVnX3F1YWQoc3RydWN0IHZ2dGQgKnZ0ZCwgdWlu dDMyX3QgcmVnKQoreworICAgIHJldHVybiB2dGQtPnJlZ3MtPmRhdGE2NFtyZWcvc2l6ZW9mKHVp bnQ2NF90KV07Cit9CisKK3N0YXRpYyB2b2lkIHZ2dGRfcmVzZXQoc3RydWN0IHZ2dGQgKnZ2dGQs IHVpbnQ2NF90IGNhcGFiaWxpdHkpCit7CisgICAgdWludDY0X3QgY2FwID0gY2FwX3NldF9udW1f ZmF1bHRfcmVncygxVUxMKSB8CisgICAgICAgICAgICAgICAgICAgY2FwX3NldF9mYXVsdF9yZWdf b2Zmc2V0KDB4MjIwVUxMKSB8CisgICAgICAgICAgICAgICAgICAgY2FwX3NldF9tZ2F3KDM5VUxM KSB8IERNQV9DQVBfU0FHQVdfMzliaXQgfAorICAgICAgICAgICAgICAgICAgIERNQV9DQVBfTkRf NjRLOworICAgIHVpbnQ2NF90IGVjYXAgPSBETUFfRUNBUF9JUiB8IERNQV9FQ0FQX0VJTSB8IERN QV9FQ0FQX1FJOworCisgICAgdnZ0ZF9zZXRfcmVnKHZ2dGQsIERNQVJfVkVSX1JFRywgMHgxMFVM KTsKKyAgICB2dnRkX3NldF9yZWdfcXVhZCh2dnRkLCBETUFSX0NBUF9SRUcsIGNhcCk7CisgICAg dnZ0ZF9zZXRfcmVnX3F1YWQodnZ0ZCwgRE1BUl9FQ0FQX1JFRywgZWNhcCk7CisgICAgdnZ0ZF9z ZXRfcmVnKHZ2dGQsIERNQVJfRkVDVExfUkVHLCAweDgwMDAwMDAwVUwpOworICAgIHZ2dGRfc2V0 X3JlZyh2dnRkLCBETUFSX0lFQ1RMX1JFRywgMHg4MDAwMDAwMFVMKTsKK30KKworc3RhdGljIGlu dCB2dnRkX2NyZWF0ZShzdHJ1Y3QgZG9tYWluICpkLCBzdHJ1Y3QgdmlvbW11ICp2aW9tbXUpCit7 CisgICAgc3RydWN0IHZ2dGQgKnZ2dGQ7CisgICAgaW50IHJldDsKKworICAgIGlmICggIWlzX2h2 bV9kb21haW4oZCkgfHwgKHZpb21tdS0+YmFzZV9hZGRyZXNzICYgKFBBR0VfU0laRSAtIDEpKSB8 fAorICAgICAgICAofnZ2dGRfY2FwcyAmIHZpb21tdS0+Y2FwcykgKQorICAgICAgICByZXR1cm4g LUVJTlZBTDsKKworICAgIHJldCA9IC1FTk9NRU07CisgICAgdnZ0ZCA9IHh6YWxsb2NfYnl0ZXMo c2l6ZW9mKHN0cnVjdCB2dnRkKSk7CisgICAgaWYgKCAhdnZ0ZCApCisgICAgICAgIHJldHVybiBy ZXQ7CisKKyAgICB2dnRkLT5yZWdzX3BhZ2UgPSBhbGxvY19kb21oZWFwX3BhZ2UoZCwgTUVNRl9u b19vd25lcik7CisgICAgaWYgKCAhdnZ0ZC0+cmVnc19wYWdlICkKKyAgICAgICAgZ290byBvdXQx OworCisgICAgdnZ0ZC0+cmVncyA9IF9fbWFwX2RvbWFpbl9wYWdlX2dsb2JhbCh2dnRkLT5yZWdz X3BhZ2UpOworICAgIGlmICggIXZ2dGQtPnJlZ3MgKQorICAgICAgICBnb3RvIG91dDI7CisgICAg Y2xlYXJfcGFnZSh2dnRkLT5yZWdzKTsKKworICAgIHZ2dGRfcmVzZXQodnZ0ZCwgdmlvbW11LT5j YXBzKTsKKyAgICB2dnRkLT5iYXNlX2FkZHIgPSB2aW9tbXUtPmJhc2VfYWRkcmVzczsKKyAgICB2 dnRkLT5kb21haW4gPSBkOworCisgICAgdmlvbW11LT5wcml2ID0gdnZ0ZDsKKworICAgIHJldHVy biAwOworCisgb3V0MjoKKyAgICBmcmVlX2RvbWhlYXBfcGFnZSh2dnRkLT5yZWdzX3BhZ2UpOwor IG91dDE6CisgICAgeGZyZWUodnZ0ZCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCB2dnRkX2Rlc3Ryb3koc3RydWN0IHZpb21tdSAqdmlvbW11KQoreworICAgIHN0cnVjdCB2dnRk ICp2dnRkID0gdmlvbW11LT5wcml2OworCisgICAgaWYgKCB2dnRkICkKKyAgICB7CisgICAgICAg IHVubWFwX2RvbWFpbl9wYWdlX2dsb2JhbCh2dnRkLT5yZWdzKTsKKyAgICAgICAgZnJlZV9kb21o ZWFwX3BhZ2UodnZ0ZC0+cmVnc19wYWdlKTsKKyAgICAgICAgeGZyZWUodnZ0ZCk7CisgICAgfQor ICAgIHJldHVybiAwOworfQorCitzdHJ1Y3QgdmlvbW11X29wcyB2dnRkX2h2bV92bXhfb3BzID0g eworICAgIC5jcmVhdGUgPSB2dnRkX2NyZWF0ZSwKKyAgICAuZGVzdHJveSA9IHZ2dGRfZGVzdHJv eQorfTsKKworc3RhdGljIGludCB2dnRkX3JlZ2lzdGVyKHZvaWQpCit7CisgICAgdmlvbW11X3Jl Z2lzdGVyX3R5cGUoVklPTU1VX1RZUEVfSU5URUxfVlRELCAmdnZ0ZF9odm1fdm14X29wcyk7Cisg ICAgcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKHZ2dGRfcmVnaXN0ZXIpOwotLSAKMS44LjMuMQoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZl bCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4u b3JnL3hlbi1kZXZlbAo=