From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id DD3702129DBA5 for ; Mon, 17 Jun 2019 05:28:08 -0700 (PDT) From: Christoph Hellwig Subject: [PATCH 12/25] memremap: remove the data field in struct dev_pagemap Date: Mon, 17 Jun 2019 14:27:20 +0200 Message-Id: <20190617122733.22432-13-hch@lst.de> In-Reply-To: <20190617122733.22432-1-hch@lst.de> References: <20190617122733.22432-1-hch@lst.de> MIME-Version: 1.0 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-mm@kvack.org, nouveau@lists.freedesktop.org List-ID: struct dev_pagemap is always embedded into a containing structure, so there is no need to an additional private data field. Signed-off-by: Christoph Hellwig Reviewed-by: Jason Gunthorpe --- drivers/nvdimm/pmem.c | 2 +- include/linux/memremap.h | 3 +-- kernel/memremap.c | 2 +- mm/hmm.c | 9 +++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 85364c59c607..1ff4b1c4c7c3 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -342,7 +342,7 @@ static void pmem_release_disk(void *__pmem) put_disk(pmem->disk); } -static void pmem_pagemap_page_free(struct page *page, void *data) +static void pmem_pagemap_page_free(struct page *page) { wake_up_var(&page->_refcount); } diff --git a/include/linux/memremap.h b/include/linux/memremap.h index 72a8a1a9303b..036c637f0150 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -69,7 +69,7 @@ struct dev_pagemap_ops { * reach 0 refcount unless there is a refcount bug. This allows the * device driver to implement its own memory management.) */ - void (*page_free)(struct page *page, void *data); + void (*page_free)(struct page *page); /* * Transition the refcount in struct dev_pagemap to the dead state. @@ -104,7 +104,6 @@ struct dev_pagemap { struct resource res; struct percpu_ref *ref; struct device *dev; - void *data; enum memory_type type; u64 pci_p2pdma_bus_offset; const struct dev_pagemap_ops *ops; diff --git a/kernel/memremap.c b/kernel/memremap.c index 5245c25b10e3..9dd5ccdb1adb 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -379,7 +379,7 @@ void __put_devmap_managed_page(struct page *page) mem_cgroup_uncharge(page); - page->pgmap->ops->page_free(page, page->pgmap->data); + page->pgmap->ops->page_free(page); } else if (!count) __put_page(page); } diff --git a/mm/hmm.c b/mm/hmm.c index 2e5642dc6b04..8a0e04bbeee6 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -1365,15 +1365,17 @@ static void hmm_devmem_ref_kill(struct dev_pagemap *pgmap) static vm_fault_t hmm_devmem_migrate_to_ram(struct vm_fault *vmf) { - struct hmm_devmem *devmem = vmf->page->pgmap->data; + struct hmm_devmem *devmem = + container_of(vmf->page->pgmap, struct hmm_devmem, pagemap); return devmem->ops->fault(devmem, vmf->vma, vmf->address, vmf->page, vmf->flags, vmf->pmd); } -static void hmm_devmem_free(struct page *page, void *data) +static void hmm_devmem_free(struct page *page) { - struct hmm_devmem *devmem = data; + struct hmm_devmem *devmem = + container_of(page->pgmap, struct hmm_devmem, pagemap); devmem->ops->free(devmem, page); } @@ -1439,7 +1441,6 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, devmem->pagemap.ops = &hmm_pagemap_ops; devmem->pagemap.altmap_valid = false; devmem->pagemap.ref = &devmem->ref; - devmem->pagemap.data = devmem; result = devm_memremap_pages(devmem->device, &devmem->pagemap); if (IS_ERR(result)) -- 2.20.1 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C0F0CC31E58 for ; Mon, 17 Jun 2019 12:29:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 947502087F for ; Mon, 17 Jun 2019 12:29:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="UAicujz/" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728358AbfFQM3O (ORCPT ); Mon, 17 Jun 2019 08:29:14 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:42686 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727938AbfFQM2J (ORCPT ); Mon, 17 Jun 2019 08:28:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=CCDpYq0cfPU5A/VTH+xsLw5c5i/G2uDb/EZi5JVjZA8=; b=UAicujz/YVlKK+WKFtiONSPd4O BJKs+xmHpssspGq3McquTV8vbga/nq3/q1eYBDV/EH8jgE9LbrEuhITcWWrtX4KP6gedHj21lXM7L fzIbsm/SnlwB5scY8jKHVKMRjExJvc6f+ggr7aJhlVwN6hXtbnw63NYAfc9m0pXlk8SqqOqvuwn91 oYdNf/bAVgS250D/KEXwGQLD+OIK8ngJNhKbAwHIwdznpPM3aCF9/hjhYag8FTwDYhgM5z8nMN0Hi BlsdruuEUAfUs3Ea4mKWmZ+OnZ3IAaE4JeL3zAlMq/tZkvynJuq+HxmOnhFK3av+Yv/7+kxYzEjYc bP3Y7R/w==; Received: from clnet-p19-102.ikbnet.co.at ([83.175.77.102] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1hcqjz-0000Cf-UU; Mon, 17 Jun 2019 12:28:04 +0000 From: Christoph Hellwig To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-mm@kvack.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 12/25] memremap: remove the data field in struct dev_pagemap Date: Mon, 17 Jun 2019 14:27:20 +0200 Message-Id: <20190617122733.22432-13-hch@lst.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190617122733.22432-1-hch@lst.de> References: <20190617122733.22432-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org struct dev_pagemap is always embedded into a containing structure, so there is no need to an additional private data field. Signed-off-by: Christoph Hellwig Reviewed-by: Jason Gunthorpe --- drivers/nvdimm/pmem.c | 2 +- include/linux/memremap.h | 3 +-- kernel/memremap.c | 2 +- mm/hmm.c | 9 +++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 85364c59c607..1ff4b1c4c7c3 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -342,7 +342,7 @@ static void pmem_release_disk(void *__pmem) put_disk(pmem->disk); } -static void pmem_pagemap_page_free(struct page *page, void *data) +static void pmem_pagemap_page_free(struct page *page) { wake_up_var(&page->_refcount); } diff --git a/include/linux/memremap.h b/include/linux/memremap.h index 72a8a1a9303b..036c637f0150 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -69,7 +69,7 @@ struct dev_pagemap_ops { * reach 0 refcount unless there is a refcount bug. This allows the * device driver to implement its own memory management.) */ - void (*page_free)(struct page *page, void *data); + void (*page_free)(struct page *page); /* * Transition the refcount in struct dev_pagemap to the dead state. @@ -104,7 +104,6 @@ struct dev_pagemap { struct resource res; struct percpu_ref *ref; struct device *dev; - void *data; enum memory_type type; u64 pci_p2pdma_bus_offset; const struct dev_pagemap_ops *ops; diff --git a/kernel/memremap.c b/kernel/memremap.c index 5245c25b10e3..9dd5ccdb1adb 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -379,7 +379,7 @@ void __put_devmap_managed_page(struct page *page) mem_cgroup_uncharge(page); - page->pgmap->ops->page_free(page, page->pgmap->data); + page->pgmap->ops->page_free(page); } else if (!count) __put_page(page); } diff --git a/mm/hmm.c b/mm/hmm.c index 2e5642dc6b04..8a0e04bbeee6 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -1365,15 +1365,17 @@ static void hmm_devmem_ref_kill(struct dev_pagemap *pgmap) static vm_fault_t hmm_devmem_migrate_to_ram(struct vm_fault *vmf) { - struct hmm_devmem *devmem = vmf->page->pgmap->data; + struct hmm_devmem *devmem = + container_of(vmf->page->pgmap, struct hmm_devmem, pagemap); return devmem->ops->fault(devmem, vmf->vma, vmf->address, vmf->page, vmf->flags, vmf->pmd); } -static void hmm_devmem_free(struct page *page, void *data) +static void hmm_devmem_free(struct page *page) { - struct hmm_devmem *devmem = data; + struct hmm_devmem *devmem = + container_of(page->pgmap, struct hmm_devmem, pagemap); devmem->ops->free(devmem, page); } @@ -1439,7 +1441,6 @@ struct hmm_devmem *hmm_devmem_add(const struct hmm_devmem_ops *ops, devmem->pagemap.ops = &hmm_pagemap_ops; devmem->pagemap.altmap_valid = false; devmem->pagemap.ref = &devmem->ref; - devmem->pagemap.data = devmem; result = devm_memremap_pages(devmem->device, &devmem->pagemap); if (IS_ERR(result)) -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 12/25] memremap: remove the data field in struct dev_pagemap Date: Mon, 17 Jun 2019 14:27:20 +0200 Message-ID: <20190617122733.22432-13-hch@lst.de> References: <20190617122733.22432-1-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190617122733.22432-1-hch-jcswGhMUV9g@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org c3RydWN0IGRldl9wYWdlbWFwIGlzIGFsd2F5cyBlbWJlZGRlZCBpbnRvIGEgY29udGFpbmluZyBz dHJ1Y3R1cmUsIHNvCnRoZXJlIGlzIG5vIG5lZWQgdG8gYW4gYWRkaXRpb25hbCBwcml2YXRlIGRh dGEgZmllbGQuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4K UmV2aWV3ZWQtYnk6IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4KLS0tCiBkcml2 ZXJzL252ZGltbS9wbWVtLmMgICAgfCAyICstCiBpbmNsdWRlL2xpbnV4L21lbXJlbWFwLmggfCAz ICstLQoga2VybmVsL21lbXJlbWFwLmMgICAgICAgIHwgMiArLQogbW0vaG1tLmMgICAgICAgICAg ICAgICAgIHwgOSArKysrKy0tLS0KIDQgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCA4 IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL3BtZW0uYyBiL2RyaXZl cnMvbnZkaW1tL3BtZW0uYwppbmRleCA4NTM2NGM1OWM2MDcuLjFmZjRiMWM0YzdjMyAxMDA2NDQK LS0tIGEvZHJpdmVycy9udmRpbW0vcG1lbS5jCisrKyBiL2RyaXZlcnMvbnZkaW1tL3BtZW0uYwpA QCAtMzQyLDcgKzM0Miw3IEBAIHN0YXRpYyB2b2lkIHBtZW1fcmVsZWFzZV9kaXNrKHZvaWQgKl9f cG1lbSkKIAlwdXRfZGlzayhwbWVtLT5kaXNrKTsKIH0KIAotc3RhdGljIHZvaWQgcG1lbV9wYWdl bWFwX3BhZ2VfZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lk IHBtZW1fcGFnZW1hcF9wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJd2FrZV91cF92 YXIoJnBhZ2UtPl9yZWZjb3VudCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXJl bWFwLmggYi9pbmNsdWRlL2xpbnV4L21lbXJlbWFwLmgKaW5kZXggNzJhOGExYTkzMDNiLi4wMzZj NjM3ZjAxNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcmVtYXAuaAorKysgYi9pbmNs dWRlL2xpbnV4L21lbXJlbWFwLmgKQEAgLTY5LDcgKzY5LDcgQEAgc3RydWN0IGRldl9wYWdlbWFw X29wcyB7CiAJICogcmVhY2ggMCByZWZjb3VudCB1bmxlc3MgdGhlcmUgaXMgYSByZWZjb3VudCBi dWcuIFRoaXMgYWxsb3dzIHRoZQogCSAqIGRldmljZSBkcml2ZXIgdG8gaW1wbGVtZW50IGl0cyBv d24gbWVtb3J5IG1hbmFnZW1lbnQuKQogCSAqLwotCXZvaWQgKCpwYWdlX2ZyZWUpKHN0cnVjdCBw YWdlICpwYWdlLCB2b2lkICpkYXRhKTsKKwl2b2lkICgqcGFnZV9mcmVlKShzdHJ1Y3QgcGFnZSAq cGFnZSk7CiAKIAkvKgogCSAqIFRyYW5zaXRpb24gdGhlIHJlZmNvdW50IGluIHN0cnVjdCBkZXZf cGFnZW1hcCB0byB0aGUgZGVhZCBzdGF0ZS4KQEAgLTEwNCw3ICsxMDQsNiBAQCBzdHJ1Y3QgZGV2 X3BhZ2VtYXAgewogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IHBlcmNwdV9yZWYgKnJl ZjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jdm9pZCAqZGF0YTsKIAllbnVtIG1lbW9yeV90eXBl IHR5cGU7CiAJdTY0IHBjaV9wMnBkbWFfYnVzX29mZnNldDsKIAljb25zdCBzdHJ1Y3QgZGV2X3Bh Z2VtYXBfb3BzICpvcHM7CmRpZmYgLS1naXQgYS9rZXJuZWwvbWVtcmVtYXAuYyBiL2tlcm5lbC9t ZW1yZW1hcC5jCmluZGV4IDUyNDVjMjViMTBlMy4uOWRkNWNjZGIxYWRiIDEwMDY0NAotLS0gYS9r ZXJuZWwvbWVtcmVtYXAuYworKysgYi9rZXJuZWwvbWVtcmVtYXAuYwpAQCAtMzc5LDcgKzM3OSw3 IEBAIHZvaWQgX19wdXRfZGV2bWFwX21hbmFnZWRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIAog CQltZW1fY2dyb3VwX3VuY2hhcmdlKHBhZ2UpOwogCi0JCXBhZ2UtPnBnbWFwLT5vcHMtPnBhZ2Vf ZnJlZShwYWdlLCBwYWdlLT5wZ21hcC0+ZGF0YSk7CisJCXBhZ2UtPnBnbWFwLT5vcHMtPnBhZ2Vf ZnJlZShwYWdlKTsKIAl9IGVsc2UgaWYgKCFjb3VudCkKIAkJX19wdXRfcGFnZShwYWdlKTsKIH0K ZGlmZiAtLWdpdCBhL21tL2htbS5jIGIvbW0vaG1tLmMKaW5kZXggMmU1NjQyZGM2YjA0Li44YTBl MDRiYmVlZTYgMTAwNjQ0Ci0tLSBhL21tL2htbS5jCisrKyBiL21tL2htbS5jCkBAIC0xMzY1LDE1 ICsxMzY1LDE3IEBAIHN0YXRpYyB2b2lkIGhtbV9kZXZtZW1fcmVmX2tpbGwoc3RydWN0IGRldl9w YWdlbWFwICpwZ21hcCkKIAogc3RhdGljIHZtX2ZhdWx0X3QgaG1tX2Rldm1lbV9taWdyYXRlX3Rv X3JhbShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKLQlzdHJ1Y3QgaG1tX2Rldm1lbSAqZGV2bWVt ID0gdm1mLT5wYWdlLT5wZ21hcC0+ZGF0YTsKKwlzdHJ1Y3QgaG1tX2Rldm1lbSAqZGV2bWVtID0K KwkJY29udGFpbmVyX29mKHZtZi0+cGFnZS0+cGdtYXAsIHN0cnVjdCBobW1fZGV2bWVtLCBwYWdl bWFwKTsKIAogCXJldHVybiBkZXZtZW0tPm9wcy0+ZmF1bHQoZGV2bWVtLCB2bWYtPnZtYSwgdm1m LT5hZGRyZXNzLCB2bWYtPnBhZ2UsCiAJCQl2bWYtPmZsYWdzLCB2bWYtPnBtZCk7CiB9CiAKLXN0 YXRpYyB2b2lkIGhtbV9kZXZtZW1fZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZGF0YSkK K3N0YXRpYyB2b2lkIGhtbV9kZXZtZW1fZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1 Y3QgaG1tX2Rldm1lbSAqZGV2bWVtID0gZGF0YTsKKwlzdHJ1Y3QgaG1tX2Rldm1lbSAqZGV2bWVt ID0KKwkJY29udGFpbmVyX29mKHBhZ2UtPnBnbWFwLCBzdHJ1Y3QgaG1tX2Rldm1lbSwgcGFnZW1h cCk7CiAKIAlkZXZtZW0tPm9wcy0+ZnJlZShkZXZtZW0sIHBhZ2UpOwogfQpAQCAtMTQzOSw3ICsx NDQxLDYgQEAgc3RydWN0IGhtbV9kZXZtZW0gKmhtbV9kZXZtZW1fYWRkKGNvbnN0IHN0cnVjdCBo bW1fZGV2bWVtX29wcyAqb3BzLAogCWRldm1lbS0+cGFnZW1hcC5vcHMgPSAmaG1tX3BhZ2VtYXBf b3BzOwogCWRldm1lbS0+cGFnZW1hcC5hbHRtYXBfdmFsaWQgPSBmYWxzZTsKIAlkZXZtZW0tPnBh Z2VtYXAucmVmID0gJmRldm1lbS0+cmVmOwotCWRldm1lbS0+cGFnZW1hcC5kYXRhID0gZGV2bWVt OwogCiAJcmVzdWx0ID0gZGV2bV9tZW1yZW1hcF9wYWdlcyhkZXZtZW0tPmRldmljZSwgJmRldm1l bS0+cGFnZW1hcCk7CiAJaWYgKElTX0VSUihyZXN1bHQpKQotLSAKMi4yMC4xCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2ZWF1IG1haWxpbmcgbGlz dApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXU=