From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ipmail06.adl6.internode.on.net ([150.101.137.145]:2137 "EHLO ipmail06.adl6.internode.on.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751470AbaH2CwY (ORCPT ); Thu, 28 Aug 2014 22:52:24 -0400 Date: Fri, 29 Aug 2014 12:52:18 +1000 From: Dave Chinner Subject: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-ID: <20140829025218.GG26465@dastard> References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199840-16907-1-git-send-email-iusty@k1024.org> <20140828101628.GS20518@dastard> <20140828222854.GB29940@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140828222854.GB29940@google.com> Sender: fstests-owner@vger.kernel.org To: Iustin Pop Cc: Iustin Pop , xfs@oss.sgi.com, hch@infradead.org, fstests@vger.kernel.org List-ID: On Thu, Aug 28, 2014 at 03:28:54PM -0700, Iustin Pop wrote: > On Don, Aug 28, 2014 at 08:16:28 +1000, Dave Chinner wrote: > > [cc fstests@vger.kernel.org] > > > > On Wed, Aug 27, 2014 at 09:24:00PM -0700, Iustin Pop wrote: > > > Add two tests that check for correct behaviour of XFS_IOC_FSSETXATTR: > > > > > > - 307: check that extent size can always be set on a directory > > > - 308: check that setting a non-zero extent size directly via the ioctl > > > sets the expected flags (EXTSIZE and EXTSZINHERIT) > > > > > > Signed-off-by: Iustin Pop > > > > Minor stuff first: > > > > - xfstests patches should be sent to fstests@vger.kernel.org now. > > OK, will do. There was nothing written in the git repository's README, > hence I chose what I thought best. Documentation always needs updating, and stuff is in the process of being moved around. > > > +# Copyright (c) 2014 Google Inc. All Rights Reserved. > > > > Is that correct? It doesn't match the email address you sent this > > from and I've never seen you post from a @google.com address. I > > always like to check that the copyright assignment is correct in > > situations like this... > > It is correct indeed (and thanks for double-checking). I prefer to send > my interactions/contributions done not as part of my job using my > personal address (hence I always wrote to xfs@ from the same address), > but even in that case, the copyright remains with my employer. > > Just as a confirmation, sending this email from my @google.com address. Thanks, I'll know in future ;) > > > +# now create a 'big' (with extents) directory > > > +mkdir $big > > > +idx=1 > > > +while xfs_bmap $big | grep -q "no extents"; do > > > + touch $big/$idx > > > + idx=$((idx+1)) > > > + if [ "$idx" -gt 1048576 ]; then > > > + # still no extents? giving up > > > + echo "Can't make a directory to have extents even after 1M files" 1>&2 > > > + exit > > > + fi > > > +done > > > > urk. largest inode size is 2kb, which means at most it can fit less > > than 100 dirents in the inode before spilling to extent form. So > > just do a loop that creates 1000 files - there's no need to > > overengineer the test code. > > Will do. It's fine to still check that the directory does have extents, > I hope? $XFS_IO_PROG -c 'bmap -vp' $big | _filter_bmap > > > +int main(int argc, char **argv) { > > > + struct fsxattr fa; > > > + int fd = open(argv[1], O_RDONLY); > > > + if (fd < 0) { > > > + perror("open"); > > > + return 1; > > > + } > > > + fa.fsx_xflags = 0; > > > + fa.fsx_extsize = 1048576 * 8; > > > + int r = xfsctl(argv[1], fd, XFS_IOC_FSSETXATTR, &fa); > > > > .... that code is quite broken. Yes, it would work to set the > > appropriate extent size flags with the kernel > > changes you made, but that's not how this ioctl works. > > > > i.e. it will cause any flag bits that are set on the inode to be > > cleared > > Good point… > > > and it's likely to fail on old kernels beacuse they have > > very different behaviour to what your patch does. > > OK, that I didn't know. (Would you mind quickly explaining?) The extsize hint on the inode is not used by the kernel code unless the XFS_XFLAG_EXTSIZE is also set. So existing kernels may set the inode extszhint field, but the code will ignore it because the flags didn't get set on the inode. See xfs_get_extsz_hint(). With your kernel changes, the above *invalid* code will result in the flags being set on the inode, and so there's a change of behaviour from "old kernel, does not trigger extsz behaviour" to "new kernel, extsz behaviour is invoked". > > We have xfs_io precisely so that we don't have to maintain random > > test code like this throughout xfstests - do it once, do it right, > > use it everywhere. > > I totally agree that xfs_io is what people should use, but I disagree on > the use of xfs_io in this particular test, let me explain why. > > With 3.16-rc1 at least, it is possible to set fsx_extsize to a non-zero > value, without setting the flags (if you call the ioctl directly). Such > an inode will be (unless I'm mistaken) flagged with a warning by > xfs_repair, which means that it's an invalid inode state. Yes, since this commit bd5683f ("xfs_repair: validate inode di_flags field") in 2011 repair will flag that the hint is non-zero but the correct flags are not set. Likewise it will warn if the wrong flags are set. You can get wrong flags set on the inode in many ways, but historically the kernel and repair utilities haven't cared. > So in my view, there's a kernel bug, in that it allows a user land > application to put an inode into a "wrong" state. This particular test > is designed to reproduce this kernel bug, so that the kernel fix can be > verified that is indeed a fix. Yes this is not what xfstests is for. If we fix an API bug, there's little value to testing forever that the API is fixed. What we are trying to cover is that when the parameters are set correctly that the behaviour is correct. If you want to do "is the API validating user input correctly" testing then that's what trinity is for. Dave Jones has long wanted to get better ioctl coverage for filesystem specific operations, so I'd suggest that this is the avenue for testing whether an API behaves correctly and catches all invalid input. Then we get to fix all the problems that trinity causes, just like the mm folk have been doing for the past couple of years... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF8C77F8A for ; Thu, 28 Aug 2014 21:52:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41517AC003 for ; Thu, 28 Aug 2014 19:52:25 -0700 (PDT) Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id g30tn8DzycbK7qdZ for ; Thu, 28 Aug 2014 19:52:23 -0700 (PDT) Date: Fri, 29 Aug 2014 12:52:18 +1000 From: Dave Chinner Subject: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-ID: <20140829025218.GG26465@dastard> References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199840-16907-1-git-send-email-iusty@k1024.org> <20140828101628.GS20518@dastard> <20140828222854.GB29940@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20140828222854.GB29940@google.com> 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: Iustin Pop Cc: hch@infradead.org, Iustin Pop , fstests@vger.kernel.org, xfs@oss.sgi.com T24gVGh1LCBBdWcgMjgsIDIwMTQgYXQgMDM6Mjg6NTRQTSAtMDcwMCwgSXVzdGluIFBvcCB3cm90 ZToKPiBPbiBEb24sIEF1ZyAyOCwgMjAxNCBhdCAwODoxNjoyOCArMTAwMCwgRGF2ZSBDaGlubmVy IHdyb3RlOgo+ID4gW2NjIGZzdGVzdHNAdmdlci5rZXJuZWwub3JnXQo+ID4gCj4gPiBPbiBXZWQs IEF1ZyAyNywgMjAxNCBhdCAwOToyNDowMFBNIC0wNzAwLCBJdXN0aW4gUG9wIHdyb3RlOgo+ID4g PiBBZGQgdHdvIHRlc3RzIHRoYXQgY2hlY2sgZm9yIGNvcnJlY3QgYmVoYXZpb3VyIG9mIFhGU19J T0NfRlNTRVRYQVRUUjoKPiA+ID4gCj4gPiA+IC0gMzA3OiBjaGVjayB0aGF0IGV4dGVudCBzaXpl IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgZGlyZWN0b3J5Cj4gPiA+IC0gMzA4OiBjaGVjayB0aGF0 IHNldHRpbmcgYSBub24temVybyBleHRlbnQgc2l6ZSBkaXJlY3RseSB2aWEgdGhlIGlvY3RsCj4g PiA+ICAgc2V0cyB0aGUgZXhwZWN0ZWQgZmxhZ3MgKEVYVFNJWkUgYW5kIEVYVFNaSU5IRVJJVCkK PiA+ID4gCj4gPiA+IFNpZ25lZC1vZmYtYnk6IEl1c3RpbiBQb3AgPGl1c3R5QGsxMDI0Lm9yZz4K PiA+IAo+ID4gTWlub3Igc3R1ZmYgZmlyc3Q6Cj4gPiAKPiA+IC0geGZzdGVzdHMgcGF0Y2hlcyBz aG91bGQgYmUgc2VudCB0byBmc3Rlc3RzQHZnZXIua2VybmVsLm9yZyBub3cuCj4gCj4gT0ssIHdp bGwgZG8uIFRoZXJlIHdhcyBub3RoaW5nIHdyaXR0ZW4gaW4gdGhlIGdpdCByZXBvc2l0b3J5J3Mg UkVBRE1FLAo+IGhlbmNlIEkgY2hvc2Ugd2hhdCBJIHRob3VnaHQgYmVzdC4KCkRvY3VtZW50YXRp b24gYWx3YXlzIG5lZWRzIHVwZGF0aW5nLCBhbmQgc3R1ZmYgaXMgaW4gdGhlIHByb2Nlc3Mgb2YK YmVpbmcgbW92ZWQgYXJvdW5kLgoKPiA+ID4gKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSBJ bmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgo+ID4gCj4gPiBJcyB0aGF0IGNvcnJlY3Q/IEl0IGRv ZXNuJ3QgbWF0Y2ggdGhlIGVtYWlsIGFkZHJlc3MgeW91IHNlbnQgdGhpcwo+ID4gZnJvbSBhbmQg SSd2ZSBuZXZlciBzZWVuIHlvdSBwb3N0IGZyb20gYSBAZ29vZ2xlLmNvbSBhZGRyZXNzLiAgSQo+ ID4gYWx3YXlzIGxpa2UgdG8gY2hlY2sgdGhhdCB0aGUgY29weXJpZ2h0IGFzc2lnbm1lbnQgaXMg Y29ycmVjdCBpbgo+ID4gc2l0dWF0aW9ucyBsaWtlIHRoaXMuLi4KPiAKPiBJdCBpcyBjb3JyZWN0 IGluZGVlZCAoYW5kIHRoYW5rcyBmb3IgZG91YmxlLWNoZWNraW5nKS4gSSBwcmVmZXIgdG8gc2Vu ZAo+IG15IGludGVyYWN0aW9ucy9jb250cmlidXRpb25zIGRvbmUgbm90IGFzIHBhcnQgb2YgbXkg am9iIHVzaW5nIG15Cj4gcGVyc29uYWwgYWRkcmVzcyAoaGVuY2UgSSBhbHdheXMgd3JvdGUgdG8g eGZzQCBmcm9tIHRoZSBzYW1lIGFkZHJlc3MpLAo+IGJ1dCBldmVuIGluIHRoYXQgY2FzZSwgdGhl IGNvcHlyaWdodCByZW1haW5zIHdpdGggbXkgZW1wbG95ZXIuCj4gCj4gSnVzdCBhcyBhIGNvbmZp cm1hdGlvbiwgc2VuZGluZyB0aGlzIGVtYWlsIGZyb20gbXkgQGdvb2dsZS5jb20gYWRkcmVzcy4K ClRoYW5rcywgSSdsbCBrbm93IGluIGZ1dHVyZSA7KQoKPiA+ID4gKyMgbm93IGNyZWF0ZSBhICdi aWcnICh3aXRoIGV4dGVudHMpIGRpcmVjdG9yeQo+ID4gPiArbWtkaXIgJGJpZwo+ID4gPiAraWR4 PTEKPiA+ID4gK3doaWxlIHhmc19ibWFwICRiaWcgfCBncmVwIC1xICJubyBleHRlbnRzIjsgZG8K PiA+ID4gKwl0b3VjaCAkYmlnLyRpZHgKPiA+ID4gKwlpZHg9JCgoaWR4KzEpKQo+ID4gPiArCWlm IFsgIiRpZHgiIC1ndCAxMDQ4NTc2IF07IHRoZW4KPiA+ID4gKwkJIyBzdGlsbCBubyBleHRlbnRz PyBnaXZpbmcgdXAKPiA+ID4gKwkJZWNobyAiQ2FuJ3QgbWFrZSBhIGRpcmVjdG9yeSB0byBoYXZl IGV4dGVudHMgZXZlbiBhZnRlciAxTSBmaWxlcyIgMT4mMgo+ID4gPiArCQlleGl0Cj4gPiA+ICsJ ZmkKPiA+ID4gK2RvbmUKPiA+IAo+ID4gdXJrLiBsYXJnZXN0IGlub2RlIHNpemUgaXMgMmtiLCB3 aGljaCBtZWFucyBhdCBtb3N0IGl0IGNhbiBmaXQgbGVzcwo+ID4gdGhhbiAxMDAgZGlyZW50cyBp biB0aGUgaW5vZGUgYmVmb3JlIHNwaWxsaW5nIHRvIGV4dGVudCBmb3JtLiBTbwo+ID4ganVzdCBk byBhIGxvb3AgdGhhdCBjcmVhdGVzIDEwMDAgZmlsZXMgLSB0aGVyZSdzIG5vIG5lZWQgdG8KPiA+ IG92ZXJlbmdpbmVlciB0aGUgdGVzdCBjb2RlLgo+IAo+IFdpbGwgZG8uICBJdCdzIGZpbmUgdG8g c3RpbGwgY2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXMgaGF2ZSBleHRlbnRzLAo+IEkgaG9w ZT8KCiRYRlNfSU9fUFJPRyAtYyAnYm1hcCAtdnAnICRiaWcgfCBfZmlsdGVyX2JtYXAKCj4gPiA+ ICtpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKPiA+ID4gKwlzdHJ1Y3QgZnN4YXR0 ciBmYTsKPiA+ID4gKwlpbnQgZmQgPSBvcGVuKGFyZ3ZbMV0sIE9fUkRPTkxZKTsKPiA+ID4gKwlp ZiAoZmQgPCAwKSB7Cj4gPiA+ICsJCXBlcnJvcigib3BlbiIpOwo+ID4gPiArCQlyZXR1cm4gMTsK PiA+ID4gKwl9Cj4gPiA+ICsJZmEuZnN4X3hmbGFncyA9IDA7Cj4gPiA+ICsJZmEuZnN4X2V4dHNp emUgPSAxMDQ4NTc2ICogODsKPiA+ID4gKwlpbnQgciA9IHhmc2N0bChhcmd2WzFdLCBmZCwgWEZT X0lPQ19GU1NFVFhBVFRSLCAmZmEpOwo+ID4gCj4gPiAuLi4uIHRoYXQgY29kZSBpcyBxdWl0ZSBi cm9rZW4uIFllcywgaXQgd291bGQgd29yayB0byBzZXQgdGhlCj4gPiBhcHByb3ByaWF0ZSBleHRl bnQgc2l6ZSBmbGFncyB3aXRoIHRoZSBrZXJuZWwKPiA+IGNoYW5nZXMgeW91IG1hZGUsIGJ1dCB0 aGF0J3Mgbm90IGhvdyB0aGlzIGlvY3RsIHdvcmtzLgo+ID4gCj4gPiBpLmUuIGl0IHdpbGwgY2F1 c2UgYW55IGZsYWcgYml0cyB0aGF0IGFyZSBzZXQgb24gdGhlIGlub2RlIHRvIGJlCj4gPiBjbGVh cmVkCj4gCj4gR29vZCBwb2ludOKApgo+IAo+ID4gYW5kIGl0J3MgbGlrZWx5IHRvIGZhaWwgb24g b2xkIGtlcm5lbHMgYmVhY3VzZSB0aGV5IGhhdmUKPiA+IHZlcnkgZGlmZmVyZW50IGJlaGF2aW91 ciB0byB3aGF0IHlvdXIgcGF0Y2ggZG9lcy4KPiAKPiBPSywgdGhhdCBJIGRpZG4ndCBrbm93LiAo V291bGQgeW91IG1pbmQgcXVpY2tseSBleHBsYWluaW5nPykKClRoZSBleHRzaXplIGhpbnQgb24g dGhlIGlub2RlIGlzIG5vdCB1c2VkIGJ5IHRoZSBrZXJuZWwgY29kZSB1bmxlc3MKdGhlIFhGU19Y RkxBR19FWFRTSVpFIGlzIGFsc28gc2V0LiBTbyBleGlzdGluZyBrZXJuZWxzIG1heSBzZXQgdGhl Cmlub2RlIGV4dHN6aGludCBmaWVsZCwgYnV0IHRoZSBjb2RlIHdpbGwgaWdub3JlIGl0IGJlY2F1 c2UgdGhlIGZsYWdzCmRpZG4ndCBnZXQgc2V0IG9uIHRoZSBpbm9kZS4gU2VlIHhmc19nZXRfZXh0 c3pfaGludCgpLgoKV2l0aCB5b3VyIGtlcm5lbCBjaGFuZ2VzLCB0aGUgYWJvdmUgKmludmFsaWQq IGNvZGUgd2lsbCByZXN1bHQgaW4KdGhlIGZsYWdzIGJlaW5nIHNldCBvbiB0aGUgaW5vZGUsIGFu ZCBzbyB0aGVyZSdzIGEgY2hhbmdlIG9mCmJlaGF2aW91ciBmcm9tICJvbGQga2VybmVsLCBkb2Vz IG5vdCB0cmlnZ2VyIGV4dHN6IGJlaGF2aW91ciIgdG8KIm5ldyBrZXJuZWwsIGV4dHN6IGJlaGF2 aW91ciBpcyBpbnZva2VkIi4KCj4gPiBXZSBoYXZlIHhmc19pbyBwcmVjaXNlbHkgc28gdGhhdCB3 ZSBkb24ndCBoYXZlIHRvIG1haW50YWluIHJhbmRvbQo+ID4gdGVzdCBjb2RlIGxpa2UgdGhpcyB0 aHJvdWdob3V0IHhmc3Rlc3RzIC0gZG8gaXQgb25jZSwgZG8gaXQgcmlnaHQsCj4gPiB1c2UgaXQg ZXZlcnl3aGVyZS4KPiAKPiBJIHRvdGFsbHkgYWdyZWUgdGhhdCB4ZnNfaW8gaXMgd2hhdCBwZW9w bGUgc2hvdWxkIHVzZSwgYnV0IEkgZGlzYWdyZWUgb24KPiB0aGUgdXNlIG9mIHhmc19pbyBpbiB0 aGlzIHBhcnRpY3VsYXIgdGVzdCwgbGV0IG1lIGV4cGxhaW4gd2h5Lgo+IAo+IFdpdGggMy4xNi1y YzEgYXQgbGVhc3QsIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBmc3hfZXh0c2l6ZSB0byBhIG5vbi16 ZXJvCj4gdmFsdWUsIHdpdGhvdXQgc2V0dGluZyB0aGUgZmxhZ3MgKGlmIHlvdSBjYWxsIHRoZSBp b2N0bCBkaXJlY3RseSkuIFN1Y2gKPiBhbiBpbm9kZSAgd2lsbCBiZSAodW5sZXNzIEknbSBtaXN0 YWtlbikgZmxhZ2dlZCB3aXRoIGEgd2FybmluZyBieQo+IHhmc19yZXBhaXIsIHdoaWNoIG1lYW5z IHRoYXQgaXQncyBhbiBpbnZhbGlkIGlub2RlIHN0YXRlLgoKWWVzLCBzaW5jZSB0aGlzIGNvbW1p dCBiZDU2ODNmICgieGZzX3JlcGFpcjogdmFsaWRhdGUgaW5vZGUgZGlfZmxhZ3MKZmllbGQiKSBp biAyMDExIHJlcGFpciB3aWxsIGZsYWcgdGhhdCB0aGUgaGludCBpcyBub24temVybyBidXQgdGhl CmNvcnJlY3QgZmxhZ3MgYXJlIG5vdCBzZXQuIExpa2V3aXNlIGl0IHdpbGwgd2FybiBpZiB0aGUg d3JvbmcgZmxhZ3MKYXJlIHNldC4gWW91IGNhbiBnZXQgd3JvbmcgZmxhZ3Mgc2V0IG9uIHRoZSBp bm9kZSBpbiBtYW55IHdheXMsIGJ1dApoaXN0b3JpY2FsbHkgdGhlIGtlcm5lbCBhbmQgcmVwYWly IHV0aWxpdGllcyBoYXZlbid0IGNhcmVkLgoKPiBTbyBpbiBteSB2aWV3LCB0aGVyZSdzIGEga2Vy bmVsIGJ1ZywgaW4gdGhhdCBpdCBhbGxvd3MgYSB1c2VyIGxhbmQKPiBhcHBsaWNhdGlvbiB0byBw dXQgYW4gaW5vZGUgaW50byBhICJ3cm9uZyIgc3RhdGUuIFRoaXMgcGFydGljdWxhciB0ZXN0Cj4g aXMgZGVzaWduZWQgdG8gcmVwcm9kdWNlIHRoaXMga2VybmVsIGJ1Zywgc28gdGhhdCB0aGUga2Vy bmVsIGZpeCBjYW4gYmUKPiB2ZXJpZmllZCB0aGF0IGlzIGluZGVlZCBhIGZpeC4KClllcyB0aGlz IGlzIG5vdCB3aGF0IHhmc3Rlc3RzIGlzIGZvci4gSWYgd2UgZml4IGFuIEFQSSBidWcsIHRoZXJl J3MKbGl0dGxlIHZhbHVlIHRvIHRlc3RpbmcgZm9yZXZlciB0aGF0IHRoZSBBUEkgaXMgZml4ZWQu IFdoYXQgd2UgYXJlCnRyeWluZyB0byBjb3ZlciBpcyB0aGF0IHdoZW4gdGhlIHBhcmFtZXRlcnMg YXJlIHNldCBjb3JyZWN0bHkgdGhhdAp0aGUgYmVoYXZpb3VyIGlzIGNvcnJlY3QuCgpJZiB5b3Ug d2FudCB0byBkbyAiaXMgdGhlIEFQSSB2YWxpZGF0aW5nIHVzZXIgaW5wdXQgY29ycmVjdGx5Igp0 ZXN0aW5nIHRoZW4gdGhhdCdzIHdoYXQgdHJpbml0eSBpcyBmb3IuIERhdmUgSm9uZXMgaGFzIGxv bmcgd2FudGVkCnRvIGdldCBiZXR0ZXIgaW9jdGwgY292ZXJhZ2UgZm9yIGZpbGVzeXN0ZW0gc3Bl Y2lmaWMgb3BlcmF0aW9ucywgc28KSSdkIHN1Z2dlc3QgdGhhdCB0aGlzIGlzIHRoZSBhdmVudWUg Zm9yIHRlc3Rpbmcgd2hldGhlciBhbiBBUEkKYmVoYXZlcyBjb3JyZWN0bHkgYW5kIGNhdGNoZXMg YWxsIGludmFsaWQgaW5wdXQuCgpUaGVuIHdlIGdldCB0byBmaXggYWxsIHRoZSBwcm9ibGVtcyB0 aGF0IHRyaW5pdHkgY2F1c2VzLCBqdXN0IGxpa2UKdGhlIG1tIGZvbGsgaGF2ZSBiZWVuIGRvaW5n IGZvciB0aGUgcGFzdCBjb3VwbGUgb2YgeWVhcnMuLi4KCkNoZWVycywKCkRhdmUuCi0tIApEYXZl IENoaW5uZXIKZGF2aWRAZnJvbW9yYml0LmNvbQoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KeGZzIG1haWxpbmcgbGlzdAp4ZnNAb3NzLnNnaS5jb20KaHR0 cDovL29zcy5zZ2kuY29tL21haWxtYW4vbGlzdGluZm8veGZzCg==