| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
| |
Change-Id: I06ab906ed94b1aaea35c32494880bf85d7564d4d
|
|
|
|
| |
Change-Id: I5deef665ab374491c0f498b498971abd525d1111
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Find and rename/remove duplicate string variable names
* Add missing string variables to en language file
* Fix display of some strings missing @ in front of variable name
* Fix several %s --> {1}
* Be consistent in usage of cancelled vs. canceled (both spellings
acceptable)
Tip for finding strings missing from language files:
1) Find all messages:
egrep -hr "gui_msg.+=" > /tmp/msgs.txt
2) Regex replace to trim them down
WHAT: ^\s+gui_msg(?:[^"]+)"([a-zA-Z0-9_]+)=([^"]+).+
WITH: $1
Note that $2 can be used to retain the message
3) Find missing strings:
for i in $(cat /tmp/msgs.txt); do
if ! grep -q $i gui/theme/common/languages/en.xml; then
echo $i;
fi
done
Change-Id: Ic193162e4b5468bf027472928a370be39840ea1d
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Done:
Portrait HDPI, MDPI
Landscape HDPI, MDPI
Watch
Also still includes ugly changes for the old portrait theme to test the
terminal emulator.
Change-Id: If32af1c69b85417522a8a2fb9c20be515b4d70fc
|
|
|
|
|
|
|
| |
The message was named something non-existent. Fix the spelling error
and add the default message into the language files.
Change-Id: I4e9e10d2705b1edf75b185d3badba59eb86ffb8b
|
|
|
|
| |
Change-Id: I6df4937658815350366ed3dd2cf92156f98c96c4
|
|
|
|
|
|
|
|
|
|
| |
Rather than only supporting a 3x3 grid, allow for multiple grid sizes
(using the CyanogenMod method of generating passphrases for non-3x3
grids). Also fix the detection of touches, as the old code was far too
sensitive for larger grids (and also didn't make much sense).
Change-Id: I343ef654e6d29ce0cb790a28281be7c7c9b171d9
Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This is similar to https://gerrit.omnirom.org/#/c/14014
A lot of the features built in the older patch set have been split
out into separate patches, most of which have already been merged.
The remaining functionality here should all be directly related to
language selection and loading. We always load English as a base
before loading other languages over the top of the base. The idea
is that if another language is missing a translation, then we will
still display the English.
Maybe still to do: read the /cache/recovery/last_locale file and
load a language based on that. For me, this file contains just:
en_US
We probably won't bother with region specific translations so we
would have to look at either trimming off the _US or using some
other method like perhaps a symlink or a combination of the two.
Thanks to _that for twmsg.cpp class
Change-Id: I9647a22e47883a3ddd2de1da51f64aab7c328f74
|
|
|
|
| |
Change-Id: I7b020c7048f9bbb550e9f5100c604c01809e4fbd
|
|
|
|
| |
Change-Id: Iacd4bb78f551b51d092ecde09521b5541e7dadcd
|
|
|
|
|
|
|
|
|
|
|
| |
This patch set removes support in TWRP for the old .dat file
format as well as support for the AOSP style fonts in header
files. We need TTF for scaling.
Note that the old AOSP style header font is still supported in
minui which is not used by TWRP.
Change-Id: I6124a3333d479f1fc668138f7e32c4be9b519552
|
|
|
|
| |
Change-Id: Ie86dc63f83ae51e9947debc7191fd91d61b83008
|
|
|
|
| |
Change-Id: I70324ae3e4fffe88bc2b5a02becb7d1f4f0ceab0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Initial value for tw_mount_system_ro is now 2. If the value of
tw_mount_system_ro is 2 during boot, then we will show the system
read only prompt and ignore the value from the lifetime writes
check.
Note: Changed the value of FILE_VERSION which will trigger the
data manager to throw out previous settings and start with default
values so that existing TWRP users will get the prompt at least
once.
Change-Id: I447767b64617f855156a19a5dc15c4ece6dff7b8
|
|
|
|
| |
Change-Id: Ib67a356f8d5e6bb0f982c081fc88b6462c7fbd74
|
|
|
|
| |
Change-Id: I1bbc25df6f35f79549f1eb06feb4db9ec0475aa5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Note: Only works on ext2/3/4 partitions. Only tested on ext4.
We can use this in some cases to resize the data partition if an
incorrect fstab caused recovery to not reserve the 16KB for a
crypto footer.
Sometimes the BoardConfig for a custom ROM does not have the
correct size for the system partition and if the ROM flashes a
raw system image, that image will not take up the full block
device. Running resize2fs can fix the size and may allow more
room in the system partition for customizations like busybox or
a larger gapps package.
Sometimes flashing a factory image may flash userdata with an
image with a file system that does not take up the full size of
the block device (e.g. factory images for the Nexus 6 will flash
userdata with a ~24GB userdata image, wasting ~30GB of space).
Using resize2fs we can easily fix this issue without having to do
a full format data.
Change-Id: I631f5c6f567bbc6a9241e5dd95f1e435820a1b13
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Mounting system as rw can prevent future OTA updates. The purpose
of this patch set is to prevent TWRP from mounting sytem as rw on
the first boot. Device maintainers should update their twrp.fstab
files on these devices to include an additional line:
/system_image emmc /dev/block/../system
This line will allow TWRP to create a raw system image backup to
ensure that the user can return to an original state for future
OTA updates.
Change-Id: I8929d85bc3a5b96cc564bc7f734b58d5612ec833
|
|
|
|
|
|
|
| |
This should fix daylight saving time display for most users.
For fully correct time zones we need the tzdata database.
Change-Id: I7b7693ab0abaf20be217bd06d525f03fb89b7217
|
|
|
|
|
|
|
| |
* Applicable to non-rooted devices running portrait mode only.
* Touching the button has no effect, supposed to reboot/poweroff.
Change-Id: If67649c4c83ddf549c833f94c66829e0877969c5
|
|
|
|
|
|
|
| |
"_" was broken due to a bad XML attribute name, and the others
didn't produce the highlighted character in shift mode.
Change-Id: I271fbf4e083ccdb69c469cbdae44101afed4fd1e
|
|
|
|
|
| |
Change-Id: Ia2d3268a96423e9ca3846500c57e674c4f8fa60b
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
|
|
|
|
| |
Change-Id: I287722719c1f73cc8f7214549f9a890f03d4a586
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This will significantly reduce theme maintainence and should be a
lot more sustainable over time. Eliminate most themes leaving only
5 remaining in 3 categores:
* watch_mdpi: 320x320
* portrait_mdpi: 480x800
* portrait_hdpi: 1080x1920
* landscape_mdpi: 800x480
* landscape_hdpi: 1920x1200
Add handling to map the old DEVICE RESOLUTION to the new TW_THEME
build flag. New devices should specify a theme using the new
TW_THEME build flag using one of the 5 values from the list above.
Long term we will eliminate the use of the DEVICE_RESOLUTION flag
in favor of the new flag.
Change the way sliders render so that they completely follow the
placement="5". This will probably break some custom themes but is
necessary so that we can retain the aspect ratio on slider images
and still have them rendered at the center of the screen.
Add code to the console slideout button so that it can be centered.
Centering the slideout button allows us to keep the button at the
center of the screen when retaining aspect ratios on the image.
Add more retain aspect ratios for home, back, slideout, folder,
file, and lock screen images.
Change the way we build the top bar in TWRP. It is now mostly
drawn using fill objects and the TWRP logo is a separate image so
that we can retain its aspect ratio during scaling. Thanks to Mark
Norelus for providing the TWRP logo.
Change-Id: I801a7b3163cad9ef353461f4c327690a9ccbb3aa
|
|
|
|
|
|
|
|
|
| |
Not all themes tested.
To center the scrollbar horizontally on the line, the width must be
fastscroll_linew + 2 * something.
Change-Id: I3c2878734ffbd2e8ef3bc7c64b2f16d4f61aeda5
|
|
|
|
|
|
|
|
|
| |
- Rebase console on ScrollList
- Add fastscroll bar to console
- ScrollList now has a mode that ignores selections
- Increase kinetic scrolling speed for lists showing many items
Change-Id: I6298d717d2e403f3e85e2c633d53c4284a066012
|
|
|
|
|
|
|
| |
* Use mono font for terminal command input
* Recognize 'exit' command (go to main page)
Change-Id: I5f383cd8d19959a49d2ae0b18f839b86e4145693
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Safer handling:
& --> &
> --> >
< --> <
Broken tags:
</function> --> </action>
<folders="1"...> --> <filter folders="1"...>
Change-Id: Iaddaf9db163e08250cb4deefdfdb814c589ccb47
|
|
|
|
|
|
|
| |
The portrait placement was mistakenly removed in commit
I6e314efb4bb454d496555ff7e003d743063a1308
Change-Id: Ida5f908e61df0f99e0f5327c298e6a1a915d0f66
|
|
|
|
|
|
|
|
|
|
| |
(for compressed backup users with low space).
Clean up backup folder and copy only recovery.log for debugging.
Conflicts:
gui/devices/watch/res/watch.xml
Change-Id: If8aa3580dbc082d0fe4882d4af8dc3cdb362a8b5
|
|
|
|
| |
Change-Id: I008664109360d937a31232c8cc15c7c9d3dd0ba5
|
|
|
|
|
|
|
| |
Also allow sliders to have their own text label instead of
requiring a whole separate text object for the label in the xml.
Change-Id: I6e314efb4bb454d496555ff7e003d743063a1308
|
|
|
|
|
|
|
|
|
|
|
|
| |
With this patch set, if needed, we scale the images during early
boot. TTF support is needed to properly scale the font. No font
scaling is done on the old style fixed width font used in the
console.
Special thanks to _that for figuring out the scaling and blending
function calls to make this possible.
Change-Id: If2f79bef16d6db2e1298bfc3d00c9bcca2bee37a
|
|
|
|
|
|
|
|
|
|
|
| |
This will stop the iteration of the partition objects, kill the
current twrpTar thread and remove the backup directory.
Implement TWAtomicInt class to give us a wrapper that automatically
uses mutexes before the read and write to help ensure that the
reads and writes will be atomic based on documentation.
Change-Id: I645b22bc980a292e9c7202acb24ffd22ebe68c63
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
These can be used to center a lower resolution theme onto a
higher resolution screen. May be useful for Nexus 9 unless or
until we decide to do a 1536x2048 theme or on devices like the
Moto 360 and LG G Watch R.
The build flags will only affect the stock theme. If a custom
theme wishes to apply an offset, it can be done by setting
tw_x_offset and / or tw_y_offset in the variables section of the
XML.
Change-Id: I2390769ed861b96a4a3bb8a0f06d9021ec91b6b9
|
|\ |
|
| |
| |
| |
| |
| | |
Change-Id: I1463a0ba62a23c68c15f05e79a99fa8509314373
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
|
|/
|
|
|
|
|
|
|
|
|
| |
- Use the Images... button in the lower right of the zip install
page
- Unify image flashing functions between restore and image flash
- boot and recovery partitions are flashable by default
- use fstab flag flashimg=1 or 0 to override defaults
- file system partitions are currently not flashable
Change-Id: I822dc446030543c55d2153e219d67a1292374ffc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- avoid parsing permission strings
- fix memory leaks, a fix new/free mismatch and a compiler warning
- fix that only first updated-package was processed
- fix a potential stack overflow if packages.xml is huge
- minor refactoring for reducing duplicated code
- don't process packages without codePath
- fix path for deleting app data (currently unused anyway)
- fix file ownership on libs
- try not to mess up Android 5.0 app permissions
Patch set 4
- make fixing SELinux contexts an option with a check box
- add some notes / text to the themes
Patch set 6
- decouple "fix permissions" from "fix contexts"
Change-Id: Icc77ecc581befc5ce6e419b1f3b8ca189208c234
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
With 5.0 L, we decrypt automatically if the default_password is
used. Non datamedia devices do not get the format data button so
they cannot wipe encryption off the device. This patch add a wipe
encryption button where the format data button would normally be
located on the Wipe page.
This patch also attempts to remove / delete the dm-crypt block
device before formatting.
Change-Id: I100d5d154d6c49254fd48e23279df973db5f23ae
|
|
|
| |
Change-Id: If79086b0128e57087fd87f07d56984eb2a15d8b2
|
|
|
|
| |
Change-Id: I109c7ae5963b5b4d9d1a8190e364a7685c41dbdd
|
|
|
|
| |
Change-Id: Id5a0d40d05b0d7e56fb3e8f0578c201957508b70
|
|
|
|
| |
Change-Id: Iac1c13b38df2ac66106abcda7c9d171a1549b65f
|
|
|
|
| |
Change-Id: Ic864fae4fda9707fc84d6d8b33587863b7664e1e
|
|
|
|
|
|
|
| |
use TW_NO_CPU_TEMP := true to disable display
use TW_CPU_CUSTOM_PATH := path to set custom path
Change-Id: Id260ecbb4ec36a78442387329944f67003d0f6a0
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Keeps original font system in place
* Uses the same API as original font system:
- You can render only one line at a time
- You can only use one font and color for one gr_text* call
* Caches all rendered text, with a string cache limited to 400
entries, then it trucates to 250, which results in memory
usage hovering around 5-10MB
Change-Id: I36107b9dcd8d57bae4486fce8b8f64e49ef3d906
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
|
|
|
|
| |
Change-Id: I24f3c8587f778c4f0ef43737243c8378a3fd0e00
|
|
|
|
|
|
| |
Big thanks to Dees_Troy for helping with the implementation.
Change-Id: I6c9c522b9c9de5dc139e2ecb0141008182ba07f0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
TWFunc::Fixup_Time_On_Boot: Will now try to read
/sys/class/rtc/rtc0/since_epoch to correct time, if that fails
it will try to use the ats files to correct time.
TWFunc::Set_Brightness: One single function to set brightness
from both the automated functions and the gui actions. It is
able to set a second brightness path if present, it will set
them both the same value. Many Sony devices have 2 brightness
files in the sysfs that must be set to properly set the
brightness.
Change-Id: I7ca582109085dfbcb46b8de73ad031e4b7903fca
|
|
|
|
| |
Change-Id: I9777e92ca26967d41625e726383ae6aa5406161d
|
|
|
|
| |
Change-Id: I1acba95302e414e1a471d27474508a7c48df0328
|
|
|
|
| |
Change-Id: Iea2fac2f1b300c312819ea2d83e1762669d357b6
|
|
|
|
| |
Change-Id: I9448eed41e43c4fce575b7ed12b5270a1d75f99b
|
|
|
|
| |
Change-Id: I7fe38b20913a981942105637a527a2d26ed035a5
|
|
|
|
| |
Change-Id: I1a50fa0bb750b229220c217d24253b65f24d2920
|
|
|
|
|
|
|
|
|
|
|
| |
Based on work by Chris Phelps <cphelps76@droidconcepts.com>
https://github.com/TEAM-Gummy/android_bootable_recovery_TWRP/commit/58963336b81ea8bcc03b8d7e4dfe4598f5afc972
https://github.com/TEAM-Gummy/android_bootable_recovery_TWRP/commit/4ec10303cb76592044c3aa449dc68a33356a6e09
https://github.com/TEAM-Gummy/android_bootable_recovery_TWRP/commit/c48bd2412332916eafd0db727d923c8c16cd35ed
https://github.com/TEAM-Gummy/android_bootable_recovery_TWRP/commit/f0944ded30e98917ca85db0185add1207ea5f4b6
But with other original changes too.
Change-Id: I809a37a3983187e62568a1e2403b6637a692220d
|
|
|
|
|
|
| |
This reverts commit c45181db0902762fb670b56a173db7c331e564cb.
Change-Id: I9dfb2733d9eb30c32bc1e307e382ee8e4e47a0b6
|
|
|
|
| |
Change-Id: I9e54d2bcfe89e1e0e3205ce2f4156cfd22dca5b5
|
|
|
|
|
|
|
| |
Use common portrait and landscape xml files based on resolution
defined by the device.
Change-Id: Iec528f9d846d49857ff98de1ac201e25dbb60339
|
|
|
|
|
|
|
|
| |
* Like in android - press power+volume down, screenshots are saved
in /sdcard/Pictures/Screenshots (if /sdcard is mounted) or /tmp
Change-Id: Iaefa15b11a1d5fdfac57d77388db1621f378a8d4
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
|
|
|
|
|
|
|
|
| |
Track backup and restore progress based on the sizes of the files
as they are being added to the tar backup file. Update the
progress bar based on the sizes of the files.
Change-Id: Idf649efa1db3e91830b4b2add86203a3f30042ff
|
|
|
|
|
|
|
|
| |
Allow each gui_print command to specify a color
Change LOGERR to use the error color
Theme should specify colors for error, warning, and highlight
Change-Id: Ie8ece34111f604e25fcb79e5b731cd4e61038ff9
|
|
|
|
|
|
| |
This is by no means comprehensive, but is quite a bit better already.
Change-Id: Ibc8654a5dfb0eec39cbd0b64bdb52bb4fbfe2f7e
|
|
|
|
| |
Change-Id: I9043e98e1e1ed4722f05c13a60b43d2d0bf739f6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Some devices (jewel, m8) have .android_secure at a non-standard
location. Allow a different partition to be specified as the home of
.android_secure using the fstab flag 'andsec'.
Using the /data/media variant of jewel as an example, recovery.fstab or
twrp.fstab could be edited like follows:
/external_sd vfat /dev/block/mmcblk1p1 flags=display="MicroSD";andsec
Note, this is NOT a method to move .android_secure in your ROM. Your ROM
must already write to this alternative location.
Change-Id: I3a6e4e63aaddb35870b79e80938b0f9c2c902443
|
|
|
|
|
|
|
|
| |
Some (all?) devices do not update the partition size displayed on the
backup screen when selecting "Refresh Sizes". Refresh the page after
recalculating sizes.
Change-Id: Id34da6c738f86501f73cbd7874f6921d1cda32c4
|
|
|
|
| |
Change-Id: I98dd6b25cbb1616f6032e9dcb4174461add53498
|
|
|
|
|
|
| |
the theme.
Change-Id: If633af291689b2ac686c41331bb9adac34c425ad
|
|
|
|
| |
Change-Id: I11bd9fea2a900a92794c5c297846eb87265eeee7
|
|
|
|
| |
Change-Id: I0801d29aeb66678157123e3630b09a2b527ad4df
|
|
|
|
| |
Change-Id: I4be3849ff0485536575395d798aa5edbe12651a7
|
|
|
|
|
|
| |
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
Change-Id: I66d6db7b3ed9cca50b469d125b36224332e06913
|
|
|
|
|
|
|
| |
Improve location / timing of vibration
Split out vibrate settings for buttons, keyboard, and long actions
Change-Id: I282825cc5f3e44ed6dcabe65dc1f4cb21b407b67
|
|
|
|
| |
Change-Id: I15d723f73c0b0bb4a40645d1c3f4c1c616f36998
|
|
|
|
| |
Change-Id: I478f172e1a549b50ebe29cf9a8b8618a84b3cb17
|
|
|
|
| |
Change-Id: Ic6a0b4b3e41818ff510ca652d5f14bdecd531826
|
|
|
|
|
|
| |
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
Change-Id: I558c988c94f750607f58aa3dd22736447c78a214
|
|
|
|
|
|
|
|
| |
In 4.3+ with SELinux, su perms will be lost on every reboot so
users will get the prompt to fix su perms in TWRP every time. Make
fixing the su perms automatic instead of nagging the user.
Change-Id: Ia8a2652018db5e1f6ffc5fec2a4ac0db3a8f32bb
|
|
|
|
| |
Change-Id: I7847fca22b5d4f0a35da41625b15bd677a1e9768
|
| |
|
|
|
|
| |
Change-Id: Ifb3a5bd9f1e6c2e9810c90b0aec198e91d5956fc
|
| |
|
|
|
|
| |
Change-Id: Iedb50aca0132259bfe4297e187dbc2d40a38a34b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Also includes features merged from:
Update twrpTar by kokotas
Revised function entryExists().
Added function to get archive's uncompressed size.
Added option to exclude item(s) from the archive.
Revised forks()
http://review.teamw.in/#/c/590/
Change-Id: I01fa2c81643161984eff2625247af75990684bd9
|
|
|
|
|
|
| |
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
Change-Id: Ic5d44314f501341140dd7059d1cb753341f5844c
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add partition list GUI element and update backup, restore, mount,
storage selection, and wipe sections of GUI and partition manager
code to reflect the new GUI element. Update ORS engine to handle
new backup and restore setup.
Fix a bug with decrypt.
Add 1080x1920 layout.
Change-Id: Iaa2f44cb707167e66f935452f076ba00e68a2aa4
|
| |
|
|
|
|
|
|
|
| |
Also fix build problems with libblkid in CM7
Signed-off-by: Vojtech Bocek <vbocek@gmail.com>
Change-Id: I1cd4573e25b247171e4bd8cc05b70543f897a454
|
|
|
|
|
| |
Move military time setting up and remove the now unused ignore
image size setting from XML layouts.
|
|
|
|
|
|
| |
Also fix sort order for file selector by date and file sizes
Change-Id: Idff9fe4232c19d4ed1082e78fabe6f921aa0a114
|
| |
|
|
|
|
| |
Change-Id: I924297ab0dcf920cd4b4b617949c3b16cbc68e43
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
fix variable
Change-Id: I72eed7b4d709a184e53cc94165a1817a7dcf041e
|
| |
|
|
|
|
|
|
|
| |
Add proper mkdosfs tool
Add fuse to TWRP
Add experimental exfat-fuse to TWRP
Convert all system() functions to use new Exec_Cmd function
|
| |
|
|
|
|
|
|
|
| |
Allow to decrypt /data even if decryption was skipped during the initial
loading of recovery
Change-Id: If2251757a276dd069578e93e5a038b25a825bff6
|
| |
|
| |
|
|
|
|
|
|
| |
Also fixed inability to delete backups with a space in the name.
Change-Id: I2f6639d33caa3c4542960f76adbd59b25ab64f5d
|
| |
|
| |
|
|
|
|
| |
A few other minor xml tweaks
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
Modify AOSP mount and wipe functions to use Partition Manager.
Update wipe code to reset the log file index when wiping cache.
Add ADB sideload to 540x960 theme.
|
|
|
|
|
| |
Also copy zip from /tmp to storage and remove from /tmp to
prevent running out of RAM.
|
|
|
|
|
|
|
| |
Fixed a problem with using make_ext4fs by making its lib
a dynamic lib.
Added ADB sideload zip install feature - no way to cancel it yet.
Improve backup and restore code.
|
|
Pull in most TWRP sources
Stub out partition management code
Make it compile -- probably will not boot
Kind of a mess but have to start somewhere
|