From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751463AbeDENmk (ORCPT ); Thu, 5 Apr 2018 09:42:40 -0400 Received: from mail-pl0-f53.google.com ([209.85.160.53]:43543 "EHLO mail-pl0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751165AbeDENmj (ORCPT ); Thu, 5 Apr 2018 09:42:39 -0400 X-Google-Smtp-Source: AIpwx49CYhMeBbfI6zf+HfvUe1sSTPEiuHEsPAoTk2/+FaIPDMDnp9GDqzGCgJk1KJ42BN5QQtr0XrOz6VW8YZXuSGM= MIME-Version: 1.0 In-Reply-To: References: <20180404223251.28449-1-eric@anholt.net> From: Nayan Deshmukh Date: Thu, 5 Apr 2018 19:11:58 +0530 Message-ID: Subject: Re: [PATCH] drm/sched: Extend the documentation. To: Daniel Vetter Cc: Alex Deucher , Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= , dri-devel , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 5, 2018 at 6:59 PM, Daniel Vetter wrote: > On Thu, Apr 5, 2018 at 3:27 PM, Alex Deucher wrote: >> On Thu, Apr 5, 2018 at 2:16 AM, Daniel Vetter wrote: >>> On Thu, Apr 5, 2018 at 12:32 AM, Eric Anholt wrote: >>>> These comments answer all the questions I had for myself when >>>> implementing a driver using the GPU scheduler. >>>> >>>> Signed-off-by: Eric Anholt >>> >>> Pulling all these comments into the generated kerneldoc would be >>> awesome, maybe as a new "GPU Scheduler" chapter at the end of >>> drm-mm.rst? Would mean a bit of busywork to convert the existing raw >>> comments into proper kerneldoc. Also has the benefit that 0day will >>> complain when you forget to update the comment when editing the >>> function prototype - kerneldoc which isn't included anywhere in .rst >>> won't be checked automatically. >> >> I was actually planning to do this myself, but Nayan wanted to do this >> a prep work for his proposed GSoC project so I was going to see how >> far he got first. It is still on my TODO list. Just got a bit busy with my coursework. I will try to look at it during the weekend. > > Awesome. I'm also happy to help out with any kerneldoc questions and > best practices. Technically ofc no clue about the scheduler :-) > I was thinking of adding a different rst for scheduler altogther. Will it be better to add it in drm-mm.rst itself? > Cheers, Daniel >> Alex >> >>> -Daniel >>> >>>> --- >>>> include/drm/gpu_scheduler.h | 46 +++++++++++++++++++++++++++++++++---- >>>> 1 file changed, 42 insertions(+), 4 deletions(-) >>>> >>>> diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h >>>> index dfd54fb94e10..c053a32341bf 100644 >>>> --- a/include/drm/gpu_scheduler.h >>>> +++ b/include/drm/gpu_scheduler.h >>>> @@ -43,10 +43,12 @@ enum drm_sched_priority { >>>> }; >>>> >>>> /** >>>> - * A scheduler entity is a wrapper around a job queue or a group >>>> - * of other entities. Entities take turns emitting jobs from their >>>> - * job queues to corresponding hardware ring based on scheduling >>>> - * policy. >>>> + * drm_sched_entity - A wrapper around a job queue (typically attached >>>> + * to the DRM file_priv). >>>> + * >>>> + * Entities will emit jobs in order to their corresponding hardware >>>> + * ring, and the scheduler will alternate between entities based on >>>> + * scheduling policy. >>>> */ >>>> struct drm_sched_entity { >>>> struct list_head list; >>>> @@ -78,7 +80,18 @@ struct drm_sched_rq { >>>> >>>> struct drm_sched_fence { >>>> struct dma_fence scheduled; >>>> + >>>> + /* This fence is what will be signaled by the scheduler when >>>> + * the job is completed. >>>> + * >>>> + * When setting up an out fence for the job, you should use >>>> + * this, since it's available immediately upon >>>> + * drm_sched_job_init(), and the fence returned by the driver >>>> + * from run_job() won't be created until the dependencies have >>>> + * resolved. >>>> + */ >>>> struct dma_fence finished; >>>> + >>>> struct dma_fence_cb cb; >>>> struct dma_fence *parent; >>>> struct drm_gpu_scheduler *sched; >>>> @@ -88,6 +101,13 @@ struct drm_sched_fence { >>>> >>>> struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f); >>>> >>>> +/** >>>> + * drm_sched_job - A job to be run by an entity. >>>> + * >>>> + * A job is created by the driver using drm_sched_job_init(), and >>>> + * should call drm_sched_entity_push_job() once it wants the scheduler >>>> + * to schedule the job. >>>> + */ >>>> struct drm_sched_job { >>>> struct spsc_node queue_node; >>>> struct drm_gpu_scheduler *sched; >>>> @@ -112,10 +132,28 @@ static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job, >>>> * these functions should be implemented in driver side >>>> */ >>>> struct drm_sched_backend_ops { >>>> + /* Called when the scheduler is considering scheduling this >>>> + * job next, to get another struct dma_fence for this job to >>>> + * block on. Once it returns NULL, run_job() may be called. >>>> + */ >>>> struct dma_fence *(*dependency)(struct drm_sched_job *sched_job, >>>> struct drm_sched_entity *s_entity); >>>> + >>>> + /* Called to execute the job once all of the dependencies have >>>> + * been resolved. This may be called multiple times, if >>>> + * timedout_job() has happened and drm_sched_job_recovery() >>>> + * decides to try it again. >>>> + */ >>>> struct dma_fence *(*run_job)(struct drm_sched_job *sched_job); >>>> + >>>> + /* Called when a job has taken too long to execute, to trigger >>>> + * GPU recovery. >>>> + */ >>>> void (*timedout_job)(struct drm_sched_job *sched_job); >>>> + >>>> + /* Called once the job's finished fence has been signaled and >>>> + * it's time to clean it up. >>>> + */ >>>> void (*free_job)(struct drm_sched_job *sched_job); >>>> }; >>>> >>>> -- >>>> 2.17.0 >>>> >>>> _______________________________________________ >>>> dri-devel mailing list >>>> dri-devel@lists.freedesktop.org >>>> https://lists.freedesktop.org/mailman/listinfo/dri-devel >>> >>> >>> >>> -- >>> Daniel Vetter >>> Software Engineer, Intel Corporation >>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch >>> _______________________________________________ >>> dri-devel mailing list >>> dri-devel@lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > +41 (0) 79 365 57 48 - http://blog.ffwll.ch > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nayan Deshmukh Subject: Re: [PATCH] drm/sched: Extend the documentation. Date: Thu, 5 Apr 2018 19:11:58 +0530 Message-ID: References: <20180404223251.28449-1-eric@anholt.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pl0-x235.google.com (mail-pl0-x235.google.com [IPv6:2607:f8b0:400e:c01::235]) by gabe.freedesktop.org (Postfix) with ESMTPS id 408DB6E17D for ; Thu, 5 Apr 2018 13:42:39 +0000 (UTC) Received: by mail-pl0-x235.google.com with SMTP id 91-v6so19152854pld.3 for ; Thu, 05 Apr 2018 06:42:39 -0700 (PDT) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Daniel Vetter Cc: Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= , dri-devel , Linux Kernel Mailing List List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBBcHIgNSwgMjAxOCBhdCA2OjU5IFBNLCBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3 bGwuY2g+IHdyb3RlOgo+IE9uIFRodSwgQXByIDUsIDIwMTggYXQgMzoyNyBQTSwgQWxleCBEZXVj aGVyIDxhbGV4ZGV1Y2hlckBnbWFpbC5jb20+IHdyb3RlOgo+PiBPbiBUaHUsIEFwciA1LCAyMDE4 IGF0IDI6MTYgQU0sIERhbmllbCBWZXR0ZXIgPGRhbmllbEBmZndsbC5jaD4gd3JvdGU6Cj4+PiBP biBUaHUsIEFwciA1LCAyMDE4IGF0IDEyOjMyIEFNLCBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQu bmV0PiB3cm90ZToKPj4+PiBUaGVzZSBjb21tZW50cyBhbnN3ZXIgYWxsIHRoZSBxdWVzdGlvbnMg SSBoYWQgZm9yIG15c2VsZiB3aGVuCj4+Pj4gaW1wbGVtZW50aW5nIGEgZHJpdmVyIHVzaW5nIHRo ZSBHUFUgc2NoZWR1bGVyLgo+Pj4+Cj4+Pj4gU2lnbmVkLW9mZi1ieTogRXJpYyBBbmhvbHQgPGVy aWNAYW5ob2x0Lm5ldD4KPj4+Cj4+PiBQdWxsaW5nIGFsbCB0aGVzZSBjb21tZW50cyBpbnRvIHRo ZSBnZW5lcmF0ZWQga2VybmVsZG9jIHdvdWxkIGJlCj4+PiBhd2Vzb21lLCBtYXliZSBhcyBhIG5l dyAiR1BVIFNjaGVkdWxlciIgY2hhcHRlciBhdCB0aGUgZW5kIG9mCj4+PiBkcm0tbW0ucnN0PyBX b3VsZCBtZWFuIGEgYml0IG9mIGJ1c3l3b3JrIHRvIGNvbnZlcnQgdGhlIGV4aXN0aW5nIHJhdwo+ Pj4gY29tbWVudHMgaW50byBwcm9wZXIga2VybmVsZG9jLiBBbHNvIGhhcyB0aGUgYmVuZWZpdCB0 aGF0IDBkYXkgd2lsbAo+Pj4gY29tcGxhaW4gd2hlbiB5b3UgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUg Y29tbWVudCB3aGVuIGVkaXRpbmcgdGhlCj4+PiBmdW5jdGlvbiBwcm90b3R5cGUgLSBrZXJuZWxk b2Mgd2hpY2ggaXNuJ3QgaW5jbHVkZWQgYW55d2hlcmUgaW4gLnJzdAo+Pj4gd29uJ3QgYmUgY2hl Y2tlZCBhdXRvbWF0aWNhbGx5Lgo+Pgo+PiBJIHdhcyBhY3R1YWxseSBwbGFubmluZyB0byBkbyB0 aGlzIG15c2VsZiwgYnV0IE5heWFuIHdhbnRlZCB0byBkbyB0aGlzCj4+IGEgcHJlcCB3b3JrIGZv ciBoaXMgcHJvcG9zZWQgR1NvQyBwcm9qZWN0IHNvIEkgd2FzIGdvaW5nIHRvIHNlZSBob3cKPj4g ZmFyIGhlIGdvdCBmaXJzdC4KCkl0IGlzIHN0aWxsIG9uIG15IFRPRE8gbGlzdC4gSnVzdCBnb3Qg YSBiaXQgYnVzeSB3aXRoIG15IGNvdXJzZXdvcmsuIEkKd2lsbCB0cnkgdG8gbG9vayBhdCBpdCBk dXJpbmcgdGhlIHdlZWtlbmQuCj4KPiBBd2Vzb21lLiBJJ20gYWxzbyBoYXBweSB0byBoZWxwIG91 dCB3aXRoIGFueSBrZXJuZWxkb2MgcXVlc3Rpb25zIGFuZAo+IGJlc3QgcHJhY3RpY2VzLiBUZWNo bmljYWxseSBvZmMgbm8gY2x1ZSBhYm91dCB0aGUgc2NoZWR1bGVyIDotKQo+Ckkgd2FzIHRoaW5r aW5nIG9mIGFkZGluZyBhIGRpZmZlcmVudCByc3QgZm9yIHNjaGVkdWxlciBhbHRvZ3RoZXIuIFdp bGwKaXQgYmUgYmV0dGVyIHRvIGFkZCBpdCBpbiBkcm0tbW0ucnN0IGl0c2VsZj8KCj4gQ2hlZXJz LCBEYW5pZWwKPj4gQWxleAo+Pgo+Pj4gLURhbmllbAo+Pj4KPj4+PiAtLS0KPj4+PiAgaW5jbHVk ZS9kcm0vZ3B1X3NjaGVkdWxlci5oIHwgNDYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrLS0tLQo+Pj4+ICAxIGZpbGUgY2hhbmdlZCwgNDIgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlv bnMoLSkKPj4+Pgo+Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmgg Yi9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmgKPj4+PiBpbmRleCBkZmQ1NGZiOTRlMTAuLmMw NTNhMzIzNDFiZiAxMDA2NDQKPj4+PiAtLS0gYS9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmgK Pj4+PiArKysgYi9pbmNsdWRlL2RybS9ncHVfc2NoZWR1bGVyLmgKPj4+PiBAQCAtNDMsMTAgKzQz LDEyIEBAIGVudW0gZHJtX3NjaGVkX3ByaW9yaXR5IHsKPj4+PiAgfTsKPj4+Pgo+Pj4+ICAvKioK Pj4+PiAtICogQSBzY2hlZHVsZXIgZW50aXR5IGlzIGEgd3JhcHBlciBhcm91bmQgYSBqb2IgcXVl dWUgb3IgYSBncm91cAo+Pj4+IC0gKiBvZiBvdGhlciBlbnRpdGllcy4gRW50aXRpZXMgdGFrZSB0 dXJucyBlbWl0dGluZyBqb2JzIGZyb20gdGhlaXIKPj4+PiAtICogam9iIHF1ZXVlcyB0byBjb3Jy ZXNwb25kaW5nIGhhcmR3YXJlIHJpbmcgYmFzZWQgb24gc2NoZWR1bGluZwo+Pj4+IC0gKiBwb2xp Y3kuCj4+Pj4gKyAqIGRybV9zY2hlZF9lbnRpdHkgLSBBIHdyYXBwZXIgYXJvdW5kIGEgam9iIHF1 ZXVlICh0eXBpY2FsbHkgYXR0YWNoZWQKPj4+PiArICogdG8gdGhlIERSTSBmaWxlX3ByaXYpLgo+ Pj4+ICsgKgo+Pj4+ICsgKiBFbnRpdGllcyB3aWxsIGVtaXQgam9icyBpbiBvcmRlciB0byB0aGVp ciBjb3JyZXNwb25kaW5nIGhhcmR3YXJlCj4+Pj4gKyAqIHJpbmcsIGFuZCB0aGUgc2NoZWR1bGVy IHdpbGwgYWx0ZXJuYXRlIGJldHdlZW4gZW50aXRpZXMgYmFzZWQgb24KPj4+PiArICogc2NoZWR1 bGluZyBwb2xpY3kuCj4+Pj4gICovCj4+Pj4gIHN0cnVjdCBkcm1fc2NoZWRfZW50aXR5IHsKPj4+ PiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICAgbGlzdDsKPj4+PiBAQCAt NzgsNyArODAsMTggQEAgc3RydWN0IGRybV9zY2hlZF9ycSB7Cj4+Pj4KPj4+PiAgc3RydWN0IGRy bV9zY2hlZF9mZW5jZSB7Cj4+Pj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICAgICAgICAgICAg ICAgIHNjaGVkdWxlZDsKPj4+PiArCj4+Pj4gKyAgICAgICAvKiBUaGlzIGZlbmNlIGlzIHdoYXQg d2lsbCBiZSBzaWduYWxlZCBieSB0aGUgc2NoZWR1bGVyIHdoZW4KPj4+PiArICAgICAgICAqIHRo ZSBqb2IgaXMgY29tcGxldGVkLgo+Pj4+ICsgICAgICAgICoKPj4+PiArICAgICAgICAqIFdoZW4g c2V0dGluZyB1cCBhbiBvdXQgZmVuY2UgZm9yIHRoZSBqb2IsIHlvdSBzaG91bGQgdXNlCj4+Pj4g KyAgICAgICAgKiB0aGlzLCBzaW5jZSBpdCdzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSB1cG9uCj4+ Pj4gKyAgICAgICAgKiBkcm1fc2NoZWRfam9iX2luaXQoKSwgYW5kIHRoZSBmZW5jZSByZXR1cm5l ZCBieSB0aGUgZHJpdmVyCj4+Pj4gKyAgICAgICAgKiBmcm9tIHJ1bl9qb2IoKSB3b24ndCBiZSBj cmVhdGVkIHVudGlsIHRoZSBkZXBlbmRlbmNpZXMgaGF2ZQo+Pj4+ICsgICAgICAgICogcmVzb2x2 ZWQuCj4+Pj4gKyAgICAgICAgKi8KPj4+PiAgICAgICAgIHN0cnVjdCBkbWFfZmVuY2UgICAgICAg ICAgICAgICAgZmluaXNoZWQ7Cj4+Pj4gKwo+Pj4+ICAgICAgICAgc3RydWN0IGRtYV9mZW5jZV9j YiAgICAgICAgICAgICBjYjsKPj4+PiAgICAgICAgIHN0cnVjdCBkbWFfZmVuY2UgICAgICAgICAg ICAgICAgKnBhcmVudDsKPj4+PiAgICAgICAgIHN0cnVjdCBkcm1fZ3B1X3NjaGVkdWxlciAgICAg ICAgKnNjaGVkOwo+Pj4+IEBAIC04OCw2ICsxMDEsMTMgQEAgc3RydWN0IGRybV9zY2hlZF9mZW5j ZSB7Cj4+Pj4KPj4+PiAgc3RydWN0IGRybV9zY2hlZF9mZW5jZSAqdG9fZHJtX3NjaGVkX2ZlbmNl KHN0cnVjdCBkbWFfZmVuY2UgKmYpOwo+Pj4+Cj4+Pj4gKy8qKgo+Pj4+ICsgKiBkcm1fc2NoZWRf am9iIC0gQSBqb2IgdG8gYmUgcnVuIGJ5IGFuIGVudGl0eS4KPj4+PiArICoKPj4+PiArICogQSBq b2IgaXMgY3JlYXRlZCBieSB0aGUgZHJpdmVyIHVzaW5nIGRybV9zY2hlZF9qb2JfaW5pdCgpLCBh bmQKPj4+PiArICogc2hvdWxkIGNhbGwgZHJtX3NjaGVkX2VudGl0eV9wdXNoX2pvYigpIG9uY2Ug aXQgd2FudHMgdGhlIHNjaGVkdWxlcgo+Pj4+ICsgKiB0byBzY2hlZHVsZSB0aGUgam9iLgo+Pj4+ ICsgKi8KPj4+PiAgc3RydWN0IGRybV9zY2hlZF9qb2Igewo+Pj4+ICAgICAgICAgc3RydWN0IHNw c2Nfbm9kZSAgICAgICAgICAgICAgICBxdWV1ZV9ub2RlOwo+Pj4+ICAgICAgICAgc3RydWN0IGRy bV9ncHVfc2NoZWR1bGVyICAgICAgICAqc2NoZWQ7Cj4+Pj4gQEAgLTExMiwxMCArMTMyLDI4IEBA IHN0YXRpYyBpbmxpbmUgYm9vbCBkcm1fc2NoZWRfaW52YWxpZGF0ZV9qb2Ioc3RydWN0IGRybV9z Y2hlZF9qb2IgKnNfam9iLAo+Pj4+ICAgKiB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGltcGxl bWVudGVkIGluIGRyaXZlciBzaWRlCj4+Pj4gICovCj4+Pj4gIHN0cnVjdCBkcm1fc2NoZWRfYmFj a2VuZF9vcHMgewo+Pj4+ICsgICAgICAgLyogQ2FsbGVkIHdoZW4gdGhlIHNjaGVkdWxlciBpcyBj b25zaWRlcmluZyBzY2hlZHVsaW5nIHRoaXMKPj4+PiArICAgICAgICAqIGpvYiBuZXh0LCB0byBn ZXQgYW5vdGhlciBzdHJ1Y3QgZG1hX2ZlbmNlIGZvciB0aGlzIGpvYiB0bwo+Pj4+ICsgICAgICAg ICogYmxvY2sgb24uICBPbmNlIGl0IHJldHVybnMgTlVMTCwgcnVuX2pvYigpIG1heSBiZSBjYWxs ZWQuCj4+Pj4gKyAgICAgICAgKi8KPj4+PiAgICAgICAgIHN0cnVjdCBkbWFfZmVuY2UgKigqZGVw ZW5kZW5jeSkoc3RydWN0IGRybV9zY2hlZF9qb2IgKnNjaGVkX2pvYiwKPj4+PiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9zY2hlZF9lbnRpdHkgKnNf ZW50aXR5KTsKPj4+PiArCj4+Pj4gKyAgICAgICAvKiBDYWxsZWQgdG8gZXhlY3V0ZSB0aGUgam9i IG9uY2UgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgaGF2ZQo+Pj4+ICsgICAgICAgICogYmVlbiBy ZXNvbHZlZC4gIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgaWYKPj4+PiArICAg ICAgICAqIHRpbWVkb3V0X2pvYigpIGhhcyBoYXBwZW5lZCBhbmQgZHJtX3NjaGVkX2pvYl9yZWNv dmVyeSgpCj4+Pj4gKyAgICAgICAgKiBkZWNpZGVzIHRvIHRyeSBpdCBhZ2Fpbi4KPj4+PiArICAg ICAgICAqLwo+Pj4+ICAgICAgICAgc3RydWN0IGRtYV9mZW5jZSAqKCpydW5fam9iKShzdHJ1Y3Qg ZHJtX3NjaGVkX2pvYiAqc2NoZWRfam9iKTsKPj4+PiArCj4+Pj4gKyAgICAgICAvKiBDYWxsZWQg d2hlbiBhIGpvYiBoYXMgdGFrZW4gdG9vIGxvbmcgdG8gZXhlY3V0ZSwgdG8gdHJpZ2dlcgo+Pj4+ ICsgICAgICAgICogR1BVIHJlY292ZXJ5Lgo+Pj4+ICsgICAgICAgICovCj4+Pj4gICAgICAgICB2 b2lkICgqdGltZWRvdXRfam9iKShzdHJ1Y3QgZHJtX3NjaGVkX2pvYiAqc2NoZWRfam9iKTsKPj4+ PiArCj4+Pj4gKyAgICAgICAvKiBDYWxsZWQgb25jZSB0aGUgam9iJ3MgZmluaXNoZWQgZmVuY2Ug aGFzIGJlZW4gc2lnbmFsZWQgYW5kCj4+Pj4gKyAgICAgICAgKiBpdCdzIHRpbWUgdG8gY2xlYW4g aXQgdXAuCj4+Pj4gKyAgICAgICAgKi8KPj4+PiAgICAgICAgIHZvaWQgKCpmcmVlX2pvYikoc3Ry dWN0IGRybV9zY2hlZF9qb2IgKnNjaGVkX2pvYik7Cj4+Pj4gIH07Cj4+Pj4KPj4+PiAtLQo+Pj4+ IDIuMTcuMAo+Pj4+Cj4+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPj4+PiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4+Pj4gZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwo+Pj4+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vZHJpLWRldmVsCj4+Pgo+Pj4KPj4+Cj4+PiAtLQo+Pj4gRGFuaWVsIFZldHRl cgo+Pj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4+PiArNDEgKDApIDc5 IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4+PiBfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+Pj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+ Pj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+Pj4gaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPgo+Cj4KPiAtLQo+IERhbmll bCBWZXR0ZXIKPiBTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KPiArNDEgKDAp IDc5IDM2NSA1NyA0OCAtIGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4gX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4g ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVs QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWls bWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=