Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1esw5N-0004oy-5a for pgadmin-hackers@arkaria.postgresql.org; Mon, 05 Mar 2018 19:47:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1esw5L-000354-TZ for pgadmin-hackers@arkaria.postgresql.org; Mon, 05 Mar 2018 19:47:47 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1esw5L-00034o-Id for pgadmin-hackers@lists.postgresql.org; Mon, 05 Mar 2018 19:47:47 +0000 Received: from mail-it0-x233.google.com ([2607:f8b0:4001:c0b::233]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1esw5F-0001wf-6b for pgadmin-hackers@postgresql.org; Mon, 05 Mar 2018 19:47:46 +0000 Received: by mail-it0-x233.google.com with SMTP id v194so11642404itb.0 for ; Mon, 05 Mar 2018 11:47:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pivotal-io.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=+piQGu4lVU35e7LKg/5EzJUElQAsFwP8bvelfTQwW0o=; b=OKCayXeC3xxA5ZMnn/p/WPo3oo6GZavnPg6ja3LMYGqow7vKuNYjiLEq+meS0bVYcR +PRLziFeWSoI+kIoCeTuxP5uD1o0+fquBDUngGZEu/oDzsMvUoWJBDGADyFRhHcXZId7 0hFTPa3aw64d0f8ae3KwqaFycFm3w185679ZWb1PKWaeV1ziSIgB4YmDkeajkTe+/WBb 86S82R7vXsOYjLDuDBSCal6pOT3Tr+gisKRICpi6zyw1lMMDIPRFuxe0nwsXq/5zxOiv luDgD5hgI3XQewbVvUmkwcsCKzmJqLiNNfaACjbLiIRHVVc8zgL0DuFiJwx/X5gPRMQl fb3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=+piQGu4lVU35e7LKg/5EzJUElQAsFwP8bvelfTQwW0o=; b=fNdKwcFitOP3IQPNaycTx/llWgmQ4qhL07Bx4rhOMc2i5iSViR2S2Q/c+NRhluVMy7 ObU73whtvVPHY0t752Io0G5qTZPi8Kbs8CN80PZYU5//Frcl4YXDLdnpW6oj+iersgO1 HVpZnjr+N+Ts0QPWtctxcRpQDX+xniT3duSd16ZDFep4u3gAJWO815tWO45QWFFFEWQt knZYjW7dKXCWhmAiAoh8BPwCl6K/kiy1nP3/RIVNautFa5d3onv2ZBZIYqMloO6Jgmq9 6GyLUBq1e9v0c2+qjxNOD8QRcXNnj1bwKc/T4kI5BhWiXVehvGmryrxuodM42VdBhzEZ 6Zgg== X-Gm-Message-State: AElRT7HidimKJF5OBKcMpYFYfTWGn4AigHxuCzTjnz7qAQMog8CJ5LU8 5qRcnBh/x4XqmBViKmRufaE5RW6JJfG1jR4OVAwYgA== X-Google-Smtp-Source: AG47ELtx8j4TRMj8K1FbBwkSsSTw6FKzxYOeG4rz3QKuOV84XAhcwsRCsurqljE9yBcKxEReB7qu+vhQQ/Hc6+T6V4E= X-Received: by 10.36.172.21 with SMTP id s21mr15834032ite.95.1520279258192; Mon, 05 Mar 2018 11:47:38 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Joao De Almeida Pereira Date: Mon, 05 Mar 2018 19:47:27 +0000 Message-ID: Subject: Re: [pgAdmin4][RM#3037] Allow user to disable Gravatar image To: Murtuza Zabuawala Cc: pgadmin-hackers Content-Type: multipart/mixed; boundary="94eb2c1fa638252e2e0566af99b0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --94eb2c1fa638252e2e0566af99b0 Content-Type: multipart/alternative; boundary="94eb2c1fa638252e2a0566af99ae" --94eb2c1fa638252e2a0566af99ae Content-Type: text/plain; charset="UTF-8" Hello, I understand that, but what do we win by using it? As you have noticed by now I am not very fond of using templates for everything, and I believe this is one of the things that we can skip templates. We might even shift this to a frontend concern and if we want there are node libraries to get gravatars. I was able to create a PoC as a sample of what I was talking about: - Add gravatar library to package.json - Created a Preferences cache. (js/preferences.js) - So this was the concept I was talking about in a previous email we talked about caching. the getConfiguration and the getAllConfiguration are not great names, but they return a Promise that is consumed in the load_gravatar. The idea here is that we are caching the pgAdmin settings and when need need to consume them, we wait for it to be available. - load_gravatar is using the pattern to retrieve the configuration from a possible cache and then apply the gravatar Things that need to be revisited in the PoC: - No tests, just some spiked code - Did not retrieve the username from the backend, we need to create an endpoint that give us this - The url is hardcoded to get the configuration - Maybe the Preferences is not the correct place to get server_mode configuration not sure, what do you think? Thanks Joao On Mon, Mar 5, 2018 at 11:21 AM Murtuza Zabuawala < murtuza.zabuawala@enterprisedb.com> wrote: > Hi Joao, > > We are using Flask-Gravatar > module for this and it is designed to work with template only. > > -- > Regards, > Murtuza Zabuawala > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > > > On Mon, Mar 5, 2018 at 8:57 PM, Joao De Almeida Pereira < > jdealmeidapereira@pivotal.io> wrote: > >> Hi Murtuza, >> >> Why are we doing this using templates? Can this be done with a request to >> the backend to get the image and then retrieve the Gravatar if it is >> defined or return a static image if not? >> >> + >> +{% if config.SERVER_MODE %} >> window.onload = function(e){ >> setTimeout(function() { >> - var gravatarImg = '> height="18" alt="Gravatar image for {{ username }}"> {{ username }} > class="caret">'; >> + var gravatarImg = {{ IMG.PREPARE_HTML()|safe }} >> //$('#navbar-menu .navbar-right > li > a').html(gravatarImg); >> var navbarRight = >> document.getElementById("navbar-menu").getElementsByClassName("navbar-right")[0]; >> if (navbarRight) { >> >> what if we have >> >> var gravatarImg = '> height="18" alt="Gravatar image for {{ username }}"> {{ username }} > class="caret">'; >> >> And then the endpoint >> /user/{{username}}/gravatar >> would be responsible for returning a Gravatar or not depending on the >> configuration? >> >> >> Thanks >> Joao >> >> On Mon, Mar 5, 2018 at 3:13 AM Murtuza Zabuawala < >> murtuza.zabuawala@enterprisedb.com> wrote: >> >>> Hi, >>> >>> PFA patch to disable Gravatar image in Server mode. >>> >>> Requirments & Issues: >>> - For security reasons. >>> - For systems which do not have internet access. >>> - Hangs pgAdmin4 while loading the page if connection has no internet >>> access (as described in the ticket) >>> >>> -- >>> Regards, >>> Murtuza Zabuawala >>> EnterpriseDB: http://www.enterprisedb.com >>> The Enterprise PostgreSQL Company >>> >>> > --94eb2c1fa638252e2a0566af99ae Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,
I understand that, but what do we win by = using it? As you have noticed by now I am not very fond of using templates = for everything, and I believe this is one of the things that we can skip te= mplates.=C2=A0
We might even shift this to a frontend concern and if we= want there are node libraries to get gravatars.

I= was able to create a PoC as a sample of what I was talking about:
=C2=A0- Add gravatar library to package.json
=C2=A0- Created a = Preferences cache. (js/preferences.js)
=C2=A0 =C2=A0- So this was= the concept I was talking about in a previous email we talked about cachin= g.
=C2=A0 =C2=A0 =C2=A0 the getConfiguration and the getAllConfig= uration are not great names, but they return a Promise that is consumed in = the load_gravatar. The idea here is that we are caching the pgAdmin setting= s and when need need to consume them, we wait for it to be available.
=
=C2=A0- load_gravatar is using the pattern to retrieve the configurati= on from a possible cache and then apply the gravatar


Things that need to be revisited in the PoC:
- = No tests, just some spiked code
- Did not retrieve the username f= rom the backend, we need to create an endpoint that give us this
= - The url is hardcoded to get the configuration
- Maybe the Prefe= rences is not the correct place to get server_mode configuration not sure, = what do you think?


Thanks
Joao

On Mo= n, Mar 5, 2018 at 11:21 AM Murtuza Zabuawala <murtuza.zabuawala@enterprisedb.com> wrot= e:
= Hi Joao,

We are using Flask-Grav= atar module for this and it is designed to work with template only.

--
Reg= ards,
Murtuza Zabuawala
EnterpriseDB:=C2=A0http://www.enterpri= sedb.com
The Enterprise PostgreSQL Company
=
=

On Mon, Mar= 5, 2018 at 8:57 PM, Joao De Almeida Pereira <jdealmeidapereir= a@pivotal.io> wrote:
Hi Murtuza,

Why are we doing this using templ= ates? Can this be done with a request to the backend to get the image and t= hen retrieve the Gravatar if it is defined or return a static image if not?=

+
+{% if config.SERVER_MODE %}
=C2=A0window.onload =3D function(e){
=C2=A0 setTimeout(fun= ction() {
-=C2=A0 =C2=A0var gravatarImg =3D '<img src=3D&q= uot;{{ username | gravatar }}" width=3D"18" height=3D"1= 8" alt=3D"Gravatar image for {{ username }}"> {{ username= }} <span class=3D"caret"></span>';
+= =C2=A0 =C2=A0var gravatarImg =3D {{ IMG.PREPARE_HTML()|safe }}
= =C2=A0 =C2=A0 //$('#navbar-menu .navbar-right > li > a').html= (gravatarImg);
=C2=A0 =C2=A0 var navbarRight =3D document.getElem= entById("navbar-menu").getElementsByClassName("navbar-right&= quot;)[0];
=C2=A0 =C2=A0 if (navbarRight) {

<= /div>
what if we have=C2=A0

var gravatarImg = =3D '<img src=3D"/user/{{username}}/gravatar" width=3D&quo= t;18" height=3D"18" alt=3D"Gravatar image for {{ userna= me }}"> {{ username }} <span class=3D"caret"></s= pan>';

And then the endpoint
= /user/{{username}}/gravatar=C2=A0
would be responsible for return= ing a Gravatar or not depending on the configuration?

<= div>
Thanks
Joao

On Mon, Mar 5, 2018 at 3:13 AM Murtuza Zabuawala &= lt;= murtuza.zabuawala@enterprisedb.com> wrote:
Hi,

=
PFA patch to disable Gravatar image in Server mode.

Requirments & Issues:
<= div class=3D"gmail_default" style=3D"font-family:verdana,sans-serif;color:r= gb(68,68,68)">- For security reasons.
- For systems which do= not have internet access.
- Hangs pgAdmin4 while loading the page if = connection has no internet access (as described in the ticket)

--
Regards,
Murtuza Zabuawala
EnterpriseDB:=C2=A0http://www.= enterprisedb.com
The Enterprise PostgreSQL Company

<= /div>

--94eb2c1fa638252e2a0566af99ae-- --94eb2c1fa638252e2e0566af99b0 Content-Type: text/x-patch; charset="US-ASCII"; name="poc-retrieve-gravatar.diff" Content-Disposition: attachment; filename="poc-retrieve-gravatar.diff" Content-Transfer-Encoding: base64 Content-ID: <161f7b4058116de3f871> X-Attachment-Id: 161f7b4058116de3f871 ZGlmZiAtLWdpdCBhL3dlYi9wYWNrYWdlLmpzb24gYi93ZWIvcGFja2FnZS5qc29uCmluZGV4IDI3 MDdiMzM0Li44ZDYyZTdiNSAxMDA2NDQKLS0tIGEvd2ViL3BhY2thZ2UuanNvbgorKysgYi93ZWIv cGFja2FnZS5qc29uCkBAIC02Niw2ICs2Niw3IEBACiAgICAgImV4cG9ydHMtbG9hZGVyIjogIn4w LjYuNCIsCiAgICAgImZsb3RyMiI6ICJeMC4xLjAiLAogICAgICJmb250LWF3ZXNvbWUiOiAiXjQu Ny4wIiwKKyAgICAiZ3JhdmF0YXIiOiAiXjEuNi4wIiwKICAgICAiaGFyZC1zb3VyY2Utd2VicGFj ay1wbHVnaW4iOiAiXjAuNC45IiwKICAgICAiaW1tdXRhYmlsaXR5LWhlbHBlciI6ICJeMi4yLjAi LAogICAgICJpbXBvcnRzLWxvYWRlciI6ICJeMC43LjEiLApkaWZmIC0tZ2l0IGEvd2ViL3BnYWRt aW4vYnJvd3Nlci90ZW1wbGF0ZXMvYnJvd3Nlci9pbmRleC5odG1sIGIvd2ViL3BnYWRtaW4vYnJv d3Nlci90ZW1wbGF0ZXMvYnJvd3Nlci9pbmRleC5odG1sCmluZGV4IDU4ZmY0M2Y4Li4wOTAxZjQ0 YSAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vYnJvd3Nlci90ZW1wbGF0ZXMvYnJvd3Nlci9pbmRl eC5odG1sCisrKyBiL3dlYi9wZ2FkbWluL2Jyb3dzZXIvdGVtcGxhdGVzL2Jyb3dzZXIvaW5kZXgu aHRtbApAQCAtNSw2ICs1LDcgQEAgdHJ5IHsKIHJlcXVpcmUoCiBbJ3NvdXJjZXMvZ2VuZXJhdGVk L2FwcC5idW5kbGUnXSwKIGZ1bmN0aW9uKCkgeworICAgIHBnQWRtaW4uYXBwbHlBdmF0YXIocGdB ZG1pbik7CiB9LAogZnVuY3Rpb24oKSB7CiAvKiBUT0RPOjogU2hvdyBwcm9wZXIgZXJyb3IgZGlh bG9nICovCkBAIC02NiwxNyArNjcsNiBAQCByZXF1aXJlLm9uUmVzb3VyY2VMb2FkID0gZnVuY3Rp b24gKGNvbnRleHQsIG1hcCwgZGVwTWFwcykgewogICAgIH0sIDQwMCkKICAgfQogfTsKLXdpbmRv dy5vbmxvYWQgPSBmdW5jdGlvbihlKXsKLSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewotICAgdmFy IGdyYXZhdGFySW1nID0gJzxpbWcgc3JjPSJ7eyB1c2VybmFtZSB8IGdyYXZhdGFyIH19IiB3aWR0 aD0iMTgiIGhlaWdodD0iMTgiIGFsdD0iR3JhdmF0YXIgaW1hZ2UgZm9yIHt7IHVzZXJuYW1lIH19 Ij4ge3sgdXNlcm5hbWUgfX0gPHNwYW4gY2xhc3M9ImNhcmV0Ij48L3NwYW4+JzsKLSAgIC8vJCgn I25hdmJhci1tZW51IC5uYXZiYXItcmlnaHQgPiBsaSA+IGEnKS5odG1sKGdyYXZhdGFySW1nKTsK LSAgIHZhciBuYXZiYXJSaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXZiYXItbWVu dSIpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm5hdmJhci1yaWdodCIpWzBdOwotICAgaWYgKG5h dmJhclJpZ2h0KSB7Ci0gICAgIHZhciBsaXN0ID0gbmF2YmFyUmlnaHQuZ2V0RWxlbWVudHNCeVRh Z05hbWUoIkxJIilbMF07Ci0gICAgIGxpc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXS5p bm5lckhUTUwgPSBncmF2YXRhckltZzsKLSAgIH0KLSB9LCAxMDAwKTsKLX07CiAKIHslIGVuZGJs b2NrICV9CiB7JSBibG9jayBib2R5ICV9CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9wcmVmZXJl bmNlcy9fX2luaXRfXy5weSBiL3dlYi9wZ2FkbWluL3ByZWZlcmVuY2VzL19faW5pdF9fLnB5Cmlu ZGV4IGYxZjU3MWNkLi5lNzVhYTRjYiAxMDA2NDQKLS0tIGEvd2ViL3BnYWRtaW4vcHJlZmVyZW5j ZXMvX19pbml0X18ucHkKKysrIGIvd2ViL3BnYWRtaW4vcHJlZmVyZW5jZXMvX19pbml0X18ucHkK QEAgLTIxLDYgKzIxLDcgQEAgZnJvbSBwZ2FkbWluLnV0aWxzLmFqYXggaW1wb3J0IHN1Y2Nlc3Nf cmV0dXJuLCBcCiAgICAgbWFrZV9yZXNwb25zZSBhcyBhamF4X3Jlc3BvbnNlLCBpbnRlcm5hbF9z ZXJ2ZXJfZXJyb3IKIGZyb20gcGdhZG1pbi51dGlscy5tZW51IGltcG9ydCBNZW51SXRlbQogZnJv bSBwZ2FkbWluLnV0aWxzLnByZWZlcmVuY2VzIGltcG9ydCBQcmVmZXJlbmNlcworaW1wb3J0IGNv bmZpZwogCiBNT0RVTEVfTkFNRSA9ICdwcmVmZXJlbmNlcycKIApAQCAtMTYzLDYgKzE2NCwxMCBA QCBkZWYgcHJlZmVyZW5jZXNfcygpOgogICAgICAgICAgICAgICAgICAgICBwWydtb2R1bGUnXSA9 IG1bJ25hbWUnXQogICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHApCiAKKyAgICByZXMu YXBwZW5kKHsnbmFtZSc6ICdwZ2FkbWluJywgJ2NvbmZpZ3VyYXRpb24nOiBbCisgICAgICAgIHsn c2VydmVyX21vZGUnOiBjb25maWcuU0VSVkVSX01PREV9CisgICAgXQorICAgIH0pCiAgICAgcmV0 dXJuIGFqYXhfcmVzcG9uc2UoCiAgICAgICAgIHJlc3BvbnNlPXJlcywKICAgICAgICAgc3RhdHVz PTIwMApkaWZmIC0tZ2l0IGEvd2ViL3BnYWRtaW4vc3RhdGljL2J1bmRsZS9hcHAuanMgYi93ZWIv cGdhZG1pbi9zdGF0aWMvYnVuZGxlL2FwcC5qcwppbmRleCBhMmI4NmY4Ny4uZWM3OGM4OWIgMTAw NjQ0Ci0tLSBhL3dlYi9wZ2FkbWluL3N0YXRpYy9idW5kbGUvYXBwLmpzCisrKyBiL3dlYi9wZ2Fk bWluL3N0YXRpYy9idW5kbGUvYXBwLmpzCkBAIC0xLDYgKzEsNiBAQAogZGVmaW5lKCdhcHAnLCBb Ci0gICdiYWJlbC1wb2x5ZmlsbCcsICdzb3VyY2VzL3BnYWRtaW4nLCAnYnVuZGxlZF9icm93c2Vy JywgJ3BnYWRtaW4uZGF0YWdyaWQnLAotXSwgZnVuY3Rpb24oYmFiZWxQb2x5RmlsbCwgcGdBZG1p bikgeworICAnYmFiZWwtcG9seWZpbGwnLCAnc291cmNlcy9wZ2FkbWluJywgJ3NvdXJjZXMvcHJl ZmVyZW5jZXMnLCAnc291cmNlcy9sb2FkX2dyYXZhdGFyJywgJ2J1bmRsZWRfYnJvd3NlcicsICdw Z2FkbWluLmRhdGFncmlkJywKK10sIGZ1bmN0aW9uKGJhYmVsUG9seUZpbGwsIHBnQWRtaW4sIHBy ZWZlcmVuY2VzLCBncmF2YXRhcikgewogICB2YXIgaW5pdGlhbGl6ZU1vZHVsZXMgPSBmdW5jdGlv bihPYmplY3QpIHsKICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KSB7CiAgICAgICB2YXIgbW9k dWxlID0gT2JqZWN0W2tleV07CkBAIC0yMCw0ICsyMCw3IEBAIGRlZmluZSgnYXBwJywgWwogCiAg ICAgLy8gY3JlYXRlIG1lbnVzIGFmdGVyIGFsbCBtb2R1bGVzIGFyZSBpbml0aWFsaXplZC4KICAg cGdBZG1pbi5Ccm93c2VyLmNyZWF0ZV9tZW51cygpOworCisgIHBnQWRtaW4uU2V0dGluZ3MgPSBu ZXcgcHJlZmVyZW5jZXMuUHJlZmVyZW5jZXMoKTsKKyAgcGdBZG1pbi5hcHBseUF2YXRhciA9IGdy YXZhdGFyLmFwcGx5QXZhdGFyOwogfSk7CmRpZmYgLS1naXQgYS93ZWIvcGdhZG1pbi9zdGF0aWMv anMvbG9hZF9ncmF2YXRhci5qcyBiL3dlYi9wZ2FkbWluL3N0YXRpYy9qcy9sb2FkX2dyYXZhdGFy LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xMzcyYjliNgotLS0gL2Rl di9udWxsCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy9qcy9sb2FkX2dyYXZhdGFyLmpzCkBAIC0w LDAgKzEsMTkgQEAKK2ltcG9ydCBncmF2YXRhciBmcm9tICdncmF2YXRhcic7CisKK2V4cG9ydCBm dW5jdGlvbiBhcHBseUF2YXRhcihwZ0FkbWluKSB7CisgIHBnQWRtaW4uU2V0dGluZ3MuZ2V0Q29u ZmlndXJhdGlvbignc2VydmVyX21vZGUnKQorICAgIC50aGVuKGZ1bmN0aW9uKHNlcnZlcl9tb2Rl KSB7CisgICAgICBjb25zdCB1c2VybmFtZSA9ICdwaXZvdGFsQHBpdm90YWwuaW8nOworICAgICAg aWYgKHNlcnZlcl9tb2RlKSB7CisgICAgICAgIGNvbnN0IGdyYXZhdGFySW1nID0gJzxpbWcgc3Jj PSInICsgZ3JhdmF0YXIudXJsKHVzZXJuYW1lKSArICciIHdpZHRoPSIxOCInICsKKyAgICAgICAg ICAnIGhlaWdodD0iMTgiIGFsdD0iR3JhdmF0YXIgaW1hZ2UgZm9yICcgKyB1c2VybmFtZSArICci PiAnICsgdXNlcm5hbWUgKyAnIDxzcGFuJyArCisgICAgICAgICcgY2xhc3M9ImNhcmV0Ij4nICsg dXNlcm5hbWUgKyAnPC9zcGFuPic7CisKKyAgICAgICAgY29uc3QgbmF2YmFyUmlnaHQgPSBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2YmFyLW1lbnUnKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1l KCduYXZiYXItcmlnaHQnKVswXTsKKyAgICAgICAgaWYgKG5hdmJhclJpZ2h0KSB7CisgICAgICAg ICAgY29uc3QgbGlzdCA9IG5hdmJhclJpZ2h0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdMSScpWzBd OworICAgICAgICAgIGxpc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKVswXS5pbm5lckhUTUwg PSBncmF2YXRhckltZzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworfQpkaWZmIC0tZ2l0 IGEvd2ViL3BnYWRtaW4vc3RhdGljL2pzL3BnYWRtaW4uanMgYi93ZWIvcGdhZG1pbi9zdGF0aWMv anMvcGdhZG1pbi5qcwppbmRleCBmMGY5M2Q5YS4uNjQ4MTU3ZmUgMTAwNjQ0Ci0tLSBhL3dlYi9w Z2FkbWluL3N0YXRpYy9qcy9wZ2FkbWluLmpzCisrKyBiL3dlYi9wZ2FkbWluL3N0YXRpYy9qcy9w Z2FkbWluLmpzCkBAIC0xMDEsNSArMTAxLDcgQEAgZGVmaW5lKFtdLCBmdW5jdGlvbigpIHsKICAg ICByZXR1cm4gMDsKICAgfTsKIAorCisKICAgcmV0dXJuIHBnQWRtaW47CiB9KTsKZGlmZiAtLWdp dCBhL3dlYi9wZ2FkbWluL3N0YXRpYy9qcy9wcmVmZXJlbmNlcy5qcyBiL3dlYi9wZ2FkbWluL3N0 YXRpYy9qcy9wcmVmZXJlbmNlcy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MC4uYzQ2MDk4YmYKLS0tIC9kZXYvbnVsbAorKysgYi93ZWIvcGdhZG1pbi9zdGF0aWMvanMvcHJl ZmVyZW5jZXMuanMKQEAgLTAsMCArMSwzMyBAQAoraW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJzsK K2ltcG9ydCBfIGZyb20gJ3VuZGVyc2NvcmUnOworCitleHBvcnQgY2xhc3MgUHJlZmVyZW5jZXMg eworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLmNvbmZpZyA9IHt9OworICB9CisKKyAgZ2V0 QWxsQ29uZmlndXJhdGlvbigpIHsKKyAgICBsZXQgc2VsZiA9IHRoaXM7CisgICAgcmV0dXJuIGF4 aW9zLmdldCgnaHR0cDovL2xvY2FsaG9zdDo1MDUwL3ByZWZlcmVuY2VzL2dldF9hbGwnKQorICAg ICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7CisgICAgICAgIGNvbnN0IG5vZGUgPSBfLmZpbmRXaGVy ZShyZXNwb25zZS5kYXRhLCB7J25hbWUnOiAncGdhZG1pbid9KTsKKyAgICAgICAgc2VsZi5jb25m aWcgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlWydjb25maWd1cmF0aW9uJ11bMF0pOworICAgICAg fSk7CisgIH0KKworCisgIGdldENvbmZpZ3VyYXRpb24oa2V5KSB7CisgICAgbGV0IHNlbGYgPSB0 aGlzOworICAgIGlmIChzZWxmLmNvbmZpZ1trZXldID09PSB1bmRlZmluZWQpIHsKKyAgICAgIHJl dHVybiB0aGlzLmdldEFsbENvbmZpZ3VyYXRpb24oKQorICAgICAgICAudGhlbigoKSA9PiB7Cisg ICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnW2tleV07CisgICAgICAgIH0pOworICAgIH0KKwor CisgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CisgICAgICByZXNvbHZlKHNl bGYuY29uZmlnW2tleV0pOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS93ZWIveWFybi5s b2NrIGIvd2ViL3lhcm4ubG9jawppbmRleCA2NjZhMjBlNi4uM2M4NzQ0OTYgMTAwNjQ0Ci0tLSBh L3dlYi95YXJuLmxvY2sKKysrIGIvd2ViL3lhcm4ubG9jawpAQCAtMTE4NSw2ICsxMTg1LDEwIEBA IGJsdWViaXJkQF4zLjAuMCwgYmx1ZWJpcmRAXjMuMC41LCBibHVlYmlyZEBeMy4zLjA6CiAgIHZl cnNpb24gIjMuNS4wIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS9i bHVlYmlyZC8tL2JsdWViaXJkLTMuNS4wLnRneiM3OTE0MjBkN2Y1NTFlZWEyODk3NDUzYThhNzc2 NTNmOTY2MDZkNjdjIgogCitibHVlaW1wLW1kNUBeMi4zLjA6CisgIHZlcnNpb24gIjIuMTAuMCIK KyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vYmx1ZWltcC1tZDUvLS9i bHVlaW1wLW1kNS0yLjEwLjAudGd6IzAyZjA4NDM5MjFmOTBkY2ExNGY1Yjg5MjBhMzg1OTMyMDFk Njk2NGQiCisKIGJuLmpzQF40LjAuMCwgYm4uanNAXjQuMS4wLCBibi5qc0BeNC4xLjEsIGJuLmpz QF40LjQuMDoKICAgdmVyc2lvbiAiNC4xMS44IgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3Ry eS55YXJucGtnLmNvbS9ibi5qcy8tL2JuLmpzLTQuMTEuOC50Z3ojMmNkZTA5ZWI1ZWUzNDFmNDg0 NzQ2YmIwMzA5YjMyNTNiMWIxNDQyZiIKQEAgLTI0NTYsNiArMjQ2MCwxMCBAQCBlbGxpcHRpY0Be Ni4wLjA6CiAgICAgbWluaW1hbGlzdGljLWFzc2VydCAiXjEuMC4wIgogICAgIG1pbmltYWxpc3Rp Yy1jcnlwdG8tdXRpbHMgIl4xLjAuMCIKIAorZW1haWwtdmFsaWRhdG9yQF4xLjAuNzoKKyAgdmVy c2lvbiAiMS4xLjEiCisgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cuY29tL2Vt YWlsLXZhbGlkYXRvci8tL2VtYWlsLXZhbGlkYXRvci0xLjEuMS50Z3ojYjA3ZjNiZTdiYWMxZGMw OTliYzQzZTc1ZjZhZTM5OWY1NTJkNWE4MCIKKwogZW1vamlzLWxpc3RAXjIuMC4wOgogICB2ZXJz aW9uICIyLjEuMCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20vZW1v amlzLWxpc3QvLS9lbW9qaXMtbGlzdC0yLjEuMC50Z3ojNGRhYTRkOWRiMDBmOTgxOTg4MGM3OWZh NDU3YWU1YjA5YTFmZDM4OSIKQEAgLTM0MTAsNiArMzQxOCwxNSBAQCBncmFjZWZ1bC1mc0BeNC4w LjAsIGdyYWNlZnVsLWZzQF40LjEuMiwgZ3JhY2VmdWwtZnNAXjQuMS42LCBncmFjZWZ1bC1mc0Be NC4xLjk6CiAgIHZlcnNpb24gIjEuMC4xIgogICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55 YXJucGtnLmNvbS9ncmFjZWZ1bC1yZWFkbGluay8tL2dyYWNlZnVsLXJlYWRsaW5rLTEuMC4xLnRn eiM0Y2FmYWQ3NmJjNjJmMDJmYTAzOWIyZjk0ZTlhM2RkM2EzOTFhNzI1IgogCitncmF2YXRhckBe MS42LjA6CisgIHZlcnNpb24gIjEuNi4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55 YXJucGtnLmNvbS9ncmF2YXRhci8tL2dyYXZhdGFyLTEuNi4wLnRneiM4YmRjOWI3ODZjYTcyNWE4 ZTcwNzY0MTZkMTczMWY4ZDMzMzFjOTc2IgorICBkZXBlbmRlbmNpZXM6CisgICAgYmx1ZWltcC1t ZDUgIl4yLjMuMCIKKyAgICBlbWFpbC12YWxpZGF0b3IgIl4xLjAuNyIKKyAgICBxdWVyeXN0cmlu ZyAiMC4yLjAiCisgICAgeWFyZ3MgIl42LjAuMCIKKwogZ3VscC1kZWNvbXByZXNzQF4xLjIuMDoK ICAgdmVyc2lvbiAiMS4yLjAiCiAgIHJlc29sdmVkICJodHRwczovL3JlZ2lzdHJ5Lnlhcm5wa2cu Y29tL2d1bHAtZGVjb21wcmVzcy8tL2d1bHAtZGVjb21wcmVzcy0xLjIuMC50Z3ojOGVlYjY1YTVl MDE1ZjhlZDg1MzJjYWZlMjg0NTQ5NjA2MjZmMGRjNyIKQEAgLTc3NjgsNiArNzc4NSwxMiBAQCB5 YWxsaXN0QF4yLjEuMjoKICAgdmVyc2lvbiAiMi4xLjIiCiAgIHJlc29sdmVkICJodHRwczovL3Jl Z2lzdHJ5Lnlhcm5wa2cuY29tL3lhbGxpc3QvLS95YWxsaXN0LTIuMS4yLnRneiMxYzExZjkyMThm MDc2MDg5YTQ3ZGQ1MTJmOTNjNjY5OWE2YTgxZDUyIgogCit5YXJncy1wYXJzZXJAXjQuMi4wOgor ICB2ZXJzaW9uICI0LjIuMSIKKyAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5j b20veWFyZ3MtcGFyc2VyLy0veWFyZ3MtcGFyc2VyLTQuMi4xLnRneiMyOWNjZWFjMGRjNGYwM2M2 Yzg3YjRhOWYyMTdkZDE4YzlmNzQ4NzFjIgorICBkZXBlbmRlbmNpZXM6CisgICAgY2FtZWxjYXNl ICJeMy4wLjAiCisKIHlhcmdzLXBhcnNlckBeNS4wLjA6CiAgIHZlcnNpb24gIjUuMC4wIgogICBy ZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS95YXJncy1wYXJzZXIvLS95YXJn cy1wYXJzZXItNS4wLjAudGd6IzI3NWVjZjBkN2ZmZTA1Yzc3ZTY0ZTdjODZlNGNkOTRiZjBlMTIy OGEiCkBAIC03NzgwLDYgKzc4MDMsMjQgQEAgeWFyZ3MtcGFyc2VyQF43LjAuMDoKICAgZGVwZW5k ZW5jaWVzOgogICAgIGNhbWVsY2FzZSAiXjQuMS4wIgogCit5YXJnc0BeNi4wLjA6CisgIHZlcnNp b24gIjYuNi4wIgorICByZXNvbHZlZCAiaHR0cHM6Ly9yZWdpc3RyeS55YXJucGtnLmNvbS95YXJn cy8tL3lhcmdzLTYuNi4wLnRneiM3ODJlYzIxZWY0MDMzNDVmODMwYTgwOGNhM2Q1MTNhZjU2MDY1 MjA4IgorICBkZXBlbmRlbmNpZXM6CisgICAgY2FtZWxjYXNlICJeMy4wLjAiCisgICAgY2xpdWkg Il4zLjIuMCIKKyAgICBkZWNhbWVsaXplICJeMS4xLjEiCisgICAgZ2V0LWNhbGxlci1maWxlICJe MS4wLjEiCisgICAgb3MtbG9jYWxlICJeMS40LjAiCisgICAgcmVhZC1wa2ctdXAgIl4xLjAuMSIK KyAgICByZXF1aXJlLWRpcmVjdG9yeSAiXjIuMS4xIgorICAgIHJlcXVpcmUtbWFpbi1maWxlbmFt ZSAiXjEuMC4xIgorICAgIHNldC1ibG9ja2luZyAiXjIuMC4wIgorICAgIHN0cmluZy13aWR0aCAi XjEuMC4yIgorICAgIHdoaWNoLW1vZHVsZSAiXjEuMC4wIgorICAgIHkxOG4gIl4zLjIuMSIKKyAg ICB5YXJncy1wYXJzZXIgIl40LjIuMCIKKwogeWFyZ3NAXjcuMC4wOgogICB2ZXJzaW9uICI3LjEu MCIKICAgcmVzb2x2ZWQgImh0dHBzOi8vcmVnaXN0cnkueWFybnBrZy5jb20veWFyZ3MvLS95YXJn cy03LjEuMC50Z3ojNmJhMzE4ZWIxNjk2MTcyN2Y1ZDI4NGY4ZWEwMDNlOGQ2MTU0ZDBjOCIK --94eb2c1fa638252e2e0566af99b0--