# simply put, what this does is let you select your priorities for rooms, and fill in which
# champions you have.
# then the logic finds the champion for each room who has the highest value, with the
# least remaining value for all the other rooms.
# My "database" is missing a lot of information for champions I don't have. If you can
# fill in the blanks, PM me.
# -- Carnou, Earth-228
# Special thanks to Zero and Zero's league, [GLC] The Corps, for helping me fill in the "database".
# Currently missing champions: Luthor, Green Lantern, Joker, Deathstroke, Martian Manhunter,
# Nightwing, TwoFace, Sinestro, Hawkgirl, Scarecrow, Constantine, Zatana, Stargirl
# we can fill out these rooms (training, bio_lab, steel, chips, armory, drone, research, power)
# with more data as we get it.
# for any champions not yet listed, it requires clicking on an assignee of each room, getting
# the percentage they contribute, and adding it to each room.
### This section is the "configuration" section
# You list your order of preference for the rooms
# And you list the champions that you have.
# Here, we fill out the list of champions that you actually have. As this
# grows, we'll have more champions in each room than are necessarily in this list
champions = [
'penguin' ,
'red hood' ,
'atom' ,
'vixen' ,
'batman' ,
'superman' ,
'harley quinn' ,
'aquaman' ,
'bane' ,
'black canary' ,
'robin' ,
'flash' ,
'red robin' ,
'poison ivy' ,
'deadshot' ,
'dr fate' ,
'wonder woman' ,
'catwoman' ,
'killer croc' ,
'black adam' ,
'mera' ,
'green arrow' ,
'captain cold' ,
'batgirl' ,
'twoface' ,
]
# Here, we set the priority FROM LOWEST TO HIGHEST
# The algorithm will favor maximizing the rooms at the bottom
# do not add or remove rooms, simply rearrange them
priority = [
'training' ,
'training' ,
'armory' ,
'steel' ,
'steel' ,
'chips' ,
'chips' ,
'steel' ,
'steel' ,
'chips' ,
'chips' ,
'research' ,
'drone' ,
'drone' ,
'bio_lab' ,
'bio_lab' ,
'bio_lab' ,
'bio_lab' ,
'power' ,
'power' ,
]
### This is "the database". It's not really a database, but it's where
# we track champion data for each room
# Once I get the complete database information, this will go in the
# "don't touch!" section
training = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 15 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 15 ,
'wonder woman' : 15 ,
}
bio_lab = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 20 ,
'black adam' : 10 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 20 ,
'mera' : 15 ,
'penguin' : 20 ,
'poison ivy' : 30 ,
'raven' : 30 ,
'red hood' : 15 ,
'red robin' : 20 ,
'robin' : 30 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 20 ,
'superman' : 30 ,
'twoface' : 30 ,
'vixen' : 15 ,
'wonder woman' : 10 ,
}
steel = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 20 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 30 ,
'deadshot' : 30 ,
'dr fate' : 30 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 20 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 30 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 20 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 30 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 15 ,
}
chips = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 20 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'dr fate' : 20 ,
'flash' : 20 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 30 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
armory = {
'aquaman' : 20 ,
'atom' : 10 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 20 ,
'captain cold' : 10 ,
'catwoman' : 15 ,
'cyborg' : 30 ,
'deadshot' : 30 ,
'dr fate' : 30 ,
'flash' : 30 ,
'green arrow' : 15 ,
'green lantern' : 20 ,
'harley quinn' : 20 ,
'joker' : 30 ,
'killer croc' : 15 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 20 ,
'scarecrow' : 20 ,
'shazam' : 20 ,
'stargirl' : 30 ,
'superman' : 20 ,
'twoface' : 30 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
drone = {
'aquaman' : 20 ,
'atom' : 15 ,
'bane' : 20 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'catwoman' : 10 ,
'captain cold' : 10 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'dr fate' : 30 ,
'flash' : 20 ,
'green arrow' : 15 ,
'green lantern' : 30 ,
'harley quinn' : 30 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 20 ,
'red hood' : 10 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 30 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 20 ,
'vixen' : 15 ,
'wonder woman' : 10 ,
}
research = {
'aquaman' : 30 ,
'atom' : 15 ,
'bane' : 30 ,
'batgirl' : 30 ,
'batman' : 30 ,
'black adam' : 10 ,
'black canary' : 20 ,
'catwoman' : 10 ,
'captain cold' : 10 ,
'cyborg' : 20 ,
'deadshot' : 20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 20 ,
'harley quinn' : 30 ,
'joker' : 30 ,
'killer croc' : 10 ,
'luthor' : 30 ,
'mera' : 15 ,
'penguin' : 20 ,
'poison ivy' : 30 ,
'raven' : 20 ,
'red hood' : 15 ,
'red robin' : 30 ,
'robin' : 30 ,
'scarecrow' : 30 ,
'shazam' : 20 ,
'stargirl' : 20 ,
'superman' : 20 ,
'twoface' : 30 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
power = {
'aquaman' : 30 ,
'atom' : 10 ,
'bane' : 30 ,
'batgirl' : 20 ,
'batman' : 30 ,
'black adam' : 15 ,
'black canary' : 30 ,
'captain cold' : 10 ,
'catwoman' : 10 ,
'cyborg' : 30 ,
'deadshot' : 20 ,
'dr fate' : 20 ,
'flash' : 30 ,
'green arrow' : 10 ,
'green lantern' : 30 ,
'harley quinn' : 20 ,
'joker' : 20 ,
'killer croc' : 10 ,
'luthor' : 20 ,
'mera' : 10 ,
'penguin' : 20 ,
'poison ivy' : 20 ,
'raven' : 30 ,
'red hood' : 10 ,
'red robin' : 20 ,
'robin' : 30 ,
'scarecrow' : 20 ,
'shazam' : 30 ,
'stargirl' : 30 ,
'superman' : 30 ,
'twoface' : 20 ,
'vixen' : 10 ,
'wonder woman' : 10 ,
}
### DO NOT MODIFY BEYOND THIS POINT
### (unless you like coding logic)
rooms = {
'training' : training,
'bio_lab' : bio_lab,
'steel' : steel,
'chips' : chips,
'armory' : armory,
'drone' : drone,
'research' : research,
'power' : power,
}
def calculate_value( champion) :
value = sum ( [ rooms[ room] [ champion] for room in priority] )
return value
while priority:
room_name = priority.pop ( )
score = -1
champ = ""
value = 999999
for champion in champions:
champ_value = calculate_value( champion)
if rooms[ room_name] [ champion] > score:
score = rooms[ room_name] [ champion]
champ = champion
value = champ_value
if rooms[ room_name] [ champion] == score and champ_value < value:
score = rooms[ room_name] [ champion]
champ = champion
value = champ_value
champions.remove ( champ)
print ( f"{champ} assigned to {room_name} with {score} points" )
IyBzaW1wbHkgcHV0LCB3aGF0IHRoaXMgZG9lcyBpcyBsZXQgeW91IHNlbGVjdCB5b3VyIHByaW9yaXRpZXMgZm9yIHJvb21zLCBhbmQgZmlsbCBpbiB3aGljaAojIGNoYW1waW9ucyB5b3UgaGF2ZS4KIyB0aGVuIHRoZSBsb2dpYyBmaW5kcyB0aGUgY2hhbXBpb24gZm9yIGVhY2ggcm9vbSB3aG8gaGFzIHRoZSBoaWdoZXN0IHZhbHVlLCB3aXRoIHRoZQojIGxlYXN0IHJlbWFpbmluZyB2YWx1ZSBmb3IgYWxsIHRoZSBvdGhlciByb29tcy4KIyBNeSAiZGF0YWJhc2UiIGlzIG1pc3NpbmcgYSBsb3Qgb2YgaW5mb3JtYXRpb24gZm9yIGNoYW1waW9ucyBJIGRvbid0IGhhdmUuICBJZiB5b3UgY2FuCiMgZmlsbCBpbiB0aGUgYmxhbmtzLCBQTSBtZS4KIyAtLSBDYXJub3UsIEVhcnRoLTIyOAoKIyBTcGVjaWFsIHRoYW5rcyB0byBaZXJvIGFuZCBaZXJvJ3MgbGVhZ3VlLCBbR0xDXSBUaGUgQ29ycHMsIGZvciBoZWxwaW5nIG1lIGZpbGwgaW4gdGhlICJkYXRhYmFzZSIuCiMgQ3VycmVudGx5IG1pc3NpbmcgY2hhbXBpb25zOiBMdXRob3IsIEdyZWVuIExhbnRlcm4sIEpva2VyLCBEZWF0aHN0cm9rZSwgTWFydGlhbiBNYW5odW50ZXIsCiMgTmlnaHR3aW5nLCBUd29GYWNlLCBTaW5lc3RybywgSGF3a2dpcmwsIFNjYXJlY3JvdywgQ29uc3RhbnRpbmUsIFphdGFuYSwgU3RhcmdpcmwKCiMgd2UgY2FuIGZpbGwgb3V0IHRoZXNlIHJvb21zICh0cmFpbmluZywgYmlvX2xhYiwgc3RlZWwsIGNoaXBzLCBhcm1vcnksIGRyb25lLCByZXNlYXJjaCwgcG93ZXIpCiMgd2l0aCBtb3JlIGRhdGEgYXMgd2UgZ2V0IGl0LgojIGZvciBhbnkgY2hhbXBpb25zIG5vdCB5ZXQgbGlzdGVkLCBpdCByZXF1aXJlcyBjbGlja2luZyBvbiBhbiBhc3NpZ25lZSBvZiBlYWNoIHJvb20sIGdldHRpbmcgCiMgdGhlIHBlcmNlbnRhZ2UgdGhleSBjb250cmlidXRlLCBhbmQgYWRkaW5nIGl0IHRvIGVhY2ggcm9vbS4KCiMjIyBUaGlzIHNlY3Rpb24gaXMgdGhlICJjb25maWd1cmF0aW9uIiBzZWN0aW9uCiMgWW91IGxpc3QgeW91ciBvcmRlciBvZiBwcmVmZXJlbmNlIGZvciB0aGUgcm9vbXMKIyBBbmQgeW91IGxpc3QgdGhlIGNoYW1waW9ucyB0aGF0IHlvdSBoYXZlLgoKIyBIZXJlLCB3ZSBmaWxsIG91dCB0aGUgbGlzdCBvZiBjaGFtcGlvbnMgdGhhdCB5b3UgYWN0dWFsbHkgaGF2ZS4gIEFzIHRoaXMKIyBncm93cywgd2UnbGwgaGF2ZSBtb3JlIGNoYW1waW9ucyBpbiBlYWNoIHJvb20gdGhhbiBhcmUgbmVjZXNzYXJpbHkgaW4gdGhpcyBsaXN0CmNoYW1waW9ucyA9IFsKCSdwZW5ndWluJywKCSdyZWQgaG9vZCcsCgknYXRvbScsCgkndml4ZW4nLAoJJ2JhdG1hbicsCgknc3VwZXJtYW4nLAoJJ2hhcmxleSBxdWlubicsCgknYXF1YW1hbicsIAoJJ2JhbmUnLAoJJ2JsYWNrIGNhbmFyeScsCgkncm9iaW4nLAoJJ2ZsYXNoJywKCSdyZWQgcm9iaW4nLAoJJ3BvaXNvbiBpdnknLAoJJ2RlYWRzaG90JywKCSdkciBmYXRlJywKCSd3b25kZXIgd29tYW4nLAoJJ2NhdHdvbWFuJywKCSdraWxsZXIgY3JvYycsCgknYmxhY2sgYWRhbScsCgknbWVyYScsCgknZ3JlZW4gYXJyb3cnLAoJJ2NhcHRhaW4gY29sZCcsCgknYmF0Z2lybCcsCgkndHdvZmFjZScsCl0KCiMgSGVyZSwgd2Ugc2V0IHRoZSBwcmlvcml0eSBGUk9NIExPV0VTVCBUTyBISUdIRVNUCiMgVGhlIGFsZ29yaXRobSB3aWxsIGZhdm9yIG1heGltaXppbmcgdGhlIHJvb21zIGF0IHRoZSBib3R0b20KIyBkbyBub3QgYWRkIG9yIHJlbW92ZSByb29tcywgc2ltcGx5IHJlYXJyYW5nZSB0aGVtCnByaW9yaXR5ID0gWwogICAgJ3RyYWluaW5nJywgCiAgICAndHJhaW5pbmcnLCAKICAgICdhcm1vcnknLCAKICAgICdzdGVlbCcsIAogICAgJ3N0ZWVsJywgCiAgICAnY2hpcHMnLCAKICAgICdjaGlwcycsIAogICAgJ3N0ZWVsJywgCiAgICAnc3RlZWwnLCAKICAgICdjaGlwcycsIAogICAgJ2NoaXBzJywgCiAgICAncmVzZWFyY2gnLCAKICAgICdkcm9uZScsIAogICAgJ2Ryb25lJywgCiAgICAnYmlvX2xhYicsIAogICAgJ2Jpb19sYWInLCAKICAgICdiaW9fbGFiJywgCiAgICAnYmlvX2xhYicsIAogICAgJ3Bvd2VyJywKICAgICdwb3dlcicsCiAgICBdCiAKIyMjIFRoaXMgaXMgInRoZSBkYXRhYmFzZSIuICBJdCdzIG5vdCByZWFsbHkgYSBkYXRhYmFzZSwgYnV0IGl0J3Mgd2hlcmUKIyB3ZSB0cmFjayBjaGFtcGlvbiBkYXRhIGZvciBlYWNoIHJvb20KIyBPbmNlIEkgZ2V0IHRoZSBjb21wbGV0ZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiwgdGhpcyB3aWxsIGdvIGluIHRoZSAKIyAiZG9uJ3QgdG91Y2ghIiBzZWN0aW9uCnRyYWluaW5nID0gewogICAgJ2FxdWFtYW4nOiAzMCwKICAgICdhdG9tJzogMTUsCiAgICAnYmFuZSc6IDMwLAogICAgJ2JhdGdpcmwnOiAzMCwKICAgICdiYXRtYW4nOiAzMCwKICAgICdibGFjayBhZGFtJzogMTAsCiAgICAnYmxhY2sgY2FuYXJ5JzogMzAsCiAgICAnY2FwdGFpbiBjb2xkJzogMTAsCiAgICAnY2F0d29tYW4nOiAxNSwKICAgICdjeWJvcmcnOiAyMCwKICAgICdkZWFkc2hvdCc6IDIwLAogICAgJ2RyIGZhdGUnOiAyMCwKICAgICdmbGFzaCc6IDMwLAogICAgJ2dyZWVuIGFycm93JzogMTUsCiAgICAnZ3JlZW4gbGFudGVybic6IDIwLAogICAgJ2hhcmxleSBxdWlubic6IDMwLAogICAgJ2pva2VyJzogMzAsCiAgICAna2lsbGVyIGNyb2MnOiAxNSwKICAgICdsdXRob3InOiAzMCwKICAgICdtZXJhJzogMTAsCiAgICAncGVuZ3Vpbic6IDIwLAogICAgJ3BvaXNvbiBpdnknOiAyMCwKICAgICdyYXZlbic6IDIwLAogICAgJ3JlZCBob29kJzogMTUsCiAgICAncmVkIHJvYmluJzogMzAsCiAgICAncm9iaW4nOiAzMCwgCiAgICAnc2NhcmVjcm93JzogMzAsCiAgICAnc2hhemFtJzogMjAsCiAgICAnc3RhcmdpcmwnOiAyMCwKICAgICdzdXBlcm1hbic6IDMwLAogICAgJ3R3b2ZhY2UnOiAyMCwKICAgICd2aXhlbic6IDE1LAogICAgJ3dvbmRlciB3b21hbic6IDE1LAp9CgpiaW9fbGFiID0gewogICAgJ2FxdWFtYW4nOiAzMCwKICAgICdhdG9tJzogMTUsCiAgICAnYmFuZSc6IDMwLAogICAgJ2JhdGdpcmwnOiAyMCwKICAgICdiYXRtYW4nOiAyMCwKICAgICdibGFjayBhZGFtJzogMTAsCiAgICAnYmxhY2sgY2FuYXJ5JzogMzAsCiAgICAnY2FwdGFpbiBjb2xkJzogMTAsCiAgICAnY2F0d29tYW4nOiAxMCwKICAgICdjeWJvcmcnOiAyMCwKICAgICdkZWFkc2hvdCc6IDIwLAogICAgJ2RyIGZhdGUnOiAyMCwKICAgICdmbGFzaCc6IDMwLAogICAgJ2dyZWVuIGFycm93JzogMTAsCiAgICAnZ3JlZW4gbGFudGVybic6IDMwLAogICAgJ2hhcmxleSBxdWlubic6IDIwLAogICAgJ2pva2VyJzogMzAsCiAgICAna2lsbGVyIGNyb2MnOiAxNSwKICAgICdsdXRob3InOiAyMCwKICAgICdtZXJhJzogMTUsCiAgICAncGVuZ3Vpbic6IDIwLAogICAgJ3BvaXNvbiBpdnknOiAzMCwKICAgICdyYXZlbic6IDMwLAogICAgJ3JlZCBob29kJzogMTUsCiAgICAncmVkIHJvYmluJzogMjAsCiAgICAncm9iaW4nOiAzMCwgCiAgICAnc2NhcmVjcm93JzogMjAsCiAgICAnc2hhemFtJzogMzAsCiAgICAnc3RhcmdpcmwnOiAyMCwKICAgICdzdXBlcm1hbic6IDMwLAogICAgJ3R3b2ZhY2UnOiAzMCwKICAgICd2aXhlbic6IDE1LAogICAgJ3dvbmRlciB3b21hbic6IDEwLAp9CgpzdGVlbCA9IHsKICAgICdhcXVhbWFuJzogMjAsCiAgICAnYXRvbSc6IDEwLAogICAgJ2JhbmUnOiAyMCwKICAgICdiYXRnaXJsJzogMjAsCiAgICAnYmF0bWFuJzogMzAsCiAgICAnYmxhY2sgYWRhbSc6IDE1LAogICAgJ2JsYWNrIGNhbmFyeSc6IDIwLAogICAgJ2NhcHRhaW4gY29sZCc6IDEwLAogICAgJ2NhdHdvbWFuJzogMTAsCiAgICAnY3lib3JnJzogMzAsCiAgICAnZGVhZHNob3QnOiAzMCwKICAgICdkciBmYXRlJzogMzAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDEwLAogICAgJ2dyZWVuIGxhbnRlcm4nOiAzMCwKICAgICdoYXJsZXkgcXVpbm4nOiAyMCwKICAgICdqb2tlcic6IDIwLAogICAgJ2tpbGxlciBjcm9jJzogMTAsCiAgICAnbHV0aG9yJzogMjAsCiAgICAnbWVyYSc6IDEwLAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMjAsCiAgICAncmF2ZW4nOiAzMCwKICAgICdyZWQgaG9vZCc6IDEwLAogICAgJ3JlZCByb2Jpbic6IDIwLAogICAgJ3JvYmluJzogMjAsIAogICAgJ3NjYXJlY3Jvdyc6IDIwLAogICAgJ3NoYXphbSc6IDMwLAogICAgJ3N0YXJnaXJsJzogMzAsCiAgICAnc3VwZXJtYW4nOiAzMCwKICAgICd0d29mYWNlJzogMjAsCiAgICAndml4ZW4nOiAxMCwKICAgICd3b25kZXIgd29tYW4nOiAxNSwKfQoKY2hpcHMgPSB7CiAgICAnYXF1YW1hbic6IDIwLAogICAgJ2F0b20nOiAxMCwKICAgICdiYW5lJzogMjAsCiAgICAnYmF0Z2lybCc6IDMwLAogICAgJ2JhdG1hbic6IDMwLAogICAgJ2JsYWNrIGFkYW0nOiAxMCwKICAgICdibGFjayBjYW5hcnknOiAyMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjYXR3b21hbic6IDE1LAogICAgJ2N5Ym9yZyc6IDMwLAogICAgJ2RlYWRzaG90JzogMjAsCiAgICAnZHIgZmF0ZSc6IDIwLAogICAgJ2ZsYXNoJzogMjAsCiAgICAnZ3JlZW4gYXJyb3cnOiAxNSwKICAgICdncmVlbiBsYW50ZXJuJzogMjAsCiAgICAnaGFybGV5IHF1aW5uJzogMzAsCiAgICAnam9rZXInOiAyMCwKICAgICdraWxsZXIgY3JvYyc6IDEwLAogICAgJ2x1dGhvcic6IDMwLAogICAgJ21lcmEnOiAxMCwKICAgICdwZW5ndWluJzogMzAsCiAgICAncG9pc29uIGl2eSc6IDIwLAogICAgJ3JhdmVuJzogMjAsCiAgICAncmVkIGhvb2QnOiAxMCwKICAgICdyZWQgcm9iaW4nOiAzMCwKICAgICdyb2Jpbic6IDMwLCAKICAgICdzY2FyZWNyb3cnOiAzMCwKICAgICdzaGF6YW0nOiAyMCwKICAgICdzdGFyZ2lybCc6IDIwLAogICAgJ3N1cGVybWFuJzogMjAsCiAgICAndHdvZmFjZSc6IDIwLAogICAgJ3ZpeGVuJzogMTAsCiAgICAnd29uZGVyIHdvbWFuJzogMTAsCn0KCmFybW9yeSA9IHsKICAgICdhcXVhbWFuJzogMjAsCiAgICAnYXRvbSc6IDEwLAogICAgJ2JhbmUnOiAzMCwKICAgICdiYXRnaXJsJzogMjAsCiAgICAnYmF0bWFuJzogMzAsCiAgICAnYmxhY2sgYWRhbSc6IDE1LAogICAgJ2JsYWNrIGNhbmFyeSc6IDIwLAogICAgJ2NhcHRhaW4gY29sZCc6IDEwLAogICAgJ2NhdHdvbWFuJzogMTUsCiAgICAnY3lib3JnJzogMzAsCiAgICAnZGVhZHNob3QnOiAzMCwKICAgICdkciBmYXRlJzogMzAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDE1LAogICAgJ2dyZWVuIGxhbnRlcm4nOiAyMCwKICAgICdoYXJsZXkgcXVpbm4nOiAyMCwKICAgICdqb2tlcic6IDMwLAogICAgJ2tpbGxlciBjcm9jJzogMTUsCiAgICAnbHV0aG9yJzogMzAsCiAgICAnbWVyYSc6IDEwLAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMjAsCiAgICAncmF2ZW4nOiAyMCwKICAgICdyZWQgaG9vZCc6IDEwLAogICAgJ3JlZCByb2Jpbic6IDIwLAogICAgJ3JvYmluJzogMjAsIAogICAgJ3NjYXJlY3Jvdyc6IDIwLAogICAgJ3NoYXphbSc6IDIwLAogICAgJ3N0YXJnaXJsJzogMzAsCiAgICAnc3VwZXJtYW4nOiAyMCwKICAgICd0d29mYWNlJzogMzAsCiAgICAndml4ZW4nOiAxMCwKICAgICd3b25kZXIgd29tYW4nOiAxMCwKfQoKZHJvbmUgPSB7CiAgICAnYXF1YW1hbic6IDIwLAogICAgJ2F0b20nOiAxNSwKICAgICdiYW5lJzogMjAsCiAgICAnYmF0Z2lybCc6IDMwLAogICAgJ2JhdG1hbic6IDMwLAogICAgJ2JsYWNrIGFkYW0nOiAxMCwKICAgICdibGFjayBjYW5hcnknOiAyMCwKICAgICdjYXR3b21hbic6IDEwLAogICAgJ2NhcHRhaW4gY29sZCc6IDEwLAogICAgJ2N5Ym9yZyc6IDMwLAogICAgJ2RlYWRzaG90JzogMjAsCiAgICAnZHIgZmF0ZSc6IDMwLAogICAgJ2ZsYXNoJzogMjAsCiAgICAnZ3JlZW4gYXJyb3cnOiAxNSwKICAgICdncmVlbiBsYW50ZXJuJzogMzAsCiAgICAnaGFybGV5IHF1aW5uJzogMzAsCiAgICAnam9rZXInOiAyMCwKICAgICdraWxsZXIgY3JvYyc6IDEwLAogICAgJ2x1dGhvcic6IDMwLAogICAgJ21lcmEnOiAxMCwKICAgICdwZW5ndWluJzogMjAsCiAgICAncG9pc29uIGl2eSc6IDIwLAogICAgJ3JhdmVuJzogMjAsCiAgICAncmVkIGhvb2QnOiAxMCwKICAgICdyZWQgcm9iaW4nOiAzMCwKICAgICdyb2Jpbic6IDMwLCAKICAgICdzY2FyZWNyb3cnOiAzMCwKICAgICdzaGF6YW0nOiAzMCwKICAgICdzdGFyZ2lybCc6IDIwLAogICAgJ3N1cGVybWFuJzogMjAsCiAgICAndHdvZmFjZSc6IDIwLAogICAgJ3ZpeGVuJzogMTUsCiAgICAnd29uZGVyIHdvbWFuJzogMTAsCn0KCnJlc2VhcmNoID0gewogICAgJ2FxdWFtYW4nOiAzMCwKICAgICdhdG9tJzogMTUsCiAgICAnYmFuZSc6IDMwLAogICAgJ2JhdGdpcmwnOiAzMCwKICAgICdiYXRtYW4nOiAzMCwKICAgICdibGFjayBhZGFtJzogMTAsCiAgICAnYmxhY2sgY2FuYXJ5JzogMjAsCiAgICAnY2F0d29tYW4nOiAxMCwKICAgICdjYXB0YWluIGNvbGQnOiAxMCwKICAgICdjeWJvcmcnOiAyMCwKICAgICdkZWFkc2hvdCc6IDIwLAogICAgJ2RyIGZhdGUnOiAyMCwKICAgICdmbGFzaCc6IDMwLAogICAgJ2dyZWVuIGFycm93JzogMTAsCiAgICAnZ3JlZW4gbGFudGVybic6IDIwLAogICAgJ2hhcmxleSBxdWlubic6IDMwLAogICAgJ2pva2VyJzogMzAsCiAgICAna2lsbGVyIGNyb2MnOiAxMCwKICAgICdsdXRob3InOiAzMCwKICAgICdtZXJhJzogMTUsCiAgICAncGVuZ3Vpbic6IDIwLAogICAgJ3BvaXNvbiBpdnknOiAzMCwKICAgICdyYXZlbic6IDIwLAogICAgJ3JlZCBob29kJzogMTUsCiAgICAncmVkIHJvYmluJzogMzAsCiAgICAncm9iaW4nOiAzMCwgCiAgICAnc2NhcmVjcm93JzogMzAsCiAgICAnc2hhemFtJzogMjAsCiAgICAnc3RhcmdpcmwnOiAyMCwKICAgICdzdXBlcm1hbic6IDIwLAogICAgJ3R3b2ZhY2UnOiAzMCwKICAgICd2aXhlbic6IDEwLAogICAgJ3dvbmRlciB3b21hbic6IDEwLAp9Cgpwb3dlciA9IHsKICAgICdhcXVhbWFuJzogMzAsCiAgICAnYXRvbSc6IDEwLAogICAgJ2JhbmUnOiAzMCwKICAgICdiYXRnaXJsJzogMjAsCiAgICAnYmF0bWFuJzogMzAsCiAgICAnYmxhY2sgYWRhbSc6IDE1LAogICAgJ2JsYWNrIGNhbmFyeSc6IDMwLAogICAgJ2NhcHRhaW4gY29sZCc6IDEwLAogICAgJ2NhdHdvbWFuJzogMTAsCiAgICAnY3lib3JnJzogMzAsCiAgICAnZGVhZHNob3QnOiAyMCwKICAgICdkciBmYXRlJzogMjAsCiAgICAnZmxhc2gnOiAzMCwKICAgICdncmVlbiBhcnJvdyc6IDEwLAogICAgJ2dyZWVuIGxhbnRlcm4nOiAzMCwKICAgICdoYXJsZXkgcXVpbm4nOiAyMCwKICAgICdqb2tlcic6IDIwLAogICAgJ2tpbGxlciBjcm9jJzogMTAsCiAgICAnbHV0aG9yJzogMjAsCiAgICAnbWVyYSc6IDEwLAogICAgJ3Blbmd1aW4nOiAyMCwKICAgICdwb2lzb24gaXZ5JzogMjAsCiAgICAncmF2ZW4nOiAzMCwKICAgICdyZWQgaG9vZCc6IDEwLAogICAgJ3JlZCByb2Jpbic6IDIwLAogICAgJ3JvYmluJzogMzAsIAogICAgJ3NjYXJlY3Jvdyc6IDIwLAogICAgJ3NoYXphbSc6IDMwLAogICAgJ3N0YXJnaXJsJzogMzAsCiAgICAnc3VwZXJtYW4nOiAzMCwKICAgICd0d29mYWNlJzogMjAsCiAgICAndml4ZW4nOiAxMCwKICAgICd3b25kZXIgd29tYW4nOiAxMCwKfQoKIyMjIERPIE5PVCBNT0RJRlkgQkVZT05EIFRISVMgUE9JTlQKIyMjICh1bmxlc3MgeW91IGxpa2UgY29kaW5nIGxvZ2ljKQpyb29tcyA9IHsKICAgICd0cmFpbmluZyc6IHRyYWluaW5nLAogICAgJ2Jpb19sYWInOiBiaW9fbGFiLAogICAgJ3N0ZWVsJzogc3RlZWwsCiAgICAnY2hpcHMnOiBjaGlwcywKICAgICdhcm1vcnknOiBhcm1vcnksCiAgICAnZHJvbmUnOiBkcm9uZSwKICAgICdyZXNlYXJjaCc6IHJlc2VhcmNoLAogICAgJ3Bvd2VyJzogcG93ZXIsCn0KCmRlZiBjYWxjdWxhdGVfdmFsdWUoY2hhbXBpb24pOgogICAgdmFsdWUgPSBzdW0oW3Jvb21zW3Jvb21dW2NoYW1waW9uXSBmb3Igcm9vbSBpbiBwcmlvcml0eV0pCiAgICByZXR1cm4gdmFsdWUKCndoaWxlIHByaW9yaXR5OgogICAgcm9vbV9uYW1lID0gcHJpb3JpdHkucG9wKCkKICAgIHNjb3JlID0gLTEKICAgIGNoYW1wID0gIiIKICAgIHZhbHVlID0gOTk5OTk5CgogICAgZm9yIGNoYW1waW9uIGluIGNoYW1waW9uczoKICAgICAgICBjaGFtcF92YWx1ZSA9IGNhbGN1bGF0ZV92YWx1ZShjaGFtcGlvbikKICAgICAgICBpZiByb29tc1tyb29tX25hbWVdW2NoYW1waW9uXSA+IHNjb3JlOgogICAgICAgICAgICBzY29yZSA9IHJvb21zW3Jvb21fbmFtZV1bY2hhbXBpb25dCiAgICAgICAgICAgIGNoYW1wID0gY2hhbXBpb24KICAgICAgICAgICAgdmFsdWUgPSBjaGFtcF92YWx1ZQogICAgICAgIGlmIHJvb21zW3Jvb21fbmFtZV1bY2hhbXBpb25dID09IHNjb3JlIGFuZCBjaGFtcF92YWx1ZSA8IHZhbHVlOgogICAgICAgICAgICBzY29yZSA9IHJvb21zW3Jvb21fbmFtZV1bY2hhbXBpb25dCiAgICAgICAgICAgIGNoYW1wID0gY2hhbXBpb24KICAgICAgICAgICAgdmFsdWUgPSBjaGFtcF92YWx1ZQogICAgICAgICAgICAKICAgIGNoYW1waW9ucy5yZW1vdmUoY2hhbXApCiAgICBwcmludChmIntjaGFtcH0gYXNzaWduZWQgdG8ge3Jvb21fbmFtZX0gd2l0aCB7c2NvcmV9IHBvaW50cyIpCgoK