def normalizeStreetSuffixes(inputValue):
'''
Use common abbreviations -> USPS standardized abbreviation to replace common street suffixes
Obtains list from https://w...content-available-to-author-only...s.com/send/official-abbreviations.htm
'''
usps_street_abbreviations = {'trpk': 'tpke', 'forges': 'frgs', 'bypas': 'byp', 'mnr': 'mnr', 'viaduct': 'via', 'mnt': 'mt',
'lndng': 'lndg', 'vill': 'vlg', 'aly': 'aly', 'mill': 'ml', 'pts': 'pts', 'centers': 'ctrs', 'row': 'row', 'cnter': 'ctr',
'hrbor': 'hbr', 'tr': 'trl', 'lndg': 'lndg', 'passage': 'psge', 'walks': 'walk', 'frks': 'frks', 'crest': 'crst', 'meadows': 'mdws',
'freewy': 'fwy', 'garden': 'gdn', 'bluffs': 'blfs', 'vlg': 'vlg', 'vly': 'vly', 'fall': 'fall', 'trk': 'trak', 'squares': 'sqs',
'trl': 'trl', 'harbor': 'hbr', 'frry': 'fry', 'div': 'dv', 'straven': 'stra', 'cmp': 'cp', 'grdns': 'gdns', 'villg': 'vlg',
'meadow': 'mdw', 'trails': 'trl', 'streets': 'sts', 'prairie': 'pr', 'hts': 'hts', 'crescent': 'cres', 'pass': 'pass',
'ter': 'ter', 'port': 'prt', 'bluf': 'blf', 'avnue': 'ave', 'lights': 'lgts', 'rpds': 'rpds', 'harbors': 'hbrs',
'mews': 'mews', 'lodg': 'ldg', 'plz': 'plz', 'tracks': 'trak', 'path': 'path', 'pkway': 'pkwy', 'gln': 'gln',
'bot': 'btm', 'drv': 'dr', 'rdg': 'rdg', 'fwy': 'fwy', 'hbr': 'hbr', 'via': 'via', 'divide': 'dv', 'inlt': 'inlt',
'fords': 'frds', 'avenu': 'ave', 'vis': 'vis', 'brk': 'brk', 'rivr': 'riv', 'oval': 'oval', 'gateway': 'gtwy',
'stream': 'strm', 'bayoo': 'byu', 'msn': 'msn', 'knoll': 'knl', 'expressway': 'expy', 'sprng': 'spg',
'flat': 'flt', 'holw': 'holw', 'grden': 'gdn', 'trail': 'trl', 'jctns': 'jcts', 'rdgs': 'rdgs',
'tunnel': 'tunl', 'ml': 'ml', 'fls': 'fls', 'flt': 'flt', 'lks': 'lks', 'mt': 'mt', 'groves': 'grvs',
'vally': 'vly', 'ferry': 'fry', 'parkway': 'pkwy', 'radiel': 'radl', 'strvnue': 'stra', 'fld': 'fld',
'overpass': 'opas', 'plaza': 'plz', 'estate': 'est', 'mntn': 'mtn', 'lock': 'lck', 'orchrd': 'orch',
'strvn': 'stra', 'locks': 'lcks', 'bend': 'bnd', 'kys': 'kys', 'junctions': 'jcts', 'mountin': 'mtn',
'burgs': 'bgs', 'pine': 'pne', 'ldge': 'ldg', 'causway': 'cswy', 'spg': 'spg', 'beach': 'bch', 'ft': 'ft',
'crse': 'crse', 'motorway': 'mtwy', 'bluff': 'blf', 'court': 'ct', 'grov': 'grv', 'sprngs': 'spgs',
'ovl': 'oval', 'villag': 'vlg', 'vdct': 'via', 'neck': 'nck', 'orchard': 'orch', 'light': 'lgt',
'sq': 'sq', 'pkwy': 'pkwy', 'shore': 'shr', 'green': 'grn', 'strm': 'strm', 'islnd': 'is',
'turnpike': 'tpke', 'stra': 'stra', 'mission': 'msn', 'spngs': 'spgs', 'course': 'crse',
'trafficway': 'trfy', 'terrace': 'ter', 'hway': 'hwy', 'avenue': 'ave', 'glen': 'gln',
'boul': 'blvd', 'inlet': 'inlt', 'la': 'ln', 'ln': 'ln', 'frst': 'frst', 'clf': 'clf',
'cres': 'cres', 'brook': 'brk', 'lk': 'lk', 'byp': 'byp', 'shoar': 'shr', 'bypass': 'byp',
'mtin': 'mtn', 'ally': 'aly', 'forest': 'frst', 'junction': 'jct', 'views': 'vws', 'wells': 'wls', 'cen': 'ctr',
'exts': 'exts', 'crt': 'ct', 'corners': 'cors', 'trak': 'trak', 'frway': 'fwy', 'prarie': 'pr', 'crossing': 'xing',
'extn': 'ext', 'cliffs': 'clfs', 'manors': 'mnrs', 'ports': 'prts', 'gatewy': 'gtwy', 'square': 'sq', 'hls': 'hls',
'harb': 'hbr', 'loops': 'loop', 'mdw': 'mdw', 'smt': 'smt', 'rd': 'rd', 'hill': 'hl', 'blf': 'blf',
'highway': 'hwy', 'walk': 'walk', 'clfs': 'clfs', 'brooks': 'brks', 'brnch': 'br', 'aven': 'ave',
'shores': 'shrs', 'iss': 'iss', 'route': 'rte', 'wls': 'wls', 'place': 'pl', 'sumit': 'smt', 'pines': 'pnes',
'trks': 'trak', 'shoal': 'shl', 'strt': 'st', 'frwy': 'fwy', 'heights': 'hts', 'ranches': 'rnch',
'boulevard': 'blvd', 'extnsn': 'ext', 'mdws': 'mdws', 'hollows': 'holw', 'vsta': 'vis', 'plains': 'plns',
'station': 'sta', 'circl': 'cir', 'mntns': 'mtns', 'prts': 'prts', 'shls': 'shls', 'villages': 'vlgs',
'park': 'park', 'nck': 'nck', 'rst': 'rst', 'haven': 'hvn', 'turnpk': 'tpke', 'expy': 'expy', 'sta': 'sta',
'expr': 'expy', 'stn': 'sta', 'expw': 'expy', 'street': 'st', 'str': 'st', 'spurs': 'spur', 'crecent': 'cres',
'rad': 'radl', 'ranch': 'rnch', 'well': 'wl', 'shoals': 'shls', 'alley': 'aly', 'plza': 'plz', 'medows': 'mdws',
'allee': 'aly', 'knls': 'knls', 'ests': 'ests', 'st': 'st', 'anx': 'anx', 'havn': 'hvn', 'paths': 'path', 'bypa': 'byp',
'spgs': 'spgs', 'mills': 'mls', 'parks': 'park', 'byps': 'byp', 'flts': 'flts', 'tunnels': 'tunl', 'club': 'clb', 'sqrs': 'sqs',
'hllw': 'holw', 'manor': 'mnr', 'centre': 'ctr', 'track': 'trak', 'hgts': 'hts', 'rnch': 'rnch', 'crcle': 'cir', 'falls': 'fls',
'landing': 'lndg', 'plaines': 'plns', 'viadct': 'via', 'gdns': 'gdns', 'gtwy': 'gtwy', 'grove': 'grv', 'camp': 'cp', 'tpk': 'tpke',
'drive': 'dr', 'freeway': 'fwy', 'ext': 'ext', 'points': 'pts', 'exp': 'expy', 'ky': 'ky', 'courts': 'cts', 'pky': 'pkwy', 'corner': 'cor',
'crssing': 'xing', 'mnrs': 'mnrs', 'unions': 'uns', 'cyn': 'cyn', 'lodge': 'ldg', 'trfy': 'trfy', 'circle': 'cir', 'bridge': 'brg',
'dl': 'dl', 'dm': 'dm', 'express': 'expy', 'tunls': 'tunl', 'dv': 'dv', 'dr': 'dr', 'shr': 'shr', 'knolls': 'knls', 'greens': 'grns',
'tunel': 'tunl', 'fields': 'flds', 'common': 'cmn', 'orch': 'orch', 'crk': 'crk', 'river': 'riv', 'shl': 'shl', 'view': 'vw',
'crsent': 'cres', 'rnchs': 'rnch', 'crscnt': 'cres', 'arc': 'arc', 'btm': 'btm', 'blvd': 'blvd', 'ways': 'ways', 'radl': 'radl',
'rdge': 'rdg', 'causeway': 'cswy', 'parkwy': 'pkwy', 'juncton': 'jct', 'statn': 'sta', 'gardn': 'gdn', 'mntain': 'mtn',
'crssng': 'xing', 'rapid': 'rpd', 'key': 'ky', 'plns': 'plns', 'wy': 'way', 'cor': 'cor', 'ramp': 'ramp', 'throughway': 'trwy',
'estates': 'ests', 'ck': 'crk', 'loaf': 'lf', 'hvn': 'hvn', 'wall': 'wall', 'hollow': 'holw', 'canyon': 'cyn', 'clb': 'clb',
'cswy': 'cswy', 'village': 'vlg', 'cr': 'crk', 'trce': 'trce', 'cp': 'cp', 'cv': 'cv', 'ct': 'cts', 'pr': 'pr', 'frg': 'frg',
'jction': 'jct', 'pt': 'pt', 'mssn': 'msn', 'frk': 'frk', 'brdge': 'brg', 'cent': 'ctr', 'spur': 'spur', 'frt': 'ft', 'pk': 'park',
'fry': 'fry', 'pl': 'pl', 'lanes': 'ln', 'gtway': 'gtwy', 'prk': 'park', 'vws': 'vws', 'stravenue': 'stra', 'lgt': 'lgt',
'hiway': 'hwy', 'ctr': 'ctr', 'prt': 'prt', 'ville': 'vl', 'plain': 'pln', 'mount': 'mt', 'mls': 'mls', 'loop': 'loop',
'riv': 'riv', 'centr': 'ctr', 'is': 'is', 'prr': 'pr', 'vl': 'vl', 'avn': 'ave', 'vw': 'vw', 'ave': 'ave', 'spng': 'spg',
'hiwy': 'hwy', 'dam': 'dm', 'isle': 'isle', 'crcl': 'cir', 'sqre': 'sq', 'jct': 'jct', 'jctn': 'jct', 'mountain': 'mtn',
'keys': 'kys', 'parkways': 'pkwy', 'drives': 'drs', 'tunl': 'tunl', 'jcts': 'jcts', 'knl': 'knl', 'center': 'ctr',
'driv': 'dr', 'tpke': 'tpke', 'sumitt': 'smt', 'canyn': 'cyn', 'ldg': 'ldg', 'harbr': 'hbr', 'rest': 'rst', 'shoars': 'shrs',
'vist': 'vis', 'gdn': 'gdn', 'islnds': 'iss', 'hills': 'hls', 'cresent': 'cres', 'point': 'pt', 'lake': 'lk', 'vlly': 'vly',
'strav': 'stra', 'crossroad': 'xrd', 'bnd': 'bnd', 'strave': 'stra', 'stravn': 'stra', 'knol': 'knl', 'vlgs': 'vlgs',
'forge': 'frg', 'cntr': 'ctr', 'cape': 'cpe', 'height': 'hts', 'lck': 'lck', 'highwy': 'hwy', 'trnpk': 'tpke', 'rpd': 'rpd',
'boulv': 'blvd', 'circles': 'cirs', 'valleys': 'vlys', 'vst': 'vis', 'creek': 'crk', 'mall': 'mall', 'spring': 'spg',
'brg': 'brg', 'holws': 'holw', 'lf': 'lf', 'est': 'est', 'xing': 'xing', 'trace': 'trce', 'bottom': 'btm',
'streme': 'strm', 'isles': 'isle', 'circ': 'cir', 'forks': 'frks', 'burg': 'bg', 'run': 'run', 'trls': 'trl',
'radial': 'radl', 'lakes': 'lks', 'rue': 'rue', 'vlys': 'vlys', 'br': 'br', 'cors': 'cors', 'pln': 'pln',
'pike': 'pike', 'extension': 'ext', 'island': 'is', 'frd': 'frd', 'lcks': 'lcks', 'terr': 'ter',
'union': 'un', 'extensions': 'exts', 'pkwys': 'pkwy', 'islands': 'iss', 'road': 'rd', 'shrs': 'shrs',
'roads': 'rds', 'glens': 'glns', 'springs': 'spgs', 'missn': 'msn', 'ridge': 'rdg', 'arcade': 'arc',
'bayou': 'byu', 'crsnt': 'cres', 'junctn': 'jct', 'way': 'way', 'valley': 'vly', 'fork': 'frk',
'mountains': 'mtns', 'bottm': 'btm', 'forg': 'frg', 'ht': 'hts', 'ford': 'frd', 'hl': 'hl',
'grdn': 'gdn', 'fort': 'ft', 'traces': 'trce', 'cnyn': 'cyn', 'cir': 'cir', 'un': 'un', 'mtn': 'mtn',
'flats': 'flts', 'anex': 'anx', 'gatway': 'gtwy', 'rapids': 'rpds', 'villiage': 'vlg', 'flds': 'flds',
'coves': 'cvs', 'rvr': 'riv', 'av': 'ave', 'pikes': 'pike', 'grv': 'grv', 'vista': 'vis', 'pnes': 'pnes',
'forests': 'frst', 'field': 'fld', 'branch': 'br', 'grn': 'grn', 'dale': 'dl', 'rds': 'rds', 'annex': 'anx',
'sqr': 'sq', 'cove': 'cv', 'squ': 'sq', 'skyway': 'skwy', 'ridges': 'rdgs', 'hwy': 'hwy', 'tunnl': 'tunl',
'underpass': 'upas', 'cliff': 'clf', 'lane': 'ln', 'land': 'land', 'bch': 'bch', 'dvd': 'dv', 'curve': 'curv',
'cpe': 'cpe', 'summit': 'smt', 'gardens': 'gdns'}
words = inputValue.split()
for w in words:
if w in usps_street_abbreviations.keys():
inputValue = inputValue.replace(w, usps_street_abbreviations[w])
return inputValue
print(normalizeStreetSuffixes('portland port'))
ZGVmIG5vcm1hbGl6ZVN0cmVldFN1ZmZpeGVzKGlucHV0VmFsdWUpOgogICAgICAgICcnJwogICAgICAgIFVzZSBjb21tb24gYWJicmV2aWF0aW9ucyAtPiBVU1BTIHN0YW5kYXJkaXplZCBhYmJyZXZpYXRpb24gdG8gcmVwbGFjZSBjb21tb24gc3RyZWV0IHN1ZmZpeGVzCgogICAgICAgIE9idGFpbnMgbGlzdCBmcm9tIGh0dHBzOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20vc2VuZC9vZmZpY2lhbC1hYmJyZXZpYXRpb25zLmh0bQogICAgICAgICcnJwoKICAgICAgICB1c3BzX3N0cmVldF9hYmJyZXZpYXRpb25zID0geyd0cnBrJzogJ3Rwa2UnLCAnZm9yZ2VzJzogJ2ZyZ3MnLCAnYnlwYXMnOiAnYnlwJywgJ21ucic6ICdtbnInLCAndmlhZHVjdCc6ICd2aWEnLCAnbW50JzogJ210JywKICAgICAgICAgICAgJ2xuZG5nJzogJ2xuZGcnLCAndmlsbCc6ICd2bGcnLCAnYWx5JzogJ2FseScsICdtaWxsJzogJ21sJywgJ3B0cyc6ICdwdHMnLCAnY2VudGVycyc6ICdjdHJzJywgJ3Jvdyc6ICdyb3cnLCAnY250ZXInOiAnY3RyJywKICAgICAgICAgICAgJ2hyYm9yJzogJ2hicicsICd0cic6ICd0cmwnLCAnbG5kZyc6ICdsbmRnJywgJ3Bhc3NhZ2UnOiAncHNnZScsICd3YWxrcyc6ICd3YWxrJywgJ2Zya3MnOiAnZnJrcycsICdjcmVzdCc6ICdjcnN0JywgJ21lYWRvd3MnOiAnbWR3cycsCiAgICAgICAgICAgICdmcmVld3knOiAnZnd5JywgJ2dhcmRlbic6ICdnZG4nLCAnYmx1ZmZzJzogJ2JsZnMnLCAndmxnJzogJ3ZsZycsICd2bHknOiAndmx5JywgJ2ZhbGwnOiAnZmFsbCcsICd0cmsnOiAndHJhaycsICdzcXVhcmVzJzogJ3NxcycsCiAgICAgICAgICAgICd0cmwnOiAndHJsJywgJ2hhcmJvcic6ICdoYnInLCAnZnJyeSc6ICdmcnknLCAnZGl2JzogJ2R2JywgJ3N0cmF2ZW4nOiAnc3RyYScsICdjbXAnOiAnY3AnLCAnZ3JkbnMnOiAnZ2RucycsICd2aWxsZyc6ICd2bGcnLAogICAgICAgICAgICAnbWVhZG93JzogJ21kdycsICd0cmFpbHMnOiAndHJsJywgJ3N0cmVldHMnOiAnc3RzJywgJ3ByYWlyaWUnOiAncHInLCAnaHRzJzogJ2h0cycsICdjcmVzY2VudCc6ICdjcmVzJywgJ3Bhc3MnOiAncGFzcycsCiAgICAgICAgICAgICd0ZXInOiAndGVyJywgJ3BvcnQnOiAncHJ0JywgJ2JsdWYnOiAnYmxmJywgJ2F2bnVlJzogJ2F2ZScsICdsaWdodHMnOiAnbGd0cycsICdycGRzJzogJ3JwZHMnLCAnaGFyYm9ycyc6ICdoYnJzJywKICAgICAgICAgICAgJ21ld3MnOiAnbWV3cycsICdsb2RnJzogJ2xkZycsICdwbHonOiAncGx6JywgJ3RyYWNrcyc6ICd0cmFrJywgJ3BhdGgnOiAncGF0aCcsICdwa3dheSc6ICdwa3d5JywgJ2dsbic6ICdnbG4nLAogICAgICAgICAgICAnYm90JzogJ2J0bScsICdkcnYnOiAnZHInLCAncmRnJzogJ3JkZycsICdmd3knOiAnZnd5JywgJ2hicic6ICdoYnInLCAndmlhJzogJ3ZpYScsICdkaXZpZGUnOiAnZHYnLCAnaW5sdCc6ICdpbmx0JywKICAgICAgICAgICAgJ2ZvcmRzJzogJ2ZyZHMnLCAnYXZlbnUnOiAnYXZlJywgJ3Zpcyc6ICd2aXMnLCAnYnJrJzogJ2JyaycsICdyaXZyJzogJ3JpdicsICdvdmFsJzogJ292YWwnLCAnZ2F0ZXdheSc6ICdndHd5JywKICAgICAgICAgICAgJ3N0cmVhbSc6ICdzdHJtJywgJ2JheW9vJzogJ2J5dScsICdtc24nOiAnbXNuJywgJ2tub2xsJzogJ2tubCcsICdleHByZXNzd2F5JzogJ2V4cHknLCAnc3BybmcnOiAnc3BnJywKICAgICAgICAgICAgJ2ZsYXQnOiAnZmx0JywgJ2hvbHcnOiAnaG9sdycsICdncmRlbic6ICdnZG4nLCAndHJhaWwnOiAndHJsJywgJ2pjdG5zJzogJ2pjdHMnLCAncmRncyc6ICdyZGdzJywKICAgICAgICAgICAgJ3R1bm5lbCc6ICd0dW5sJywgJ21sJzogJ21sJywgJ2Zscyc6ICdmbHMnLCAnZmx0JzogJ2ZsdCcsICdsa3MnOiAnbGtzJywgJ210JzogJ210JywgJ2dyb3Zlcyc6ICdncnZzJywKICAgICAgICAgICAgJ3ZhbGx5JzogJ3ZseScsICdmZXJyeSc6ICdmcnknLCAncGFya3dheSc6ICdwa3d5JywgJ3JhZGllbCc6ICdyYWRsJywgJ3N0cnZudWUnOiAnc3RyYScsICdmbGQnOiAnZmxkJywKICAgICAgICAgICAgJ292ZXJwYXNzJzogJ29wYXMnLCAncGxhemEnOiAncGx6JywgJ2VzdGF0ZSc6ICdlc3QnLCAnbW50bic6ICdtdG4nLCAnbG9jayc6ICdsY2snLCAnb3JjaHJkJzogJ29yY2gnLAogICAgICAgICAgICAnc3Rydm4nOiAnc3RyYScsICdsb2Nrcyc6ICdsY2tzJywgJ2JlbmQnOiAnYm5kJywgJ2t5cyc6ICdreXMnLCAnanVuY3Rpb25zJzogJ2pjdHMnLCAnbW91bnRpbic6ICdtdG4nLAogICAgICAgICAgICAnYnVyZ3MnOiAnYmdzJywgJ3BpbmUnOiAncG5lJywgJ2xkZ2UnOiAnbGRnJywgJ2NhdXN3YXknOiAnY3N3eScsICdzcGcnOiAnc3BnJywgJ2JlYWNoJzogJ2JjaCcsICdmdCc6ICdmdCcsCiAgICAgICAgICAgICdjcnNlJzogJ2Nyc2UnLCAnbW90b3J3YXknOiAnbXR3eScsICdibHVmZic6ICdibGYnLCAnY291cnQnOiAnY3QnLCAnZ3Jvdic6ICdncnYnLCAnc3BybmdzJzogJ3NwZ3MnLAogICAgICAgICAgICAnb3ZsJzogJ292YWwnLCAndmlsbGFnJzogJ3ZsZycsICd2ZGN0JzogJ3ZpYScsICduZWNrJzogJ25jaycsICdvcmNoYXJkJzogJ29yY2gnLCAnbGlnaHQnOiAnbGd0JywKICAgICAgICAgICAgJ3NxJzogJ3NxJywgJ3Brd3knOiAncGt3eScsICdzaG9yZSc6ICdzaHInLCAnZ3JlZW4nOiAnZ3JuJywgJ3N0cm0nOiAnc3RybScsICdpc2xuZCc6ICdpcycsCiAgICAgICAgICAgICd0dXJucGlrZSc6ICd0cGtlJywgJ3N0cmEnOiAnc3RyYScsICdtaXNzaW9uJzogJ21zbicsICdzcG5ncyc6ICdzcGdzJywgJ2NvdXJzZSc6ICdjcnNlJywKICAgICAgICAgICAgJ3RyYWZmaWN3YXknOiAndHJmeScsICd0ZXJyYWNlJzogJ3RlcicsICdod2F5JzogJ2h3eScsICdhdmVudWUnOiAnYXZlJywgJ2dsZW4nOiAnZ2xuJywKICAgICAgICAgICAgJ2JvdWwnOiAnYmx2ZCcsICdpbmxldCc6ICdpbmx0JywgJ2xhJzogJ2xuJywgJ2xuJzogJ2xuJywgJ2Zyc3QnOiAnZnJzdCcsICdjbGYnOiAnY2xmJywKICAgICAgICAgICAgJ2NyZXMnOiAnY3JlcycsICdicm9vayc6ICdicmsnLCAnbGsnOiAnbGsnLCAnYnlwJzogJ2J5cCcsICdzaG9hcic6ICdzaHInLCAnYnlwYXNzJzogJ2J5cCcsCiAgICAgICAgICAgICdtdGluJzogJ210bicsICdhbGx5JzogJ2FseScsICdmb3Jlc3QnOiAnZnJzdCcsICdqdW5jdGlvbic6ICdqY3QnLCAndmlld3MnOiAndndzJywgJ3dlbGxzJzogJ3dscycsICdjZW4nOiAnY3RyJywKICAgICAgICAgICAgJ2V4dHMnOiAnZXh0cycsICdjcnQnOiAnY3QnLCAnY29ybmVycyc6ICdjb3JzJywgJ3RyYWsnOiAndHJhaycsICdmcndheSc6ICdmd3knLCAncHJhcmllJzogJ3ByJywgJ2Nyb3NzaW5nJzogJ3hpbmcnLAogICAgICAgICAgICAnZXh0bic6ICdleHQnLCAnY2xpZmZzJzogJ2NsZnMnLCAnbWFub3JzJzogJ21ucnMnLCAncG9ydHMnOiAncHJ0cycsICdnYXRld3knOiAnZ3R3eScsICdzcXVhcmUnOiAnc3EnLCAnaGxzJzogJ2hscycsCiAgICAgICAgICAgICdoYXJiJzogJ2hicicsICdsb29wcyc6ICdsb29wJywgJ21kdyc6ICdtZHcnLCAnc210JzogJ3NtdCcsICdyZCc6ICdyZCcsICdoaWxsJzogJ2hsJywgJ2JsZic6ICdibGYnLAogICAgICAgICAgICAnaGlnaHdheSc6ICdod3knLCAnd2Fsayc6ICd3YWxrJywgJ2NsZnMnOiAnY2xmcycsICdicm9va3MnOiAnYnJrcycsICdicm5jaCc6ICdicicsICdhdmVuJzogJ2F2ZScsCiAgICAgICAgICAgICdzaG9yZXMnOiAnc2hycycsICdpc3MnOiAnaXNzJywgJ3JvdXRlJzogJ3J0ZScsICd3bHMnOiAnd2xzJywgJ3BsYWNlJzogJ3BsJywgJ3N1bWl0JzogJ3NtdCcsICdwaW5lcyc6ICdwbmVzJywKICAgICAgICAgICAgJ3Rya3MnOiAndHJhaycsICdzaG9hbCc6ICdzaGwnLCAnc3RydCc6ICdzdCcsICdmcnd5JzogJ2Z3eScsICdoZWlnaHRzJzogJ2h0cycsICdyYW5jaGVzJzogJ3JuY2gnLAogICAgICAgICAgICAnYm91bGV2YXJkJzogJ2JsdmQnLCAnZXh0bnNuJzogJ2V4dCcsICdtZHdzJzogJ21kd3MnLCAnaG9sbG93cyc6ICdob2x3JywgJ3ZzdGEnOiAndmlzJywgJ3BsYWlucyc6ICdwbG5zJywKICAgICAgICAgICAgJ3N0YXRpb24nOiAnc3RhJywgJ2NpcmNsJzogJ2NpcicsICdtbnRucyc6ICdtdG5zJywgJ3BydHMnOiAncHJ0cycsICdzaGxzJzogJ3NobHMnLCAndmlsbGFnZXMnOiAndmxncycsCiAgICAgICAgICAgICdwYXJrJzogJ3BhcmsnLCAnbmNrJzogJ25jaycsICdyc3QnOiAncnN0JywgJ2hhdmVuJzogJ2h2bicsICd0dXJucGsnOiAndHBrZScsICdleHB5JzogJ2V4cHknLCAnc3RhJzogJ3N0YScsCiAgICAgICAgICAgICdleHByJzogJ2V4cHknLCAnc3RuJzogJ3N0YScsICdleHB3JzogJ2V4cHknLCAnc3RyZWV0JzogJ3N0JywgJ3N0cic6ICdzdCcsICdzcHVycyc6ICdzcHVyJywgJ2NyZWNlbnQnOiAnY3JlcycsCiAgICAgICAgICAgICdyYWQnOiAncmFkbCcsICdyYW5jaCc6ICdybmNoJywgJ3dlbGwnOiAnd2wnLCAnc2hvYWxzJzogJ3NobHMnLCAnYWxsZXknOiAnYWx5JywgJ3BsemEnOiAncGx6JywgJ21lZG93cyc6ICdtZHdzJywKICAgICAgICAgICAgJ2FsbGVlJzogJ2FseScsICdrbmxzJzogJ2tubHMnLCAnZXN0cyc6ICdlc3RzJywgJ3N0JzogJ3N0JywgJ2FueCc6ICdhbngnLCAnaGF2bic6ICdodm4nLCAncGF0aHMnOiAncGF0aCcsICdieXBhJzogJ2J5cCcsCiAgICAgICAgICAgICdzcGdzJzogJ3NwZ3MnLCAnbWlsbHMnOiAnbWxzJywgJ3BhcmtzJzogJ3BhcmsnLCAnYnlwcyc6ICdieXAnLCAnZmx0cyc6ICdmbHRzJywgJ3R1bm5lbHMnOiAndHVubCcsICdjbHViJzogJ2NsYicsICdzcXJzJzogJ3NxcycsCiAgICAgICAgICAgICdobGx3JzogJ2hvbHcnLCAnbWFub3InOiAnbW5yJywgJ2NlbnRyZSc6ICdjdHInLCAndHJhY2snOiAndHJhaycsICdoZ3RzJzogJ2h0cycsICdybmNoJzogJ3JuY2gnLCAnY3JjbGUnOiAnY2lyJywgJ2ZhbGxzJzogJ2ZscycsCiAgICAgICAgICAgICdsYW5kaW5nJzogJ2xuZGcnLCAncGxhaW5lcyc6ICdwbG5zJywgJ3ZpYWRjdCc6ICd2aWEnLCAnZ2Rucyc6ICdnZG5zJywgJ2d0d3knOiAnZ3R3eScsICdncm92ZSc6ICdncnYnLCAnY2FtcCc6ICdjcCcsICd0cGsnOiAndHBrZScsCiAgICAgICAgICAgICdkcml2ZSc6ICdkcicsICdmcmVld2F5JzogJ2Z3eScsICdleHQnOiAnZXh0JywgJ3BvaW50cyc6ICdwdHMnLCAnZXhwJzogJ2V4cHknLCAna3knOiAna3knLCAnY291cnRzJzogJ2N0cycsICdwa3knOiAncGt3eScsICdjb3JuZXInOiAnY29yJywKICAgICAgICAgICAgJ2Nyc3NpbmcnOiAneGluZycsICdtbnJzJzogJ21ucnMnLCAndW5pb25zJzogJ3VucycsICdjeW4nOiAnY3luJywgJ2xvZGdlJzogJ2xkZycsICd0cmZ5JzogJ3RyZnknLCAnY2lyY2xlJzogJ2NpcicsICdicmlkZ2UnOiAnYnJnJywKICAgICAgICAgICAgJ2RsJzogJ2RsJywgJ2RtJzogJ2RtJywgJ2V4cHJlc3MnOiAnZXhweScsICd0dW5scyc6ICd0dW5sJywgJ2R2JzogJ2R2JywgJ2RyJzogJ2RyJywgJ3Nocic6ICdzaHInLCAna25vbGxzJzogJ2tubHMnLCAnZ3JlZW5zJzogJ2dybnMnLAogICAgICAgICAgICAndHVuZWwnOiAndHVubCcsICdmaWVsZHMnOiAnZmxkcycsICdjb21tb24nOiAnY21uJywgJ29yY2gnOiAnb3JjaCcsICdjcmsnOiAnY3JrJywgJ3JpdmVyJzogJ3JpdicsICdzaGwnOiAnc2hsJywgJ3ZpZXcnOiAndncnLAogICAgICAgICAgICAnY3JzZW50JzogJ2NyZXMnLCAncm5jaHMnOiAncm5jaCcsICdjcnNjbnQnOiAnY3JlcycsICdhcmMnOiAnYXJjJywgJ2J0bSc6ICdidG0nLCAnYmx2ZCc6ICdibHZkJywgJ3dheXMnOiAnd2F5cycsICdyYWRsJzogJ3JhZGwnLAogICAgICAgICAgICAncmRnZSc6ICdyZGcnLCAnY2F1c2V3YXknOiAnY3N3eScsICdwYXJrd3knOiAncGt3eScsICdqdW5jdG9uJzogJ2pjdCcsICdzdGF0bic6ICdzdGEnLCAnZ2FyZG4nOiAnZ2RuJywgJ21udGFpbic6ICdtdG4nLAogICAgICAgICAgICAnY3Jzc25nJzogJ3hpbmcnLCAncmFwaWQnOiAncnBkJywgJ2tleSc6ICdreScsICdwbG5zJzogJ3BsbnMnLCAnd3knOiAnd2F5JywgJ2Nvcic6ICdjb3InLCAncmFtcCc6ICdyYW1wJywgJ3Rocm91Z2h3YXknOiAndHJ3eScsCiAgICAgICAgICAgICdlc3RhdGVzJzogJ2VzdHMnLCAnY2snOiAnY3JrJywgJ2xvYWYnOiAnbGYnLCAnaHZuJzogJ2h2bicsICd3YWxsJzogJ3dhbGwnLCAnaG9sbG93JzogJ2hvbHcnLCAnY2FueW9uJzogJ2N5bicsICdjbGInOiAnY2xiJywKICAgICAgICAgICAgJ2Nzd3knOiAnY3N3eScsICd2aWxsYWdlJzogJ3ZsZycsICdjcic6ICdjcmsnLCAndHJjZSc6ICd0cmNlJywgJ2NwJzogJ2NwJywgJ2N2JzogJ2N2JywgJ2N0JzogJ2N0cycsICdwcic6ICdwcicsICdmcmcnOiAnZnJnJywKICAgICAgICAgICAgJ2pjdGlvbic6ICdqY3QnLCAncHQnOiAncHQnLCAnbXNzbic6ICdtc24nLCAnZnJrJzogJ2ZyaycsICdicmRnZSc6ICdicmcnLCAnY2VudCc6ICdjdHInLCAnc3B1cic6ICdzcHVyJywgJ2ZydCc6ICdmdCcsICdwayc6ICdwYXJrJywKICAgICAgICAgICAgJ2ZyeSc6ICdmcnknLCAncGwnOiAncGwnLCAnbGFuZXMnOiAnbG4nLCAnZ3R3YXknOiAnZ3R3eScsICdwcmsnOiAncGFyaycsICd2d3MnOiAndndzJywgJ3N0cmF2ZW51ZSc6ICdzdHJhJywgJ2xndCc6ICdsZ3QnLAogICAgICAgICAgICAnaGl3YXknOiAnaHd5JywgJ2N0cic6ICdjdHInLCAncHJ0JzogJ3BydCcsICd2aWxsZSc6ICd2bCcsICdwbGFpbic6ICdwbG4nLCAnbW91bnQnOiAnbXQnLCAnbWxzJzogJ21scycsICdsb29wJzogJ2xvb3AnLAogICAgICAgICAgICAncml2JzogJ3JpdicsICdjZW50cic6ICdjdHInLCAnaXMnOiAnaXMnLCAncHJyJzogJ3ByJywgJ3ZsJzogJ3ZsJywgJ2F2bic6ICdhdmUnLCAndncnOiAndncnLCAnYXZlJzogJ2F2ZScsICdzcG5nJzogJ3NwZycsCiAgICAgICAgICAgICdoaXd5JzogJ2h3eScsICdkYW0nOiAnZG0nLCAnaXNsZSc6ICdpc2xlJywgJ2NyY2wnOiAnY2lyJywgJ3NxcmUnOiAnc3EnLCAnamN0JzogJ2pjdCcsICdqY3RuJzogJ2pjdCcsICdtb3VudGFpbic6ICdtdG4nLAogICAgICAgICAgICAna2V5cyc6ICdreXMnLCAncGFya3dheXMnOiAncGt3eScsICdkcml2ZXMnOiAnZHJzJywgJ3R1bmwnOiAndHVubCcsICdqY3RzJzogJ2pjdHMnLCAna25sJzogJ2tubCcsICdjZW50ZXInOiAnY3RyJywKICAgICAgICAgICAgJ2RyaXYnOiAnZHInLCAndHBrZSc6ICd0cGtlJywgJ3N1bWl0dCc6ICdzbXQnLCAnY2FueW4nOiAnY3luJywgJ2xkZyc6ICdsZGcnLCAnaGFyYnInOiAnaGJyJywgJ3Jlc3QnOiAncnN0JywgJ3Nob2Fycyc6ICdzaHJzJywKICAgICAgICAgICAgJ3Zpc3QnOiAndmlzJywgJ2dkbic6ICdnZG4nLCAnaXNsbmRzJzogJ2lzcycsICdoaWxscyc6ICdobHMnLCAnY3Jlc2VudCc6ICdjcmVzJywgJ3BvaW50JzogJ3B0JywgJ2xha2UnOiAnbGsnLCAndmxseSc6ICd2bHknLAogICAgICAgICAgICAnc3RyYXYnOiAnc3RyYScsICdjcm9zc3JvYWQnOiAneHJkJywgJ2JuZCc6ICdibmQnLCAnc3RyYXZlJzogJ3N0cmEnLCAnc3RyYXZuJzogJ3N0cmEnLCAna25vbCc6ICdrbmwnLCAndmxncyc6ICd2bGdzJywKICAgICAgICAgICAgJ2ZvcmdlJzogJ2ZyZycsICdjbnRyJzogJ2N0cicsICdjYXBlJzogJ2NwZScsICdoZWlnaHQnOiAnaHRzJywgJ2xjayc6ICdsY2snLCAnaGlnaHd5JzogJ2h3eScsICd0cm5wayc6ICd0cGtlJywgJ3JwZCc6ICdycGQnLAogICAgICAgICAgICAnYm91bHYnOiAnYmx2ZCcsICdjaXJjbGVzJzogJ2NpcnMnLCAndmFsbGV5cyc6ICd2bHlzJywgJ3ZzdCc6ICd2aXMnLCAnY3JlZWsnOiAnY3JrJywgJ21hbGwnOiAnbWFsbCcsICdzcHJpbmcnOiAnc3BnJywKICAgICAgICAgICAgJ2JyZyc6ICdicmcnLCAnaG9sd3MnOiAnaG9sdycsICdsZic6ICdsZicsICdlc3QnOiAnZXN0JywgJ3hpbmcnOiAneGluZycsICd0cmFjZSc6ICd0cmNlJywgJ2JvdHRvbSc6ICdidG0nLAogICAgICAgICAgICAnc3RyZW1lJzogJ3N0cm0nLCAnaXNsZXMnOiAnaXNsZScsICdjaXJjJzogJ2NpcicsICdmb3Jrcyc6ICdmcmtzJywgJ2J1cmcnOiAnYmcnLCAncnVuJzogJ3J1bicsICd0cmxzJzogJ3RybCcsCiAgICAgICAgICAgICdyYWRpYWwnOiAncmFkbCcsICdsYWtlcyc6ICdsa3MnLCAncnVlJzogJ3J1ZScsICd2bHlzJzogJ3ZseXMnLCAnYnInOiAnYnInLCAnY29ycyc6ICdjb3JzJywgJ3Bsbic6ICdwbG4nLAogICAgICAgICAgICAncGlrZSc6ICdwaWtlJywgJ2V4dGVuc2lvbic6ICdleHQnLCAnaXNsYW5kJzogJ2lzJywgJ2ZyZCc6ICdmcmQnLCAnbGNrcyc6ICdsY2tzJywgJ3RlcnInOiAndGVyJywKICAgICAgICAgICAgJ3VuaW9uJzogJ3VuJywgJ2V4dGVuc2lvbnMnOiAnZXh0cycsICdwa3d5cyc6ICdwa3d5JywgJ2lzbGFuZHMnOiAnaXNzJywgJ3JvYWQnOiAncmQnLCAnc2hycyc6ICdzaHJzJywKICAgICAgICAgICAgJ3JvYWRzJzogJ3JkcycsICdnbGVucyc6ICdnbG5zJywgJ3NwcmluZ3MnOiAnc3BncycsICdtaXNzbic6ICdtc24nLCAncmlkZ2UnOiAncmRnJywgJ2FyY2FkZSc6ICdhcmMnLAogICAgICAgICAgICAnYmF5b3UnOiAnYnl1JywgJ2Nyc250JzogJ2NyZXMnLCAnanVuY3RuJzogJ2pjdCcsICd3YXknOiAnd2F5JywgJ3ZhbGxleSc6ICd2bHknLCAnZm9yayc6ICdmcmsnLAogICAgICAgICAgICAnbW91bnRhaW5zJzogJ210bnMnLCAnYm90dG0nOiAnYnRtJywgJ2ZvcmcnOiAnZnJnJywgJ2h0JzogJ2h0cycsICdmb3JkJzogJ2ZyZCcsICdobCc6ICdobCcsCiAgICAgICAgICAgICdncmRuJzogJ2dkbicsICdmb3J0JzogJ2Z0JywgJ3RyYWNlcyc6ICd0cmNlJywgJ2NueW4nOiAnY3luJywgJ2Npcic6ICdjaXInLCAndW4nOiAndW4nLCAnbXRuJzogJ210bicsCiAgICAgICAgICAgICdmbGF0cyc6ICdmbHRzJywgJ2FuZXgnOiAnYW54JywgJ2dhdHdheSc6ICdndHd5JywgJ3JhcGlkcyc6ICdycGRzJywgJ3ZpbGxpYWdlJzogJ3ZsZycsICdmbGRzJzogJ2ZsZHMnLAogICAgICAgICAgICAnY292ZXMnOiAnY3ZzJywgJ3J2cic6ICdyaXYnLCAnYXYnOiAnYXZlJywgJ3Bpa2VzJzogJ3Bpa2UnLCAnZ3J2JzogJ2dydicsICd2aXN0YSc6ICd2aXMnLCAncG5lcyc6ICdwbmVzJywKICAgICAgICAgICAgJ2ZvcmVzdHMnOiAnZnJzdCcsICdmaWVsZCc6ICdmbGQnLCAnYnJhbmNoJzogJ2JyJywgJ2dybic6ICdncm4nLCAnZGFsZSc6ICdkbCcsICdyZHMnOiAncmRzJywgJ2FubmV4JzogJ2FueCcsCiAgICAgICAgICAgICdzcXInOiAnc3EnLCAnY292ZSc6ICdjdicsICdzcXUnOiAnc3EnLCAnc2t5d2F5JzogJ3Nrd3knLCAncmlkZ2VzJzogJ3JkZ3MnLCAnaHd5JzogJ2h3eScsICd0dW5ubCc6ICd0dW5sJywKICAgICAgICAgICAgJ3VuZGVycGFzcyc6ICd1cGFzJywgJ2NsaWZmJzogJ2NsZicsICdsYW5lJzogJ2xuJywgJ2xhbmQnOiAnbGFuZCcsICdiY2gnOiAnYmNoJywgJ2R2ZCc6ICdkdicsICdjdXJ2ZSc6ICdjdXJ2JywKICAgICAgICAgICAgJ2NwZSc6ICdjcGUnLCAnc3VtbWl0JzogJ3NtdCcsICdnYXJkZW5zJzogJ2dkbnMnfQoKICAgICAgICB3b3JkcyA9IGlucHV0VmFsdWUuc3BsaXQoKQogICAgICAgIGZvciB3IGluIHdvcmRzOgogICAgICAgICAgICBpZiB3IGluIHVzcHNfc3RyZWV0X2FiYnJldmlhdGlvbnMua2V5cygpOgogICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUucmVwbGFjZSh3LCB1c3BzX3N0cmVldF9hYmJyZXZpYXRpb25zW3ddKQogICAgICAgIHJldHVybiBpbnB1dFZhbHVlCiAgICAgICAgCnByaW50KG5vcm1hbGl6ZVN0cmVldFN1ZmZpeGVzKCdwb3J0bGFuZCBwb3J0Jykp