From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 4204E1391DB for ; Sat, 15 Mar 2014 23:08:34 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 79EF5E09C4; Sat, 15 Mar 2014 23:08:30 +0000 (UTC) Received: from mail-ve0-f169.google.com (mail-ve0-f169.google.com [209.85.128.169]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id BFAECE09BA for ; Sat, 15 Mar 2014 23:08:29 +0000 (UTC) Received: by mail-ve0-f169.google.com with SMTP id pa12so4383399veb.0 for ; Sat, 15 Mar 2014 16:08:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=ZPClKgWWQqQQNsdYiVNsHprWfm9NrL1nN6rttST0VBY=; b=hA3pS4YGjQsHtbsi0h4yo4nAZOwRIwENAGhhMaPHrjV71zYC8a4dRNA/u3md9WGTlB KggzSHUF40LdZZSleW2OMIukBSpIw5iXmCiMj5FOSdWo/5+gy1q1DEGm7aA68zeygKVt GVYg45JARJvFxSBKvNuOeKCnDPd2hyLcuA24nIDohRIcEn5eJ8cNK3Hp44dZlgKE5Xf6 mECQy9wE1CqTVegvmlyTY8gXnRVFxE36/ADh8OZDx6ocjaiOPOIHIn7OidZ8F26do7G2 Ms7PXdz1F2By0dd3vB15r24qQIB3HqB58YW6LIXRnUQM9b/ywH+EIcNXnCoI8OIVP2H6 aYMA== X-Gm-Message-State: ALoCoQlpfvYQ/c1YFm2ksCjChmmrODb0216AofIgTo4X/acBptqE5N9Kw1hBOr4gaqM7V4d140EJ Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@lists.gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org MIME-Version: 1.0 X-Received: by 10.221.20.199 with SMTP id qp7mr102047vcb.24.1394924908564; Sat, 15 Mar 2014 16:08:28 -0700 (PDT) Sender: antarus@scriptkitty.com Received: by 10.220.59.71 with HTTP; Sat, 15 Mar 2014 16:08:28 -0700 (PDT) X-Originating-IP: [173.8.165.226] In-Reply-To: <20140315133210.32f79f55.dolsen@gentoo.org> References: <20140315133210.32f79f55.dolsen@gentoo.org> Date: Sat, 15 Mar 2014 16:08:28 -0700 X-Google-Sender-Auth: OYGknM1ziqlADNfwgq2CQ5H9oog Message-ID: Subject: Re: [gentoo-portage-dev] plugin-sync progress report From: Alec Warner To: gentoo-portage-dev@lists.gentoo.org Content-Type: multipart/alternative; boundary=001a11339e2ea9ec0204f4ad430a X-Archives-Salt: 3a281fe6-225e-4346-89b3-51a939ad62e2 X-Archives-Hash: 924f1c6f09664d8bdf5a3d89dba37ea4 --001a11339e2ea9ec0204f4ad430a Content-Type: text/plain; charset=UTF-8 On Sat, Mar 15, 2014 at 1:32 PM, Brian Dolbec wrote: > I've started working on the repository/config.py changes needed for the > plugin-sync system. > > First: > The following class performed checks on the > repos.conf entries for the sync variables regardless if they were being > used or not. I would like to remove that code block completely from > this loader/parser. I would prefer to have the sync module perform > it's own checks and only when syncing or from a future emaint module > with that specific 'check-config' option. > > I've sectioned off the code I'd like to remove below. > Is there any reason they must be done here and during initial parsing? > > Advantages: > - No need to import and initialize the sync module and the plugin system > for other emerge/portage operations. > - Should speed things up slightly with less to do. > - Makes the sync module responsible the validation of any sync specific > variables. > > > Second: > - Should all the repos.conf entires to be synced be validated prior to > syncing and fail > if there are any errors? > - Or, just call each sync module's sync() and let each fail individually > and continue syncing remaining repos? > > Third: > - I would like to add a new config item for all repos. > It is a variable to define which sources of sync operations which > the repo will be allowed to be synced from. It could be a space > separated list > which could be used to prevent it from being synced via certain > commands. > As we discussed on IRC, the use case here seemed to be to have some repos that are not synced automatically (eg: via emerge --sync or its equivalent.) I'd propose something more obvious: sync=manual # user has to call emaint sync sync=auto # emerge --sync will sync this repo. -A > i.e: > > [repo1] > sync-from = emerge emaint > > [repo2] > sync-from = emerge emaint layman > > [repo3] > sync-from = None > > - Thoughts? > - Opinions? > > ############ > > class RepoConfigLoader(object): > """Loads and store config of several repositories, loaded from > PORTDIR_OVERLAY or repos.conf""" > > @staticmethod > def _parse(paths, prepos, ignored_map, ignored_location_map, > local_config, portdir): > """Parse files in paths to load config""" > parser = SafeConfigParser() > > # use read_file/readfp in order to control decoding of > unicode > try: > # Python >=3.2 > read_file = parser.read_file > source_kwarg = 'source' > except AttributeError: > read_file = parser.readfp > source_kwarg = 'filename' > > recursive_paths = [] > for p in paths: > if isinstance(p, basestring): > > recursive_paths.extend(_recursive_file_list(p)) > else: > recursive_paths.append(p) > > for p in recursive_paths: > if isinstance(p, basestring): > f = None > try: > f = io.open(_unicode_encode(p, > encoding=_encodings['fs'], > errors='strict'), > mode='r', > encoding=_encodings['repo.content'], > errors='replace') > except EnvironmentError: > pass > else: > # The 'source' keyword argument is > needed since otherwise > # ConfigParser in Python <3.3.3 > may throw a TypeError > # because it assumes that f.nameis a native string rather > # than binary when constructing > error messages. > kwargs = {source_kwarg: p} > read_file(f, > **portage._native_kwargs(kwargs)) > finally: > if f is not None: > f.close() > elif isinstance(p, io.StringIO): > kwargs = {source_kwarg: ""} > read_file(p, > **portage._native_kwargs(kwargs)) > else: > raise TypeError("Unsupported type %r of > element %r of 'paths' argument" % (type(p), p)) > > prepos['DEFAULT'] = RepoConfig("DEFAULT", > parser.defaults(), local_config=local_config) > > for sname in parser.sections(): > optdict = {} > for oname in parser.options(sname): > optdict[oname] = parser.get(sname, oname) > > repo = RepoConfig(sname, optdict, > local_config=local_config) > > ################################### > # remove these checks > ################################### > if repo.sync_type is not None and repo.sync_uri is > None: > writemsg_level("!!! %s\n" % _("Repository > '%s' has sync-type attribute, but is missing sync-uri attribute") % > sname, level=logging.ERROR, > noiselevel=-1) > continue > > if repo.sync_uri is not None and repo.sync_type is > None: > writemsg_level("!!! %s\n" % _("Repository > '%s' has sync-uri attribute, but is missing sync-type attribute") % > sname, level=logging.ERROR, > noiselevel=-1) > continue > > if repo.sync_type not in portage.sync.module_names > + [None]: > writemsg_level("!!! %s\n" % _("Repository > '%s' has sync-type attribute set to unsupported value: '%s'") % > (sname, repo.sync_type), > level=logging.ERROR, noiselevel=-1) > continue > > if repo.sync_type == "cvs" and repo.sync_cvs_repo > is None: > writemsg_level("!!! %s\n" % _("Repository > '%s' has sync-type=cvs, but is missing sync-cvs-repo attribute") % > sname, level=logging.ERROR, > noiselevel=-1) > continue > ################################### > # end remove > ################################### > > # For backward compatibility with locations set > via PORTDIR and > # PORTDIR_OVERLAY, delay validation of the > location and repo.name > # until after PORTDIR and PORTDIR_OVERLAY have > been processed. > prepos[sname] = repo > > > -- > Brian Dolbec > > > --001a11339e2ea9ec0204f4ad430a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGJyPjxkaXYg Y2xhc3M9ImdtYWlsX3F1b3RlIj5PbiBTYXQsIE1hciAxNSwgMjAxNCBhdCAxOjMyIFBNLCBCcmlh biBEb2xiZWMgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86ZG9sc2VuQGdlbnRv by5vcmciIHRhcmdldD0iX2JsYW5rIj5kb2xzZW5AZ2VudG9vLm9yZzwvYT4mZ3Q7PC9zcGFuPiB3 cm90ZTo8YnI+DQo8YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46 MCAwIDAgLjhleDtib3JkZXItbGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij5J JiMzOTt2ZSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIHJlcG9zaXRvcnkvY29uZmlnLnB5IGNoYW5n ZXMgbmVlZGVkIGZvciB0aGU8YnI+DQpwbHVnaW4tc3luYyBzeXN0ZW0uPGJyPg0KPGJyPg0KRmly c3Q6PGJyPg0KwqAgVGhlIGZvbGxvd2luZyBjbGFzcyBwZXJmb3JtZWQgY2hlY2tzIG9uIHRoZTxi cj4NCnJlcG9zLmNvbmYgZW50cmllcyBmb3IgdGhlIHN5bmMgdmFyaWFibGVzIHJlZ2FyZGxlc3Mg aWYgdGhleSB3ZXJlIGJlaW5nPGJyPg0KdXNlZCBvciBub3QuIMKgSSB3b3VsZCBsaWtlIHRvIHJl bW92ZSB0aGF0IGNvZGUgYmxvY2sgY29tcGxldGVseSBmcm9tPGJyPg0KdGhpcyBsb2FkZXIvcGFy c2VyLiDCoEkgd291bGQgcHJlZmVyIHRvIGhhdmUgdGhlIHN5bmMgbW9kdWxlIHBlcmZvcm08YnI+ DQppdCYjMzk7cyBvd24gY2hlY2tzIGFuZCBvbmx5IHdoZW4gc3luY2luZyBvciBmcm9tIGEgZnV0 dXJlIGVtYWludCBtb2R1bGU8YnI+DQp3aXRoIHRoYXQgc3BlY2lmaWMgJiMzOTtjaGVjay1jb25m aWcmIzM5OyBvcHRpb24uPGJyPg0KPGJyPg0KSSYjMzk7dmUgc2VjdGlvbmVkIG9mZiB0aGUgY29k ZSBJJiMzOTtkIGxpa2UgdG8gcmVtb3ZlIGJlbG93Ljxicj4NCklzIHRoZXJlIGFueSByZWFzb24g dGhleSBtdXN0IGJlIGRvbmUgaGVyZSBhbmQgZHVyaW5nIGluaXRpYWwgcGFyc2luZz88YnI+DQo8 YnI+DQpBZHZhbnRhZ2VzOjxicj4NCsKgIC0gTm8gbmVlZCB0byBpbXBvcnQgYW5kIGluaXRpYWxp emUgdGhlIHN5bmMgbW9kdWxlIGFuZCB0aGUgcGx1Z2luIHN5c3RlbTxicj4NCsKgIMKgIGZvciBv dGhlciBlbWVyZ2UvcG9ydGFnZSBvcGVyYXRpb25zLjxicj4NCsKgIC0gU2hvdWxkIHNwZWVkIHRo aW5ncyB1cCBzbGlnaHRseSB3aXRoIGxlc3MgdG8gZG8uPGJyPg0KwqAgLSBNYWtlcyB0aGUgc3lu YyBtb2R1bGUgcmVzcG9uc2libGUgdGhlIHZhbGlkYXRpb24gb2YgYW55IHN5bmMgc3BlY2lmaWMg dmFyaWFibGVzLjxicj4NCjxicj4NCjxicj4NClNlY29uZDo8YnI+DQrCoCAtIFNob3VsZCBhbGwg dGhlIHJlcG9zLmNvbmYgZW50aXJlcyB0byBiZSBzeW5jZWQgYmUgdmFsaWRhdGVkIHByaW9yIHRv IHN5bmNpbmcgYW5kIGZhaWw8YnI+DQrCoCDCoCBpZiB0aGVyZSBhcmUgYW55IGVycm9ycz88YnI+ DQrCoCAtIE9yLCBqdXN0IGNhbGwgZWFjaCBzeW5jIG1vZHVsZSYjMzk7cyBzeW5jKCkgYW5kIGxl dCBlYWNoIGZhaWwgaW5kaXZpZHVhbGx5PGJyPg0KwqAgwqAgYW5kIGNvbnRpbnVlIHN5bmNpbmcg cmVtYWluaW5nIHJlcG9zPzxicj4NCjxicj4NClRoaXJkOjxicj4NCsKgIC0gSSB3b3VsZCBsaWtl IHRvIGFkZCBhIG5ldyBjb25maWcgaXRlbSBmb3IgYWxsIHJlcG9zLjxicj4NCsKgIMKgIEl0IGlz IGEgdmFyaWFibGUgdG8gZGVmaW5lIHdoaWNoIHNvdXJjZXMgb2Ygc3luYyBvcGVyYXRpb25zIHdo aWNoPGJyPg0KwqAgwqAgdGhlIHJlcG8gd2lsbCBiZSBhbGxvd2VkIHRvIGJlIHN5bmNlZCBmcm9t LiDCoEl0IGNvdWxkIGJlIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Q8YnI+DQrCoCDCoCB3aGljaCBj b3VsZCBiZSB1c2VkIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBzeW5jZWQgdmlhIGNlcnRhaW4g Y29tbWFuZHMuPGJyPjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PkFzIHdlIGRpc2N1 c3NlZCBvbiBJUkMsIHRoZSB1c2UgY2FzZSBoZXJlIHNlZW1lZCB0byBiZSB0byBoYXZlIHNvbWUg cmVwb3MgdGhhdCBhcmUgbm90IHN5bmNlZCBhdXRvbWF0aWNhbGx5IChlZzogdmlhIGVtZXJnZSAt LXN5bmMgb3IgaXRzIGVxdWl2YWxlbnQuKTwvZGl2Pg0KPGRpdj48YnI+PC9kaXY+PGRpdj5JJiMz OTtkIHByb3Bvc2Ugc29tZXRoaW5nIG1vcmUgb2J2aW91czo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48 ZGl2PnN5bmM9bWFudWFsICMgdXNlciBoYXMgdG8gY2FsbCBlbWFpbnQgc3luYyAmbHQ7cmVwb25h bWUmZ3Q7PC9kaXY+PGRpdj5zeW5jPWF1dG8gIyBlbWVyZ2UgLS1zeW5jIHdpbGwgc3luYyB0aGlz IHJlcG8uPC9kaXY+PGRpdj7CoDwvZGl2PjxkaXY+DQotQTwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxi bG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2Jv cmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPg0KPGJyPg0KwqAgwqAg aS5lOjxicj4NCjxicj4NCsKgIMKgIFtyZXBvMV08YnI+DQrCoCDCoCBzeW5jLWZyb20gPSBlbWVy Z2UgZW1haW50PGJyPg0KPGJyPg0KwqAgwqAgW3JlcG8yXTxicj4NCsKgIMKgIHN5bmMtZnJvbSA9 IGVtZXJnZSBlbWFpbnQgbGF5bWFuPGJyPg0KPGJyPg0KwqAgwqAgW3JlcG8zXTxicj4NCsKgIMKg IHN5bmMtZnJvbSA9IE5vbmU8YnI+DQo8YnI+DQrCoCAtIFRob3VnaHRzPzxicj4NCsKgIC0gT3Bp bmlvbnM/PGJyPg0KPGJyPg0KIyMjIyMjIyMjIyMjPGJyPg0KPGJyPg0KY2xhc3MgUmVwb0NvbmZp Z0xvYWRlcihvYmplY3QpOjxicj4NCsKgIMKgIMKgIMKgICZxdW90OyZxdW90OyZxdW90O0xvYWRz IGFuZCBzdG9yZSBjb25maWcgb2Ygc2V2ZXJhbCByZXBvc2l0b3JpZXMsIGxvYWRlZCBmcm9tIFBP UlRESVJfT1ZFUkxBWSBvciByZXBvcy5jb25mJnF1b3Q7JnF1b3Q7JnF1b3Q7PGJyPg0KPGJyPg0K wqAgwqAgwqAgwqAgQHN0YXRpY21ldGhvZDxicj4NCsKgIMKgIMKgIMKgIGRlZiBfcGFyc2UocGF0 aHMsIHByZXBvcywgaWdub3JlZF9tYXAsIGlnbm9yZWRfbG9jYXRpb25fbWFwLCBsb2NhbF9jb25m aWcsIHBvcnRkaXIpOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICZxdW90OyZxdW90OyZx dW90O1BhcnNlIGZpbGVzIGluIHBhdGhzIHRvIGxvYWQgY29uZmlnJnF1b3Q7JnF1b3Q7JnF1b3Q7 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGFyc2VyID0gU2FmZUNvbmZpZ1BhcnNlcigp PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIyB1c2UgcmVhZF9maWxlL3JlYWRm cCBpbiBvcmRlciB0byBjb250cm9sIGRlY29kaW5nIG9mIHVuaWNvZGU8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCB0cnk6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgIyBQeXRob24gJmd0Oz0zLjI8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCByZWFkX2ZpbGUgPSBwYXJzZXIucmVhZF9maWxlPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgc291cmNlX2t3YXJnID0gJiMzOTtzb3VyY2UmIzM5Ozxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjo8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWFkX2ZpbGUgPSBwYXJzZXIucmVhZGZwPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc291cmNlX2t3YXJnID0gJiMz OTtmaWxlbmFtZSYjMzk7PGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmVjdXJz aXZlX3BhdGhzID0gW108YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBmb3IgcCBpbiBwYXRo czo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiBpc2luc3RhbmNl KHAsIGJhc2VzdHJpbmcpOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHJlY3Vyc2l2ZV9wYXRocy5leHRlbmQoX3JlY3Vyc2l2ZV9maWxlX2xpc3Qo cCkpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZTo8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWN1cnNpdmVf cGF0aHMuYXBwZW5kKHApPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZm9yIHAg aW4gcmVjdXJzaXZlX3BhdGhzOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGlmIGlzaW5zdGFuY2UocCwgYmFzZXN0cmluZyk6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZiA9IE5vbmU8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB0cnk6PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZiA9IGlvLm9w ZW4oX3VuaWNvZGVfZW5jb2RlKHAsPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZW5jb2Rpbmc9X2VuY29k aW5nc1smIzM5O2ZzJiMzOTtdLCBlcnJvcnM9JiMzOTtzdHJpY3QmIzM5OyksPGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbW9kZT0mIzM5O3ImIzM5OywgZW5jb2Rpbmc9X2VuY29kaW5nc1smIzM5O3JlcG8u Y29udGVudCYjMzk7XSw8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnJvcnM9JiMzOTtyZXBsYWNlJiMz OTspPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg ZXhjZXB0IEVudmlyb25tZW50RXJyb3I6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGFzczxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2U6PGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIyBUaGUgJiMz OTtzb3VyY2UmIzM5OyBrZXl3b3JkIGFyZ3VtZW50IGlzIG5lZWRlZCBzaW5jZSBvdGhlcndpc2U8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAjIENvbmZpZ1BhcnNlciBpbiBQeXRob24gJmx0OzMuMy4zIG1heSB0aHJvdyBhIFR5 cGVFcnJvcjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgICMgYmVjYXVzZSBpdCBhc3N1bWVzIHRoYXQgPGEgaHJlZj0iaHR0cDov L2YubmFtZSIgdGFyZ2V0PSJfYmxhbmsiPmYubmFtZTwvYT4gaXMgYSBuYXRpdmUgc3RyaW5nIHJh dGhlcjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgICMgdGhhbiBiaW5hcnkgd2hlbiBjb25zdHJ1Y3RpbmcgZXJyb3IgbWVzc2Fn ZXMuPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAga3dhcmdzID0ge3NvdXJjZV9rd2FyZzogcH08YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWFkX2ZpbGUo ZiwgKipwb3J0YWdlLl9uYXRpdmVfa3dhcmdzKGt3YXJncykpPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZmluYWxseTo8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiBmIGlz IG5vdCBOb25lOjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGYuY2xvc2UoKTxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsaWYgaXNpbnN0YW5jZShwLCBpby5TdHJpbmdJTyk6 PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAga3dh cmdzID0ge3NvdXJjZV9rd2FyZzogJnF1b3Q7Jmx0O2lvLlN0cmluZ0lPJmd0OyZxdW90O308YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZWFkX2Zp bGUocCwgKipwb3J0YWdlLl9uYXRpdmVfa3dhcmdzKGt3YXJncykpPGJyPg0KwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZTo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByYWlzZSBUeXBlRXJyb3IoJnF1b3Q7VW5zdXBwb3J0 ZWQgdHlwZSAlciBvZiBlbGVtZW50ICVyIG9mICYjMzk7cGF0aHMmIzM5OyBhcmd1bWVudCZxdW90 OyAlICh0eXBlKHApLCBwKSk8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwcmVw b3NbJiMzOTtERUZBVUxUJiMzOTtdID0gUmVwb0NvbmZpZygmcXVvdDtERUZBVUxUJnF1b3Q7LDxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHBhcnNlci5kZWZhdWx0cygp LCBsb2NhbF9jb25maWc9bG9jYWxfY29uZmlnKTxicj4NCjxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGZvciBzbmFtZSBpbiBwYXJzZXIuc2VjdGlvbnMoKTo8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBvcHRkaWN0ID0ge308YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBmb3Igb25hbWUgaW4gcGFyc2VyLm9wdGlvbnMoc25hbWUpOjxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9wdGRp Y3Rbb25hbWVdID0gcGFyc2VyLmdldChzbmFtZSwgb25hbWUpPGJyPg0KPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmVwbyA9IFJlcG9Db25maWcoc25hbWUsIG9wdGRp Y3QsIGxvY2FsX2NvbmZpZz1sb2NhbF9jb25maWcpPGJyPg0KPGJyPg0KIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyM8YnI+DQojIHJlbW92ZSB0aGVzZSBjaGVja3M8YnI+DQojIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGlmIHJlcG8uc3luY190eXBlIGlzIG5vdCBOb25lIGFuZCByZXBvLnN5 bmNfdXJpIGlzIE5vbmU6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgd3JpdGVtc2dfbGV2ZWwoJnF1b3Q7ISEhICVzXG4mcXVvdDsgJSBfKCZxdW90 O1JlcG9zaXRvcnkgJiMzOTslcyYjMzk7IGhhcyBzeW5jLXR5cGUgYXR0cmlidXRlLCBidXQgaXMg bWlzc2luZyBzeW5jLXVyaSBhdHRyaWJ1dGUmcXVvdDspICU8YnI+DQrCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbmFtZSwgbGV2ZWw9 bG9nZ2luZy5FUlJPUiwgbm9pc2VsZXZlbD0tMSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjb250aW51ZTxicj4NCjxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIHJlcG8uc3luY191cmkgaXMgbm90IE5vbmUgYW5k IHJlcG8uc3luY190eXBlIGlzIE5vbmU6PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgd3JpdGVtc2dfbGV2ZWwoJnF1b3Q7ISEhICVzXG4mcXVvdDsg JSBfKCZxdW90O1JlcG9zaXRvcnkgJiMzOTslcyYjMzk7IGhhcyBzeW5jLXVyaSBhdHRyaWJ1dGUs IGJ1dCBpcyBtaXNzaW5nIHN5bmMtdHlwZSBhdHRyaWJ1dGUmcXVvdDspICU8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbmFt ZSwgbGV2ZWw9bG9nZ2luZy5FUlJPUiwgbm9pc2VsZXZlbD0tMSk8YnI+DQrCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjb250aW51ZTxicj4NCjxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIHJlcG8uc3luY190eXBlIG5vdCBp biBwb3J0YWdlLnN5bmMubW9kdWxlX25hbWVzICsgW05vbmVdOjxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHdyaXRlbXNnX2xldmVsKCZxdW90OyEh ISAlc1xuJnF1b3Q7ICUgXygmcXVvdDtSZXBvc2l0b3J5ICYjMzk7JXMmIzM5OyBoYXMgc3luYy10 eXBlIGF0dHJpYnV0ZSBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWU6ICYjMzk7JXMmIzM5OyZxdW90 OykgJTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIChzbmFtZSwgcmVwby5zeW5jX3R5cGUpLCBsZXZlbD1sb2dnaW5nLkVSUk9S LCBub2lzZWxldmVsPS0xKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGNvbnRpbnVlPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgaWYgcmVwby5zeW5jX3R5cGUgPT0gJnF1b3Q7Y3ZzJnF1b3Q7IGFuZCByZXBv LnN5bmNfY3ZzX3JlcG8gaXMgTm9uZTo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCB3cml0ZW1zZ19sZXZlbCgmcXVvdDshISEgJXNcbiZxdW90OyAl IF8oJnF1b3Q7UmVwb3NpdG9yeSAmIzM5OyVzJiMzOTsgaGFzIHN5bmMtdHlwZT1jdnMsIGJ1dCBp cyBtaXNzaW5nIHN5bmMtY3ZzLXJlcG8gYXR0cmlidXRlJnF1b3Q7KSAlPGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc25hbWUs IGxldmVsPWxvZ2dpbmcuRVJST1IsIG5vaXNlbGV2ZWw9LTEpPGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY29udGludWU8YnI+DQojIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzxicj4NCiMgZW5kIHJlbW92ZTxicj4NCiMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPGJyPg0KPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxvY2F0 aW9ucyBzZXQgdmlhIFBPUlRESVIgYW5kPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgIyBQT1JURElSX09WRVJMQVksIGRlbGF5IHZhbGlkYXRpb24gb2YgdGhlIGxvY2F0 aW9uIGFuZCA8YSBocmVmPSJodHRwOi8vcmVwby5uYW1lIiB0YXJnZXQ9Il9ibGFuayI+cmVwby5u YW1lPC9hPjxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICMgdW50aWwg YWZ0ZXIgUE9SVERJUiBhbmQgUE9SVERJUl9PVkVSTEFZIGhhdmUgYmVlbiBwcm9jZXNzZWQuPGJy Pg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcHJlcG9zW3NuYW1lXSA9IHJl cG88YnI+DQo8c3BhbiBjbGFzcz0iSE9FblpiIj48Zm9udCBjb2xvcj0iIzg4ODg4OCI+PGJyPg0K PGJyPg0KLS08YnI+DQpCcmlhbiBEb2xiZWMgJmx0O2RvbHNlbiZndDs8YnI+DQo8YnI+DQo8YnI+ DQo8L2ZvbnQ+PC9zcGFuPjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PC9kaXY+PC9kaXY+DQo= --001a11339e2ea9ec0204f4ad430a--