From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Weinehall Subject: [PATCH i-g-t v4 1/1] lib/igt_pm: Lib for power management Date: Thu, 18 Feb 2016 13:08:46 +0200 Message-ID: <1455793726-25141-2-git-send-email-david.weinehall@linux.intel.com> References: <1455793726-25141-1-git-send-email-david.weinehall@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id 7D0C86EB32 for ; Thu, 18 Feb 2016 11:08:51 +0000 (UTC) In-Reply-To: <1455793726-25141-1-git-send-email-david.weinehall@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: David Weinehall List-Id: intel-gfx@lists.freedesktop.org TW92ZSBwb3dlciBtYW5hZ2VtZW50IHJlbGF0ZWQgY29kZSB0byBhIHNlcGFyYXRlIGxpYnJhcnku CkluaXRpYWxseSB0aGlzIGlzIGRvbmUgb25seSBmb3Igd29ya2Fyb3VuZHMgdGhhdCBhcHBseSB0 byBleHRlcm5hbApjb21wb25lbnRzLiAgTW9kaWZ5IHRoZSB1c2VycyBvZiBzdWNoIHdvcmthcm91 bmRzIGFjY29yZGluZ2x5LgpUaGlzIGN1cnJlbnRseSBpbnZvbHZlcyBIRCBhdWRpbyBhbmQgU0FU QSBsaW5rIHBvd2VyIG1hbmFnZW1lbnQuCkZvciBTQVRBIGxpbmsgUE0gdGhlcmUncyBhbHNvIGNv ZGUgdG8gc2F2ZSB0aGUgcHJldmlvdXMgc2V0dGluZ3MsCnRvIGFsbG93IGZvciByZXNldHRpbmcg dGhlIHZhbHVlcyBhZnRlciB3ZSd2ZSBmaW5pc2hlZCB0ZXN0aW5nLgoKU2lnbmVkLW9mZi1ieTog RGF2aWQgV2VpbmVoYWxsIDxkYXZpZC53ZWluZWhhbGxAaW50ZWwuY29tPgotLS0KIC4uLi9pbnRl bC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRvb2xzLWRvY3MueG1sICAgICAgIHwgICAxICsKIGxpYi9N YWtlZmlsZS5zb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyICsKIGxp Yi9pZ3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsK IGxpYi9pZ3RfYXV4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE1 ICstCiBsaWIvaWd0X3BtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDIzMyArKysrKysrKysrKysrKysrKysrKysKIGxpYi9pZ3RfcG0uaCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgIDMxICsrKwogdGVzdHMvcG1fbHBzcC5jICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMjUgKy0tCiB0ZXN0cy9wbV9ycG0uYyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0MCArLS0tCiA4IGZpbGVzIGNoYW5n ZWQsIDI4MSBpbnNlcnRpb25zKCspLCA2NyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBsaWIvaWd0X3BtLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvaWd0X3BtLmgKCmRpZmYgLS1n aXQgYS9kb2NzL3JlZmVyZW5jZS9pbnRlbC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRvb2xzLWRvY3Mu eG1sIGIvZG9jcy9yZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2ludGVsLWdwdS10b29scy1kb2Nz LnhtbAppbmRleCA2MThkYzVmZDcwNzYuLjNlYTM1NjNhMDI5YSAxMDA2NDQKLS0tIGEvZG9jcy9y ZWZlcmVuY2UvaW50ZWwtZ3B1LXRvb2xzL2ludGVsLWdwdS10b29scy1kb2NzLnhtbAorKysgYi9k b2NzL3JlZmVyZW5jZS9pbnRlbC1ncHUtdG9vbHMvaW50ZWwtZ3B1LXRvb2xzLWRvY3MueG1sCkBA IC0yNCw2ICsyNCw3IEBACiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lndF9mYi54bWwiLz4K ICAgICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvaWd0X2F1eC54bWwiLz4KICAgICA8eGk6aW5jbHVk ZSBocmVmPSJ4bWwvaWd0X2d0LnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pZ3Rf cG0ueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0ieG1sL2lvY3RsX3dyYXBwZXJzLnhtbCIv PgogICAgIDx4aTppbmNsdWRlIGhyZWY9InhtbC9pbnRlbF9iYXRjaGJ1ZmZlci54bWwiLz4KICAg ICA8eGk6aW5jbHVkZSBocmVmPSJ4bWwvaW50ZWxfY2hpcHNldC54bWwiLz4KZGlmZiAtLWdpdCBh L2xpYi9NYWtlZmlsZS5zb3VyY2VzIGIvbGliL01ha2VmaWxlLnNvdXJjZXMKaW5kZXggZTMzODYx ZTczNzU1Li4xMzE2ZmQyMWUwNDAgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzCisr KyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCkBAIC02MCw2ICs2MCw4IEBAIGxpYmludGVsX3Rvb2xz X2xhX1NPVVJDRVMgPSAJXAogCWlndF9jb3JlLmgJCVwKIAlpZ3RfZHJhdy5jCQlcCiAJaWd0X2Ry YXcuaAkJXAorCWlndF9wbS5jCQlcCisJaWd0X3BtLmgJCVwKIAl1d2lsZG1hdC91d2lsZG1hdC5o CVwKIAl1d2lsZG1hdC91d2lsZG1hdC5jCVwKIAkkKE5VTEwpCmRpZmYgLS1naXQgYS9saWIvaWd0 LmggYi9saWIvaWd0LmgKaW5kZXggM2JlMjU1MTFiYjc3Li5kNzUxZjI0MzlkZTIgMTAwNjQ0Ci0t LSBhL2xpYi9pZ3QuaAorKysgYi9saWIvaWd0LmgKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRl ICJpZ3RfZmIuaCIKICNpbmNsdWRlICJpZ3RfZ3QuaCIKICNpbmNsdWRlICJpZ3Rfa21zLmgiCisj aW5jbHVkZSAiaWd0X3BtLmgiCiAjaW5jbHVkZSAiaWd0X3N0YXRzLmgiCiAjaW5jbHVkZSAiaW5z dGRvbmUuaCIKICNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgpkaWZmIC0tZ2l0IGEvbGli L2lndF9hdXguYyBiL2xpYi9pZ3RfYXV4LmMKaW5kZXggZWJlZTExOWM0MTFkLi43ZDM1NjY2ZWI3 ZjMgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfYXV4LmMKKysrIGIvbGliL2lndF9hdXguYwpAQCAtNTks NiArNTksNyBAQAogI2luY2x1ZGUgImludGVsX3JlZy5oIgogI2luY2x1ZGUgImlvY3RsX3dyYXBw ZXJzLmgiCiAjaW5jbHVkZSAiaWd0X2ttcy5oIgorI2luY2x1ZGUgImlndF9wbS5oIgogCiAvKioK ICAqIFNFQ1RJT046aWd0X2F1eApAQCAtNTQ0LDE5ICs1NDUsNyBAQCBib29sIGlndF9zZXR1cF9y dW50aW1lX3BtKHZvaWQpCiAJaWYgKHBtX3N0YXR1c19mZCA+PSAwKQogCQlyZXR1cm4gdHJ1ZTsK IAotCS8qIFRoZSBBdWRpbyBkcml2ZXIgY2FuIGdldCBydW50aW1lIFBNIHJlZmVyZW5jZXMsIHNv IHdlIG5lZWQgdG8gbWFrZQotCSAqIHN1cmUgaXRzIHJ1bnRpbWUgUE0gaXMgZW5hYmxlZCwgc28g aXQgY2FuIHJlbGVhc2UgdGhlIHJlZnMgYW5kCi0JICogYWN0dWFsbHkgZW5hYmxlIHVzIHRvIHJ1 bnRpbWUgc3VzcGVuZC4gKi8KLQlmZCA9IG9wZW4oIi9zeXMvbW9kdWxlL3NuZF9oZGFfaW50ZWwv cGFyYW1ldGVycy9wb3dlcl9zYXZlIiwgT19XUk9OTFkpOwotCWlmIChmZCA+PSAwKSB7Ci0JCWln dF9hc3NlcnQod3JpdGUoZmQsICIxXG4iLCAyKSA9PSAyKTsKLQkJY2xvc2UoZmQpOwotCX0KLQlm ZCA9IG9wZW4oIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDA6MDMuMC9wb3dlci9jb250cm9s IiwgT19XUk9OTFkpOwotCWlmIChmZCA+PSAwKSB7Ci0JCWlndF9hc3NlcnQod3JpdGUoZmQsICJh dXRvXG4iLCA1KSA9PSA1KTsKLQkJY2xvc2UoZmQpOwotCX0KKwlpZ3RfcG1fZW5hYmxlX2F1ZGlv X3J1bnRpbWVfcG0oKTsKIAogCS8qIE91ciBpbXBsZW1lbnRhdGlvbiB1c2VzIGF1dG9zdXNwZW5k LiBUcnkgdG8gc2V0IGl0IHRvIDBtcyBzbyB0aGUgdGVzdAogCSAqIHN1aXRlIGdvZXMgZmFzdGVy IGFuZCB3ZSBoYXZlIGEgaGlnaGVyIHByb2JhYmlsaXR5IG9mIHRyaWdnZXJpbmcgcmFjZQpkaWZm IC0tZ2l0IGEvbGliL2lndF9wbS5jIGIvbGliL2lndF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMC4uYjFiNTUwM2M0MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGli L2lndF9wbS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTMsIDIw MTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5 LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5k L29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRv IHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8g dGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBh cmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBw b3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9W SURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisg KiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9G IE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFO RCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1Ig Q09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RI RVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg T1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUg U09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFBhdWxvIFphbm9uaSA8cGF1bG8uci56 YW5vbmlAaW50ZWwuY29tPgorICogICAgRGF2aWQgV2VpbmVoYWxsIDxkYXZpZC53ZWluZWhhbGxA aW50ZWwuY29tPgorICoKKyAqLworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8u aD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxz dHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lu Y2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImln dF9wbS5oIgorCitlbnVtIHsKKwlQT0xJQ1lfVU5LTk9XTiA9IC0xLAorCVBPTElDWV9NQVhfUEVS Rk9STUFOQ0UgPSAwLAorCVBPTElDWV9NRURJVU1fUE9XRVIgPSAxLAorCVBPTElDWV9NSU5fUE9X RVIgPSAyCit9OworCisjZGVmaW5lIE1BWF9QRVJGT1JNQU5DRV9TVFIJIm1heF9wZXJmb3JtYW5j ZVxuIgorI2RlZmluZSBNRURJVU1fUE9XRVJfU1RSCSJtZWRpdW1fcG93ZXJcbiIKKyNkZWZpbmUg TUlOX1BPV0VSX1NUUgkJIm1pbl9wb3dlclxuIgorLyogUmVtZW1iZXIgdG8gZml4IHRoaXMgaWYg YWRkaW5nIGxvbmdlciBzdHJpbmdzICovCisjZGVmaW5lIE1BWF9QT0xJQ1lfU1RSTEVOCXN0cmxl bihNQVhfUEVSRk9STUFOQ0VfU1RSKQorCisvKioKKyAqIFNFQ1RJT046aWd0X3BtCisgKiBAc2hv cnRfZGVzY3JpcHRpb246IFBvd2VyIE1hbmFnZW1lbnQgcmVsYXRlZCBoZWxwZXJzCisgKiBAdGl0 bGU6IFBvd2VyIE1hbmFnZW1lbnQKKyAqIEBpbmNsdWRlOiBpZ3QuaAorICoKKyAqIFRoaXMgbGli cmFyeSBwcm92aWRlcyB2YXJpb3VzIGhlbHBlcnMgdG8gZW5hYmxlIHBvd2VyIG1hbmFnZW1lbnQg Zm9yLAorICogYW5kIGluIHNvbWUgY2FzZXMgc3Vic2VxdWVudGx5IGFsbG93IHJlc3RvcmluZyB0 aGUgb2xkIGJlaGF2aW91ciBvZiwKKyAqIHZhcmlvdXMgZXh0ZXJuYWwgY29tcG9uZW50cyB0aGF0 IGJ5IGRlZmF1bHQgYXJlIHNldCB1cCBpbiBhIHdheQorICogdGhhdCBpbnRlcmZlcmVzIHdpdGgg dGhlIHRlc3Rpbmcgb2Ygb3VyIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eS4KKyAqLwor LyoqCisgKiBpZ3RfcG1fZW5hYmxlX2F1ZGlvX3J1bnRpbWVfcG06CisgKgorICogV2Uga25vdyB0 aGF0IGlmIHdlIGRvbid0IGVuYWJsZSBhdWRpbyBydW50aW1lIFBNLCBzbmRfaGRhX2ludGVsIHdp bGwgbmV2ZXIKKyAqIHJlbGVhc2UgaXRzIHBvd2VyIHdlbGwgcmVmY291bnQsIGFuZCB3ZSdsbCBu ZXZlciByZWFjaCB0aGUgTFBTUCBzdGF0ZS4KKyAqIFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQg aXQgd2lsbCByZWxlYXNlIHRoZSBwb3dlciB3ZWxsIGlmIHdlIGVuYWJsZQorICogcnVudGltZSBQ TSwgYnV0IGF0IGxlYXN0IHdlIGNhbiB0cnkuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgYXNz ZXJ0aW9ucyBvbiBvcGVuIHNpbmNlIHRoZSB1c2VyIG1heSBub3QgZXZlbiBoYXZlCisgKiBzbmRf aGRhX2ludGVsIGxvYWRlZCwgd2hpY2ggaXMgbm90IGEgcHJvYmxlbS4KKyAqLwordm9pZCBpZ3Rf cG1fZW5hYmxlX2F1ZGlvX3J1bnRpbWVfcG0odm9pZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IG9w ZW4oIi9zeXMvbW9kdWxlL3NuZF9oZGFfaW50ZWwvcGFyYW1ldGVycy9wb3dlcl9zYXZlIiwgT19X Uk9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWlndF9hc3NlcnRfZXEod3JpdGUoZmQsICIxXG4i LCAyKSwgMik7CisJCWNsb3NlKGZkKTsKKwl9CisJZmQgPSBvcGVuKCIvc3lzL2J1cy9wY2kvZGV2 aWNlcy8wMDAwOjAwOjAzLjAvcG93ZXIvY29udHJvbCIsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPj0g MCkgeworCQlpZ3RfYXNzZXJ0X2VxKHdyaXRlKGZkLCAiYXV0b1xuIiwgNSksIDUpOworCQljbG9z ZShmZCk7CisJfQorCS8qIEdpdmUgc29tZSB0aW1lIGZvciBpdCB0byByZWFjdC4gKi8KKwlzbGVl cCgxKTsKK30KKworLyoqCisgKiBpZ3RfcG1fZW5hYmxlX3NhdGFfbGlua19wb3dlcl9tYW5hZ2Vt ZW50OgorICoKKyAqIEVuYWJsZSB0aGUgbWluX3Bvd2VyIHBvbGljeSBmb3IgU0FUQSBsaW5rIHBv d2VyIG1hbmFnZW1lbnQuCisgKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlYWNoIGRlZXAgcnVu dGltZSBwb3dlciBzdGF0ZXMuCisgKgorICogV2UgZG9uJ3QgaGF2ZSBhbnkgYXNzZXJ0aW9ucyBv biBvcGVuIHNpbmNlIHRoZSBzeXN0ZW0gbWlnaHQgbm90IGhhdmUKKyAqIGEgU0FUQSBob3N0Lgor ICoKKyAqIFJldHVybnM6CisgKiBBbiBvcGFxdWUgcG9pbnRlciB0byB0aGUgZGF0YSBuZWVkZWQg dG8gcmVzdG9yZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAqIGFmdGVyIHRoZSB0ZXN0IGhhcyB0ZXJt aW5hdGVkLCBvciBOVUxMIGlmIFNBVEEgbGluayBwb3dlciBtYW5hZ2VtZW50CisgKiBpcyBub3Qg c3VwcG9ydGVkLiBUaGlzIHBvaW50ZXIgc2hvdWxkIGJlIGZyZWVkIHdoZW4gbm8gbG9uZ2VyIHVz ZWQKKyAqICh0eXBpY2FsbHkgYWZ0ZXIgaGF2aW5nIGNhbGxlZCByZXN0b3JlX3NhdGFfbGlua19w b3dlcl9tYW5hZ2VtZW50KCkpLgorICovCitpbnQ4X3QgKmlndF9wbV9lbmFibGVfc2F0YV9saW5r X3Bvd2VyX21hbmFnZW1lbnQodm9pZCkKK3sKKwlpbnQgZmQsIGk7CisJc3NpemVfdCBsZW47CisJ Y2hhciAqYnVmOworCWNoYXIgKmZpbGVfbmFtZTsKKwlpbnQ4X3QgKmxpbmtfcG1fcG9saWNpZXMg PSBOVUxMOworCisJZmlsZV9uYW1lID0gbWFsbG9jKFBBVEhfTUFYKTsKKwlidWYgPSBtYWxsb2Mo TUFYX1BPTElDWV9TVFJMRU4gKyAxKTsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCWludDhf dCBwb2xpY3k7CisKKwkJc25wcmludGYoZmlsZV9uYW1lLCBQQVRIX01BWCwKKwkJCSAiL3N5cy9j bGFzcy9zY3NpX2hvc3QvaG9zdCVkL2xpbmtfcG93ZXJfbWFuYWdlbWVudF9wb2xpY3kiLAorCQkJ IGkpOworCisJCWZkID0gb3BlbihmaWxlX25hbWUsIE9fUkRXUik7CisJCWlmIChmZCA8IDApCisJ CQlicmVhazsKKworCQlsZW4gPSByZWFkKGZkLCBidWYsIE1BWF9QT0xJQ1lfU1RSTEVOKTsKKwkJ YnVmW2xlbl0gPSAnXDAnOworCisJCWlmICghc3RybmNtcChNQVhfUEVSRk9STUFOQ0VfU1RSLCBi dWYsCisJCQkgICAgIHN0cmxlbihNQVhfUEVSRk9STUFOQ0VfU1RSKSkpCisJCQlwb2xpY3kgPSBQ T0xJQ1lfTUFYX1BFUkZPUk1BTkNFOworCQllbHNlIGlmICghc3RybmNtcChNRURJVU1fUE9XRVJf U1RSLCBidWYsCisJCQkJICBzdHJsZW4oTUVESVVNX1BPV0VSX1NUUikpKQorCQkJcG9saWN5ID0g UE9MSUNZX01FRElVTV9QT1dFUjsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoTUlOX1BPV0VSX1NUUiwg YnVmLAorCQkJCSAgc3RybGVuKE1JTl9QT1dFUl9TVFIpKSkKKwkJCXBvbGljeSA9IFBPTElDWV9N SU5fUE9XRVI7CisJCWVsc2UKKwkJCXBvbGljeSA9IFBPTElDWV9VTktOT1dOOworCisJCWlmICgh KGkgJSAyNTYpKQorCQkJbGlua19wbV9wb2xpY2llcyA9IHJlYWxsb2MobGlua19wbV9wb2xpY2ll cywKKwkJCQkJCSAgIChpIC8gMjU2ICsgMSkgKiAyNTYgKyAxKTsKKworCQlsaW5rX3BtX3BvbGlj aWVzW2ldID0gcG9saWN5OworCQlsaW5rX3BtX3BvbGljaWVzW2kgKyAxXSA9IDA7CisKKwkJLyog SWYgdGhlIHBvbGljeSBpcyBzb21ldGhpbmcgd2UgZG9uJ3Qga25vdyBhYm91dCwKKwkJICogZG9u J3QgdG91Y2ggaXQsIHNpbmNlIHdlIG1pZ2h0IHBvdGVudGlhbGx5IGJyZWFrIHRoaW5ncy4KKwkJ ICogQW5kIHdlIG9idmlvdXNseSBkb24ndCBuZWVkIHRvIHRvdWNoIGFueXRoaW5nIGlmIHRoZQor CQkgKiBzZXR0aW5nIGlzIGFscmVhZHkgY29ycmVjdC4uLgorCQkgKi8KKwkJaWYgKHBvbGljeSAh PSBQT0xJQ1lfVU5LTk9XTiAmJgorCQkgICAgcG9saWN5ICE9IFBPTElDWV9NSU5fUE9XRVIpIHsK KwkJCWxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisJCQlpZ3RfYXNzZXJ0X2VxKHdyaXRlKGZkLCBN SU5fUE9XRVJfU1RSLAorCQkJCQkgICAgc3RybGVuKE1JTl9QT1dFUl9TVFIpKSwKKwkJCQkgICAg ICBzdHJsZW4oTUlOX1BPV0VSX1NUUikpOworCQl9CisJCWNsb3NlKGZkKTsKKwl9CisJZnJlZShi dWYpOworCWZyZWUoZmlsZV9uYW1lKTsKKworCXJldHVybiBsaW5rX3BtX3BvbGljaWVzOworfQor CisvKioKKyAqIGlndF9wbV9yZXN0b3JlX3NhdGFfbGlua19wb3dlcl9tYW5hZ2VtZW50OgorICog QHBtX2RhdGE6IEFuIG9wYXF1ZSBwb2ludGVyIHdpdGggc2F2ZWQgbGluayBQTSBwb2xpY2llczsK KyAqICAgICAgICAgICBJZiBOVUxMIGlzIHBhc3NlZCB3ZSBmb3JjZSBlbmFibGUgdGhlICJtYXhf cGVyZm9ybWFuY2UiIHBvbGljeS4KKyAqCisgKiBSZXN0b3JlIHRoZSBsaW5rIHBvd2VyIG1hbmFn ZW1lbnQgcG9saWNpZXMgdG8gdGhlIHZhbHVlcworICogcHJpb3IgdG8gZW5hYmxpbmcgbWluX3Bv d2VyLgorICoKKyAqIENhdmVhdDogSWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBob3RwbHVnZ2luZyBh bmQgaG90cGx1Z2dpbmcgdGFrZXMKKyAqICAgICAgICAgcGxhY2UgZHVyaW5nIG91ciB0ZXN0aW5n IHNvIHRoYXQgdGhlIGhvc3RzIGNoYW5nZSBudW1iZXJzCisgKiAgICAgICAgIHdlIG1pZ2h0IHJl c3RvcmUgdGhlIHNldHRpbmdzIHRvIHRoZSB3cm9uZyBob3N0cy4KKyAqLwordm9pZCBpZ3RfcG1f cmVzdG9yZV9zYXRhX2xpbmtfcG93ZXJfbWFuYWdlbWVudChpbnQ4X3QgKnBtX2RhdGEpCit7CisJ aW50IGZkLCBpOworCWNoYXIgKmZpbGVfbmFtZTsKKworCS8qIERpc2sgcnVudGltZSBQTSBwb2xp Y2llcy4gKi8KKwlmaWxlX25hbWUgPSBtYWxsb2MoUEFUSF9NQVgpOworCWZvciAoaSA9IDA7IDsg aSsrKSB7CisJCWludDhfdCBwb2xpY3k7CisKKwkJaWYgKCFwbV9kYXRhKQorCQkJcG9saWN5ID0g UE9MSUNZX01BWF9QRVJGT1JNQU5DRTsKKwkJZWxzZSBpZiAocG1fZGF0YVtpXSA9PSBQT0xJQ1lf VU5LTk9XTikKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlwb2xpY3kgPSBwbV9kYXRhW2ldOwor CisJCXNucHJpbnRmKGZpbGVfbmFtZSwgUEFUSF9NQVgsCisJCQkgIi9zeXMvY2xhc3Mvc2NzaV9o b3N0L2hvc3QlZC9saW5rX3Bvd2VyX21hbmFnZW1lbnRfcG9saWN5IiwKKwkJCSBpKTsKKworCQlm ZCA9IG9wZW4oZmlsZV9uYW1lLCBPX1dST05MWSk7CisJCWlmIChmZCA8IDApCisJCQlicmVhazsK KworCQlzd2l0Y2ggKHBvbGljeSkgeworCQlkZWZhdWx0OgorCQljYXNlIFBPTElDWV9NQVhfUEVS Rk9STUFOQ0U6CisJCQlpZ3RfYXNzZXJ0X2VxKHdyaXRlKGZkLCBNQVhfUEVSRk9STUFOQ0VfU1RS LAorCQkJCQkgICAgc3RybGVuKE1BWF9QRVJGT1JNQU5DRV9TVFIpKSwKKwkJCQkgICAgICBzdHJs ZW4oTUFYX1BFUkZPUk1BTkNFX1NUUikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT0xJQ1lfTUVE SVVNX1BPV0VSOgorCQkJaWd0X2Fzc2VydF9lcSh3cml0ZShmZCwgTUVESVVNX1BPV0VSX1NUUiwK KwkJCQkJICAgIHN0cmxlbihNRURJVU1fUE9XRVJfU1RSKSksCisJCQkJICAgICAgc3RybGVuKE1F RElVTV9QT1dFUl9TVFIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9MSUNZX01JTl9QT1dFUjoK KwkJCWlndF9hc3NlcnRfZXEod3JpdGUoZmQsIE1JTl9QT1dFUl9TVFIsCisJCQkJCSAgICBzdHJs ZW4oTUlOX1BPV0VSX1NUUikpLAorCQkJCSAgICAgIHN0cmxlbihNSU5fUE9XRVJfU1RSKSk7CisJ CQlicmVhazsKKwkJfQorCisJCWNsb3NlKGZkKTsKKwl9CisJZnJlZShmaWxlX25hbWUpOworfQpk aWZmIC0tZ2l0IGEvbGliL2lndF9wbS5oIGIvbGliL2lndF9wbS5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYzE0ZmYxZjdhMGVmCi0tLSAvZGV2L251bGwKKysrIGIv bGliL2lndF9wbS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBJ bnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZy ZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMg c29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2Fy ZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5j bHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1v ZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Ig c2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdy YXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRp b25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVE ICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVS Q0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZ UklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgor ICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBP VEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEgg VEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZU V0FSRS4KKyAqLworCisjaWZuZGVmIElHVF9QTV9ICisjZGVmaW5lIElHVF9QTV9ICisKK3ZvaWQg aWd0X3BtX2VuYWJsZV9hdWRpb19ydW50aW1lX3BtKHZvaWQpOworaW50OF90ICppZ3RfcG1fZW5h YmxlX3NhdGFfbGlua19wb3dlcl9tYW5hZ2VtZW50KHZvaWQpOwordm9pZCBpZ3RfcG1fcmVzdG9y ZV9zYXRhX2xpbmtfcG93ZXJfbWFuYWdlbWVudChpbnQ4X3QgKnBtX2RhdGEpOworCisjZW5kaWYg LyogSUdUX1BNX0ggKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL3BtX2xwc3AuYyBiL3Rlc3RzL3BtX2xw c3AuYwppbmRleCBhODI0MjBiZjA2ZGUuLjRjZWRlZmZmYjU0NSAxMDA2NDQKLS0tIGEvdGVzdHMv cG1fbHBzcC5jCisrKyBiL3Rlc3RzL3BtX2xwc3AuYwpAQCAtMzEsMjkgKzMxLDYgQEAKICNpbmNs dWRlIDx1bmlzdGQuaD4KIAogCi0vKiBXZSBrbm93IHRoYXQgaWYgd2UgZG9uJ3QgZW5hYmxlIGF1 ZGlvIHJ1bnRpbWUgUE0sIHNuZF9oZGFfaW50ZWwgd2lsbCBuZXZlcgotICogcmVsZWFzZSBpdHMg cG93ZXIgd2VsbCByZWZjb3VudCwgYW5kIHdlJ2xsIG5ldmVyIHJlYWNoIHRoZSBMUFNQIHNhdGUu IE9UT0gKLSAqIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCByZWxlYXNlIHRoZSBw b3dlciB3ZWxsIGlmIHdlIGVuYWJsZSBydW50aW1lCi0gKiBQTSwgYnV0IGF0IGxlYXN0IHdlIGNh biB0cnkuICBXZSBkb24ndCBoYXZlIGFueSBhc3NlcnRpb25zIHNpbmNlIHRoZSB1c2VyIG1heQot ICogbm90IGV2ZW4gaGF2ZSBzbmRfaGRhX2ludGVsIGxvYWRlZCwgd2hpY2ggaXMgbm90IGEgcHJv YmxlbS4gKi8KLXN0YXRpYyB2b2lkIGRpc2FibGVfYXVkaW9fcnVudGltZV9wbSh2b2lkKQotewot CWludCBmZDsKLQotCWZkID0gb3BlbigiL3N5cy9tb2R1bGUvc25kX2hkYV9pbnRlbC9wYXJhbWV0 ZXJzL3Bvd2VyX3NhdmUiLCBPX1dST05MWSk7Ci0JaWYgKGZkID49IDApIHsKLQkJaWd0X2Fzc2Vy dF9lcSh3cml0ZShmZCwgIjFcbiIsIDIpLCAyKTsKLQkJY2xvc2UoZmQpOwotCX0KLQlmZCA9IG9w ZW4oIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDA6MDMuMC9wb3dlci9jb250cm9sIiwgT19X Uk9OTFkpOwotCWlmIChmZCA+PSAwKSB7Ci0JCWlndF9hc3NlcnRfZXEod3JpdGUoZmQsICJhdXRv XG4iLCA1KSwgNSk7Ci0JCWNsb3NlKGZkKTsKLQl9Ci0JLyogR2l2ZSBzb21lIHRpbWUgZm9yIGl0 IHRvIHJlYWN0LiAqLwotCXNsZWVwKDEpOwotfQotCiBzdGF0aWMgYm9vbCBzdXBwb3J0c19scHNw KHVpbnQzMl90IGRldmlkKQogewogCXJldHVybiBJU19IQVNXRUxMKGRldmlkKSB8fCBJU19CUk9B RFdFTEwoZGV2aWQpOwpAQCAtMjI3LDcgKzIwNCw3IEBAIGlndF9tYWluCiAJCQlkcm1fY29ubmVj dG9yc1tpXSA9IGRybU1vZGVHZXRDb25uZWN0b3JDdXJyZW50KGRybV9mZCwKIAkJCQkJCQlkcm1f cmVzLT5jb25uZWN0b3JzW2ldKTsKIAotCQlkaXNhYmxlX2F1ZGlvX3J1bnRpbWVfcG0oKTsKKwkJ aWd0X3BtX2VuYWJsZV9hdWRpb19ydW50aW1lX3BtKCk7CiAKIAkJaWd0X3JlcXVpcmUoc3VwcG9y dHNfbHBzcChkZXZpZCkpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9wbV9ycG0uYyBiL3Rlc3RzL3Bt X3JwbS5jCmluZGV4IDIyZGMyYjRkNmRlNC4uMmFhNmMxMDE4YWEyIDEwMDY0NAotLS0gYS90ZXN0 cy9wbV9ycG0uYworKysgYi90ZXN0cy9wbV9ycG0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBD b3B5cmlnaHQgwqkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMTMs IDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKQEAgLTEwOSw2ICsxMDksOCBAQCBzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgbHBz cF9tb2RlX3BhcmFtczsKIHN0cnVjdCBtb2Rlc2V0X3BhcmFtcyBub25fbHBzcF9tb2RlX3BhcmFt czsKIHN0cnVjdCBtb2Rlc2V0X3BhcmFtcyAqZGVmYXVsdF9tb2RlX3BhcmFtczsKIAorc3RhdGlj IGludDhfdCAqcG1fZGF0YSA9IE5VTEw7CisKIC8qIElmIHRoZSByZWFkIGZhaWxzLCB0aGVuIHRo ZSBtYWNoaW5lIGRvZXNuJ3Qgc3VwcG9ydCBQQzgrIHJlc2lkZW5jaWVzLiAqLwogc3RhdGljIGJv b2wgc3VwcG9ydHNfcGM4X3BsdXNfcmVzaWRlbmNpZXModm9pZCkKIHsKQEAgLTY4NSw0MSArNjg3 LDEzIEBAIHN0YXRpYyB2b2lkIHNldHVwX3BjOCh2b2lkKQogCWhhc19wYzggPSB0cnVlOwogfQog Ci0vKiBJZiB3ZSB3YW50IHRvIGFjdHVhbGx5IHJlYWNoIFBDOCsgc3RhdGVzLCB3ZSBuZWVkIHRv IHByb3Blcmx5IGNvbmZpZ3VyZSBhbGwKLSAqIHRoZSBkZXZpY2VzIG9uIHRoZSBzeXN0ZW0gdG8g YWxsb3cgdGhpcy4gVGhpcyBmdW5jdGlvbiB3aWxsIHRyeSB0byBzZXR1cCB0aGUKLSAqIHRoaW5n cyB3ZSBrbm93IHdlIG5lZWQsIGJ1dCB3b24ndCBzY3JlYW0gaW4gY2FzZSBhbnl0aGluZyBmYWls czogd2UgZG9uJ3QKLSAqIGtub3cgd2hpY2ggZGV2aWNlcyBhcmUgcHJlc2VudCBvbiB5b3VyIG1h Y2hpbmUsIHNvIHdlIGNhbid0IHJlYWxseSBleHBlY3QKLSAqIGFueXRoaW5nLCBqdXN0IHRyeSB0 byBoZWxwIHdpdGggdGhlIG1vcmUgY29tbW9uIHByb2JsZW1zLiAqLwotc3RhdGljIHZvaWQgc2V0 dXBfbm9uX2dyYXBoaWNzX3J1bnRpbWVfcG0odm9pZCkKLXsKLQlpbnQgZmQsIGk7Ci0JY2hhciAq ZmlsZV9uYW1lOwotCi0JLyogRGlzayBydW50aW1lIFBNIHBvbGljaWVzLiAqLwotCWZpbGVfbmFt ZSA9IG1hbGxvYyhQQVRIX01BWCk7Ci0JZm9yIChpID0gMDsgOyBpKyspIHsKLQotCQlzbnByaW50 ZihmaWxlX25hbWUsIFBBVEhfTUFYLAotCQkJICIvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0JWQv bGlua19wb3dlcl9tYW5hZ2VtZW50X3BvbGljeSIsCi0JCQkgaSk7Ci0KLQkJZmQgPSBvcGVuKGZp bGVfbmFtZSwgT19XUk9OTFkpOwotCQlpZiAoZmQgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWd0X2Fz c2VydCh3cml0ZShmZCwgIm1pbl9wb3dlclxuIiwgMTApID09IDEwKTsKLQkJY2xvc2UoZmQpOwot CX0KLQlmcmVlKGZpbGVfbmFtZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNldHVwX2Vudmlyb25tZW50 KHZvaWQpCiB7CiAJZHJtX2ZkID0gZHJtX29wZW5fZHJpdmVyX21hc3RlcihEUklWRVJfSU5URUwp OwogCiAJaW5pdF9tb2RlX3NldF9kYXRhKCZtc19kYXRhKTsKIAotCXNldHVwX25vbl9ncmFwaGlj c19ydW50aW1lX3BtKCk7CisJcG1fZGF0YSA9IGlndF9wbV9lbmFibGVfc2F0YV9saW5rX3Bvd2Vy X21hbmFnZW1lbnQoKTsKIAogCWhhc19ydW50aW1lX3BtID0gaWd0X3NldHVwX3J1bnRpbWVfcG0o KTsKIAlzZXR1cF9wYzgoKTsKQEAgLTcyOCwxMSArNzAyLDE3IEBAIHN0YXRpYyB2b2lkIHNldHVw X2Vudmlyb25tZW50KHZvaWQpCiAJaWd0X2luZm8oIlBDOCByZXNpZGVuY3kgc3VwcG9ydDogJWRc biIsIGhhc19wYzgpOwogCiAJaWd0X3JlcXVpcmUoaGFzX3J1bnRpbWVfcG0pOworfQogCitzdGF0 aWMgdm9pZCByZXN0b3JlX2Vudmlyb25tZW50KHZvaWQpCit7CisJaWd0X3BtX3Jlc3RvcmVfc2F0 YV9saW5rX3Bvd2VyX21hbmFnZW1lbnQocG1fZGF0YSk7CisJZnJlZShwbV9kYXRhKTsKIH0KIAog c3RhdGljIHZvaWQgdGVhcmRvd25fZW52aXJvbm1lbnQodm9pZCkKIHsKKwlyZXN0b3JlX2Vudmly b25tZW50KCk7CiAJZmluaV9tb2RlX3NldF9kYXRhKCZtc19kYXRhKTsKIAlkcm1DbG9zZShkcm1f ZmQpOwogCWNsb3NlKG1zcl9mZCk7Ci0tIAoyLjcuMAoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==