






from __future__ import annotations

from collections.abc import Iterable, Iterator
from typing import Any, Generic, TypeVar

UpperCamelCase												=      TypeVar('''T''', bound=bool)



class  __UpperCAmelCase						(Generic[T]       ):







			def __init__(      self:    int ,      UpperCAmelCase_:    T	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    value
									_SCREAMING_SNAKE_CASE       =    None
									_SCREAMING_SNAKE_CASE       =    None







			@property
			def 				UpperCamelCase (      self:    int	):







									'''simple docstring'''




									return self._value







			@staticmethod
			def 				UpperCamelCase (      UpperCAmelCase_:    SkewNode[T] | None ,      UpperCAmelCase_:    SkewNode[T] | None	):







									'''simple docstring'''




									if not roota:
															return roota

									if not roota:
															return roota

									if roota.value > roota.value:
															_SCREAMING_SNAKE_CASE ,	_SCREAMING_SNAKE_CASE       =    roota, roota

									_SCREAMING_SNAKE_CASE       =    roota
									_SCREAMING_SNAKE_CASE       =    roota.right
									_SCREAMING_SNAKE_CASE       =    roota.left
									_SCREAMING_SNAKE_CASE       =    SkewNode.merge(UpperCAmelCase_ ,      UpperCAmelCase_	)

									return result



class  __UpperCAmelCase						(Generic[T]       ):







			def __init__(      self:    Optional[Any] ,      UpperCAmelCase_:    Iterable[T] | None = ()	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    None
									if data:
															for item in data:
																					self.insert(UpperCAmelCase_	)







			def __bool__(      self:    int	):







									'''simple docstring'''




									return self._root is not None







			def __iter__(      self:    Union[str, Any]	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    []
									while self:
															result.append(self.pop()	)

									# Pushing items back to the heap not to clear it.
									for item in result:
															self.insert(UpperCAmelCase_	)

									return iter(UpperCAmelCase_	)







			def 				UpperCamelCase (      self:    List[str] ,      UpperCAmelCase_:    T	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    SkewNode.merge(self._root ,      SkewNode(UpperCAmelCase_	)	)







			def 				UpperCamelCase (      self:    str	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    self.top()
									_SCREAMING_SNAKE_CASE       =    (
									    SkewNode.merge(self._root.left ,      self._root.right	) if self._root else None
									)

									return result







			def 				UpperCamelCase (      self:    Tuple	):







									'''simple docstring'''




									if not self._root:
															raise IndexError("""Can't get top element for the empty heap."""	)
									return self._root.value







			def 				UpperCamelCase (      self:    Dict	):







									'''simple docstring'''




									_SCREAMING_SNAKE_CASE       =    None


if __name__ == "__main__":
		import doctest

		doctest.testmod()









from __future__ import annotations

from string import ascii_letters

def 			__lowerCamelCase     (						snake_case__			,snake_case__			,snake_case__ = None						)				->    str:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE       =    alphabet or ascii_letters

						# The final result string
						_SCREAMING_SNAKE_CASE       =    """"""

						for character in input_string:
												if character not in alpha:
																		# Append without encryption if character is not in the alphabet
																		result += character
												else:
																		# Get the index of the new key and make sure it isn't too large
																		_SCREAMING_SNAKE_CASE       =    (alpha.index(snake_case__						) + key) % len(snake_case__						)

																		# Append the encoded character to the alphabet
																		result += alpha[new_key]

						return result

def 			__lowerCamelCase     (						snake_case__			,snake_case__			,snake_case__ = None						)				->    str:






						"""simple docstring"""





						key *= -1

						return encrypt(snake_case__			,snake_case__			,snake_case__						)

def 			__lowerCamelCase     (						snake_case__			,snake_case__ = None						)				->    dict[int, str]:






						"""simple docstring"""





						_SCREAMING_SNAKE_CASE       =    alphabet or ascii_letters

						# To store data on all the combinations
						_SCREAMING_SNAKE_CASE       =    {}

						# Cycle through each combination
						for key in range(1			,len(snake_case__						) + 1						):
												# Decrypt the message and store the result in the data
												_SCREAMING_SNAKE_CASE       =    decrypt(snake_case__			,snake_case__			,snake_case__						)

						return brute_force_data


if __name__ == "__main__":
		while True:
				print(f"\n{'-' * 10}\n Menu\n{'-' * 10}")
				print(*['''1.Encrypt''', '''2.Decrypt''', '''3.BruteForce''', '''4.Quit'''], sep='''\n''')

				# get user input
				UpperCamelCase												=      input('''\nWhat would you like to do?: ''').strip() or '''4'''

				# run functions based on what the user chose
				if choice not in ("1", "2", "3", "4"):
						print('''Invalid choice, please enter a valid choice''')
				elif choice == "1":
						UpperCamelCase												=      input('''Please enter the string to be encrypted: ''')
						UpperCamelCase												=      int(input('''Please enter off-set: ''').strip())

						print(encrypt(input_string, key))
				elif choice == "2":
						UpperCamelCase												=      input('''Please enter the string to be decrypted: ''')
						UpperCamelCase												=      int(input('''Please enter off-set: ''').strip())

						print(decrypt(input_string, key))
				elif choice == "3":
						UpperCamelCase												=      input('''Please enter the string to be decrypted: ''')
						UpperCamelCase												=      brute_force(input_string)

						for key, value in brute_force_data.items():
								print(f"Key: {key} | Message: {value}")

				elif choice == "4":
						print('''Goodbye.''')
						break

