From mboxrd@z Thu Jan 1 00:00:00 1970 From: Li Xi Subject: Re: [PATCH 4/4] Adds ioctl interface support for ext4 project Date: Fri, 26 Sep 2014 10:45:30 +0800 Message-ID: References: <1411567470-31799-1-git-send-email-lixi@ddn.com> <1411567470-31799-5-git-send-email-lixi@ddn.com> <20140924162507.GC27000@quack.suse.cz> <20140924162634.GA16886@infradead.org> <20140924170105.GE27000@quack.suse.cz> <20140925075912.GG4758@dastard> <20140926001049.GK4945@dastard> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Jan Kara , Christoph Hellwig , Andreas Dilger , "linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , xfs-VZNHf3L845pBDgjK7y7TUQ@public.gmane.org, Dmitry Monakhov , "viro-RmSDqhL/yNMiFSDQTTA3OLVCufUGDwFn@public.gmane.org" , "linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , "Theodore Ts'o" , Ext4 Developers List To: Dave Chinner Return-path: In-Reply-To: <20140926001049.GK4945@dastard> Sender: linux-api-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-fsdevel.vger.kernel.org On Fri, Sep 26, 2014 at 8:10 AM, Dave Chinner wro= te: > On Thu, Sep 25, 2014 at 07:34:38PM +0800, lixi wrote: >> Hi Dave, >> >> I was mostly working on the semantics of inherit flag on these patch= es. And >> I didn=E2=80=99t realized that the interface differences would bothe= r you so much. Sorry >> for that. > > It's not the differences that bother me - it's the fact that I was > repeatedly ignored until someone else raised the same issue.... Sorry about that. Since we are implementing a feature which exsits in X= =46S for years, your opions are surely very important. They are not ignored. But I think more discussion is necessary before an common agreement is reached. And I am willing to change the interfaces to whatever all peop= le agree on. > >> I agree that we should choose a good interface. It would be good tha= t it is >> general so that it works well for all file systems. I agree that add= ing an >> ext4 specific ioctl() is far from the best choice. I am willing to c= hange it to >> any general interface. A general ioctl() sounds good to me. Extend s= etattr() >> and getattr() for project ID sounds even better, since project ID lo= oks like >> UID/GID. > > Ah, no, project ID is not a uid/gid. It's a completely independent > construct. > > [ Which brings me to, once again, the issue of being ignored during > reviews: project IDs should not be mapped by user namespaces, nor be > accessible from anything other than the init namespace. > > In XFS we've turned off access to project IDs within namespace > containers because they are used for container space management > (i.e. by the init namespace) to manage the amount of filesystem > space a container or set of containers can use. We do not want > project IDs to be manipulated from within such containers, and > therefore have to prevent access to them from within user > namespaces. ] OK. That is another semantics which needs further discussion whether we need to implement for Ext4. Container space management is one of the project quota use case. I am not sure how widely used it is, but I like features with less limits. > >> And general xattr name is another choice. But it is might be a littl= e >> bit confusing if we use xattr actually, since we are not saving proj= ect ID as >> extended attribute on Ext4. Any choice is fine with me, as long as t= he >> implementation won't introduce nasty codes or inconsistent design. > > We can easily create another ioctl name if we have to. It just needs > sto be defined to the same value as the XFS ioctl names currently > are. We've done this before when making ioctls that originated in > XFS generic (e.g. with freeze/thaw ioctls).... OK. I am fine with general ioctl to set/get project ID. > >> However, the problem is, I do not quite understand why we should kee= p >> the interface exactly the same with XFS. It would be good if we can.= But >> as far as I can see, it seems hard. XFS uses a lot interfaces which = are >> not so standard and used by other file systems. For example, struct >> fsxattr is not used by other file systems at all except XFS. > > Moving a existing structure definitions to a different header file > is too hard? I don't think difficulty is a big problem. I'm wondering whether it is necessary. > >> I am not sure why we should introduce this into Ext4 if there are >> a lot of other better ways. I would be happy to change to XFS >> interfaces, if it is general. However, I don=E2=80=99t think it is >> general enough. > > How is it not general enough? Examples, please, not handwaving: > which bit of the quota interface can't ext4 use because it's XFS > specific? Well, I am not so familar with XFS, so I might be all wrong about XFS. But honestly, a lot of quota interfaces of XFS seems not so standard. For example, all the Q_X* flags used in do_quotactl(). Maybe there are really good reasons why they are there. I don't know. And XFS does not use general codes under fs/quota. That is a big difference with Ext4. > > We already have a perfectly functional interface and a large body of > code that implements and tests it. You're saying "oh, it's too much > work for me to implement an existing interface" and ignoring the > fact that not implementing the existing interface forces a huge > amount of downstream work. e.g. > > - we need completely new test infrastructure to replicate > existing tests. > - we need new tests to ensure the different APIs and > utilities provide the same functionality, and that the > work identically. > - administrators are going to have to learn how ext4 is > different to what they already know and understand. > - administrators that has tools written to manage project > quotas is going to have to rewrite them to support ext4. > > It's an entirely selfish argument that ignores what already existing > out in userspace. i.e. you're saying that existing downstream users o= f > project quotas simple don't matter to you... > >> I know xfstest is using the existing project quota interfaces of XFS= =2E And >> maybe there are some applications which are using them too. But >> keeping the interfaces exactly the same with XFS would cost so much >> effort that I=E2=80=99d like to get enough reasons before start work= ing on it. Is it >> really necessary? I am not so sure. > > You have to have a stronger argument than that to justify creating a > new incompatible user interface. The XFS interfaces have been > available for more than 10 years and support all the functionality > ext4 requires. If it was any other userspace interface (e.g. > syscalls) or any filesystem other than ext4 there would be people > from all over telling you "use the existing interfaces!" and you'd > need very strong reasons for creating a new one. > > i.e. you need to demonstrate that the existing interfaces are > inadequate for the intended purpose of the new functionality. That's > clearly not the case here so why should we allow you to create an > incompatible userspace API rather than use the existing, fully > functional API? > >> It is so easy to change user space applications comparing to >> changing a weird interfaces. > > The existing generic quota tools (i.e quotactl, repquota, etc) > already implement the XFS quota API to be able to query XFS > filesystems. There's no "changing to wierd interfaces" necessary > for userspace; it's already all there. Hence any work you do to add > project quota awareness to those generic userspace tools will need to > add the support to the XFS queries anyway. > > IOWs, you're not making it any easier for yourself in userspace by > creating a new API for ext4 - it just doubles the amount of work you > have to in userspace to make existing tools project quota aware. I am afraid I have to make existing tools project quota aware. And actually I've done most of the work. I've updated e2fsprogs and quota-tools to support project quota. Unfortunately these updates are inevitable anyway. As Jan Kara said, we can't force system admins to change from quota-tool command to xfs quota tools. Thus, I add '-P $PROJECT' arguments to all the commands. And based on those tools, I made a script which is less than 1K lines for regression test. It is working pretty well. I don't see a good reason why it is necessary to change everything to XFS way. > >> For >> example, I think it won=E2=80=99t cost even more than a day to add x= fstest >> support for new Ext4 project quota. > > A day of whose time? I am always willing to help if you agree. :) > > Ever thought about how much time it will take reviewers to look at > your tests and iterate over them to get it all right? If you're > introducing new userspace infrastructure that xfstests will need to > depend on and test for, then it's a lot more than just writing new > tests. > > Indeed, I'm likely to want new project quota tests to be generic > (i.e. works and passes on any filesystem that supports project > quotas) with the introduction of ext4 project quota support. It's > the same functionality and so it should work the same just like user > and group quotas do across all filesystems. > >> And since project quota is far from >> a widely used feature, > > I don't think you realise quite how widespread it's use is on XFS. > >> I don=E2=80=99t think there is much compatibility problems >> for existing applications. And If the new project interface are gen= eral >> enough, there won=E2=80=99t be any compatibility problems for new ap= plications >> at all. > > Again, you are ignoring the compatibility problems with existing > applications that are project quota aware. For them you are > *creating new compatibility problems* by implementing a new > interface. i.e. Existing applications will not work on ext4, and > new applications written to work on ext4 won't work on XFS. > > That's the crux of the issue - we have existing applications using > the existing interface and so introducing a new interface introduces > compatibility problems. You can't just wave this problem away > because you don't think the existing interface matters. > > "It's easier for me to create a new interface" is not a valid reason > for creating a new interface.... Sorry about my ignorance about the existing usage of XFS project quota. I hope it is widely used. But does it really matters for XFS that what kind of Ext4 interfaces is going to use? Existing appplications would run happily on XFS any way using the exisitng XFS interfaces. And if you are concerning about the compatibility between Ext4 and XFS, I am afraid those applications have to be changed any way when been ported to Ext4. Since those applications are using XFS specific feature, i.e. project quota, it is likely they are using other kind of XFS speicific features which probably will never be implemented on Ext4. I don't think there is any easy way to port them from XFS to Ext4 any way. And I really don't think therea are many such kind of applications. So, since we are not implementing interfaces for XFS2 or XFS3, I don't think compatibility problem is so critical. Regards, - Li Xi From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 805717FEF for ; Thu, 25 Sep 2014 21:45:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6CEA58F8033 for ; Thu, 25 Sep 2014 19:45:32 -0700 (PDT) Received: from mail-ie0-f169.google.com (mail-ie0-f169.google.com [209.85.223.169]) by cuda.sgi.com with ESMTP id 60IfMoEcYWftNhZ5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 25 Sep 2014 19:45:30 -0700 (PDT) Received: by mail-ie0-f169.google.com with SMTP id rp18so13040113iec.0 for ; Thu, 25 Sep 2014 19:45:30 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <20140926001049.GK4945@dastard> References: <1411567470-31799-1-git-send-email-lixi@ddn.com> <1411567470-31799-5-git-send-email-lixi@ddn.com> <20140924162507.GC27000@quack.suse.cz> <20140924162634.GA16886@infradead.org> <20140924170105.GE27000@quack.suse.cz> <20140925075912.GG4758@dastard> <20140926001049.GK4945@dastard> Date: Fri, 26 Sep 2014 10:45:30 +0800 Message-ID: Subject: Re: [PATCH 4/4] Adds ioctl interface support for ext4 project From: Li Xi List-Id: XFS Filesystem from SGI List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xfs-bounces@oss.sgi.com Sender: xfs-bounces@oss.sgi.com To: Dave Chinner Cc: Andreas Dilger , Jan Kara , "linux-api@vger.kernel.org" , xfs@oss.sgi.com, Christoph Hellwig , Dmitry Monakhov , "viro@zeniv.linux.org.uk" , "linux-fsdevel@vger.kernel.org" , Theodore Ts'o , Ext4 Developers List T24gRnJpLCBTZXAgMjYsIDIwMTQgYXQgODoxMCBBTSwgRGF2ZSBDaGlubmVyIDxkYXZpZEBmcm9t b3JiaXQuY29tPiB3cm90ZToKPiBPbiBUaHUsIFNlcCAyNSwgMjAxNCBhdCAwNzozNDozOFBNICsw ODAwLCBsaXhpIHdyb3RlOgo+PiBIaSBEYXZlLAo+Pgo+PiBJIHdhcyBtb3N0bHkgd29ya2luZyBv biB0aGUgc2VtYW50aWNzIG9mIGluaGVyaXQgZmxhZyBvbiB0aGVzZSBwYXRjaGVzLiBBbmQKPj4g SSBkaWRu4oCZdCByZWFsaXplZCB0aGF0IHRoZSBpbnRlcmZhY2UgZGlmZmVyZW5jZXMgd291bGQg Ym90aGVyIHlvdSBzbyBtdWNoLiBTb3JyeQo+PiBmb3IgdGhhdC4KPgo+IEl0J3Mgbm90IHRoZSBk aWZmZXJlbmNlcyB0aGF0IGJvdGhlciBtZSAtIGl0J3MgdGhlIGZhY3QgdGhhdCBJIHdhcwo+IHJl cGVhdGVkbHkgaWdub3JlZCB1bnRpbCBzb21lb25lIGVsc2UgcmFpc2VkIHRoZSBzYW1lIGlzc3Vl Li4uLgpTb3JyeSBhYm91dCB0aGF0LiBTaW5jZSB3ZSBhcmUgaW1wbGVtZW50aW5nIGEgZmVhdHVy ZSB3aGljaCBleHNpdHMgaW4gWEZTCmZvciB5ZWFycywgeW91ciBvcGlvbnMgYXJlIHN1cmVseSB2 ZXJ5IGltcG9ydGFudC4gVGhleSBhcmUgbm90IGlnbm9yZWQuCkJ1dCBJIHRoaW5rIG1vcmUgZGlz Y3Vzc2lvbiBpcyBuZWNlc3NhcnkgYmVmb3JlIGFuIGNvbW1vbiBhZ3JlZW1lbnQgaXMKcmVhY2hl ZC4gQW5kIEkgYW0gd2lsbGluZyB0byBjaGFuZ2UgdGhlIGludGVyZmFjZXMgdG8gd2hhdGV2ZXIg YWxsIHBlb3BsZQphZ3JlZSBvbi4KPgo+PiBJIGFncmVlIHRoYXQgd2Ugc2hvdWxkIGNob29zZSBh IGdvb2QgaW50ZXJmYWNlLiBJdCB3b3VsZCBiZSBnb29kIHRoYXQgaXQgaXMKPj4gZ2VuZXJhbCBz byB0aGF0IGl0IHdvcmtzIHdlbGwgZm9yIGFsbCBmaWxlIHN5c3RlbXMuIEkgYWdyZWUgdGhhdCBh ZGRpbmcgYW4KPj4gZXh0NCBzcGVjaWZpYyBpb2N0bCgpIGlzIGZhciBmcm9tIHRoZSBiZXN0IGNo b2ljZS4gSSBhbSB3aWxsaW5nIHRvIGNoYW5nZSBpdCB0bwo+PiBhbnkgZ2VuZXJhbCBpbnRlcmZh Y2UuIEEgZ2VuZXJhbCBpb2N0bCgpIHNvdW5kcyBnb29kIHRvIG1lLiBFeHRlbmQgc2V0YXR0cigp Cj4+IGFuZCBnZXRhdHRyKCkgZm9yIHByb2plY3QgSUQgc291bmRzIGV2ZW4gYmV0dGVyLCBzaW5j ZSBwcm9qZWN0IElEIGxvb2tzIGxpa2UKPj4gVUlEL0dJRC4KPgo+IEFoLCBubywgcHJvamVjdCBJ RCBpcyBub3QgYSB1aWQvZ2lkLiBJdCdzIGEgY29tcGxldGVseSBpbmRlcGVuZGVudAo+IGNvbnN0 cnVjdC4KPgo+IFsgV2hpY2ggYnJpbmdzIG1lIHRvLCBvbmNlIGFnYWluLCB0aGUgaXNzdWUgb2Yg YmVpbmcgaWdub3JlZCBkdXJpbmcKPiByZXZpZXdzOiBwcm9qZWN0IElEcyBzaG91bGQgbm90IGJl IG1hcHBlZCBieSB1c2VyIG5hbWVzcGFjZXMsIG5vciBiZQo+IGFjY2Vzc2libGUgZnJvbSBhbnl0 aGluZyBvdGhlciB0aGFuIHRoZSBpbml0IG5hbWVzcGFjZS4KPgo+IEluIFhGUyB3ZSd2ZSB0dXJu ZWQgb2ZmIGFjY2VzcyB0byBwcm9qZWN0IElEcyB3aXRoaW4gbmFtZXNwYWNlCj4gY29udGFpbmVy cyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgZm9yIGNvbnRhaW5lciBzcGFjZSBtYW5hZ2VtZW50Cj4g KGkuZS4gYnkgdGhlIGluaXQgbmFtZXNwYWNlKSB0byBtYW5hZ2UgdGhlIGFtb3VudCBvZiBmaWxl c3lzdGVtCj4gc3BhY2UgYSBjb250YWluZXIgb3Igc2V0IG9mIGNvbnRhaW5lcnMgY2FuIHVzZS4g V2UgZG8gbm90IHdhbnQKPiBwcm9qZWN0IElEcyB0byBiZSBtYW5pcHVsYXRlZCBmcm9tIHdpdGhp biBzdWNoIGNvbnRhaW5lcnMsIGFuZAo+IHRoZXJlZm9yZSBoYXZlIHRvIHByZXZlbnQgYWNjZXNz IHRvIHRoZW0gZnJvbSB3aXRoaW4gdXNlcgo+IG5hbWVzcGFjZXMuIF0KT0suIFRoYXQgaXMgYW5v dGhlciBzZW1hbnRpY3Mgd2hpY2ggbmVlZHMgZnVydGhlciBkaXNjdXNzaW9uIHdoZXRoZXIKd2Ug bmVlZCB0byBpbXBsZW1lbnQgZm9yIEV4dDQuIENvbnRhaW5lciBzcGFjZSBtYW5hZ2VtZW50IGlz IG9uZQpvZiB0aGUgcHJvamVjdCBxdW90YSB1c2UgY2FzZS4gSSBhbSBub3Qgc3VyZSBob3cgd2lk ZWx5IHVzZWQgaXQgaXMsCmJ1dCBJIGxpa2UgZmVhdHVyZXMgd2l0aCBsZXNzIGxpbWl0cy4KPgo+ PiBBbmQgZ2VuZXJhbCB4YXR0ciBuYW1lIGlzIGFub3RoZXIgY2hvaWNlLiBCdXQgaXQgaXMgbWln aHQgYmUgYSBsaXR0bGUKPj4gYml0IGNvbmZ1c2luZyBpZiB3ZSB1c2UgeGF0dHIgYWN0dWFsbHks IHNpbmNlIHdlIGFyZSBub3Qgc2F2aW5nIHByb2plY3QgSUQgYXMKPj4gZXh0ZW5kZWQgYXR0cmli dXRlIG9uIEV4dDQuIEFueSBjaG9pY2UgaXMgZmluZSB3aXRoIG1lLCBhcyBsb25nIGFzIHRoZQo+ PiBpbXBsZW1lbnRhdGlvbiB3b24ndCBpbnRyb2R1Y2UgbmFzdHkgY29kZXMgb3IgaW5jb25zaXN0 ZW50IGRlc2lnbi4KPgo+IFdlIGNhbiBlYXNpbHkgY3JlYXRlIGFub3RoZXIgaW9jdGwgbmFtZSBp ZiB3ZSBoYXZlIHRvLiBJdCBqdXN0IG5lZWRzCj4gc3RvIGJlIGRlZmluZWQgdG8gdGhlIHNhbWUg dmFsdWUgYXMgdGhlIFhGUyBpb2N0bCBuYW1lcyBjdXJyZW50bHkKPiBhcmUuIFdlJ3ZlIGRvbmUg dGhpcyBiZWZvcmUgd2hlbiBtYWtpbmcgaW9jdGxzIHRoYXQgb3JpZ2luYXRlZCBpbgo+IFhGUyBn ZW5lcmljIChlLmcuIHdpdGggZnJlZXplL3RoYXcgaW9jdGxzKS4uLi4KT0suIEkgYW0gZmluZSB3 aXRoIGdlbmVyYWwgaW9jdGwgdG8gc2V0L2dldCBwcm9qZWN0IElELgo+Cj4+IEhvd2V2ZXIsIHRo ZSBwcm9ibGVtIGlzLCBJIGRvIG5vdCBxdWl0ZSB1bmRlcnN0YW5kIHdoeSB3ZSBzaG91bGQga2Vl cAo+PiB0aGUgaW50ZXJmYWNlIGV4YWN0bHkgdGhlIHNhbWUgd2l0aCBYRlMuIEl0IHdvdWxkIGJl IGdvb2QgaWYgd2UgY2FuLiBCdXQKPj4gYXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgc2VlbXMgaGFy ZC4gWEZTIHVzZXMgYSBsb3QgaW50ZXJmYWNlcyB3aGljaCBhcmUKPj4gbm90IHNvIHN0YW5kYXJk IGFuZCB1c2VkIGJ5IG90aGVyIGZpbGUgc3lzdGVtcy4gRm9yIGV4YW1wbGUsIHN0cnVjdAo+PiBm c3hhdHRyIGlzIG5vdCB1c2VkIGJ5IG90aGVyIGZpbGUgc3lzdGVtcyBhdCBhbGwgZXhjZXB0IFhG Uy4KPgo+IE1vdmluZyBhIGV4aXN0aW5nIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0byBhIGRpZmZl cmVudCBoZWFkZXIgZmlsZQo+IGlzIHRvbyBoYXJkPwpJIGRvbid0IHRoaW5rIGRpZmZpY3VsdHkg aXMgYSBiaWcgcHJvYmxlbS4gSSdtIHdvbmRlcmluZyB3aGV0aGVyIGl0IGlzCm5lY2Vzc2FyeS4K Pgo+PiBJIGFtIG5vdCBzdXJlIHdoeSB3ZSBzaG91bGQgaW50cm9kdWNlIHRoaXMgaW50byBFeHQ0 IGlmIHRoZXJlIGFyZQo+PiBhIGxvdCBvZiBvdGhlciBiZXR0ZXIgd2F5cy4gSSB3b3VsZCBiZSBo YXBweSB0byBjaGFuZ2UgdG8gWEZTCj4+IGludGVyZmFjZXMsIGlmIGl0IGlzIGdlbmVyYWwuICBI b3dldmVyLCBJIGRvbuKAmXQgdGhpbmsgaXQgaXMKPj4gZ2VuZXJhbCBlbm91Z2guCj4KPiBIb3cg aXMgaXQgbm90IGdlbmVyYWwgZW5vdWdoPyBFeGFtcGxlcywgcGxlYXNlLCBub3QgaGFuZHdhdmlu ZzoKPiB3aGljaCBiaXQgb2YgdGhlIHF1b3RhIGludGVyZmFjZSBjYW4ndCBleHQ0IHVzZSBiZWNh dXNlIGl0J3MgWEZTCj4gc3BlY2lmaWM/CldlbGwsIEkgYW0gbm90IHNvIGZhbWlsYXIgd2l0aCBY RlMsIHNvIEkgbWlnaHQgYmUgYWxsIHdyb25nIGFib3V0ClhGUy4gQnV0IGhvbmVzdGx5LCBhIGxv dCBvZiBxdW90YSBpbnRlcmZhY2VzIG9mIFhGUyBzZWVtcyBub3QKc28gc3RhbmRhcmQuIEZvciBl eGFtcGxlLCBhbGwgdGhlIFFfWCogZmxhZ3MgdXNlZCBpbiBkb19xdW90YWN0bCgpLgpNYXliZSB0 aGVyZSBhcmUgcmVhbGx5IGdvb2QgcmVhc29ucyB3aHkgdGhleSBhcmUgdGhlcmUuIEkgZG9uJ3QK a25vdy4gQW5kIFhGUyBkb2VzIG5vdCB1c2UgZ2VuZXJhbCBjb2RlcyB1bmRlciBmcy9xdW90YS4g VGhhdAppcyBhIGJpZyBkaWZmZXJlbmNlIHdpdGggRXh0NC4KPgo+IFdlIGFscmVhZHkgaGF2ZSBh IHBlcmZlY3RseSBmdW5jdGlvbmFsIGludGVyZmFjZSBhbmQgYSBsYXJnZSBib2R5IG9mCj4gY29k ZSB0aGF0IGltcGxlbWVudHMgYW5kIHRlc3RzIGl0LiBZb3UncmUgc2F5aW5nICJvaCwgaXQncyB0 b28gbXVjaAo+IHdvcmsgZm9yIG1lIHRvIGltcGxlbWVudCBhbiBleGlzdGluZyBpbnRlcmZhY2Ui IGFuZCBpZ25vcmluZyB0aGUKPiBmYWN0IHRoYXQgbm90IGltcGxlbWVudGluZyB0aGUgZXhpc3Rp bmcgaW50ZXJmYWNlIGZvcmNlcyBhIGh1Z2UKPiBhbW91bnQgb2YgZG93bnN0cmVhbSB3b3JrLiBl LmcuCj4KPiAgICAgICAgIC0gd2UgbmVlZCBjb21wbGV0ZWx5IG5ldyB0ZXN0IGluZnJhc3RydWN0 dXJlIHRvIHJlcGxpY2F0ZQo+ICAgICAgICAgICBleGlzdGluZyB0ZXN0cy4KPiAgICAgICAgIC0g d2UgbmVlZCBuZXcgdGVzdHMgdG8gZW5zdXJlIHRoZSBkaWZmZXJlbnQgQVBJcyBhbmQKPiAgICAg ICAgICAgdXRpbGl0aWVzIHByb3ZpZGUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSwgYW5kIHRoYXQg dGhlCj4gICAgICAgICAgIHdvcmsgaWRlbnRpY2FsbHkuCj4gICAgICAgICAtIGFkbWluaXN0cmF0 b3JzIGFyZSBnb2luZyB0byBoYXZlIHRvIGxlYXJuIGhvdyBleHQ0IGlzCj4gICAgICAgICAgIGRp ZmZlcmVudCB0byB3aGF0IHRoZXkgYWxyZWFkeSBrbm93IGFuZCB1bmRlcnN0YW5kLgo+ICAgICAg ICAgLSBhZG1pbmlzdHJhdG9ycyB0aGF0IGhhcyB0b29scyB3cml0dGVuIHRvIG1hbmFnZSBwcm9q ZWN0Cj4gICAgICAgICAgIHF1b3RhcyBpcyBnb2luZyB0byBoYXZlIHRvIHJld3JpdGUgdGhlbSB0 byBzdXBwb3J0IGV4dDQuCj4KPiBJdCdzIGFuIGVudGlyZWx5IHNlbGZpc2ggYXJndW1lbnQgdGhh dCBpZ25vcmVzIHdoYXQgYWxyZWFkeSBleGlzdGluZwo+IG91dCBpbiB1c2Vyc3BhY2UuIGkuZS4g eW91J3JlIHNheWluZyB0aGF0IGV4aXN0aW5nIGRvd25zdHJlYW0gdXNlcnMgb2YKPiBwcm9qZWN0 IHF1b3RhcyBzaW1wbGUgZG9uJ3QgbWF0dGVyIHRvIHlvdS4uLgo+Cj4+IEkga25vdyB4ZnN0ZXN0 IGlzIHVzaW5nIHRoZSBleGlzdGluZyBwcm9qZWN0IHF1b3RhIGludGVyZmFjZXMgb2YgWEZTLiBB bmQKPj4gbWF5YmUgdGhlcmUgYXJlIHNvbWUgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2luZyB0 aGVtIHRvby4gQnV0Cj4+IGtlZXBpbmcgdGhlIGludGVyZmFjZXMgZXhhY3RseSB0aGUgc2FtZSB3 aXRoIFhGUyB3b3VsZCBjb3N0IHNvIG11Y2gKPj4gZWZmb3J0IHRoYXQgSeKAmWQgbGlrZSB0byBn ZXQgZW5vdWdoIHJlYXNvbnMgYmVmb3JlIHN0YXJ0IHdvcmtpbmcgb24gaXQuIElzIGl0Cj4+IHJl YWxseSBuZWNlc3Nhcnk/IEkgYW0gbm90IHNvIHN1cmUuCj4KPiBZb3UgaGF2ZSB0byBoYXZlIGEg c3Ryb25nZXIgYXJndW1lbnQgdGhhbiB0aGF0IHRvIGp1c3RpZnkgY3JlYXRpbmcgYQo+IG5ldyBp bmNvbXBhdGlibGUgdXNlciBpbnRlcmZhY2UuIFRoZSBYRlMgaW50ZXJmYWNlcyBoYXZlIGJlZW4K PiBhdmFpbGFibGUgZm9yIG1vcmUgdGhhbiAxMCB5ZWFycyBhbmQgc3VwcG9ydCBhbGwgdGhlIGZ1 bmN0aW9uYWxpdHkKPiBleHQ0IHJlcXVpcmVzLiBJZiBpdCB3YXMgYW55IG90aGVyIHVzZXJzcGFj ZSBpbnRlcmZhY2UgKGUuZy4KPiBzeXNjYWxscykgb3IgYW55IGZpbGVzeXN0ZW0gb3RoZXIgdGhh biBleHQ0IHRoZXJlIHdvdWxkIGJlIHBlb3BsZQo+IGZyb20gYWxsIG92ZXIgdGVsbGluZyB5b3Ug InVzZSB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlcyEiIGFuZCB5b3UnZAo+IG5lZWQgdmVyeSBzdHJv bmcgcmVhc29ucyBmb3IgY3JlYXRpbmcgYSBuZXcgb25lLgo+Cj4gaS5lLiB5b3UgbmVlZCB0byBk ZW1vbnN0cmF0ZSB0aGF0IHRoZSBleGlzdGluZyBpbnRlcmZhY2VzIGFyZQo+IGluYWRlcXVhdGUg Zm9yIHRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBuZXcgZnVuY3Rpb25hbGl0eS4gVGhhdCdz Cj4gY2xlYXJseSBub3QgdGhlIGNhc2UgaGVyZSBzbyB3aHkgc2hvdWxkIHdlIGFsbG93IHlvdSB0 byBjcmVhdGUgYW4KPiBpbmNvbXBhdGlibGUgdXNlcnNwYWNlIEFQSSByYXRoZXIgdGhhbiB1c2Ug dGhlIGV4aXN0aW5nLCBmdWxseQo+IGZ1bmN0aW9uYWwgQVBJPwo+Cj4+IEl0IGlzIHNvIGVhc3kg dG8gY2hhbmdlIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIGNvbXBhcmluZyB0bwo+PiBjaGFuZ2lu ZyBhIHdlaXJkIGludGVyZmFjZXMuCj4KPiBUaGUgZXhpc3RpbmcgZ2VuZXJpYyBxdW90YSB0b29s cyAoaS5lIHF1b3RhY3RsLCByZXBxdW90YSwgZXRjKQo+IGFscmVhZHkgaW1wbGVtZW50IHRoZSBY RlMgcXVvdGEgQVBJIHRvIGJlIGFibGUgdG8gcXVlcnkgWEZTCj4gZmlsZXN5c3RlbXMuICBUaGVy ZSdzIG5vICJjaGFuZ2luZyB0byB3aWVyZCBpbnRlcmZhY2VzIiBuZWNlc3NhcnkKPiBmb3IgdXNl cnNwYWNlOyBpdCdzIGFscmVhZHkgYWxsIHRoZXJlLiBIZW5jZSBhbnkgd29yayB5b3UgZG8gdG8g YWRkCj4gcHJvamVjdCBxdW90YSBhd2FyZW5lc3MgdG8gdGhvc2UgZ2VuZXJpYyB1c2Vyc3BhY2Ug dG9vbHMgd2lsbCBuZWVkIHRvCj4gYWRkIHRoZSBzdXBwb3J0IHRvIHRoZSBYRlMgcXVlcmllcyBh bnl3YXkuCj4KPiBJT1dzLCB5b3UncmUgbm90IG1ha2luZyBpdCBhbnkgZWFzaWVyIGZvciB5b3Vy c2VsZiBpbiB1c2Vyc3BhY2UgYnkKPiBjcmVhdGluZyBhIG5ldyBBUEkgZm9yIGV4dDQgLSBpdCBq dXN0IGRvdWJsZXMgdGhlIGFtb3VudCBvZiB3b3JrIHlvdQo+IGhhdmUgdG8gaW4gdXNlcnNwYWNl IHRvIG1ha2UgZXhpc3RpbmcgdG9vbHMgcHJvamVjdCBxdW90YSBhd2FyZS4KSSBhbSBhZnJhaWQg SSBoYXZlIHRvIG1ha2UgZXhpc3RpbmcgdG9vbHMgcHJvamVjdCBxdW90YSBhd2FyZS4gQW5kCmFj dHVhbGx5IEkndmUgZG9uZSBtb3N0IG9mIHRoZSB3b3JrLiBJJ3ZlIHVwZGF0ZWQgZTJmc3Byb2dz IGFuZApxdW90YS10b29scyB0byBzdXBwb3J0IHByb2plY3QgcXVvdGEuIFVuZm9ydHVuYXRlbHkg dGhlc2UgdXBkYXRlcyBhcmUKaW5ldml0YWJsZSBhbnl3YXkuIEFzIEphbiBLYXJhIHNhaWQsIHdl IGNhbid0IGZvcmNlIHN5c3RlbSBhZG1pbnMKdG8gY2hhbmdlIGZyb20gcXVvdGEtdG9vbCBjb21t YW5kIHRvIHhmcyBxdW90YSB0b29scy4gVGh1cywgSSBhZGQKJy1QICRQUk9KRUNUJyBhcmd1bWVu dHMgdG8gYWxsIHRoZSBjb21tYW5kcy4gQW5kIGJhc2VkIG9uCnRob3NlIHRvb2xzLCBJIG1hZGUg YSBzY3JpcHQgd2hpY2ggaXMgbGVzcyB0aGFuIDFLIGxpbmVzIGZvcgpyZWdyZXNzaW9uIHRlc3Qu IEl0IGlzIHdvcmtpbmcgcHJldHR5IHdlbGwuIEkgZG9uJ3Qgc2VlIGEgZ29vZCByZWFzb24Kd2h5 IGl0IGlzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgZXZlcnl0aGluZyB0byBYRlMgd2F5Lgo+Cj4+IEZv cgo+PiBleGFtcGxlLCBJIHRoaW5rIGl0IHdvbuKAmXQgY29zdCBldmVuIG1vcmUgdGhhbiBhIGRh eSB0byBhZGQgeGZzdGVzdAo+PiBzdXBwb3J0IGZvciBuZXcgRXh0NCBwcm9qZWN0IHF1b3RhLgo+ Cj4gQSBkYXkgb2Ygd2hvc2UgdGltZT8KSSBhbSBhbHdheXMgd2lsbGluZyB0byBoZWxwIGlmIHlv dSBhZ3JlZS4gOikKPgo+IEV2ZXIgdGhvdWdodCBhYm91dCBob3cgbXVjaCB0aW1lIGl0IHdpbGwg dGFrZSByZXZpZXdlcnMgdG8gbG9vayBhdAo+IHlvdXIgdGVzdHMgYW5kIGl0ZXJhdGUgb3ZlciB0 aGVtIHRvIGdldCBpdCBhbGwgcmlnaHQ/IElmIHlvdSdyZQo+IGludHJvZHVjaW5nIG5ldyB1c2Vy c3BhY2UgaW5mcmFzdHJ1Y3R1cmUgdGhhdCB4ZnN0ZXN0cyB3aWxsIG5lZWQgdG8KPiBkZXBlbmQg b24gYW5kIHRlc3QgZm9yLCB0aGVuIGl0J3MgYSBsb3QgbW9yZSB0aGFuIGp1c3Qgd3JpdGluZyBu ZXcKPiB0ZXN0cy4KPgo+IEluZGVlZCwgSSdtIGxpa2VseSB0byB3YW50IG5ldyBwcm9qZWN0IHF1 b3RhIHRlc3RzIHRvIGJlIGdlbmVyaWMKPiAoaS5lLiB3b3JrcyBhbmQgcGFzc2VzIG9uIGFueSBm aWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgcHJvamVjdAo+IHF1b3Rhcykgd2l0aCB0aGUgaW50cm9k dWN0aW9uIG9mIGV4dDQgcHJvamVjdCBxdW90YSBzdXBwb3J0LiBJdCdzCj4gdGhlIHNhbWUgZnVu Y3Rpb25hbGl0eSBhbmQgc28gaXQgc2hvdWxkIHdvcmsgdGhlIHNhbWUganVzdCBsaWtlIHVzZXIK PiBhbmQgZ3JvdXAgcXVvdGFzIGRvIGFjcm9zcyBhbGwgZmlsZXN5c3RlbXMuCj4KPj4gQW5kIHNp bmNlIHByb2plY3QgcXVvdGEgaXMgZmFyIGZyb20KPj4gYSB3aWRlbHkgdXNlZCBmZWF0dXJlLAo+ Cj4gSSBkb24ndCB0aGluayB5b3UgcmVhbGlzZSBxdWl0ZSBob3cgd2lkZXNwcmVhZCBpdCdzIHVz ZSBpcyBvbiBYRlMuCj4KPj4gSSBkb27igJl0IHRoaW5rIHRoZXJlIGlzIG11Y2ggY29tcGF0aWJp bGl0eSBwcm9ibGVtcwo+PiBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLiAgQW5kIElmIHRoZSBu ZXcgcHJvamVjdCBpbnRlcmZhY2UgYXJlIGdlbmVyYWwKPj4gZW5vdWdoLCB0aGVyZSB3b27igJl0 IGJlIGFueSBjb21wYXRpYmlsaXR5IHByb2JsZW1zIGZvciBuZXcgYXBwbGljYXRpb25zCj4+IGF0 IGFsbC4KPgo+IEFnYWluLCB5b3UgYXJlIGlnbm9yaW5nIHRoZSBjb21wYXRpYmlsaXR5IHByb2Js ZW1zIHdpdGggZXhpc3RpbmcKPiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgcHJvamVjdCBxdW90YSBh d2FyZS4gRm9yIHRoZW0geW91IGFyZQo+ICpjcmVhdGluZyBuZXcgY29tcGF0aWJpbGl0eSBwcm9i bGVtcyogYnkgaW1wbGVtZW50aW5nIGEgbmV3Cj4gaW50ZXJmYWNlLiBpLmUuIEV4aXN0aW5nIGFw cGxpY2F0aW9ucyB3aWxsIG5vdCB3b3JrIG9uIGV4dDQsIGFuZAo+IG5ldyBhcHBsaWNhdGlvbnMg d3JpdHRlbiB0byB3b3JrIG9uIGV4dDQgd29uJ3Qgd29yayBvbiBYRlMuCj4KPiBUaGF0J3MgdGhl IGNydXggb2YgdGhlIGlzc3VlIC0gd2UgaGF2ZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgdXNpbmcK PiB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlIGFuZCBzbyBpbnRyb2R1Y2luZyBhIG5ldyBpbnRlcmZh Y2UgaW50cm9kdWNlcwo+IGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuICBZb3UgY2FuJ3QganVzdCB3 YXZlIHRoaXMgcHJvYmxlbSBhd2F5Cj4gYmVjYXVzZSB5b3UgZG9uJ3QgdGhpbmsgdGhlIGV4aXN0 aW5nIGludGVyZmFjZSBtYXR0ZXJzLgo+Cj4gIkl0J3MgZWFzaWVyIGZvciBtZSB0byBjcmVhdGUg YSBuZXcgaW50ZXJmYWNlIiBpcyBub3QgYSB2YWxpZCByZWFzb24KPiBmb3IgY3JlYXRpbmcgYSBu ZXcgaW50ZXJmYWNlLi4uLgpTb3JyeSBhYm91dCBteSBpZ25vcmFuY2UgYWJvdXQgdGhlIGV4aXN0 aW5nIHVzYWdlIG9mIFhGUwpwcm9qZWN0IHF1b3RhLiBJIGhvcGUgaXQgaXMgd2lkZWx5IHVzZWQu IEJ1dCBkb2VzIGl0IHJlYWxseSBtYXR0ZXJzCmZvciBYRlMgdGhhdCB3aGF0IGtpbmQgb2YgRXh0 NCBpbnRlcmZhY2VzIGlzIGdvaW5nIHRvIHVzZT8KRXhpc3RpbmcgYXBwcGxpY2F0aW9ucyB3b3Vs ZCBydW4gaGFwcGlseSBvbiBYRlMgYW55IHdheQp1c2luZyB0aGUgZXhpc2l0bmcgWEZTIGludGVy ZmFjZXMuIEFuZCBpZiB5b3UgYXJlIGNvbmNlcm5pbmcKYWJvdXQgdGhlIGNvbXBhdGliaWxpdHkg YmV0d2VlbiBFeHQ0IGFuZCBYRlMsIEkgYW0gYWZyYWlkCnRob3NlIGFwcGxpY2F0aW9ucyBoYXZl IHRvIGJlIGNoYW5nZWQgYW55IHdheSB3aGVuIGJlZW4gcG9ydGVkCnRvIEV4dDQuIFNpbmNlIHRo b3NlIGFwcGxpY2F0aW9ucyBhcmUgdXNpbmcgWEZTIHNwZWNpZmljIGZlYXR1cmUsCmkuZS4gcHJv amVjdCBxdW90YSwgaXQgaXMgbGlrZWx5IHRoZXkgYXJlIHVzaW5nIG90aGVyIGtpbmQgb2YgWEZT CnNwZWljaWZpYyBmZWF0dXJlcyB3aGljaCBwcm9iYWJseSB3aWxsIG5ldmVyIGJlIGltcGxlbWVu dGVkIG9uCkV4dDQuIEkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYW55IGVhc3kgd2F5IHRvIHBvcnQg dGhlbSBmcm9tClhGUyB0byBFeHQ0IGFueSB3YXkuIEFuZCBJIHJlYWxseSBkb24ndCB0aGluayB0 aGVyZWEgYXJlIG1hbnkKc3VjaCBraW5kIG9mIGFwcGxpY2F0aW9ucy4gU28sIHNpbmNlIHdlIGFy ZSBub3QgaW1wbGVtZW50aW5nCmludGVyZmFjZXMgZm9yIFhGUzIgb3IgWEZTMywgSSBkb24ndCB0 aGluayBjb21wYXRpYmlsaXR5IHByb2JsZW0KaXMgc28gY3JpdGljYWwuCgpSZWdhcmRzLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIExpIFhpCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp4ZnMgbWFpbGluZyBsaXN0 Cnhmc0Bvc3Muc2dpLmNvbQpodHRwOi8vb3NzLnNnaS5jb20vbWFpbG1hbi9saXN0aW5mby94ZnMK