mount("ubifs", "UBI", "system", "/system", "");
ui_print("Source: None");
ui_print("Target: None");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/boot/abl.elf", "8a6e11e783136b24db82e9695939276613c4b2a0", "6218e941e63ae49419026a7dfe2e154b31930a0a") || abort("E3005: \"/system/boot/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/sign/default/abl/abl.elf", "8a6e11e783136b24db82e9695939276613c4b2a0", "6218e941e63ae49419026a7dfe2e154b31930a0a") || abort("E3005: \"/system/boot/sign/default/abl/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/sign_and_encrypt/default/abl/abl.elf", "d5c3c070c658d421dfcb8c82fedeee45431286cb", "3a24474adebfd17d02d526ae1f1a244ea4636e35") || abort("E3005: \"/system/boot/sign_and_encrypt/default/abl/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/signed/abl.elf", "8a6e11e783136b24db82e9695939276613c4b2a0", "6218e941e63ae49419026a7dfe2e154b31930a0a") || abort("E3005: \"/system/boot/signed/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/signed_encrypted/abl.elf", "d5c3c070c658d421dfcb8c82fedeee45431286cb", "3a24474adebfd17d02d526ae1f1a244ea4636e35") || abort("E3005: \"/system/boot/signed_encrypted/abl.elf\" has unexpected contents.");
apply_patch_check("/system/etc/shadow", "473ef2691cad73278614761d4eaf072014aac05c", "973be6b2ea52064b06032ce996bf5c7d9b6cc9af") || abort("E3005: \"/system/etc/shadow\" has unexpected contents.");
apply_patch_check("/system/sbin/powerapp", "440511315a68d364ed50a38e1baf8a5f9ad1632e", "93b76f2502c5fb265972ca7c6368c4b37b7cfd60") || abort("E3005: \"/system/sbin/powerapp\" has unexpected contents.");
apply_patch_check("/system/sbin/sys_reboot", "440511315a68d364ed50a38e1baf8a5f9ad1632e", "93b76f2502c5fb265972ca7c6368c4b37b7cfd60") || abort("E3005: \"/system/sbin/sys_reboot\" has unexpected contents.");
apply_patch_check("/system/sbin/sys_shutdown", "440511315a68d364ed50a38e1baf8a5f9ad1632e", "93b76f2502c5fb265972ca7c6368c4b37b7cfd60") || abort("E3005: \"/system/sbin/sys_shutdown\" has unexpected contents.");
apply_patch_check("/system/usr/bin/atfwd_daemon", "ccb46d617ce0dec10ca6dabf7aa7f84971b3d7d7", "80c7250e6cfd77064d19f036d13cc6bd84c83ac5") || abort("E3005: \"/system/usr/bin/atfwd_daemon\" has unexpected contents.");
apply_patch_check("/system/usr/bin/qmuxbridge", "7001317876ee0a6b8a6c2a0c95921e21b3bbaa1e", "c1a7458e649a0376b70385b130ac2afcc233a416") || abort("E3005: \"/system/usr/bin/qmuxbridge\" has unexpected contents.");
apply_patch_check("/system/var/lib/opkg/status", "580b108b9cd0b9325fe7e56111cb7477ac35fa56", "1d24989938912ca6f603356d0848024d35a6ff9c") || abort("E3005: \"/system/var/lib/opkg/status\" has unexpected contents.");
apply_patch_space(151552) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
apply_patch_check("/firmware/image/modem.b20", "51feebf039f105ded4d72811982dc7451332d9e3", "bbaa0bdc75fcf50e74ed5e9e5c1f7990c01c14fa") || abort("E3005: \"/firmware/image/modem.b20\" has unexpected contents.");
apply_patch_check("/firmware/image/modem.b01", "646d7472e2adcc594db40ea2faa852b88c9a457d", "3486afc72cf57538cf1ea2d2a9f6bf622a2d1670") || abort("E3005: \"/firmware/image/modem.b01\" has unexpected contents.");
apply_patch_check("/firmware/image/modem.mdt", "d9a4cc50c9f88fb9f0b8a6f4ac226495946ff10b", "547a6c9c3da5445b9ff722d40e6cb81eb06b2a27") || abort("E3005: \"/firmware/image/modem.mdt\" has unexpected contents.");

# ---- start making changes here ----

ui_print("Removing unneeded files...");
delete("/system/recovery.img", "/system/etc/version",
       "/system/etc/timestamp",
       "/system/build.prop");
show_progress(0.800000, 0);
ui_print("Patching system files...");
apply_patch("/system/boot/abl.elf", "-",
            8a6e11e783136b24db82e9695939276613c4b2a0, 151552,
            6218e941e63ae49419026a7dfe2e154b31930a0a,
            package_extract_file("patch/system/boot/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/abl.elf");
set_progress(0.146219);
apply_patch("/system/boot/sign/default/abl/abl.elf", "-",
            8a6e11e783136b24db82e9695939276613c4b2a0, 151552,
            6218e941e63ae49419026a7dfe2e154b31930a0a,
            package_extract_file("patch/system/boot/sign/default/abl/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/sign/default/abl/abl.elf");
set_progress(0.292438);
apply_patch("/system/boot/sign_and_encrypt/default/abl/abl.elf",
            "-", d5c3c070c658d421dfcb8c82fedeee45431286cb, 151552,
            3a24474adebfd17d02d526ae1f1a244ea4636e35,
            package_extract_file("patch/system/boot/sign_and_encrypt/default/abl/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/sign_and_encrypt/default/abl/abl.elf");
set_progress(0.438657);
apply_patch("/system/boot/signed/abl.elf", "-",
            8a6e11e783136b24db82e9695939276613c4b2a0, 151552,
            6218e941e63ae49419026a7dfe2e154b31930a0a,
            package_extract_file("patch/system/boot/signed/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/signed/abl.elf");
set_progress(0.584876);
apply_patch("/system/boot/signed_encrypted/abl.elf", "-",
            d5c3c070c658d421dfcb8c82fedeee45431286cb, 151552,
            3a24474adebfd17d02d526ae1f1a244ea4636e35,
            package_extract_file("patch/system/boot/signed_encrypted/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/signed_encrypted/abl.elf");
set_progress(0.731095);
apply_patch("/system/etc/shadow", "-",
            473ef2691cad73278614761d4eaf072014aac05c, 1205,
            973be6b2ea52064b06032ce996bf5c7d9b6cc9af,
            package_extract_file("patch/system/etc/shadow.p")) ||
    abort("E3008: Failed to apply patch to /system/etc/shadow");
set_progress(0.732258);
apply_patch("/system/sbin/powerapp", "-",
            440511315a68d364ed50a38e1baf8a5f9ad1632e, 9860,
            93b76f2502c5fb265972ca7c6368c4b37b7cfd60,
            package_extract_file("patch/system/sbin/powerapp.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/powerapp");
set_progress(0.741771);
apply_patch("/system/sbin/sys_reboot", "-",
            440511315a68d364ed50a38e1baf8a5f9ad1632e, 9860,
            93b76f2502c5fb265972ca7c6368c4b37b7cfd60,
            package_extract_file("patch/system/sbin/sys_reboot.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/sys_reboot");
set_progress(0.751284);
apply_patch("/system/sbin/sys_shutdown", "-",
            440511315a68d364ed50a38e1baf8a5f9ad1632e, 9860,
            93b76f2502c5fb265972ca7c6368c4b37b7cfd60,
            package_extract_file("patch/system/sbin/sys_shutdown.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/sys_shutdown");
set_progress(0.760797);
apply_patch("/system/usr/bin/atfwd_daemon", "-",
            ccb46d617ce0dec10ca6dabf7aa7f84971b3d7d7, 112996,
            80c7250e6cfd77064d19f036d13cc6bd84c83ac5,
            package_extract_file("patch/system/usr/bin/atfwd_daemon.p")) ||
    abort("E3008: Failed to apply patch to /system/usr/bin/atfwd_daemon");
set_progress(0.869817);
apply_patch("/system/usr/bin/qmuxbridge", "-",
            7001317876ee0a6b8a6c2a0c95921e21b3bbaa1e, 34492,
            c1a7458e649a0376b70385b130ac2afcc233a416,
            package_extract_file("patch/system/usr/bin/qmuxbridge.p")) ||
    abort("E3008: Failed to apply patch to /system/usr/bin/qmuxbridge");
set_progress(0.903095);
apply_patch("/system/var/lib/opkg/status", "-",
            580b108b9cd0b9325fe7e56111cb7477ac35fa56, 100438,
            1d24989938912ca6f603356d0848024d35a6ff9c,
            package_extract_file("patch/system/var/lib/opkg/status.p")) ||
    abort("E3008: Failed to apply patch to /system/var/lib/opkg/status");
set_progress(0.999999);
show_progress(0.100000, 10);
ui_print("Unpacking new system files...");
package_extract_dir("system", "/system");
ui_print("Symlinks and permissions...");
set_metadata("/system", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:root_t:s0");
set_metadata("/system/boot", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default/abl", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default/abl/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default/abl", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default/abl/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed_encrypted", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed_encrypted/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:leprop_system_data_t:s15:c0.c1023");
set_metadata("/system/etc", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/etc/shadow", "uid", 0, "gid", 0, "mode", 0400, "capabilities", 0x0, "selabel", "system_u:object_r:shadow_t:s0");
set_metadata("/system/etc/timestamp", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/etc/version", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/sbin", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/powerapp", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/sys_reboot", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/sys_shutdown", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/usr", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:usr_t:s0");
set_metadata("/system/usr/bin", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/usr/bin/atfwd_daemon", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:atfwd_exec_t:s0");
set_metadata("/system/usr/bin/qmuxbridge", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:qmuxbridge_exec_t:s0");
set_metadata("/system/var", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_t:s0");
set_metadata("/system/var/lib", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");
set_metadata("/system/var/lib/opkg", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");
set_metadata("/system/var/lib/opkg/status", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
apply_patch("/firmware/image/modem.b20", "-",
            51feebf039f105ded4d72811982dc7451332d9e3, 11937952,
            bbaa0bdc75fcf50e74ed5e9e5c1f7990c01c14fa,
            package_extract_file("patch/firmware-update/modem.b20.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.b20");
apply_patch("/firmware/image/modem.b01", "-",
            646d7472e2adcc594db40ea2faa852b88c9a457d, 7856,
            3486afc72cf57538cf1ea2d2a9f6bf622a2d1670,
            package_extract_file("patch/firmware-update/modem.b01.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.b01");
apply_patch("/firmware/image/modem.mdt", "-",
            d9a4cc50c9f88fb9f0b8a6f4ac226495946ff10b, 8868,
            547a6c9c3da5445b9ff722d40e6cb81eb06b2a27,
            package_extract_file("patch/firmware-update/modem.mdt.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.mdt");
ui_print("Patching remaining system files...");
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
