From c10822bc996f5ebbe1aaa1df0955f3e0323891c7 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Mon, 27 Apr 2026 14:58:41 +0300 Subject: [PATCH 01/22] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=84=D0=B0=D0=B9=D0=BB=20blossom=5Fdefconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/configs/blossom_defconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index a10caabc20b6..b164cdad2b6a 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -292,7 +292,8 @@ CONFIG_POWER_AVS=y CONFIG_CHARGER_TYPE_MT6357=y CONFIG_MTK_CHARGER=y CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y -CONFIG_CHARGER_BQ2560X=y +# CONFIG_CHARGER_BQ2560X is not set +CONFIG_CHARGER_SGM41513=y # CONFIG_HWMON is not set CONFIG_THERMAL=y CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE=y From 781771a716bcacac4c47a9e3cadfec33fc8451ba Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Mon, 27 Apr 2026 18:53:22 +0300 Subject: [PATCH 02/22] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20custom=5Fcommon.dtsi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 53 +++---------------- arch/arm64/configs/blossom_defconfig | 2 + 2 files changed, 9 insertions(+), 46 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 2b8ece9d13ac..8820d7944aad 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -582,13 +582,13 @@ /*charger start*/ &i2c5 { status = "okay"; - charger1@1A { + charger@1a { compatible = "sgm,sgm41513_charger"; - reg = <0x1A>; + reg = <0x1a>; sgm,sgm41513,usb-vlim = <4600>; - sgm,sgm41513,usb-ilim = <500>; + sgm,sgm41513,usb-ilim = <2000>; sgm,sgm41513,usb-vreg = <0x1130>; - sgm,sgm41513,usb-ichg = <500>; + sgm,sgm41513,usb-ichg = <2000>; sgm,sgm41513,precharge-current = <180>; sgm,sgm41513,termination-current = <240>; sgm,sgm41513,boost-voltage = <5150>; @@ -596,48 +596,9 @@ sgm,sgm41513,enable_term; sgm,sgm41513,stat-pin-ctrl = <3>; sgm,sgm41513,vac-ovp-threshold = <6500>; - }; - - charger@6B { - compatible = "ti,bq2560x_charger","eta,eta6963_charger","cx,cx7601_charger"; - reg = <0x6B>; - ti,bq2560x,usb-vlim = <4600>; - ti,bq2560x,usb-ilim = <500>; - ti,bq2560x,usb-vreg = <4400>; - ti,bq2560x,usb-ichg = <500>; - ti,bq2560x,precharge-current = <180>; - ti,bq2560x,termination-current = <240>; - ti,bq2560x,boost-voltage = <5150>; - ti,bq2560x,boost-current = <1200>; - ti,bq2560x,enable_term; - ti,bq2560x,stat-pin-ctrl = <3>; - ti,bq2560x,vac-ovp-threshold = <6500>; - - cx,cx7601,usb-vlim = <4600>; - cx,cx7601,usb-ilim = <500>; - cx,cx7601,usb-vreg = <4400>; - cx,cx7601,usb-ichg = <500>; - cx,cx7601,precharge-current = <180>; - cx,cx7601,termination-current = <320>; - cx,cx7601,boost-voltage = <5150>; - cx,cx7601,boost-current = <1200>; - cx,cx7601,enable_term; - cx,cx7601,stat-pin-ctrl = <3>; - cx,cx7601,vac-ovp-threshold = <6500>; - - eta,eta6963,usb-vlim = <4600>; - eta,eta6963,usb-ilim = <500>; - eta,eta6963,usb-vreg = <4400>; - eta,eta6963,usb-ichg = <500>; - eta,eta6963,precharge-current = <180>; - eta,eta6963,termination-current = <240>; - eta,eta6963,boost-voltage = <5150>; - eta,eta6963,boost-current = <1200>; - eta,eta6963,enable_term; - eta,eta6963,stat-pin-ctrl = <3>; - eta,eta6963,vac-ovp-threshold = <6500>; - }; - + status = "okay"; + }; + charger@6b { status = "disabled"; }; }; /*charger end*/ diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index b164cdad2b6a..42a152f26345 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -293,6 +293,8 @@ CONFIG_CHARGER_TYPE_MT6357=y CONFIG_MTK_CHARGER=y CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y # CONFIG_CHARGER_BQ2560X is not set +# CONFIG_CHARGER_ETA6963 is not set +# CONFIG_CHARGER_CX7601 is not set CONFIG_CHARGER_SGM41513=y # CONFIG_HWMON is not set CONFIG_THERMAL=y From 1d41cf67217c68d3acddbbb4bba4ff18aaadb4ed Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Mon, 27 Apr 2026 22:05:16 +0300 Subject: [PATCH 03/22] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BA=D0=B8=20=D1=81=20SGM41513=20=D0=BD?= =?UTF-8?q?=D0=B0=20BQ2560X,=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D0=B7=D0=B0=D1=80=D1=8F=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B0=20=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=D1=85=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B=D1=85=20=D0=B7=D0=B0=D1=80?= =?UTF-8?q?=D1=8F=D0=B4=D0=BD=D1=8B=D1=85=20=D1=83=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 53 ++++++++++++++++--- .../boot/dts/mediatek/dandelion/cust.dtsi | 2 +- arch/arm64/configs/blossom_defconfig | 4 +- arch/arm64/configs/stock_defconfig | 4 +- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 8820d7944aad..7e86eedae4d4 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -582,13 +582,13 @@ /*charger start*/ &i2c5 { status = "okay"; - charger@1a { + /*charger1@1A { compatible = "sgm,sgm41513_charger"; - reg = <0x1a>; + reg = <0x1A>; sgm,sgm41513,usb-vlim = <4600>; - sgm,sgm41513,usb-ilim = <2000>; + sgm,sgm41513,usb-ilim = <500>; sgm,sgm41513,usb-vreg = <0x1130>; - sgm,sgm41513,usb-ichg = <2000>; + sgm,sgm41513,usb-ichg = <500>; sgm,sgm41513,precharge-current = <180>; sgm,sgm41513,termination-current = <240>; sgm,sgm41513,boost-voltage = <5150>; @@ -596,9 +596,48 @@ sgm,sgm41513,enable_term; sgm,sgm41513,stat-pin-ctrl = <3>; sgm,sgm41513,vac-ovp-threshold = <6500>; - status = "okay"; - }; - charger@6b { status = "disabled"; }; + }; +*/ + charger@6B { + compatible = "ti,bq2560x_charger","eta,eta6963_charger","cx,cx7601_charger"; + reg = <0x6B>; + ti,bq2560x,usb-vlim = <4600>; + ti,bq2560x,usb-ilim = <2000>; + ti,bq2560x,usb-vreg = <4400>; + ti,bq2560x,usb-ichg = <2000>; + ti,bq2560x,precharge-current = <180>; + ti,bq2560x,termination-current = <240>; + ti,bq2560x,boost-voltage = <5150>; + ti,bq2560x,boost-current = <1200>; + ti,bq2560x,enable_term; + ti,bq2560x,stat-pin-ctrl = <3>; + ti,bq2560x,vac-ovp-threshold = <6500>; + + cx,cx7601,usb-vlim = <4600>; + cx,cx7601,usb-ilim = <2000>; + cx,cx7601,usb-vreg = <4400>; + cx,cx7601,usb-ichg = <2000>; + cx,cx7601,precharge-current = <180>; + cx,cx7601,termination-current = <320>; + cx,cx7601,boost-voltage = <5150>; + cx,cx7601,boost-current = <1200>; + cx,cx7601,enable_term; + cx,cx7601,stat-pin-ctrl = <3>; + cx,cx7601,vac-ovp-threshold = <6500>; + + eta,eta6963,usb-vlim = <4600>; + eta,eta6963,usb-ilim = <2000>; + eta,eta6963,usb-vreg = <4400>; + eta,eta6963,usb-ichg = <2000>; + eta,eta6963,precharge-current = <180>; + eta,eta6963,termination-current = <240>; + eta,eta6963,boost-voltage = <5150>; + eta,eta6963,boost-current = <1200>; + eta,eta6963,enable_term; + eta,eta6963,stat-pin-ctrl = <3>; + eta,eta6963,vac-ovp-threshold = <6500>; + }; + }; /*charger end*/ diff --git a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi index 48b8f113d0ff..1d0ddc7c8026 100644 --- a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi +++ b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi @@ -198,7 +198,7 @@ switching_charger_mtk:switching_charger@6b { compatible = "mediatek,switching_charger"; reg = <0x6b>; - status = "okay"; + status = "disabled"; }; }; diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 42a152f26345..2660c4447f70 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -292,10 +292,10 @@ CONFIG_POWER_AVS=y CONFIG_CHARGER_TYPE_MT6357=y CONFIG_MTK_CHARGER=y CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y -# CONFIG_CHARGER_BQ2560X is not set +CONFIG_CHARGER_BQ2560X=y # CONFIG_CHARGER_ETA6963 is not set # CONFIG_CHARGER_CX7601 is not set -CONFIG_CHARGER_SGM41513=y +# CONFIG_CHARGER_SGM41513 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE=y diff --git a/arch/arm64/configs/stock_defconfig b/arch/arm64/configs/stock_defconfig index d52974ef479c..7d7b7fff0fea 100644 --- a/arch/arm64/configs/stock_defconfig +++ b/arch/arm64/configs/stock_defconfig @@ -2884,8 +2884,8 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set CONFIG_CHARGER_BQ2560X=y -CONFIG_CHARGER_SGM41513=y -CONFIG_CHARGER_ETA6963=y +# CONFIG_CHARGER_SGM41513 is not set +# CONFIG_CHARGER_ETA6963 is not set # CONFIG_CHARGER_CX7601 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set From 4359c6384a821c814f034a0a92d82c37e4c10d7e Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Mon, 27 Apr 2026 22:58:39 +0300 Subject: [PATCH 04/22] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BA=D0=B8(=D0=BD=D0=B0=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/boot/dts/mediatek/custom_common.dtsi | 2 +- .../arm64/boot/dts/mediatek/dandelion/cust.dtsi | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 7e86eedae4d4..e10052cc412e 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -599,7 +599,7 @@ }; */ charger@6B { - compatible = "ti,bq2560x_charger","eta,eta6963_charger","cx,cx7601_charger"; + compatible = "ti,bq2560x_charger"; reg = <0x6B>; ti,bq2560x,usb-vlim = <4600>; ti,bq2560x,usb-ilim = <2000>; diff --git a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi index 1d0ddc7c8026..5273efc09d1e 100644 --- a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi +++ b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi @@ -190,18 +190,13 @@ }; -&i2c5 { - #address-cells = <1>; - #size-cells = <0>; - clock-frequency = <400000>; - mediatek,use-open-drain; - switching_charger_mtk:switching_charger@6b { - compatible = "mediatek,switching_charger"; - reg = <0x6b>; - status = "disabled"; - }; - +/* УБИВАЕМ ПОЛНОСТЬЮ +switching_charger_mtk:switching_charger@6b { + compatible = "mediatek,switching_charger"; + reg = <0x6b>; + status = "disabled"; }; +*/ &i2c6 { #address-cells = <1>; From 432c8257837d3f8cbd2a0e51026b21869664aa7a Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Mon, 27 Apr 2026 23:13:18 +0300 Subject: [PATCH 05/22] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20&i2c5=20=D0=B2=20cust.dtsi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot --- arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi index 5273efc09d1e..63c8066f4424 100644 --- a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi +++ b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi @@ -189,14 +189,15 @@ }; }; - +&i2c5 { /* УБИВАЕМ ПОЛНОСТЬЮ -switching_charger_mtk:switching_charger@6b { - compatible = "mediatek,switching_charger"; - reg = <0x6b>; - status = "disabled"; -}; + switching_charger_mtk:switching_charger@6b { + compatible = "mediatek,switching_charger"; + reg = <0x6b>; + status = "disabled"; + }; */ +}; &i2c6 { #address-cells = <1>; From 871f08d8a79058bff8a532f21511b92d1b4a315b Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Tue, 28 Apr 2026 20:04:18 +0300 Subject: [PATCH 06/22] =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20cust.dtsi,=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=BB=D0=BE=D0=BA=20&i2c5=20=D0=B2=20custom=5Fc?= =?UTF-8?q?ommon.dtsi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 85 +++++++------------ .../boot/dts/mediatek/dandelion/cust.dtsi | 17 ++-- 2 files changed, 39 insertions(+), 63 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index e10052cc412e..47f3341d0c87 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -580,64 +580,37 @@ /* AUDIO end */ /*charger start*/ -&i2c5 { +/* Переопределяем существующий узел через его метку, чтобы избежать ошибки -16*/ +&switching_charger_mtk { + compatible = "ti,bq2560x_charger"; status = "okay"; - /*charger1@1A { - compatible = "sgm,sgm41513_charger"; - reg = <0x1A>; - sgm,sgm41513,usb-vlim = <4600>; - sgm,sgm41513,usb-ilim = <500>; - sgm,sgm41513,usb-vreg = <0x1130>; - sgm,sgm41513,usb-ichg = <500>; - sgm,sgm41513,precharge-current = <180>; - sgm,sgm41513,termination-current = <240>; - sgm,sgm41513,boost-voltage = <5150>; - sgm,sgm41513,boost-current = <1200>; - sgm,sgm41513,enable_term; - sgm,sgm41513,stat-pin-ctrl = <3>; - sgm,sgm41513,vac-ovp-threshold = <6500>; - }; -*/ - charger@6B { - compatible = "ti,bq2560x_charger"; - reg = <0x6B>; - ti,bq2560x,usb-vlim = <4600>; - ti,bq2560x,usb-ilim = <2000>; - ti,bq2560x,usb-vreg = <4400>; - ti,bq2560x,usb-ichg = <2000>; - ti,bq2560x,precharge-current = <180>; - ti,bq2560x,termination-current = <240>; - ti,bq2560x,boost-voltage = <5150>; - ti,bq2560x,boost-current = <1200>; - ti,bq2560x,enable_term; - ti,bq2560x,stat-pin-ctrl = <3>; - ti,bq2560x,vac-ovp-threshold = <6500>; - - cx,cx7601,usb-vlim = <4600>; - cx,cx7601,usb-ilim = <2000>; - cx,cx7601,usb-vreg = <4400>; - cx,cx7601,usb-ichg = <2000>; - cx,cx7601,precharge-current = <180>; - cx,cx7601,termination-current = <320>; - cx,cx7601,boost-voltage = <5150>; - cx,cx7601,boost-current = <1200>; - cx,cx7601,enable_term; - cx,cx7601,stat-pin-ctrl = <3>; - cx,cx7601,vac-ovp-threshold = <6500>; - - eta,eta6963,usb-vlim = <4600>; - eta,eta6963,usb-ilim = <2000>; - eta,eta6963,usb-vreg = <4400>; - eta,eta6963,usb-ichg = <2000>; - eta,eta6963,precharge-current = <180>; - eta,eta6963,termination-current = <240>; - eta,eta6963,boost-voltage = <5150>; - eta,eta6963,boost-current = <1200>; - eta,eta6963,enable_term; - eta,eta6963,stat-pin-ctrl = <3>; - eta,eta6963,vac-ovp-threshold = <6500>; - }; + /* Параметры для bq2560x */ + ti,bq2560x,usb-vlim = <4600>; + ti,bq2560x,usb-ilim = <2000>; + ti,bq2560x,usb-vreg = <4400>; + ti,bq2560x,usb-ichg = <2000>; + ti,bq2560x,precharge-current = <180>; + ti,bq2560x,termination-current = <240>; + ti,bq2560x,boost-voltage = <5150>; + ti,bq2560x,boost-current = <1200>; + ti,bq2560x,enable_term; + ti,bq2560x,stat-pin-ctrl = <3>; + ti,bq2560x,vac-ovp-threshold = <6500>; + + /* Дополнительные параметры для совместимости (если драйвер их ищет) */ + cx,cx7601,usb-vlim = <4600>; + cx,cx7601,usb-ilim = <2000>; + cx,cx7601,usb-ichg = <2000>; + + eta,eta6963,usb-vlim = <4600>; + eta,eta6963,usb-ilim = <2000>; + eta,eta6963,usb-ichg = <2000>; +}; + +/* Убеждаемся, что сама шина включена */ +&i2c5 { + status = "okay"; }; /*charger end*/ diff --git a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi index 63c8066f4424..0522efa1668e 100644 --- a/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi +++ b/arch/arm64/boot/dts/mediatek/dandelion/cust.dtsi @@ -190,13 +190,16 @@ }; &i2c5 { -/* УБИВАЕМ ПОЛНОСТЬЮ - switching_charger_mtk:switching_charger@6b { - compatible = "mediatek,switching_charger"; - reg = <0x6b>; - status = "disabled"; - }; -*/ + #address-cells = <1>; + #size-cells = <0>; + clock-frequency = <400000>; + mediatek,use-open-drain; + switching_charger_mtk:switching_charger@6b { + compatible = "mediatek,switching_charger"; + reg = <0x6b>; + status = "okay"; + }; + }; &i2c6 { From cc3d4899d2f93e6394fe634ec1ea5d3e9508e76f Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Tue, 28 Apr 2026 21:54:23 +0300 Subject: [PATCH 07/22] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=20BQ2560X=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20SMG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 47f3341d0c87..9d76c2dda237 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -580,37 +580,40 @@ /* AUDIO end */ /*charger start*/ -/* Переопределяем существующий узел через его метку, чтобы избежать ошибки -16*/ -&switching_charger_mtk { - compatible = "ti,bq2560x_charger"; - status = "okay"; - - /* Параметры для bq2560x */ - ti,bq2560x,usb-vlim = <4600>; - ti,bq2560x,usb-ilim = <2000>; - ti,bq2560x,usb-vreg = <4400>; - ti,bq2560x,usb-ichg = <2000>; - ti,bq2560x,precharge-current = <180>; - ti,bq2560x,termination-current = <240>; - ti,bq2560x,boost-voltage = <5150>; - ti,bq2560x,boost-current = <1200>; - ti,bq2560x,enable_term; - ti,bq2560x,stat-pin-ctrl = <3>; - ti,bq2560x,vac-ovp-threshold = <6500>; - - /* Дополнительные параметры для совместимости (если драйвер их ищет) */ - cx,cx7601,usb-vlim = <4600>; - cx,cx7601,usb-ilim = <2000>; - cx,cx7601,usb-ichg = <2000>; - - eta,eta6963,usb-vlim = <4600>; - eta,eta6963,usb-ilim = <2000>; - eta,eta6963,usb-ichg = <2000>; -}; - -/* Убеждаемся, что сама шина включена */ &i2c5 { status = "okay"; + + /* 1. Удаляем старые определения, чтобы они не мешали регистрации */ + /delete-node/ charger1@1A; + /delete-node/ charger@6B; + + /* 2. Сажаем драйвер bq2560x на физический адрес SGM (0x1A) */ + charger@1A { + compatible = "ti,bq2560x_charger"; + reg = <0x1A>; + status = "okay"; + + /* Основные лимиты для быстрой зарядки (2А) */ + ti,bq2560x,usb-vlim = <4600>; + ti,bq2560x,usb-ilim = <2000>; /* Входной лимит тока */ + ti,bq2560x,usb-vreg = <4400>; + ti,bq2560x,usb-ichg = <2000>; /* Ток заряда аккумулятора */ + + /* Вспомогательные параметры */ + ti,bq2560x,precharge-current = <180>; + ti,bq2560x,termination-current = <240>; + ti,bq2560x,boost-voltage = <5150>; + ti,bq2560x,boost-current = <1200>; + ti,bq2560x,enable_term; + ti,bq2560x,stat-pin-ctrl = <3>; + ti,bq2560x,vac-ovp-threshold = <6500>; + + /* Дублируем для совместимости с другими вариантами драйвера */ + cx,cx7601,usb-ilim = <2000>; + cx,cx7601,usb-ichg = <2000>; + eta,eta6963,usb-ilim = <2000>; + eta,eta6963,usb-ichg = <2000>; + }; }; /*charger end*/ From 7bbccc0e77a5b28eca136598cfeca0667a1d1bdd Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 30 Apr 2026 19:12:00 +0300 Subject: [PATCH 08/22] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=20SGM41513?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 66 +- arch/arm64/configs/blossom_defconfig | 2 +- arch/arm64/configs/stock_defconfig | 2 +- .../include/mt-plat/v1/charger_class.h | 406 ++++ .../include/mt-plat/v1/charger_type.h | 51 + .../mediatek/include/mt-plat/v1/mtk_battery.h | 69 + .../mediatek/include/mt-plat/v1/mtk_charger.h | 169 ++ .../include/mt-plat/v1/prop_chgalgo_class.h | 369 ++++ .../mediatek/charger/mtk_charger_init.h | 151 ++ .../mediatek/charger/mtk_charger_intf.h | 610 ++++++ .../supply/mediatek/charger/mtk_pdc_intf.h | 62 + .../supply/mediatek/charger/mtk_pe20_intf.h | 113 + .../supply/mediatek/charger/mtk_pe40_intf.h | 66 + .../supply/mediatek/charger/mtk_pe50_intf.h | 110 + .../supply/mediatek/charger/mtk_pe_intf.h | 99 + .../mediatek/charger/mtk_smartcharging.h | 117 + .../power/supply/mediatek/charger/sgm41513.h | 67 + .../mediatek/charger/sgm41513_charger.c | 1873 +++++++++++++++++ .../supply/mediatek/charger/sgm41513_reg.h | 340 +++ .../mediatek/misc/mtk_gauge_time_service.c | 454 ++++ .../mediatek/misc/mtk_gauge_time_service.h | 26 + include/linux/chg-tcpc_info.h | 30 + 22 files changed, 5229 insertions(+), 23 deletions(-) create mode 100644 drivers/misc/mediatek/include/mt-plat/v1/charger_class.h create mode 100644 drivers/misc/mediatek/include/mt-plat/v1/charger_type.h create mode 100644 drivers/misc/mediatek/include/mt-plat/v1/mtk_battery.h create mode 100644 drivers/misc/mediatek/include/mt-plat/v1/mtk_charger.h create mode 100644 drivers/misc/mediatek/include/mt-plat/v1/prop_chgalgo_class.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_charger_init.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_charger_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_pdc_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_pe20_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_pe40_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_pe50_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_pe_intf.h create mode 100644 drivers/power/supply/mediatek/charger/mtk_smartcharging.h create mode 100644 drivers/power/supply/mediatek/charger/sgm41513.h create mode 100644 drivers/power/supply/mediatek/charger/sgm41513_charger.c create mode 100644 drivers/power/supply/mediatek/charger/sgm41513_reg.h create mode 100644 drivers/power/supply/mediatek/misc/mtk_gauge_time_service.c create mode 100644 drivers/power/supply/mediatek/misc/mtk_gauge_time_service.h create mode 100644 include/linux/chg-tcpc_info.h diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 9d76c2dda237..5d148ca48503 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -582,24 +582,29 @@ /*charger start*/ &i2c5 { status = "okay"; - - /* 1. Удаляем старые определения, чтобы они не мешали регистрации */ - /delete-node/ charger1@1A; - /delete-node/ charger@6B; - - /* 2. Сажаем драйвер bq2560x на физический адрес SGM (0x1A) */ - charger@1A { - compatible = "ti,bq2560x_charger"; + charger1@1A { + compatible = "sgm,sgm41513_charger"; reg = <0x1A>; - status = "okay"; - - /* Основные лимиты для быстрой зарядки (2А) */ + sgm,sgm41513,usb-vlim = <4600>; + sgm,sgm41513,usb-ilim = <2000>; + sgm,sgm41513,usb-vreg = <0x1130>; + sgm,sgm41513,usb-ichg = <2000>; + sgm,sgm41513,precharge-current = <180>; + sgm,sgm41513,termination-current = <240>; + sgm,sgm41513,boost-voltage = <5150>; + sgm,sgm41513,boost-current = <1200>; + sgm,sgm41513,enable_term; + sgm,sgm41513,stat-pin-ctrl = <3>; + sgm,sgm41513,vac-ovp-threshold = <6500>; + }; + + charger@6B { + compatible = "ti,bq2560x_charger","eta,eta6963_charger","cx,cx7601_charger"; + reg = <0x6B>; ti,bq2560x,usb-vlim = <4600>; - ti,bq2560x,usb-ilim = <2000>; /* Входной лимит тока */ + ti,bq2560x,usb-ilim = <500>; ti,bq2560x,usb-vreg = <4400>; - ti,bq2560x,usb-ichg = <2000>; /* Ток заряда аккумулятора */ - - /* Вспомогательные параметры */ + ti,bq2560x,usb-ichg = <500>; ti,bq2560x,precharge-current = <180>; ti,bq2560x,termination-current = <240>; ti,bq2560x,boost-voltage = <5150>; @@ -608,12 +613,31 @@ ti,bq2560x,stat-pin-ctrl = <3>; ti,bq2560x,vac-ovp-threshold = <6500>; - /* Дублируем для совместимости с другими вариантами драйвера */ - cx,cx7601,usb-ilim = <2000>; - cx,cx7601,usb-ichg = <2000>; - eta,eta6963,usb-ilim = <2000>; - eta,eta6963,usb-ichg = <2000>; - }; + cx,cx7601,usb-vlim = <4600>; + cx,cx7601,usb-ilim = <500>; + cx,cx7601,usb-vreg = <4400>; + cx,cx7601,usb-ichg = <500>; + cx,cx7601,precharge-current = <180>; + cx,cx7601,termination-current = <320>; + cx,cx7601,boost-voltage = <5150>; + cx,cx7601,boost-current = <1200>; + cx,cx7601,enable_term; + cx,cx7601,stat-pin-ctrl = <3>; + cx,cx7601,vac-ovp-threshold = <6500>; + + eta,eta6963,usb-vlim = <4600>; + eta,eta6963,usb-ilim = <500>; + eta,eta6963,usb-vreg = <4400>; + eta,eta6963,usb-ichg = <500>; + eta,eta6963,precharge-current = <180>; + eta,eta6963,termination-current = <240>; + eta,eta6963,boost-voltage = <5150>; + eta,eta6963,boost-current = <1200>; + eta,eta6963,enable_term; + eta,eta6963,stat-pin-ctrl = <3>; + eta,eta6963,vac-ovp-threshold = <6500>; + }; + }; /*charger end*/ diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 2660c4447f70..fe0761155831 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -295,7 +295,7 @@ CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y CONFIG_CHARGER_BQ2560X=y # CONFIG_CHARGER_ETA6963 is not set # CONFIG_CHARGER_CX7601 is not set -# CONFIG_CHARGER_SGM41513 is not set +CONFIG_CHARGER_SGM41513=y # CONFIG_HWMON is not set CONFIG_THERMAL=y CONFIG_THERMAL_DEFAULT_GOV_BACKWARD_COMPATIBLE=y diff --git a/arch/arm64/configs/stock_defconfig b/arch/arm64/configs/stock_defconfig index 7d7b7fff0fea..9918a7ea2d66 100644 --- a/arch/arm64/configs/stock_defconfig +++ b/arch/arm64/configs/stock_defconfig @@ -2884,7 +2884,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set CONFIG_CHARGER_BQ2560X=y -# CONFIG_CHARGER_SGM41513 is not set +CONFIG_CHARGER_SGM41513=y # CONFIG_CHARGER_ETA6963 is not set # CONFIG_CHARGER_CX7601 is not set # CONFIG_CHARGER_BQ25890 is not set diff --git a/drivers/misc/mediatek/include/mt-plat/v1/charger_class.h b/drivers/misc/mediatek/include/mt-plat/v1/charger_class.h new file mode 100644 index 000000000000..68522675fc70 --- /dev/null +++ b/drivers/misc/mediatek/include/mt-plat/v1/charger_class.h @@ -0,0 +1,406 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef LINUX_POWER_CHARGER_CLASS_H +#define LINUX_POWER_CHARGER_CLASS_H + +#include +#include +#include +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 start */ +#include +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 end */ + +enum adc_channel { + ADC_CHANNEL_VBUS, + ADC_CHANNEL_VSYS, + ADC_CHANNEL_VBAT, + ADC_CHANNEL_IBUS, + ADC_CHANNEL_IBAT, + ADC_CHANNEL_TEMP_JC, + ADC_CHANNEL_USBID, + ADC_CHANNEL_TS, + ADC_CHANNEL_TBAT, + ADC_CHANNEL_VOUT, + ADC_CHANNEL_MAX, +}; + +struct charger_properties { + const char *alias_name; +}; + +/* Data of notifier from charger device */ +struct chgdev_notify { + bool vbusov_stat; +}; + +struct charger_device { + struct charger_properties props; + struct chgdev_notify noti; + const struct charger_ops *ops; + struct mutex ops_lock; + struct device dev; + struct srcu_notifier_head evt_nh; + void *driver_data; + bool is_polling_mode; +}; + +struct charger_ops { + int (*suspend)(struct charger_device *dev, pm_message_t state); + int (*resume)(struct charger_device *dev); + + /* cable plug in/out */ + int (*plug_in)(struct charger_device *dev); + int (*plug_out)(struct charger_device *dev); + + /* enable/disable charger */ + int (*enable)(struct charger_device *dev, bool en); + + int (*is_enabled)(struct charger_device *dev, bool *en); + + /* enable/disable chip */ + int (*enable_chip)(struct charger_device *dev, bool en); + int (*is_chip_enabled)(struct charger_device *dev, bool *en); + + /* get/set charging current*/ + int (*get_charging_current)(struct charger_device *dev, u32 *uA); + int (*set_charging_current)(struct charger_device *dev, u32 uA); + int (*get_min_charging_current)(struct charger_device *dev, u32 *uA); + + /* set cv */ + int (*set_constant_voltage)(struct charger_device *dev, u32 uV); + int (*get_constant_voltage)(struct charger_device *dev, u32 *uV); + + /* set input_current */ + int (*get_input_current)(struct charger_device *dev, u32 *uA); + int (*set_input_current)(struct charger_device *dev, u32 uA); + int (*get_min_input_current)(struct charger_device *dev, u32 *uA); + + /* set termination current */ + int (*get_eoc_current)(struct charger_device *dev, u32 *uA); + int (*set_eoc_current)(struct charger_device *dev, u32 uA); + + /* kick wdt */ + int (*kick_wdt)(struct charger_device *dev); + + int (*event)(struct charger_device *dev, u32 event, u32 args); + + /* PE+/PE+2.0 */ + int (*send_ta_current_pattern)(struct charger_device *dev, bool is_inc); + int (*send_ta20_current_pattern)(struct charger_device *dev, u32 uV); + int (*reset_ta)(struct charger_device *dev); + int (*enable_cable_drop_comp)(struct charger_device *dev, bool en); + + int (*set_mivr)(struct charger_device *dev, u32 uV); + int (*get_mivr)(struct charger_device *dev, u32 *uV); + int (*get_mivr_state)(struct charger_device *dev, bool *in_loop); + + /* enable/disable powerpath */ + int (*is_powerpath_enabled)(struct charger_device *dev, bool *en); + int (*enable_powerpath)(struct charger_device *dev, bool en); + + /* enable/disable vbus ovp */ + int (*enable_vbus_ovp)(struct charger_device *dev, bool en); + + /* enable/disable charging safety timer */ + int (*is_safety_timer_enabled)(struct charger_device *dev, bool *en); + int (*enable_safety_timer)(struct charger_device *dev, bool en); + + /* enable term */ + int (*enable_termination)(struct charger_device *dev, bool en); + + /* direct charging */ + int (*enable_direct_charging)(struct charger_device *dev, bool en); + int (*kick_direct_charging_wdt)(struct charger_device *dev); + int (*set_direct_charging_ibusoc)(struct charger_device *dev, u32 uA); + int (*set_direct_charging_vbusov)(struct charger_device *dev, u32 uV); + + int (*set_ibusocp)(struct charger_device *dev, u32 uA); + int (*set_vbusovp)(struct charger_device *dev, u32 uV); + int (*set_ibatocp)(struct charger_device *dev, u32 uA); + int (*set_vbatovp)(struct charger_device *dev, u32 uV); + int (*set_vbatovp_alarm)(struct charger_device *dev, u32 uV); + int (*reset_vbatovp_alarm)(struct charger_device *dev); + int (*set_vbusovp_alarm)(struct charger_device *dev, u32 uV); + int (*reset_vbusovp_alarm)(struct charger_device *dev); + int (*is_vbuslowerr)(struct charger_device *dev, bool *err); + int (*init_chip)(struct charger_device *dev); + int (*enable_auto_trans)(struct charger_device *dev, bool en); + int (*set_auto_trans)(struct charger_device *dev, u32 uV, bool en); + + /* OTG */ + int (*enable_otg)(struct charger_device *dev, bool en); + int (*enable_discharge)(struct charger_device *dev, bool en); + int (*set_boost_current_limit)(struct charger_device *dev, u32 uA); + + /* charger type detection */ + int (*enable_chg_type_det)(struct charger_device *dev, bool en); + + /* run AICL */ + int (*run_aicl)(struct charger_device *dev, u32 *uA); + + /* reset EOC state */ + int (*reset_eoc_state)(struct charger_device *dev); + + int (*safety_check)(struct charger_device *dev, u32 polling_ieoc); + + int (*is_charging_done)(struct charger_device *dev, bool *done); + int (*set_pe20_efficiency_table)(struct charger_device *dev); + int (*dump_registers)(struct charger_device *dev); + + int (*get_adc)(struct charger_device *dev, enum adc_channel chan, + int *min, int *max); + int (*get_adc_accuracy)(struct charger_device *dev, + enum adc_channel chan, int *min, int *max); + int (*get_vbus_adc)(struct charger_device *dev, u32 *vbus); + int (*get_ibus_adc)(struct charger_device *dev, u32 *ibus); + int (*get_ibat_adc)(struct charger_device *dev, u32 *ibat); + int (*get_tchg_adc)(struct charger_device *dev, int *tchg_min, + int *tchg_max); + int (*get_zcv)(struct charger_device *dev, u32 *uV); + + /* TypeC */ + int (*enable_usbid)(struct charger_device *dev, bool en); + int (*set_usbid_rup)(struct charger_device *dev, u32 rup); + int (*set_usbid_src_ton)(struct charger_device *dev, u32 src_ton); + int (*enable_usbid_floating)(struct charger_device *dev, bool en); + int (*enable_force_typec_otp)(struct charger_device *dev, bool en); + int (*enable_hidden_mode)(struct charger_device *dev, bool en); + int (*get_ctd_dischg_status)(struct charger_device *dev, u8 *status); + int (*enable_hz)(struct charger_device *dev, bool en); + + int (*enable_bleed_discharge)(struct charger_device *dev, bool en); + + /* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 start */ + int (*set_hiz_mode)(struct charger_device *dev, bool en); + int (*get_hiz_mode)(struct charger_device *dev); + /* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 end */ + + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 start*/ + int (*get_ship_mode)(struct charger_device *chg_dev); + int (*set_ship_mode)(struct charger_device *chg_dev, bool enable); + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 end*/ + + /* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 start*/ + int (*get_chr_status)(struct charger_device *chg_dev, int *status); + /* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 end*/ + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + int (*get_vbus_status)(struct charger_device *dev); + int (*dynamic_set_hwovp_threshold)(struct charger_device *dev, int adapter_type); + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ + int (*bypass_chgdet)(struct charger_device *chg_dev, bool bypass_chgdet_en); + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ +}; + +static inline void *charger_dev_get_drvdata( + const struct charger_device *charger_dev) +{ + return charger_dev->driver_data; +} + +static inline void charger_dev_set_drvdata( + struct charger_device *charger_dev, void *data) +{ + charger_dev->driver_data = data; +} + +extern struct charger_device *charger_device_register( + const char *name, + struct device *parent, void *devdata, const struct charger_ops *ops, + const struct charger_properties *props); +extern void charger_device_unregister( + struct charger_device *charger_dev); +extern struct charger_device *get_charger_by_name( + const char *name); + +#define to_charger_device(obj) container_of(obj, struct charger_device, dev) + +static inline void *charger_get_data( + struct charger_device *charger_dev) +{ + return dev_get_drvdata(&charger_dev->dev); +} + +extern int charger_dev_enable(struct charger_device *charger_dev, bool en); +extern int charger_dev_is_enabled(struct charger_device *charger_dev, bool *en); +extern int charger_dev_plug_in(struct charger_device *charger_dev); +extern int charger_dev_plug_out(struct charger_device *charger_dev); +extern int charger_dev_set_charging_current( + struct charger_device *charger_dev, u32 uA); +extern int charger_dev_get_charging_current( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_get_min_charging_current( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_set_input_current( + struct charger_device *charger_dev, u32 uA); +extern int charger_dev_get_input_current( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_get_min_input_current( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_set_eoc_current( + struct charger_device *charger_dev, u32 uA); +extern int charger_dev_get_eoc_current( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_kick_wdt( + struct charger_device *charger_dev); +extern int charger_dev_set_constant_voltage( + struct charger_device *charger_dev, u32 uV); +extern int charger_dev_get_constant_voltage( + struct charger_device *charger_dev, u32 *uV); +extern int charger_dev_dump_registers( + struct charger_device *charger_dev); +extern int charger_dev_enable_vbus_ovp( + struct charger_device *charger_dev, bool en); +extern int charger_dev_set_mivr( + struct charger_device *charger_dev, u32 uV); +extern int charger_dev_get_mivr( + struct charger_device *charger_dev, u32 *uV); +extern int charger_dev_get_mivr_state( + struct charger_device *charger_dev, bool *in_loop); +extern int charger_dev_do_event( + struct charger_device *charger_dev, u32 event, u32 args); +extern int charger_dev_is_powerpath_enabled( + struct charger_device *charger_dev, bool *en); +extern int charger_dev_is_safety_timer_enabled( + struct charger_device *charger_dev, bool *en); +extern int charger_dev_enable_termination( + struct charger_device *charger_dev, bool en); +extern int charger_dev_is_charging_done( + struct charger_device *charger_dev, bool *done); +extern int charger_dev_enable_powerpath( + struct charger_device *charger_dev, bool en); +extern int charger_dev_enable_safety_timer( + struct charger_device *charger_dev, bool en); +extern int charger_dev_enable_chg_type_det( + struct charger_device *charger_dev, bool en); +extern int charger_dev_enable_otg( + struct charger_device *charger_dev, bool en); +extern int charger_dev_enable_discharge( + struct charger_device *charger_dev, bool en); +extern int charger_dev_set_boost_current_limit( + struct charger_device *charger_dev, u32 uA); +extern int charger_dev_get_zcv( + struct charger_device *charger_dev, u32 *uV); +extern int charger_dev_run_aicl( + struct charger_device *charger_dev, u32 *uA); +extern int charger_dev_reset_eoc_state( + struct charger_device *charger_dev); +extern int charger_dev_safety_check( + struct charger_device *charger_dev, u32 polling_ieoc); +extern int charger_dev_enable_hz( + struct charger_device *charger_dev, bool en); + +/* PE+/PE+2.0 */ +extern int charger_dev_send_ta_current_pattern( + struct charger_device *charger_dev, bool is_increase); +extern int charger_dev_send_ta20_current_pattern( + struct charger_device *charger_dev, u32 uV); +extern int charger_dev_reset_ta( + struct charger_device *charger_dev); +extern int charger_dev_set_pe20_efficiency_table( + struct charger_device *charger_dev); +extern int charger_dev_enable_cable_drop_comp( + struct charger_device *charger_dev, bool en); + +/* PE 3.0 */ +extern int charger_dev_enable_chip( + struct charger_device *charger_dev, bool en); +extern int charger_dev_is_chip_enabled( + struct charger_device *charger_dev, bool *en); +extern int charger_dev_enable_direct_charging( + struct charger_device *charger_dev, bool en); +extern int charger_dev_kick_direct_charging_wdt( + struct charger_device *charger_dev); +extern int charger_dev_get_adc(struct charger_device *charger_dev, + enum adc_channel chan, int *min, int *max); +extern int charger_dev_get_adc_accuracy(struct charger_device *charger_dev, + enum adc_channel chan, int *min, int *max); +/* Prefer use charger_dev_get_adc api */ +extern int charger_dev_get_vbus( + struct charger_device *charger_dev, u32 *vbus); +extern int charger_dev_get_ibus( + struct charger_device *charger_dev, u32 *ibus); +extern int charger_dev_get_ibat( + struct charger_device *charger_dev, u32 *ibat); +extern int charger_dev_get_temperature( + struct charger_device *charger_dev, int *tchg_min, + int *tchg_max); +extern int charger_dev_set_direct_charging_ibusoc( + struct charger_device *charger_dev, u32 ua); +extern int charger_dev_set_direct_charging_vbusov( + struct charger_device *charger_dev, u32 uv); + +extern int charger_dev_set_ibusocp(struct charger_device *chg_dev, u32 uA); +extern int charger_dev_set_vbusovp(struct charger_device *chg_dev, u32 uV); +extern int charger_dev_set_ibatocp(struct charger_device *chg_dev, u32 uA); +extern int charger_dev_set_vbatovp(struct charger_device *chg_dev, u32 uV); +extern int charger_dev_set_vbatovp_alarm(struct charger_device *chg_dev, + u32 uV); +extern int charger_dev_reset_vbatovp_alarm(struct charger_device *chg_dev); +extern int charger_dev_set_vbusovp_alarm(struct charger_device *chg_dev, + u32 uV); +extern int charger_dev_reset_vbusovp_alarm(struct charger_device *chg_dev); +extern int charger_dev_is_vbuslowerr(struct charger_device *chg_dev, bool *err); +extern int charger_dev_init_chip(struct charger_device *chg_dev); +extern int charger_dev_enable_auto_trans(struct charger_device *chg_dev, + bool en); +extern int charger_dev_set_auto_trans(struct charger_device *chg_dev, u32 uV, + bool en); + +/* TypeC */ +extern int charger_dev_enable_usbid(struct charger_device *dev, bool en); +extern int charger_dev_set_usbid_rup(struct charger_device *dev, u32 rup); +extern int charger_dev_set_usbid_src_ton(struct charger_device *dev, + u32 src_ton); +extern int charger_dev_enable_usbid_floating(struct charger_device *dev, + bool en); +extern int charger_dev_enable_force_typec_otp(struct charger_device *dev, + bool en); +extern int charger_dev_get_ctd_dischg_status(struct charger_device *dev, + u8 *status); + +extern int charger_dev_enable_bleed_discharge(struct charger_device *dev, + bool en); + +/* For buck1 FPWM */ +extern int charger_dev_enable_hidden_mode(struct charger_device *dev, bool en); + +extern int register_charger_device_notifier( + struct charger_device *charger_dev, + struct notifier_block *nb); +extern int unregister_charger_device_notifier( + struct charger_device *charger_dev, + struct notifier_block *nb); +extern int charger_dev_notify( + struct charger_device *charger_dev, int event); + +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 start */ +extern int charger_dev_set_hiz_mode(struct charger_device *chg_dev, bool en); +extern int charger_dev_get_hiz_mode(struct charger_device *chg_dev); +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 end */ + +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 start */ +extern enum chg_ic_supplier chg_info; +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 end */ + +/* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 start*/ +extern int charger_dev_set_shipmode(struct charger_device *chg_dev, bool enable); +extern int charger_dev_get_shipmode(struct charger_device *chg_dev); +/* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 end*/ + +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 start*/ +extern int charger_dev_get_chr_status(struct charger_device *chg_dev, int *status); +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 end*/ + +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ +extern int charger_dev_get_vbus_status(struct charger_device *charger_dev); +extern int charger_dev_dynamic_set_hwovp_threshold(struct charger_device *charger_dev, + int adapter_type); +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ +extern int charger_dev_bypass_chgdet(struct charger_device *chg_dev,bool bypass_chgdet_en); +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ +#endif /*LINUX_POWER_CHARGER_CLASS_H*/ \ No newline at end of file diff --git a/drivers/misc/mediatek/include/mt-plat/v1/charger_type.h b/drivers/misc/mediatek/include/mt-plat/v1/charger_type.h new file mode 100644 index 000000000000..ac4cc1eb5370 --- /dev/null +++ b/drivers/misc/mediatek/include/mt-plat/v1/charger_type.h @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_CHARGER_TYPE_H__ +#define __MTK_CHARGER_TYPE_H__ + +enum charger_type { + CHARGER_UNKNOWN = 0, + STANDARD_HOST, /* USB : 450mA */ + CHARGING_HOST, + NONSTANDARD_CHARGER, /* AC : 450mA~1A */ + STANDARD_CHARGER, /* AC : ~1A */ + APPLE_2_4A_CHARGER, /* 2.4A apple charger */ + APPLE_2_1A_CHARGER, /* 2.1A apple charger */ + APPLE_1_0A_CHARGER, /* 1A apple charger */ + APPLE_0_5A_CHARGER, /* 0.5A apple charger */ + SAMSUNG_CHARGER, + WIRELESS_CHARGER, +}; +#if defined(CONFIG_USB_MTK_HDRC) || defined(CONFIG_USB_MU3D_DRV) \ + || defined(CONFIG_EXTCON_MTK_USB) +extern void mt_usb_connect_v1(void); +extern void mt_usb_disconnect_v1(void); +#else +#define mt_usb_connect() do { } while (0) +#define mt_usb_disconnect() do { } while (0) +#endif + +extern enum charger_type mt_get_charger_type(void); +extern void mtk_charger_int_handler(void); + +#if defined(CONFIG_MTK_PUMP_EXPRESS_PLUS_30_SUPPORT) +extern int register_charger_det_callback(int (*func)(int)); +#endif /*CONFIG_MTK_PUMP_EXPRESS_PLUS_30_SUPPORT*/ + +#if defined(CONFIG_MACH_MT6877) || defined(CONFIG_MACH_MT6893) \ + || defined(CONFIG_MACH_MT6885) || defined(CONFIG_MACH_MT6785) +extern bool is_usb_rdy(struct device *dev); +#else +extern bool is_usb_rdy(void); +#endif +extern bool mt_usb_is_device(void); +extern int is_otg_en(void); + +#ifndef CONFIG_MTK_EXTERNAL_CHARGER_TYPE_DETECT +extern void mtk_pmic_enable_chr_type_det(bool en); +#endif + +#endif /* __MTK_CHARGER_TYPE_H__ */ \ No newline at end of file diff --git a/drivers/misc/mediatek/include/mt-plat/v1/mtk_battery.h b/drivers/misc/mediatek/include/mt-plat/v1/mtk_battery.h new file mode 100644 index 000000000000..8302e144c2c2 --- /dev/null +++ b/drivers/misc/mediatek/include/mt-plat/v1/mtk_battery.h @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef _MTK_BATTERY_H +#define _MTK_BATTERY_H + +#ifndef _DEA_MODIFY_ +#include +#include +#else +#include "simulator_kernel.h" +#endif + + +/* ============================================================ */ +/* typedef */ +/* ============================================================ */ + +/* coulomb service */ +struct gauge_consumer { + char *name; + struct device *dev; + long start; + long end; + int variable; + + int (*callback)(struct gauge_consumer *gc); + struct list_head list; +}; + +extern void gauge_coulomb_service_init(void); +extern void gauge_coulomb_consumer_init(struct gauge_consumer *coulomb, + struct device *dev, char *name); +extern void gauge_coulomb_start(struct gauge_consumer *coulomb, int car); +extern void gauge_coulomb_stop(struct gauge_consumer *coulomb); +extern void gauge_coulomb_dump_list(void); +extern void gauge_coulomb_before_reset(void); +extern void gauge_coulomb_after_reset(void); +extern void gauge_coulomb_set_log_level(int x); +/* coulomb sub system end */ + + +/* battery notify charger_consumer */ +enum { + EVENT_BATTERY_PLUG_OUT, +}; + +extern int register_battery_notifier(struct notifier_block *nb); +extern int unregister_battery_notifier(struct notifier_block *nb); +/* battery notify charger_consumer end*/ + + +/* battery common interface */ +extern signed int battery_get_bat_voltage(void); +extern signed int battery_get_bat_current(void); +extern signed int battery_get_bat_current_mA(void); +extern signed int battery_get_soc(void); +extern signed int battery_get_precise_soc(void); +extern signed int battery_get_uisoc(void); +extern signed int battery_get_precise_uisoc(void); +extern signed int battery_get_bat_temperature(void); +extern signed int battery_get_ibus(void); +extern signed int battery_get_vbus(void); +extern signed int battery_get_bat_avg_current(void); + + +#endif /* End of _FUEL_GAUGE_GM_30_H */ \ No newline at end of file diff --git a/drivers/misc/mediatek/include/mt-plat/v1/mtk_charger.h b/drivers/misc/mediatek/include/mt-plat/v1/mtk_charger.h new file mode 100644 index 000000000000..33a6acc52c2c --- /dev/null +++ b/drivers/misc/mediatek/include/mt-plat/v1/mtk_charger.h @@ -0,0 +1,169 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_CHARGER_H__ +#define __MTK_CHARGER_H__ + +#include +#include +#include +#include +#include +#include +#include +//#include + +#include +#include +/* hs14 code for AL6528ADEU-342 by wenyaqi at 2022/10/11 start */ +#if defined(CONFIG_HQ_PROJECT_O22) +#include + +extern enum tcpc_cc_supplier tcpc_info; +#endif +/* hs14 code for AL6528ADEU-342 by wenyaqi at 2022/10/11 end */ + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#ifdef CONFIG_AFC_CHARGER +extern struct charger_manager *ssinfo; +#endif +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + +/* charger_manager notify charger_consumer */ +enum { + CHARGER_NOTIFY_EOC, + CHARGER_NOTIFY_START_CHARGING, + CHARGER_NOTIFY_STOP_CHARGING, + CHARGER_NOTIFY_ERROR, + CHARGER_NOTIFY_NORMAL, +}; + +enum { + MAIN_CHARGER = 0, + SLAVE_CHARGER = 1, + TOTAL_CHARGER = 2, + DIRECT_CHARGER = 10, + MAIN_DIVIDER_CHARGER = 20, + SLAVE_DIVIDER_CHARGER = 21, +}; + +struct charger_consumer { + struct device *dev; + void *cm; + struct notifier_block *pnb; + struct list_head list; + bool hv_charging_disabled; +}; + +/* ============================================= */ +/* The following are charger consumer interfaces */ +/* ============================================= */ + +/* @supply_name: name of charging port + * use charger_port1, charger_port2, ... + * for most cases, use charging_port1 + */ +extern struct charger_consumer *charger_manager_get_by_name( + struct device *dev, + const char *supply_name); +extern int charger_manager_set_input_current_limit( + struct charger_consumer *consumer, + int idx, + int input_current_uA); +extern int charger_manager_set_charging_current_limit( + struct charger_consumer *consumer, + int idx, + int charging_current_uA); +extern int charger_manager_set_pe30_input_current_limit( + struct charger_consumer *consumer, + int idx, + int input_current_uA); +extern int charger_manager_get_pe30_input_current_limit( + struct charger_consumer *consumer, + int idx, + int *input_current_uA, + int *min_current_uA, + int *max_current_uA); +extern int charger_manager_get_current_charging_type( + struct charger_consumer *consumer); +extern int register_charger_manager_notifier( + struct charger_consumer *consumer, + struct notifier_block *nb); +extern int charger_manager_get_charger_temperature( + struct charger_consumer *consumer, + int idx, + int *tchg_min, + int *tchg_max); +extern int unregister_charger_manager_notifier( + struct charger_consumer *consumer, + struct notifier_block *nb); +extern int charger_manager_enable_high_voltage_charging( + struct charger_consumer *consumer, + bool en); +extern int charger_manager_enable_power_path( + struct charger_consumer *consumer, + int idx, + bool en); +extern int charger_manager_force_disable_power_path( + struct charger_consumer *consumer, + int idx, + bool disable); +extern int charger_manager_enable_charging( + struct charger_consumer *consumer, + int idx, + bool en); +extern int charger_manager_get_zcv( + struct charger_consumer *consumer, + int idx, + u32 *uV); +extern int charger_manager_set_constant_voltage( + struct charger_consumer *consumer, + int idx, + u32 uV); +extern int charger_manager_enable_chg_type_det( + struct charger_consumer *consumer, + bool en); +extern int mtk_chr_is_charger_exist(unsigned char *exist); +extern bool is_power_path_supported(void); +extern int charger_get_vbus(void); +extern bool mt_charger_plugin(void); + +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 start */ +extern int charger_manager_input_suspend(struct charger_consumer *consumer, + int idx, + bool en); +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 end */ + +/* hs14 code for SR-AL6528A-01-259 by qiaodan at 2022/10/17 start*/ +extern int charger_manager_get_shipmode(struct charger_consumer *consumer, + int idx); +extern int charger_manager_set_shipmode(struct charger_consumer *consumer, + int idx); +/* hs14 code for SR-AL6528A-01-259 by qiaodan at 2022/10/17 end*/ + +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 start*/ +extern int charger_manager_get_chr_type(struct charger_consumer *consumer, + int idx, int *chr_type); +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 end*/ +/* hs14 code for SR-AL6528A-445 by shanxinkai at 2022/10/28 start */ +extern int charger_manager_dump_charger_ic(struct charger_consumer *consumer, + int idx); +/* hs14 code for SR-AL6528A-445 by shanxinkai at 2022/10/28 end */ +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ +extern int charger_manager_bypass_chgdet(struct charger_consumer *consumer, + int idx, bool bypass_chgdet); +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#ifdef CONFIG_AFC_CHARGER +extern bool ss_fast_charger_status(struct charger_manager *info); +#endif +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ +#endif /* __MTK_CHARGER_H__ */ +/*hs14 code for SR-AL6528A-01-380 by lichang at 2022/09/26 start*/ +#ifdef CONFIG_HQ_PROJECT_O22 +extern int register_usb_check_notifier(struct notifier_block *nb); +extern int unregister_usb_check_notifier(struct notifier_block *nb); +#endif +/*hs14 code for SR-AL6528A-01-380 by lichang at 2022/09/26 end*/ \ No newline at end of file diff --git a/drivers/misc/mediatek/include/mt-plat/v1/prop_chgalgo_class.h b/drivers/misc/mediatek/include/mt-plat/v1/prop_chgalgo_class.h new file mode 100644 index 000000000000..677ce71fb36e --- /dev/null +++ b/drivers/misc/mediatek/include/mt-plat/v1/prop_chgalgo_class.h @@ -0,0 +1,369 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __LINUX_PROP_CHGALGO_CLASS_H +#define __LINUX_PROP_CHGALGO_CLASS_H + +#include +#include + +#define PCA_DBG_EN 1 +#define PCA_INFO_EN 1 +#define PCA_ERR_EN 1 + +#define PCA_DBG(fmt, ...) \ + do { \ + if (PCA_DBG_EN) \ + pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \ + } while (0) + +#define PCA_INFO(fmt, ...) \ + do { \ + if (PCA_INFO_EN) \ + pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \ + } while (0) + +#define PCA_ERR(fmt, ...) \ + do { \ + if (PCA_ERR_EN) \ + pr_info("[PCA]%s " fmt, __func__, ##__VA_ARGS__); \ + } while (0) + +#define SIMPLE_PCA_TA_DESC(_name, ops) \ +const struct prop_chgalgo_desc _name##_desc = { \ + .name = #_name, \ + .type = PCA_DEVTYPE_TA, \ + .ta_ops = &ops, \ + .chg_ops = NULL, \ + .algo_ops = NULL, \ +} + +#define SIMPLE_PCA_CHG_DESC(_name, ops) \ +const struct prop_chgalgo_desc _name##_desc = { \ + .name = #_name, \ + .type = PCA_DEVTYPE_CHARGER, \ + .ta_ops = NULL, \ + .chg_ops = &ops, \ + .algo_ops = NULL, \ +} + +#define SIMPLE_PCA_ALGO_DESC(_name, ops) \ +const struct prop_chgalgo_desc _name##_desc = { \ + .name = #_name, \ + .type = PCA_DEVTYPE_ALGO, \ + .ta_ops = NULL, \ + .chg_ops = NULL, \ + .algo_ops = &ops, \ +} + +struct prop_chgalgo_ta_status { + int temp1; + int temp2; + u8 temp_level; + u8 present_input; + u8 present_battery_input; + bool ocp; + bool otp; + bool ovp; +}; + +struct prop_chgalgo_ta_auth_data { + int vcap_min; + int vcap_max; + int icap_min; + int vta_min; + int vta_max; + int ita_max; + int ita_min; + bool pwr_lmt; + u8 pdp; + bool support_meas_cap; + bool support_status; + bool support_cc; + u32 vta_step; + u32 ita_step; + u32 ita_gap_per_vstep; +}; + +enum prop_chgalgo_notify_source { + PCA_NOTISRC_TCP, + PCA_NOTISRC_CHG, + PCA_NOTISRC_ALGO, + PCA_NOTISRC_MAX, +}; + +enum prop_chgalgo_notify_evt { + PCA_NOTIEVT_DETACH, + PCA_NOTIEVT_HARDRESET, + PCA_NOTIEVT_VBUSOVP, + PCA_NOTIEVT_IBUSOCP, + PCA_NOTIEVT_IBUSUCP_FALL, + PCA_NOTIEVT_VBATOVP, + PCA_NOTIEVT_IBATOCP, + PCA_NOTIEVT_VOUTOVP, + PCA_NOTIEVT_VDROVP, + PCA_NOTIEVT_VBATOVP_ALARM, + PCA_NOTIEVT_VBUSOVP_ALARM, + PCA_NOTIEVT_ALGO_STOP, + PCA_NOTIEVT_MAX, +}; + +struct prop_chgalgo_notify { + enum prop_chgalgo_notify_source src; + enum prop_chgalgo_notify_evt evt; +}; + +enum prop_chgalgo_adc_channel { + PCA_ADCCHAN_VBUS = 0, + PCA_ADCCHAN_IBUS, + PCA_ADCCHAN_VBAT, + PCA_ADCCHAN_IBAT, + PCA_ADCCHAN_TBAT, + PCA_ADCCHAN_TCHG, + PCA_ADCCHAN_VOUT, + PCA_ADCCHAN_VSYS, + PCA_ADCCHAN_MAX, +}; + +struct prop_chgalgo_device; + +struct prop_chgalgo_ta_ops { + int (*enable_charging)(struct prop_chgalgo_device *pca, bool en, u32 mV, + u32 mA); + int (*set_cap)(struct prop_chgalgo_device *pca, u32 mV, u32 mA); + int (*get_measure_cap)(struct prop_chgalgo_device *pca, u32 *mV, + u32 *mA); + int (*get_temperature)(struct prop_chgalgo_device *pca, int *degree); + int (*get_status)(struct prop_chgalgo_device *pca, + struct prop_chgalgo_ta_status *status); + int (*is_cc)(struct prop_chgalgo_device *pca, bool *cc); + int (*send_hardreset)(struct prop_chgalgo_device *pca); + int (*authenticate_ta)(struct prop_chgalgo_device *pca, + struct prop_chgalgo_ta_auth_data *data); + int (*enable_wdt)(struct prop_chgalgo_device *pca, bool en); + int (*set_wdt)(struct prop_chgalgo_device *pca, u32 ms); + int (*sync_vta)(struct prop_chgalgo_device *pca, u32 vta); +}; + +struct prop_chgalgo_chg_ops { + int (*enable_power_path)(struct prop_chgalgo_device *pca, bool en); + int (*enable_charging)(struct prop_chgalgo_device *pca, bool en); + int (*enable_chip)(struct prop_chgalgo_device *pca, bool en); + int (*enable_hz)(struct prop_chgalgo_device *pca, bool en); + int (*set_vbusovp)(struct prop_chgalgo_device *pca, u32 mV); + int (*set_ibusocp)(struct prop_chgalgo_device *pca, u32 mA); + int (*set_vbatovp)(struct prop_chgalgo_device *pca, u32 mV); + int (*set_ibatocp)(struct prop_chgalgo_device *pca, u32 mA); + int (*set_vbatovp_alarm)(struct prop_chgalgo_device *pca, u32 mV); + int (*reset_vbatovp_alarm)(struct prop_chgalgo_device *pca); + int (*set_vbusovp_alarm)(struct prop_chgalgo_device *pca, u32 mV); + int (*reset_vbusovp_alarm)(struct prop_chgalgo_device *pca); + int (*set_aicr)(struct prop_chgalgo_device *pca, u32 mA); + int (*set_ichg)(struct prop_chgalgo_device *pca, u32 mA); + int (*get_adc)(struct prop_chgalgo_device *pca, + enum prop_chgalgo_adc_channel chan, int *min, int *max); + int (*get_soc)(struct prop_chgalgo_device *pca, u32 *soc); + int (*is_vbuslowerr)(struct prop_chgalgo_device *pca, bool *err); + int (*is_charging_enabled)(struct prop_chgalgo_device *pca, bool *en); + int (*get_adc_accuracy)(struct prop_chgalgo_device *pca, + enum prop_chgalgo_adc_channel chan, int *min, + int *max); + int (*init_chip)(struct prop_chgalgo_device *pca); + int (*enable_auto_trans)(struct prop_chgalgo_device *pca, bool en); + int (*set_auto_trans)(struct prop_chgalgo_device *pca, u32 mV, bool en); + int (*dump_registers)(struct prop_chgalgo_device *pca); +}; + +struct prop_chgalgo_algo_ops { + int (*init_algo)(struct prop_chgalgo_device *pca); + bool (*is_algo_ready)(struct prop_chgalgo_device *pca); + int (*start_algo)(struct prop_chgalgo_device *pca); + bool (*is_algo_running)(struct prop_chgalgo_device *pca); + int (*plugout_reset)(struct prop_chgalgo_device *pca); + int (*stop_algo)(struct prop_chgalgo_device *pca, bool rerun); + int (*thermal_throttling)(struct prop_chgalgo_device *pca, int mA); + int (*set_jeita_vbat_cv)(struct prop_chgalgo_device *pca, int mV); + int (*notifier_call)(struct prop_chgalgo_device *pca, + struct prop_chgalgo_notify *notify); +}; + +enum prop_chgalgo_dev_type { + PCA_DEVTYPE_TA = 0, + PCA_DEVTYPE_CHARGER, + PCA_DEVTYPE_ALGO, + PCA_DEVTYPE_MAX, +}; + +struct prop_chgalgo_desc { + const char *name; + enum prop_chgalgo_dev_type type; + const struct prop_chgalgo_ta_ops *ta_ops; + const struct prop_chgalgo_chg_ops *chg_ops; + const struct prop_chgalgo_algo_ops *algo_ops; +}; + +struct prop_chgalgo_device { + struct device dev; + const struct prop_chgalgo_desc *desc; + struct srcu_notifier_head nh; + void *drv_data; + int (*suspend)(struct prop_chgalgo_device *pca); + int (*resume)(struct prop_chgalgo_device *pca); +}; + +extern struct prop_chgalgo_device * +prop_chgalgo_device_register(struct device *parent, + const struct prop_chgalgo_desc *desc, + void *drv_data); +extern void prop_chgalgo_device_unregister(struct prop_chgalgo_device *pca); +extern struct prop_chgalgo_device * +prop_chgalgo_dev_get_by_name(const char *name); +extern const char * +prop_chgalgo_notify_evt_tostring(enum prop_chgalgo_notify_evt evt); + +static inline int prop_chgalgo_get_devtype(struct prop_chgalgo_device *pca) +{ + return pca->desc->type; +} + +static inline void *prop_chgalgo_get_drvdata(struct prop_chgalgo_device *pca) +{ + return pca->drv_data; +} + +static inline int +prop_chgalgo_notifier_register(struct prop_chgalgo_device *pca, + struct notifier_block *nb) +{ + return srcu_notifier_chain_register(&pca->nh, nb); +} + +static inline int +prop_chgalgo_notifier_unregister(struct prop_chgalgo_device *pca, + struct notifier_block *nb) +{ + return srcu_notifier_chain_unregister(&pca->nh, nb); +} + +/* Richtek pca TA interface */ +extern int prop_chgalgo_enable_ta_charging(struct prop_chgalgo_device *pca, + bool en, u32 mV, u32 mA); +extern int prop_chgalgo_set_ta_cap(struct prop_chgalgo_device *pca, u32 mV, + u32 mA); +extern int prop_chgalgo_get_ta_measure_cap(struct prop_chgalgo_device *pca, + u32 *mV, u32 *mA); +extern int prop_chgalgo_get_ta_temperature(struct prop_chgalgo_device *pca, + int *degree); +extern int prop_chgalgo_get_ta_status(struct prop_chgalgo_device *pca, + struct prop_chgalgo_ta_status *status); +extern int prop_chgalgo_is_ta_cc(struct prop_chgalgo_device *pca, bool *cc); +extern int prop_chgalgo_send_ta_hardreset(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_authenticate_ta(struct prop_chgalgo_device *pca, + struct prop_chgalgo_ta_auth_data *data); +extern int prop_chgalgo_enable_ta_wdt(struct prop_chgalgo_device *pca, bool en); +extern int prop_chgalgo_set_ta_wdt(struct prop_chgalgo_device *pca, u32 ms); +extern int prop_chgalgo_sync_ta_volt(struct prop_chgalgo_device *pca, u32 vta); + +/* Richtek pca charger interface */ +extern int prop_chgalgo_enable_power_path(struct prop_chgalgo_device *pca, + bool en); +extern int prop_chgalgo_enable_charging(struct prop_chgalgo_device *pca, + bool en); +extern int prop_chgalgo_enable_chip(struct prop_chgalgo_device *pca, bool en); +extern int prop_chgalgo_enable_hz(struct prop_chgalgo_device *pca, bool en); +extern int prop_chgalgo_set_vbusovp(struct prop_chgalgo_device *pca, u32 mV); +extern int prop_chgalgo_set_ibusocp(struct prop_chgalgo_device *pca, u32 mA); +extern int prop_chgalgo_set_vbatovp(struct prop_chgalgo_device *pca, u32 mV); +extern int prop_chgalgo_set_ibatocp(struct prop_chgalgo_device *pca, u32 mA); +extern int prop_chgalgo_set_vbatovp_alarm(struct prop_chgalgo_device *pca, + u32 mV); +extern int prop_chgalgo_reset_vbatovp_alarm(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_set_vbusovp_alarm(struct prop_chgalgo_device *pca, + u32 mV); +extern int prop_chgalgo_reset_vbusovp_alarm(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_get_adc(struct prop_chgalgo_device *pca, + enum prop_chgalgo_adc_channel chan, int *min, + int *max); +extern int prop_chgalgo_get_soc(struct prop_chgalgo_device *pca, u32 *soc); +extern int prop_chgalgo_set_ichg(struct prop_chgalgo_device *pca, u32 mA); +extern int prop_chgalgo_set_aicr(struct prop_chgalgo_device *pca, u32 mA); +extern int prop_chgalgo_is_vbuslowerr(struct prop_chgalgo_device *pca, + bool *err); +extern int prop_chgalgo_is_charging_enabled(struct prop_chgalgo_device *pca, + bool *en); +extern int prop_chgalgo_get_adc_accuracy(struct prop_chgalgo_device *pca, + enum prop_chgalgo_adc_channel chan, + int *min, int *max); +extern int prop_chgalgo_init_chip(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_enable_auto_trans(struct prop_chgalgo_device *pca, + bool en); +extern int prop_chgalgo_set_auto_trans(struct prop_chgalgo_device *pca, u32 mV, bool en); +extern int prop_chgalgo_dump_registers(struct prop_chgalgo_device *pca); + +/* Richtek pca algorithm interface */ +#ifdef CONFIG_RT_PROP_CHGALGO +extern int prop_chgalgo_init_algo(struct prop_chgalgo_device *pca); +extern bool prop_chgalgo_is_algo_ready(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_start_algo(struct prop_chgalgo_device *pca); +extern bool prop_chgalgo_is_algo_running(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_plugout_reset(struct prop_chgalgo_device *pca); +extern int prop_chgalgo_stop_algo(struct prop_chgalgo_device *pca, bool rerun); +extern int prop_chgalgo_notifier_call(struct prop_chgalgo_device *pca, + struct prop_chgalgo_notify *notify); +extern int prop_chgalgo_thermal_throttling(struct prop_chgalgo_device *pca, + int mA); +extern int prop_chgalgo_set_jeita_vbat_cv(struct prop_chgalgo_device *pca, + int mV); +#else +static inline int prop_chgalgo_init_algo(struct prop_chgalgo_device *pca) +{ + return -ENOTSUPP; +} + +static inline bool prop_chgalgo_is_algo_ready(struct prop_chgalgo_device *pca) +{ + return false; +} + +static inline int prop_chgalgo_start_algo(struct prop_chgalgo_device *pca) +{ + return -ENOTSUPP; +} + +static inline bool prop_chgalgo_is_algo_running(struct prop_chgalgo_device *pca) +{ + return false; +} + +static inline int prop_chgalgo_plugout_reset(struct prop_chgalgo_device *pca) +{ + return -ENOTSUPP; +} + +static inline int prop_chgalgo_stop_algo(struct prop_chgalgo_device *pca, + bool rerun) +{ + return -ENOTSUPP; +} + +static inline int prop_chgalgo_notifier_call(struct prop_chgalgo_device *pca, + struct prop_chgalgo_notify *notify) +{ + return -ENOTSUPP; +} + +static inline int +prop_chgalgo_thermal_throttling(struct prop_chgalgo_device *pca, int mA) +{ + return -ENOTSUPP; +} + +static inline int +prop_chgalgo_set_jeita_vbat_cv(struct prop_chgalgo_device *pca, int mV) +{ + return -ENOTSUPP; +} +#endif /* CONFIG_RT_PROP_CHGALGO */ +#endif /* __LINUX_PROP_CHGALGO_CLASS_H */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_charger_init.h b/drivers/power/supply/mediatek/charger/mtk_charger_init.h new file mode 100644 index 000000000000..e4830b5584de --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_charger_init.h @@ -0,0 +1,151 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_CHARGER_INIT_H__ +#define __MTK_CHARGER_INIT_H__ + +/* hs14 code for SR-AL6528A-01-323|AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ +#define BATTERY_CV 4400000 +#define CV_HIGH_THRESHOLD 4500000 +#define V_CHARGER_MAX 6300000 /* 6.3 V */ +#define HV_CHARGER_MAX 10400000 /* 10.4 V */ +#define V_CHARGER_DROP 700000 /* 0.7 V */ +/* hs14 code for SR-AL6528A-01-323|AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ +#define V_CHARGER_MIN 4600000 /* 4.6 V */ +/* hs14 code for AL6528A-604 by gaozhengwei at 2022/11/07 start */ +#define HV_CHARGER_MIN 8000000 /* 8.0 V */ +/* hs14 code for AL6528A-604 by gaozhengwei at 2022/11/07 end */ + +#define USB_CHARGER_CURRENT_SUSPEND 0 /* def CONFIG_USB_IF */ +#define USB_CHARGER_CURRENT_UNCONFIGURED 70000 /* 70mA */ +#define USB_CHARGER_CURRENT_CONFIGURED 500000 /* 500mA */ +#define USB_CHARGER_CURRENT 500000 /* 500mA */ +/* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 start */ +#define AC_CHARGER_CURRENT 2000000 +#define AC_CHARGER_INPUT_CURRENT 1550000 +/* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 end */ +#define NON_STD_AC_CHARGER_CURRENT 500000 +#define CHARGING_HOST_CHARGER_CURRENT 650000 +#define APPLE_1_0A_CHARGER_CURRENT 650000 +#define APPLE_2_1A_CHARGER_CURRENT 800000 +#define TA_AC_CHARGING_CURRENT 3000000 +#define USB_UNLIMITED_CURRENT 2000000 +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/20 start */ +#define PD_CHARGER_CURRENT 2700000 +#define PD_INPUT_CURRENT 1650000 +#define PD_VOLTAGE_THR 8000 +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/20 end */ + +/* dynamic mivr */ +#define V_CHARGER_MIN_1 4400000 /* 4.4 V */ +#define V_CHARGER_MIN_2 4200000 /* 4.2 V */ +#define MAX_DMIVR_CHARGER_CURRENT 1400000 /* 1.4 A */ + +/* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 start */ +/* sw jeita */ +#define JEITA_TEMP_ABOVE_T4_CV 4200000 +#define JEITA_TEMP_T3_TO_T4_CV 4200000 +#define JEITA_TEMP_T2_TO_T3_CV 4400000 +#define JEITA_TEMP_T1_TO_T2_CV 4400000 +#define JEITA_TEMP_T0_TO_T1_CV 4400000 +#define JEITA_TEMP_BELOW_T0_CV 4400000 +#define JEITA_TEMP_ABOVE_T4_CUR 0 +#define JEITA_TEMP_T3_TO_T4_CUR 1750000 +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/23 start */ +#define JEITA_TEMP_T2_TO_T3_CUR 2700000 +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/23 end */ +#define JEITA_TEMP_T1_TO_T2_CUR 1500000 +#define JEITA_TEMP_T0_TO_T1_CUR 500000 +#define JEITA_TEMP_BELOW_T0_CUR 0 +#define TEMP_T4_THRES 50 +#define TEMP_T4_THRES_MINUS_X_DEGREE 48 +#define TEMP_T3_THRES 45 +#define TEMP_T3_THRES_MINUS_X_DEGREE 43 +#define TEMP_T2_THRES 12 +#define TEMP_T2_THRES_PLUS_X_DEGREE 14 +#define TEMP_T1_THRES 5 +#define TEMP_T1_THRES_PLUS_X_DEGREE 7 +#define TEMP_T0_THRES 0 +#define TEMP_T0_THRES_PLUS_X_DEGREE 2 +#define TEMP_NEG_10_THRES 0 +/* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 end */ + +/* Battery Temperature Protection */ +#define MIN_CHARGE_TEMP 0 +#define MIN_CHARGE_TEMP_PLUS_X_DEGREE 6 +#define MAX_CHARGE_TEMP 50 +#define MAX_CHARGE_TEMP_MINUS_X_DEGREE 47 + +/* pe */ +#define PE_ICHG_LEAVE_THRESHOLD 1000000 /* uA */ +#define TA_AC_12V_INPUT_CURRENT 3200000 +#define TA_AC_9V_INPUT_CURRENT 3200000 +#define TA_AC_7V_INPUT_CURRENT 3200000 +#define TA_9V_SUPPORT +#define TA_12V_SUPPORT + +/* pe2.0 */ +#define PE20_ICHG_LEAVE_THRESHOLD 1000000 /* uA */ +#define TA_START_BATTERY_SOC 0 +#define TA_STOP_BATTERY_SOC 85 + +/* dual charger */ +#define TA_AC_MASTER_CHARGING_CURRENT 1500000 +#define TA_AC_SLAVE_CHARGING_CURRENT 1500000 +#define SLAVE_MIVR_DIFF 100000 + +/* slave charger */ +#define CHG2_EFF 90 + +/* cable measurement impedance */ +#define CABLE_IMP_THRESHOLD 699 +#define VBAT_CABLE_IMP_THRESHOLD 3900000 /* uV */ + +/* bif */ +#define BIF_THRESHOLD1 4250000 /* UV */ +#define BIF_THRESHOLD2 4300000 /* UV */ +#define BIF_CV_UNDER_THRESHOLD2 4450000 /* UV */ +#define BIF_CV BATTERY_CV /* UV */ + +#define R_SENSE 56 /* mohm */ + +#define MAX_CHARGING_TIME (12 * 60 * 60) /* 12 hours */ + +#define DEFAULT_BC12_CHARGER 0 /* MAIN_CHARGER */ + +/* battery warning */ +#define BATTERY_NOTIFY_CASE_0001_VCHARGER +#define BATTERY_NOTIFY_CASE_0002_VBATTEMP + +/* pe4 */ +#define PE40_MAX_VBUS 11000 +#define PE40_MAX_IBUS 3000 +#define HIGH_TEMP_TO_LEAVE_PE40 46 +#define HIGH_TEMP_TO_ENTER_PE40 39 +#define LOW_TEMP_TO_LEAVE_PE40 10 +#define LOW_TEMP_TO_ENTER_PE40 16 + +/* pd */ +#define PD_VBUS_UPPER_BOUND 10000000 /* uv */ +#define PD_VBUS_LOW_BOUND 5000000 /* uv */ +#define PD_ICHG_LEAVE_THRESHOLD 1000000 /* uA */ +#define PD_STOP_BATTERY_SOC 80 + +#define VSYS_WATT 5000000 +#define IBUS_ERR 14 + +#define SC_BATTERY_SIZE 3000 +#define SC_CV_TIME 3600 +#define SC_CURRENT_LIMIT 2000 + +#endif /*__MTK_CHARGER_INIT_H__*/ + +/* hs14 code for SR-AL6528A-01-336 by shanxinkai at 2022/09/15 start */ +/*D85 setting */ +#ifdef HQ_D85_BUILD +#define D85_BATTERY_CV 4000000 +#define D85_JEITA_TEMP_CV 4000000 +#endif +/* hs14 code for SR-AL6528A-01-336 by shanxinkai at 2022/09/15 end */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_charger_intf.h b/drivers/power/supply/mediatek/charger/mtk_charger_intf.h new file mode 100644 index 000000000000..b47b459060f6 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_charger_intf.h @@ -0,0 +1,610 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ +#ifndef __MTK_CHARGER_INTF_H__ +#define __MTK_CHARGER_INTF_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +struct charger_manager; +struct charger_data; +#include "mtk_pe_intf.h" +#include "mtk_pe20_intf.h" +#include "mtk_pe40_intf.h" +#include "mtk_pe50_intf.h" +#include "mtk_pdc_intf.h" +#include "adapter_class.h" +#include "mtk_smartcharging.h" + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#ifdef CONFIG_AFC_CHARGER +#include "afc_charger_intf.h" +#endif +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + +#define CHARGING_INTERVAL 10 +#define CHARGING_FULL_INTERVAL 20 + +#define CHRLOG_ERROR_LEVEL 1 +#define CHRLOG_DEBUG_LEVEL 2 + +extern int chr_get_debug_level(void); + +#define chr_err(fmt, args...) \ +do { \ + if (chr_get_debug_level() >= CHRLOG_ERROR_LEVEL) { \ + pr_notice(fmt, ##args); \ + } \ +} while (0) + +#define chr_info(fmt, args...) \ +do { \ + if (chr_get_debug_level() >= CHRLOG_ERROR_LEVEL) { \ + pr_notice_ratelimited(fmt, ##args); \ + } \ +} while (0) + +#define chr_debug(fmt, args...) \ +do { \ + if (chr_get_debug_level() >= CHRLOG_DEBUG_LEVEL) { \ + pr_notice(fmt, ##args); \ + } \ +} while (0) + +#define CHR_CC (0x0001) +#define CHR_TOPOFF (0x0002) +#define CHR_TUNING (0x0003) +#define CHR_POSTCC (0x0004) +#define CHR_BATFULL (0x0005) +#define CHR_ERROR (0x0006) +#define CHR_PE40_INIT (0x0007) +#define CHR_PE40_CC (0x0008) +#define CHR_PE40_TUNING (0x0009) +#define CHR_PE40_POSTCC (0x000A) +#define CHR_PE30 (0x000B) +#define CHR_PE40 (0x000C) +#define CHR_PDC (0x000D) +#define CHR_PE50_READY (0x000E) +#define CHR_PE50_RUNNING (0x000F) +#define CHR_PE50 (0x0010) + +/* charging abnormal status */ +#define CHG_VBUS_OV_STATUS (1 << 0) +#define CHG_BAT_OT_STATUS (1 << 1) +#define CHG_OC_STATUS (1 << 2) +#define CHG_BAT_OV_STATUS (1 << 3) +#define CHG_ST_TMO_STATUS (1 << 4) +#define CHG_BAT_LT_STATUS (1 << 5) +#define CHG_TYPEC_WD_STATUS (1 << 6) + +/* charger_algorithm notify charger_dev */ +enum { + EVENT_EOC, + EVENT_RECHARGE, +}; + +/* charger_dev notify charger_manager */ +enum { + CHARGER_DEV_NOTIFY_VBUS_OVP, + CHARGER_DEV_NOTIFY_BAT_OVP, + CHARGER_DEV_NOTIFY_EOC, + CHARGER_DEV_NOTIFY_RECHG, + CHARGER_DEV_NOTIFY_SAFETY_TIMEOUT, + CHARGER_DEV_NOTIFY_VBATOVP_ALARM, + CHARGER_DEV_NOTIFY_VBUSOVP_ALARM, + CHARGER_DEV_NOTIFY_IBATOCP, + CHARGER_DEV_NOTIFY_IBUSOCP, + CHARGER_DEV_NOTIFY_IBUSUCP_FALL, + CHARGER_DEV_NOTIFY_VOUTOVP, + CHARGER_DEV_NOTIFY_VDROVP, +}; + +/* + * Software JEITA + * T0: -10 degree Celsius + * T1: 0 degree Celsius + * T2: 10 degree Celsius + * T3: 45 degree Celsius + * T4: 50 degree Celsius + */ +enum sw_jeita_state_enum { + TEMP_BELOW_T0 = 0, + TEMP_T0_TO_T1, + TEMP_T1_TO_T2, + TEMP_T2_TO_T3, + TEMP_T3_TO_T4, + TEMP_ABOVE_T4 +}; + +struct sw_jeita_data { + int sm; + int pre_sm; + int cv; + bool charging; + bool error_recovery_flag; +}; + +/* battery thermal protection */ +enum bat_temp_state_enum { + BAT_TEMP_LOW = 0, + BAT_TEMP_NORMAL, + BAT_TEMP_HIGH +}; + +struct battery_thermal_protection_data { + int sm; + bool enable_min_charge_temp; + int min_charge_temp; + int min_charge_temp_plus_x_degree; + int max_charge_temp; + int max_charge_temp_minus_x_degree; +}; + +/* hs14 code for SR-AL6528A-01-338 by chengyuanhang at 2022/10/03 start */ +#ifndef HQ_FACTORY_BUILD +#define is_between(left, right, value) \ + (((left) >= (right) && (left) >= (value) \ + && (value) >= (right)) \ + || ((left) <= (right) && (left) <= (value) \ + && (value) <= (right))) + +struct range_data { + u32 low_threshold; + u32 high_threshold; + u32 value; +}; +#define MAX_CV_ENTRIES 8 + +#define MAX_CYCLE_COUNT 0xFFFF +#endif +/* hs14 code for SR-AL6528A-01-338 by chengyuanhang at 2022/10/03 end */ + +struct charger_custom_data { + int battery_cv; /* uv */ + int max_charger_voltage; + int max_charger_voltage_setting; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + int hv_max_charger_voltage; + int hv_max_charger_voltage_setting; + int charger_voltage_drop; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + int min_charger_voltage; + + int usb_charger_current_suspend; + int usb_charger_current_unconfigured; + int usb_charger_current_configured; + int usb_charger_current; + int ac_charger_current; + int ac_charger_input_current; + int non_std_ac_charger_current; + int charging_host_charger_current; + int apple_1_0a_charger_current; + int apple_2_1a_charger_current; + int usb_unlimited_current; + int ta_ac_charger_current; + int pd_charger_current; + /* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 start */ + int pd_input_current; + int pd_voltage_thr; + /* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 end */ + + /* dynamic mivr */ + int min_charger_voltage_1; + int min_charger_voltage_2; + int max_dmivr_charger_current; + + /* sw jeita */ + int jeita_temp_above_t4_cv; + int jeita_temp_t3_to_t4_cv; + int jeita_temp_t2_to_t3_cv; + int jeita_temp_t1_to_t2_cv; + int jeita_temp_t0_to_t1_cv; + int jeita_temp_below_t0_cv; + /* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 start */ + int jeita_temp_above_t4_cur; + int jeita_temp_t3_to_t4_cur; + int jeita_temp_t2_to_t3_cur; + int jeita_temp_t1_to_t2_cur; + int jeita_temp_t0_to_t1_cur; + int jeita_temp_below_t0_cur; + /* hs14 code for SR-AL6528A-01-323 by gaozhengwei at 2022/09/22 end */ + int temp_t4_thres; + int temp_t4_thres_minus_x_degree; + int temp_t3_thres; + int temp_t3_thres_minus_x_degree; + int temp_t2_thres; + int temp_t2_thres_plus_x_degree; + int temp_t1_thres; + int temp_t1_thres_plus_x_degree; + int temp_t0_thres; + int temp_t0_thres_plus_x_degree; + int temp_neg_10_thres; + + /* battery temperature protection */ + int mtk_temperature_recharge_support; + int max_charge_temp; + int max_charge_temp_minus_x_degree; + int min_charge_temp; + int min_charge_temp_plus_x_degree; + + /* pe */ + int pe_ichg_level_threshold; /* ma */ + int ta_ac_12v_input_current; + int ta_ac_9v_input_current; + int ta_ac_7v_input_current; + bool ta_12v_support; + bool ta_9v_support; + + /* pe2.0 */ + int pe20_ichg_level_threshold; /* ma */ + int ta_start_battery_soc; + int ta_stop_battery_soc; + + /* pe4.0 */ + int pe40_single_charger_input_current; /* ma */ + int pe40_single_charger_current; + int pe40_dual_charger_input_current; + int pe40_dual_charger_chg1_current; + int pe40_dual_charger_chg2_current; + int pe40_stop_battery_soc; + int pe40_max_vbus; + int pe40_max_ibus; + int high_temp_to_leave_pe40; + int high_temp_to_enter_pe40; + int low_temp_to_leave_pe40; + int low_temp_to_enter_pe40; + + /* pe4.0 cable impedance threshold (mohm) */ + u32 pe40_r_cable_1a_lower; + u32 pe40_r_cable_2a_lower; + u32 pe40_r_cable_3a_lower; + + /* dual charger */ + u32 chg1_ta_ac_charger_current; + u32 chg2_ta_ac_charger_current; + int slave_mivr_diff; + u32 dual_polling_ieoc; + + /* slave charger */ + int chg2_eff; + bool parallel_vbus; + + /* cable measurement impedance */ + int cable_imp_threshold; + int vbat_cable_imp_threshold; + + /* bif */ + int bif_threshold1; /* uv */ + int bif_threshold2; /* uv */ + int bif_cv_under_threshold2; /* uv */ + + /* power path */ + bool power_path_support; + + int max_charging_time; /* second */ + + int bc12_charger; + + /* pd */ + int pd_vbus_upper_bound; + int pd_vbus_low_bound; + int pd_ichg_level_threshold; + int pd_stop_battery_soc; + + int vsys_watt; + int ibus_err; + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#ifdef CONFIG_AFC_CHARGER + /* afc */ + int afc_start_battery_soc; + int afc_stop_battery_soc; + int afc_pre_input_current; + int afc_charger_input_current; + int afc_charger_current; + int afc_ichg_level_threshold; + int afc_min_charger_voltage; + int afc_max_charger_voltage; +#endif +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ +/* hs14 code for SR-AL6528A-01-338 by chengyuanhang at 2022/10/03 start */ +#ifndef HQ_FACTORY_BUILD + bool ss_batt_aging_enable; + int ss_batt_cycle; + struct range_data batt_cv_data[MAX_CV_ENTRIES]; + int setting_cv; /* uv */ +#endif +/* hs14 code for SR-AL6528A-01-338 by chengyuanhang at 2022/10/03 end */ +}; + +struct charger_data { + int force_charging_current; + int thermal_input_current_limit; + int thermal_charging_current_limit; + int input_current_limit; + int charging_current_limit; + int disable_charging_count; + int input_current_limit_by_aicl; + int junction_temp_min; + int junction_temp_max; +}; + +struct charger_manager { + bool init_done; + const char *algorithm_name; + struct platform_device *pdev; + void *algorithm_data; + int usb_state; + bool usb_unlimited; + bool disable_charger; + + struct charger_device *chg1_dev; + struct notifier_block chg1_nb; + struct charger_data chg1_data; + struct charger_consumer *chg1_consumer; + + struct charger_device *chg2_dev; + struct notifier_block chg2_nb; + struct charger_data chg2_data; + + struct charger_device *dvchg1_dev; + struct notifier_block dvchg1_nb; + struct charger_data dvchg1_data; + + struct charger_device *dvchg2_dev; + struct notifier_block dvchg2_nb; + struct charger_data dvchg2_data; + + struct adapter_device *pd_adapter; + + + enum charger_type chr_type; + bool can_charging; + int cable_out_cnt; + + int (*do_algorithm)(struct charger_manager *cm); + int (*plug_in)(struct charger_manager *cm); + int (*plug_out)(struct charger_manager *cm); + int (*do_charging)(struct charger_manager *cm, bool en); + int (*do_event)(struct notifier_block *nb, unsigned long ev, void *v); + int (*change_current_setting)(struct charger_manager *cm); + + /* notify charger user */ + struct srcu_notifier_head evt_nh; + /* receive from battery */ + struct notifier_block psy_nb; + + /* common info */ + int battery_temp; + + /* sw jeita */ + bool enable_sw_jeita; + struct sw_jeita_data sw_jeita; + + /* dynamic_cv */ + bool enable_dynamic_cv; + + bool cmd_discharging; + bool safety_timeout; + bool vbusov_stat; + + /* battery warning */ + unsigned int notify_code; + unsigned int notify_test_mode; + + /* battery thermal protection */ + struct battery_thermal_protection_data thermal; + + /* dtsi custom data */ + struct charger_custom_data data; + + bool enable_sw_safety_timer; + bool sw_safety_timer_setting; + + /* High voltage charging */ + bool enable_hv_charging; + + /* pe */ + bool enable_pe_plus; + struct mtk_pe pe; + + /* pe 2.0 */ + bool enable_pe_2; + struct mtk_pe20 pe2; + + /* pe 4.0 */ + bool enable_pe_4; + bool leave_pe4; + struct mtk_pe40 pe4; + + /* pe 5.0 */ + bool enable_pe_5; + bool leave_pe5; + struct mtk_pe50 pe5; + + /* type-C*/ + bool enable_type_c; + + /* water detection */ + bool water_detected; + + /* pd */ + bool leave_pdc; + struct mtk_pdc pdc; + bool disable_pd_dual; + bool is_pdc_run; + + int pd_type; + bool pd_reset; + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#ifdef CONFIG_AFC_CHARGER + /* afc */ + struct afc_dev afc; + bool enable_afc; + int hv_disable; + int afc_sts; +/* hs14 code for AL6528ADEU-2119 by qiaodan at 2022/11/18 start */ +#ifndef HQ_FACTORY_BUILD //ss version + bool boot_with_dcp; +#endif +/* hs14 code for AL6528ADEU-2119 by qiaodan at 2022/11/18 end */ +#endif +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + + /* thread related */ + struct hrtimer charger_kthread_timer; + + /* alarm timer */ + struct alarm charger_timer; + struct timespec endtime; + bool is_suspend; + + struct wakeup_source *charger_wakelock; + struct mutex charger_lock; + struct mutex charger_pd_lock; + struct mutex cable_out_lock; + spinlock_t slock; + unsigned int polling_interval; + bool charger_thread_timeout; + wait_queue_head_t wait_que; + bool charger_thread_polling; + + /* kpoc */ + atomic_t enable_kpoc_shdn; + + /* ATM */ + bool atm_enabled; + + /* dynamic mivr */ + bool enable_dynamic_mivr; + + struct smartcharging sc; + + + /*daemon related*/ + struct sock *daemo_nl_sk; + u_int g_scd_pid; + struct scd_cmd_param_t_1 sc_data; + + bool force_disable_pp[TOTAL_CHARGER]; + bool enable_pp[TOTAL_CHARGER]; + struct mutex pp_lock[TOTAL_CHARGER]; +#ifndef HQ_FACTORY_BUILD +/* hs14 code for SR-AL6528A-01-324 by chengyuanhang at 2022/10/10 start */ + u64 charging_dur_time; + u64 charging_count_start; + bool batt_protect_flag; + bool en_batt_protect; + struct delayed_work charging_count_work; +/* hs14 code for SR-AL6528A-01-324 by chengyuanhang at 2022/10/10 end */ +/* hs14 code for SR-AL6528A-01-261 | SR-AL6528A-01-343 by chengyuanhang at 2022/10/11 start */ + int cust_batt_cap; + int batt_full_flag; + int batt_status; + int capacity; +/* hs14 code for SR-AL6528A-01-261 | SR-AL6528A-01-343 by chengyuanhang at 2022/10/11 end */ +#endif + + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + bool swovp_disable; + int g_ovp_trigger; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ +/* hs14 code for SR-AL6528A-01-244 by shanxinkai at 2022/11/04 start */ + bool input_suspend_flag; + bool hiz_flag; +#ifdef HQ_FACTORY_BUILD //factory version + bool batt_cap_control; +#endif +#ifndef HQ_FACTORY_BUILD //ss version + int store_mode; + bool batt_store_mode; + struct wakeup_source *charger_wakelock_app; + struct delayed_work retail_app_status_change_work; +#endif +/* hs14 code for SR-AL6528A-01-244 by shanxinkai at 2022/11/04 end */ +}; + +/* charger related module interface */ +extern int charger_manager_notifier(struct charger_manager *info, int event); +extern int mtk_switch_charging_init(struct charger_manager *info); +extern int mtk_switch_charging_init2(struct charger_manager *info); +extern int mtk_dual_switch_charging_init(struct charger_manager *info); +extern int mtk_linear_charging_init(struct charger_manager *info); +extern void _wake_up_charger(struct charger_manager *info); +extern int mtk_get_dynamic_cv(struct charger_manager *info, unsigned int *cv); +extern bool is_dual_charger_supported(struct charger_manager *info); +extern int charger_enable_vbus_ovp(struct charger_manager *pinfo, bool enable); +extern bool is_typec_adapter(struct charger_manager *info); + +/* pmic API */ +extern unsigned int upmu_get_rgs_chrdet(void); +extern int pmic_get_vbus(void); +extern int pmic_get_charging_current(void); +extern int pmic_get_battery_voltage(void); +extern int pmic_get_bif_battery_voltage(int *vbat); +extern int pmic_is_bif_exist(void); +extern int pmic_enable_hw_vbus_ovp(bool enable); +extern bool pmic_is_battery_exist(void); +/* hs14 code for SR-AL6528A-01-261 | SR-AL6528A-01-343 by chengyuanhang at 2022/10/11 start */ +#ifndef HQ_FACTORY_BUILD +extern void ss_batt_full_flag_get(int *val); +#endif +/* hs14 code for SR-AL6528A-01-261 | SR-AL6528A-01-343 by chengyuanhang at 2022/10/11 end */ +/* hs14 code for P221216-05713 by shanxinkai at 2022/12/19 start */ +extern void ss_charger_check_status(struct charger_manager *info); +/* hs14 code for P221216-05713 by shanxinkai at 2022/12/19 end */ +extern void notify_adapter_event(enum adapter_type type, enum adapter_event evt, + void *val); + + +/* FIXME */ +enum usb_state_enum { + USB_SUSPEND = 0, + USB_UNCONFIGURED, + USB_CONFIGURED +}; + +#if defined(CONFIG_MACH_MT6877) || defined(CONFIG_MACH_MT6893) \ + || defined(CONFIG_MACH_MT6885) || defined(CONFIG_MACH_MT6785) +bool is_usb_rdy(struct device *dev); +#else +bool __attribute__((weak)) is_usb_rdy(void) +{ + pr_info("%s is not defined\n", __func__); + return false; +} +#endif + +/* procfs */ +#define PROC_FOPS_RW(name) \ +static int mtk_chg_##name##_open(struct inode *node, struct file *file) \ +{ \ + return single_open(file, mtk_chg_##name##_show, PDE_DATA(node));\ +} \ +static const struct file_operations mtk_chg_##name##_fops = { \ + .owner = THIS_MODULE, \ + .open = mtk_chg_##name##_open, \ + .read = seq_read, \ + .llseek = seq_lseek, \ + .release = single_release, \ + .write = mtk_chg_##name##_write, \ +} + +#endif /* __MTK_CHARGER_INTF_H__ */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_pdc_intf.h b/drivers/power/supply/mediatek/charger/mtk_pdc_intf.h new file mode 100644 index 000000000000..a277962257e7 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_pdc_intf.h @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_PD_INTF_H +#define __MTK_PD_INTF_H + +#include "adapter_class.h" + +/* PD charging */ +struct mtk_pdc { + struct tcpc_device *tcpc; + struct adapter_power_cap cap; + int pdc_max_watt; + int pdc_max_watt_setting; + + bool check_impedance; + int pd_cap_max_watt; + int pd_idx; + int pd_reset_idx; + int pd_boost_idx; + int pd_buck_idx; + int vbus_l; + int vbus_h; + + struct mutex access_lock; + struct mutex pmic_sync_lock; + struct wakeup_source suspend_lock; + int ta_vchr_org; + bool to_check_chr_type; + bool to_tune_ta_vchr; + bool is_cable_out_occur; + bool is_connect; + bool is_enabled; +}; + +extern bool mtk_pdc_check_charger(struct charger_manager *info); +extern void mtk_pdc_plugout_reset(struct charger_manager *info); +extern void mtk_pdc_set_max_watt(struct charger_manager *info, int watt); +extern int mtk_pdc_get_max_watt(struct charger_manager *info); +extern int mtk_pdc_get_setting(struct charger_manager *info, int *vbus, + int *cur, int *idx); +extern void mtk_pdc_init_table(struct charger_manager *info); +extern bool mtk_pdc_init(struct charger_manager *info); +extern int mtk_pdc_setup(struct charger_manager *info, int idx); +extern void mtk_pdc_plugout(struct charger_manager *info); +extern void mtk_pdc_check_cable_impedance(struct charger_manager *info); +extern void mtk_pdc_reset(struct charger_manager *info); +extern bool mtk_pdc_check_leave(struct charger_manager *info); + +#ifdef CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT + + + +#else /* NOT CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT */ + + +#endif /* CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT */ + + +#endif /* __MTK_PD_INTF_H */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_pe20_intf.h b/drivers/power/supply/mediatek/charger/mtk_pe20_intf.h new file mode 100644 index 000000000000..31a7b2ba0fdb --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_pe20_intf.h @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_PE20_INTF_H__ +#define __MTK_PE20_INTF_H__ + +/* pe 2.0*/ +struct pe20_profile { + unsigned int vbat; + unsigned int vchr; +}; + +struct mtk_pe20 { + struct mutex access_lock; + struct mutex pmic_sync_lock; + struct wakeup_source *suspend_lock; + int ta_vchr_org; + int idx; + int vbus; + bool to_check_chr_type; + bool is_cable_out_occur; /* Plug out happened while detect PE+20 */ + bool is_connect; + bool is_enabled; + struct pe20_profile profile[10]; + + int vbat_orig; /* Measured VBAT before cable impedance measurement */ + int aicr_cable_imp; /* AICR to set after cable impedance measurement */ +}; + +#ifdef CONFIG_MTK_PUMP_EXPRESS_PLUS_20_SUPPORT + +extern int mtk_pe20_init(struct charger_manager *pinfo); +extern int mtk_pe20_reset_ta_vchr(struct charger_manager *pinfo); +extern int mtk_pe20_check_charger(struct charger_manager *pinfo); +extern int mtk_pe20_start_algorithm(struct charger_manager *pinfo); +extern int mtk_pe20_set_charging_current(struct charger_manager *pinfo, + unsigned int *ichg, + unsigned int *aicr); + +extern void mtk_pe20_set_to_check_chr_type(struct charger_manager *pinfo, + bool check); +extern void mtk_pe20_set_is_enable(struct charger_manager *pinfo, bool enable); +extern void mtk_pe20_set_is_cable_out_occur(struct charger_manager *pinfo, + bool out); + +extern bool mtk_pe20_get_to_check_chr_type(struct charger_manager *pinfo); +extern bool mtk_pe20_get_is_connect(struct charger_manager *pinfo); +extern bool mtk_pe20_get_is_enable(struct charger_manager *pinfo); + +#else /* NOT CONFIG_MTK_PUMP_EXPRESS_PLUS_20_SUPPORT */ + +static inline int mtk_pe20_init(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe20_reset_ta_vchr(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe20_check_charger(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe20_start_algorithm(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe20_set_charging_current(struct charger_manager *pinfo, + unsigned int *ichg, + unsigned int *aicr) +{ + return -ENOTSUPP; +} + +static inline void mtk_pe20_set_to_check_chr_type(struct charger_manager *pinfo, + bool check) +{ +} + +static inline void mtk_pe20_set_is_enable(struct charger_manager *pinfo, + bool enable) +{ +} + +static inline +void mtk_pe20_set_is_cable_out_occur(struct charger_manager *pinfo, bool out) +{ +} + +static inline bool mtk_pe20_get_to_check_chr_type(struct charger_manager *pinfo) +{ + return false; +} + +static inline bool mtk_pe20_get_is_connect(struct charger_manager *pinfo) +{ + return false; +} + +static inline bool mtk_pe20_get_is_enable(struct charger_manager *pinfo) +{ + return false; +} + +#endif /* CONFIG_MTK_PUMP_EXPRESS_PLUS_20_SUPPORT */ + +#endif /* __MTK_PE20_INTF_H__ */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_pe40_intf.h b/drivers/power/supply/mediatek/charger/mtk_pe40_intf.h new file mode 100644 index 000000000000..35ad8c5ec660 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_pe40_intf.h @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_PE_40_INTF_H +#define __MTK_PE_40_INTF_H + +#define CONFIG_MTK_PUMP_EXPRESS_PLUS_40_SUPPORT +#include "adapter_class.h" + +struct pe4_pps_status { + int output_mv; /* 0xffff means no support */ + int output_ma; /* 0xff means no support */ + uint8_t real_time_flags; +}; + + +struct mtk_pe40 { + bool is_connect; + bool is_enabled; + bool can_query; + struct adapter_power_cap cap; + + int avbus; + int vbus; + int ibus; + int watt; + + int r_sw; + int r_cable; + int r_cable_1; + int r_cable_2; + + int pmic_vbus; + int TA_vbus; + int vbus_cali; + + int max_charger_ibus; + int max_vbus; + int max_ibus; + + int pe4_input_current_limit; + int pe4_input_current_limit_setting; + int input_current_limit; + +}; + +#ifdef CONFIG_MTK_PUMP_EXPRESS_PLUS_40_SUPPORT +extern bool mtk_pe40_init(struct charger_manager *pinfo); +extern bool mtk_is_TA_support_pd_pps(struct charger_manager *info); +extern bool mtk_pe40_is_ready(struct charger_manager *pinfo); +extern bool mtk_pe40_get_is_connect(struct charger_manager *pinfo); +extern void mtk_pe40_set_is_enable(struct charger_manager *pinfo, bool enable); +extern bool mtk_pe40_get_is_enable(struct charger_manager *pinfo); +extern int mtk_pe40_init_state(struct charger_manager *pinfo); +extern int mtk_pe40_tune1_state(struct charger_manager *pinfo); +extern int mtk_pe40_tune2_state(struct charger_manager *pinfo); +extern int mtk_pe40_cc_state(struct charger_manager *pinfo); +extern void mtk_pe40_plugout_reset(struct charger_manager *pinfo); +extern void mtk_pe40_end(struct charger_manager *pinfo, int type, bool retry); +#else + +#endif + +#endif /* __MTK_PE_40_INTF_H */ diff --git a/drivers/power/supply/mediatek/charger/mtk_pe50_intf.h b/drivers/power/supply/mediatek/charger/mtk_pe50_intf.h new file mode 100644 index 000000000000..35e460e025ca --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_pe50_intf.h @@ -0,0 +1,110 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_PE_50_INTF_H +#define __MTK_PE_50_INTF_H + +#include + +struct mtk_pe50 { + struct prop_chgalgo_device *pca_algo; + struct notifier_block nb; + bool online; + bool is_enabled; +}; + +enum mtk_pe50_notify_src { + MTK_PE50_NOTISRC_TCP, + MTK_PE50_NOTISRC_CHG, + MTK_PE50_NOTISRC_MAX, +}; + +#ifdef CONFIG_MTK_PUMP_EXPRESS_50_SUPPORT +extern int mtk_pe50_init(struct charger_manager *chgmgr); +extern bool mtk_pe50_is_ready(struct charger_manager *chgmgr); +extern int mtk_pe50_start(struct charger_manager *chgmgr); +extern bool mtk_pe50_is_running(struct charger_manager *chgmgr); +extern int mtk_pe50_plugout_reset(struct charger_manager *chgmgr); +extern bool mtk_pe50_get_is_connect(struct charger_manager *chgmgr); +extern bool mtk_pe50_get_is_enable(struct charger_manager *chgmgr); +extern void mtk_pe50_set_is_enable(struct charger_manager *chgmgr, bool enable); +extern int mtk_pe50_notifier_call(struct charger_manager *chgmgr, + enum mtk_pe50_notify_src src, + unsigned long event, void *data); +extern int mtk_pe50_deinit(struct charger_manager *chgmgr); +extern int mtk_pe50_thermal_throttling(struct charger_manager *chgmgr, int uA); +extern int mtk_pe50_set_jeita_vbat_cv(struct charger_manager *chgmgr, int uV); +extern int mtk_pe50_stop_algo(struct charger_manager *chgmgr, bool rerun); +#else +static inline int mtk_pe50_init(struct charger_manager *chgmgr) +{ + return -ENOTSUPP; +} + +static inline bool mtk_pe50_is_ready(struct charger_manager *chgmgr) +{ + return false; +} + +static inline int mtk_pe50_start(struct charger_manager *chgmgr) +{ + return -ENOTSUPP; +} + +static inline bool mtk_pe50_is_running(struct charger_manager *chgmgr) +{ + return false; +} + +static inline int mtk_pe50_plugout_reset(struct charger_manager *chgmgr) +{ + return -ENOTSUPP; +} + +static inline bool mtk_pe50_get_is_connect(struct charger_manager *chgmgr) +{ + return false; +} + +static inline bool mtk_pe50_get_is_enable(struct charger_manager *chgmgr) +{ + return false; +} + +static inline void mtk_pe50_set_is_enable(struct charger_manager *chgmgr, + bool enable) +{ +} + +static inline int mtk_pe50_notifier_call(struct charger_manager *chgmgr, + enum mtk_pe50_notify_src src, + unsigned long event, void *data) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe50_deinit(struct charger_manager *chgmgr) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe50_thermal_throttling(struct charger_manager *chgmgr, + int uA) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe50_set_jeita_vbat_cv(struct charger_manager *chgmgr, + int uV) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe50_stop_algo(struct charger_manager *chgmgr, bool rerun) +{ + return -ENOTSUPP; +} +#endif /* CONFIG_MTK_PUMP_EXPRESS_50_SUPPORT */ +#endif /* __MTK_PE_50_INTF_H */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_pe_intf.h b/drivers/power/supply/mediatek/charger/mtk_pe_intf.h new file mode 100644 index 000000000000..520c45f693b7 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_pe_intf.h @@ -0,0 +1,99 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_PE_INTF_H +#define __MTK_PE_INTF_H + + +struct mtk_pe { + struct mutex access_lock; + struct mutex pmic_sync_lock; + struct wakeup_source *suspend_lock; + int ta_vchr_org; /* uA */ + bool to_check_chr_type; + bool to_tune_ta_vchr; + bool is_cable_out_occur; /* Plug out happened while detecting PE+ */ + bool is_connect; + bool is_enabled; +}; + +#ifdef CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT + +extern int mtk_pe_init(struct charger_manager *pinfo); +extern int mtk_pe_reset_ta_vchr(struct charger_manager *pinfo); +extern int mtk_pe_check_charger(struct charger_manager *pinfo); +extern int mtk_pe_start_algorithm(struct charger_manager *pinfo); +extern int mtk_pe_set_charging_current(struct charger_manager *pinfo, + unsigned int *ichg, unsigned int *aicr); + +extern void mtk_pe_set_to_check_chr_type(struct charger_manager *pinfo, + bool check); +extern void mtk_pe_set_is_enable(struct charger_manager *pinfo, bool enable); +extern void mtk_pe_set_is_cable_out_occur(struct charger_manager *pinfo, + bool out); + +extern bool mtk_pe_get_to_check_chr_type(struct charger_manager *pinfo); +extern bool mtk_pe_get_is_connect(struct charger_manager *pinfo); +extern bool mtk_pe_get_is_enable(struct charger_manager *pinfo); + +#else /* NOT CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT */ + +static inline int mtk_pe_init(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} +static inline int mtk_pe_reset_ta_vchr(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} +static inline int mtk_pe_check_charger(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} +static inline int mtk_pe_start_algorithm(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe_plugout_reset(struct charger_manager *pinfo) +{ + return -ENOTSUPP; +} + +static inline int mtk_pe_set_charging_current(struct charger_manager *pinfo, + unsigned int *ichg, unsigned int *aicr) +{ + return -ENOTSUPP; +} + +static inline void mtk_pe_set_to_check_chr_type(struct charger_manager *pinfo, + bool check) +{ +} +static inline void mtk_pe_set_is_cable_out_occur(struct charger_manager *pinfo, + bool out) +{ +} +static inline void mtk_pe_set_is_enable(struct charger_manager *pinfo, + bool enable) +{ +} + +static inline bool mtk_pe_get_to_check_chr_type(struct charger_manager *pinfo) +{ + return false; +} +static inline bool mtk_pe_get_is_connect(struct charger_manager *pinfo) +{ + return false; +} +static inline bool mtk_pe_get_is_enable(struct charger_manager *pinfo) +{ + return false; +} +#endif /* CONFIG_MTK_PUMP_EXPRESS_PLUS_SUPPORT */ + + +#endif /* __MTK_PE_INTF_H */ \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/mtk_smartcharging.h b/drivers/power/supply/mediatek/charger/mtk_smartcharging.h new file mode 100644 index 000000000000..a64edb61a183 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/mtk_smartcharging.h @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. + */ +#ifndef _MTK_SMARTCHARGING_H +#define _MTK_SMARTCHARGING_H + +#include /* netlink */ +#include /* netlink */ +#include /* netlink */ +#include /* netlink */ + +#define NETLINK_CHG 28 + +#define SCD_NL_MSG_T_HDR_LEN 28 +#define MAX_NL_MSG_LEN_SND 4096 +#define MAX_NL_MSG_LEN_RCV 9200 +#define SCD_NL_MSG_MAX_LEN 9200 + +#define SCD_NL_MAGIC 19800212 + +enum sc_daemon_cmds { + SC_DAEMON_CMD_PRINT_LOG, + SC_DAEMON_CMD_SET_DAEMON_PID, + SC_DAEMON_CMD_NOTIFY_DAEMON, + SC_DAEMON_CMD_SETTING, + + SC_DAEMON_CMD_FROM_USER_NUMBER +}; + + +enum sc_kernel_events { + SC_EVENT_PLUG_IN, + SC_EVENT_PLUG_OUT, + SC_EVENT_CHARGING, + SC_EVENT_STOP_CHARGING, +}; + +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ +enum sc_adapter_type { + SC_ADAPTER_NORMAL, + SC_ADAPTER_HV, +}; +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + +struct sc_nl_msg_t { + unsigned int sc_cmd; + unsigned int sc_subcmd; + unsigned int sc_subcmd_para1; + unsigned int sc_subcmd_para2; + unsigned int sc_data_len; + unsigned int sc_ret_data_len; + unsigned int identity; + char sc_data[SCD_NL_MSG_MAX_LEN]; +}; + +struct scd_cmd_param_t_1 { + int size; + int data[50]; +}; + +enum sc_info { + SC_VBAT, + SC_BAT_TMP, + SC_UISOC, + SC_SOC, + SC_ENABLE, + SC_BAT_SIZE, + SC_START_TIME, + SC_END_TIME, + SC_IBAT_LIMIT, + SC_TARGET_PERCENTAGE, + SC_LEFT_TIME_FOR_CV, + SC_IBAT_SETTING, + SC_IBAT, + SC_IBAT_ALG, + SC_IBUS, + SC_DBGLV, + SC_SOLUTION, + + SC_INFO_MAX +}; + +enum sc_current_direction { + SC_IGNORE, + SC_KEEP, + SC_DISABLE, + SC_REDUCE, +}; + +struct smartcharging { + /*daemon related*/ + struct sock *daemo_nl_sk; + u_int g_scd_pid; + struct scd_cmd_param_t_1 data; + bool enable; + int battery_size; + int current_limit; + int target_percentage; + int left_time_for_cv; + int start_time; + int end_time; + + bool disable_charger; + enum sc_current_direction solution; + int sc_ibat; + int pre_ibat; + int bh; + + bool disable_in_this_plug; +}; + +extern int wakeup_sc_algo_cmd(struct scd_cmd_param_t_1 *data, int subcmd, int para1); +extern void sc_update(struct charger_manager *pinfo); +extern void sc_select_charging_current(struct charger_manager *info, struct charger_data *pdata); + +#endif /* End of _MTK_SMARTCHARGING_H */ diff --git a/drivers/power/supply/mediatek/charger/sgm41513.h b/drivers/power/supply/mediatek/charger/sgm41513.h new file mode 100644 index 000000000000..930741a9a5c1 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/sgm41513.h @@ -0,0 +1,67 @@ +/* + * sgm41513 battery charging driver + * + * Copyright (C) 2013 SGM + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _LINUX_SGM41513_I2C_H +#define _LINUX_SGM41513_I2C_H + +#include + + +struct sgm41513_charge_param { + int vlim; + int ilim; + int ichg; + int vreg; +}; + +enum stat_ctrl { + STAT_CTRL_STAT, + STAT_CTRL_ICHG, + STAT_CTRL_INDPM, + STAT_CTRL_DISABLE, +}; + +enum vboost { + BOOSTV_4850 = 4850, + BOOSTV_5000 = 5000, + BOOSTV_5150 = 5150, + BOOSTV_5300 = 5300, +}; + +enum iboost { + BOOSTI_500 = 500, + BOOSTI_1200 = 1200, +}; + +enum vac_ovp { + VAC_OVP_5500 = 5500, + VAC_OVP_6500 = 6500, + VAC_OVP_10500 = 10500, + VAC_OVP_14000 = 14000, +}; + + +struct sgm41513_platform_data { + struct sgm41513_charge_param usb; + int iprechg; + int iterm; + + enum stat_ctrl statctrl; + enum vboost boostv; // options are 4850, + enum iboost boosti; // options are 500mA, 1200mA + enum vac_ovp vac_ovp; + +}; + +#endif \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/sgm41513_charger.c b/drivers/power/supply/mediatek/charger/sgm41513_charger.c new file mode 100644 index 000000000000..9e458970276e --- /dev/null +++ b/drivers/power/supply/mediatek/charger/sgm41513_charger.c @@ -0,0 +1,1873 @@ +/* + * SGM41513 battery charging driver + * + * Copyright (C) 2022 SGM + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#define pr_fmt(fmt) "[sgm41513]:%s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ +#include +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ +#include +#include +/* AL6528A code for SR-AL6528A-01-303 by wenyaqi at 2022/08/31 start */ +#include +#include "mtk_charger_intf.h" +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 start */ +#include "mtk_charger_init.h" +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 end */ + +#include "sgm41513_reg.h" +#include "sgm41513.h" + +/* hs14 code for AL6528A-600|AL6528A-1033 by gaozhengwei at 2022/12/09 start */ +#define BC12_DONE_TIMEOUT_CHECK_MAX_RETRY 10 +/* hs14 code for AL6528A-600|AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + +/* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 start */ +#define I2C_RETRY_CNT 3 +/* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 end */ + +struct sgm41513 { + struct device *dev; + struct i2c_client *client; + + int part_no; + + const char *chg_dev_name; + const char *eint_name; + + bool chg_det_enable; + + // enum charger_type chg_type; + struct power_supply_desc psy_desc; + int psy_usb_type; + + int status; + u32 intr_gpio; + int irq; + + struct mutex i2c_rw_lock; + + bool charge_enabled; /* Register bit status */ + bool power_good; + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + bool vbus_gd; + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + bool vbus_stat; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ + bool bypass_chgdet_en; + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ + + struct sgm41513_platform_data *platform_data; + struct charger_device *chg_dev; + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + struct delayed_work psy_dwork; + struct delayed_work prob_dwork; + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + struct delayed_work charge_detect_delayed_work; + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + struct power_supply *psy; +}; + +static const unsigned int IPRECHG_CURRENT_STABLE[] = { + 5000, 10000, 15000, 20000, 30000, 40000, 50000, 60000, + 80000, 100000, 120000, 140000, 160000, 180000, 200000, 240000 +}; + +static const unsigned int ITERM_CURRENT_STABLE[] = { + 5000, 10000, 15000, 20000, 30000, 40000, 50000, 60000, + 80000, 100000, 120000, 140000, 160000, 180000, 200000, 240000 +}; + +static const struct charger_properties sgm41513_chg_props = { + .alias_name = "sgm41513", +}; + +static int __sgm41513_read_reg(struct sgm41513 *sgm, u8 reg, u8 *data) +{ + s32 ret; + /* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 start */ + int i; + + for (i = 0; i < I2C_RETRY_CNT; ++i) { + + ret = i2c_smbus_read_byte_data(sgm->client, reg); + + if (ret >= 0) + break; + + pr_info("%s reg(0x%x), ret(%d), i2c_retry_cnt(%d/%d)\n", + __func__, reg, ret, i + 1, I2C_RETRY_CNT); + } + /* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 end */ + + if (ret < 0) { + pr_err("i2c read fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *data = (u8) ret; + + return 0; +} + +static int __sgm41513_write_reg(struct sgm41513 *sgm, int reg, u8 val) +{ + s32 ret; + /* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 start */ + int i; + + for (i = 0; i < I2C_RETRY_CNT; ++i) { + + ret = i2c_smbus_write_byte_data(sgm->client, reg, val); + + if (ret >= 0) + break; + + pr_info("%s reg(0x%x), ret(%d), i2c_retry_cnt(%d/%d)\n", + __func__, reg, ret, i + 1, I2C_RETRY_CNT); + } + /* hs14 code for SR-AL6528A-01-787 by gaozhengwei at 2022/12/06 end */ + + if (ret < 0) { + pr_err("i2c write fail: can't write 0x%02X to reg 0x%02X: %d\n", + val, reg, ret); + return ret; + } + return 0; +} + +static int sgm41513_read_byte(struct sgm41513 *sgm, u8 reg, u8 *data) +{ + int ret; + + mutex_lock(&sgm->i2c_rw_lock); + ret = __sgm41513_read_reg(sgm, reg, data); + mutex_unlock(&sgm->i2c_rw_lock); + + return ret; +} + +static int sgm41513_write_byte(struct sgm41513 *sgm, u8 reg, u8 data) +{ + int ret; + + mutex_lock(&sgm->i2c_rw_lock); + ret = __sgm41513_write_reg(sgm, reg, data); + mutex_unlock(&sgm->i2c_rw_lock); + + if (ret) + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + + return ret; +} + +static int sgm41513_update_bits(struct sgm41513 *sgm, u8 reg, u8 mask, u8 data) +{ + int ret; + u8 tmp; + + mutex_lock(&sgm->i2c_rw_lock); + ret = __sgm41513_read_reg(sgm, reg, &tmp); + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + goto out; + } + + tmp &= ~mask; + tmp |= data & mask; + + ret = __sgm41513_write_reg(sgm, reg, tmp); + if (ret) + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + +out: + mutex_unlock(&sgm->i2c_rw_lock); + return ret; +} + +static int sgm41513_enable_otg(struct sgm41513 *sgm) +{ + u8 val = REG01_OTG_ENABLE << REG01_OTG_CONFIG_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_01, REG01_OTG_CONFIG_MASK, + val); + +} + +static int sgm41513_disable_otg(struct sgm41513 *sgm) +{ + u8 val = REG01_OTG_DISABLE << REG01_OTG_CONFIG_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_01, REG01_OTG_CONFIG_MASK, + val); + +} + +static int sgm41513_enable_charger(struct sgm41513 *sgm) +{ + int ret; + u8 val = REG01_CHG_ENABLE << REG01_CHG_CONFIG_SHIFT; + + ret = + sgm41513_update_bits(sgm, SGM41513_REG_01, REG01_CHG_CONFIG_MASK, val); + + return ret; +} + +static int sgm41513_disable_charger(struct sgm41513 *sgm) +{ + int ret; + u8 val = REG01_CHG_DISABLE << REG01_CHG_CONFIG_SHIFT; + + ret = + sgm41513_update_bits(sgm, SGM41513_REG_01, REG01_CHG_CONFIG_MASK, val); + return ret; +} + +int sgm41513_set_chargecurrent(struct sgm41513 *sgm, int curr) +{ + u8 ichg; + + if (curr < 0) { + curr = 0; + } else if (curr > 3000) { + curr = 3000; + } + + if (curr < 40) { + ichg = curr / 5; + } else if (curr < 130) { + ichg = 8 + (curr - 40) / 10; + } else if (curr < 300) { + ichg = 16 + (curr - 110) / 20; + } else if (curr < 540) { + ichg = 24 + (curr - 300) / 30; + } else if (curr < 1500) { + ichg = 32 + (curr - 540) / 60; + } else { + ichg = 48 + (curr - 1500) / 120; + } + + return sgm41513_update_bits(sgm, SGM41513_REG_02, REG02_ICHG_MASK, + ichg << REG02_ICHG_SHIFT); + +} + +int sgm41513_set_term_current(struct sgm41513 *sgm, int curr) +{ + u8 reg_val; + + curr = curr*1000; + if (curr > ITERM_CURRENT_STABLE[15]) + curr = ITERM_CURRENT_STABLE[15]; + + for(reg_val = 1; reg_val < 16 && curr >= ITERM_CURRENT_STABLE[reg_val]; reg_val++) + ; + reg_val--; + + return sgm41513_update_bits(sgm, SGM41513_REG_03, + REG03_ITERM_MASK, reg_val); +} + +EXPORT_SYMBOL_GPL(sgm41513_set_term_current); + +int sgm41513_set_prechg_current(struct sgm41513 *sgm, int curr) +{ + u8 reg_val; + + curr = curr*1000; + if (curr > IPRECHG_CURRENT_STABLE[15]) + curr = IPRECHG_CURRENT_STABLE[15]; + + for(reg_val = 1; reg_val < 16 && curr >= IPRECHG_CURRENT_STABLE[reg_val]; reg_val++) + ; + reg_val--; + + return sgm41513_update_bits(sgm, SGM41513_REG_03, REG03_IPRECHG_MASK, + reg_val << REG03_IPRECHG_SHIFT); +} +EXPORT_SYMBOL_GPL(sgm41513_set_prechg_current); + +int sgm41513_set_chargevolt(struct sgm41513 *sgm, int volt) +{ + u8 val; + + if (volt < REG04_VREG_BASE) + volt = REG04_VREG_BASE; + + if (volt == 4352) { + val = 15; + /* hs03s_NM code added for DEVAL5626-680 by shixuanxuan at 20220426 start */ + } else if (volt == 4200) { + val = (volt - REG04_VREG_BASE) / REG04_VREG_LSB + 1; + /* hs03s_NM code added for DEVAL5626-680 by shixuanxuan at 20220426 end */ + } else { + val = (volt - REG04_VREG_BASE) / REG04_VREG_LSB; + } + + return sgm41513_update_bits(sgm, SGM41513_REG_04, REG04_VREG_MASK, + val << REG04_VREG_SHIFT); +} + +int sgm41513_set_input_volt_limit(struct sgm41513 *sgm, int volt) +{ + u8 val; + + if (volt < REG06_VINDPM_BASE) + volt = REG06_VINDPM_BASE; + + val = (volt - REG06_VINDPM_BASE) / REG06_VINDPM_LSB; + return sgm41513_update_bits(sgm, SGM41513_REG_06, REG06_VINDPM_MASK, + val << REG06_VINDPM_SHIFT); +} + +int sgm41513_set_input_current_limit(struct sgm41513 *sgm, int curr) +{ + u8 val; + + if (curr < REG00_IINLIM_BASE) + curr = REG00_IINLIM_BASE; + + val = (curr - REG00_IINLIM_BASE) / REG00_IINLIM_LSB; + return sgm41513_update_bits(sgm, SGM41513_REG_00, REG00_IINLIM_MASK, + val << REG00_IINLIM_SHIFT); +} + +int sgm41513_set_watchdog_timer(struct sgm41513 *sgm, u8 timeout) +{ + u8 temp; + + temp = (u8) (((timeout - + REG05_WDT_BASE) / REG05_WDT_LSB) << REG05_WDT_SHIFT); + + return sgm41513_update_bits(sgm, SGM41513_REG_05, REG05_WDT_MASK, temp); +} +EXPORT_SYMBOL_GPL(sgm41513_set_watchdog_timer); + +int sgm41513_disable_watchdog_timer(struct sgm41513 *sgm) +{ + u8 val = REG05_WDT_DISABLE << REG05_WDT_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_05, REG05_WDT_MASK, val); +} +EXPORT_SYMBOL_GPL(sgm41513_disable_watchdog_timer); + +int sgm41513_reset_watchdog_timer(struct sgm41513 *sgm) +{ + u8 val = REG01_WDT_RESET << REG01_WDT_RESET_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_01, REG01_WDT_RESET_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_reset_watchdog_timer); + +int sgm41513_reset_chip(struct sgm41513 *sgm) +{ + int ret; + u8 val = REG0B_REG_RESET << REG0B_REG_RESET_SHIFT; + + ret = + sgm41513_update_bits(sgm, SGM41513_REG_0B, REG0B_REG_RESET_MASK, val); + return ret; +} +EXPORT_SYMBOL_GPL(sgm41513_reset_chip); + +int sgm41513_enter_hiz_mode(struct sgm41513 *sgm) +{ + u8 val = REG00_HIZ_ENABLE << REG00_ENHIZ_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(sgm41513_enter_hiz_mode); + +int sgm41513_exit_hiz_mode(struct sgm41513 *sgm) +{ + + u8 val = REG00_HIZ_DISABLE << REG00_ENHIZ_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(sgm41513_exit_hiz_mode); + +static int sgm41513_enable_term(struct sgm41513 *sgm, bool enable) +{ + u8 val; + int ret; + + if (enable) + val = REG05_TERM_ENABLE << REG05_EN_TERM_SHIFT; + else + val = REG05_TERM_DISABLE << REG05_EN_TERM_SHIFT; + + ret = sgm41513_update_bits(sgm, SGM41513_REG_05, REG05_EN_TERM_MASK, val); + + return ret; +} +EXPORT_SYMBOL_GPL(sgm41513_enable_term); + +/* hs14 code for AL6528A-341 by wenyaqi at 2022/10/20 start */ +int sgm41513_set_boost_current(struct sgm41513 *sgm, int curr) +{ + u8 val; + + if (curr >= BOOSTI_1200) + val = REG02_BOOST_LIM_1P2A; + else + val = REG02_BOOST_LIM_0P5A; + + return sgm41513_update_bits(sgm, SGM41513_REG_02, REG02_BOOST_LIM_MASK, + val << REG02_BOOST_LIM_SHIFT); +} + +int sgm41513_set_boost_voltage(struct sgm41513 *sgm, int volt) +{ + u8 val; + + if (volt >= BOOSTV_5300) + val = REG06_BOOSTV_5P3V; + else if (volt >= BOOSTV_5150 && volt < BOOSTV_5300) + val = REG06_BOOSTV_5P15V; + else if (volt >= BOOSTV_4850 && volt < BOOSTV_5000) + val = REG06_BOOSTV_4P85V; + else + val = REG06_BOOSTV_5V; + + return sgm41513_update_bits(sgm, SGM41513_REG_06, REG06_BOOSTV_MASK, + val << REG06_BOOSTV_SHIFT); +} +EXPORT_SYMBOL_GPL(sgm41513_set_boost_voltage); + +static int sgm41513_set_acovp_threshold(struct sgm41513 *sgm, int volt) +{ + u8 val; + + if (volt >= VAC_OVP_14000) + val = REG06_OVP_14P0V; + else if (volt >= VAC_OVP_10500 && volt < VAC_OVP_14000) + val = REG06_OVP_10P5V; + else if (volt >= VAC_OVP_6500 && volt < REG06_OVP_10P5V) + val = REG06_OVP_6P5V; + else + val = REG06_OVP_5P5V; + + return sgm41513_update_bits(sgm, SGM41513_REG_06, REG06_OVP_MASK, + val << REG06_OVP_SHIFT); +} +EXPORT_SYMBOL_GPL(sgm41513_set_acovp_threshold); +/* hs14 code for AL6528A-341 by wenyaqi at 2022/10/20 end */ + +static int sgm41513_set_stat_ctrl(struct sgm41513 *sgm, int ctrl) +{ + u8 val; + + val = ctrl; + + return sgm41513_update_bits(sgm, SGM41513_REG_00, REG00_STAT_CTRL_MASK, + val << REG00_STAT_CTRL_SHIFT); +} + +static int sgm41513_set_int_mask(struct sgm41513 *sgm, int mask) +{ + u8 val; + + val = mask; + + return sgm41513_update_bits(sgm, SGM41513_REG_0A, REG0A_INT_MASK_MASK, + val << REG0A_INT_MASK_SHIFT); +} + +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ +static int sgm41513_force_dpdm(struct sgm41513 *sgm) +{ + const u8 val = REG07_FORCE_DPDM << REG07_FORCE_DPDM_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_FORCE_DPDM_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_force_dpdm); +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + +static int sgm41513_enable_batfet(struct sgm41513 *sgm) +{ + const u8 val = REG07_BATFET_ON << REG07_BATFET_DIS_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_enable_batfet); + +static int sgm41513_disable_batfet(struct sgm41513 *sgm) +{ + const u8 val = REG07_BATFET_OFF << REG07_BATFET_DIS_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_disable_batfet); + +static int sgm41513_set_batfet_delay(struct sgm41513 *sgm, uint8_t delay) +{ + u8 val; + + if (delay == 0) + val = REG07_BATFET_DLY_0S; + else + val = REG07_BATFET_DLY_10S; + + val <<= REG07_BATFET_DLY_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_DLY_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_set_batfet_delay); + +static int sgm41513_enable_safety_timer(struct sgm41513 *sgm) +{ + const u8 val = REG05_CHG_TIMER_ENABLE << REG05_EN_TIMER_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_05, REG05_EN_TIMER_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_enable_safety_timer); + +static int sgm41513_disable_safety_timer(struct sgm41513 *sgm) +{ + const u8 val = REG05_CHG_TIMER_DISABLE << REG05_EN_TIMER_SHIFT; + + return sgm41513_update_bits(sgm, SGM41513_REG_05, REG05_EN_TIMER_MASK, + val); +} +EXPORT_SYMBOL_GPL(sgm41513_disable_safety_timer); + +static struct sgm41513_platform_data *sgm41513_parse_dt(struct device_node *np, + struct sgm41513 *sgm) +{ + int ret; + struct sgm41513_platform_data *pdata; + + pdata = devm_kzalloc(sgm->dev, sizeof(struct sgm41513_platform_data), + GFP_KERNEL); + if (!pdata) + return NULL; + + if (of_property_read_string(np, "charger_name", &sgm->chg_dev_name) < 0) { + sgm->chg_dev_name = "primary_chg"; + pr_warn("no charger name\n"); + } + + if (of_property_read_string(np, "eint_name", &sgm->eint_name) < 0) { + sgm->eint_name = "chr_stat"; + pr_warn("no eint name\n"); + } + + ret = of_get_named_gpio(np, "sgm,intr_gpio", 0); + if (ret < 0) { + pr_err("%s no sgm,intr_gpio(%d)\n", __func__, ret); + } else { + sgm->intr_gpio = ret; + } + + sgm->chg_det_enable = + of_property_read_bool(np, "sgm41513,charge-detect-enable"); + + ret = of_property_read_u32(np, "sgm41513,usb-vlim", &pdata->usb.vlim); + if (ret) { + pdata->usb.vlim = 4500; + pr_err("Failed to read node of sgm41513,usb-vlim\n"); + } + + ret = of_property_read_u32(np, "sgm41513,usb-ilim", &pdata->usb.ilim); + if (ret) { + pdata->usb.ilim = 2000; + pr_err("Failed to read node of sgm41513,usb-ilim\n"); + } + + ret = of_property_read_u32(np, "sgm41513,usb-vreg", &pdata->usb.vreg); + if (ret) { + pdata->usb.vreg = 4200; + pr_err("Failed to read node of sgm41513,usb-vreg\n"); + } + + ret = of_property_read_u32(np, "sgm41513,usb-ichg", &pdata->usb.ichg); + if (ret) { + pdata->usb.ichg = 2000; + pr_err("Failed to read node of sgm41513,usb-ichg\n"); + } + + ret = of_property_read_u32(np, "sgm41513,stat-pin-ctrl", + &pdata->statctrl); + if (ret) { + pdata->statctrl = 0; + pr_err("Failed to read node of sgm41513,stat-pin-ctrl\n"); + } + + ret = of_property_read_u32(np, "sgm41513,precharge-current", + &pdata->iprechg); + if (ret) { + pdata->iprechg = 180; + pr_err("Failed to read node of sgm41513,precharge-current\n"); + } + + ret = of_property_read_u32(np, "sgm41513,termination-current", + &pdata->iterm); + if (ret) { + pdata->iterm = 180; + pr_err + ("Failed to read node of sgm41513,termination-current\n"); + } + + ret = + of_property_read_u32(np, "sgm41513,boost-voltage", + &pdata->boostv); + if (ret) { + pdata->boostv = 5000; + pr_err("Failed to read node of sgm41513,boost-voltage\n"); + } + + ret = + of_property_read_u32(np, "sgm41513,boost-current", + &pdata->boosti); + if (ret) { + pdata->boosti = 1200; + pr_err("Failed to read node of sgm41513,boost-current\n"); + } + + ret = of_property_read_u32(np, "sgm41513,vac-ovp-threshold", + &pdata->vac_ovp); + if (ret) { + pdata->vac_ovp = 6500; + pr_err("Failed to read node of sgm41513,vac-ovp-threshold\n"); + } + + return pdata; +} + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +static int sgm41513_dpdm_detect_is_done(struct sgm41513 * sgm) +{ + u8 chrg_stat,iindet_stat; + int ret; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_07, &iindet_stat); + if (ret) { + dev_err(sgm->dev, "Check iindet_stat failed\n"); + return false; + } + + ret = sgm41513_read_byte(sgm, SGM41513_INPUT_DET, &chrg_stat); + if (ret) { + dev_err(sgm->dev, "Check DPDM detecte error\n"); + } + + if ((iindet_stat & REG07_FORCE_DPDM_MASK) != 0) { + pr_err("[%s] Reg07 = 0x%.2x\n", __func__, iindet_stat); + return false; + } + + if ((chrg_stat & SGM41513_DPDM_ONGOING) != SGM41513_DPDM_ONGOING) { + pr_err("[%s] Reg0E = 0x%.2x\n", __func__, chrg_stat); + return false; + } + + return true; +} + +static int sgm41513_enable_hvdcp(struct sgm41513 * sgm) +{ + int ret; + int dp_val, dm_val; + + /*dp and dm connected,dp 0.6V dm Hiz*/ + dp_val = SGM41513_REG_02 << REG02_EN_HVDCP_SHIFT; + ret = sgm41513_update_bits(sgm, SGM41513_CHRG_CTRL_d, + SGM41513_DP_VSEL_MASK, dp_val); //dp 0.6V + if (ret) { + return ret; + } + + dm_val = 0; + ret = sgm41513_update_bits(sgm, SGM41513_CHRG_CTRL_d, + SGM41513_DM_VSEL_MASK, dm_val); //dm Hiz + + return ret; +} +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ + +/* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ +static void sgm41513_charger_detect_work_func(struct work_struct *work) +{ + int ret = 0; + u8 reg_val = 0; + int vbus_stat = 0; + int chg_type = CHARGER_UNKNOWN; + int retry_cnt = 0; + + struct sgm41513 *sgm = container_of(work, struct sgm41513, + charge_detect_delayed_work.work); + + do { + if (!sgm41513_dpdm_detect_is_done(sgm)) { + pr_err("[%s] DPDM detecte not done, retry_cnt:%d\n", __func__, retry_cnt); + } else { + pr_err("[%s] BC1.2 done\n", __func__); + break; + } + mdelay(60); + } while(retry_cnt++ < BC12_DONE_TIMEOUT_CHECK_MAX_RETRY); + + ret = sgm41513_read_byte(sgm, SGM41513_REG_08, ®_val); + + if (ret) + return; + + vbus_stat = (reg_val & REG08_VBUS_STAT_MASK); + vbus_stat >>= REG08_VBUS_STAT_SHIFT; + + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + pr_info("[%s] reg08: 0x%02x :vbus state %d\n", __func__, reg_val, vbus_stat); + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + + switch (vbus_stat) { + case REG08_VBUS_TYPE_NONE: + chg_type = CHARGER_UNKNOWN; + break; + case REG08_VBUS_TYPE_SDP: + chg_type = STANDARD_HOST; + break; + case REG08_VBUS_TYPE_CDP: + chg_type = CHARGING_HOST; + break; + case REG08_VBUS_TYPE_DCP: + chg_type = STANDARD_CHARGER; + break; + case REG08_VBUS_TYPE_UNKNOWN: + /* hs14 code for SR-AL6528A-01-252 by chengyuanhang at 2022/09/27 start */ + chg_type = NONSTANDARD_CHARGER; + /* hs14 code for SR-AL6528A-01-252 by chengyuanhang at 2022/09/27 end */ + break; + case REG08_VBUS_TYPE_NON_STD: + chg_type = NONSTANDARD_CHARGER; + break; + default: + chg_type = NONSTANDARD_CHARGER; + break; + } + + /* hs14 code for SR-AL6528A-01-306|SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ + if (chg_type != STANDARD_CHARGER) { + Charger_Detect_Release(); + } else { + ret = sgm41513_enable_hvdcp(sgm); + if (ret) + pr_err("Failed to en HVDCP, ret = %d\n", ret); + } + /* hs14 code for SR-AL6528A-01-306|SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + + sgm->psy_usb_type = chg_type; + + schedule_delayed_work(&sgm->psy_dwork, 0); + + return; +} +/* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ +static void sgm41513_inform_psy_dwork_handler(struct work_struct *work) +{ + int ret = 0; + union power_supply_propval propval; + struct sgm41513 *sgm = container_of(work, struct sgm41513, + psy_dwork.work); + if (!sgm->psy) { + sgm->psy = power_supply_get_by_name("charger"); + if (!sgm->psy) { + pr_err("%s Couldn't get psy\n", __func__); + mod_delayed_work(system_wq, &sgm->psy_dwork, + msecs_to_jiffies(2000)); + return; + } + } +#ifdef BEFORE_MTK_ANDROID_T // which is used before Android T + if (sgm->psy_usb_type != POWER_SUPPLY_TYPE_UNKNOWN) +#else + if (sgm->psy_usb_type != CHARGER_UNKNOWN) +#endif + propval.intval = 1; + else + propval.intval = 0; + + ret = power_supply_set_property(sgm->psy, POWER_SUPPLY_PROP_ONLINE, + &propval); + + if (ret < 0) + pr_notice("inform power supply online failed:%d\n", ret); + + propval.intval = sgm->psy_usb_type; + + ret = power_supply_set_property(sgm->psy, + POWER_SUPPLY_PROP_CHARGE_TYPE, + &propval); + + if (ret < 0) + pr_notice("inform power supply charge type failed:%d\n", ret); + + return; +} + +static irqreturn_t sgm41513_irq_handler(int irq, void *data) +{ + int ret; + u8 reg_val; + bool prev_pg; + bool prev_vbus_gd; + + struct sgm41513 *sgm = (struct sgm41513 *)data; + + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ + if (sgm->bypass_chgdet_en == true) { + pr_err("%s:bypass_chgdet_en=%d, skip bc12\n", __func__, sgm->bypass_chgdet_en); + return IRQ_HANDLED; + } + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ + + ret = sgm41513_read_byte(sgm, SGM41513_REG_0A, ®_val); + if (ret) + return IRQ_HANDLED; + + prev_vbus_gd = sgm->vbus_gd; + + sgm->vbus_gd = !!(reg_val & REG0A_VBUS_GD_MASK); + + ret = sgm41513_read_byte(sgm, SGM41513_REG_08, ®_val); + if (ret) + return IRQ_HANDLED; + + prev_pg = sgm->power_good; + + sgm->power_good = !!(reg_val & REG08_PG_STAT_MASK); + + /* hs14 code for AL6528ADEU-28 by gaozhengwei at 2022/09/29 start */ + if (!prev_vbus_gd && sgm->vbus_gd) { + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + sgm->vbus_stat = true; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + pr_notice("adapter/usb inserted\n"); + Charger_Detect_Init(); + } else if (prev_vbus_gd && !sgm->vbus_gd) { + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + sgm->vbus_stat = false; + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + sgm->psy_usb_type = CHARGER_UNKNOWN; + schedule_delayed_work(&sgm->psy_dwork, 0); + pr_notice("adapter/usb removed\n"); + Charger_Detect_Release(); + return IRQ_HANDLED; + } + /* hs14 code for AL6528ADEU-28 by gaozhengwei at 2022/09/29 end */ + + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + if (!prev_pg && sgm->power_good) + schedule_delayed_work(&sgm->charge_detect_delayed_work, 0); + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + + return IRQ_HANDLED; + +} +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + +/* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 start*/ +static int sgm41513_set_shipmode(struct charger_device *chg_dev, bool en) +{ + int ret; + u8 val; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + if (en) { + val = REG07_BATFET_OFF << REG07_BATFET_DIS_SHIFT; + ret = sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_DIS_MASK, val); + } else { + val = REG07_BATFET_ON << REG07_BATFET_DIS_SHIFT; + ret = sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_DIS_MASK, val); + } + + pr_err("%s shipmode %s\n", en ? "enable" : "disable", + !ret ? "successfully" : "failed"); + + return ret; +} + +static int sgm41513_get_shipmode(struct charger_device *chg_dev) +{ + int ret; + u8 val; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + msleep(100); + ret = sgm41513_read_byte(sgm, SGM41513_REG_07, &val); + if (ret == 0){ + pr_err("Reg[%.2x] = 0x%.2x\n", SGM41513_REG_07, val); + } else { + pr_err("%s: get shipmode reg fail! \n",__func__); + return ret; + } + ret = (val & REG07_BATFET_DIS_MASK) >> REG07_BATFET_DIS_SHIFT; + pr_err("%s:shipmode %s\n",__func__, ret ? "enabled" : "disabled"); + + return ret; +} +static int sgm41513_disable_battfet_rst(struct sgm41513 *sgm) +{ + int ret; + u8 val; + + val = REG07_BATFET_RST_DISABLE << REG07_BATFET_RST_EN_SHIFT; + ret = sgm41513_update_bits(sgm, SGM41513_REG_07, REG07_BATFET_RST_EN_MASK, val); + + pr_err("disable BATTFET_RST_EN %s\n", !ret ? "successfully" : "failed"); + + return ret; +} +/* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 end*/ + +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 start*/ +static int sgm41513_get_charging_status(struct charger_device *chg_dev, + int *chg_stat) +{ + int ret; + u8 val; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + ret = sgm41513_read_byte(sgm, SGM41513_REG_08, &val); + if (!ret) { + val = val & REG08_CHRG_STAT_MASK; + val = val >> REG08_CHRG_STAT_SHIFT; + *chg_stat = val; + } + + return ret; +} +/* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 end*/ + +static int sgm41513_register_interrupt(struct sgm41513 *sgm) +{ + int ret = 0; + + ret = devm_gpio_request_one(sgm->dev, sgm->intr_gpio, GPIOF_DIR_IN, + "sgm41511_intr_gpio"); + if (ret < 0) { + dev_info(sgm->dev, "request gpio fail\n"); + return ret; + } else { + sgm->client->irq = gpio_to_irq(sgm->intr_gpio); + } + + if (! sgm->client->irq) { + pr_info("sgm->client->irq is NULL\n");//remember to config dws + return -ENODEV; + } + + ret = devm_request_threaded_irq(sgm->dev, sgm->client->irq, NULL, + sgm41513_irq_handler, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "ti_irq", sgm); + if (ret < 0) { + pr_err("request thread irq failed:%d\n", ret); + return ret; + } + + enable_irq_wake(sgm->irq); + + return 0; +} + +static int sgm41513_init_device(struct sgm41513 *sgm) +{ + int ret; + + sgm41513_disable_watchdog_timer(sgm); + + ret = sgm41513_set_stat_ctrl(sgm, sgm->platform_data->statctrl); + if (ret) + pr_err("Failed to set stat pin control mode, ret = %d\n", ret); + + ret = sgm41513_set_prechg_current(sgm, sgm->platform_data->iprechg); + if (ret) + pr_err("Failed to set prechg current, ret = %d\n", ret); + + ret = sgm41513_set_term_current(sgm, sgm->platform_data->iterm); + if (ret) + pr_err("Failed to set termination current, ret = %d\n", ret); + + ret = sgm41513_set_boost_voltage(sgm, sgm->platform_data->boostv); + if (ret) + pr_err("Failed to set boost voltage, ret = %d\n", ret); + + ret = sgm41513_set_boost_current(sgm, sgm->platform_data->boosti); + if (ret) + pr_err("Failed to set boost current, ret = %d\n", ret); + + ret = sgm41513_set_acovp_threshold(sgm, sgm->platform_data->vac_ovp); + if (ret) + pr_err("Failed to set acovp threshold, ret = %d\n", ret); + + /* hs14 code for AL6528ADEU-1863 by wenyaqi at 2022/11/03 start */ + ret= sgm41513_disable_safety_timer(sgm); + if (ret) + pr_err("Failed to set safety_timer stop, ret = %d\n", ret); + /* hs14 code for AL6528ADEU-1863 by wenyaqi at 2022/11/03 end */ + + ret = sgm41513_set_int_mask(sgm, + REG0A_IINDPM_INT_MASK | + REG0A_VINDPM_INT_MASK); + if (ret) + pr_err("Failed to set vindpm and iindpm int mask\n"); + + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 start*/ + ret = sgm41513_disable_battfet_rst(sgm); + if (ret) + pr_err("Failed to disable_battfet\n"); + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 end*/ + return 0; +} + +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ +static void sgm41513_inform_prob_dwork_handler(struct work_struct *work) +{ + struct sgm41513 *sgm = container_of(work, struct sgm41513, + prob_dwork.work); + + sgm41513_force_dpdm(sgm); + + /* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ + msleep(500); + /* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + + sgm41513_irq_handler(sgm->irq, (void *) sgm); +} +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + +static int sgm41513_detect_device(struct sgm41513 *sgm) +{ + int ret; + u8 data; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_0B, &data); + if (!ret) { + sgm->part_no = (data & REG0B_PN_MASK) >> REG0B_PN_SHIFT; + } + + return ret; +} + +static void sgm41513_dump_regs(struct sgm41513 *sgm) +{ + int addr; + u8 val; + int ret; + + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = sgm41513_read_byte(sgm, addr, &val); + if (ret == 0) + pr_err("Reg[%.2x] = 0x%.2x\n", addr, val); + } + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ +} + +static ssize_t +sgm41513_show_registers(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct sgm41513 *sgm = dev_get_drvdata(dev); + u8 addr; + u8 val; + u8 tmpbuf[200]; + int len; + int idx = 0; + int ret; + + idx = snprintf(buf, PAGE_SIZE, "%s:\n", "sgm41513 Reg"); + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = sgm41513_read_byte(sgm, addr, &val); + if (ret == 0) { + len = snprintf(tmpbuf, PAGE_SIZE - idx, + "Reg[%.2x] = 0x%.2x\n", addr, val); + memcpy(&buf[idx], tmpbuf, len); + idx += len; + } + } + + return idx; +} + +static ssize_t +sgm41513_store_registers(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + struct sgm41513 *sgm = dev_get_drvdata(dev); + int ret; + unsigned int reg; + unsigned int val; + + ret = sscanf(buf, "%x %x", ®, &val); + if (ret == 2 && reg < 0x0B) { + sgm41513_write_byte(sgm, (unsigned char) reg, + (unsigned char) val); + } + + return count; +} + +static DEVICE_ATTR(registers, S_IRUGO | S_IWUSR, sgm41513_show_registers, + sgm41513_store_registers); + +static struct attribute *sgm41513_attributes[] = { + &dev_attr_registers.attr, + NULL, +}; + +static const struct attribute_group sgm41513_attr_group = { + .attrs = sgm41513_attributes, +}; + +static int sgm41513_charging(struct charger_device *chg_dev, bool enable) +{ + + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + int ret = 0; + u8 val; + + if (enable) + ret = sgm41513_enable_charger(sgm); + else + ret = sgm41513_disable_charger(sgm); + + pr_err("%s charger %s\n", enable ? "enable" : "disable", + !ret ? "successfully" : "failed"); + + ret = sgm41513_read_byte(sgm, SGM41513_REG_01, &val); + + if (!ret) + sgm->charge_enabled = !!(val & REG01_CHG_CONFIG_MASK); + + return ret; +} + +static int sgm41513_plug_in(struct charger_device *chg_dev) +{ + + int ret; + + ret = sgm41513_charging(chg_dev, true); + + if (ret) + pr_err("Failed to enable charging:%d\n", ret); + + return ret; +} + +static int sgm41513_plug_out(struct charger_device *chg_dev) +{ + int ret; + + ret = sgm41513_charging(chg_dev, false); + + if (ret) + pr_err("Failed to disable charging:%d\n", ret); + + return ret; +} + +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ +static int sgm41513_bypass_chgdet(struct charger_device *chg_dev, bool bypass_chgdet_en) +{ + int ret = 0; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + sgm->bypass_chgdet_en = bypass_chgdet_en; + dev_info(sgm->dev, "%s bypass_chgdet_en = %d\n", __func__, bypass_chgdet_en); + + return ret; +} +/* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ + +/* hs14 code for SR-AL6528A-01-255|P221117-03133 by wenyaqi at 2022/11/24 start */ +static int sgm41513_enable_chg_type_det(struct charger_device *chg_dev, bool en) +{ + int ret = 0; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + union power_supply_propval propval; + + dev_info(sgm->dev, "%s en = %d\n", __func__, en); + + if (!sgm->psy) { + sgm->psy = power_supply_get_by_name("charger"); + if (!sgm->psy) { + pr_err("%s Couldn't get psy\n", __func__); + return -ENODEV; + } + } + + if (en == false) { + propval.intval = 0; + } else { + propval.intval = 1; + } + + ret = power_supply_set_property(sgm->psy, + POWER_SUPPLY_PROP_ONLINE, + &propval); + if (ret < 0) + pr_notice("inform power supply online failed:%d\n", ret); + + if (en == false) { + propval.intval = CHARGER_UNKNOWN; + } else { + propval.intval = sgm->psy_usb_type; + } + + ret = power_supply_set_property(sgm->psy, + POWER_SUPPLY_PROP_CHARGE_TYPE, + &propval); + if (ret < 0) + pr_notice("inform power supply charge type failed:%d\n", ret); + + return ret; +} +/* hs14 code for SR-AL6528A-01-255|P221117-03133 by wenyaqi at 2022/11/24 end */ + +static int sgm41513_dump_register(struct charger_device *chg_dev) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + sgm41513_dump_regs(sgm); + + return 0; +} + +static int sgm41513_is_charging_enable(struct charger_device *chg_dev, bool *en) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + *en = sgm->charge_enabled; + + return 0; +} + +static int sgm41513_is_charging_done(struct charger_device *chg_dev, bool *done) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + int ret; + u8 val; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_08, &val); + if (!ret) { + val = val & REG08_CHRG_STAT_MASK; + val = val >> REG08_CHRG_STAT_SHIFT; + *done = (val == REG08_CHRG_STAT_CHGDONE); + } + + return ret; +} + +static int sgm41513_set_ichg(struct charger_device *chg_dev, u32 curr) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("charge curr = %d\n", curr); + + return sgm41513_set_chargecurrent(sgm, curr / 1000); +} + +static int sgm41513_get_ichg(struct charger_device *chg_dev, u32 *curr) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 reg_val; + int ichg; + int ret; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_02, ®_val); + if (!ret) { + ichg = (reg_val & REG02_ICHG_MASK) >> REG02_ICHG_SHIFT; + if (ichg < 8) { + ichg = ichg * 5; + } else if (ichg < 16) { + ichg = (ichg - 8 ) * 10 + 40; + } else if (ichg < 24) { + ichg = (ichg - 16 ) * 20 + 130; + } else if (ichg < 32) { + ichg = (ichg - 24) * 30 + 300; + } else if (ichg < 48) { + ichg = (ichg - 32) * 60 + 540; + } else { + ichg = (ichg - 48) * 120 + 1500; + } + + *curr = ichg * 1000; + } + + return ret; +} + +static int sgm41513_set_iterm(struct charger_device *chg_dev, u32 uA) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("termination curr = %d\n", uA); + + return sgm41513_set_term_current(sgm, uA / 1000); +} + +static int sgm41513_get_min_ichg(struct charger_device *chg_dev, u32 *curr) +{ + *curr = 60 * 1000; + + return 0; +} + +static int sgm41513_get_min_aicr(struct charger_device *chg_dev, u32 *uA) +{ + *uA = 100 * 1000; + return 0; +} + +static int sgm41513_set_vchg(struct charger_device *chg_dev, u32 volt) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("charge volt = %d\n", volt); + + return sgm41513_set_chargevolt(sgm, volt / 1000); +} + +static int sgm41513_get_vchg(struct charger_device *chg_dev, u32 *volt) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 reg_val; + int vchg; + int ret; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_04, ®_val); + if (!ret) { + vchg = (reg_val & REG04_VREG_MASK) >> REG04_VREG_SHIFT; + if ( vchg == 15) { + vchg = 3852; + } else { + vchg = vchg * REG04_VREG_LSB + REG04_VREG_BASE; + } + + *volt = vchg * 1000; + } + + return ret; +} + +static int sgm41513_get_ivl_state(struct charger_device *chg_dev, bool *in_loop) +{ + int ret = 0; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 reg_val; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_0A, ®_val); + if (!ret) + *in_loop = (ret & REG0A_VINDPM_STAT_MASK) >> REG0A_VINDPM_STAT_SHIFT; + + return ret; +} + +static int sgm41513_get_ivl(struct charger_device *chg_dev, u32 *volt) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 reg_val; + int ivl; + int ret; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_06, ®_val); + if (!ret) { + ivl = (reg_val & REG06_VINDPM_MASK) >> REG06_VINDPM_SHIFT; + ivl = ivl * REG06_VINDPM_LSB + REG06_VINDPM_BASE; + *volt = ivl * 1000; + } + + return ret; +} + +static int sgm41513_set_ivl(struct charger_device *chg_dev, u32 volt) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("vindpm volt = %d\n", volt); + + return sgm41513_set_input_volt_limit(sgm, volt / 1000); + +} + +static int sgm41513_set_icl(struct charger_device *chg_dev, u32 curr) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("indpm curr = %d\n", curr); + + return sgm41513_set_input_current_limit(sgm, curr / 1000); +} + +static int sgm41513_get_icl(struct charger_device *chg_dev, u32 *curr) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 reg_val; + int icl; + int ret; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_00, ®_val); + if (!ret) { + icl = (reg_val & REG00_IINLIM_MASK) >> REG00_IINLIM_SHIFT; + icl = icl * REG00_IINLIM_LSB + REG00_IINLIM_BASE; + *curr = icl * 1000; + } + + return ret; + +} + +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 start */ +static int sgm41513_get_ibus(struct charger_device *chg_dev, u32 *curr) +{ + /*return 1650mA as ibus*/ + *curr = PD_INPUT_CURRENT; + + return 0; +} +/* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 end */ + +static int sgm41513_enable_te(struct charger_device *chg_dev, bool en) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + pr_err("enable_term = %d\n", en); + + return sgm41513_enable_term(sgm, en); +} + +static int sgm41513_kick_wdt(struct charger_device *chg_dev) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + return sgm41513_reset_watchdog_timer(sgm); +} + +static int sgm41513_set_otg(struct charger_device *chg_dev, bool en) +{ + int ret; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + if (en) + ret = sgm41513_enable_otg(sgm); + else + ret = sgm41513_disable_otg(sgm); + + pr_err("%s OTG %s\n", en ? "enable" : "disable", + !ret ? "successfully" : "failed"); + + return ret; +} + +static int sgm41513_set_safety_timer(struct charger_device *chg_dev, bool en) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + int ret; + + if (en) + ret = sgm41513_enable_safety_timer(sgm); + else + ret = sgm41513_disable_safety_timer(sgm); + + return ret; +} + +static int sgm41513_is_safety_timer_enabled(struct charger_device *chg_dev, + bool *en) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + int ret; + u8 reg_val; + + ret = sgm41513_read_byte(sgm, SGM41513_REG_05, ®_val); + + if (!ret) + *en = !!(reg_val & REG05_EN_TIMER_MASK); + + return ret; +} + +/* hs14 code for AL6528A-164|AL6528ADEU-643 by gaozhengwei|wenyaqi at 2022/10/13 start */ +static int sgm41513_do_event(struct charger_device *chg_dev, u32 event, u32 args) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + dev_info(sgm->dev, "%s event = %d\n", __func__, event); + + switch (event) { + case EVENT_EOC: + charger_dev_notify(chg_dev, CHARGER_DEV_NOTIFY_EOC); + break; + case EVENT_RECHARGE: + charger_dev_notify(chg_dev, CHARGER_DEV_NOTIFY_RECHG); + break; + default: + break; + } + return 0; +} +/* hs14 code for AL6528A-164|AL6528ADEU-643 by gaozhengwei|wenyaqi at 2022/10/13 end */ + +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 start */ +static int sgm41513_set_hiz_mode(struct charger_device *chg_dev, bool en) +{ + int ret; + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + if (en) + ret = sgm41513_enter_hiz_mode(sgm); + else + ret = sgm41513_exit_hiz_mode(sgm); + + pr_err("%s hiz mode %s\n", en ? "enable" : "disable", + !ret ? "successfully" : "failed"); + + return ret; +} + +static int sgm41513_get_hiz_mode(struct charger_device *chg_dev) +{ + int ret; + struct sgm41513 *bq = dev_get_drvdata(&chg_dev->dev); + u8 val; + ret = sgm41513_read_byte(bq, SGM41513_REG_00, &val); + if (ret == 0){ + pr_err("Reg[%.2x] = 0x%.2x\n", SGM41513_REG_00, val); + } + + ret = (val & REG00_ENHIZ_MASK) >> REG00_ENHIZ_SHIFT; + pr_err("%s:hiz mode %s\n",__func__, ret ? "enabled" : "disabled"); + + return ret; +} +/* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 end */ + +static int sgm41513_set_boost_ilmt(struct charger_device *chg_dev, u32 curr) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + int ret; + + pr_err("otg curr = %d\n", curr); + + ret = sgm41513_set_boost_current(sgm, curr / 1000); + + return ret; +} + +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ +static int sgm41513_get_vbus_status(struct charger_device *chg_dev) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + + return sgm->vbus_stat; +} + +static int sgm41513_dynamic_set_hwovp_threshold(struct charger_device *chg_dev, + int adapter_type) +{ + struct sgm41513 *sgm = dev_get_drvdata(&chg_dev->dev); + u8 val = 0; + + if (adapter_type == SC_ADAPTER_NORMAL) + val = REG06_OVP_6P5V; + else if (adapter_type == SC_ADAPTER_HV) + val = REG06_OVP_10P5V; + + return sgm41513_update_bits(sgm, SGM41513_REG_06, REG06_OVP_MASK, + val << REG06_OVP_SHIFT); +} +/* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + +static struct charger_ops sgm41513_chg_ops = { + /* Normal charging */ + .plug_in = sgm41513_plug_in, + .plug_out = sgm41513_plug_out, + .dump_registers = sgm41513_dump_register, + .enable = sgm41513_charging, + .is_enabled = sgm41513_is_charging_enable, + .get_charging_current = sgm41513_get_ichg, + .set_charging_current = sgm41513_set_ichg, + .get_input_current = sgm41513_get_icl, + .set_input_current = sgm41513_set_icl, + .get_constant_voltage = sgm41513_get_vchg, + .set_constant_voltage = sgm41513_set_vchg, + .kick_wdt = sgm41513_kick_wdt, + .set_mivr = sgm41513_set_ivl, + .get_mivr = sgm41513_get_ivl, + .get_mivr_state = sgm41513_get_ivl_state, + .is_charging_done = sgm41513_is_charging_done, + .set_eoc_current = sgm41513_set_iterm, + .enable_termination = sgm41513_enable_te, + .reset_eoc_state = NULL, + .get_min_charging_current = sgm41513_get_min_ichg, + .get_min_input_current = sgm41513_get_min_aicr, + + /* Safety timer */ + .enable_safety_timer = sgm41513_set_safety_timer, + .is_safety_timer_enabled = sgm41513_is_safety_timer_enabled, + + /* Power path */ + .enable_powerpath = NULL, + .is_powerpath_enabled = NULL, + + /* OTG */ + .enable_otg = sgm41513_set_otg, + .set_boost_current_limit = sgm41513_set_boost_ilmt, + .enable_discharge = NULL, + + /* PE+/PE+20 */ + .send_ta_current_pattern = NULL, + .set_pe20_efficiency_table = NULL, + .send_ta20_current_pattern = NULL, + .enable_cable_drop_comp = NULL, + + /* ADC */ + .get_tchg_adc = NULL, + /* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 start */ + + .get_ibus_adc = sgm41513_get_ibus, + /* hs14 code for SR-AL6528A-01-322 by wenyaqi at 2022/09/15 end */ + + /* Event */ + .event = sgm41513_do_event, + + /* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 start */ + .set_hiz_mode = sgm41513_set_hiz_mode, + .get_hiz_mode = sgm41513_get_hiz_mode, + /* hs14 code for SR-AL6528A-01-299 by gaozhengwei at 2022/09/02 end */ + + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 start*/ + .get_ship_mode = sgm41513_get_shipmode, + .set_ship_mode = sgm41513_set_shipmode, + /* hs14 code for SR-AL6528A-01-259 by zhouyuhang at 2022/09/15 end*/ + + /* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 start*/ + .get_chr_status = sgm41513_get_charging_status, + /* hs14 code for SR-AL6528A-01-339 by shanxinkai at 2022/09/30 end*/ + + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 start */ + .get_vbus_status = sgm41513_get_vbus_status, + .dynamic_set_hwovp_threshold = sgm41513_dynamic_set_hwovp_threshold, + /* hs14 code for AL6528ADEU-580 by gaozhengwei at 2022/10/09 end */ + + /* hs14 code for SR-AL6528A-01-255 by wenyaqi at 2022/10/26 start */ + /* charger type detection */ + .enable_chg_type_det = sgm41513_enable_chg_type_det, + /* hs14 code for SR-AL6528A-01-255 by wenyaqi at 2022/10/26 end */ + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ + .bypass_chgdet = sgm41513_bypass_chgdet, + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ +}; + +static struct of_device_id sgm41513_charger_match_table[] = { + { + .compatible = "sgm41513", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, sgm41513_charger_match_table); + +static int sgm41513_charger_remove(struct i2c_client *client); +static int sgm41513_charger_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct sgm41513 *sgm; + const struct of_device_id *match; + struct device_node *node = client->dev.of_node; + + int ret = 0; + + sgm = devm_kzalloc(&client->dev, sizeof(struct sgm41513), GFP_KERNEL); + if (!sgm) + return -ENOMEM; + + client->addr = 0x1A; + sgm->dev = &client->dev; + sgm->client = client; + + i2c_set_clientdata(client, sgm); + + mutex_init(&sgm->i2c_rw_lock); + + ret = sgm41513_detect_device(sgm); + if (ret) { + pr_err("No sgm41513 device found!\n"); + return -ENODEV; + } + + match = of_match_node(sgm41513_charger_match_table, node); + if (match == NULL) { + pr_err("device tree match not found\n"); + return -EINVAL; + } + + if (sgm->part_no == 0x01) + { + pr_info("SGM41513 part number match success \n"); + } else { + pr_info("SGM41513 part number match fail \n"); + sgm41513_charger_remove(client); + return -EINVAL; + } + + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + INIT_DELAYED_WORK(&sgm->psy_dwork, sgm41513_inform_psy_dwork_handler); + INIT_DELAYED_WORK(&sgm->prob_dwork, sgm41513_inform_prob_dwork_handler); + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + INIT_DELAYED_WORK(&sgm->charge_detect_delayed_work, sgm41513_charger_detect_work_func); + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 start */ + sgm->bypass_chgdet_en = false; + /* hs14 code for P221116-03489 by wenyaqi at 2022/11/23 end */ + + sgm->platform_data = sgm41513_parse_dt(node, sgm); + + if (!sgm->platform_data) { + pr_err("No platform data provided.\n"); + return -EINVAL; + } + + ret = sgm41513_init_device(sgm); + if (ret) { + pr_err("Failed to init device\n"); + return ret; + } + + sgm41513_register_interrupt(sgm); + + + pr_err("%s sgm->chg_dev_name = %s" ,__func__ ,sgm->chg_dev_name); + sgm->chg_dev = charger_device_register(sgm->chg_dev_name, + &client->dev, sgm, + &sgm41513_chg_ops, + &sgm41513_chg_props); + if (IS_ERR_OR_NULL(sgm->chg_dev)) { + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + cancel_delayed_work_sync(&sgm->prob_dwork); + cancel_delayed_work_sync(&sgm->psy_dwork); + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + ret = PTR_ERR(sgm->chg_dev); + return ret; + } + + ret = sysfs_create_group(&sgm->dev->kobj, &sgm41513_attr_group); + if (ret) + dev_err(sgm->dev, "failed to register sysfs. err: %d\n", ret); + + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + Charger_Detect_Init(); + + mod_delayed_work(system_wq, &sgm->prob_dwork, + msecs_to_jiffies(2*1000)); + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + + pr_err("sgm41513 probe successfully, Part Num:%d\n!", + sgm->part_no); + + /* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 start */ + chg_info = SGM41513; + /* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 end */ + + return ret; +/* AL6528A code for SR-AL6528A-01-303 by wenyaqi at 2022/08/31 end */ +} + +static int sgm41513_charger_remove(struct i2c_client *client) +{ + struct sgm41513 *sgm = i2c_get_clientdata(client); + + mutex_destroy(&sgm->i2c_rw_lock); + + sysfs_remove_group(&sgm->dev->kobj, &sgm41513_attr_group); + + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + cancel_delayed_work_sync(&sgm->charge_detect_delayed_work); + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ + cancel_delayed_work_sync(&sgm->prob_dwork); + cancel_delayed_work_sync(&sgm->psy_dwork); + /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + + return 0; +} + +static void sgm41513_charger_shutdown(struct i2c_client *client) +{ + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 start */ + struct sgm41513 *sgm = i2c_get_clientdata(client); + + mutex_destroy(&sgm->i2c_rw_lock); + + sysfs_remove_group(&sgm->dev->kobj, &sgm41513_attr_group); + + cancel_delayed_work_sync(&sgm->charge_detect_delayed_work); + cancel_delayed_work_sync(&sgm->prob_dwork); + cancel_delayed_work_sync(&sgm->psy_dwork); + /* hs14 code for AL6528A-1033 by gaozhengwei at 2022/12/09 end */ +} + +static struct i2c_driver sgm41513_charger_driver = { + .driver = { + .name = "sgm41513-charger", + .owner = THIS_MODULE, + .of_match_table = sgm41513_charger_match_table, + }, + + .probe = sgm41513_charger_probe, + .remove = sgm41513_charger_remove, + .shutdown = sgm41513_charger_shutdown, + +}; + +module_i2c_driver(sgm41513_charger_driver); + +MODULE_DESCRIPTION("SGM41513 Charger Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("SGM"); \ No newline at end of file diff --git a/drivers/power/supply/mediatek/charger/sgm41513_reg.h b/drivers/power/supply/mediatek/charger/sgm41513_reg.h new file mode 100644 index 000000000000..bb16d6da68c4 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/sgm41513_reg.h @@ -0,0 +1,340 @@ +/* + * SGM41513 battery charging driver + * + * Copyright (C) 2022 SGM + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef __SGM41513_HEADER__ +#define __SGM41513_HEADER__ + +/* Register 00h */ +#define SGM41513_REG_00 0x00 +#define REG00_ENHIZ_MASK 0x80 +#define REG00_ENHIZ_SHIFT 7 +#define REG00_HIZ_ENABLE 1 +#define REG00_HIZ_DISABLE 0 + +#define REG00_STAT_CTRL_MASK 0x60 +#define REG00_STAT_CTRL_SHIFT 5 +#define REG00_STAT_CTRL_STAT 0 +#define REG00_STAT_CTRL_ICHG 1 +#define REG00_STAT_CTRL_IINDPM 2 +#define REG00_STAT_CTRL_DISABLE 3 + +#define REG00_IINLIM_MASK 0x1F +#define REG00_IINLIM_SHIFT 0 +#define REG00_IINLIM_LSB 100 +#define REG00_IINLIM_BASE 100 + +/* Register 01h */ +#define SGM41513_REG_01 0x01 +#define REG01_PFM_DIS_MASK 0x80 +#define REG01_PFM_DIS_SHIFT 7 +#define REG01_PFM_ENABLE 0 +#define REG01_PFM_DISABLE 1 + +#define REG01_WDT_RESET_MASK 0x40 +#define REG01_WDT_RESET_SHIFT 6 +#define REG01_WDT_RESET 1 + +#define REG01_OTG_CONFIG_MASK 0x20 +#define REG01_OTG_CONFIG_SHIFT 5 +#define REG01_OTG_ENABLE 1 +#define REG01_OTG_DISABLE 0 + +#define REG01_CHG_CONFIG_MASK 0x10 +#define REG01_CHG_CONFIG_SHIFT 4 +#define REG01_CHG_DISABLE 0 +#define REG01_CHG_ENABLE 1 + +#define REG01_SYS_MINV_MASK 0x0E +#define REG01_SYS_MINV_SHIFT 1 + +#define REG01_MIN_VBAT_SEL_MASK 0x01 +#define REG01_MIN_VBAT_SEL_SHIFT 0 +#define REG01_MIN_VBAT_2P8V 0 +#define REG01_MIN_VBAT_2P5V 1 + +/* Register 0x02*/ +#define SGM41513_REG_02 0x02 +#define REG02_BOOST_LIM_MASK 0x80 +#define REG02_BOOST_LIM_SHIFT 7 +#define REG02_BOOST_LIM_0P5A 0 +#define REG02_BOOST_LIM_1P2A 1 +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#define REG02_EN_HVDCP_SHIFT 3 +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ + +#define REG02_Q1_FULLON_MASK 0x40 +#define REG02_Q1_FULLON_SHIFT 6 +#define REG02_Q1_FULLON_ENABLE 1 +#define REG02_Q1_FULLON_DISABLE 0 + +#define REG02_ICHG_MASK 0x3F +#define REG02_ICHG_SHIFT 0 +#define REG02_ICHG_BASE 0 +#define REG02_ICHG_LSB 5 + +/* Register 0x03*/ +#define SGM41513_REG_03 0x03 +#define REG03_IPRECHG_MASK 0xF0 +#define REG03_IPRECHG_SHIFT 4 +#define REG03_IPRECHG_BASE 60 +#define REG03_IPRECHG_LSB 60 + +#define REG03_ITERM_MASK 0x0F +#define REG03_ITERM_SHIFT 0 +#define REG03_ITERM_BASE 60 +#define REG03_ITERM_LSB 60 + +/* Register 0x04*/ +#define SGM41513_REG_04 0x04 +#define REG04_VREG_MASK 0xF8 +#define REG04_VREG_SHIFT 3 +#define REG04_VREG_BASE 3856 +#define REG04_VREG_LSB 32 + +#define REG04_TOPOFF_TIMER_MASK 0x06 +#define REG04_TOPOFF_TIMER_SHIFT 1 +#define REG04_TOPOFF_TIMER_DISABLE 0 +#define REG04_TOPOFF_TIMER_15M 1 +#define REG04_TOPOFF_TIMER_30M 2 +#define REG04_TOPOFF_TIMER_45M 3 + + +#define REG04_VRECHG_MASK 0x01 +#define REG04_VRECHG_SHIFT 0 +#define REG04_VRECHG_100MV 0 +#define REG04_VRECHG_200MV 1 + +/* Register 0x05*/ +#define SGM41513_REG_05 0x05 +#define REG05_EN_TERM_MASK 0x80 +#define REG05_EN_TERM_SHIFT 7 +#define REG05_TERM_ENABLE 1 +#define REG05_TERM_DISABLE 0 + +#define REG05_WDT_MASK 0x30 +#define REG05_WDT_SHIFT 4 +#define REG05_WDT_DISABLE 0 +#define REG05_WDT_40S 1 +#define REG05_WDT_80S 2 +#define REG05_WDT_160S 3 +#define REG05_WDT_BASE 0 +#define REG05_WDT_LSB 40 + +#define REG05_EN_TIMER_MASK 0x08 +#define REG05_EN_TIMER_SHIFT 3 +#define REG05_CHG_TIMER_ENABLE 1 +#define REG05_CHG_TIMER_DISABLE 0 + +#define REG05_CHG_TIMER_MASK 0x04 +#define REG05_CHG_TIMER_SHIFT 2 +#define REG05_CHG_TIMER_5HOURS 0 +#define REG05_CHG_TIMER_10HOURS 1 + +#define REG05_TREG_MASK 0x02 +#define REG05_TREG_SHIFT 1 +#define REG05_TREG_90C 0 +#define REG05_TREG_110C 1 + +#define REG05_JEITA_ISET_MASK 0x01 +#define REG05_JEITA_ISET_SHIFT 0 +#define REG05_JEITA_ISET_50PCT 0 +#define REG05_JEITA_ISET_20PCT 1 + + +/* Register 0x06*/ +#define SGM41513_REG_06 0x06 +#define REG06_OVP_MASK 0xC0 +#define REG06_OVP_SHIFT 0x6 +#define REG06_OVP_5P5V 0 +#define REG06_OVP_6P5V 1 +#define REG06_OVP_10P5V 2 +#define REG06_OVP_14P0V 3 + +#define REG06_BOOSTV_MASK 0x30 +#define REG06_BOOSTV_SHIFT 4 +#define REG06_BOOSTV_4P85V 0 +#define REG06_BOOSTV_5V 1 +#define REG06_BOOSTV_5P15V 2 +#define REG06_BOOSTV_5P3V 3 + +#define REG06_VINDPM_MASK 0x0F +#define REG06_VINDPM_SHIFT 0 +#define REG06_VINDPM_BASE 3900 +#define REG06_VINDPM_LSB 100 + +/* Register 0x07*/ +#define SGM41513_REG_07 0x07 +#define REG07_FORCE_DPDM_MASK 0x80 +#define REG07_FORCE_DPDM_SHIFT 7 +#define REG07_FORCE_DPDM 1 + +#define REG07_TMR2X_EN_MASK 0x40 +#define REG07_TMR2X_EN_SHIFT 6 +#define REG07_TMR2X_ENABLE 1 +#define REG07_TMR2X_DISABLE 0 + +#define REG07_BATFET_DIS_MASK 0x20 +#define REG07_BATFET_DIS_SHIFT 5 +#define REG07_BATFET_OFF 1 +#define REG07_BATFET_ON 0 + +#define REG07_JEITA_VSET_MASK 0x10 +#define REG07_JEITA_VSET_SHIFT 4 +#define REG07_JEITA_VSET_4100 0 +#define REG07_JEITA_VSET_VREG 1 + +#define REG07_BATFET_DLY_MASK 0x08 +#define REG07_BATFET_DLY_SHIFT 3 +#define REG07_BATFET_DLY_0S 0 +#define REG07_BATFET_DLY_10S 1 + +#define REG07_BATFET_RST_EN_MASK 0x04 +#define REG07_BATFET_RST_EN_SHIFT 2 +#define REG07_BATFET_RST_DISABLE 0 +#define REG07_BATFET_RST_ENABLE 1 + +#define REG07_VDPM_BAT_TRACK_MASK 0x03 +#define REG07_VDPM_BAT_TRACK_SHIFT 0 +#define REG07_VDPM_BAT_TRACK_DISABLE 0 +#define REG07_VDPM_BAT_TRACK_200MV 1 +#define REG07_VDPM_BAT_TRACK_250MV 2 +#define REG07_VDPM_BAT_TRACK_300MV 3 + +/* Register 0x08*/ +#define SGM41513_REG_08 0x08 +#define REG08_VBUS_STAT_MASK 0xE0 +#define REG08_VBUS_STAT_SHIFT 5 +#define REG08_VBUS_TYPE_NONE 0 +#define REG08_VBUS_TYPE_SDP 0x01 +#define REG08_VBUS_TYPE_CDP 0x02 +#define REG08_VBUS_TYPE_DCP 0x03 +#define REG08_VBUS_TYPE_UNKNOWN 0x05 +#define REG08_VBUS_TYPE_NON_STD 0x06 +#define REG08_VBUS_TYPE_OTG 0x07 + +#define REG08_VBUS_TYPE_USB 1 +#define REG08_VBUS_TYPE_ADAPTER 3 + +#define REG08_CHRG_STAT_MASK 0x18 +#define REG08_CHRG_STAT_SHIFT 3 +#define REG08_CHRG_STAT_IDLE 0 +#define REG08_CHRG_STAT_PRECHG 1 +#define REG08_CHRG_STAT_FASTCHG 2 +#define REG08_CHRG_STAT_CHGDONE 3 + +#define REG08_PG_STAT_MASK 0x04 +#define REG08_PG_STAT_SHIFT 2 +#define REG08_POWER_GOOD 1 + +#define REG08_THERM_STAT_MASK 0x02 +#define REG08_THERM_STAT_SHIFT 1 + +#define REG08_VSYS_STAT_MASK 0x01 +#define REG08_VSYS_STAT_SHIFT 0 +#define REG08_IN_VSYS_STAT 1 + +/* Register 0x09*/ +#define SGM41513_REG_09 0x09 +#define REG09_FAULT_WDT_MASK 0x80 +#define REG09_FAULT_WDT_SHIFT 7 +#define REG09_FAULT_WDT 1 + +#define REG09_FAULT_BOOST_MASK 0x40 +#define REG09_FAULT_BOOST_SHIFT 6 + +#define REG09_FAULT_CHRG_MASK 0x30 +#define REG09_FAULT_CHRG_SHIFT 4 +#define REG09_FAULT_CHRG_NORMAL 0 +#define REG09_FAULT_CHRG_INPUT 1 +#define REG09_FAULT_CHRG_THERMAL 2 +#define REG09_FAULT_CHRG_TIMER 3 + +#define REG09_FAULT_BAT_MASK 0x08 +#define REG09_FAULT_BAT_SHIFT 3 +#define REG09_FAULT_BAT_OVP 1 + +#define REG09_FAULT_NTC_MASK 0x07 +#define REG09_FAULT_NTC_SHIFT 0 +#define REG09_FAULT_NTC_NORMAL 0 +#define REG09_FAULT_NTC_WARM 2 +#define REG09_FAULT_NTC_COOL 3 +#define REG09_FAULT_NTC_COLD 5 +#define REG09_FAULT_NTC_HOT 6 + +/* Register 0x0A */ +#define SGM41513_REG_0A 0x0A +#define REG0A_VBUS_GD_MASK 0x80 +#define REG0A_VBUS_GD_SHIFT 7 +#define REG0A_VBUS_GD 1 + +#define REG0A_VINDPM_STAT_MASK 0x40 +#define REG0A_VINDPM_STAT_SHIFT 6 +#define REG0A_VINDPM_ACTIVE 1 + +#define REG0A_IINDPM_STAT_MASK 0x20 +#define REG0A_IINDPM_STAT_SHIFT 5 +#define REG0A_IINDPM_ACTIVE 1 + +#define REG0A_TOPOFF_ACTIVE_MASK 0x08 +#define REG0A_TOPOFF_ACTIVE_SHIFT 3 +#define REG0A_TOPOFF_ACTIVE 1 + +#define REG0A_ACOV_STAT_MASK 0x04 +#define REG0A_ACOV_STAT_SHIFT 2 +#define REG0A_ACOV_ACTIVE 1 + +#define REG0A_VINDPM_INT_MASK 0x02 +#define REG0A_VINDPM_INT_SHIFT 1 +#define REG0A_VINDPM_INT_ENABLE 0 +#define REG0A_VINDPM_INT_DISABLE 1 + +#define REG0A_IINDPM_INT_MASK 0x01 +#define REG0A_IINDPM_INT_SHIFT 0 +#define REG0A_IINDPM_INT_ENABLE 0 +#define REG0A_IINDPM_INT_DISABLE 1 + +#define REG0A_INT_MASK_MASK 0x03 +#define REG0A_INT_MASK_SHIFT 0 + +#define SGM41513_REG_0B 0x0B +#define REG0B_REG_RESET_MASK 0x80 +#define REG0B_REG_RESET_SHIFT 7 +#define REG0B_REG_RESET 1 + +#define REG0B_PN_MASK 0x78 +#define REG0B_PN_SHIFT 3 + +#define REG0B_SGMPART_MASK 0x04 +#define REG0B_SGMPART_SHIFT 2 + +#define REG0B_DEV_REV_MASK 0x03 +#define REG0B_DEV_REV_SHIFT 0 + +#define SGM41513_REG_0C 0x0C +#define REG0C_RESERVED_MASK 0xFF +#define REG0C_RESERVED_SHIFT 0 + +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ +#define SGM41513_INPUT_DET 0x0e +#define SGM41513_DPDM_ONGOING BIT(7) +/* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 end */ + +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 start */ +#define SGM41513_CHRG_CTRL_d 0x0d + +/* DP DM SEL */ +#define SGM41513_DP_VSEL_MASK 0x18 +#define SGM41513_DM_VSEL_MASK 0x06 +/* hs14 code for SR-AL6528A-01-321 by gaozhengwei at 2022/09/22 end */ +#endif \ No newline at end of file diff --git a/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.c b/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.c new file mode 100644 index 000000000000..37202f9de1fc --- /dev/null +++ b/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.c @@ -0,0 +1,454 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#include /* For init/exit macros */ +#include /* For MODULE_ marcros */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "mtk_gauge_time_service.h" + + +static struct list_head gtimer_head = LIST_HEAD_INIT(gtimer_head); + +static bool gtimer_thread_timeout; +static int ftlog_level; + +static struct mutex gtimer_lock; +static spinlock_t slock; +static struct wakeup_source *wlock; +static wait_queue_head_t wait_que; +static struct hrtimer gtimer_kthread_timer; +static struct timespec gtimer_suspend_time; + +#define FTLOG_ERROR_LEVEL 1 +#define FTLOG_DEBUG_LEVEL 2 +#define FTLOG_TRACE_LEVEL 3 + +#define ft_err(fmt, args...) \ +do { \ + if (ftlog_level >= FTLOG_ERROR_LEVEL) { \ + pr_notice(fmt, ##args); \ + } \ +} while (0) + +#define ft_debug(fmt, args...) \ +do { \ + if (ftlog_level >= FTLOG_DEBUG_LEVEL) { \ + pr_notice(fmt, ##args); \ + } \ +} while (0) + +#define ft_trace(fmt, args...)\ +do { \ + if (ftlog_level >= FTLOG_TRACE_LEVEL) { \ + pr_notice(fmt, ##args);\ + } \ +} while (0) + +#define ft_info(fmt, args...)\ +do { \ +} while (0) + + +void mutex_gtimer_lock(void) +{ + mutex_lock(>imer_lock); +} + +void mutex_gtimer_unlock(void) +{ + mutex_unlock(>imer_lock); +} + +void gtimer_set_log_level(int x) +{ + ftlog_level = x; +} + +void gtimer_dump_list(void) +{ + struct list_head *pos; + struct list_head *phead = >imer_head; + struct gtimer *ptr; + struct timespec time_now; + + mutex_gtimer_lock(); + get_monotonic_boottime(&time_now); + + ft_debug("dump gtimer list start %ld\n", time_now.tv_sec); + list_for_each(pos, phead) { + ptr = container_of(pos, struct gtimer, list); + ft_debug("dump list name:%s time:%ld int:%d\n", ptr->name, + ptr->endtime.tv_sec, ptr->interval); + } + ft_debug("dump list end\n"); + mutex_gtimer_unlock(); +} + +void wake_up_gtimer(void) +{ + unsigned long flags; + + spin_lock_irqsave(&slock, flags); + if (wlock->active == 0) + __pm_stay_awake(wlock); + spin_unlock_irqrestore(&slock, flags); + + gtimer_thread_timeout = true; + wake_up(&wait_que); + ft_debug("%s\n", __func__); +} + +void gtimer_start_timer(int sec) +{ + ktime_t ktime = ktime_set(sec, 0); + + ft_debug("%s %d", + __func__, + sec); + hrtimer_start(>imer_kthread_timer, ktime, HRTIMER_MODE_REL); +} + +void gtimer_init(struct gtimer *timer, struct device *dev, char *name) +{ + timer->name = name; + INIT_LIST_HEAD(&timer->list); + timer->dev = dev; +} + +void gtimer_start(struct gtimer *timer, int sec) +{ + struct list_head *pos; + struct list_head *phead = >imer_head; + struct gtimer *ptr; + struct timespec time, time_now; + bool wakeup = false; + int time_interval; + + mutex_gtimer_lock(); + + hrtimer_cancel(>imer_kthread_timer); + + time.tv_sec = sec; + time.tv_nsec = 0; + timer->interval = sec; + + get_monotonic_boottime(&time_now); + + timer->endtime = timespec_add(time_now, time); + + ft_debug("%s dev:%s name:%s %ld %ld %d\n", + __func__, + dev_name(timer->dev), timer->name, + time_now.tv_sec, timer->endtime.tv_sec, sec); + + if (list_empty(&timer->list) != true) { + ft_debug("%s dev:%s name:%s time:%ld %ld int:%d is not empty\n", + __func__, + dev_name(timer->dev), timer->name, + time_now.tv_sec, timer->endtime.tv_sec, sec); + list_del_init(&timer->list); + } + + list_for_each(pos, phead) { + ptr = container_of(pos, struct gtimer, list); + if (timespec_compare(&timer->endtime, &ptr->endtime) < 0) + break; + } + + list_add(&timer->list, pos->prev); + + pos = gtimer_head.next; + if (list_empty(pos) != true) { + ptr = container_of(pos, struct gtimer, list); + if (timespec_compare(&ptr->endtime, &time_now) < 0) + wakeup = true; + else { + time = timespec_sub(ptr->endtime, time_now); + if (time.tv_sec < 1) + time_interval = 1; + else + time_interval = time.tv_sec; + gtimer_start_timer(time_interval); + } + } + mutex_gtimer_unlock(); + + if (wakeup == true) + wake_up_gtimer(); + +} + +void gtimer_stop(struct gtimer *timer) +{ + mutex_gtimer_lock(); + if (list_empty(&timer->list) != true) + list_del_init(&timer->list); + mutex_gtimer_unlock(); +} + + +static void gtimer_handler(void) +{ + struct list_head *pos = gtimer_head.next; + struct list_head *phead = >imer_head; + struct gtimer *ptr; + struct timespec time; + int time_interval; + + hrtimer_cancel(>imer_kthread_timer); + + ft_info("%s\n", __func__); + for (pos = phead->next; pos != phead;) { + struct list_head *ptmp; + + get_monotonic_boottime(&time); + ptr = container_of(pos, struct gtimer, list); + + ft_info("%s name:%s %ld %ld %d %d\n", + __func__, + ptr->name, time.tv_sec, + ptr->endtime.tv_sec, ptr->interval, + timespec_compare(&time, &ptr->endtime)); + + if (timespec_compare(&time, &ptr->endtime) >= 0) { + ptmp = pos; + pos = pos->next; + list_del_init(ptmp); + ft_debug("%s name:%s %ld %d\n", + __func__, + ptr->name, + ptr->endtime.tv_sec, ptr->interval); + if (ptr->callback) { + mutex_gtimer_unlock(); + ptr->callback(ptr); + mutex_gtimer_lock(); + pos = gtimer_head.next; + } + } else + pos = pos->next; + } + + pos = gtimer_head.next; + if (list_empty(pos) != true) { + ptr = container_of(pos, struct gtimer, list); + + time = timespec_sub(ptr->endtime, time); + if (time.tv_sec < 1) + time_interval = 1; + else + time_interval = time.tv_sec; + gtimer_start_timer(time_interval); + } +} + + +static int gtimer_thread(void *arg) +{ + unsigned long flags; + struct timespec stime, endtime, duraction; + + while (1) { + wait_event(wait_que, (gtimer_thread_timeout == true)); + gtimer_thread_timeout = false; + get_monotonic_boottime(&stime); + mutex_gtimer_lock(); + + gtimer_handler(); + + spin_lock_irqsave(&slock, flags); + __pm_relax(wlock); + spin_unlock_irqrestore(&slock, flags); + + mutex_gtimer_unlock(); + get_monotonic_boottime(&endtime); + duraction = timespec_sub(endtime, stime); + if (duraction.tv_sec == -56789) + return 0; + } + + return 0; +} + + +static void gtimer_suspend(void) +{ + ft_err("%s\n", __func__); + hrtimer_cancel(>imer_kthread_timer); +} + +static void gtimer_resume(void) +{ + struct list_head *pos = gtimer_head.next; + struct gtimer *ptr; + struct timespec time, diff; + int time_interval; + + get_monotonic_boottime(&time); + ft_err("%s %ld\n", + __func__, + time.tv_sec); + gtimer_dump_list(); + + pos = gtimer_head.next; + if (list_empty(pos) != true) { + ptr = container_of(pos, struct gtimer, list); + + if (timespec_compare(&time, &ptr->endtime) >= 0) { + ft_err("%s now:%ld expired:%s %ld\n", + __func__, + time.tv_sec, + ptr->name, ptr->endtime.tv_sec); + wake_up_gtimer(); + } else { + diff = timespec_sub(ptr->endtime, time); + if (diff.tv_sec < 1) + time_interval = 1; + else + time_interval = diff.tv_sec; + gtimer_start_timer(time_interval); + } + } + +} + +static int gtimer_pm_event( + struct notifier_block *notifier, unsigned long pm_event, void *unused) +{ + switch (pm_event) { + case PM_HIBERNATION_PREPARE: /* Going to hibernate */ + case PM_RESTORE_PREPARE: /* Going to restore a saved image */ + case PM_SUSPEND_PREPARE: /* Going to suspend the system */ + get_monotonic_boottime(>imer_suspend_time); + ft_err("[%s] pm_event %lu %ld\n", + __func__, pm_event, + gtimer_suspend_time.tv_sec); + gtimer_suspend(); + return NOTIFY_DONE; + + case PM_POST_SUSPEND: /* Suspend finished */ + case PM_POST_RESTORE: /* Restore failed */ + ft_err("[%s] pm_event %lu\n", __func__, pm_event); + gtimer_resume(); + return NOTIFY_DONE; + + case PM_POST_HIBERNATION: /* Hibernation finished */ + ft_err("[%s] pm_event %lu\n", __func__, pm_event); + + + return NOTIFY_DONE; + } + return NOTIFY_OK; +} + +static struct notifier_block gtimer_pm_notifier_block = { + .notifier_call = gtimer_pm_event, + .priority = 0, +}; + +enum hrtimer_restart gtimer_kthread_hrtimer_func(struct hrtimer *timer) +{ + wake_up_gtimer(); + return HRTIMER_NORESTART; +} + +signed int get_dynamic_period( + int first_use, int first_wakeup_time, int battery_capacity_level) +{ + struct timespec duraction; + struct list_head *pos = gtimer_head.next; + struct gtimer *ptr; + signed int sec = 4800; + + pos = gtimer_head.next; + if (list_empty(pos) != true) { + ptr = container_of(pos, struct gtimer, list); + + duraction = timespec_sub(ptr->endtime, gtimer_suspend_time); + sec = duraction.tv_sec + 1; + if (sec <= 10) + sec = 10; + ft_err("%s time:now:%ld next:%ld diff:%d\n", + __func__, + gtimer_suspend_time.tv_sec, ptr->endtime.tv_sec, sec); + } else + ft_err("%s time:%d\n", + __func__, + sec); + + return sec; +} + + +static int gauge_timer_service_probe(struct platform_device *pdev) +{ + mutex_init(>imer_lock); + spin_lock_init(&slock); + wlock = wakeup_source_register(NULL, "gtime timer wakelock"); + init_waitqueue_head(&wait_que); + + + hrtimer_init(>imer_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + gtimer_kthread_timer.function = gtimer_kthread_hrtimer_func; + + kthread_run(gtimer_thread, NULL, "gauge_timer_thread"); + + register_pm_notifier(>imer_pm_notifier_block); + + return 0; +} + +static int gauge_timer_service_remove(struct platform_device *pdev) +{ + struct mt6355_gauge *mt = platform_get_drvdata(pdev); + + if (mt) + devm_kfree(&pdev->dev, mt); + return 0; +} + +static void gauge_timer_service_shutdown(struct platform_device *dev) +{ +} + + +static const struct of_device_id gauge_timer_service_of_match[] = { + {.compatible = "mediatek,gauge_timer_service",}, + {}, +}; + +MODULE_DEVICE_TABLE(of, gauge_timer_service_of_match); + +static struct platform_driver gauge_timer_service_driver = { + .probe = gauge_timer_service_probe, + .remove = gauge_timer_service_remove, + .shutdown = gauge_timer_service_shutdown, + .driver = { + .name = "gauge_timer_service", + .of_match_table = gauge_timer_service_of_match, + }, +}; + +static int __init gauge_timer_service_init(void) +{ + return platform_driver_register(&gauge_timer_service_driver); +} +device_initcall(gauge_timer_service_init); + +static void __exit gauge_timer_service_exit(void) +{ + platform_driver_unregister(&gauge_timer_service_driver); +} +module_exit(gauge_timer_service_exit); + +MODULE_AUTHOR("wy.chuang "); +MODULE_DESCRIPTION("MTK Gauge time service Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.h b/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.h new file mode 100644 index 000000000000..5c1553575208 --- /dev/null +++ b/drivers/power/supply/mediatek/misc/mtk_gauge_time_service.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. +*/ + +#ifndef __MTK_GAUGE_TIME_SERVICE_INTF_H__ +#define __MTK_GAUGE_TIME_SERVICE_INTF_H__ + +struct gtimer { + char *name; + struct device *dev; + struct timespec endtime; + int interval; + + int (*callback)(struct gtimer *gt); + struct list_head list; +}; + +extern void gtimer_init(struct gtimer *timer, struct device *dev, char *name); +extern void gtimer_start(struct gtimer *timer, int sec); +extern void gtimer_stop(struct gtimer *timer); +extern void gtimer_dump_list(void); +extern void gtimer_set_log_level(int x); + + +#endif /* __MTK_GAUGE_TIME_SERVICE_INTF_H__ */ \ No newline at end of file diff --git a/include/linux/chg-tcpc_info.h b/include/linux/chg-tcpc_info.h new file mode 100644 index 000000000000..099d8e9f028e --- /dev/null +++ b/include/linux/chg-tcpc_info.h @@ -0,0 +1,30 @@ +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 start */ +#ifndef _LINUX_CHG_TCPC_INFO_H +#define _LINUX_CHG_TCPC_INFO_H + +enum chg_ic_supplier { + UNKNOWN_CHG, + SGM41513, + UPM6910, + SC89601, + ETA6963, + SY6970, + BQ25601, + RT9467, + SC89890H, + SGM41511, + SGM41541, +}; + +enum tcpc_cc_supplier { + UNKNOWN_CC, + HUSB311, + FUSB302, + ET7304, + SGM7220, + WUSB3801, + FUSB301A, +}; + +#endif +/* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 end */ \ No newline at end of file From 5fc32fb1b961452b7559f74587bfa402223d3e7d Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 30 Apr 2026 21:02:25 +0300 Subject: [PATCH 09/22] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=D0=B0=20SGM?= =?UTF-8?q?41513?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/dts/mediatek/custom_common.dtsi | 22 +-- drivers/power/supply/Kconfig | 10 ++ drivers/power/supply/Makefile | 1 + .../supply/mediatek/charger/adapter_class.h | 147 ++++++++++++++++++ .../mediatek/charger/sgm41513_charger.c | 2 +- 5 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 drivers/power/supply/mediatek/charger/adapter_class.h diff --git a/arch/arm64/boot/dts/mediatek/custom_common.dtsi b/arch/arm64/boot/dts/mediatek/custom_common.dtsi index 5d148ca48503..1045a82f7ca2 100755 --- a/arch/arm64/boot/dts/mediatek/custom_common.dtsi +++ b/arch/arm64/boot/dts/mediatek/custom_common.dtsi @@ -585,17 +585,17 @@ charger1@1A { compatible = "sgm,sgm41513_charger"; reg = <0x1A>; - sgm,sgm41513,usb-vlim = <4600>; - sgm,sgm41513,usb-ilim = <2000>; - sgm,sgm41513,usb-vreg = <0x1130>; - sgm,sgm41513,usb-ichg = <2000>; - sgm,sgm41513,precharge-current = <180>; - sgm,sgm41513,termination-current = <240>; - sgm,sgm41513,boost-voltage = <5150>; - sgm,sgm41513,boost-current = <1200>; - sgm,sgm41513,enable_term; - sgm,sgm41513,stat-pin-ctrl = <3>; - sgm,sgm41513,vac-ovp-threshold = <6500>; + sgm41513,usb-vlim = <4600>; + sgm41513,usb-ilim = <2000>; + sgm41513,usb-vreg = <0x1130>; + sgm41513,usb-ichg = <2000>; + sgm41513,precharge-current = <180>; + sgm41513,termination-current = <240>; + sgm41513,boost-voltage = <5150>; + sgm41513,boost-current = <1200>; + sgm41513,enable_term; + sgm41513,stat-pin-ctrl = <3>; + sgm41513,vac-ovp-threshold = <6500>; }; charger@6B { diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig index b13df7b3f8d6..62c998cb8959 100644 --- a/drivers/power/supply/Kconfig +++ b/drivers/power/supply/Kconfig @@ -817,6 +817,16 @@ config CHARGER_BQ2560X It depends on the config MTK_CHARGER. +config CHARGER_SGM41513 + bool "CHARGER_SGM41513" + depends on MTK_CHARGER + help + Say Yes to enable + SGM SGM41513 battery charger driver. + It depends on + the config MTK_CHARGER. + + config CHARGER_CX7601 bool "CHARGER_CX7601" depends on MTK_CHARGER diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile index f3116bccac40..909f0de6b246 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -90,6 +90,7 @@ obj-$(CONFIG_AXP288_CHARGER) += axp288_charger.o obj-$(CONFIG_CHARGER_CROS_USBPD) += cros_usbpd-charger.o obj-$(CONFIG_CHARGER_BQ25601) += bq25601.o obj-$(CONFIG_CHARGER_BQ2560X) += bq2560x_charger.o +obj-$(CONFIG_CHARGER_SGM41513) += sgm41513_charger.o obj-$(CONFIG_CHARGER_CX7601) += cx7601_charger.o obj-$(CONFIG_CHARGER_RT9458) += rt9458.o obj-$(CONFIG_CHARGER_RT9465) += rt9465.o diff --git a/drivers/power/supply/mediatek/charger/adapter_class.h b/drivers/power/supply/mediatek/charger/adapter_class.h new file mode 100644 index 000000000000..2e7d93fcc9b8 --- /dev/null +++ b/drivers/power/supply/mediatek/charger/adapter_class.h @@ -0,0 +1,147 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2019 MediaTek Inc. + */ + +#ifndef LINUX_POWER_ADAPTER_CLASS_H +#define LINUX_POWER_ADAPTER_CLASS_H + +#include +#include +#include + + +#define ADAPTER_CAP_MAX_NR 10 + +struct adapter_power_cap { + uint8_t selected_cap_idx; + uint8_t nr; + uint8_t pdp; + uint8_t pwr_limit[ADAPTER_CAP_MAX_NR]; + int max_mv[ADAPTER_CAP_MAX_NR]; + int min_mv[ADAPTER_CAP_MAX_NR]; + int ma[ADAPTER_CAP_MAX_NR]; + int maxwatt[ADAPTER_CAP_MAX_NR]; + int minwatt[ADAPTER_CAP_MAX_NR]; + uint8_t type[ADAPTER_CAP_MAX_NR]; + int info[ADAPTER_CAP_MAX_NR]; +}; + +enum adapter_type { + MTK_PD_ADAPTER, +}; + +enum adapter_event { + MTK_PD_CONNECT_NONE, + MTK_PD_CONNECT_HARD_RESET, + MTK_PD_CONNECT_PE_READY_SNK, + MTK_PD_CONNECT_PE_READY_SNK_PD30, + MTK_PD_CONNECT_PE_READY_SNK_APDO, + MTK_PD_CONNECT_TYPEC_ONLY_SNK, + MTK_TYPEC_WD_STATUS, + MTK_TYPEC_HRESET_STATUS, +}; + +enum adapter_property { + TYPEC_RP_LEVEL, + PD_TYPE, +}; + +enum adapter_cap_type { + MTK_PD_APDO_START, + MTK_PD_APDO_END, + MTK_PD, + MTK_PD_APDO, + MTK_CAP_TYPE_UNKNOWN, +}; + +enum adapter_return_value { + MTK_ADAPTER_OK = 0, + MTK_ADAPTER_NOT_SUPPORT, + MTK_ADAPTER_TIMEOUT, + MTK_ADAPTER_REJECT, + MTK_ADAPTER_ERROR, + MTK_ADAPTER_ADJUST, +}; + + +struct adapter_status { + int temperature; + bool ocp; + bool otp; + bool ovp; +}; + +struct adapter_properties { + const char *alias_name; +}; + +struct adapter_device { + struct adapter_properties props; + const struct adapter_ops *ops; + struct mutex ops_lock; + struct device dev; + struct srcu_notifier_head evt_nh; + void *driver_data; + +}; + +struct adapter_ops { + int (*suspend)(struct adapter_device *dev, pm_message_t state); + int (*resume)(struct adapter_device *dev); + int (*get_property)(struct adapter_device *dev, + enum adapter_property pro); + int (*get_status)(struct adapter_device *dev, + struct adapter_status *sta); + int (*set_cap)(struct adapter_device *dev, enum adapter_cap_type type, + int mV, int mA); + int (*get_cap)(struct adapter_device *dev, enum adapter_cap_type type, + struct adapter_power_cap *cap); + int (*get_output)(struct adapter_device *dev, int *mV, int *mA); + +}; + +static inline void *adapter_dev_get_drvdata( + const struct adapter_device *adapter_dev) +{ + return adapter_dev->driver_data; +} + +static inline void adapter_dev_set_drvdata( + struct adapter_device *adapter_dev, void *data) +{ + adapter_dev->driver_data = data; +} + +extern struct adapter_device *adapter_device_register( + const char *name, + struct device *parent, void *devdata, const struct adapter_ops *ops, + const struct adapter_properties *props); +extern void adapter_device_unregister( + struct adapter_device *adapter_dev); +extern int register_adapter_device_notifier(struct adapter_device *adapter_dev, + struct notifier_block *nb); +extern int unregister_adapter_device_notifier( + struct adapter_device *adapter_dev, + struct notifier_block *nb); +extern struct adapter_device *get_adapter_by_name( + const char *name); + +#define to_adapter_device(obj) container_of(obj, struct adapter_device, dev) + +extern int adapter_dev_get_property(struct adapter_device *adapter_dev, + enum adapter_property sta); +extern int adapter_dev_get_status(struct adapter_device *adapter_dev, + struct adapter_status *sta); +extern int adapter_dev_get_output(struct adapter_device *adapter_dev, + int *mV, int *mA); +extern int adapter_dev_set_cap(struct adapter_device *adapter_dev, + enum adapter_cap_type type, + int mV, int mA); +extern int adapter_dev_get_cap(struct adapter_device *adapter_dev, + enum adapter_cap_type type, + struct adapter_power_cap *cap); + + +#endif /*LINUX_POWER_ADAPTER_CLASS_H*/ + diff --git a/drivers/power/supply/mediatek/charger/sgm41513_charger.c b/drivers/power/supply/mediatek/charger/sgm41513_charger.c index 9e458970276e..e51a15ec5b7f 100644 --- a/drivers/power/supply/mediatek/charger/sgm41513_charger.c +++ b/drivers/power/supply/mediatek/charger/sgm41513_charger.c @@ -1707,7 +1707,7 @@ static struct charger_ops sgm41513_chg_ops = { static struct of_device_id sgm41513_charger_match_table[] = { { - .compatible = "sgm41513", + .compatible = "sgm,sgm41513_charger", }, {}, }; From bbb41535040e3d77ebba741e3496edd5193632dc Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 30 Apr 2026 21:25:49 +0300 Subject: [PATCH 10/22] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20Makefile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/power/supply/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile index 909f0de6b246..b2817b84dda7 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -3,6 +3,7 @@ subdir-ccflags-$(CONFIG_POWER_SUPPLY_DEBUG) := -DDEBUG subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/usb20 subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/typec/tcpc/inc subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/power_throttling +ccflags-y += -I$(src)/mediatek/charger power_supply-y := power_supply_core.o power_supply-$(CONFIG_SYSFS) += power_supply_sysfs.o @@ -90,7 +91,7 @@ obj-$(CONFIG_AXP288_CHARGER) += axp288_charger.o obj-$(CONFIG_CHARGER_CROS_USBPD) += cros_usbpd-charger.o obj-$(CONFIG_CHARGER_BQ25601) += bq25601.o obj-$(CONFIG_CHARGER_BQ2560X) += bq2560x_charger.o -obj-$(CONFIG_CHARGER_SGM41513) += sgm41513_charger.o +obj-$(CONFIG_CHARGER_SGM41513) += mediatek/charger/sgm41513_charger.o obj-$(CONFIG_CHARGER_CX7601) += cx7601_charger.o obj-$(CONFIG_CHARGER_RT9458) += rt9458.o obj-$(CONFIG_CHARGER_RT9465) += rt9465.o From 62818bb18c610e5e307634b91ba1ad7a5086ec8a Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 30 Apr 2026 21:39:09 +0300 Subject: [PATCH 11/22] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20Makefile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/power/supply/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile index b2817b84dda7..a0750b738a6b 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -3,7 +3,7 @@ subdir-ccflags-$(CONFIG_POWER_SUPPLY_DEBUG) := -DDEBUG subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/usb20 subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/typec/tcpc/inc subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/power_throttling -ccflags-y += -I$(src)/mediatek/charger +ccflags-y += -I$(src)/mediatek/charger -I$(src)/mediatek/misc power_supply-y := power_supply_core.o power_supply-$(CONFIG_SYSFS) += power_supply_sysfs.o From 663c8ae651d97240890ac25d7c8155dbce881c25 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 30 Apr 2026 21:56:25 +0300 Subject: [PATCH 12/22] =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D1=83=20=20chg=5Finfo=20=3D=20SGM41513?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/power/supply/mediatek/charger/sgm41513_charger.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/power/supply/mediatek/charger/sgm41513_charger.c b/drivers/power/supply/mediatek/charger/sgm41513_charger.c index e51a15ec5b7f..33bc3b5e5d20 100644 --- a/drivers/power/supply/mediatek/charger/sgm41513_charger.c +++ b/drivers/power/supply/mediatek/charger/sgm41513_charger.c @@ -1812,7 +1812,7 @@ static int sgm41513_charger_probe(struct i2c_client *client, sgm->part_no); /* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 start */ - chg_info = SGM41513; + //chg_info = SGM41513; /* hs14 code for SR-AL6528A-01-258 by shanxinkai at 2022/09/13 end */ return ret; From 940775cedc10d6a711c5d461138a36e4588548cd Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Fri, 1 May 2026 11:41:34 +0300 Subject: [PATCH 13/22] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83,=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D0=BC=D0=B5=D1=88=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D1=83=20=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../power/supply/mediatek/charger/sgm41513_charger.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/power/supply/mediatek/charger/sgm41513_charger.c b/drivers/power/supply/mediatek/charger/sgm41513_charger.c index 33bc3b5e5d20..f9d09173d367 100644 --- a/drivers/power/supply/mediatek/charger/sgm41513_charger.c +++ b/drivers/power/supply/mediatek/charger/sgm41513_charger.c @@ -1747,13 +1747,12 @@ static int sgm41513_charger_probe(struct i2c_client *client, return -EINVAL; } - if (sgm->part_no == 0x01) - { - pr_info("SGM41513 part number match success \n"); + pr_info("SGM41513 part_no read: 0x%02x (expected 0x01, check skipped - chip confirmed)\n", + sgm->part_no); + if (sgm->part_no == 0x01) { + pr_info("SGM41513 part number match success\n"); } else { - pr_info("SGM41513 part number match fail \n"); - sgm41513_charger_remove(client); - return -EINVAL; + pr_info("SGM41513 part number mismatch, but continuing (chip confirmed from working kernel)\n"); } /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ From 941967f90b5e81beaed8b377334e21408e9e4de4 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Fri, 1 May 2026 12:34:37 +0300 Subject: [PATCH 14/22] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=20SGM41513=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=B7=D0=B0=D0=B3=D0=BB?= =?UTF-8?q?=D1=83=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/power/supply/mediatek/charger/sgm41513_charger.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/power/supply/mediatek/charger/sgm41513_charger.c b/drivers/power/supply/mediatek/charger/sgm41513_charger.c index f9d09173d367..8e4fe9206af0 100644 --- a/drivers/power/supply/mediatek/charger/sgm41513_charger.c +++ b/drivers/power/supply/mediatek/charger/sgm41513_charger.c @@ -1747,12 +1747,13 @@ static int sgm41513_charger_probe(struct i2c_client *client, return -EINVAL; } - pr_info("SGM41513 part_no read: 0x%02x (expected 0x01, check skipped - chip confirmed)\n", - sgm->part_no); - if (sgm->part_no == 0x01) { + if (sgm->part_no == 0x00) + { pr_info("SGM41513 part number match success\n"); } else { - pr_info("SGM41513 part number mismatch, but continuing (chip confirmed from working kernel)\n"); + pr_err("SGM41513 part number match fail, part_no=0x%02x\n", sgm->part_no); + sgm41513_charger_remove(client); + return -EINVAL; } /* hs14 code for SR-AL6528A-01-306 by gaozhengwei at 2022/09/06 start */ From cfc6ef92757364f4789ddf05ca126d0c106ac7bd Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Fri, 1 May 2026 14:47:51 +0300 Subject: [PATCH 15/22] =?UTF-8?q?=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=20CX7601?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/configs/blossom_defconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index fe0761155831..0bc9031c8805 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -293,8 +293,8 @@ CONFIG_CHARGER_TYPE_MT6357=y CONFIG_MTK_CHARGER=y CONFIG_MTK_KERNEL_POWER_OFF_CHARGING=y CONFIG_CHARGER_BQ2560X=y -# CONFIG_CHARGER_ETA6963 is not set -# CONFIG_CHARGER_CX7601 is not set +CONFIG_CHARGER_ETA6963=y +CONFIG_CHARGER_CX7601=y CONFIG_CHARGER_SGM41513=y # CONFIG_HWMON is not set CONFIG_THERMAL=y From 4e8345baf68c4c99bad80f5328f5c34f224c5a74 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Fri, 1 May 2026 15:26:15 +0300 Subject: [PATCH 16/22] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BC=D1=8F=20=D1=8F=D0=B4=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/configs/blossom_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 0bc9031c8805..93c572ada1ca 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -1,4 +1,4 @@ -CONFIG_LOCALVERSION="-niigo-enanan-yoka" +CONFIG_LOCALVERSION="-niigo-enanan-yoka-fixed" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_PREEMPT=y # CONFIG_CPU_ISOLATION is not set From c6b0f8b8dc8b7d4c238346d90a4ec1c4acb1c412 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 7 May 2026 18:08:51 +0300 Subject: [PATCH 17/22] Update blossom_defconfig --- arch/arm64/configs/blossom_defconfig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 93c572ada1ca..7b8cbb340d9f 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -504,3 +504,13 @@ CONFIG_PANIC_TIMEOUT=1 CONFIG_FTRACE=y # CONFIG_TRACING_EVENTS_GPIO is not set # CONFIG_RUNTIME_TESTING_MENU is not set +# KernelSU +CONFIG_KSU=y +CONFIG_KPROBES=y +CONFIG_HAVE_KPROBES=y +CONFIG_KPROBE_EVENTS=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_HAVE_KPROBES=y +CONFIG_KPROBE_EVENTS=y +CONFIG_KALLSYMS_BASE_RELATIVE=y \ No newline at end of file From 27869c364561508f350d70763a83de226889b12e Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Thu, 7 May 2026 21:34:30 +0300 Subject: [PATCH 18/22] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=82=20=20CONFIG=5F?= =?UTF-8?q?KALLSYMS=5FBASE=5FRELATIVE=20=D0=B2=20blossom=5Fdefconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/configs/blossom_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 7b8cbb340d9f..17d47cf9344f 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -17,7 +17,6 @@ CONFIG_SCHED_TUNE=y CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y # CONFIG_SYSFS_SYSCALL is not set # CONFIG_FHANDLE is not set -# CONFIG_KALLSYMS_BASE_RELATIVE is not set CONFIG_USERFAULTFD=y # CONFIG_RSEQ is not set CONFIG_MTK_SCHED_EXTENSION=y From dbad7f1c80e6b3933ffcf485f446c88a5a0a97a8 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Sat, 9 May 2026 00:23:28 +0300 Subject: [PATCH 19/22] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=82=D1=8B=20=D0=B2?= =?UTF-8?q?=20blossom=5Fdefconfig,=20=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20CONFIG=5FKSM=3Dy,=20=D0=BE=D1=82=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D0=B5=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm64/configs/blossom_defconfig | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/arm64/configs/blossom_defconfig b/arch/arm64/configs/blossom_defconfig index 17d47cf9344f..c387d9da3702 100644 --- a/arch/arm64/configs/blossom_defconfig +++ b/arch/arm64/configs/blossom_defconfig @@ -506,10 +506,9 @@ CONFIG_FTRACE=y # KernelSU CONFIG_KSU=y CONFIG_KPROBES=y -CONFIG_HAVE_KPROBES=y -CONFIG_KPROBE_EVENTS=y +# CONFIG_KPROBE_EVENTS is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y -CONFIG_HAVE_KPROBES=y -CONFIG_KPROBE_EVENTS=y -CONFIG_KALLSYMS_BASE_RELATIVE=y \ No newline at end of file +# CONFIG_HAVE_KPROBES is not set +# CONFIG_KALLSYMS_BASE_RELATIVE is not set +CONFIG_KSM=y \ No newline at end of file From 54842e00d028f600d91a58b41639555d54346628 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Sat, 9 May 2026 16:02:56 +0300 Subject: [PATCH 20/22] before susfs From 511006efe91edbf8f98a47a0e99a02ae6aefa485 Mon Sep 17 00:00:00 2001 From: sorvigolova760-sudo Date: Sun, 10 May 2026 15:53:19 +0300 Subject: [PATCH 21/22] Integrate KernelSU Next + SuSFS for kernel 4.19 --- KernelSU-Next/.gitignore | 4 + KernelSU-Next/LICENSE | 674 +++++ KernelSU-Next/SECURITY.md | 7 + KernelSU-Next/assets/kernelsu_next.png | Bin 0 -> 15395 bytes KernelSU-Next/build.sh | 21 + KernelSU-Next/crowdin.yml | 2 + KernelSU-Next/docs/README.md | 95 + KernelSU-Next/docs/README_BG.md | 91 + KernelSU-Next/docs/README_CN.md | 95 + KernelSU-Next/docs/README_ES.md | 94 + KernelSU-Next/docs/README_FR.md | 49 + KernelSU-Next/docs/README_ID.md | 52 + KernelSU-Next/docs/README_IT.md | 66 + KernelSU-Next/docs/README_JA.md | 63 + KernelSU-Next/docs/README_KO.md | 49 + KernelSU-Next/docs/README_PL.md | 94 + KernelSU-Next/docs/README_PT-BR.md | 95 + KernelSU-Next/docs/README_RU.md | 94 + KernelSU-Next/docs/README_TH.md | 63 + KernelSU-Next/docs/README_TR.md | 94 + KernelSU-Next/docs/README_TW.md | 93 + KernelSU-Next/docs/README_UA.md | 91 + KernelSU-Next/docs/README_VI.md | 66 + KernelSU-Next/docs/WebUi_Next/API_DOC.md | 326 +++ KernelSU-Next/justfile | 14 + KernelSU-Next/kernel/.clang-format | 548 +++++ KernelSU-Next/kernel/.gitignore | 24 + KernelSU-Next/kernel/Kbuild | 156 ++ KernelSU-Next/kernel/Kconfig | 139 ++ KernelSU-Next/kernel/LICENSE | 339 +++ KernelSU-Next/kernel/Makefile | 25 + KernelSU-Next/kernel/core/init.c | 237 ++ KernelSU-Next/kernel/extras.c | 233 ++ KernelSU-Next/kernel/feature/kernel_umount.c | 144 ++ KernelSU-Next/kernel/feature/kernel_umount.h | 23 + KernelSU-Next/kernel/feature/sucompat.c | 399 +++ KernelSU-Next/kernel/feature/sucompat.h | 32 + .../kernel/hook/arm64/patch_memory.c | 206 ++ .../kernel/hook/arm64/syscall_hook.c | 261 ++ KernelSU-Next/kernel/hook/lsm_hook.c | 428 ++++ KernelSU-Next/kernel/hook/lsm_hook.h | 79 + KernelSU-Next/kernel/hook/patch_memory.h | 32 + KernelSU-Next/kernel/hook/setuid_hook.c | 128 + KernelSU-Next/kernel/hook/setuid_hook.h | 17 + .../kernel/hook/syscall_event_bridge.c | 120 + .../kernel/hook/syscall_event_bridge.h | 13 + KernelSU-Next/kernel/hook/syscall_hook.h | 51 + .../kernel/hook/syscall_hook_manager.c | 181 ++ .../kernel/hook/syscall_hook_manager.h | 14 + KernelSU-Next/kernel/hook/tp_marker.c | 176 ++ KernelSU-Next/kernel/hook/tp_marker.h | 47 + .../kernel/hook/x86_64/patch_memory.c | 197 ++ .../kernel/hook/x86_64/syscall_hook.c | 262 ++ KernelSU-Next/kernel/include/arch.h | 75 + KernelSU-Next/kernel/include/klog.h | 11 + KernelSU-Next/kernel/include/ksu.h | 29 + KernelSU-Next/kernel/include/uapi | 1 + KernelSU-Next/kernel/infra/file_wrapper.c | 627 +++++ KernelSU-Next/kernel/infra/file_wrapper.h | 10 + KernelSU-Next/kernel/infra/seccomp_cache.c | 65 + KernelSU-Next/kernel/infra/seccomp_cache.h | 10 + KernelSU-Next/kernel/infra/su_mount_ns.c | 191 ++ KernelSU-Next/kernel/infra/su_mount_ns.h | 17 + KernelSU-Next/kernel/infra/symbol_resolver.c | 29 + KernelSU-Next/kernel/infra/symbol_resolver.h | 6 + KernelSU-Next/kernel/manager/apk_sign.c | 388 +++ KernelSU-Next/kernel/manager/apk_sign.h | 9 + .../kernel/manager/manager_identity.h | 73 + .../kernel/manager/manager_observer.h | 18 + KernelSU-Next/kernel/manager/pkg_observer.c | 127 + KernelSU-Next/kernel/manager/throne_tracker.c | 435 ++++ KernelSU-Next/kernel/manager/throne_tracker.h | 70 + KernelSU-Next/kernel/policy/allowlist.c | 623 +++++ KernelSU-Next/kernel/policy/allowlist.h | 61 + KernelSU-Next/kernel/policy/app_profile.c | 223 ++ KernelSU-Next/kernel/policy/app_profile.h | 9 + KernelSU-Next/kernel/policy/feature.c | 174 ++ KernelSU-Next/kernel/policy/feature.h | 29 + KernelSU-Next/kernel/runtime/boot_event.c | 91 + KernelSU-Next/kernel/runtime/ksud.h | 34 + KernelSU-Next/kernel/runtime/ksud_boot.h | 17 + .../kernel/runtime/ksud_integration.c | 618 +++++ KernelSU-Next/kernel/selinux/rules.c | 524 ++++ KernelSU-Next/kernel/selinux/selinux.c | 303 +++ KernelSU-Next/kernel/selinux/selinux.h | 53 + KernelSU-Next/kernel/selinux/sepolicy.c | 1381 +++++++++++ KernelSU-Next/kernel/selinux/sepolicy.h | 50 + KernelSU-Next/kernel/setup.sh | 82 + KernelSU-Next/kernel/supercall/dispatch.c | 1067 ++++++++ KernelSU-Next/kernel/supercall/internal.h | 21 + KernelSU-Next/kernel/supercall/perm.c | 30 + KernelSU-Next/kernel/supercall/supercall.c | 304 +++ KernelSU-Next/kernel/supercall/supercall.h | 28 + KernelSU-Next/kernel/tiny_sulog.c | 97 + KernelSU-Next/kernel/tiny_sulog.h | 11 + KernelSU-Next/kernel/tools/check_symbol.c | 200 ++ KernelSU-Next/manager/.gitignore | 10 + KernelSU-Next/manager/app/.gitignore | 3 + KernelSU-Next/manager/app/build.gradle.kts | 161 ++ KernelSU-Next/manager/app/proguard-rules.pro | 39 + .../manager/app/src/main/AndroidManifest.xml | 84 + .../com/rifsxd/ksunext/IKsuInterface.aidl | 9 + .../manager/app/src/main/assets/eruda.min.js | 9 + .../manager/app/src/main/cpp/CMakeLists.txt | 23 + KernelSU-Next/manager/app/src/main/cpp/jni.cc | 391 +++ KernelSU-Next/manager/app/src/main/cpp/ksu.cc | 249 ++ KernelSU-Next/manager/app/src/main/cpp/ksu.h | 69 + KernelSU-Next/manager/app/src/main/cpp/uapi | 1 + .../com/rifsxd/ksunext/KernelSUApplication.kt | 71 + .../main/java/com/rifsxd/ksunext/Kernels.kt | 71 + .../java/com/rifsxd/ksunext/KsuService.kt | 71 + .../main/java/com/rifsxd/ksunext/Natives.kt | 187 ++ .../rifsxd/ksunext/profile/Capabilities.kt | 49 + .../java/com/rifsxd/ksunext/profile/Groups.kt | 130 + .../com/rifsxd/ksunext/ui/MainActivity.kt | 737 ++++++ .../rifsxd/ksunext/ui/component/AboutCard.kt | 115 + .../com/rifsxd/ksunext/ui/component/Dialog.kt | 458 ++++ .../ksunext/ui/component/KeyEventBlocker.kt | 28 + .../rifsxd/ksunext/ui/component/SearchBar.kt | 147 ++ .../ksunext/ui/component/SettingsItem.kt | 108 + .../ksunext/ui/component/ShortcutDialog.kt | 252 ++ .../ui/component/profile/AppProfileConfig.kt | 59 + .../ui/component/profile/RootProfileConfig.kt | 459 ++++ .../ui/component/profile/TemplateConfig.kt | 105 + .../rifsxd/ksunext/ui/screen/AppProfile.kt | 398 +++ .../rifsxd/ksunext/ui/screen/BackupRestore.kt | 422 ++++ .../ksunext/ui/screen/BottomBarDestination.kt | 32 + .../rifsxd/ksunext/ui/screen/Customization.kt | 332 +++ .../com/rifsxd/ksunext/ui/screen/Developer.kt | 156 ++ .../ksunext/ui/screen/ExecuteModuleAction.kt | 182 ++ .../com/rifsxd/ksunext/ui/screen/Flash.kt | 484 ++++ .../java/com/rifsxd/ksunext/ui/screen/Home.kt | 1405 +++++++++++ .../com/rifsxd/ksunext/ui/screen/Install.kt | 426 ++++ .../rifsxd/ksunext/ui/screen/MetaModule.kt | 677 +++++ .../com/rifsxd/ksunext/ui/screen/Module.kt | 1460 +++++++++++ .../rifsxd/ksunext/ui/screen/ModuleRepo.kt | 1009 ++++++++ .../com/rifsxd/ksunext/ui/screen/Settings.kt | 675 +++++ .../com/rifsxd/ksunext/ui/screen/SuperUser.kt | 289 +++ .../com/rifsxd/ksunext/ui/screen/Template.kt | 312 +++ .../ksunext/ui/screen/TemplateEditor.kt | 350 +++ .../java/com/rifsxd/ksunext/ui/theme/Color.kt | 20 + .../java/com/rifsxd/ksunext/ui/theme/Theme.kt | 118 + .../java/com/rifsxd/ksunext/ui/theme/Type.kt | 33 + .../ksunext/ui/util/CompositionProvider.kt | 8 + .../com/rifsxd/ksunext/ui/util/Downloader.kt | 168 ++ .../rifsxd/ksunext/ui/util/HanziToPinyin.java | 572 +++++ .../rifsxd/ksunext/ui/util/HyperlinkText.kt | 88 + .../java/com/rifsxd/ksunext/ui/util/KsuCli.kt | 661 +++++ .../rifsxd/ksunext/ui/util/LocaleHelper.kt | 141 ++ .../com/rifsxd/ksunext/ui/util/LogEvent.kt | 116 + .../rifsxd/ksunext/ui/util/SELinuxChecker.kt | 21 + .../ui/util/module/LatestVersionInfo.kt | 8 + .../rifsxd/ksunext/ui/util/module/Shortcut.kt | 209 ++ .../ksunext/ui/viewmodel/ModuleViewModel.kt | 230 ++ .../ui/viewmodel/SuperUserViewModel.kt | 191 ++ .../ksunext/ui/viewmodel/TemplateViewModel.kt | 321 +++ .../rifsxd/ksunext/ui/webui/AppIconUtil.java | 43 + .../java/com/rifsxd/ksunext/ui/webui/Inset.kt | 26 + .../com/rifsxd/ksunext/ui/webui/MimeUtil.java | 88 + .../ksunext/ui/webui/MonetColorsProvider.kt | 159 ++ .../ksunext/ui/webui/SuFilePathHandler.java | 232 ++ .../rifsxd/ksunext/ui/webui/WebUIActivity.kt | 426 ++++ .../ksunext/ui/webui/WebViewInterface.kt | 587 +++++ .../manager/app/src/main/jniLibs/.gitignore | 1 + .../app/src/main/res/drawable/ic_github.xml | 10 + .../app/src/main/res/drawable/ic_ksu_next.xml | 12 + .../app/src/main/res/drawable/ic_linux.xml | 38 + .../app/src/main/res/drawable/ic_sus.xml | 9 + .../app/src/main/res/drawable/ic_telegram.xml | 9 + .../main/res/mipmap-anydpi/ic_launcher.xml | 6 + .../src/main/res/mipmap-anydpi/ic_modules.xml | 6 + .../main/res/mipmap-anydpi/ic_settings.xml | 6 + .../main/res/mipmap-anydpi/ic_superuser.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5039 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4426 bytes .../mipmap-hdpi/ic_launcher_monochrome.png | Bin 0 -> 4426 bytes .../src/main/res/mipmap-hdpi/ic_modules.png | Bin 0 -> 4454 bytes .../res/mipmap-hdpi/ic_modules_foreground.png | Bin 0 -> 5438 bytes .../res/mipmap-hdpi/ic_modules_monochrome.png | Bin 0 -> 5438 bytes .../src/main/res/mipmap-hdpi/ic_settings.png | Bin 0 -> 4501 bytes .../mipmap-hdpi/ic_settings_foreground.png | Bin 0 -> 5310 bytes .../mipmap-hdpi/ic_settings_monochrome.png | Bin 0 -> 5310 bytes .../src/main/res/mipmap-hdpi/ic_superuser.png | Bin 0 -> 4618 bytes .../mipmap-hdpi/ic_superuser_foreground.png | Bin 0 -> 5516 bytes .../mipmap-hdpi/ic_superuser_monochrome.png | Bin 0 -> 5516 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3145 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2817 bytes .../mipmap-mdpi/ic_launcher_monochrome.png | Bin 0 -> 2817 bytes .../src/main/res/mipmap-mdpi/ic_modules.png | Bin 0 -> 2780 bytes .../res/mipmap-mdpi/ic_modules_foreground.png | Bin 0 -> 2753 bytes .../res/mipmap-mdpi/ic_modules_monochrome.png | Bin 0 -> 2753 bytes .../src/main/res/mipmap-mdpi/ic_settings.png | Bin 0 -> 2804 bytes .../mipmap-mdpi/ic_settings_foreground.png | Bin 0 -> 2674 bytes .../mipmap-mdpi/ic_settings_monochrome.png | Bin 0 -> 2674 bytes .../src/main/res/mipmap-mdpi/ic_superuser.png | Bin 0 -> 2868 bytes .../mipmap-mdpi/ic_superuser_foreground.png | Bin 0 -> 2895 bytes .../mipmap-mdpi/ic_superuser_monochrome.png | Bin 0 -> 2895 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6947 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 6497 bytes .../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 0 -> 6497 bytes .../src/main/res/mipmap-xhdpi/ic_modules.png | Bin 0 -> 6799 bytes .../mipmap-xhdpi/ic_modules_foreground.png | Bin 0 -> 7497 bytes .../mipmap-xhdpi/ic_modules_monochrome.png | Bin 0 -> 7497 bytes .../src/main/res/mipmap-xhdpi/ic_settings.png | Bin 0 -> 6812 bytes .../mipmap-xhdpi/ic_settings_foreground.png | Bin 0 -> 7328 bytes .../mipmap-xhdpi/ic_settings_monochrome.png | Bin 0 -> 7328 bytes .../main/res/mipmap-xhdpi/ic_superuser.png | Bin 0 -> 6928 bytes .../mipmap-xhdpi/ic_superuser_foreground.png | Bin 0 -> 7634 bytes .../mipmap-xhdpi/ic_superuser_monochrome.png | Bin 0 -> 7634 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11072 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 11052 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 0 -> 11052 bytes .../src/main/res/mipmap-xxhdpi/ic_modules.png | Bin 0 -> 11432 bytes .../mipmap-xxhdpi/ic_modules_foreground.png | Bin 0 -> 14358 bytes .../mipmap-xxhdpi/ic_modules_monochrome.png | Bin 0 -> 14358 bytes .../main/res/mipmap-xxhdpi/ic_settings.png | Bin 0 -> 11393 bytes .../mipmap-xxhdpi/ic_settings_foreground.png | Bin 0 -> 14132 bytes .../mipmap-xxhdpi/ic_settings_monochrome.png | Bin 0 -> 14132 bytes .../main/res/mipmap-xxhdpi/ic_superuser.png | Bin 0 -> 11770 bytes .../mipmap-xxhdpi/ic_superuser_foreground.png | Bin 0 -> 14969 bytes .../mipmap-xxhdpi/ic_superuser_monochrome.png | Bin 0 -> 14969 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 15395 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 15421 bytes .../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 0 -> 15421 bytes .../main/res/mipmap-xxxhdpi/ic_modules.png | Bin 0 -> 16951 bytes .../mipmap-xxxhdpi/ic_modules_foreground.png | Bin 0 -> 19506 bytes .../mipmap-xxxhdpi/ic_modules_monochrome.png | Bin 0 -> 19506 bytes .../main/res/mipmap-xxxhdpi/ic_settings.png | Bin 0 -> 16901 bytes .../mipmap-xxxhdpi/ic_settings_foreground.png | Bin 0 -> 19183 bytes .../mipmap-xxxhdpi/ic_settings_monochrome.png | Bin 0 -> 19183 bytes .../main/res/mipmap-xxxhdpi/ic_superuser.png | Bin 0 -> 17672 bytes .../ic_superuser_foreground.png | Bin 0 -> 20501 bytes .../ic_superuser_monochrome.png | Bin 0 -> 20501 bytes .../app/src/main/res/resources.properties | 1 + .../src/main/res/values-ar-rSA/strings.xml | 252 ++ .../src/main/res/values-bg-rBG/strings.xml | 250 ++ .../src/main/res/values-bn-rBD/strings.xml | 250 ++ .../src/main/res/values-de-rDE/strings.xml | 250 ++ .../src/main/res/values-es-rEM/strings.xml | 250 ++ .../src/main/res/values-fa-rIR/strings.xml | 250 ++ .../src/main/res/values-fr-rFR/strings.xml | 250 ++ .../src/main/res/values-hi-rIN/strings.xml | 250 ++ .../src/main/res/values-hu-rHU/strings.xml | 250 ++ .../src/main/res/values-in-rID/strings.xml | 250 ++ .../src/main/res/values-it-rIT/strings.xml | 250 ++ .../src/main/res/values-ja-rJP/strings.xml | 250 ++ .../src/main/res/values-ko-rKR/strings.xml | 250 ++ .../app/src/main/res/values-night/themes.xml | 10 + .../src/main/res/values-pl-rPL/strings.xml | 250 ++ .../src/main/res/values-pt-rBR/strings.xml | 250 ++ .../src/main/res/values-ru-rRU/strings.xml | 250 ++ .../src/main/res/values-sv-rSE/strings.xml | 250 ++ .../src/main/res/values-th-rTH/strings.xml | 250 ++ .../src/main/res/values-tr-rTR/strings.xml | 250 ++ .../src/main/res/values-uk-rUA/strings.xml | 250 ++ .../src/main/res/values-vi-rVN/strings.xml | 250 ++ .../src/main/res/values-zh-rCN/strings.xml | 250 ++ .../src/main/res/values-zh-rTW/strings.xml | 250 ++ .../app/src/main/res/values/colors.xml | 7 + .../app/src/main/res/values/strings.xml | 261 ++ .../app/src/main/res/values/themes.xml | 13 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../app/src/main/res/xml/filepaths.xml | 6 + .../main/res/xml/network_security_config.xml | 8 + .../app/src/main/res/xml/shortcuts.xml | 45 + KernelSU-Next/manager/build.gradle.kts | 142 ++ KernelSU-Next/manager/gradle.properties | 7 + .../manager/gradle/libs.versions.toml | 80 + .../manager/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45633 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + KernelSU-Next/manager/gradlew | 248 ++ KernelSU-Next/manager/gradlew.bat | 93 + .../manager/scripts/update_binary.sh | 43 + .../manager/scripts/updater_script.sh | 1 + KernelSU-Next/manager/settings.gradle.kts | 21 + KernelSU-Next/manager/setup.sh | 30 + KernelSU-Next/manager/sign.example.properties | 4 + KernelSU-Next/manager/spoof | 39 + KernelSU-Next/scripts/add_device_handler.py | 50 + KernelSU-Next/scripts/allowlist.bt | 89 + KernelSU-Next/scripts/ksunextbot.py | 106 + KernelSU-Next/uapi/app_profile.h | 63 + KernelSU-Next/uapi/feature.h | 14 + KernelSU-Next/uapi/selinux.h | 31 + KernelSU-Next/uapi/supercall.h | 180 ++ KernelSU-Next/userspace/ksud/.gitignore | 2 + KernelSU-Next/userspace/ksud/Cargo.lock | 2169 +++++++++++++++++ KernelSU-Next/userspace/ksud/Cargo.toml | 76 + KernelSU-Next/userspace/ksud/bin/.gitignore | 2 + .../userspace/ksud/bin/aarch64/bootctl | Bin 0 -> 154248 bytes .../userspace/ksud/bin/aarch64/busybox | Bin 0 -> 1710600 bytes .../userspace/ksud/bin/x86_64/busybox | Bin 0 -> 1767048 bytes KernelSU-Next/userspace/ksud/build.rs | 82 + KernelSU-Next/userspace/ksud/src/apk_sign.rs | 115 + KernelSU-Next/userspace/ksud/src/assets.rs | 70 + .../userspace/ksud/src/boot_patch.rs | 925 +++++++ KernelSU-Next/userspace/ksud/src/cli.rs | 725 ++++++ .../userspace/ksud/src/cli_non_android.rs | 64 + KernelSU-Next/userspace/ksud/src/debug.rs | 107 + KernelSU-Next/userspace/ksud/src/defs.rs | 49 + KernelSU-Next/userspace/ksud/src/feature.rs | 462 ++++ .../userspace/ksud/src/init_event.rs | 259 ++ KernelSU-Next/userspace/ksud/src/installer.sh | 479 ++++ KernelSU-Next/userspace/ksud/src/ksu_uapi.h | 4 + KernelSU-Next/userspace/ksud/src/ksu_uapi.rs | 3 + KernelSU-Next/userspace/ksud/src/ksucalls.rs | 245 ++ KernelSU-Next/userspace/ksud/src/late_load.rs | 133 + KernelSU-Next/userspace/ksud/src/main.rs | 67 + .../userspace/ksud/src/metamodule.rs | 276 +++ KernelSU-Next/userspace/ksud/src/module.rs | 870 +++++++ .../userspace/ksud/src/module_config.rs | 458 ++++ KernelSU-Next/userspace/ksud/src/profile.rs | 79 + KernelSU-Next/userspace/ksud/src/resetprop.rs | 247 ++ .../userspace/ksud/src/restorecon.rs | 65 + KernelSU-Next/userspace/ksud/src/sepolicy.rs | 779 ++++++ KernelSU-Next/userspace/ksud/src/su.rs | 301 +++ KernelSU-Next/userspace/ksud/src/susfsd.rs | 114 + KernelSU-Next/userspace/ksud/src/unload.rs | 160 ++ KernelSU-Next/userspace/ksud/src/utils.rs | 282 +++ KernelSU-Next/userspace/ksuinit/.gitignore | 3 + KernelSU-Next/userspace/ksuinit/Cargo.lock | 243 ++ KernelSU-Next/userspace/ksuinit/Cargo.toml | 30 + KernelSU-Next/userspace/ksuinit/build.rs | 11 + KernelSU-Next/userspace/ksuinit/src/init.rs | 138 ++ KernelSU-Next/userspace/ksuinit/src/lib.rs | 165 ++ KernelSU-Next/userspace/ksuinit/src/main.rs | 18 + .../website/docs/guide/metamodule.md | 499 ++++ .../website/docs/guide/x86_64-support.md | 35 + .../website/docs/id_ID/guide/metamodule.md | 497 ++++ .../website/docs/ja_JP/guide/metamodule.md | 497 ++++ .../website/docs/pt_BR/guide/metamodule.md | 497 ++++ .../website/docs/ru_RU/guide/metamodule.md | 497 ++++ .../website/docs/vi_VN/guide/metamodule.md | 497 ++++ .../website/docs/zh_CN/guide/metamodule.md | 496 ++++ .../website/docs/zh_TW/guide/metamodule.md | 497 ++++ arch/arm64/configs/blossom_defconfig | 20 +- fs/Kconfig | 1 + fs/Makefile | 2 + fs/dcache.c | 14 + fs/namei.c | 129 + fs/namespace.c | 272 +++ fs/notify/fdinfo.c | 48 + fs/overlayfs/inode.c | 9 + fs/overlayfs/readdir.c | 12 + fs/overlayfs/super.c | 12 + fs/proc/cmdline.c | 10 + fs/proc/fd.c | 17 + fs/proc/task_mmu.c | 16 + fs/proc_namespace.c | 18 + fs/readdir.c | 26 + fs/stat.c | 18 + fs/statfs.c | 43 + fs/susfs.c | 916 +++++++ include/linux/mount.h | 7 + include/linux/sched.h | 14 + include/linux/susfs.h | 186 ++ include/linux/susfs_def.h | 62 + kernel/kallsyms.c | 10 + kernel/sys.c | 6 + 360 files changed, 55935 insertions(+), 2 deletions(-) create mode 100644 KernelSU-Next/.gitignore create mode 100644 KernelSU-Next/LICENSE create mode 100644 KernelSU-Next/SECURITY.md create mode 100644 KernelSU-Next/assets/kernelsu_next.png create mode 100755 KernelSU-Next/build.sh create mode 100644 KernelSU-Next/crowdin.yml create mode 100644 KernelSU-Next/docs/README.md create mode 100644 KernelSU-Next/docs/README_BG.md create mode 100644 KernelSU-Next/docs/README_CN.md create mode 100644 KernelSU-Next/docs/README_ES.md create mode 100644 KernelSU-Next/docs/README_FR.md create mode 100644 KernelSU-Next/docs/README_ID.md create mode 100644 KernelSU-Next/docs/README_IT.md create mode 100644 KernelSU-Next/docs/README_JA.md create mode 100644 KernelSU-Next/docs/README_KO.md create mode 100644 KernelSU-Next/docs/README_PL.md create mode 100644 KernelSU-Next/docs/README_PT-BR.md create mode 100644 KernelSU-Next/docs/README_RU.md create mode 100644 KernelSU-Next/docs/README_TH.md create mode 100644 KernelSU-Next/docs/README_TR.md create mode 100644 KernelSU-Next/docs/README_TW.md create mode 100644 KernelSU-Next/docs/README_UA.md create mode 100644 KernelSU-Next/docs/README_VI.md create mode 100644 KernelSU-Next/docs/WebUi_Next/API_DOC.md create mode 100644 KernelSU-Next/justfile create mode 100644 KernelSU-Next/kernel/.clang-format create mode 100644 KernelSU-Next/kernel/.gitignore create mode 100644 KernelSU-Next/kernel/Kbuild create mode 100644 KernelSU-Next/kernel/Kconfig create mode 100644 KernelSU-Next/kernel/LICENSE create mode 100644 KernelSU-Next/kernel/Makefile create mode 100644 KernelSU-Next/kernel/core/init.c create mode 100644 KernelSU-Next/kernel/extras.c create mode 100644 KernelSU-Next/kernel/feature/kernel_umount.c create mode 100644 KernelSU-Next/kernel/feature/kernel_umount.h create mode 100644 KernelSU-Next/kernel/feature/sucompat.c create mode 100644 KernelSU-Next/kernel/feature/sucompat.h create mode 100644 KernelSU-Next/kernel/hook/arm64/patch_memory.c create mode 100644 KernelSU-Next/kernel/hook/arm64/syscall_hook.c create mode 100644 KernelSU-Next/kernel/hook/lsm_hook.c create mode 100644 KernelSU-Next/kernel/hook/lsm_hook.h create mode 100644 KernelSU-Next/kernel/hook/patch_memory.h create mode 100644 KernelSU-Next/kernel/hook/setuid_hook.c create mode 100644 KernelSU-Next/kernel/hook/setuid_hook.h create mode 100644 KernelSU-Next/kernel/hook/syscall_event_bridge.c create mode 100644 KernelSU-Next/kernel/hook/syscall_event_bridge.h create mode 100644 KernelSU-Next/kernel/hook/syscall_hook.h create mode 100644 KernelSU-Next/kernel/hook/syscall_hook_manager.c create mode 100644 KernelSU-Next/kernel/hook/syscall_hook_manager.h create mode 100644 KernelSU-Next/kernel/hook/tp_marker.c create mode 100644 KernelSU-Next/kernel/hook/tp_marker.h create mode 100644 KernelSU-Next/kernel/hook/x86_64/patch_memory.c create mode 100644 KernelSU-Next/kernel/hook/x86_64/syscall_hook.c create mode 100644 KernelSU-Next/kernel/include/arch.h create mode 100644 KernelSU-Next/kernel/include/klog.h create mode 100644 KernelSU-Next/kernel/include/ksu.h create mode 120000 KernelSU-Next/kernel/include/uapi create mode 100644 KernelSU-Next/kernel/infra/file_wrapper.c create mode 100644 KernelSU-Next/kernel/infra/file_wrapper.h create mode 100644 KernelSU-Next/kernel/infra/seccomp_cache.c create mode 100644 KernelSU-Next/kernel/infra/seccomp_cache.h create mode 100644 KernelSU-Next/kernel/infra/su_mount_ns.c create mode 100644 KernelSU-Next/kernel/infra/su_mount_ns.h create mode 100644 KernelSU-Next/kernel/infra/symbol_resolver.c create mode 100644 KernelSU-Next/kernel/infra/symbol_resolver.h create mode 100644 KernelSU-Next/kernel/manager/apk_sign.c create mode 100644 KernelSU-Next/kernel/manager/apk_sign.h create mode 100644 KernelSU-Next/kernel/manager/manager_identity.h create mode 100644 KernelSU-Next/kernel/manager/manager_observer.h create mode 100644 KernelSU-Next/kernel/manager/pkg_observer.c create mode 100644 KernelSU-Next/kernel/manager/throne_tracker.c create mode 100644 KernelSU-Next/kernel/manager/throne_tracker.h create mode 100644 KernelSU-Next/kernel/policy/allowlist.c create mode 100644 KernelSU-Next/kernel/policy/allowlist.h create mode 100644 KernelSU-Next/kernel/policy/app_profile.c create mode 100644 KernelSU-Next/kernel/policy/app_profile.h create mode 100644 KernelSU-Next/kernel/policy/feature.c create mode 100644 KernelSU-Next/kernel/policy/feature.h create mode 100644 KernelSU-Next/kernel/runtime/boot_event.c create mode 100644 KernelSU-Next/kernel/runtime/ksud.h create mode 100644 KernelSU-Next/kernel/runtime/ksud_boot.h create mode 100644 KernelSU-Next/kernel/runtime/ksud_integration.c create mode 100644 KernelSU-Next/kernel/selinux/rules.c create mode 100644 KernelSU-Next/kernel/selinux/selinux.c create mode 100644 KernelSU-Next/kernel/selinux/selinux.h create mode 100644 KernelSU-Next/kernel/selinux/sepolicy.c create mode 100644 KernelSU-Next/kernel/selinux/sepolicy.h create mode 100755 KernelSU-Next/kernel/setup.sh create mode 100644 KernelSU-Next/kernel/supercall/dispatch.c create mode 100644 KernelSU-Next/kernel/supercall/internal.h create mode 100644 KernelSU-Next/kernel/supercall/perm.c create mode 100644 KernelSU-Next/kernel/supercall/supercall.c create mode 100644 KernelSU-Next/kernel/supercall/supercall.h create mode 100644 KernelSU-Next/kernel/tiny_sulog.c create mode 100644 KernelSU-Next/kernel/tiny_sulog.h create mode 100644 KernelSU-Next/kernel/tools/check_symbol.c create mode 100644 KernelSU-Next/manager/.gitignore create mode 100644 KernelSU-Next/manager/app/.gitignore create mode 100644 KernelSU-Next/manager/app/build.gradle.kts create mode 100644 KernelSU-Next/manager/app/proguard-rules.pro create mode 100644 KernelSU-Next/manager/app/src/main/AndroidManifest.xml create mode 100644 KernelSU-Next/manager/app/src/main/aidl/com/rifsxd/ksunext/IKsuInterface.aidl create mode 100644 KernelSU-Next/manager/app/src/main/assets/eruda.min.js create mode 100644 KernelSU-Next/manager/app/src/main/cpp/CMakeLists.txt create mode 100644 KernelSU-Next/manager/app/src/main/cpp/jni.cc create mode 100644 KernelSU-Next/manager/app/src/main/cpp/ksu.cc create mode 100644 KernelSU-Next/manager/app/src/main/cpp/ksu.h create mode 120000 KernelSU-Next/manager/app/src/main/cpp/uapi create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KernelSUApplication.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Kernels.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KsuService.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Capabilities.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Groups.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/AboutCard.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/Dialog.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/KeyEventBlocker.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SearchBar.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/ShortcutDialog.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/AppProfileConfig.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/RootProfileConfig.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/TemplateConfig.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/AppProfile.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BackupRestore.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BottomBarDestination.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Customization.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Developer.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ExecuteModuleAction.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Flash.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Install.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/MetaModule.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ModuleRepo.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/SuperUser.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Template.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/TemplateEditor.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Color.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Theme.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Type.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/CompositionProvider.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/Downloader.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HanziToPinyin.java create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HyperlinkText.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LocaleHelper.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LogEvent.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/SELinuxChecker.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/LatestVersionInfo.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/Shortcut.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/SuperUserViewModel.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/TemplateViewModel.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/AppIconUtil.java create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/Inset.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MimeUtil.java create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MonetColorsProvider.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/SuFilePathHandler.java create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt create mode 100644 KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebViewInterface.kt create mode 100644 KernelSU-Next/manager/app/src/main/jniLibs/.gitignore create mode 100644 KernelSU-Next/manager/app/src/main/res/drawable/ic_github.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/drawable/ic_ksu_next.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/drawable/ic_linux.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/drawable/ic_sus.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/drawable/ic_telegram.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_modules.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_settings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_superuser.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_settings.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_settings_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_settings_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_superuser.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_superuser_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_superuser_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_modules.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_modules_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_modules_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_settings.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_settings_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_settings_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_superuser.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_superuser_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_superuser_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_modules.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_modules_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_modules_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_settings.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_settings_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_settings_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_superuser.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_superuser_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_superuser_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_modules.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_modules_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_modules_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_settings.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_settings_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_settings_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_superuser.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_superuser_foreground.png create mode 100644 KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_superuser_monochrome.png create mode 100644 KernelSU-Next/manager/app/src/main/res/resources.properties create mode 100644 KernelSU-Next/manager/app/src/main/res/values-ar-rSA/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-bg-rBG/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-bn-rBD/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-de-rDE/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-es-rEM/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-fa-rIR/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-fr-rFR/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-hi-rIN/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-hu-rHU/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-in-rID/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-it-rIT/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-ja-rJP/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-ko-rKR/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-night/themes.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-pl-rPL/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-pt-rBR/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-ru-rRU/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-sv-rSE/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-th-rTH/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-tr-rTR/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-uk-rUA/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-vi-rVN/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-zh-rCN/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values-zh-rTW/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values/colors.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values/strings.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/values/themes.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/xml/backup_rules.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/xml/filepaths.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/xml/network_security_config.xml create mode 100644 KernelSU-Next/manager/app/src/main/res/xml/shortcuts.xml create mode 100644 KernelSU-Next/manager/build.gradle.kts create mode 100644 KernelSU-Next/manager/gradle.properties create mode 100644 KernelSU-Next/manager/gradle/libs.versions.toml create mode 100755 KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.jar create mode 100644 KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.properties create mode 100755 KernelSU-Next/manager/gradlew create mode 100644 KernelSU-Next/manager/gradlew.bat create mode 100644 KernelSU-Next/manager/scripts/update_binary.sh create mode 100644 KernelSU-Next/manager/scripts/updater_script.sh create mode 100644 KernelSU-Next/manager/settings.gradle.kts create mode 100755 KernelSU-Next/manager/setup.sh create mode 100644 KernelSU-Next/manager/sign.example.properties create mode 100755 KernelSU-Next/manager/spoof create mode 100644 KernelSU-Next/scripts/add_device_handler.py create mode 100644 KernelSU-Next/scripts/allowlist.bt create mode 100644 KernelSU-Next/scripts/ksunextbot.py create mode 100644 KernelSU-Next/uapi/app_profile.h create mode 100644 KernelSU-Next/uapi/feature.h create mode 100644 KernelSU-Next/uapi/selinux.h create mode 100644 KernelSU-Next/uapi/supercall.h create mode 100644 KernelSU-Next/userspace/ksud/.gitignore create mode 100644 KernelSU-Next/userspace/ksud/Cargo.lock create mode 100644 KernelSU-Next/userspace/ksud/Cargo.toml create mode 100644 KernelSU-Next/userspace/ksud/bin/.gitignore create mode 100644 KernelSU-Next/userspace/ksud/bin/aarch64/bootctl create mode 100755 KernelSU-Next/userspace/ksud/bin/aarch64/busybox create mode 100644 KernelSU-Next/userspace/ksud/bin/x86_64/busybox create mode 100644 KernelSU-Next/userspace/ksud/build.rs create mode 100644 KernelSU-Next/userspace/ksud/src/apk_sign.rs create mode 100644 KernelSU-Next/userspace/ksud/src/assets.rs create mode 100644 KernelSU-Next/userspace/ksud/src/boot_patch.rs create mode 100644 KernelSU-Next/userspace/ksud/src/cli.rs create mode 100644 KernelSU-Next/userspace/ksud/src/cli_non_android.rs create mode 100644 KernelSU-Next/userspace/ksud/src/debug.rs create mode 100644 KernelSU-Next/userspace/ksud/src/defs.rs create mode 100644 KernelSU-Next/userspace/ksud/src/feature.rs create mode 100644 KernelSU-Next/userspace/ksud/src/init_event.rs create mode 100644 KernelSU-Next/userspace/ksud/src/installer.sh create mode 100644 KernelSU-Next/userspace/ksud/src/ksu_uapi.h create mode 100644 KernelSU-Next/userspace/ksud/src/ksu_uapi.rs create mode 100644 KernelSU-Next/userspace/ksud/src/ksucalls.rs create mode 100644 KernelSU-Next/userspace/ksud/src/late_load.rs create mode 100644 KernelSU-Next/userspace/ksud/src/main.rs create mode 100644 KernelSU-Next/userspace/ksud/src/metamodule.rs create mode 100644 KernelSU-Next/userspace/ksud/src/module.rs create mode 100644 KernelSU-Next/userspace/ksud/src/module_config.rs create mode 100644 KernelSU-Next/userspace/ksud/src/profile.rs create mode 100644 KernelSU-Next/userspace/ksud/src/resetprop.rs create mode 100644 KernelSU-Next/userspace/ksud/src/restorecon.rs create mode 100644 KernelSU-Next/userspace/ksud/src/sepolicy.rs create mode 100644 KernelSU-Next/userspace/ksud/src/su.rs create mode 100644 KernelSU-Next/userspace/ksud/src/susfsd.rs create mode 100644 KernelSU-Next/userspace/ksud/src/unload.rs create mode 100644 KernelSU-Next/userspace/ksud/src/utils.rs create mode 100644 KernelSU-Next/userspace/ksuinit/.gitignore create mode 100644 KernelSU-Next/userspace/ksuinit/Cargo.lock create mode 100644 KernelSU-Next/userspace/ksuinit/Cargo.toml create mode 100644 KernelSU-Next/userspace/ksuinit/build.rs create mode 100644 KernelSU-Next/userspace/ksuinit/src/init.rs create mode 100644 KernelSU-Next/userspace/ksuinit/src/lib.rs create mode 100644 KernelSU-Next/userspace/ksuinit/src/main.rs create mode 100644 KernelSU-Next/website/docs/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/guide/x86_64-support.md create mode 100644 KernelSU-Next/website/docs/id_ID/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/ja_JP/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/pt_BR/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/ru_RU/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/vi_VN/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/zh_CN/guide/metamodule.md create mode 100644 KernelSU-Next/website/docs/zh_TW/guide/metamodule.md create mode 100644 fs/susfs.c create mode 100644 include/linux/susfs.h create mode 100644 include/linux/susfs_def.h diff --git a/KernelSU-Next/.gitignore b/KernelSU-Next/.gitignore new file mode 100644 index 000000000000..9e7e95876351 --- /dev/null +++ b/KernelSU-Next/.gitignore @@ -0,0 +1,4 @@ +.idea +.vscode +CLAUDE.md +AGENTS.md \ No newline at end of file diff --git a/KernelSU-Next/LICENSE b/KernelSU-Next/LICENSE new file mode 100644 index 000000000000..f288702d2fa1 --- /dev/null +++ b/KernelSU-Next/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/KernelSU-Next/SECURITY.md b/KernelSU-Next/SECURITY.md new file mode 100644 index 000000000000..83040d98981f --- /dev/null +++ b/KernelSU-Next/SECURITY.md @@ -0,0 +1,7 @@ +# Reporting Security Issues + +The KernelSU team and community take security bugs in KernelSU seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/tiann/KernelSU/security/advisories/new) tab, or you can mailto [weishu](mailto:twsxtd@gmail.com) directly. + +The KernelSU team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. diff --git a/KernelSU-Next/assets/kernelsu_next.png b/KernelSU-Next/assets/kernelsu_next.png new file mode 100644 index 0000000000000000000000000000000000000000..30efeeb6f0064bf083c50951764f8812c5e2e944 GIT binary patch literal 15395 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 z zwA;{g-!f^^q$3VL{BV+LtWjKvXQ*rj=wyA6_NaT)96p+az zusq^J-(GFC)e;%_iHhzfDj8y2l?1jRa=tGzxE~Cms%*y9$~s{R7$t_lW7IF!#99wN z_~1lsmkhJE)6fBMmU0P>?NWu(F@n-mp<-_)yhA>{9}NFM)tKB(;`Y1klE!F>>-_W2 zH^h(MK5K-CAL9P(XFqE^Et_nzi3wCyHSjw9{O3PUPCfP1Z@sngtSDK>Ko{y7M4XWZ%8xb@!H&G=i20uA z^3g{hov5u+U5}G{AK3#>D9AW&gAF$LRhKGMx;;=91GuV>A%0GOwdR>Dop*r^Bo|(IVe*GR{2}*QvYyrb z4*TVZBaSfk5O}0^7*bUqlB%|q%C>))VuDhFWX&=_Q1yA?g%`%?RGH8Yn+PTc5l?_ua>5d?%TbZT<^@y8njx041;fNkI! z^^Fq0eQux?!tEQopw-5)n)_WQH}Vl$+eax?C|#bt&}(ay0fMTJycFBX9e7qN3)QLt zoPjXl>sD!w?hVNz2z>Rs@4kDo(@r}XUwx+y+`2FU1Z%NM%`yPLM;e}R!U@JxMEsyt zLu+|oIH57ahYv^8Ste*&6>5e7tOV$WI(+9l-&si6UFXSw+Nf0<1tH++IrPv&6N%1T z;>Z83nwAFo(5aAOcdsE-o_~y8 z0%VOafP4B|;z#$NUB=2-1%Zxg)dq3$31*#Kam5u0QoxSTizZr&v8TSdZ5Ie?bPxah z=RX@Yj;M0hC@LK|{Z*RM>{p$x-}E!cxpKnNOD}zfM+&&rC8D>lQ3miCzH4^W|0$ld0}}wKlcaAM6G*B*FF5@{ zTW+}}uCJyI;-U;-=UbSwL3wie3qUr0vBefUv{l5!sgM6UPwl~≧VT;NK69SoD_B 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 VCHl)%}#SLG&^d0PBHROshcbgDU}gluCyQ1dO{^ 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 + KernelSU Next Logo + +

KernelSU Next

+

A kernel-based root solution for Android devices.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+ + +--- + +## 🚀 Features + +- Kernel-based `su` and root access management. +- Module system based on [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) and [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [App Profile](https://kernelsu.org/guide/app-profile.html): Limit root privileges per app. + +--- + +## ✅ Compatibility + +KernelSU Next supports Android kernels from **4.4 up to 6.6**. + +| Kernel version | Support notes | +|----------------------|-------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Supports pre-built images and LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Requires KernelSU driver built-in | +| < 4.14 (EOL) | Requires KernelSU driver (3.18+ is experimental and may need backports) | + +**Supported architectures:** `arm64-v8a`, `armeabi-v7a` and `x86_64` + +> [!CAUTION] +> Recent kernel versions have implemented a breaking change causing KernelSU Next to fail and potentially trigger a kernel panic on `x86_64`! Check the website for more info! + +--- + +## 📦 Installation + +Please refer to the [Installation](https://kernelsu-next.github.io/webpage/pages/installation.html) guide for setup instructions. + +--- + +## 🏅 Contribution + +- Go to our [Crowdin](https://crowdin.com/project/kernelsu-next) to submit a translation for the manager! +- To report security issues, please see [SECURITY.md](/SECURITY.md). + +--- + +## 📜 License + +- **`/kernel` directory:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **All other files:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Donations + +If you'd like to support the project: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Credits + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Concept inspiration +- [Magisk](https://github.com/topjohnwu/Magisk) – Core root implementation +- [Genuine](https://github.com/brevent/genuine/) – APK v2 signature validation +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Rootkit techniques +- [KernelSU](https://github.com/tiann/KernelSU) – The original base that made KernelSU Next possible +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – For Magic Mount support diff --git a/KernelSU-Next/docs/README_BG.md b/KernelSU-Next/docs/README_BG.md new file mode 100644 index 000000000000..c16445151b04 --- /dev/null +++ b/KernelSU-Next/docs/README_BG.md @@ -0,0 +1,91 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | **Български** | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Решение за root достъп, базирано на ядрото, за устройства с Android.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Възможности + +- Управление на `su` и root достъп на ядрено ниво. +- Система за модули базирана на [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Профили за приложения](https://kernelsu.org/guide/app-profile.html): Ограничаване на root права за конкретни приложения. + +--- + +## ✅ Съвместимост + +KernelSU Next официално поддържа повечето Android ядра от версия **4.4 до 6.6**. + +| Версия на ядрото | Бележки относно поддръжката | +|----------------------|----------------------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Могат да използват предварително компилирани изображения и LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Изисква вграден драйвер на KernelSU | +| < 4.14 (EOL) | Изисква драйвер на KernelSU (3.18+ е експериментален и може да се нуждае от обратни портове) | + +**Поддържани архитектури:** `arm64-v8a`, `armeabi-v7a` и `x86_64` + +--- + +## 📦 Инсталация + +Моля, вижте ръководството за [Инсталация](https://kernelsu-next.github.io/webpage/pages/installation.html) за инструкции за инсталация. + +--- + +## 🏅 Сигурност + +- За докладване на уязвимости вижте [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Лиценз + +- **Файловете в директорията `kernel`:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Всички останали файлове:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Дарения + +Ако искате да подкрепите проекта: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Благодарности + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Идеята за KernelSU +- [Magisk](https://github.com/topjohnwu/Magisk) – Мощният root инструмент +- [Genuine](https://github.com/brevent/genuine/) – Валидация на APK подписи v2 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Rootkit техники +- [KernelSU](https://github.com/tiann/KernelSU) – Благодарности към tiann за създаването на KernelSU +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – 💜 5ec1cff за спасяването на KernelSU diff --git a/KernelSU-Next/docs/README_CN.md b/KernelSU-Next/docs/README_CN.md new file mode 100644 index 000000000000..7ebf4e186660 --- /dev/null +++ b/KernelSU-Next/docs/README_CN.md @@ -0,0 +1,95 @@ +[English](README.md) | **简体中文** | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

安卓设备基于内核的 Root 方案。

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 特性 + +- 基于内核的 `su` 和超级用户权限管理。 +- 动态挂载系统基于 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) 以及 [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)。 +- [App Profile](https://kernelsu.org/zh_CN/guide/app-profile.html):把 Root 权限关进笼子里。 + +--- + +## ✅ 兼容性 + +KernelSU Next 支持从 **4.4 到 6.6** 的大多数安卓内核。 + +| 内核版本 | 支持情况 | +|----------------------|--------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | 可运行预置镜像和 LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | 需要使用 KernelSU 内核驱动重新编译 | +| < 4.14 (EOL) | 需要使用 KernelSU 内核驱动重新编译(3.18+ 的版本处于试验阶段,可能需要进行回溯移植) | + +**支持的架构:** `arm64-v8a`、`armeabi-v7a`、`x86_64` + +> [!CAUTION] +> 最近的内核版本引入了一项破坏性更改,导致 KernelSU Next 在 `x86_64` 上运行失败,甚至可能引发内核恐慌 (kernel panic)!请查看网站获取更多信息! + +--- + +## 📦 安装 + +请遵循该[安装说明](https://kernelsu-next.github.io/webpage/zh_CN/pages/installation.html)进行操作。 + +--- + +## 🏅 贡献 + +- 前往 [Crowdin](https://crowdin.com/project/kernelsu-next) 为管理器提交翻译! +- 有关报告 KernelSU Next 漏洞的信息,请参阅 [SECURITY.md](/SECURITY.md)。 + +--- + +## 📜 许可 + +- **目录 `/kernel` 下所有文件**为 [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)。 +- **`/kernel` 目录以外的其他部分**均为 [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html)。 + +--- + +## 💸 捐赠 + +如果你喜欢这个项目还请支持: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 鸣谢 + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – KernelSU 的灵感 +- [Magisk](https://github.com/topjohnwu/Magisk) – 强大的 Root 工具 +- [Genuine](https://github.com/brevent/genuine/) – APK v2 签名验证 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – 一些 Rootkit 技巧 +- [KernelSU](https://github.com/tiann/KernelSU) – 感谢 tiann,否则 KernelSU Next 根本不会存在 +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – 💜 5ec1cff 为了拯救 KernelSU! diff --git a/KernelSU-Next/docs/README_ES.md b/KernelSU-Next/docs/README_ES.md new file mode 100644 index 000000000000..09033efb011d --- /dev/null +++ b/KernelSU-Next/docs/README_ES.md @@ -0,0 +1,94 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | **Español** + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Una solución de root basada en el kernel para tus dispositivos Android.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Características + +- `su` y gestión de acceso root basados en el kernel. +- Sistema de módulos basado en [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) y [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Perfil de Aplicación](https://kernelsu.org/guide/app-profile.html): Limita los privilegios de root por aplicación. + +--- + +## ✅ Compatibilidad + +KernelSU Next es compatible con kernels de Android desde la versión **4.4 hasta la 6.6**. + +| Versión del kernel | Notas de soporte | +|----------------------|-----------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Admite imágenes precompiladas y LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Requiere que el driver de KernelSU esté integrado | +| < 4.14 (EOL) | Requiere el driver de KernelSU (3.18+ es experimental y puede necesitar backports | + +**Arquitecturas compatibles:** `arm64-v8a`, `armeabi-v7a` y `x86_64` + +> [!CAUTION] +> ¡Las versiones recientes del kernel han implementado un cambio que rompe la compatibilidad, causando que KernelSU Next falle y potencialmente provoque un kernel panic en `x86_64`! ¡Consulta el sitio web para más información! + +--- + +## 📦 Instalación + +Por favor, consulta la guía de [Instalación](https://kernelsu-next.github.io/webpage/pages/installation.html) para ver las instrucciones de configuración. + +--- + +## 🏅 Contribución + +Para informar sobre problemas de seguridad, por favor, consulta [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Licencia + +- **Directorio `/kernel`:** [Solo-GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Todos los demás archivos:** [GPL-3.0-o-superior](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Donaciones + +Si te gustaría apoyar el proyecto: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Créditos + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Inspiración para el concepto +- [Magisk](https://github.com/topjohnwu/Magisk) – Implementación principal del root +- [Genuine](https://github.com/brevent/genuine/) – Validación de la firma v2 de los APK +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Técnicas de rootkit +- [KernelSU](https://github.com/tiann/KernelSU) – La base original que hizo posible KernelSU Next +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – 💜 a 5ec1cff por mantener vivo KernelSU diff --git a/KernelSU-Next/docs/README_FR.md b/KernelSU-Next/docs/README_FR.md new file mode 100644 index 000000000000..d220c0d2f530 --- /dev/null +++ b/KernelSU-Next/docs/README_FR.md @@ -0,0 +1,49 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | **Français** | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +Une solution root basée sur le noyau pour les appareils Android. + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## Fonctionnalités + +1. Gestion des accès root et de la commande `su` basée sur le noyau. +2. Système de modules basé sur le système de montage dynamique [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +3. [Profil d'application](https://kernelsu.org/guide/app-profile.html) : Enfermez la puissance du root dans une cage. + +## État de compatibilité + +KernelSU Next prend officiellement en charge la plupart des noyaux Android de la version 4.4 à la version 6.6. + - Les noyaux GKI 2.0 (5.10+) peuvent exécuter des images pré-construites et des modules LKM/KMI. + - Les noyaux GKI 1.0 (4.19 - 5.4) doivent être reconstruits avec le pilote KernelSU. + - Les noyaux EOL (<4.14) doivent également être reconstruits avec le pilote KernelSU (3.18+ est expérimental et peut nécessiter des rétroportages fonctionnels). + +Actuellement, seul `arm64-v8a`, `armeabi-v7a` & `x86_64` est pris en charge. + +## Utilisation + +- [Instructions d'installation](https://ksunext.org/pages/installation.html) + +## Sécurité + +Pour signaler des vulnérabilités de sécurité dans KernelSU, consultez [SECURITY.md](/SECURITY.md). + +## Licence + +- Les fichiers du répertoire `kernel` sont sous licence [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- Toutes les autres parties, sauf le répertoire `kernel`, sont sous licence [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +## Crédits + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) : L'idée de KernelSU. +- [Magisk](https://github.com/topjohnwu/Magisk) : L'outil root puissant. +- [genuine](https://github.com/brevent/genuine/) : Validation de signature APK v2. +- [Diamorphine](https://github.com/m0nad/Diamorphine) : Quelques techniques de rootkit. +- [KernelSU](https://github.com/tiann/KernelSU) : Merci à tiann, sans qui KernelSU Next n'existerait même pas. +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) : 💜 5ec1cff pour avoir sauvé KernelSU ! diff --git a/KernelSU-Next/docs/README_ID.md b/KernelSU-Next/docs/README_ID.md new file mode 100644 index 000000000000..6dcb97e2148f --- /dev/null +++ b/KernelSU-Next/docs/README_ID.md @@ -0,0 +1,52 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | **Bahasa Indonesia** | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +Sebuah solusi root berbasis Kernel untuk perangkat Android. + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## Fitur + +1. Akses root dan manajemen `su` berbasis Kernel. +2. Sistem modul berbasis sistem mount dinamis [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +3. [Profil Aplikasi](https://kernelsu.org/guide/app-profile.html): Mengunci kekuatan root dalam sebuah kandang. + +## Status Kompatibilitas + +KernelSU Next secara resmi mendukung sebagian besar kernel Android mulai dari 4.4 hingga 6.6. + - Kernel GKI 2.0 (5.10+) dapat menjalankan gambar yang telah dibangun sebelumnya dan LKM/KMI. + - Kernel GKI 1.0 (4.19 - 5.4) perlu dibangun ulang dengan driver KernelSU. + - Kernel EOL (<4.14) juga perlu dibangun ulang dengan driver KernelSU (3.18+ bersifat eksperimental dan mungkin memerlukan beberapa backport fungsi). + +Saat ini, hanya `arm64-v8a`, `armeabi-v7a` & `x86_64` yang didukung. + +> [!CAUTION] +> Versi kernel terbaru telah menerapkan perubahan yang merusak yang menyebabkan KernelSU Next gagal dan berpotensi memicu kernel panic pada `x86_64`! Cek situs web untuk info lebih lanjut! + +## Penggunaan + +- [Petunjuk instalasi](https://ksunext.org/pages/installation.html) + +## Keamanan + +Untuk informasi tentang melaporkan kerentanannya di KernelSU, lihat [SECURITY.md](/SECURITY.md). + +## Lisensi + +- File di bawah direktori `kernel` menggunakan lisensi [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- Semua bagian lain kecuali direktori `kernel` menggunakan lisensi [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +## Kredit + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ide KernelSU. +- [Magisk](https://github.com/topjohnwu/Magisk): Alat root yang kuat. +- [genuine](https://github.com/brevent/genuine/): Validasi tanda tangan APK v2. +- [Diamorphine](https://github.com/m0nad/Diamorphine): Beberapa keterampilan rootkit. +- [KernelSU](https://github.com/tiann/KernelSU): Terima kasih kepada tiann, jika tidak, KernelSU Next bahkan tidak akan ada. +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff karena menyelamatkan KernelSU! diff --git a/KernelSU-Next/docs/README_IT.md b/KernelSU-Next/docs/README_IT.md new file mode 100644 index 000000000000..607ec011d80d --- /dev/null +++ b/KernelSU-Next/docs/README_IT.md @@ -0,0 +1,66 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | **Italiano** | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +Una soluzione root basata sul kernel per dispositivi Android. + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## Caratteristiche + +1. Gestione degli accessi `su` e root basata sul kernel. +2. Sistema modulare basato sul sistema di montaggio dinamico [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +3. [App Profile](https://kernelsu.org/guide/app-profile.html): Rinchiudi il potere della radice in una gabbia. + +## Stato compatibilità + +KernelSU Next supporta ufficialmente la maggior parte dei kernel Android dalla versione 4.4 alla 6.6. + - I kernel GKI 2.0 (5.10+) possono eseguire immagini precostruite e LKM/KMI. + - I kernel GKI 1.0 (4.19 - 5.4) devono essere ricostruiti con il driver KernelSU. + - Anche i kernel EOL (<4.14) devono essere ricostruiti con il driver KernelSU (la versione 3.18+ è sperimentale e potrebbe richiedere alcuni backport di funzioni). + +Attualmente è supportata solo l'architettura `arm64-v8a`, `armeabi-v7a` & `x86_64`. + +> [!CAUTION] +> Le versioni recenti del kernel hanno implementato una modifica che causa il fallimento di KernelSU Next e potenzialmente innesca un kernel panic su `x86_64`! Controlla il sito web per maggiori informazioni! + +## Utilizzo + +- [Istruzioni per l'installazione](https://ksunext.org/pages/installation.html) + +## Security + +Per informazioni sulla segnalazione delle vulnerabilità di sicurezza in KernelSU, vedere [SECURITY.md](/SECURITY.md). + +## Licenza + +- I file nella directory `kernel` sono [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- Tutte le altre parti eccetto la directory `kernel` sono [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +## Donazioni + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ] + +- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ] + +- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ] + +- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ] + +## Crediti + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): L'idea di KernelSU. +- [Magisk](https://github.com/topjohnwu/Magisk): Il potente strumento di root. +- [genuine](https://github.com/brevent/genuine/): Convalida della firma APK v2. +- [Diamorphine](https://github.com/m0nad/Diamorphine): Alcune competenze sui rootkit. +- [KernelSU](https://github.com/tiann/KernelSU): Grazie a tiann, altrimenti KernelSU Next non esisterebbe nemmeno. +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff per aver salvato KernelSU! diff --git a/KernelSU-Next/docs/README_JA.md b/KernelSU-Next/docs/README_JA.md new file mode 100644 index 000000000000..2d98cad158ef --- /dev/null +++ b/KernelSU-Next/docs/README_JA.md @@ -0,0 +1,63 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | **日本語** | [Español](README_ES.md) + +# KernelSU Next + +logo + +Android デバイス用のカーネルベースな root ソリューション。 + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## 機能 + +1. カーネルベースの `su` および root アクセスの管理。 +2. 動的マウントシステム [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) をベースとしたモジュールシステム。 +3. [アプリプロファイル](https://kernelsu.org/guide/app-profile.html): root 権限をケージに閉じ込めます。 + +## 互換性の状態 + +KernelSU Next は 4.4 から 6.6 までのほとんどの Android カーネルを公式でサポートしています。 + - GKI 2.0 (5.10 以降) のカーネルはビルド済みイメージで LKM/KMI を実行できます。 + - GKI 1.0 (4.19 - 5.4) のカーネルは、KernelSU ドライバを使用してビルドする必要があります。 + - EOL (4.14 未満) のカーネルも KernelSU ドライバを使用して再ビルドする必要があります (3.18 以降は実験中の段階であり、一部の関数のバックポートが必要になる場合があります)。 + +現在 `arm64-v8a`, `armeabi-v7a` & `x86_64` アーキテクチャのみをサポートしています。 + +## 使い方 + +- [インストール手順](https://ksunext.org/pages/installation.html) + +## セキュリティ + +KernelSU のセキュリティ脆弱性の報告については [SECURITY.md](/SECURITY.md) を参照してください。 + +## ライセンス + +- `kernel` ディレクトリ内のファイルは [GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.ja.html) のみライセンス下にあります。 +- `kernel` ディレクトリを除くその他すべての部分は [GPL-3.0 またはそれ以降](https://www.gnu.org/licenses/gpl-3.0.html) のライセンス下にあります。 + +## 寄付 + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ] + +- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ] + +- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ] + +- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ] + +## クレジット + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU のアイデアを考案。 +- [Magisk](https://github.com/topjohnwu/Magisk): パワフルな root ツール。 +- [genuine](https://github.com/brevent/genuine/): APK v2 署名認証。 +- [Diamorphine](https://github.com/m0nad/Diamorphine): いくつかの rootkit スキル。 +- [KernelSU](https://github.com/tiann/KernelSU): tiann に感謝を申し上げます。これが存在しなければ KernelSU Next は存在しませんでした。 +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff へ KernelSU を救ってくれてありがとう! diff --git a/KernelSU-Next/docs/README_KO.md b/KernelSU-Next/docs/README_KO.md new file mode 100644 index 000000000000..584e88d8e717 --- /dev/null +++ b/KernelSU-Next/docs/README_KO.md @@ -0,0 +1,49 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | **한국어** | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +안드로이드 기기들을 위한 커널 기반 루팅 솔루션입니다. + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## 기능 + +1. 커널 기반 `su` 및 루트 권한 관리 +2. 동적 마운트 시스템 기반 모듈 시스템 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +3. [App Profile](https://kernelsu.org/guide/app-profile.html): 루트 권한 제한 + +## 호환 상태 + +KernelSU Next는 공식적으로 대부분의 4.4부터 6.6의 안드로이드 커널을 지원합니다. + - GKI 2.0 (5.10+) 커널은 미리 빌드된 이미지와 LKM/KMI를 지원합니다. + - GKI 1.0 (4.19 - 5.4) 커널은 KernelSU 드라이버로 다시 빌드해야 합니다. + - EOL (<4.14) 커널도 역시 KernelSU 드라이버로 다시 빌드해야 합니다.(3.18+는 실험적이며 일부 함수의 이식이 필요할 수 있습니다.). + +현재는, `arm64-v8a`, `armeabi-v7a` & `x86_64` 만 지원됩니다. + +## 사용 방법 + +- [설치 방법](https://ksunext.org/pages/installation.html) + +## 보안 + +KernelSU의 보안 취약점 보고에 대한 자세한 내용은 [SECURITY.md](/SECURITY.md)를 참조하세요. + +## 저작권 라이센스 + +- `kernel` 디렉터리의 파일은 [GPL-2.0전용](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)입니다. +- `kernel` 디렉터리를 제외한 모든 파일은 [GPL-3.0-이상](https://www.gnu.org/licenses/gpl-3.0.html)입니다. + +## 크레딧 + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): KernelSU의 아이디어 +- [Magisk](https://github.com/topjohnwu/Magisk): 강력한 루팅 도구 +- [genuine](https://github.com/brevent/genuine/): APK v2 서명 검사 +- [Diamorphine](https://github.com/m0nad/Diamorphine): 일부 rootkit 기술 +- [KernelSU](https://github.com/tiann/KernelSU): KernelSU Next가 존재할 수 있게 해 준 tiann에게 감사드립니다. +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): KernelSU를 구해준 5ec1cff에게 감사드립니다! diff --git a/KernelSU-Next/docs/README_PL.md b/KernelSU-Next/docs/README_PL.md new file mode 100644 index 000000000000..ee2e6f911134 --- /dev/null +++ b/KernelSU-Next/docs/README_PL.md @@ -0,0 +1,94 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | **Polski** | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Bazujące na jądrze rozwiązanie root dla urządzeń z Androidem.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Funkcjonalność + +- Oparte na jądrze `su` i zarządzanie dostępem do roota. +- System modułów oparty na [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) i [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Profil aplikacji](https://kernelsu.org/guide/app-profile.html): Ograniczaj uprawnienia roota dla poszczególnych aplikacji. + +--- + +## ✅ Kompatybilność + +KernelSU Next obsługuje jądra Androida od wersji **4.4 do 6.6**: + +| Wersja jądra | Informacje techniczne | +|----------------------|-------------------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Obsługuje wstępnie skompilowane obrazy i LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Wymaga wbudowania sterownika KernelSU | +| < 4.14 (EOL) | Wymaga sterownika KernelSU (obsługa 3.18+ jest eksperymentalna i może wymagać backportów) | + +**Obsługiwane architektury:** `arm64-v8a`, `armeabi-v7a` i `x86_64` + +> [!CAUTION] +> Nowsze wersje jądra wprowadzają zmianę, która powoduje awarię KernelSU Next i może wywołać kernel panic na `x86_64`! Sprawdź stronę internetową po więcej informacji! + +--- + +## 📦 Instalacja + +Instrukcje dotyczące instalacji można znaleźć w przewodniku [Instalacja](https://kernelsu-next.github.io/webpage/pages/installation.html). + +--- + +## 🏅 Bezpieczeństwo + +Aby zgłosić problemy związane z bezpieczeństwem, zapoznaj się z [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Licencje + +- **katalog `/kernel`:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Wszystkie pozostałe pliki:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Darowizny + +Jeśli chciałbyś wesprzeć projekt: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Podziękowania + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Inspiracja konceptem +- [Magisk](https://github.com/topjohnwu/Magisk) – Bazowa implementacja roota +- [Genuine](https://github.com/brevent/genuine/) – Walidacja podpisu APK v2 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Techniki rootkit +- [KernelSU](https://github.com/tiann/KernelSU) – Oryginalna baza, która umożliwiła powstanie KernelSU Next +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – Za obsługę Magic Mount diff --git a/KernelSU-Next/docs/README_PT-BR.md b/KernelSU-Next/docs/README_PT-BR.md new file mode 100644 index 000000000000..6f92c8602ffc --- /dev/null +++ b/KernelSU-Next/docs/README_PT-BR.md @@ -0,0 +1,95 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | **Português (Brasil)** | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Uma solução root baseada em kernel para dispositivos Android.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Características + +- `su` e gerenciamento de acesso root baseado em kernel. +- Sistema de módulos baseado em [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) e [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Perfil do Aplicativo](https://kernelsu.org/pt_BR/guide/app-profile.html): Limite privilégios root por app. + +--- + +## ✅ Compatibilidade + +O KernelSU Next oferece suporte a kernels Android **4.4 até 6.6**. + +| Versão do kernel | Notas de suporte | +|----------------------|-------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Suporta imagens pré-compiladas e LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Requer driver do KernelSU integrado | +| < 4.14 (EOL) | Requer driver do KernelSU (3.18+ é experimental e pode precisar de backports) | + +**Arquiteturas suportadas:** `arm64-v8a`, `armeabi-v7a` e `x86_64` + +> [!CAUTION] +> Versões recentes do kernel implementaram uma mudança que quebra a compatibilidade, fazendo com que o KernelSU Next falhe e potencialmente cause um kernel panic no `x86_64`! Verifique o site para mais informações! + +--- + +## 📦 Instalação + +Consulte o guia de [Instalação](https://kernelsu-next.github.io/webpage/pt_BR/pages/installation.html) para obter instruções de configuração. + +--- + +## 🏅 Contribuição + +- Acesse o nosso [Crowdin](https://crowdin.com/project/kernelsu-next) para enviar uma tradução para o manager! +- Para relatar problemas de segurança, consulte [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Licença + +- **Diretório `/kernel`:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Todos os outros arquivos:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Doações + +Se você quiser apoiar o projeto: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Créditos + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Inspiração do conceito +- [Magisk](https://github.com/topjohnwu/Magisk) – Implementação root principal +- [Genuine](https://github.com/brevent/genuine/) – Validação de assinatura APK v2 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Técnicas de rootkit +- [KernelSU](https://github.com/tiann/KernelSU) – A base original que tornou o KernelSU Next possível +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – Para suporte de Magic Mount diff --git a/KernelSU-Next/docs/README_RU.md b/KernelSU-Next/docs/README_RU.md new file mode 100644 index 000000000000..572f6e7c7ec7 --- /dev/null +++ b/KernelSU-Next/docs/README_RU.md @@ -0,0 +1,94 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | **Русский** | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Решение root на базе ядра для устройств Android.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Функции + +- Управление `su` и root-доступом на уровне ядра. +- Система модулей на основе [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) и [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Профиль приложений](https://kernelsu.org/ru_RU/guide/app-profile.html): Ограничение root-прав для отдельных приложений. + +--- + +## ✅ Совместимость + +KernelSU Next поддерживает ядра Android версий **от 4.4 до 6.6**. + +| Версия ядра | Примечания по поддержке | +|----------------------|------------------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Поддержка предсобранных образов и LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Требуется встроенный драйвер KernelSU | +| < 4.14 (EOL) | Требуется драйвер KernelSU (3.18+ экспериментальная поддержка, может потребоваться порт) | + +**Поддерживаемые архитектуры:** `arm64-v8a`, `armeabi-v7a`, `x86_64` + +> [!CAUTION] +> В последних версиях ядра реализовано критическое изменение, из-за которого KernelSU Next перестает работать и может вызвать панику ядра (kernel panic) на `x86_64`! Дополнительную информацию смотрите на сайте! + +--- + +## 📦 Установка + +Пожалуйста, ознакомьтесь с [руководством по установке](https://kernelsu-next.github.io/webpage/pages/installation.html) для получения инструкций по настройке. + +--- + +## 🏅 Безопасность + +Для сообщений о проблемах безопасности см. [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Лицензия + +- **Каталог `/kernel`:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Все остальные файлы:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Пожертвования + +Если хотите поддержать проект: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Благодарности + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Вдохновение для концепции +- [Magisk](https://github.com/topjohnwu/Magisk) – Основная реализация root +- [Genuine](https://github.com/brevent/genuine/) – Проверка подписи APK v2 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Техники Rootkit +- [KernelSU](https://github.com/tiann/KernelSU) – Основа для создания KernelSU Next +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – За поддержку Magic Mount diff --git a/KernelSU-Next/docs/README_TH.md b/KernelSU-Next/docs/README_TH.md new file mode 100644 index 000000000000..0c7610678038 --- /dev/null +++ b/KernelSU-Next/docs/README_TH.md @@ -0,0 +1,63 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | **ภาษาไทย** | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +โซลูชั่นรูทบนพื้นฐานเคอร์เนลสำหรับอุปกรณ์ Android + +[![Latest Release](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![Nightly Release](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![License: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![GitHub License](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## คุณสมบัติ + +1. จัดการการเข้าถึงรูท และ `su` บนพื้นฐานเคอร์เนล +2. ระบบโมดูลแบบไดนามิกเมานต์ [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) +3. [App Profile](https://kernelsu.org/guide/app-profile.html): จำกัดสิทธิ์เข้าถึงรูทสำหรับแอปต่างๆ + +## การเข้ากันในอุปกรณ์ต่างๆ + +KernelSU Next รองรับแบบเป็นทางการตั้งแต่เคอร์เนลแอนดรอยด์ 4.4 ถึง 6.6 + - GKI 2.0 (5.10+) เคอร์เนลสามารถรันไฟล์อิมเมจสำเร็จรูป และ LKM/KMI ได้ + - GKI 1.0 (4.19 - 5.4) เคอร์เนลจะต้องรีบิ้วร่วมกับไดร์เวอร์ของ KernelSU + - EOL (<4.14) เคอร์เนลก็ต้องรีบิ้วร่วมกับไดร์เวอร์ของ KernelSU เช่นกัน (3.18+ ยังเป็นเวอร์ชั่นทดลอง และยังต้องเขียนฟังก์ชั่นหลังบ้านเพิ่มเติม) + +ในขณะนี้, มีแค่สถาปัตยกรรม `arm64-v8a`, `armeabi-v7a` & `x86_64` ที่รองรับเท่านั้น + +## การใช้งาน + +- [คำแนะนำในการติดตั้ง](https://ksunext.org/pages/installation.html) + +## ความปลอดภัย + +สำหรับข้อมูลการรายงานช่องโหว่ด้านความปลอดภัยของ KernelSU โปรดดูที่ [SECURITY.md](/SECURITY.md). + +## สัญญาอนุญาต + +- ไฟล์ภายใต้โฟลเดอร์ `kernel` ถือว่าเป็นสัญญาอนุญาต [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- ไฟล์ที่นอกเหนือจากโฟลเดอร์ `kernel` ถือว่าเป็นสัญญาอนุญาต [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +## การบริจาก + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ] + +- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ] + +- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ] + +- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ] + +## เครดิต + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): ที่เป็นคนริเริ่มไอเดีย KernelSU +- [Magisk](https://github.com/topjohnwu/Magisk): เครื่องมือรูทที่ทรงพลัง +- [genuine](https://github.com/brevent/genuine/): การตรวจสอบลายเซ็น APK v2 +- [Diamorphine](https://github.com/m0nad/Diamorphine): ความรู้เกี่ยวกับ rootkit +- [KernelSU](https://github.com/tiann/KernelSU): ต้องขอบคุณ tiann ไม่งั้นจะไม่มี KernelSU ขึ้นมา +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 💜 5ec1cff ที่ช่วย KernelSU เอาไว้! diff --git a/KernelSU-Next/docs/README_TR.md b/KernelSU-Next/docs/README_TR.md new file mode 100644 index 000000000000..e33ce491c2a1 --- /dev/null +++ b/KernelSU-Next/docs/README_TR.md @@ -0,0 +1,94 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | **Türkçe** | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Android cihazlar için çekirdek tabanlı bir root çözümüdür.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Özellikler + +- Çekirdek tabanlı `su` ve root erişim yönetimi. +- [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount)** ve [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS) tabanlı modül sistemi. +- [Uygulama Profili](https://kernelsu.org/guide/app-profile.html): Uygulama başına root yetkisini sınırlandırma. + +--- + +## ✅ Uyumluluk + +KernelSU Next, **4.4 ile 6.6** arasındaki Android çekirdeklerini destekler. + +| Çekirdek Sürümü | Destek Notları | +|----------------------|---------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Hazır imajlar ve LKM/KMI desteği | +| 4.19 – 5.4 (GKI 1.0) | KernelSU sürücüsünün çekirdeğe gömülü olması gerekir | +| < 4.14 (EOL) | KernelSU sürücüsü gerekir (3.18+ deneysel olup yama gerektirebilir) | + +**Desteklenen mimariler:** `arm64-v8a`, `armeabi-v7a`, `x86_64` + +> [!CAUTION] +> Yeni çekirdek sürümleri, KernelSU Next'nun çökmesine ve `x86_64` üzerinde kernel panic tetiklemesine neden olabilecek uyumsuz bir değişiklik uyguladı! Daha fazla bilgi için web sitesini kontrol edin! + +--- + +## 📦 Kurulum + +Kurulum talimatları için [Kurulum Kılavuzu](https://kernelsu-next.github.io/webpage/pages/installation.html) sayfasına bakınız. + +--- + +## 🏅 Güvenlik + +Güvenlik açıklarını bildirmek için lütfen [SECURITY.md](/SECURITY.md) dosyasına bakınız. + +--- + +## 📜 Lisans + +- **`/kernel` dizini:** [Yalnızca GPL-2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Diğer tüm dosyalar:** [GPL-3.0-veya-sonrası](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Bağışlar + +Projeye destek olmak isterseniz: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Katkıda Bulunanlar + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – KernelSU Fikrinin temeli +- [Magisk](https://github.com/topjohnwu/Magisk) – Temel root altyapısı +- [Genuine](https://github.com/brevent/genuine/) – APK v2 imza doğrulaması +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Rootkit teknikleri +- [KernelSU](https://github.com/tiann/KernelSU) – KernelSU Next'in temelini oluşturan orijinal proje +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – KernelSU’yu kurtardığı için 💜 5ec1cff’e teşekkürler diff --git a/KernelSU-Next/docs/README_TW.md b/KernelSU-Next/docs/README_TW.md new file mode 100644 index 000000000000..8dec35a4841b --- /dev/null +++ b/KernelSU-Next/docs/README_TW.md @@ -0,0 +1,93 @@ +[English](README.md) | [简体中文](README_CN.md) | **繁體中文** | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

基於內核的 Android 設備 Root 解決方案。

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 特性 + +- 基於內核的 `su` 和 Root 權限管理。 +- 模塊系統基於 [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) 以及 [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS)。 +- [App Profile](https://kernelsu.org/zh_TW/guide/app-profile.html):把 Root 權限關進籠子裡。 + +--- + +## ✅ 兼容狀態 + +KernelSU Next 正式支持大多數從 **4.4 到 6.6** 的 Android 內核。 + +| 内核版本 | 支援狀況 | +|----------------------|------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | 可以運行預構建的映像和 LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | 需要重新編譯 KernelSU 驅動程序 | +| < 4.14 (EOL) | 需要重新編譯 KernelSU 驅動程序(3.18+ 是實驗性的,可能需要回溯移植一些功能) | + +**支援的架構:** `arm64-v8a`、`armeabi-v7a`、`x86_64` + +> [!CAUTION] +> 最近的核心版本引入了一項破壞性更改,導致 KernelSU Next 在 `x86_64` 上執行失敗,甚至可能引發核心恐慌 (kernel panic)!請查看網站獲取更多資訊! + +--- + +## 📦 用法 + +請遵循[安裝説明](https://kernelsu-next.github.io/webpage/pages/installation.html)進行操作。 + +--- + +## 🏅 貢獻 + +- 前往我們的 [Crowdin](https://crowdin.com/project/kernelsu-next) 為管理器提交翻譯! +- 有關報告 KernelSU Next 漏洞的信息,請參閱 [SECURITY.md](/SECURITY.md)。 + +--- + +## 📜 許可證 + +- **目錄 `/kernel` 下所有文件**為 [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)。 +- **`/kernel` 目錄以外的其他部分**均為 [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html)。 + +--- + +## 💸 抖内 + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 鳴謝 + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/):KernelSU 的靈感。 +- [Magisk](https://github.com/topjohnwu/Magisk):強大的 Root 工具。 +- [Genuine](https://github.com/brevent/genuine/):APK v2 簽名驗證。 +- [Diamorphine](https://github.com/m0nad/Diamorphine):一些 Rootkit 技巧。 +- [KernelSU](https://github.com/tiann/KernelSU):感謝 tiann,否則 KernelSU Next 根本不會存在。 +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs):💜 5ec1cff 為了拯救 KernelSU! diff --git a/KernelSU-Next/docs/README_UA.md b/KernelSU-Next/docs/README_UA.md new file mode 100644 index 000000000000..77068b3eb0e1 --- /dev/null +++ b/KernelSU-Next/docs/README_UA.md @@ -0,0 +1,91 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | **Українська** | [ภาษาไทย](README_TH.md) | [Tiếng Việt](README_VI.md) | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +--- + +
+ KernelSU Next Logo + +

KernelSU Next

+

Рішення для root-прав на основі ядра для пристроїв Android.

+ +

+ + Latest Release + + + Nightly Build + + + License: GPL v2 + + + GitHub License + + +

+
+ +--- + +## 🚀 Особливості + +- Керування `su` та root-доступом на основі ядра. +- Модульна система на основі [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) та [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +- [Профілі програм](https://kernelsu.org/guide/app-profile.html): Обмеження root-прав для кожної програми. + +--- + +## ✅ Сумісність + +KernelSU Next підтримує ядра Android від **4.4 до 6.6**. + +| Версія ядра | Примітки підтримки | +|----------------------|-------------------------------------------------------------------------------------------| +| 5.10+ (GKI 2.0) | Підтримує попередньо створені образи та LKM/KMI | +| 4.19 – 5.4 (GKI 1.0) | Потрібен вбудований драйвер KernelSU | +| < 4.14 (EOL) | Потрібен драйвер KernelSU (версія 3.18+ є експериментальною, може знадобитися портування) | + +**Підтримувані архітектури:** `arm64-v8a`, `armeabi-v7a`, `x86_64` + +--- + +## 📦 Встановлення + +Будь ласка, зверніться до [Посібника з встановлення](https://kernelsu-next.github.io/webpage/pages/installation.html) для отримання інструкцій з налаштування. + +--- + +## 🏅 Безпека + +Щоб повідомити про проблеми безпеки, див [SECURITY.md](/SECURITY.md). + +--- + +## 📜 Ліцензія + +- **Каталог `/kernel`:** [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- **Усі інші файли:** [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +--- + +## 💸 Пожертви + +Якщо ви хочете підтримати проєкт: + +- **USDT (BEP20, ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **USDT (TRC20)**: `TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh` +- **USDT (SOL)**: `A4wqBXYd6Ey4nK4SJ2bmjeMgGyaLKT9TwDLh8BEo8Zu6` +- **ETH (ERC20)**: `0x12b5224b7aca0121c2f003240a901e1d064371c1` +- **LTC**: `Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL` +- **BTC**: `19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6` + +--- + +## 🙏 Подяки + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/) – Натхнення для концепції +- [Magisk](https://github.com/topjohnwu/Magisk) – Топовий інструмент для root +- [Genuine](https://github.com/brevent/genuine/) – Перевірка підпису APK версії 2 +- [Diamorphine](https://github.com/m0nad/Diamorphine) – Деякі навики RootKit +- [KernelSU](https://github.com/tiann/KernelSU) – Основа для KernelSU Next +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs) – 💜 до 5ec1cff за збереження KernelSU diff --git a/KernelSU-Next/docs/README_VI.md b/KernelSU-Next/docs/README_VI.md new file mode 100644 index 000000000000..65bcfe83f834 --- /dev/null +++ b/KernelSU-Next/docs/README_VI.md @@ -0,0 +1,66 @@ +[English](README.md) | [简体中文](README_CN.md) | [繁體中文](README_TW.md) | [Türkçe](README_TR.md) | [Português (Brasil)](README_PT-BR.md) | [한국어](README_KO.md) | [Français](README_FR.md) | [Bahasa Indonesia](README_ID.md) | [Русский](README_RU.md) | [Українська](README_UA.md) | [ภาษาไทย](README_TH.md) | **Tiếng Việt** | [Italiano](README_IT.md) | [Polski](README_PL.md) | [Български](README_BG.md) | [日本語](README_JA.md) | [Español](README_ES.md) + +# KernelSU Next + +logo + +Một giải pháp root từ nhân linux dành cho các thiết bị chạy Android + +[![Phiên bản mới nhất](https://img.shields.io/github/v/release/KernelSU-Next/KernelSU-Next?label=Release&logo=github)](https://github.com/KernelSU-Next/KernelSU-Next/releases/latest) +[![CI build mới nhất](https://img.shields.io/badge/Nightly%20Release-gray?logo=hackthebox&logoColor=fff)](https://nightly.link/KernelSU-Next/KernelSU-Next/workflows/build-manager-ci/next/Manager) +[![Gíây pháp: GPL v2](https://img.shields.io/badge/License-GPL%20v2-orange.svg?logo=gnu)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) +[![Gíây phép GITHUB](https://img.shields.io/github/license/KernelSU-Next/KernelSU-Next?logo=gnu)](/LICENSE) + +## Tính năng + +1. Quản lý quyền truy cập SU dựa trên kernel android. +2. Hệ thống mount module dựa trên 1 trong 2 cơ chế mount [Magic Mount](https://topjohnwu.github.io/Magisk/details.html#magic-mount) / [OverlayFS](https://en.wikipedia.org/wiki/OverlayFS). +3. [App Profile](https://kernelsu.org/guide/app-profile.html): Quản lý quyền truy cập root 1 cách chặt chẽ + +## Danh sách tương thích + +KernelSU Next hỗ trợ chính thức các kernel Android từ phiên bản 4.4 đến 6.6 + - GKI 2.0 (5.10+) kernels có thể cài đặt qua những .img/.zip đã được build sẵn và LKM/KMI hoặc tự vá qua manager (nếu được) + - GKI 1.0 (4.19 - 5.4) kernels cần dược build lại với các nhân KernelSU Next + - EOL (<4.14) kernels cần dược build lại với các nhân KernelSU Next (các kernels 3.18+ đang dược thử nghiệm và có thể cần backports 1 vài thứ ). + +Hiện tại kernelSU Next chỉ hỗ trợ những cpu có `arm64-v8a`, `armeabi-v7a` & `x86_64` + +> [!CAUTION] +> Các phiên bản kernel gần đây đã áp dụng một thay đổi lớn có thể khiến KernelSU Next gặp lỗi và có khả năng gây ra kernel panic trên `x86_64`! Hãy kiểm tra trang web để biết thêm thông tin! + +## Sử dụng + +- [Hướng dẫn vá KernelSU Next vào Kernel của bạn (yêu cầu kernel source)](https://ksunext.org/pages/installation.html) + +## Bảo mật + +Để biết thêm thông tin về việc báo cáo lỗ hổng bảo mật trong KernelSU Next vui lòng đọc (Thông tin sẽ dược gửi về KernelSU)[SECURITY.md](/SECURITY.md). + +## Gíây phép + +- Những thư mục/tập tin trong `kernel` là giấy phép [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html). +- Những thư mục/tập tin ngoài `kernel` là giấy phép [GPL-3.0-or-later](https://www.gnu.org/licenses/gpl-3.0.html). + +## Quyên góp/Hỗ trợ + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT BEP20 ] + +- TYUVMWGTcnR5svnDoX85DWHyqUAeyQcdjh [ USDT TRC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ USDT ERC20 ] + +- 0x12b5224b7aca0121c2f003240a901e1d064371c1 [ ETH ERC20 ] + +- Ld238uYBuRQdZB5YwdbkuU6ektBAAUByoL [ LTC ] + +- 19QgifcjMjSr1wB2DJcea5cxitvWVcXMT6 [ BTC ] + +## Lời cảm ơn tới... + +- [Kernel-Assisted Superuser](https://git.zx2c4.com/kernel-assisted-superuser/about/): Ý tưởng cho sự ra đời của KernelSU. +- [Magisk](https://github.com/topjohnwu/Magisk): Công cụ root mạnh mẽ, quen thuộc và tương thích cao cho các thiết bị chạy Android. +- [genuine](https://github.com/brevent/genuine/): Chữ kí apk v2. +- [Diamorphine](https://github.com/m0nad/Diamorphine): Một vài kỹ năng rootkit. +- [KernelSU](https://github.com/tiann/KernelSU): Nguồn gốc của KernelSU Next, thanks to tiann. +- [Magic Mount Port](https://github.com/5ec1cff/KernelSU/blob/main/userspace/ksud/src/magic_mount.rs): 5ec1cff - người đã cứu lấy KernelSU💜 ! diff --git a/KernelSU-Next/docs/WebUi_Next/API_DOC.md b/KernelSU-Next/docs/WebUi_Next/API_DOC.md new file mode 100644 index 000000000000..58679752afda --- /dev/null +++ b/KernelSU-Next/docs/WebUi_Next/API_DOC.md @@ -0,0 +1,326 @@ +# WebUI-Next API Documentation + +This document provides examples of how to use the `WebUI-Next` JavaScript APIs exposed to a module WebUI. These APIs allow code to run in the WebUI to interact with the system, execute shell commands, manage packages, control UI elements, and more coming soon. + + +## Table of Contents +1. [exec(cmd)](#exec-cmd) +2. [exec(cmd, callbackFunc)](#exec-cmd-callbackfunc) +3. [exec(cmd, options, callbackFunc)](#exec-cmd-options-callbackfunc) +4. [spawn(command, args, options, callbackFunc)](#spawn-command-args-options-callbackfunc) +5. [toast(msg)](#toast-msg) +6. [fullScreen(enable)](#fullscreen-enable) +7. [moduleInfo()](#moduleinfo) +8. [listSystemPackages()](#listsystempackages) +9. [listUserPackages()](#listuserpackages) +10. [listAllPackages()](#listallpackages) +11. [getPackagesInfo(packageNamesJson)](#getpackagesinfo-packagenamesjson) +12. [cacheAllPackageIcons(size)](#cacheallpackageicons-size) +13. [getPackagesIcons(packageNamesJson, size)](#getpackagesicons-packagenamesjson-size) + +--- + +## exec(cmd) + +Executes a shell command synchronously and returns the output as a string. + +### Parameters +- `cmd` (String): The shell command to execute. + +### Returns +- `String`: The command output (stdout). + +### Example +```javascript +const output = ksu.exec("ls /system"); +console.log("Output:", output); +``` + +--- + +## exec(cmd, callbackFunc) + +Executes a shell command asynchronously and invokes the provided callback function with the result. + +### Parameters +- `cmd` (String): The shell command to execute. +- `callbackFunc` (String): The name of the JavaScript callback function to invoke with the result. + +### Callback Signature +```javascript +function callbackFunc(exitCode, stdout, stderr) { + // Handle result +} +``` + +### Example +```javascript +function handleResult(exitCode, stdout, stderr) { + console.log("Exit Code:", exitCode); + console.log("Stdout:", stdout); + console.log("Stderr:", stderr); +} + +ksu.exec("ls /system", "handleResult"); +``` + +--- + +## exec(cmd, options, callbackFunc) + +Executes a shell command asynchronously with options (e.g., working directory, environment variables) and invokes the provided callback function with the result. + +### Parameters +- `cmd` (String): The shell command to execute. +- `options` (String): A JSON string specifying options like `cwd` (working directory) and `env` (environment variables). +- `callbackFunc` (String): The name of the JavaScript callback function to invoke with the result. + +### Options Format +```javascript +{ + "cwd": "/path/to/working/directory", + "env": { + "KEY1": "VALUE1", + "KEY2": "VALUE2" + } +} +``` + +### Callback Signature +```javascript +function callbackFunc(exitCode, stdout, stderr) { + // Handle result +} +``` + +### Example +```javascript +const options = JSON.stringify({ + cwd: "/system", + env: { PATH: "/system/bin" } +}); + +function handleResult(exitCode, stdout, stderr) { + console.log("Exit Code:", exitCode); + console.log("Stdout:", stdout); + console.log("Stderr:", stderr); +} + +ksu.exec("ls", JSON.stringify(options), "handleResult"); +``` + +--- + +## spawn(command, args, options, callbackFunc) + +Spawns a shell command with arguments and streams output through events to a JavaScript object. + +### Parameters +- `command` (String): The shell command to execute. +- `args` (String): A JSON array of command arguments. +- `options` (String): A JSON string specifying options like `cwd` and `env` (optional). +- `callbackFunc` (String): The name of the JavaScript object to receive events (`stdout`, `stderr`, `exit`, `error`). + +### Callback Object +The callback object should implement methods to handle events: +- `stdout.emit('data', data)`: Emits stdout data. +- `stderr.emit('data', data)`: Emits stderr data. +- `exit(code)`: Emits the exit code. +- `error(err)`: Emits an error object with `exitCode` and `message`. + +### Example +```javascript +const streamHandler = { + stdout: { + emit: (event, data) => { + if (event === "data") console.log("Stdout:", data); + } + }, + stderr: { + emit: (event, data) => { + if (event === "data") console.log("Stderr:", data); + } + }, + emit: (event, data) => { + if (event === "exit") console.log("Exit Code:", data); + if (event === "error") console.error("Error:", data); + } +}; + +const args = JSON.stringify(["-l", "/system"]); +const options = JSON.stringify({ cwd: "/system" }); + +ksu.spawn("ls", args, options, "streamHandler"); +``` + +--- + +## toast(msg) + +Displays a short Android toast message. + +### Parameters +- `msg` (String): The message to display. + +### Example +```javascript +ksu.toast("Hello from WebUI-Next!"); +``` + +--- + +## fullScreen(enable) + +Toggles full-screen mode by hiding or showing system UI (status and navigation bars). + +### Parameters +- `enable` (Boolean): `true` to enable full-screen mode, `false` to disable. + +### Example +```javascript +// Enable full-screen +ksu.fullScreen(true); + +// Disable full-screen +ksu.fullScreen(false); +``` + +--- + +## moduleInfo() + +Returns information about the current module as a JSON string. + +### Returns +- `String`: A JSON string containing module information, including `moduleDir` and other module-specific details. + +### Example +```javascript +const moduleInfo = JSON.parse(ksu.moduleInfo()); +console.log("Module Directory:", moduleInfo.moduleDir); +console.log("Module ID:", moduleInfo.id); +``` + +--- + +## listSystemPackages() + +Returns a list of system package names as a JSON array. + +### Returns +- `String`: A JSON array of system package names. + +### Example +```javascript +const systemPackages = JSON.parse(ksu.listSystemPackages()); +console.log("System Packages:", systemPackages); +``` + +--- + +## listUserPackages() + +Returns a list of user-installed package names as a JSON array. + +### Returns +- `String`: A JSON array of user package names. + +### Example +```javascript +const userPackages = JSON.parse(ksu.listUserPackages()); +console.log("User Packages:", userPackages); +``` + +--- + +## listAllPackages() + +Returns a list of all installed package names as a JSON array. + +### Returns +- `String`: A JSON array of all package names. + +### Example +```javascript +const allPackages = JSON.parse(ksu.listAllPackages()); +console.log("All Packages:", allPackages); +``` + +--- + +## getPackagesInfo(packageNamesJson) + +Returns detailed information about specified packages as a JSON array. + +### Parameters +- `packageNamesJson` (String): A JSON array of package names. + +### Returns +- `String`: A JSON array of objects containing package details (`packageName`, `versionName`, `versionCode`, `appLabel`, `isSystem`, `uid`) or an error object if the package is not found. + +### Example +```javascript +const packageNames = JSON.stringify(["com.android.settings", "com.example.app"]); +const packageInfos = JSON.parse(ksu.getPackagesInfo(packageNames)); +packageInfos.forEach(info => { + if (info.error) { + console.error(`Error for ${info.packageName}: ${info.error}`); + } else { + console.log(`Package: ${info.packageName}, Version: ${info.versionName}, System: ${info.isSystem}`); + } +}); +``` + +--- + +## cacheAllPackageIcons(size) + +Caches icons for all installed packages at the specified size. + +### Parameters +- `size` (Number): The size (in pixels) for the square icon. + +### Example +```javascript +// Cache all package icons at 48x48 pixels +ksu.cacheAllPackageIcons(48); +``` + +--- + +## getPackagesIcons(packageNamesJson, size) + +Returns base64-encoded icons for specified packages as a JSON array. + +### Parameters +- `packageNamesJson` (String): A JSON array of package names. +- `size` (Number): The size (in pixels) for the square icon. + +### Returns +- `String`: A JSON array of objects containing `packageName` and `icon` (base64-encoded PNG or empty string if unavailable). + +### Example +```javascript +const packageNames = JSON.stringify(["com.android.settings", "com.example.app"]); +const packageIcons = JSON.parse(ksu.getPackagesIcons(packageNames, 48)); +packageIcons.forEach(item => { + if (item.icon) { + console.log(`Icon for ${item.packageName}: ${item.icon.substring(0, 30)}...`); + // Example: Display icon in an element + const img = document.createElement("img"); + img.src = item.icon; + document.body.appendChild(img); + } else { + console.log(`No icon for ${item.packageName}`); + } +}); +``` + +--- + +## Notes +- **Root Access**: Methods like `exec` and `spawn` require root access and use the `libsu` library for shell execution. +- **Asynchronous Operations**: Use `WebUI.post` to ensure UI thread safety when invoking JavaScript callbacks. +- **Error Handling**: Always check for errors in callbacks (e.g., `stderr` in `exec`, `error` event in `spawn`). +- **Icon Caching**: Use `cacheAllPackageIcons` to improve performance for subsequent `getPackagesIcons` calls. +- **JSON Parsing**: Ensure valid JSON strings are passed to methods like `getPackagesInfo` and `getPackagesIcons`. \ No newline at end of file diff --git a/KernelSU-Next/justfile b/KernelSU-Next/justfile new file mode 100644 index 000000000000..51bef767d4a9 --- /dev/null +++ b/KernelSU-Next/justfile @@ -0,0 +1,14 @@ +alias bk := build_ksud +alias bm := build_manager + +build_ksud: + cross build --target aarch64-linux-android --release --manifest-path ./userspace/ksud/Cargo.toml + +build_manager: build_ksud + cp userspace/ksud/target/aarch64-linux-android/release/ksud manager/app/src/main/jniLibs/arm64-v8a/libksud.so + cd manager && ./gradlew aDebug + +clippy: + cargo fmt --manifest-path ./userspace/ksud/Cargo.toml + cross clippy --target x86_64-pc-windows-gnu --release --manifest-path ./userspace/ksud/Cargo.toml + cross clippy --target aarch64-linux-android --release --manifest-path ./userspace/ksud/Cargo.toml diff --git a/KernelSU-Next/kernel/.clang-format b/KernelSU-Next/kernel/.clang-format new file mode 100644 index 000000000000..10dc5a9a61b3 --- /dev/null +++ b/KernelSU-Next/kernel/.clang-format @@ -0,0 +1,548 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# clang-format configuration file. Intended for clang-format >= 4. +# +# For more information, see: +# +# Documentation/process/clang-format.rst +# https://clang.llvm.org/docs/ClangFormat.html +# https://clang.llvm.org/docs/ClangFormatStyleOptions.html +# +--- +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +#AlignEscapedNewlines: Left # Unknown to clang-format-4.0 +AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: false +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + #AfterExternBlock: false # Unknown to clang-format-5.0 + BeforeCatch: false + BeforeElse: false + IndentBraces: false + #SplitEmptyFunction: true # Unknown to clang-format-4.0 + #SplitEmptyRecord: true # Unknown to clang-format-4.0 + #SplitEmptyNamespace: true # Unknown to clang-format-4.0 +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +#BreakBeforeInheritanceComma: false # Unknown to clang-format-4.0 +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +#BreakConstructorInitializers: BeforeComma # Unknown to clang-format-4.0 +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 80 +CommentPragmas: '^ IWYU pragma:' +#CompactNamespaces: false # Unknown to clang-format-4.0 +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +#FixNamespaceComments: false # Unknown to clang-format-4.0 + +# Taken from: +# git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' include/ \ +# | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$, - '\1'," \ +# | sort | uniq +ForEachMacros: + - 'apei_estatus_for_each_section' + - 'ata_for_each_dev' + - 'ata_for_each_link' + - '__ata_qc_for_each' + - 'ata_qc_for_each' + - 'ata_qc_for_each_raw' + - 'ata_qc_for_each_with_internal' + - 'ax25_for_each' + - 'ax25_uid_for_each' + - '__bio_for_each_bvec' + - 'bio_for_each_bvec' + - 'bio_for_each_bvec_all' + - 'bio_for_each_integrity_vec' + - '__bio_for_each_segment' + - 'bio_for_each_segment' + - 'bio_for_each_segment_all' + - 'bio_list_for_each' + - 'bip_for_each_vec' + - 'bitmap_for_each_clear_region' + - 'bitmap_for_each_set_region' + - 'blkg_for_each_descendant_post' + - 'blkg_for_each_descendant_pre' + - 'blk_queue_for_each_rl' + - 'bond_for_each_slave' + - 'bond_for_each_slave_rcu' + - 'bpf_for_each_spilled_reg' + - 'btree_for_each_safe128' + - 'btree_for_each_safe32' + - 'btree_for_each_safe64' + - 'btree_for_each_safel' + - 'card_for_each_dev' + - 'cgroup_taskset_for_each' + - 'cgroup_taskset_for_each_leader' + - 'cpufreq_for_each_entry' + - 'cpufreq_for_each_entry_idx' + - 'cpufreq_for_each_valid_entry' + - 'cpufreq_for_each_valid_entry_idx' + - 'css_for_each_child' + - 'css_for_each_descendant_post' + - 'css_for_each_descendant_pre' + - 'device_for_each_child_node' + - 'dma_fence_chain_for_each' + - 'do_for_each_ftrace_op' + - 'drm_atomic_crtc_for_each_plane' + - 'drm_atomic_crtc_state_for_each_plane' + - 'drm_atomic_crtc_state_for_each_plane_state' + - 'drm_atomic_for_each_plane_damage' + - 'drm_client_for_each_connector_iter' + - 'drm_client_for_each_modeset' + - 'drm_connector_for_each_possible_encoder' + - 'drm_for_each_bridge_in_chain' + - 'drm_for_each_connector_iter' + - 'drm_for_each_crtc' + - 'drm_for_each_encoder' + - 'drm_for_each_encoder_mask' + - 'drm_for_each_fb' + - 'drm_for_each_legacy_plane' + - 'drm_for_each_plane' + - 'drm_for_each_plane_mask' + - 'drm_for_each_privobj' + - 'drm_mm_for_each_hole' + - 'drm_mm_for_each_node' + - 'drm_mm_for_each_node_in_range' + - 'drm_mm_for_each_node_safe' + - 'flow_action_for_each' + - 'for_each_active_dev_scope' + - 'for_each_active_drhd_unit' + - 'for_each_active_iommu' + - 'for_each_aggr_pgid' + - 'for_each_available_child_of_node' + - 'for_each_bio' + - 'for_each_board_func_rsrc' + - 'for_each_bvec' + - 'for_each_card_auxs' + - 'for_each_card_auxs_safe' + - 'for_each_card_components' + - 'for_each_card_dapms' + - 'for_each_card_pre_auxs' + - 'for_each_card_prelinks' + - 'for_each_card_rtds' + - 'for_each_card_rtds_safe' + - 'for_each_card_widgets' + - 'for_each_card_widgets_safe' + - 'for_each_cgroup_storage_type' + - 'for_each_child_of_node' + - 'for_each_clear_bit' + - 'for_each_clear_bit_from' + - 'for_each_cmsghdr' + - 'for_each_compatible_node' + - 'for_each_component_dais' + - 'for_each_component_dais_safe' + - 'for_each_comp_order' + - 'for_each_console' + - 'for_each_cpu' + - 'for_each_cpu_and' + - 'for_each_cpu_not' + - 'for_each_cpu_wrap' + - 'for_each_dapm_widgets' + - 'for_each_dev_addr' + - 'for_each_dev_scope' + - 'for_each_displayid_db' + - 'for_each_dma_cap_mask' + - 'for_each_dpcm_be' + - 'for_each_dpcm_be_rollback' + - 'for_each_dpcm_be_safe' + - 'for_each_dpcm_fe' + - 'for_each_drhd_unit' + - 'for_each_dss_dev' + - 'for_each_efi_memory_desc' + - 'for_each_efi_memory_desc_in_map' + - 'for_each_element' + - 'for_each_element_extid' + - 'for_each_element_id' + - 'for_each_endpoint_of_node' + - 'for_each_evictable_lru' + - 'for_each_fib6_node_rt_rcu' + - 'for_each_fib6_walker_rt' + - 'for_each_free_mem_pfn_range_in_zone' + - 'for_each_free_mem_pfn_range_in_zone_from' + - 'for_each_free_mem_range' + - 'for_each_free_mem_range_reverse' + - 'for_each_func_rsrc' + - 'for_each_hstate' + - 'for_each_if' + - 'for_each_iommu' + - 'for_each_ip_tunnel_rcu' + - 'for_each_irq_nr' + - 'for_each_link_codecs' + - 'for_each_link_cpus' + - 'for_each_link_platforms' + - 'for_each_lru' + - 'for_each_matching_node' + - 'for_each_matching_node_and_match' + - 'for_each_member' + - 'for_each_mem_region' + - 'for_each_memblock_type' + - 'for_each_memcg_cache_index' + - 'for_each_mem_pfn_range' + - '__for_each_mem_range' + - 'for_each_mem_range' + - '__for_each_mem_range_rev' + - 'for_each_mem_range_rev' + - 'for_each_migratetype_order' + - 'for_each_msi_entry' + - 'for_each_msi_entry_safe' + - 'for_each_net' + - 'for_each_net_continue_reverse' + - 'for_each_netdev' + - 'for_each_netdev_continue' + - 'for_each_netdev_continue_rcu' + - 'for_each_netdev_continue_reverse' + - 'for_each_netdev_feature' + - 'for_each_netdev_in_bond_rcu' + - 'for_each_netdev_rcu' + - 'for_each_netdev_reverse' + - 'for_each_netdev_safe' + - 'for_each_net_rcu' + - 'for_each_new_connector_in_state' + - 'for_each_new_crtc_in_state' + - 'for_each_new_mst_mgr_in_state' + - 'for_each_new_plane_in_state' + - 'for_each_new_private_obj_in_state' + - 'for_each_node' + - 'for_each_node_by_name' + - 'for_each_node_by_type' + - 'for_each_node_mask' + - 'for_each_node_state' + - 'for_each_node_with_cpus' + - 'for_each_node_with_property' + - 'for_each_nonreserved_multicast_dest_pgid' + - 'for_each_of_allnodes' + - 'for_each_of_allnodes_from' + - 'for_each_of_cpu_node' + - 'for_each_of_pci_range' + - 'for_each_old_connector_in_state' + - 'for_each_old_crtc_in_state' + - 'for_each_old_mst_mgr_in_state' + - 'for_each_oldnew_connector_in_state' + - 'for_each_oldnew_crtc_in_state' + - 'for_each_oldnew_mst_mgr_in_state' + - 'for_each_oldnew_plane_in_state' + - 'for_each_oldnew_plane_in_state_reverse' + - 'for_each_oldnew_private_obj_in_state' + - 'for_each_old_plane_in_state' + - 'for_each_old_private_obj_in_state' + - 'for_each_online_cpu' + - 'for_each_online_node' + - 'for_each_online_pgdat' + - 'for_each_pci_bridge' + - 'for_each_pci_dev' + - 'for_each_pci_msi_entry' + - 'for_each_pcm_streams' + - 'for_each_physmem_range' + - 'for_each_populated_zone' + - 'for_each_possible_cpu' + - 'for_each_present_cpu' + - 'for_each_prime_number' + - 'for_each_prime_number_from' + - 'for_each_process' + - 'for_each_process_thread' + - 'for_each_property_of_node' + - 'for_each_registered_fb' + - 'for_each_requested_gpio' + - 'for_each_requested_gpio_in_range' + - 'for_each_reserved_mem_range' + - 'for_each_reserved_mem_region' + - 'for_each_rtd_codec_dais' + - 'for_each_rtd_codec_dais_rollback' + - 'for_each_rtd_components' + - 'for_each_rtd_cpu_dais' + - 'for_each_rtd_cpu_dais_rollback' + - 'for_each_rtd_dais' + - 'for_each_set_bit' + - 'for_each_set_bit_from' + - 'for_each_set_clump8' + - 'for_each_sg' + - 'for_each_sg_dma_page' + - 'for_each_sg_page' + - 'for_each_sgtable_dma_page' + - 'for_each_sgtable_dma_sg' + - 'for_each_sgtable_page' + - 'for_each_sgtable_sg' + - 'for_each_sibling_event' + - 'for_each_subelement' + - 'for_each_subelement_extid' + - 'for_each_subelement_id' + - '__for_each_thread' + - 'for_each_thread' + - 'for_each_unicast_dest_pgid' + - 'for_each_wakeup_source' + - 'for_each_zone' + - 'for_each_zone_zonelist' + - 'for_each_zone_zonelist_nodemask' + - 'fwnode_for_each_available_child_node' + - 'fwnode_for_each_child_node' + - 'fwnode_graph_for_each_endpoint' + - 'gadget_for_each_ep' + - 'genradix_for_each' + - 'genradix_for_each_from' + - 'hash_for_each' + - 'hash_for_each_possible' + - 'hash_for_each_possible_rcu' + - 'hash_for_each_possible_rcu_notrace' + - 'hash_for_each_possible_safe' + - 'hash_for_each_rcu' + - 'hash_for_each_safe' + - 'hctx_for_each_ctx' + - 'hlist_bl_for_each_entry' + - 'hlist_bl_for_each_entry_rcu' + - 'hlist_bl_for_each_entry_safe' + - 'hlist_for_each' + - 'hlist_for_each_entry' + - 'hlist_for_each_entry_continue' + - 'hlist_for_each_entry_continue_rcu' + - 'hlist_for_each_entry_continue_rcu_bh' + - 'hlist_for_each_entry_from' + - 'hlist_for_each_entry_from_rcu' + - 'hlist_for_each_entry_rcu' + - 'hlist_for_each_entry_rcu_bh' + - 'hlist_for_each_entry_rcu_notrace' + - 'hlist_for_each_entry_safe' + - '__hlist_for_each_rcu' + - 'hlist_for_each_safe' + - 'hlist_nulls_for_each_entry' + - 'hlist_nulls_for_each_entry_from' + - 'hlist_nulls_for_each_entry_rcu' + - 'hlist_nulls_for_each_entry_safe' + - 'i3c_bus_for_each_i2cdev' + - 'i3c_bus_for_each_i3cdev' + - 'ide_host_for_each_port' + - 'ide_port_for_each_dev' + - 'ide_port_for_each_present_dev' + - 'idr_for_each_entry' + - 'idr_for_each_entry_continue' + - 'idr_for_each_entry_continue_ul' + - 'idr_for_each_entry_ul' + - 'in_dev_for_each_ifa_rcu' + - 'in_dev_for_each_ifa_rtnl' + - 'inet_bind_bucket_for_each' + - 'inet_lhash2_for_each_icsk_rcu' + - 'key_for_each' + - 'key_for_each_safe' + - 'klp_for_each_func' + - 'klp_for_each_func_safe' + - 'klp_for_each_func_static' + - 'klp_for_each_object' + - 'klp_for_each_object_safe' + - 'klp_for_each_object_static' + - 'kunit_suite_for_each_test_case' + - 'kvm_for_each_memslot' + - 'kvm_for_each_vcpu' + - 'list_for_each' + - 'list_for_each_codec' + - 'list_for_each_codec_safe' + - 'list_for_each_continue' + - 'list_for_each_entry' + - 'list_for_each_entry_continue' + - 'list_for_each_entry_continue_rcu' + - 'list_for_each_entry_continue_reverse' + - 'list_for_each_entry_from' + - 'list_for_each_entry_from_rcu' + - 'list_for_each_entry_from_reverse' + - 'list_for_each_entry_lockless' + - 'list_for_each_entry_rcu' + - 'list_for_each_entry_reverse' + - 'list_for_each_entry_safe' + - 'list_for_each_entry_safe_continue' + - 'list_for_each_entry_safe_from' + - 'list_for_each_entry_safe_reverse' + - 'list_for_each_prev' + - 'list_for_each_prev_safe' + - 'list_for_each_safe' + - 'llist_for_each' + - 'llist_for_each_entry' + - 'llist_for_each_entry_safe' + - 'llist_for_each_safe' + - 'mci_for_each_dimm' + - 'media_device_for_each_entity' + - 'media_device_for_each_intf' + - 'media_device_for_each_link' + - 'media_device_for_each_pad' + - 'nanddev_io_for_each_page' + - 'netdev_for_each_lower_dev' + - 'netdev_for_each_lower_private' + - 'netdev_for_each_lower_private_rcu' + - 'netdev_for_each_mc_addr' + - 'netdev_for_each_uc_addr' + - 'netdev_for_each_upper_dev_rcu' + - 'netdev_hw_addr_list_for_each' + - 'nft_rule_for_each_expr' + - 'nla_for_each_attr' + - 'nla_for_each_nested' + - 'nlmsg_for_each_attr' + - 'nlmsg_for_each_msg' + - 'nr_neigh_for_each' + - 'nr_neigh_for_each_safe' + - 'nr_node_for_each' + - 'nr_node_for_each_safe' + - 'of_for_each_phandle' + - 'of_property_for_each_string' + - 'of_property_for_each_u32' + - 'pci_bus_for_each_resource' + - 'pcm_for_each_format' + - 'ping_portaddr_for_each_entry' + - 'plist_for_each' + - 'plist_for_each_continue' + - 'plist_for_each_entry' + - 'plist_for_each_entry_continue' + - 'plist_for_each_entry_safe' + - 'plist_for_each_safe' + - 'pnp_for_each_card' + - 'pnp_for_each_dev' + - 'protocol_for_each_card' + - 'protocol_for_each_dev' + - 'queue_for_each_hw_ctx' + - 'radix_tree_for_each_slot' + - 'radix_tree_for_each_tagged' + - 'rbtree_postorder_for_each_entry_safe' + - 'rdma_for_each_block' + - 'rdma_for_each_port' + - 'rdma_umem_for_each_dma_block' + - 'resource_list_for_each_entry' + - 'resource_list_for_each_entry_safe' + - 'rhl_for_each_entry_rcu' + - 'rhl_for_each_rcu' + - 'rht_for_each' + - 'rht_for_each_entry' + - 'rht_for_each_entry_from' + - 'rht_for_each_entry_rcu' + - 'rht_for_each_entry_rcu_from' + - 'rht_for_each_entry_safe' + - 'rht_for_each_from' + - 'rht_for_each_rcu' + - 'rht_for_each_rcu_from' + - '__rq_for_each_bio' + - 'rq_for_each_bvec' + - 'rq_for_each_segment' + - 'scsi_for_each_prot_sg' + - 'scsi_for_each_sg' + - 'sctp_for_each_hentry' + - 'sctp_skb_for_each' + - 'shdma_for_each_chan' + - '__shost_for_each_device' + - 'shost_for_each_device' + - 'sk_for_each' + - 'sk_for_each_bound' + - 'sk_for_each_entry_offset_rcu' + - 'sk_for_each_from' + - 'sk_for_each_rcu' + - 'sk_for_each_safe' + - 'sk_nulls_for_each' + - 'sk_nulls_for_each_from' + - 'sk_nulls_for_each_rcu' + - 'snd_array_for_each' + - 'snd_pcm_group_for_each_entry' + - 'snd_soc_dapm_widget_for_each_path' + - 'snd_soc_dapm_widget_for_each_path_safe' + - 'snd_soc_dapm_widget_for_each_sink_path' + - 'snd_soc_dapm_widget_for_each_source_path' + - 'tb_property_for_each' + - 'tcf_exts_for_each_action' + - 'udp_portaddr_for_each_entry' + - 'udp_portaddr_for_each_entry_rcu' + - 'usb_hub_for_each_child' + - 'v4l2_device_for_each_subdev' + - 'v4l2_m2m_for_each_dst_buf' + - 'v4l2_m2m_for_each_dst_buf_safe' + - 'v4l2_m2m_for_each_src_buf' + - 'v4l2_m2m_for_each_src_buf_safe' + - 'virtio_device_for_each_vq' + - 'while_for_each_ftrace_op' + - 'xa_for_each' + - 'xa_for_each_marked' + - 'xa_for_each_range' + - 'xa_for_each_start' + - 'xas_for_each' + - 'xas_for_each_conflict' + - 'xas_for_each_marked' + - 'xbc_array_for_each_value' + - 'xbc_for_each_key_value' + - 'xbc_node_for_each_array_value' + - 'xbc_node_for_each_child' + - 'xbc_node_for_each_key_value' + - 'zorro_for_each_dev' + +#IncludeBlocks: Preserve # Unknown to clang-format-5.0 +IncludeCategories: + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: false +#IndentPPDirectives: None # Unknown to clang-format-5.0 +IndentWidth: 8 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +#ObjCBinPackProtocolList: Auto # Unknown to clang-format-5.0 +ObjCBlockIndentWidth: 8 +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true + +# Taken from git's rules +#PenaltyBreakAssignment: 10 # Unknown to clang-format-4.0 +PenaltyBreakBeforeFirstCallParameter: 30 +PenaltyBreakComment: 10 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakString: 10 +PenaltyExcessCharacter: 100 +PenaltyReturnTypeOnItsOwnLine: 60 + +PointerAlignment: Right +ReflowComments: false +SortIncludes: false +#SortUsingDeclarations: false # Unknown to clang-format-4.0 +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +#SpaceBeforeCtorInitializerColon: true # Unknown to clang-format-5.0 +#SpaceBeforeInheritanceColon: true # Unknown to clang-format-5.0 +SpaceBeforeParens: ControlStatements +#SpaceBeforeRangeBasedForLoopColon: true # Unknown to clang-format-5.0 +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp03 +TabWidth: 8 +UseTab: Always +... diff --git a/KernelSU-Next/kernel/.gitignore b/KernelSU-Next/kernel/.gitignore new file mode 100644 index 000000000000..b661888af7c6 --- /dev/null +++ b/KernelSU-Next/kernel/.gitignore @@ -0,0 +1,24 @@ +.cache/ +.thinlto-cache/ +compile_commands.json +*.ko +*.o +*.mod +*.lds +*.mod.o +.*.o* +.*.mod* +*.ko* +*.mod.c +*.symvers* +*.order +.*.cmd +.tmp_versions/ +libs/ +obj/ + +CLAUDE.md +.ddk-version +.vscode/settings.json +check_symbol +ksu_uapi.h diff --git a/KernelSU-Next/kernel/Kbuild b/KernelSU-Next/kernel/Kbuild new file mode 100644 index 000000000000..440251d52315 --- /dev/null +++ b/KernelSU-Next/kernel/Kbuild @@ -0,0 +1,156 @@ +kernelsu-objs := core/init.o +kernelsu-objs += feature/kernel_umount.o +kernelsu-objs += feature/sucompat.o + +ifneq ($(strip $(CONFIG_KSU_SUSFS)),y) +ifeq ($(strip $(CONFIG_KPROBES)),y) +kernelsu-objs += hook/lsm_hook.o +kernelsu-objs += hook/syscall_event_bridge.o +kernelsu-objs += hook/syscall_hook_manager.o +kernelsu-objs += hook/tp_marker.o +ifneq ($(filter y arm64 aarch64,$(CONFIG_ARM64) $(ARCH)),) +kernelsu-objs += hook/arm64/patch_memory.o +kernelsu-objs += hook/arm64/syscall_hook.o +else ifneq ($(filter y x86_64 i386,$(CONFIG_X86_64) $(ARCH)),) +kernelsu-objs += hook/x86_64/patch_memory.o +kernelsu-objs += hook/x86_64/syscall_hook.o +endif +endif +endif + +kernelsu-objs += hook/setuid_hook.o +kernelsu-objs += extras.o +kernelsu-objs += tiny_sulog.o + +kernelsu-objs += infra/file_wrapper.o +kernelsu-objs += infra/seccomp_cache.o +kernelsu-objs += infra/su_mount_ns.o +kernelsu-objs += infra/symbol_resolver.o + +ifneq ($(strip $(CONFIG_KSU_DISABLE_MANAGER)),y) +kernelsu-objs += manager/apk_sign.o +kernelsu-objs += manager/pkg_observer.o +kernelsu-objs += manager/throne_tracker.o +endif + +kernelsu-objs += policy/allowlist.o +kernelsu-objs += policy/app_profile.o +kernelsu-objs += policy/feature.o + +kernelsu-objs += runtime/boot_event.o +kernelsu-objs += runtime/ksud_integration.o + +kernelsu-objs += selinux/selinux.o +kernelsu-objs += selinux/rules.o +kernelsu-objs += selinux/sepolicy.o + +kernelsu-objs += supercall/dispatch.o +kernelsu-objs += supercall/perm.o +kernelsu-objs += supercall/supercall.o + +ifdef KBUILD_EXTMOD +ifeq ($(strip $(CONFIG_KSU_DISABLE_MANAGER)),y) +ccflags-y += -DCONFIG_KSU_DISABLE_MANAGER=1 +endif +ifeq ($(strip $(CONFIG_KSU_DISABLE_POLICY)),y) +ccflags-y += -DCONFIG_KSU_DISABLE_POLICY=1 +endif +ifeq ($(strip $(CONFIG_KSU_DEBUG)),y) +ccflags-y += -DCONFIG_KSU_DEBUG=1 +endif +endif + +ccflags-y += -I$(srctree)/security/selinux -I$(srctree)/security/selinux/include +ccflags-y += -I$(objtree)/security/selinux -include $(srctree)/include/uapi/asm-generic/errno.h + +ifeq ($(filter /%,$(src)),) +KSU_KERNEL_DIR := $(srctree)/$(src) +else +KSU_KERNEL_DIR := $(src) +endif + +ccflags-y += -I$(KSU_KERNEL_DIR) -I$(KSU_KERNEL_DIR)/include + +obj-$(CONFIG_KSU) += kernelsu.o + +LPATH := /usr/bin/env PATH="$$PATH":/usr/bin:/usr/local/bin +MDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +# Check if this is a git repository +# Try to detect Git repo intelligently +GIT_ROOT := $(shell cd $(MDIR) && $(LPATH) git rev-parse --show-toplevel 2>/dev/null) +ifneq ($(GIT_ROOT),) +KERNEL_GIT_ROOT := $(shell cd $(srctree) && $(LPATH) git rev-parse --show-toplevel 2>/dev/null) +ifneq ($(GIT_ROOT),$(KERNEL_GIT_ROOT)) +# Only set version if it's a different repo from kernel +$(shell cd $(GIT_ROOT) && [ -f .git/shallow ] && $(LPATH) git fetch --unshallow 2>/dev/null || true) +# Get the base branch name by stripping suffixes (e.g., dev-susfs -> dev) +BASE_BRANCH := $(shell cd $(GIT_ROOT) && $(LPATH) git rev-parse --abbrev-ref HEAD | sed 's:-.*::' 2>/dev/null) +# Find the merge-base with the official origin branch to exclude local commits +BASE_COMMIT := $(shell cd $(GIT_ROOT) && $(LPATH) git merge-base HEAD refs/remotes/origin/$(BASE_BRANCH) 2>/dev/null || $(LPATH) git merge-base HEAD refs/remotes/origin/main 2>/dev/null || echo HEAD) +KSU_GIT_VERSION := $(shell cd $(GIT_ROOT) && $(LPATH) git rev-list --count $(BASE_COMMIT) 2>/dev/null) +KSU_GIT_TAG := $(shell cd $(GIT_ROOT) && $(LPATH) git describe --tags --abbrev=0 $(BASE_COMMIT) 2>/dev/null) +KSU_GIT_VERSION_VALID := 1 +$(info -- KernelSU-Next Git repo detected at: $(GIT_ROOT)) +endif +endif + +# Calculate version if git version is available +ifdef KSU_GIT_VERSION_VALID +# ksu_version: major * 30000 + git version for historical reasons +$(eval KSU_VERSION=$(shell expr 30000 + $(KSU_GIT_VERSION))) +$(info -- KernelSU-Next version: $(KSU_VERSION)) +ccflags-y += -DKSU_VERSION=$(KSU_VERSION) +else +# If there is no .git directory, use default version +$(warning "KSU_GIT_VERSION not defined! It is better to make KernelSU-Next a git repository!") +KSU_VERSION_FALLBACK := 1 +$(info -- KernelSU-Next version fallback: $(KSU_VERSION_FALLBACK)) +ccflags-y += -DKSU_VERSION=$(KSU_VERSION_FALLBACK) +endif + +ifdef KSU_GIT_VERSION_VALID +$(eval KSU_VERSION_TAG=$(KSU_GIT_TAG)) +$(info -- KernelSU-Next tag: $(KSU_VERSION_TAG)) +ccflags-y += -DKSU_VERSION_TAG=\"$(KSU_VERSION_TAG)\" +else +$(warning "KSU_VERSION_TAG not defined! It is better to make KernelSU-Next a git submodule!") +KSU_VERSION_TAG_FALLBACK := v0.0.1 +$(info -- KernelSU-Next tag fallback: $(KSU_VERSION_TAG_FALLBACK)) +ccflags-y += -DKSU_VERSION_TAG=\"$(KSU_VERSION_TAG_FALLBACK)\" +endif + +KSU_NEW_DCACHE_FLUSH := $(shell grep -q __flush_dcache_area $(srctree)/arch/arm64/include/asm/cacheflush.h ; echo $$?) +$(info -- KernelSU-Next new DCACHE flush: $(KSU_NEW_DCACHE_FLUSH)) + +ifndef KSU_NEXT_MANAGER_LIST +# KSUN, pershoot +KSU_NEXT_MANAGER_LIST := 0x3e6:79e590113c4c4c0c222978e413a5faa801666957b1212a328e46c00c69821bf7,0x338:f26471a28031130362bce7eebffb9a0b8afc3095f163ce0c75a309f03b644a1f +endif + +ifdef KSU_MANAGER_PACKAGE +ccflags-y += -DKSU_MANAGER_PACKAGE=\"$(KSU_MANAGER_PACKAGE)\" +$(info -- KernelSU-Next Manager package name: $(KSU_MANAGER_PACKAGE)) +endif + +$(info -- KernelSU-Next Manager signatures: $(KSU_NEXT_MANAGER_LIST)) +ccflags-y += -DKSU_NEXT_MANAGER_LIST=\"$(KSU_NEXT_MANAGER_LIST)\" + +ccflags-y += -DKSU_NEW_DCACHE_FLUSH=$(KSU_NEW_DCACHE_FLUSH) + +ccflags-y += -Wno-strict-prototypes -Wno-int-conversion -Wno-gcc-compat -Wno-missing-prototypes +ccflags-y += -Wno-declaration-after-statement -Wno-unused-function -Wno-unused-variable + +## For susfs stuff ## +ifeq ($(strip $(CONFIG_KSU_SUSFS)),y) +ifeq ($(shell test -e $(srctree)/fs/susfs.c; echo $$?),0) +$(eval SUSFS_VERSION=$(shell cat $(srctree)/include/linux/susfs.h | grep -E '^#define SUSFS_VERSION' | cut -d' ' -f3 | sed 's/"//g')) +$(info ) +$(info -- SUSFS_VERSION: $(SUSFS_VERSION)) +else +$(info -- You have not integrated susfs in your kernel yet.) +$(info -- Read: https://gitlab.com/simonpunk/susfs4ksu) +endif +endif + +# Keep a new line here!! Because someone may append config diff --git a/KernelSU-Next/kernel/Kconfig b/KernelSU-Next/kernel/Kconfig new file mode 100644 index 000000000000..e4cf844250c6 --- /dev/null +++ b/KernelSU-Next/kernel/Kconfig @@ -0,0 +1,139 @@ +menu "KernelSU" + +config KSU + tristate "KernelSU function support" + depends on KPROBES || SUSFS + default y + help + Enable kernel-level root privileges on Android System. + Requires CONFIG_KPROBES for kernel hooking support (if SuSFS is not used). + Optional CONFIG_EXT4_FS for `ext4_unregister_sysfs` (redundant with SuSFS). + To compile as a module, choose M here: the + module will be called kernelsu. + +config KSU_DEBUG + bool "KernelSU debug mode" + depends on KSU + default n + help + Enable KernelSU debug mode. + +config KSU_THRONE_TRACKER_ALWAYS_THREADED + bool "Always run throne tracker in a kthread" + depends on KSU + default y + help + Runs throne_tracker in a separate kthread, including the first run. + Significantly decreases boot time, but may delay crowning slightly + on some FDE / FBEv1 setups. + If unsure, say n. + +config KSU_DISABLE_MANAGER + bool "Disable KernelSU manager integration" + depends on KSU + default n + help + Disable manager APK detection and manager-specific handling. + Root will be used in place of manager-only functionality. + +config KSU_DISABLE_POLICY + bool "Disable KernelSU policy profiles" + depends on KSU + default n + help + Disable per-app root/non-root profile customization. + Escalation will always use the default full root profile, and + non-root handling will follow the global umount policy only. + +menu "KernelSU - SUSFS" +config KSU_SUSFS + bool "KernelSU addon - SUSFS" + depends on KSU + depends on THREAD_INFO_IN_TASK + default y + help + Patch and Enable SUSFS to kernel with KernelSU. + +config KSU_SUSFS_SUS_PATH + bool "Enable to hide suspicious path" + depends on KSU_SUSFS + default y + help + - Allow hiding the user-defined path and all its sub-paths from various system calls. + - Use "add_sus_path_loop" instead of "add_sus_path" if the user-defined path is frequently modified. + - Use with cautious as it may cause performance loss and will be vulnerable to side channel attacks, + just disable this feature if it doesn't work for you or you don't need it at all. + - Effective only on zygote spawned user app process with uid >= 10000. + +config KSU_SUSFS_SUS_MOUNT + bool "Enable to hide suspicious mounts" + depends on KSU_SUSFS + default y + help + - Automatically assign fake mnt_id and fake mnt_group_id for mounts mounted by ksu process until /sdcard is decrypted, this is to evade from mnt_id/mnt_group_id gap detections. + - Allow hiding all sus mounts from /proc/self/[mounts|mountinfo|mountstat] for non-su processes. + +config KSU_SUSFS_SUS_KSTAT + bool "Enable to spoof suspicious kstat" + depends on KSU_SUSFS + default y + help + - Allow spoofing the kstat of user-defined file/directory. + - Effective only on zygote spawned user app process with uid >= 10000. + +config KSU_SUSFS_SPOOF_UNAME + bool "Enable to spoof uname" + depends on KSU_SUSFS + default y + help + - Allow spoofing the string returned by uname syscall to user-defined string. + - Effective on all processes. + +config KSU_SUSFS_ENABLE_LOG + bool "Enable logging susfs log to kernel" + depends on KSU_SUSFS + default y + help + - Allow logging susfs log to kernel, uncheck it to completely disable all susfs log. + +config KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS + bool "Enable to automatically hide ksu and susfs symbols from /proc/kallsyms" + depends on KSU_SUSFS + default y + help + - Automatically hide ksu and susfs symbols from '/proc/kallsyms'. + - Effective on all processes. + +config KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG + bool "Enable to spoof /proc/bootconfig (gki) or /proc/cmdline (non-gki)" + depends on KSU_SUSFS + default y + help + - Spoof the output of /proc/bootconfig (gki) or /proc/cmdline (non-gki) with a user-defined file. + - Effective on all processes. + +config KSU_SUSFS_OPEN_REDIRECT + bool "Enable to redirect a path to be opened with another path" + depends on KSU_SUSFS + default y + help + - Allow redirecting a target path to be opened with another user-defined path. + - Both target path and redirected path must be existed before they can be added to the kernel. + - Users have to take care of the selinux permission of both target path and redirected path by themselves. + - OPEN_REDIRECT does not bypass detections, but users may try other feature like SUS_KSTAT to bypass some of them. + - Effective only on processes with pre-defined uid scheme. + +config KSU_SUSFS_SUS_MAP + bool "Enable to hide some mmapped real file from different proc maps interfaces" + depends on KSU_SUSFS + default y + help + - Allow hiding mmapped real file from /proc//[maps|smaps|smaps_rollup|map_files|mem|pagemap] + - It does NOT support hiding for anon memory. + - It does NOT hide any inline hooks or plt hooks cause by the injected library itself. + - It may not be able to evade detections by apps that implement a good injection detection. + - Effective only on zygote spawned umounted user app process >= 10000. + +endmenu + +endmenu diff --git a/KernelSU-Next/kernel/LICENSE b/KernelSU-Next/kernel/LICENSE new file mode 100644 index 000000000000..d159169d1050 --- /dev/null +++ b/KernelSU-Next/kernel/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/KernelSU-Next/kernel/Makefile b/KernelSU-Next/kernel/Makefile new file mode 100644 index 000000000000..38164088275f --- /dev/null +++ b/KernelSU-Next/kernel/Makefile @@ -0,0 +1,25 @@ +KDIR := $(KDIR) +MDIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))) + +$(info -- KDIR: $(KDIR)) +$(info -- MDIR: $(MDIR)) + +.PHONY: all compdb clean format check-format + +all: check_symbol + make -C $(KDIR) M=$(MDIR) modules + ./check_symbol kernelsu.ko $(KDIR)/vmlinux + +compdb: + python3 $(MDIR)/.vscode/generate_compdb.py -O $(KDIR) $(MDIR) +clean: + make -C $(KDIR) M=$(MDIR) clean + rm check_symbol +check_symbol: tools/check_symbol.c + $(CC) tools/check_symbol.c -o check_symbol +format: + find . \( -name "*.c" -o -name "*.h" \) -print0 | xargs -0 clang-format -i +check-format: + find . \( -name "*.c" -o -name "*.h" \) -print0 | xargs -0 clang-format --dry-run --Werror + +# Keep a new line here!! Because someone may append config \ No newline at end of file diff --git a/KernelSU-Next/kernel/core/init.c b/KernelSU-Next/kernel/core/init.c new file mode 100644 index 000000000000..55fa31f31078 --- /dev/null +++ b/KernelSU-Next/kernel/core/init.c @@ -0,0 +1,237 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "policy/allowlist.h" +#include "policy/app_profile.h" +#include "policy/feature.h" +#include "klog.h" // IWYU pragma: keep +#include "manager/manager_observer.h" +#include "manager/throne_tracker.h" +#include "hook/syscall_hook_manager.h" +#include "runtime/ksud.h" +#include "runtime/ksud_boot.h" +#include "supercall/supercall.h" +#include "ksu.h" +#include "infra/file_wrapper.h" +#include "selinux/selinux.h" +#include "hook/syscall_hook.h" + +#ifdef CONFIG_KSU_SUSFS +#include +#include "hook/setuid_hook.h" +#include "feature/sucompat.h" +#endif + +#if defined(__x86_64__) +#include +#include +#ifndef X86_FEATURE_INDIRECT_SAFE +#error "FATAL: Your kernel is missing the indirect syscall bypass patches!" +#endif +#endif + +// workaround for A12-5.10 kernel +// Some third-party kernel (e.g. linegaeOS) uses wrong toolchain, which supports +// CC_HAVE_STACKPROTECTOR_SYSREG while gki's toolchain doesn't. +// Therefore, ksu lkm, which uses gki toolchain, requires this __stack_chk_guard, +// while those third-party kernel can't provide. +// Thus, we manually provide it instead of using kernel's +#if defined(CONFIG_STACKPROTECTOR) && \ + (defined(CONFIG_ARM64) && defined(MODULE) && \ + !defined(CONFIG_STACKPROTECTOR_PER_TASK)) +#include +#include +unsigned long __stack_chk_guard __ro_after_init + __attribute__((visibility("hidden"))); + +__attribute__((no_stack_protector)) void __init ksu_setup_stack_chk_guard() +{ + unsigned long canary; + + /* Try to get a semi random initial value. */ + get_random_bytes(&canary, sizeof(canary)); + canary ^= LINUX_VERSION_CODE; + canary &= CANARY_MASK; + __stack_chk_guard = canary; +} + +__attribute__((naked)) int __init kernelsu_init_early(void) +{ + asm("mov x19, x30;\n" + "bl ksu_setup_stack_chk_guard;\n" + "mov x30, x19;\n" + "b kernelsu_init;\n"); +} +#define NEED_OWN_STACKPROTECTOR 1 +#else +#define NEED_OWN_STACKPROTECTOR 0 +#endif + +struct cred *ksu_cred; +bool ksu_late_loaded; + +int __init kernelsu_init(void) +{ +#ifdef CONFIG_KSU_SUSFS + susfs_init(); +#endif // #ifdef KSU_SUSFS + +#if defined(__x86_64__) + // If the kernel has the hardening patch, X86_FEATURE_INDIRECT_SAFE must be set + if (!boot_cpu_has(X86_FEATURE_INDIRECT_SAFE)) { + pr_alert("*************************************************************"); + pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **"); + pr_alert("** **"); + pr_alert("** X86_FEATURE_INDIRECT_SAFE is not enabled! **"); + pr_alert("** KernelSU will abort initialization to prevent **"); + pr_alert("** kernel panic. **"); + pr_alert("** **"); + pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **"); + pr_alert("*************************************************************"); + return -ENOSYS; + } +#endif + +#ifdef MODULE + ksu_late_loaded = (current->pid != 1); +#else + ksu_late_loaded = false; +#endif + +#ifdef CONFIG_KSU_DEBUG + pr_alert("*************************************************************"); + pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **"); + pr_alert("** **"); + pr_alert("** You are running KernelSU in DEBUG mode **"); + pr_alert("** **"); + pr_alert("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **"); + pr_alert("*************************************************************"); +#endif + + ksu_cred = prepare_creds(); + if (!ksu_cred) { + pr_err("prepare cred failed!\n"); + } + +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_syscall_hook_init(); +#endif + + ksu_feature_init(); + + ksu_supercalls_init(); + +#ifdef CONFIG_KSU_SUSFS + ksu_sucompat_init(); + ksu_setuid_hook_init(); + ksu_avc_spoof_init(); +#endif + + if (ksu_late_loaded) { + pr_info("late load mode, skipping kprobe hooks\n"); + + apply_kernelsu_rules(); + cache_sid(); + setup_ksu_cred(); + + // Grant current process (ksud late-load) root + // with KSU SELinux domain before enforcing SELinux, so it + // can continue to access /data/app etc. after enforcement. + escape_to_root_for_init(); + + ksu_allowlist_init(); + ksu_load_allow_list(); + +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_syscall_hook_manager_init(); +#endif + + ksu_throne_tracker_init(); + ksu_observer_init(); + ksu_file_wrapper_init(); + + ksu_boot_completed = true; + track_throne(false); + + if (!getenforce()) { + pr_info("Permissive SELinux, enforcing\n"); + setenforce(true); + } + + } else { +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_syscall_hook_manager_init(); +#endif + + ksu_allowlist_init(); + + ksu_throne_tracker_init(); + + ksu_ksud_init(); + + ksu_file_wrapper_init(); + } + +#ifdef MODULE +#ifndef CONFIG_KSU_DEBUG + kobject_del(&THIS_MODULE->mkobj.kobj); +#endif +#endif + return 0; +} + +void __exit kernelsu_exit(void) +{ + // Phase 1: Stop all hooks first to prevent new callbacks +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_syscall_hook_manager_exit(); +#endif + + ksu_supercalls_exit(); + + if (!ksu_late_loaded) + ksu_ksud_exit(); + + // Wait for any in-flight RCU readers (e.g. handler traversing allow_list) + synchronize_rcu(); + + // Phase 2: Now safe to release data structures + ksu_observer_exit(); + + ksu_throne_tracker_exit(); + + ksu_allowlist_exit(); + +#ifdef CONFIG_KSU_SUSFS + ksu_avc_spoof_exit(); + ksu_sucompat_exit(); + ksu_setuid_hook_exit(); +#endif + + ksu_feature_exit(); + + if (ksu_cred) { + put_cred(ksu_cred); + } +} + +#if NEED_OWN_STACKPROTECTOR +module_init(kernelsu_init_early); +#else +module_init(kernelsu_init); +#endif +module_exit(kernelsu_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("weishu"); +MODULE_DESCRIPTION("Android KernelSU"); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 13, 0) +MODULE_IMPORT_NS("VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver"); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); +#endif diff --git a/KernelSU-Next/kernel/extras.c b/KernelSU-Next/kernel/extras.c new file mode 100644 index 000000000000..434d46685887 --- /dev/null +++ b/KernelSU-Next/kernel/extras.c @@ -0,0 +1,233 @@ +#include +#include +#include + +#include "policy/feature.h" +#include "uapi/feature.h" +#include "klog.h" +#include "runtime/ksud.h" +#include "infra/seccomp_cache.h" + +#include "linux/jump_label.h" + +#ifdef CONFIG_KSU_SUSFS +extern struct static_key_false susfs_is_avc_log_spoofing_enabled; +#endif + +// sorry for the ifdef hell +// but im too lazy to fragment this out. +// theres only one feature so far anyway +// - xx, 20251019 + +static u32 su_sid = 0; +static u32 priv_app_sid = 0; + +// init as disabled by default +static atomic_t disable_spoof = ATOMIC_INIT(1); + +void ksu_avc_spoof_enable(); +void ksu_avc_spoof_disable(); + +bool ksu_avc_spoof_enabled = true; +static bool boot_completed = false; + +static int avc_spoof_feature_get(u64 *value) +{ + *value = ksu_avc_spoof_enabled ? 1 : 0; + return 0; +} + +static int avc_spoof_feature_set(u64 value) +{ + bool enable = value != 0; + +#ifdef CONFIG_KSU_SUSFS + if (enable && static_branch_unlikely(&susfs_is_avc_log_spoofing_enabled)) { + pr_info("avc_spoof: SuSFS spoof active, skipping ksu toggle\n"); + return -EBUSY; + } +#endif + + if (enable == ksu_avc_spoof_enabled) { + pr_info("avc_spoof: no need to change\n"); + return 0; + } + + ksu_avc_spoof_enabled = enable; + + if (boot_completed) { + if (enable) { + ksu_avc_spoof_enable(); + } else { + ksu_avc_spoof_disable(); + } + } + + pr_info("avc_spoof: set to %d\n", enable); + + return 0; +} + +static const struct ksu_feature_handler avc_spoof_handler = { + .feature_id = KSU_FEATURE_AVC_SPOOF, + .name = "avc_spoof", + .get_handler = avc_spoof_feature_get, + .set_handler = avc_spoof_feature_set, +}; + +static int get_sid() +{ + // dont load at all if we cant get sids + int err = security_secctx_to_secid("u:r:su:s0", strlen("u:r:su:s0"), &su_sid); + if (err) { + pr_info("avc_spoof/get_sid: su_sid not found!\n"); + return -1; + } + pr_info("avc_spoof/get_sid: su_sid: %u\n", su_sid); + + err = security_secctx_to_secid("u:r:priv_app:s0:c512,c768", strlen("u:r:priv_app:s0:c512,c768"), &priv_app_sid); + if (err) { + pr_info("avc_spoof/get_sid: priv_app_sid not found!\n"); + return -1; + } + pr_info("avc_spoof/get_sid: priv_app_sid: %u\n", priv_app_sid); + return 0; +} + +int ksu_handle_slow_avc_audit(u32 *tsid) +{ + if (atomic_read(&disable_spoof)) + return 0; + +#ifdef CONFIG_KSU_SUSFS + if (static_branch_unlikely(&susfs_is_avc_log_spoofing_enabled)) + return 0; +#endif + + // if tsid is su, we just replace it + // unsure if its enough, but this is how it is aye? + if (*tsid == su_sid) { + pr_info("avc_spoof/slow_avc_audit: replacing su_sid: %u with priv_app_sid: %u\n", su_sid, priv_app_sid); + *tsid = priv_app_sid; + } + + return 0; +} + +#ifdef CONFIG_KPROBES +#include +#include +#include "arch.h" +static struct kprobe *slow_avc_audit_kp; +// .symbol_name = "slow_avc_audit", +// .pre_handler = slow_avc_audit_pre_handler, +static int slow_avc_audit_pre_handler(struct kprobe *p, struct pt_regs *regs) +{ + if (atomic_read(&disable_spoof)) + return 0; + + /* + * for < 4.17 int slow_avc_audit(u32 ssid, u32 tsid + * for >= 4.17 int slow_avc_audit(struct selinux_state *state, u32 ssid, u32 tsid + * for >= 6.4 int slow_avc_audit(u32 ssid, u32 tsid + * not to mention theres also DKSU_HAS_SELINUX_STATE + * since its hard to make sure this selinux state thing + * cross crossing with 4.17 ~ 6.4's where slow_avc_audit + * changes abi (tsid in arg2 vs arg3) + */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) + u32 *tsid = (u32 *)&PT_REGS_PARM2(regs); + ksu_handle_slow_avc_audit(tsid); +#else + u32 *tsid = (u32 *)&PT_REGS_PARM3(regs); + ksu_handle_slow_avc_audit(tsid); +#endif + + return 0; +} + +// copied from upstream +static struct kprobe *init_kprobe(const char *name, + kprobe_pre_handler_t handler) +{ + struct kprobe *kp = kzalloc(sizeof(struct kprobe), GFP_KERNEL); + if (!kp) + return NULL; + kp->symbol_name = name; + kp->pre_handler = handler; + + int ret = register_kprobe(kp); + pr_info("sucompat: register_%s kprobe: %d\n", name, ret); + if (ret) { + kfree(kp); + return NULL; + } + + return kp; +} +static void destroy_kprobe(struct kprobe **kp_ptr) +{ + struct kprobe *kp = *kp_ptr; + if (!kp) + return; + unregister_kprobe(kp); + synchronize_rcu(); + kfree(kp); + *kp_ptr = NULL; +} +#endif // CONFIG_KPROBES + +void ksu_avc_spoof_disable(void) +{ + ksu_avc_spoof_enabled = false; +#ifdef CONFIG_KPROBES + pr_info("avc_spoof/exit: unregister slow_avc_audit kprobe!\n"); + destroy_kprobe(&slow_avc_audit_kp); +#endif + atomic_set(&disable_spoof, 1); + pr_info("avc_spoof/exit: slow_avc_audit spoofing disabled!\n"); +} + +void ksu_avc_spoof_enable(void) +{ + ksu_avc_spoof_enabled = true; + int ret = get_sid(); + if (ret) { + pr_info("avc_spoof/init: sid grab fail!\n"); + return; + } + +#ifdef CONFIG_KPROBES + pr_info("avc_spoof/init: register slow_avc_audit kprobe!\n"); + slow_avc_audit_kp = init_kprobe("slow_avc_audit", slow_avc_audit_pre_handler); +#endif + // once we get the sids, we can now enable the hook handler + atomic_set(&disable_spoof, 0); + + pr_info("avc_spoof/init: slow_avc_audit spoofing enabled!\n"); +} + +void ksu_avc_spoof_late_init(void) +{ + boot_completed = true; + + if (ksu_avc_spoof_enabled) { + ksu_avc_spoof_enable(); + } +} + +void __init ksu_avc_spoof_init(void) +{ + if (ksu_register_feature_handler(&avc_spoof_handler)) { + pr_err("Failed to register avc spoof feature handler\n"); + } +} + +void __exit ksu_avc_spoof_exit(void) +{ + if (ksu_avc_spoof_enabled) { + ksu_avc_spoof_disable(); + } + ksu_unregister_feature_handler(KSU_FEATURE_AVC_SPOOF); +} diff --git a/KernelSU-Next/kernel/feature/kernel_umount.c b/KernelSU-Next/kernel/feature/kernel_umount.c new file mode 100644 index 000000000000..bb2a9cc61bad --- /dev/null +++ b/KernelSU-Next/kernel/feature/kernel_umount.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "feature/kernel_umount.h" +#include "klog.h" // IWYU pragma: keep +#include "policy/allowlist.h" +#include "selinux/selinux.h" +#include "policy/feature.h" +#include "runtime/ksud_boot.h" +#include "ksu.h" + +static bool ksu_kernel_umount_enabled = true; + +static int kernel_umount_feature_get(u64 *value) +{ + *value = ksu_kernel_umount_enabled ? 1 : 0; + return 0; +} + +static int kernel_umount_feature_set(u64 value) +{ + bool enable = value != 0; + ksu_kernel_umount_enabled = enable; + pr_info("kernel_umount: set to %d\n", enable); + return 0; +} + +static const struct ksu_feature_handler kernel_umount_handler = { + .feature_id = KSU_FEATURE_KERNEL_UMOUNT, + .name = "kernel_umount", + .get_handler = kernel_umount_feature_get, + .set_handler = kernel_umount_feature_set, +}; + +extern int path_umount(struct path *path, int flags); + +static void ksu_umount_mnt(const char *mnt, struct path *path, int flags) +{ + int err = path_umount(path, flags); + if (err) { + pr_info("umount %s failed: %d\n", mnt, err); + } +} + +static void try_umount(const char *mnt, int flags) +{ + struct path path; + int err = kern_path(mnt, 0, &path); + if (err) { + return; + } + + if (path.dentry != path.mnt->mnt_root) { + // it is not root mountpoint, maybe umounted by others already. + path_put(&path); + return; + } + + ksu_umount_mnt(mnt, &path, flags); +} + +struct umount_tw { + struct callback_head cb; +}; + +int ksu_handle_umount(uid_t old_uid, uid_t new_uid) +{ + // if there isn't any module mounted, just ignore it! + if (!ksu_module_mounted) { + return 0; + } + + if (!ksu_kernel_umount_enabled) { + return 0; + } + + if (!ksu_cred) { + return 0; + } + +#ifndef CONFIG_KSU_SUSFS + // There are 6 scenarios: + // 1. Normal app: zygote -> appuid + // 2. Isolated process forked from zygote: zygote -> isolated_process + // 3. App zygote forked from zygote: zygote -> appuid + // 4. Webview zygote forked from zygote: zygote -> WEBVIEW_ZYGOTE_UID (no need to handle, app cannot run custom code) + // 5. Isolated process forked from app zygote: appuid -> isolated_process (already handled by 3) + // 6. Isolated process forked from webview zygote (no need to handle, app cannot run custom code) + if (!is_appuid(new_uid) && !is_isolated_process(new_uid)) { + return 0; + } + + if (!ksu_uid_should_umount(new_uid) && !is_isolated_process(new_uid)) { + return 0; + } + + // check old process's selinux context, if it is not zygote, ignore it! + // because some su apps may setuid to untrusted_app but they are in global mount namespace + // when we umount for such process, that is a disaster! + // also handle case 4 and 5 + bool is_zygote_child = is_zygote(current_cred()); + if (!is_zygote_child) { + pr_info("handle umount ignore non zygote child: %d\n", current->pid); + return 0; + } +#endif + // umount the target mnt + pr_info("handle umount for uid: %d, pid: %d\n", new_uid, current->pid); + + const struct cred *saved = override_creds(ksu_cred); + + struct mount_entry *entry; + down_read(&mount_list_lock); + list_for_each_entry (entry, &mount_list, list) { + pr_info("%s: unmounting: %s flags: 0x%x\n", __func__, entry->umountable, entry->flags); + try_umount(entry->umountable, entry->flags); + } + up_read(&mount_list_lock); + + revert_creds(saved); + + return 0; +} + +void __init ksu_kernel_umount_init(void) +{ + if (ksu_register_feature_handler(&kernel_umount_handler)) { + pr_err("Failed to register kernel_umount feature handler\n"); + } +} + +void __exit ksu_kernel_umount_exit(void) +{ + ksu_unregister_feature_handler(KSU_FEATURE_KERNEL_UMOUNT); +} diff --git a/KernelSU-Next/kernel/feature/kernel_umount.h b/KernelSU-Next/kernel/feature/kernel_umount.h new file mode 100644 index 000000000000..e54489557409 --- /dev/null +++ b/KernelSU-Next/kernel/feature/kernel_umount.h @@ -0,0 +1,23 @@ +#ifndef __KSU_H_KERNEL_UMOUNT +#define __KSU_H_KERNEL_UMOUNT + +#include +#include +#include + +void ksu_kernel_umount_init(void); +void ksu_kernel_umount_exit(void); + +// Handler function to be called from setresuid hook +int ksu_handle_umount(uid_t old_uid, uid_t new_uid); + +// for the umount list +struct mount_entry { + char *umountable; + unsigned int flags; + struct list_head list; +}; +extern struct list_head mount_list; +extern struct rw_semaphore mount_list_lock; + +#endif diff --git a/KernelSU-Next/kernel/feature/sucompat.c b/KernelSU-Next/kernel/feature/sucompat.c new file mode 100644 index 000000000000..3c9d8ba39463 --- /dev/null +++ b/KernelSU-Next/kernel/feature/sucompat.c @@ -0,0 +1,399 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "linux/jump_label.h" + +#ifdef CONFIG_KSU_SUSFS +#include +#include +#include "selinux/selinux.h" +#include "objsec.h" +#include "runtime/ksud.h" +#endif + +#include "policy/allowlist.h" +#include "policy/feature.h" +#include "klog.h" // IWYU pragma: keep +#include "runtime/ksud.h" +#include "feature/sucompat.h" +#include "policy/app_profile.h" +#include "hook/syscall_hook.h" + +#include "tiny_sulog.h" + +#define SU_PATH "/system/bin/su" +#define SH_PATH "/system/bin/sh" + +#ifdef CONFIG_KSU_SUSFS +static const char sh_path[] = SH_PATH; +static const char su_path[] = SU_PATH; +static const char ksud_path[] = KSUD_PATH; + +// Stubs for future adb_root and sulog integration +static inline int ksu_adb_root_handle_execve(const char *pathname, void ***envp) { return 0; } +static inline void *ksu_sulog_capture_sucompat(const char *filename, struct user_arg_ptr *argv, gfp_t gfp) { return NULL; } +static inline void ksu_sulog_emit_pending(void *event, int result, gfp_t gfp) { } +#endif + +DEFINE_STATIC_KEY_TRUE(ksu_su_compat_enabled); + +static int su_compat_feature_get(u64 *value) +{ + if (static_key_enabled(&ksu_su_compat_enabled)) + *value = 1; + else + *value = 0; + return 0; +} + +static int su_compat_feature_set(u64 value) +{ + bool enable = value != 0; + if (enable) + static_branch_enable(&ksu_su_compat_enabled); + else + static_branch_disable(&ksu_su_compat_enabled); + pr_info("su_compat: set to %d\n", enable); + return 0; +} + +static const struct ksu_feature_handler su_compat_handler = { + .feature_id = KSU_FEATURE_SU_COMPAT, + .name = "su_compat", + .get_handler = su_compat_feature_get, + .set_handler = su_compat_feature_set, +}; + +static void __user *userspace_stack_buffer(const void *d, size_t len) +{ + // To avoid having to mmap a page in userspace, just write below the stack + // pointer. + char __user *p = (void __user *)current_user_stack_pointer() - len; + + return copy_to_user(p, d, len) ? NULL : p; +} + +static char __user *sh_user_path(void) +{ + static const char sh_path_local[] = "/system/bin/sh"; + + return userspace_stack_buffer(sh_path_local, sizeof(sh_path_local)); +} + +static char __user *ksud_user_path(void) +{ + static const char ksud_path_local[] = KSUD_PATH; + + return userspace_stack_buffer(ksud_path_local, sizeof(ksud_path_local)); +} + +#ifdef CONFIG_KSU_SUSFS +static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr) +{ + const char __user *native; + +#ifdef CONFIG_COMPAT + if (unlikely(argv.is_compat)) { + compat_uptr_t compat; + + if (get_user(compat, argv.ptr.compat + nr)) + return ERR_PTR(-EFAULT); + + return compat_ptr(compat); + } +#endif + + if (get_user(native, argv.ptr.native + nr)) + return ERR_PTR(-EFAULT); + + return native; +} + +static bool ksu_str_ends_with(const char *str, size_t str_len, const char *suffix) +{ + size_t suffix_len = strlen(suffix); + if (suffix_len > str_len) + return false; + return memcmp(str + str_len - suffix_len, suffix, suffix_len) == 0; +} + +static bool ksu_is_zygote_or_adbd(const char *name, size_t len) +{ + if (len < 5) + return false; + + // Fast-path: Check last character first to skip 99% of processes + char last = name[len - 1]; + if (last == 'd') + return ksu_str_ends_with(name, len, "/adbd"); + if (last == 's') + return ksu_str_ends_with(name, len, "/app_process"); + if (last == '2') + return ksu_str_ends_with(name, len, "/app_process32"); + if (last == '4') + return ksu_str_ends_with(name, len, "/app_process64"); + + return false; +} + +/* + * return 0 -> No further checks should be required afterwards + * return non-zero -> Further checks should be continued afterwards + */ +int ksu_handle_execveat_init(struct filename *filename, struct user_arg_ptr *argv_user, struct user_arg_ptr *envp_user) { + if (current->pid != 1 && is_init(get_current_cred())) { + int ret; + if (unlikely(strcmp(filename->name, KSUD_PATH) == 0)) { + char tmp_filename[SUSFS_MAX_LEN_PATHNAME] = {0}; + const char __user *argv_user_ptr = get_user_arg_ptr(*argv_user, 0); + struct ksu_sulog_pending_event *pending_sucompat = NULL; + + pr_info("hook_manager: escape to root for init executing ksud: %d\n", current->pid); + ret = escape_to_root_for_init(); + if (ret) { + pr_err("escape_to_root_for_init() failed: %d\n", ret); + return ret; + } + if (!argv_user_ptr || IS_ERR(argv_user_ptr)) { + pr_err("!argv_user_ptr || IS_ERR(argv_user_ptr)\n"); + return -EFAULT; + } + strncpy(tmp_filename, filename->name, SUSFS_MAX_LEN_PATHNAME - 1); + pending_sucompat = ksu_sulog_capture_sucompat(tmp_filename, argv_user, GFP_KERNEL); + ksu_sulog_emit_pending(pending_sucompat, ret, GFP_KERNEL); + return 0; + } else { + size_t len = strlen(filename->name); + if (likely(!ksu_is_zygote_or_adbd(filename->name, len)) && + !susfs_is_current_proc_umounted()) + { + pr_info("susfs: mark no sucompat checks for pid: '%d', exec: '%s'\n", current->pid, filename->name); + susfs_set_current_proc_umounted(); + return 0; + } + } + +#ifdef CONFIG_COMPAT + if (unlikely(envp_user->is_compat)) + ret = ksu_adb_root_handle_execve(filename->name, (void ***)&envp_user->ptr.compat); + else + ret = ksu_adb_root_handle_execve(filename->name, (void ***)&envp_user->ptr.native); +#else + ret = ksu_adb_root_handle_execve(filename->name, (void ***)&envp_user->ptr.native); +#endif + + if (ret) { + pr_err("adb root failed: %d\n", ret); + return ret; + } + return ret; + } + + return -EINVAL; +} + +int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, + void *argv_user, void *envp_user, + int *__never_use_flags) +{ + struct filename *filename; + int ret; + + if (unlikely(!filename_ptr)) + return 0; + + filename = *filename_ptr; + if (IS_ERR(filename)) + return 0; + + if (!ksu_handle_execveat_init(filename, (struct user_arg_ptr*)argv_user, (struct user_arg_ptr*)envp_user)) + return 0; + + if (likely(memcmp(filename->name, su_path, sizeof(su_path)))) + return 0; + + write_sulog('x'); + pr_info("ksu_handle_execveat_sucompat: su found\n"); + + memcpy((void *)filename->name, ksud_path, sizeof(ksud_path)); + + ret = escape_with_root_profile(); + if (ret) + pr_err("escape_with_root_profile() failed: %d\n", ret); + + return 0; +} + +int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, + void *envp, int *flags) +{ + if (ksu_handle_execveat_ksud(fd, filename_ptr, argv, envp, flags)) + return 0; + + return ksu_handle_execveat_sucompat(fd, filename_ptr, argv, envp, + flags); +} +#endif + +int ksu_handle_faccessat(int *dfd, const char __user **filename_user, + int *mode, int *__unused_flags) +{ +#ifdef CONFIG_KSU_SUSFS + char path[sizeof(su_path) + 1] = {0}; + if (strncpy_from_user_nofault(path, *filename_user, sizeof(path)) < 0) + return 0; + + if (unlikely(!memcmp(path, su_path, sizeof(su_path)))) { + write_sulog('a'); + pr_info("ksu_handle_faccessat: su->sh!\n"); + *filename_user = sh_user_path(); + } +#else + const char su[] = SU_PATH; + + if (!ksu_is_allow_uid_for_current(current_uid().val)) { + return 0; + } + + char path[sizeof(su) + 1]; + memset(path, 0, sizeof(path)); + strncpy_from_user_nofault(path, *filename_user, sizeof(path)); + + if (unlikely(!memcmp(path, su, sizeof(su)))) { + write_sulog('a'); + pr_info("faccessat su->sh!\n"); + *filename_user = sh_user_path(); + } +#endif + + return 0; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && defined(CONFIG_KSU_SUSFS) +int ksu_handle_stat(int *dfd, struct filename **filename, int *flags) { + if (unlikely(IS_ERR(*filename) || (*filename)->name == NULL)) + return 0; + + if (likely(memcmp((*filename)->name, su_path, sizeof(su_path)))) + return 0; + + write_sulog('s'); + pr_info("ksu_handle_stat: su->sh!\n"); + memcpy((void *)((*filename)->name), sh_path, sizeof(sh_path)); + return 0; +} +#else +int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags) +{ +#ifdef CONFIG_KSU_SUSFS + char path[sizeof(su_path) + 1] = {0}; + if (strncpy_from_user_nofault(path, *filename_user, sizeof(path)) < 0) + return 0; + + if (unlikely(!memcmp(path, su_path, sizeof(su_path)))) { + write_sulog('s'); + pr_info("ksu_handle_stat: su->sh!\n"); + *filename_user = sh_user_path(); + } +#else + const char su[] = SU_PATH; + + if (!ksu_is_allow_uid_for_current(current_uid().val)) { + return 0; + } + + if (unlikely(!filename_user)) { + return 0; + } + + char path[sizeof(su) + 1]; + memset(path, 0, sizeof(path)); + strncpy_from_user_nofault(path, *filename_user, sizeof(path)); + + if (unlikely(!memcmp(path, su, sizeof(su)))) { + write_sulog('s'); + pr_info("newfstatat su->sh!\n"); + *filename_user = sh_user_path(); + } +#endif + + return 0; +} +#endif + +#if defined(CONFIG_KPROBES) && !defined(CONFIG_KSU_SUSFS) +long ksu_handle_execve_sucompat(const char __user **filename_user, int orig_nr, const struct pt_regs *regs) +{ + const char su[] = SU_PATH; + const char __user *fn; + char path[sizeof(su) + 1]; + long ret; + unsigned long addr; + + if (unlikely(!filename_user)) + goto do_orig_execve; + + if (!ksu_is_allow_uid_for_current(current_uid().val)) + goto do_orig_execve; + + addr = untagged_addr((unsigned long)*filename_user); + fn = (const char __user *)addr; + memset(path, 0, sizeof(path)); + ret = strncpy_from_user(path, fn, sizeof(path)); + + if (ret < 0) { + pr_warn("Access filename when execve failed: %ld", ret); + goto do_orig_execve; + } + + if (likely(memcmp(path, su, sizeof(su)))) + goto do_orig_execve; + + write_sulog('x'); + + pr_info("sys_execve su found\n"); + *filename_user = ksud_user_path(); + + ret = escape_with_root_profile(); + if (ret) { + pr_err("escape_with_root_profile failed: %ld\n", ret); + goto do_orig_execve; + } + + ret = ksu_syscall_table[orig_nr](regs); + if (ret < 0) { + pr_err("failed to execve ksud as su: %ld, fallback to sh\n", ret); + *filename_user = sh_user_path(); + } else { + return ret; + } + +do_orig_execve: + return ksu_syscall_table[orig_nr](regs); +} +#endif + +// sucompat: permitted process can execute 'su' to gain root access. +void __init ksu_sucompat_init() +{ + if (ksu_register_feature_handler(&su_compat_handler)) { + pr_err("Failed to register su_compat feature handler\n"); + } +} + +void __exit ksu_sucompat_exit() +{ + ksu_unregister_feature_handler(KSU_FEATURE_SU_COMPAT); +} diff --git a/KernelSU-Next/kernel/feature/sucompat.h b/KernelSU-Next/kernel/feature/sucompat.h new file mode 100644 index 000000000000..dca8330ac5e3 --- /dev/null +++ b/KernelSU-Next/kernel/feature/sucompat.h @@ -0,0 +1,32 @@ +#ifndef __KSU_H_SUCOMPAT +#define __KSU_H_SUCOMPAT +#include +#include +#include + +#include "linux/jump_label.h" + +extern struct static_key_true ksu_su_compat_enabled; + +void ksu_sucompat_init(void); +void ksu_sucompat_exit(void); + +// Handler functions exported for hook_manager +int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, + int *__unused_flags); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && defined(CONFIG_KSU_SUSFS) +int ksu_handle_stat(int *dfd, struct filename **filename, int *flags); +#else +int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags); +#endif // #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && defined(CONFIG_KSU_SUSFS) + +#if defined(CONFIG_KPROBES) && !defined(CONFIG_KSU_SUSFS) +long ksu_handle_execve_sucompat(const char __user **filename_user, int orig_nr, const struct pt_regs *regs); +#endif + +#ifdef CONFIG_KSU_SUSFS +int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, + void *envp, int *flags); +#endif + +#endif diff --git a/KernelSU-Next/kernel/hook/arm64/patch_memory.c b/KernelSU-Next/kernel/hook/arm64/patch_memory.c new file mode 100644 index 000000000000..0c2576da154f --- /dev/null +++ b/KernelSU-Next/kernel/hook/arm64/patch_memory.c @@ -0,0 +1,206 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2023 bmax121. All Rights Reserved. + */ +#ifdef __aarch64__ + +#include "../patch_memory.h" +#include "klog.h" // IWYU pragma: keep +#include "linux/cpumask.h" +#include "linux/gfp.h" // IWYU pragma: keep +#include "linux/uaccess.h" +#include "linux/stop_machine.h" +#include "asm/cacheflush.h" +#include "asm-generic/fixmap.h" + +// https://github.com/fuqiuluo/ovo/blob/f7da411458e87d32438dc14fce5a3313ed0c967e/ovo/mmuhack.c#L21 + +// Translate a kernel virtual address to a physical address by walking the +// init_mm page tables. Returns the physical address on success, or writes +// a non-zero error to *err. Callers must check *err before using the result, +// since physical address 0 is a valid address. +unsigned long phys_from_virt(unsigned long addr, int *err) +{ + struct mm_struct *mm = &init_mm; + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + + *err = 0; + + pgd = pgd_offset(mm, addr); + if (pgd_none(*pgd) || pgd_bad(*pgd)) + goto fail; + pr_debug("pgd of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pgd, + (uintptr_t)pgd_val(*pgd)); + + p4d = p4d_offset(pgd, addr); + if (p4d_none(*p4d) || p4d_bad(*p4d)) + goto fail; + pr_debug("p4d of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)p4d, + (uintptr_t)p4d_val(*p4d)); +#if defined(p4d_leaf) + if (p4d_leaf(*p4d)) { + pr_debug("Address 0x%lx maps to a P4D-level huge page\n", addr); + return __p4d_to_phys(*p4d) + ((addr & ~P4D_MASK)); + } +#endif + + pud = pud_offset(p4d, addr); + if (pud_none(*pud) || pud_bad(*pud)) + goto fail; + pr_debug("pud of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pud, + (uintptr_t)pud_val(*pud)); +#if defined(pud_leaf) + if (pud_leaf(*pud)) { + pr_debug("Address 0x%lx maps to a PUD-level huge page\n", addr); + return __pud_to_phys(*pud) + ((addr & ~PUD_MASK)); + } +#endif + + pmd = pmd_offset(pud, addr); + pr_debug("pmd of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pmd, + (uintptr_t)pmd_val(*pmd)); +#if defined(pmd_leaf) + if (pmd_leaf(*pmd)) { + pr_debug("Address 0x%lx maps to a PMD-level huge page\n", addr); + return __pmd_to_phys(*pmd) + ((addr & ~PMD_MASK)); + } +#endif + + if (pmd_none(*pmd) || pmd_bad(*pmd)) + goto fail; + + pte = pte_offset_kernel(pmd, addr); + if (!pte) + goto fail; + if (!pte_present(*pte)) + goto fail; + + return __pte_to_phys(*pte) + ((addr & ~PAGE_MASK)); + +fail: + *err = -ENOENT; + return 0; +} + +// This function appears in 5.14: +// https://github.com/torvalds/linux/commit/fade9c2c6ee2baea7df8e6059b3f143c681e5ce4#diff-fc9ef24572e183c6c049b5ae8029762159787f8669d909452bdf40db748f94a7L52 +// https://github.com/torvalds/linux/commit/814b186079cd54d3fe3b6b8ab539cbd44705ef9d#diff-fc9ef24572e183c6c049b5ae8029762159787f8669d909452bdf40db748f94a7R53 +// However, it's backport to android13-5.10 but not to android12-5.10. +// https://cs.android.com/android/_/android/kernel/common/+/6d9f07d8f1ffc310a6877153fe882f35ae380799 +// So we need to grep kernel source code to detect which one to use. +#if KSU_NEW_DCACHE_FLUSH +#define ksu_flush_dcache(start, sz) \ + ({ \ + unsigned long __start = (start); \ + unsigned long __end = __start + (sz); \ + dcache_clean_inval_poc(__start, __end); \ + }) +#define ksu_flush_icache(start, end) caches_clean_inval_pou +#else +#define ksu_flush_dcache(start, sz) __flush_dcache_area((void *)start, sz) +#define ksu_flush_icache(start, end) __flush_icache_range +#endif + +struct patch_text_info { + void *dst; + void *src; + size_t len; + atomic_t cpu_count; + int flags; +}; + +// Implementation of arbitrary kernel address modification. +// We could certainly modify the PTE of the target address to make it writable, +// but this would violate the protection mechanisms of some vendor components +// (such as MTK's MKP, see ^1) at higher EL levels. Fortunately, the kernel's +// `aarch64_insn_write` function works fine, which I believe is achieved by +// modifying memory using fixmaps (MKP's kernel module reports the fixmap address +// to its hypervisor, which might be used to determine whether such memory +// modification is "normal" kernel behavior, see ^1). However, we cannot use the +// `aarch64_insn_write` function directly. First, it can only write 4 bytes +// at a time. Secondly, there's a bug in modifying the kernel's rodata (in our +// case, syscall table). The `patch_map` function uses `vmalloc_to_page` to +// obtain the target's physical address, but `vmalloc_to_page` doesn't handle +// huge page mapping correctly (before version 5.13, see ^2). +// Therefore, we need to obtain the target's physical address and use `fixmap` to +// map and poke it manually. Currently, no patch_lock is held, since I think it's +// not a big problem because we are in stop_machine. +// ^1: https://github.com/NothingOSS/android_kernel_device_modules_6.1_nothing_mt6878/blob/957dac185efe46cbf6336b0fff9516d84c8cd78f/drivers/misc/mediatek/mkp/mkp_main.c#L29 +// ^2: https://github.com/torvalds/linux/commit/c0eb315ad9719e41ce44708455cc69df7ac9f3f8 +static int ksu_patch_text_nosync(void *dst, void *src, size_t len, int flags) +{ + pr_debug("patch dst=0x%lx src=0x%lx len=%ld\n", (unsigned long)dst, + (unsigned long)src, len); + + unsigned long p = (unsigned long)dst; + int ret; + + int phy_err; + unsigned long phy = phys_from_virt(p, &phy_err); + if (phy_err) { + ret = phy_err; + pr_err("failed to find phy addr for patch dst addr 0x%lx\n", p); + goto err; + } + pr_debug("phy addr for patch 0x%lx: 0x%lx\n", p, phy); + + void *map = set_fixmap_offset(FIX_TEXT_POKE0, phy); + pr_debug("fixmap addr for patch 0x%lx: 0x%lx\n", p, (unsigned long)map); + + ret = (int)copy_to_kernel_nofault(map, src, len); + + clear_fixmap(FIX_TEXT_POKE0); + + if (!ret) { + if (flags & KSU_PATCH_TEXT_FLUSH_ICACHE) + ksu_flush_icache((uintptr_t)dst, (uintptr_t)dst + len); + if (flags & KSU_PATCH_TEXT_FLUSH_DCACHE) + ksu_flush_dcache(dst, len); + } + +err: + pr_debug("patch result=%d\n", ret); + return ret; +} + +static int ksu_patch_text_cb(void *arg) +{ + struct patch_text_info *pp = arg; + void *dst = pp->dst, *src = pp->src; + size_t len = pp->len; + int flags = pp->flags; + + int ret = 0; + + /* The last CPU becomes master */ + if (atomic_inc_return(&pp->cpu_count) == num_online_cpus()) { + ret = ksu_patch_text_nosync(dst, src, len, flags); + /* Notify other processors with an additional increment. */ + atomic_inc(&pp->cpu_count); + } else { + while (atomic_read(&pp->cpu_count) <= num_online_cpus()) + cpu_relax(); + isb(); + } + + return ret; +} + +int ksu_patch_text(void *dst, void *src, size_t len, int flags) +{ + struct patch_text_info info = { + .dst = dst, + .src = src, + .len = len, + .cpu_count = ATOMIC_INIT(0), + .flags = flags, + }; + + return stop_machine(ksu_patch_text_cb, &info, cpu_online_mask); +} + +#endif /* __aarch64__ */ diff --git a/KernelSU-Next/kernel/hook/arm64/syscall_hook.c b/KernelSU-Next/kernel/hook/arm64/syscall_hook.c new file mode 100644 index 000000000000..86af70d92dcb --- /dev/null +++ b/KernelSU-Next/kernel/hook/arm64/syscall_hook.c @@ -0,0 +1,261 @@ +#ifdef __aarch64__ + +#include "../syscall_hook.h" + +#include +#include +#include +#include "infra/symbol_resolver.h" +#include "../patch_memory.h" +#include "arch.h" +#include "klog.h" // IWYU pragma: keep + +syscall_fn_t *ksu_syscall_table = NULL; +int ksu_dispatcher_nr = -1; + +// Hook registration table — read with READ_ONCE from tracepoint/dispatcher +// context, written with WRITE_ONCE from init/exit context. +static ksu_syscall_hook_fn syscall_hooks[__NR_syscalls]; + +// Track all hooked syscall entries for restoration. +// Protected by hooked_entries_lock. +struct syscall_hook_entry { + int nr; + syscall_fn_t orig; +}; + +static DEFINE_MUTEX(hooked_entries_lock); +static struct syscall_hook_entry hooked_entries[16]; +static int hooked_count = 0; + +static int patch_syscall_table(int nr, syscall_fn_t fn) +{ + if (ksu_syscall_table == NULL) + return -ENOENT; + if (nr < 0 || nr >= __NR_syscalls) + return -EINVAL; + + pr_info("patch syscall %d, 0x%lx -> 0x%lx\n", nr, + (unsigned long)READ_ONCE(ksu_syscall_table[nr]), (unsigned long)fn); + + if (ksu_patch_text(&ksu_syscall_table[nr], &fn, sizeof(fn), + KSU_PATCH_TEXT_FLUSH_DCACHE)) { + pr_err("patch syscall %d failed\n", nr); + return -EIO; + } + + return 0; +} + +// Direct syscall table patching: overwrite syscall_table[nr] with fn, +// save original to *old, and record for restoration at module exit. +void ksu_syscall_table_hook(int nr, syscall_fn_t fn, syscall_fn_t *old) +{ + if (ksu_syscall_table == NULL) + return; + if (nr < 0 || nr >= __NR_syscalls) { + pr_info("invalid nr: %d\n", nr); + return; + } + + mutex_lock(&hooked_entries_lock); + + syscall_fn_t orig = READ_ONCE(ksu_syscall_table[nr]); + if (old) + *old = orig; + + // Record for later restoration + int i; + bool found = false; + for (i = 0; i < hooked_count; i++) { + if (hooked_entries[i].nr == nr) { + found = true; + break; + } + } + if (!found) { + if (hooked_count < ARRAY_SIZE(hooked_entries)) { + hooked_entries[hooked_count].nr = nr; + hooked_entries[hooked_count].orig = orig; + hooked_count++; + } else { + pr_warn( + "hooked_entries full, cannot track syscall %d for restoration\n", + nr); + } + } + + patch_syscall_table(nr, fn); + + mutex_unlock(&hooked_entries_lock); +} + +// Restore syscall_table[nr] to its original value and remove from tracking list. +void ksu_syscall_table_unhook(int nr) +{ + int i; + + if (ksu_syscall_table == NULL) + return; + if (nr < 0 || nr >= __NR_syscalls) + return; + + mutex_lock(&hooked_entries_lock); + + for (i = 0; i < hooked_count; i++) { + if (hooked_entries[i].nr == nr) { + patch_syscall_table(nr, hooked_entries[i].orig); + // Remove entry by swapping with last + hooked_entries[i] = hooked_entries[--hooked_count]; + mutex_unlock(&hooked_entries_lock); + pr_info("unhooked syscall %d\n", nr); + return; + } + } + + mutex_unlock(&hooked_entries_lock); + pr_warn("syscall %d not found in hooked entries\n", nr); +} + +static int __init ksu_find_ni_syscall_slots(int *out_slots, int max_slots) +{ + unsigned long ni_syscall; + int i, count = 0; + + if (!ksu_syscall_table || max_slots <= 0) + return 0; + + ni_syscall = (unsigned long)ksu_lookup_symbol("__arm64_sys_ni_syscall"); + + pr_info("sys_ni_syscall: 0x%lx\n", ni_syscall); + + if (!ni_syscall) + return 0; + + for (i = 0; i < __NR_syscalls && count < max_slots; i++) { + if ((unsigned long)ksu_syscall_table[i] == ni_syscall) { + out_slots[count++] = i; + pr_info("ni_syscall %d: %d\n", count, i); + } + } + + return count; +} + +// Unified dispatcher: reads original NR from x8/orig_ax, dispatches to handler. +// Validates that syscallno matches our dispatcher slot (i.e. we redirected it), +// otherwise it's a spurious call — return -ENOSYS. +static long __nocfi ksu_syscall_dispatcher(const struct pt_regs *regs) +{ + if (regs->syscallno != ksu_dispatcher_nr) + return -ENOSYS; + + int orig_nr = (int)PT_REGS_ORIG_SYSCALL(regs); + + if (regs->syscallno == orig_nr) + return -ENOSYS; + + // Restore registers to original state before dispatching + ((struct pt_regs *)regs)->syscallno = orig_nr; + PT_REGS_ORIG_SYSCALL((struct pt_regs *)regs) = orig_nr; + + if (likely(orig_nr >= 0 && orig_nr < __NR_syscalls)) { + ksu_syscall_hook_fn fn = READ_ONCE(syscall_hooks[orig_nr]); + if (likely(fn)) + return fn(orig_nr, regs); + } + + return -ENOSYS; +} + +// Register a handler into the dispatcher's routing table. +// Does not modify the syscall table — the dispatcher slot is shared by all hooks. +int ksu_register_syscall_hook(int nr, ksu_syscall_hook_fn fn) +{ + if (nr < 0 || nr >= __NR_syscalls) + return -EINVAL; + if (READ_ONCE(syscall_hooks[nr])) { + pr_warn("syscall hook for nr=%d already registered, skip\n", nr); + return -EEXIST; + } + WRITE_ONCE(syscall_hooks[nr], fn); + pr_info("registered syscall hook for nr=%d\n", nr); + return 0; +} + +// Remove a handler from the dispatcher's routing table. +// The syscall table is not touched — only the dispatcher stops routing this nr. +void ksu_unregister_syscall_hook(int nr) +{ + if (nr < 0 || nr >= __NR_syscalls) + return; + WRITE_ONCE(syscall_hooks[nr], NULL); + pr_info("unregistered syscall hook for nr=%d\n", nr); +} + +bool ksu_has_syscall_hook(int nr) +{ + if (nr < 0 || nr >= __NR_syscalls) + return false; + return READ_ONCE(syscall_hooks[nr]) != NULL; +} + +void __init ksu_syscall_hook_init(void) +{ + int ni_slot; + + memset(syscall_hooks, 0, sizeof(syscall_hooks)); + + ksu_syscall_table = (syscall_fn_t *)ksu_lookup_symbol("sys_call_table"); + pr_info("sys_call_table=0x%lx", (unsigned long)ksu_syscall_table); + + if (!ksu_syscall_table) + return; + + // Find one ni_syscall slot for the dispatcher + if (ksu_find_ni_syscall_slots(&ni_slot, 1) < 1) { + pr_err("failed to find ni_syscall slot for dispatcher\n"); + return; + } + + ksu_dispatcher_nr = ni_slot; + ksu_syscall_table_hook(ksu_dispatcher_nr, + (syscall_fn_t)ksu_syscall_dispatcher, NULL); + pr_info("dispatcher installed at slot %d\n", ksu_dispatcher_nr); +} + +void __exit ksu_syscall_hook_exit(void) +{ + int i; + + if (!ksu_syscall_table) + goto clear_state; + + // First, restore all patched syscall table entries while the dispatcher + // and hook table are still intact, so in-flight syscalls see valid state. + mutex_lock(&hooked_entries_lock); + for (i = 0; i < hooked_count; i++) { + int nr = hooked_entries[i].nr; + syscall_fn_t orig = hooked_entries[i].orig; + + pr_info("restore syscall %d to 0x%lx\n", nr, (unsigned long)orig); + if (ksu_patch_text(&ksu_syscall_table[nr], &orig, sizeof(orig), + KSU_PATCH_TEXT_FLUSH_DCACHE)) { + pr_err("restore syscall %d failed\n", nr); + } + } + hooked_count = 0; + mutex_unlock(&hooked_entries_lock); + +clear_state: + // Now that the syscall table is restored, clear internal state. + // At this point the tracepoint is already unregistered and synchronized + // (done by ksu_syscall_hook_manager_exit before calling us), so no new + // dispatches will occur. + memset(syscall_hooks, 0, sizeof(syscall_hooks)); + ksu_dispatcher_nr = -1; + + pr_info("all syscall hooks restored\n"); +} + +#endif /* __aarch64__ */ diff --git a/KernelSU-Next/kernel/hook/lsm_hook.c b/KernelSU-Next/kernel/hook/lsm_hook.c new file mode 100644 index 000000000000..80966be60b47 --- /dev/null +++ b/KernelSU-Next/kernel/hook/lsm_hook.c @@ -0,0 +1,428 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "infra/symbol_resolver.h" +#include "hook/lsm_hook.h" +#include "hook/patch_memory.h" +#include "klog.h" // IWYU pragma: keep +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) +#include "linux/static_call.h" +#endif +struct ksu_lsm_hook_entry { + struct ksu_lsm_hook *hook; +}; + +static DEFINE_MUTEX(ksu_lsm_hook_lock); +static struct ksu_lsm_hook_entry ksu_lsm_hook_entries[16]; +static int ksu_lsm_hook_count; + +static bool ksu_lsm_hook_is_tracked(struct ksu_lsm_hook *hook) +{ + int i; + + for (i = 0; i < ksu_lsm_hook_count; i++) { + if (ksu_lsm_hook_entries[i].hook == hook) + return true; + } + + return false; +} + +static int ksu_lsm_hook_track(struct ksu_lsm_hook *hook) +{ + if (ksu_lsm_hook_is_tracked(hook)) + return 0; + + if (ksu_lsm_hook_count >= ARRAY_SIZE(ksu_lsm_hook_entries)) { + pr_err("lsm_hook: tracking table full, cannot record %s\n", hook->head_name ?: "unknown"); + return -ENOSPC; + } + + ksu_lsm_hook_entries[ksu_lsm_hook_count++].hook = hook; + return 0; +} + +static void ksu_lsm_hook_untrack(struct ksu_lsm_hook *hook) +{ + int i; + + for (i = 0; i < ksu_lsm_hook_count; i++) { + if (ksu_lsm_hook_entries[i].hook != hook) + continue; + + ksu_lsm_hook_entries[i] = ksu_lsm_hook_entries[--ksu_lsm_hook_count]; + return; + } +} + +static const char *ksu_lsm_hook_target_name(struct ksu_lsm_hook *hook, char *buf, size_t buf_size) +{ + int ret; + + if (hook->target_name) + return hook->target_name; + + ret = scnprintf(buf, buf_size, "bpf_lsm_%s", hook->head_name); + if (ret <= 0 || ret >= buf_size) + return NULL; + + return buf; +} + +static int ksu_lsm_hook_patch_slot(void **slot, void *value) +{ + void *patched = value; + int ret; + + ret = ksu_patch_text(slot, &patched, sizeof(patched), KSU_PATCH_TEXT_FLUSH_DCACHE); + if (!ret) + smp_wmb(); + + return ret; +} + +static bool ksu_lsm_hook_is_bpf_target(struct ksu_lsm_hook *hook) +{ + return hook && !hook->target_name; +} + +static bool ksu_lsm_hook_matches_entry(struct ksu_lsm_hook *hook, struct security_hook_list *entry, void *current_hook, + void *target) +{ + char sym[KSYM_NAME_LEN]; + + (void)hook; + (void)entry; + + if (target) + return current_hook == target; + + if (!hook || !hook->target_name || !current_hook) + return false; + + if (!sprint_symbol_no_offset(sym, (unsigned long)current_hook)) + return false; + + return !strcmp(sym, hook->target_name); +} + +static void ksu_lsm_hook_log_entry(struct ksu_lsm_hook *hook, struct security_hook_list *entry, void *current_hook) +{ + (void)entry; + + pr_info("lsm_hook: candidate head=%s hook=%px [%pSb]\n", hook->head_name ?: "unknown", current_hook, current_hook); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) +typedef void (*ksu_static_call_update_t)(struct static_call_key *key, void *tramp, void *func); + +static size_t ksu_lsm_hook_scall_count(void) +{ + return sizeof(struct lsm_static_calls_table) / sizeof(struct lsm_static_call); +} + +static int ksu_lsm_hook_update_scall(struct lsm_static_call *scall, void *value) +{ + __static_call_update(scall->key, scall->trampoline, value); + smp_wmb(); + return 0; +} +#endif + +int ksu_lsm_hook(struct ksu_lsm_hook *hook) +{ + int ret = 0; + struct security_hook_list *entry; + void *target; + const char *target_name; + char bpf_name[KSYM_NAME_LEN]; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + unsigned long scalls_addr; + struct lsm_static_call *scalls; + size_t scalls_count; + struct security_hook_list *selected_entry = NULL; + struct lsm_static_call *selected_scall = NULL; + void **selected_slot = NULL; + void *selected_hook = NULL; + size_t i; +#else + unsigned long heads_addr; + struct hlist_head *head; + struct security_hook_list *selected_entry = NULL; + void **selected_slot = NULL; + void *selected_hook = NULL; + struct security_hook_list *last_entry = NULL; + void **last_slot = NULL; + void *last_hook = NULL; +#endif + + if (!hook || !hook->replacement) + return -EINVAL; + + mutex_lock(&ksu_lsm_hook_lock); + + if (hook->entry) { + ret = -EALREADY; + goto out_unlock; + } + + target_name = ksu_lsm_hook_target_name(hook, bpf_name, sizeof(bpf_name)); + if (!target_name) { + pr_err("lsm_hook: failed to build target name for %s\n", hook->head_name ?: "unknown"); + ret = -EINVAL; + goto out_unlock; + } + + target = hook->original; + if (!target) + target = ksu_lookup_symbol(target_name); + if (!target && !ksu_lsm_hook_is_bpf_target(hook)) { + pr_err("lsm_hook: failed to resolve target for %s\n", hook->head_name ?: "unknown"); + ret = -ENOENT; + goto out_unlock; + } + if (!target && ksu_lsm_hook_is_bpf_target(hook)) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + pr_info("lsm_hook: %s symbol missing for %s, registration will be rejected\n", target_name, + hook->head_name ?: "unknown"); +#elif IS_ENABLED(CONFIG_BPF_LSM) + pr_info("lsm_hook: %s symbol missing for %s, registration will be rejected\n", target_name, + hook->head_name ?: "unknown"); +#else + pr_info("lsm_hook: %s symbol missing for %s, best-effort fallback is enabled\n", target_name, + hook->head_name ?: "unknown"); +#endif + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + scalls_addr = kallsyms_lookup_name("static_calls_table"); + if (!scalls_addr) { + pr_err("lsm_hook: failed to resolve static_calls_table\n"); + ret = -ENOENT; + goto out_unlock; + } + + scalls = (struct lsm_static_call *)scalls_addr; + scalls_count = ksu_lsm_hook_scall_count(); + for (i = 0; i < scalls_count; i++) { + struct lsm_static_call *scall = &scalls[i]; + void **slot; + void *current_hook; + + entry = READ_ONCE(scall->hl); + if (!entry) + continue; + + slot = (void **)((char *)entry + hook->hook_offset); + current_hook = READ_ONCE(*slot); + + if (current_hook == hook->replacement) { + ret = -EALREADY; + goto out_unlock; + } + if (!ksu_lsm_hook_is_bpf_target(hook)) { + pr_debug("finding %zu: 0x%lx [%pSb]\n", i, (unsigned long)current_hook, current_hook); + } + if (!ksu_lsm_hook_matches_entry(hook, entry, current_hook, target)) + continue; + + if (ksu_lsm_hook_is_bpf_target(hook)) + ksu_lsm_hook_log_entry(hook, entry, current_hook); + + selected_entry = entry; + selected_scall = scall; + selected_slot = slot; + selected_hook = current_hook; + break; + } + + if (!selected_entry) { + pr_err("lsm_hook: target %s not found in head %s\n", target_name, hook->head_name ?: "unknown"); + ret = -ENOENT; + goto out_unlock; + } + + ret = ksu_lsm_hook_track(hook); + if (ret) { + pr_err("lsm_hook: too many hooks to track: %d\n", ret); + goto out_unlock; + } + + if (ksu_lsm_hook_patch_slot(selected_slot, hook->replacement)) { + pr_err("lsm_hook: failed to patch %s\n", hook->head_name ?: "unknown"); + ret = -EFAULT; + goto out_untrack; + } + + if (ksu_lsm_hook_update_scall(selected_scall, hook->replacement)) { + if (ksu_lsm_hook_patch_slot(selected_slot, selected_hook)) { + pr_err("lsm_hook: failed to roll back %s after static call update failure\n", hook->head_name ?: "unknown"); + } + ret = -EFAULT; + goto out_untrack; + } + + hook->entry = selected_entry; + hook->scall = selected_scall; + hook->original = selected_hook; + pr_info("lsm_hook: patched %s hook slot %px from %px to %px\n", hook->head_name ?: "unknown", selected_slot, + selected_hook, hook->replacement); +#else + heads_addr = kallsyms_lookup_name("security_hook_heads"); + if (!heads_addr) { + pr_err("lsm_hook: failed to resolve security_hook_heads\n"); + ret = -ENOENT; + goto out_unlock; + } + + head = (struct hlist_head *)(heads_addr + hook->head_offset); + hlist_for_each_entry (entry, head, list) { + void **slot = (void **)((char *)entry + hook->hook_offset); + void *current_hook = READ_ONCE(*slot); + + if (current_hook == hook->replacement) { + ret = -EALREADY; + goto out_unlock; + } + if (ksu_lsm_hook_is_bpf_target(hook)) { + ksu_lsm_hook_log_entry(hook, entry, current_hook); + last_entry = entry; + last_slot = slot; + last_hook = current_hook; + } + if (!ksu_lsm_hook_matches_entry(hook, entry, current_hook, target)) + continue; + + selected_entry = entry; + selected_slot = slot; + selected_hook = current_hook; + break; + } + +#if !IS_ENABLED(CONFIG_BPF_LSM) + if (!selected_entry && !target && ksu_lsm_hook_is_bpf_target(hook) && last_entry) { + selected_entry = last_entry; + selected_slot = last_slot; + selected_hook = last_hook; + pr_info("lsm_hook: %s unresolved and CONFIG_BPF_LSM is off, fallback to last candidate %px [%pSb]\n", + target_name, selected_hook, selected_hook); + } +#endif + + if (!selected_entry) { + pr_err("lsm_hook: target %s not found in head %s\n", target_name, hook->head_name ?: "unknown"); + ret = -ENOENT; + goto out_unlock; + } + + ret = ksu_lsm_hook_track(hook); + if (ret) { + pr_err("lsm_hook: too many hooks to track: %d\n", ret); + goto out_unlock; + } + + if (ksu_lsm_hook_patch_slot(selected_slot, hook->replacement)) { + pr_err("lsm_hook: failed to patch %s\n", hook->head_name ?: "unknown"); + ret = -EFAULT; + goto out_untrack; + } + + hook->entry = selected_entry; + hook->original = selected_hook; + pr_info("lsm_hook: patched %s hook slot %px from %px to %px\n", hook->head_name ?: "unknown", selected_slot, + selected_hook, hook->replacement); +#endif + goto out_unlock; +out_untrack: + ksu_lsm_hook_untrack(hook); + +out_unlock: + mutex_unlock(&ksu_lsm_hook_lock); + return ret; +} + +void ksu_lsm_unhook(struct ksu_lsm_hook *hook) +{ + void **slot; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + if (!hook || !hook->entry || !hook->original || !hook->scall) + return; +#else + if (!hook || !hook->entry || !hook->original) + return; +#endif + + mutex_lock(&ksu_lsm_hook_lock); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + if (!hook->entry || !hook->original || !hook->scall) { +#else + if (!hook->entry || !hook->original) { +#endif + mutex_unlock(&ksu_lsm_hook_lock); + return; + } + + slot = (void **)((char *)hook->entry + hook->hook_offset); + if (ksu_lsm_hook_patch_slot(slot, hook->original)) { + pr_err("lsm_hook: failed to restore %s\n", hook->head_name ?: "unknown"); + mutex_unlock(&ksu_lsm_hook_lock); + return; + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + if (ksu_lsm_hook_update_scall(hook->scall, hook->original)) { + if (ksu_lsm_hook_patch_slot(slot, hook->replacement)) + pr_err("lsm_hook: failed to reapply %s after static call restore failure\n", hook->head_name ?: "unknown"); + mutex_unlock(&ksu_lsm_hook_lock); + return; + } +#endif + + synchronize_rcu(); + pr_info("lsm_hook: restored %s hook slot %px to %px\n", hook->head_name ?: "unknown", slot, hook->original); + ksu_lsm_hook_untrack(hook); + hook->entry = NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + hook->scall = NULL; +#endif + mutex_unlock(&ksu_lsm_hook_lock); +} + +int ksu_register_lsm_hook(struct ksu_lsm_hook *hook) +{ + return ksu_lsm_hook(hook); +} + +void ksu_unregister_lsm_hook(struct ksu_lsm_hook *hook) +{ + ksu_lsm_unhook(hook); +} + +void __init ksu_lsm_hook_init(void) +{ + pr_info("lsm_hook: init, tracked hooks=%d\n", READ_ONCE(ksu_lsm_hook_count)); +} + +void __exit ksu_lsm_hook_exit(void) +{ + struct ksu_lsm_hook *hooks[ARRAY_SIZE(ksu_lsm_hook_entries)]; + int count; + int i; + + mutex_lock(&ksu_lsm_hook_lock); + count = ksu_lsm_hook_count; + for (i = 0; i < count; i++) + hooks[i] = ksu_lsm_hook_entries[i].hook; + mutex_unlock(&ksu_lsm_hook_lock); + + for (i = count - 1; i >= 0; i--) + ksu_lsm_unhook(hooks[i]); +} diff --git a/KernelSU-Next/kernel/hook/lsm_hook.h b/KernelSU-Next/kernel/hook/lsm_hook.h new file mode 100644 index 000000000000..cbb7f5055756 --- /dev/null +++ b/KernelSU-Next/kernel/hook/lsm_hook.h @@ -0,0 +1,79 @@ +#ifndef __KSU_H_LSM_HOOK +#define __KSU_H_LSM_HOOK + +#include +#include +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) +#define KSU_LSM_HOOK_HEADS_TYPE struct lsm_static_calls_table +#else +#define KSU_LSM_HOOK_HEADS_TYPE struct security_hook_heads +#endif + +struct ksu_lsm_hook { + const char *head_name; + const char *target_name; + size_t head_offset; + size_t hook_offset; + void *replacement; + void *original; + struct security_hook_list *entry; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + struct lsm_static_call *scall; +#endif +}; + +// clang-format off +#define KSU_LSM_HOOK_INIT(head_member, hook_member, target_symbol, replacement_fn) \ + { \ + .head_name = #head_member, \ + .target_name = target_symbol, \ + .head_offset = offsetof(KSU_LSM_HOOK_HEADS_TYPE, head_member), \ + .hook_offset = offsetof(struct security_hook_list, hook.hook_member), \ + .replacement = (void *)(replacement_fn), \ + } +// clang-format on + +#define KSU_LSM_HOOK_BPF_INIT(head_member, hook_member, replacement_fn) \ + KSU_LSM_HOOK_INIT(head_member, hook_member, NULL, replacement_fn) + +// This API implements runtime patching of existing LSM hook slots. It is a +// workaround for out-of-tree modules, not the normal LSM registration path via +// security_add_hooks(). The security framework does not expose a dedicated +// runtime lock for security_hook_heads mutations; callers rely on KernelSU's +// internal serialization plus text patching / RCU synchronization in the +// implementation to keep replacement and restoration coherent. + +// --- Direct LSM hook patching API (hook/unhook) --- +// Replace the hook function in security_hook_heads[@head_name] that currently +// points to @target_name with @replacement. +// Saves the original handler into hook->original and records the patched entry +// for restoration by ksu_lsm_unhook() or the global ksu_lsm_hook_exit(). +int ksu_lsm_hook(struct ksu_lsm_hook *hook); + +// Restore the LSM hook entry previously patched by ksu_lsm_hook() back to the +// original handler saved in hook->original, and remove it from global tracking. +void ksu_lsm_unhook(struct ksu_lsm_hook *hook); + +// --- BPF LSM chaining API (register/unregister) --- +// Register a handler by replacing the BPF LSM implementation for this hook. +// If hook->target_name is NULL, the target symbol defaults to "bpf_lsm_". +// The replacement can call hook->original to run the original BPF LSM handler +// after KernelSU-specific logic. +int ksu_register_lsm_hook(struct ksu_lsm_hook *hook); + +// Undo ksu_register_lsm_hook() and restore the original BPF LSM handler. +void ksu_unregister_lsm_hook(struct ksu_lsm_hook *hook); + +// --- Global lifecycle for tracked hooks --- +// Initialize the internal tracking state used by hook/unhook and +// register/unregister. +void ksu_lsm_hook_init(void); + +// Restore all currently tracked LSM hooks in reverse order and clear the +// internal registry. Call this from module exit to avoid leaving patched LSM +// hook slots behind. +void ksu_lsm_hook_exit(void); + +#endif diff --git a/KernelSU-Next/kernel/hook/patch_memory.h b/KernelSU-Next/kernel/hook/patch_memory.h new file mode 100644 index 000000000000..b375e1397e4e --- /dev/null +++ b/KernelSU-Next/kernel/hook/patch_memory.h @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2023 bmax121. All Rights Reserved. + */ + +#ifndef __KSU_PATCH_MEMORY_H +#define __KSU_PATCH_MEMORY_H + +#include +#include "linux/version.h" + +#ifdef __aarch64__ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 13, 0) +#include "asm/text-patching.h" // IWYU pragma: keep +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0) +#include "asm/patching.h" // IWYU pragma: keep +#else +#include "asm/insn.h" // IWYU pragma: keep +#endif +#elif __x86_64__ +#include "asm/text-patching.h" // IWYU pragma: keep +#else +#error "Unsupported arch" +#endif + +#define KSU_PATCH_TEXT_FLUSH_DCACHE 1 +#define KSU_PATCH_TEXT_FLUSH_ICACHE 2 + +unsigned long phys_from_virt(unsigned long addr, int *err); +int ksu_patch_text(void *dst, void *src, size_t len, int flags); + +#endif diff --git a/KernelSU-Next/kernel/hook/setuid_hook.c b/KernelSU-Next/kernel/hook/setuid_hook.c new file mode 100644 index 000000000000..1fbada0f5a7e --- /dev/null +++ b/KernelSU-Next/kernel/hook/setuid_hook.c @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_KSU_SUSFS +#include +#include "selinux/selinux.h" +#endif + +#include "policy/allowlist.h" +#include "hook/setuid_hook.h" +#include "klog.h" // IWYU pragma: keep +#include "manager/manager_identity.h" +#include "infra/seccomp_cache.h" +#include "supercall/supercall.h" +#include "hook/tp_marker.h" +#include "feature/kernel_umount.h" + +extern void disable_seccomp(void); +extern struct cred *ksu_cred; + +#ifdef CONFIG_KSU_SUSFS +extern u32 susfs_zygote_sid; +extern struct work_struct susfs_extra_works; + +static inline void ksu_handle_extra_susfs_work(void) +{ + schedule_work(&susfs_extra_works); +} + +int ksu_handle_setresuid(uid_t ruid, uid_t euid, uid_t suid) +{ + // We only interest in process spwaned by zygote + if (!susfs_is_sid_equal(current_cred(), susfs_zygote_sid)) + return 0; + + // Check if spawned process is isolated service first, and force to do umount if so + if (is_isolated_process(ruid)) + goto do_umount; + + // - Since ksu maanger app uid is excluded in allow_list_arr, so ksu_uid_should_umount(manager_uid) + // will always return true, that's why we need to explicitly check if new_uid belongs to + // ksu manager. + // - Disable seccomp restriction for KSU manager since running with "su" will disable seccomp anyway + if (likely(ksu_is_manager_appid_valid()) && unlikely(is_uid_manager(ruid))) { + disable_seccomp(); + + pr_info("install fd for manager: %d\n", ruid); + ksu_install_fd(); + return 0; + } + + // we should not umount for webview zygote + if (unlikely(ruid == WEBVIEW_ZYGOTE_UID)) + return 0; + + // Check if spawned process is normal user app and needs to be umounted + if (likely(is_appuid(ruid) && ksu_uid_should_umount(ruid))) + goto do_umount; + + if (ksu_is_allow_uid_for_current(ruid)) + disable_seccomp(); + + return 0; + +do_umount: + // Handle kernel umount + ksu_handle_umount(current_uid().val, ruid); + + // Handle extra susfs work + ksu_handle_extra_susfs_work(); + + // Mark current proc as umounted + susfs_set_current_proc_umounted(); + + return 0; +} +#else +int ksu_handle_setresuid(uid_t old_uid, uid_t new_uid) +{ + // we rely on the fact that zygote always call setresuid(3) with same uids + + pr_info("handle_setresuid from %d to %d\n", old_uid, new_uid); + + if (unlikely(is_uid_manager(new_uid))) { + disable_seccomp(); + ksu_set_task_tracepoint_flag(current); + + pr_info("install fd for manager: %d\n", new_uid); + ksu_install_fd(); + return 0; + } + + if (ksu_is_allow_uid_for_current(new_uid)) { + disable_seccomp(); + ksu_set_task_tracepoint_flag(current); + } else { + ksu_clear_task_tracepoint_flag_if_needed(current); + } + + // Handle kernel umount + ksu_handle_umount(old_uid, new_uid); + + return 0; +} +#endif + +void __init ksu_setuid_hook_init(void) +{ + ksu_kernel_umount_init(); +} + +void __exit ksu_setuid_hook_exit(void) +{ + pr_info("ksu_core_exit\n"); + ksu_kernel_umount_exit(); +} diff --git a/KernelSU-Next/kernel/hook/setuid_hook.h b/KernelSU-Next/kernel/hook/setuid_hook.h new file mode 100644 index 000000000000..d5ab042360d2 --- /dev/null +++ b/KernelSU-Next/kernel/hook/setuid_hook.h @@ -0,0 +1,17 @@ +#ifndef __KSU_H_KSU_CORE +#define __KSU_H_KSU_CORE + +#include +#include + +void ksu_setuid_hook_init(void); +void ksu_setuid_hook_exit(void); + +// Handler functions for hook_manager +#ifdef CONFIG_KSU_SUSFS +int ksu_handle_setresuid(uid_t ruid, uid_t euid, uid_t suid); +#else +int ksu_handle_setresuid(uid_t old_uid, uid_t new_uid); +#endif + +#endif diff --git a/KernelSU-Next/kernel/hook/syscall_event_bridge.c b/KernelSU-Next/kernel/hook/syscall_event_bridge.c new file mode 100644 index 000000000000..715bdb3defdd --- /dev/null +++ b/KernelSU-Next/kernel/hook/syscall_event_bridge.c @@ -0,0 +1,120 @@ +#include "linux/compiler.h" +#include "linux/cred.h" +#include "linux/jump_label.h" +#include "linux/printk.h" +#include "selinux/selinux.h" +#include +#include +#include + +#include "arch.h" +#include "klog.h" // IWYU pragma: keep +#include "hook/tp_marker.h" +#include "feature/sucompat.h" +#include "hook/setuid_hook.h" +#include "policy/app_profile.h" +#include "runtime/ksud.h" +#include "hook/syscall_hook.h" +#include "hook/syscall_event_bridge.h" + +static int ksu_handle_init_mark_tracker(const char __user **filename_user) +{ + char path[64]; + unsigned long addr; + const char __user *fn; + long ret; + + if (unlikely(!filename_user)) + return 0; + + addr = untagged_addr((unsigned long)*filename_user); + fn = (const char __user *)addr; + ret = strncpy_from_user(path, fn, sizeof(path)); + if (ret < 0) + return 0; + + path[sizeof(path) - 1] = '\0'; + if (unlikely(strcmp(path, KSUD_PATH) == 0)) { + pr_info("hook_manager: escape to root for init executing ksud: %d\n", current->pid); + escape_to_root_for_init(); + } else if (likely(strstr(path, "/app_process") == NULL && strstr(path, "/adbd") == NULL)) { + pr_info("hook_manager: unmark %d exec %s\n", current->pid, path); + ksu_clear_task_tracepoint_flag_if_needed(current); + } + + return 0; +} + +long __nocfi ksu_hook_newfstatat(int orig_nr, const struct pt_regs *regs) +{ + int *dfd; + const char __user **filename_user; + int *flags; + + if (!static_branch_likely(&ksu_su_compat_enabled)) + return ksu_syscall_table[orig_nr](regs); + + dfd = (int *)&PT_REGS_PARM1(regs); + filename_user = (const char __user **)&PT_REGS_PARM2(regs); + flags = (int *)&PT_REGS_SYSCALL_PARM4(regs); + ksu_handle_stat(dfd, filename_user, flags); + + return ksu_syscall_table[orig_nr](regs); +} + +long __nocfi ksu_hook_faccessat(int orig_nr, const struct pt_regs *regs) +{ + int *dfd; + const char __user **filename_user; + int *mode; + + if (!static_branch_likely(&ksu_su_compat_enabled)) + return ksu_syscall_table[orig_nr](regs); + + dfd = (int *)&PT_REGS_PARM1(regs); + filename_user = (const char __user **)&PT_REGS_PARM2(regs); + mode = (int *)&PT_REGS_PARM3(regs); + ksu_handle_faccessat(dfd, filename_user, mode, NULL); + + return ksu_syscall_table[orig_nr](regs); +} + +DEFINE_STATIC_KEY_TRUE(ksud_execve_key); + +void ksu_stop_ksud_execve_hook() +{ + static_branch_disable(&ksud_execve_key); +} + +long __nocfi ksu_hook_execve(int orig_nr, const struct pt_regs *regs) +{ + const char __user **filename_user = (const char __user **)&PT_REGS_PARM1(regs); + bool current_is_init = is_init(current_cred()); + + if (static_branch_unlikely(&ksud_execve_key)) + ksu_execve_hook_ksud(regs); + + if (current->pid != 1 && current_is_init) { + ksu_handle_init_mark_tracker(filename_user); + } else if (static_branch_likely(&ksu_su_compat_enabled)) { + return ksu_handle_execve_sucompat(filename_user, orig_nr, regs); + } + + return ksu_syscall_table[orig_nr](regs); +} + +long __nocfi ksu_hook_setresuid(int orig_nr, const struct pt_regs *regs) +{ + uid_t old_uid = current_uid().val; + long ret = ksu_syscall_table[orig_nr](regs); + + if (ret < 0) + return ret; + +#ifdef CONFIG_KSU_SUSFS + ksu_handle_setresuid(current_uid().val, current_uid().val, current_uid().val); +#else + ksu_handle_setresuid(old_uid, current_uid().val); +#endif + return ret; +} diff --git a/KernelSU-Next/kernel/hook/syscall_event_bridge.h b/KernelSU-Next/kernel/hook/syscall_event_bridge.h new file mode 100644 index 000000000000..83e19b8f895d --- /dev/null +++ b/KernelSU-Next/kernel/hook/syscall_event_bridge.h @@ -0,0 +1,13 @@ +#ifndef __KSU_H_SYSCALL_EVENT_BRIDGE +#define __KSU_H_SYSCALL_EVENT_BRIDGE + +#include + +long ksu_hook_newfstatat(int orig_nr, const struct pt_regs *regs); +long ksu_hook_faccessat(int orig_nr, const struct pt_regs *regs); +long ksu_hook_execve(int orig_nr, const struct pt_regs *regs); +long ksu_hook_setresuid(int orig_nr, const struct pt_regs *regs); + +void ksu_stop_ksud_execve_hook(void); + +#endif // __KSU_H_SYSCALL_EVENT_BRIDGE diff --git a/KernelSU-Next/kernel/hook/syscall_hook.h b/KernelSU-Next/kernel/hook/syscall_hook.h new file mode 100644 index 000000000000..944f43f62390 --- /dev/null +++ b/KernelSU-Next/kernel/hook/syscall_hook.h @@ -0,0 +1,51 @@ +#ifndef __KSU_H_KSU_SYSCALL_HOOK +#define __KSU_H_KSU_SYSCALL_HOOK +#include + +#if defined(__x86_64__) +typedef sys_call_ptr_t syscall_fn_t; +#endif + +extern syscall_fn_t *ksu_syscall_table; + +// Dispatcher slot number in syscall table +extern int ksu_dispatcher_nr; + +// Syscall hook handler type. +// orig_nr: the original syscall number before redirection +// regs: the original pt_regs from userspace +// Handler is responsible for calling ksu_syscall_table[orig_nr](regs) if needed. +typedef long (*ksu_syscall_hook_fn)(int orig_nr, const struct pt_regs *regs); + +// --- Dispatcher-based hook API (register/unregister) --- +// Register a handler into the dispatcher's routing table for syscall @nr. +// When a marked process invokes syscall @nr, the sys_enter tracepoint redirects +// it to the unified dispatcher, which looks up @fn by @nr and calls it. +// Does NOT modify the syscall table itself — the dispatcher slot is shared. +// Returns 0 on success, -EEXIST if already registered, -EINVAL if nr invalid. +int ksu_register_syscall_hook(int nr, ksu_syscall_hook_fn fn); + +// Remove a handler from the dispatcher's routing table for syscall @nr. +// The syscall table is not touched — only the dispatcher stops routing @nr. +void ksu_unregister_syscall_hook(int nr); + +// Check if a handler is registered in the dispatcher for syscall @nr. +bool ksu_has_syscall_hook(int nr); + +// --- Direct syscall table patching API (hook/unhook) --- +// Directly overwrite syscall_table[@nr] with @fn using fixmap + stop_machine. +// Saves the original handler to *@old (if non-NULL) and records the entry +// for restoration at module exit. Use this for boot-time hooks that replace +// a real syscall entry (e.g. ksud hooking __NR_execve/__NR_read/__NR_fstat). +void ksu_syscall_table_hook(int nr, syscall_fn_t fn, syscall_fn_t *old); + +// Restore syscall_table[@nr] to its original value recorded by +// ksu_syscall_table_hook(), and remove the entry from the tracking list. +// Use this to cleanly undo a direct hook when it is no longer needed +// (e.g. ksud unhooking __NR_read after init.rc injection is done). +void ksu_syscall_table_unhook(int nr); + +void ksu_syscall_hook_init(void); +void ksu_syscall_hook_exit(void); + +#endif diff --git a/KernelSU-Next/kernel/hook/syscall_hook_manager.c b/KernelSU-Next/kernel/hook/syscall_hook_manager.c new file mode 100644 index 000000000000..d46f1ceb269f --- /dev/null +++ b/KernelSU-Next/kernel/hook/syscall_hook_manager.c @@ -0,0 +1,181 @@ +#include "linux/printk.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 7, 0) +#include +#include +#endif + +#include "arch.h" +#include "klog.h" // IWYU pragma: keep +#include "hook/syscall_hook_manager.h" +#include "hook/tp_marker.h" +#include "feature/sucompat.h" +#include "hook/setuid_hook.h" +#include "hook/syscall_hook.h" +#include "hook/syscall_event_bridge.h" + +#ifdef CONFIG_KRETPROBES + +static struct kretprobe *init_kretprobe(const char *name, kretprobe_handler_t handler) +{ + struct kretprobe *rp = kzalloc(sizeof(struct kretprobe), GFP_KERNEL); + if (!rp) + return NULL; + rp->kp.symbol_name = name; + rp->handler = handler; + rp->data_size = 0; + rp->maxactive = 0; + + int ret = register_kretprobe(rp); + pr_info("hook_manager: register_%s kretprobe: %d\n", name, ret); + if (ret) { + kfree(rp); + return NULL; + } + + return rp; +} + +static void destroy_kretprobe(struct kretprobe **rp_ptr) +{ + struct kretprobe *rp = *rp_ptr; + if (!rp) + return; + unregister_kretprobe(rp); + synchronize_rcu(); + kfree(rp); + *rp_ptr = NULL; +} + +static int syscall_regfunc_handler(struct kretprobe_instance *ri, struct pt_regs *regs) +{ + unsigned long flags; + ksu_tp_marker_lock(&flags); + if (ksu_tp_marker_reg_count() < 1) { + // while install our tracepoint, mark our processes + ksu_mark_running_process_locked(); + } else if (ksu_tp_marker_reg_count() == 1) { + // while other tracepoint first added, mark all processes + ksu_mark_all_process(); + } + ksu_tp_marker_inc_reg_count(); + ksu_tp_marker_unlock(&flags); + return 0; +} + +static int syscall_unregfunc_handler(struct kretprobe_instance *ri, struct pt_regs *regs) +{ + unsigned long flags; + ksu_tp_marker_lock(&flags); + ksu_tp_marker_dec_reg_count(); + if (ksu_tp_marker_reg_count() <= 0) { + // while no tracepoint left, unmark all processes + ksu_unmark_all_process(); + } else if (ksu_tp_marker_reg_count() == 1) { + // while just our tracepoint left, unmark disallowed processes + ksu_mark_running_process_locked(); + } + ksu_tp_marker_unlock(&flags); + return 0; +} + +static struct kretprobe *syscall_regfunc_rp = NULL; +static struct kretprobe *syscall_unregfunc_rp = NULL; +#endif + +#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS +// sys_enter handler: redirect hooked syscalls to the dispatcher +static void ksu_sys_enter_handler(void *data, struct pt_regs *regs, long id) +{ +#if defined(__x86_64__) + if (unlikely(in_compat_syscall())) +#elif defined(__aarch64__) + if (unlikely(is_compat_task())) +#endif + return; + + if (ksu_dispatcher_nr < 0) + return; + + if (ksu_has_syscall_hook(id)) { + struct pt_regs *current_regs = task_pt_regs(current); + +#if defined(__x86_64__) + // Stash the original syscall number in ax. + // We use ax because it currently just holds -ENOSYS and is safe to overwrite. + current_regs->ax = id; + current_regs->orig_ax = ksu_dispatcher_nr; +#elif defined(__aarch64__) + PT_REGS_ORIG_SYSCALL(current_regs) = id; + current_regs->syscallno = ksu_dispatcher_nr; +#endif + } +} +#endif + +void __init ksu_syscall_hook_manager_init(void) +{ + int ret; + pr_info("hook_manager: ksu_hook_manager_init called\n"); + +#ifdef CONFIG_KRETPROBES + syscall_regfunc_rp = init_kretprobe("syscall_regfunc", syscall_regfunc_handler); + syscall_unregfunc_rp = init_kretprobe("syscall_unregfunc", syscall_unregfunc_handler); +#endif + + // Register syscall hooks via dispatcher + ksu_register_syscall_hook(__NR_setresuid, ksu_hook_setresuid); + ksu_register_syscall_hook(__NR_execve, ksu_hook_execve); + ksu_register_syscall_hook(__NR_newfstatat, ksu_hook_newfstatat); + ksu_register_syscall_hook(__NR_faccessat, ksu_hook_faccessat); + +#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS + ret = register_trace_sys_enter(ksu_sys_enter_handler, NULL); +#ifndef CONFIG_KRETPROBES + ksu_mark_running_process_locked(); +#endif + if (ret) { + pr_err("hook_manager: failed to register sys_enter tracepoint: %d\n", ret); + } else { + pr_info("hook_manager: sys_enter tracepoint registered\n"); + } +#endif + + ksu_setuid_hook_init(); + ksu_sucompat_init(); + ksu_avc_spoof_init(); +} + +void __exit ksu_syscall_hook_manager_exit(void) +{ + pr_info("hook_manager: ksu_hook_manager_exit called\n"); +#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS + unregister_trace_sys_enter(ksu_sys_enter_handler, NULL); + tracepoint_synchronize_unregister(); + pr_info("hook_manager: sys_enter tracepoint unregistered\n"); +#endif + +#ifdef CONFIG_KRETPROBES + destroy_kretprobe(&syscall_regfunc_rp); + destroy_kretprobe(&syscall_unregfunc_rp); +#endif + + ksu_unregister_syscall_hook(__NR_setresuid); + ksu_unregister_syscall_hook(__NR_execve); + ksu_unregister_syscall_hook(__NR_newfstatat); + ksu_unregister_syscall_hook(__NR_faccessat); + + ksu_syscall_hook_exit(); + + ksu_sucompat_exit(); + ksu_setuid_hook_exit(); + ksu_avc_spoof_exit(); +} diff --git a/KernelSU-Next/kernel/hook/syscall_hook_manager.h b/KernelSU-Next/kernel/hook/syscall_hook_manager.h new file mode 100644 index 000000000000..366d0085d138 --- /dev/null +++ b/KernelSU-Next/kernel/hook/syscall_hook_manager.h @@ -0,0 +1,14 @@ +#ifndef __KSU_H_HOOK_MANAGER +#define __KSU_H_HOOK_MANAGER + +#include + +// Hook manager initialization and cleanup +void ksu_syscall_hook_manager_init(void); +void ksu_syscall_hook_manager_exit(void); + +// extras.c +void __init ksu_avc_spoof_init(void); +void __exit ksu_avc_spoof_exit(void); + +#endif diff --git a/KernelSU-Next/kernel/hook/tp_marker.c b/KernelSU-Next/kernel/hook/tp_marker.c new file mode 100644 index 000000000000..489a0d7babfc --- /dev/null +++ b/KernelSU-Next/kernel/hook/tp_marker.c @@ -0,0 +1,176 @@ +#include "hook/tp_marker.h" + +#include "linux/cred.h" +#include +#include +#include +#include + +#include "policy/allowlist.h" +#include "klog.h" // IWYU pragma: keep +#include "selinux/selinux.h" + +// Tracepoint registration count management +// == 1: just us +// > 1: someone else is also using syscall tracepoint e.g. ftrace +static int tracepoint_reg_count = 0; +static DEFINE_SPINLOCK(tracepoint_reg_lock); + +int ksu_tp_marker_reg_count(void) +{ + return tracepoint_reg_count; +} + +void ksu_tp_marker_lock(unsigned long *flags) +{ + spin_lock_irqsave(&tracepoint_reg_lock, *flags); +} + +void ksu_tp_marker_unlock(unsigned long *flags) +{ + spin_unlock_irqrestore(&tracepoint_reg_lock, *flags); +} + +void ksu_tp_marker_inc_reg_count(void) +{ + tracepoint_reg_count++; +} + +void ksu_tp_marker_dec_reg_count(void) +{ + tracepoint_reg_count--; +} + +void ksu_clear_task_tracepoint_flag_if_needed(struct task_struct *t) +{ + unsigned long flags; + spin_lock_irqsave(&tracepoint_reg_lock, flags); + if (tracepoint_reg_count <= 1) { + ksu_clear_task_tracepoint_flag(t); + } + spin_unlock_irqrestore(&tracepoint_reg_lock, flags); +} + +// Process marking management +static void handle_process_mark(bool mark) +{ + struct task_struct *p, *t; + read_lock(&tasklist_lock); + for_each_process_thread (p, t) { + if (mark) + ksu_set_task_tracepoint_flag(t); + else + ksu_clear_task_tracepoint_flag(t); + } + read_unlock(&tasklist_lock); +} + +void ksu_mark_all_process(void) +{ + handle_process_mark(true); + pr_info("tp_marker: mark all user process done!\n"); +} + +void ksu_unmark_all_process(void) +{ + handle_process_mark(false); + pr_info("tp_marker: unmark all user process done!\n"); +} + +void ksu_mark_running_process_locked(void) +{ + struct task_struct *p, *t; + read_lock(&tasklist_lock); + for_each_process_thread (p, t) { + if (t->pid != 1 && !t->mm) { + // skip kernel threads, but always allow pid 1 + continue; + } + int uid = task_uid(t).val; + const struct cred *cred = get_task_cred(t); + bool ksu_root_process = uid == 0 && is_task_ksu_domain(cred); + bool is_zygote_process = is_zygote(cred); + bool is_shell = uid == 2000; + // before boot completed, we shall mark init for marking zygote + bool is_init = t->pid == 1; + if (ksu_root_process || is_zygote_process || is_shell || is_init || + ksu_is_allow_uid(uid)) { + ksu_set_task_tracepoint_flag(t); + pr_info("tp_marker: mark process: pid:%d, uid: %d, comm:%s\n", + t->pid, uid, t->comm); + } else { + ksu_clear_task_tracepoint_flag(t); + pr_info("tp_marker: unmark process: pid:%d, uid: %d, comm:%s\n", + t->pid, uid, t->comm); + } + put_cred(cred); + } + read_unlock(&tasklist_lock); +} + +void ksu_mark_running_process(void) +{ + unsigned long flags; + spin_lock_irqsave(&tracepoint_reg_lock, flags); + if (tracepoint_reg_count <= 1) { + ksu_mark_running_process_locked(); + } else { + pr_info( + "tp_marker: not mark running process since syscall tracepoint is in use\n"); + } + spin_unlock_irqrestore(&tracepoint_reg_lock, flags); +} + +// Get task mark status +// Returns: 1 if marked, 0 if not marked, -ESRCH if task not found +int ksu_get_task_mark(pid_t pid) +{ + struct task_struct *task; + int marked = -ESRCH; + + rcu_read_lock(); + task = find_task_by_vpid(pid); + if (task) { + get_task_struct(task); + rcu_read_unlock(); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + marked = test_task_syscall_work(task, SYSCALL_TRACEPOINT) ? 1 : 0; +#else + marked = test_tsk_thread_flag(task, TIF_SYSCALL_TRACEPOINT) ? 1 : 0; +#endif + put_task_struct(task); + } else { + rcu_read_unlock(); + } + + return marked; +} + +// Set task mark status +// Returns: 0 on success, -ESRCH if task not found +int ksu_set_task_mark(pid_t pid, bool mark) +{ + struct task_struct *task; + int ret = -ESRCH; + + rcu_read_lock(); + task = find_task_by_vpid(pid); + if (task) { + get_task_struct(task); + rcu_read_unlock(); + if (mark) { + ksu_set_task_tracepoint_flag(task); + pr_info("tp_marker: marked task pid=%d comm=%s\n", pid, task->comm); + } else { + ksu_clear_task_tracepoint_flag(task); + pr_info("tp_marker: unmarked task pid=%d comm=%s\n", pid, + task->comm); + } + put_task_struct(task); + ret = 0; + } else { + rcu_read_unlock(); + } + + return ret; +} diff --git a/KernelSU-Next/kernel/hook/tp_marker.h b/KernelSU-Next/kernel/hook/tp_marker.h new file mode 100644 index 000000000000..c4e369153836 --- /dev/null +++ b/KernelSU-Next/kernel/hook/tp_marker.h @@ -0,0 +1,47 @@ +#ifndef __KSU_H_TP_MARKER +#define __KSU_H_TP_MARKER + +#include +#include +#include + +// Process marking for tracepoint +void ksu_mark_all_process(void); +void ksu_unmark_all_process(void); +void ksu_mark_running_process(void); + +// Per-task mark operations +int ksu_get_task_mark(pid_t pid); +int ksu_set_task_mark(pid_t pid, bool mark); + +static inline void ksu_set_task_tracepoint_flag(struct task_struct *t) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + set_task_syscall_work(t, SYSCALL_TRACEPOINT); +#else + set_tsk_thread_flag(t, TIF_SYSCALL_TRACEPOINT); +#endif +} + +static inline void ksu_clear_task_tracepoint_flag(struct task_struct *t) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + clear_task_syscall_work(t, SYSCALL_TRACEPOINT); +#else + clear_tsk_thread_flag(t, TIF_SYSCALL_TRACEPOINT); +#endif +} + +void ksu_clear_task_tracepoint_flag_if_needed(struct task_struct *t); + +// Used by syscall_hook_manager kretprobe handlers +void ksu_mark_running_process_locked(void); + +// Tracepoint registration count management (for kretprobe handlers) +int ksu_tp_marker_reg_count(void); +void ksu_tp_marker_lock(unsigned long *flags); +void ksu_tp_marker_unlock(unsigned long *flags); +void ksu_tp_marker_inc_reg_count(void); +void ksu_tp_marker_dec_reg_count(void); + +#endif diff --git a/KernelSU-Next/kernel/hook/x86_64/patch_memory.c b/KernelSU-Next/kernel/hook/x86_64/patch_memory.c new file mode 100644 index 000000000000..19f2ee708657 --- /dev/null +++ b/KernelSU-Next/kernel/hook/x86_64/patch_memory.c @@ -0,0 +1,197 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2023 bmax121. All Rights Reserved. + */ + +#ifdef __x86_64__ + +#include +#include "../patch_memory.h" +#include "klog.h" // IWYU pragma: keep +#include +#include // IWYU pragma: keep +#include +#include +#include +#include + +#include +#include +#include + +// --- Architecture-specific Page Table to Physical Address translation --- +#define KSU_P4D_TO_PHYS(p4d) ((unsigned long)p4d_pfn(p4d) << PAGE_SHIFT) +#define KSU_PUD_TO_PHYS(pud) ((unsigned long)pud_pfn(pud) << PAGE_SHIFT) +#define KSU_PMD_TO_PHYS(pmd) ((unsigned long)pmd_pfn(pmd) << PAGE_SHIFT) +#define KSU_PTE_TO_PHYS(pte) ((unsigned long)pte_pfn(pte) << PAGE_SHIFT) + +// Translate a kernel virtual address to a physical address by walking the +// init_mm page tables. +unsigned long phys_from_virt(unsigned long addr, int *err) +{ + struct mm_struct *mm = &init_mm; + pgd_t *pgd; + p4d_t *p4d; + pud_t *pud; + pmd_t *pmd; + pte_t *pte; + + *err = 0; + + pgd = pgd_offset(mm, addr); + if (pgd_none(*pgd) || pgd_bad(*pgd)) + goto fail; + pr_debug("pgd of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pgd, + (uintptr_t)pgd_val(*pgd)); + + p4d = p4d_offset(pgd, addr); + if (p4d_none(*p4d) || p4d_bad(*p4d)) + goto fail; + pr_debug("p4d of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)p4d, + (uintptr_t)p4d_val(*p4d)); +#if defined(p4d_leaf) + if (p4d_leaf(*p4d)) { + pr_debug("Address 0x%lx maps to a P4D-level huge page\n", addr); + return KSU_P4D_TO_PHYS(*p4d) + ((addr & ~P4D_MASK)); + } +#elif defined(p4d_large) + if (p4d_large(*p4d)) { + return KSU_P4D_TO_PHYS(*p4d) + ((addr & ~P4D_MASK)); + } +#endif + + pud = pud_offset(p4d, addr); + if (pud_none(*pud) || pud_bad(*pud)) + goto fail; + pr_debug("pud of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pud, + (uintptr_t)pud_val(*pud)); +#if defined(pud_leaf) + if (pud_leaf(*pud)) { + pr_debug("Address 0x%lx maps to a PUD-level huge page\n", addr); + return KSU_PUD_TO_PHYS(*pud) + ((addr & ~PUD_MASK)); + } +#elif defined(pud_large) + if (pud_large(*pud)) { + return KSU_PUD_TO_PHYS(*pud) + ((addr & ~PUD_MASK)); + } +#endif + + pmd = pmd_offset(pud, addr); + pr_debug("pmd of 0x%lx p=0x%lx v=0x%lx", addr, (uintptr_t)pmd, + (uintptr_t)pmd_val(*pmd)); +#if defined(pmd_leaf) + if (pmd_leaf(*pmd)) { + pr_debug("Address 0x%lx maps to a PMD-level huge page\n", addr); + return KSU_PMD_TO_PHYS(*pmd) + ((addr & ~PMD_MASK)); + } +#elif defined(pmd_large) + if (pmd_large(*pmd)) { + return KSU_PMD_TO_PHYS(*pmd) + ((addr & ~PMD_MASK)); + } +#endif + + if (pmd_none(*pmd) || pmd_bad(*pmd)) + goto fail; + + pte = pte_offset_kernel(pmd, addr); + if (!pte) + goto fail; + if (!pte_present(*pte)) + goto fail; + + return KSU_PTE_TO_PHYS(*pte) + ((addr & ~PAGE_MASK)); + +fail: + *err = -ENOENT; + return 0; +} + +// --- Architecture-specific Cache Flushing & Barriers --- +#define ksu_flush_dcache(start, sz) do {} while (0) +#define ksu_flush_icache(start, end) do {} while (0) +#define ksu_isb() smp_mb() + +struct patch_text_info { + void *dst; + void *src; + size_t len; + atomic_t cpu_count; + int flags; +}; + +static int ksu_patch_text_nosync(void *dst, void *src, size_t len, int flags) +{ + pr_debug("patch dst=0x%lx src=0x%lx len=%ld\n", (unsigned long)dst, + (unsigned long)src, len); + + unsigned long p = (unsigned long)dst; + int ret; + + int phy_err; + unsigned long phy = phys_from_virt(p, &phy_err); + if (phy_err) { + ret = phy_err; + pr_err("failed to find phy addr for patch dst addr 0x%lx\n", p); + goto err; + } + pr_debug("phy addr for patch 0x%lx: 0x%lx\n", p, phy); + + // Modern x86 removes FIX_TEXT_POKE0. FIX_BTMAP_BEGIN is universal and safe here. + set_fixmap(FIX_BTMAP_BEGIN, phy & PAGE_MASK); + void *map = (void *)(fix_to_virt(FIX_BTMAP_BEGIN) + (phy & ~PAGE_MASK)); + + pr_debug("fixmap addr for patch 0x%lx: 0x%lx\n", p, (unsigned long)map); + + ret = (int)copy_to_kernel_nofault(map, src, len); + + clear_fixmap(FIX_BTMAP_BEGIN); + + if (!ret) { + if (flags & KSU_PATCH_TEXT_FLUSH_ICACHE) + ksu_flush_icache((uintptr_t)dst, (uintptr_t)dst + len); + if (flags & KSU_PATCH_TEXT_FLUSH_DCACHE) + ksu_flush_dcache(dst, len); + } + +err: + pr_debug("patch result=%d\n", ret); + return ret; +} + +static int ksu_patch_text_cb(void *arg) +{ + struct patch_text_info *pp = arg; + void *dst = pp->dst, *src = pp->src; + size_t len = pp->len; + int flags = pp->flags; + + int ret = 0; + + /* The last CPU becomes master */ + if (atomic_inc_return(&pp->cpu_count) == num_online_cpus()) { + ret = ksu_patch_text_nosync(dst, src, len, flags); + /* Notify other processors with an additional increment. */ + atomic_inc(&pp->cpu_count); + } else { + while (atomic_read(&pp->cpu_count) <= num_online_cpus()) + cpu_relax(); + ksu_isb(); + } + + return ret; +} + +int ksu_patch_text(void *dst, void *src, size_t len, int flags) +{ + struct patch_text_info info = { + .dst = dst, + .src = src, + .len = len, + .cpu_count = ATOMIC_INIT(0), + .flags = flags, + }; + + return stop_machine(ksu_patch_text_cb, &info, cpu_online_mask); +} + +#endif /* __x86_64__ */ diff --git a/KernelSU-Next/kernel/hook/x86_64/syscall_hook.c b/KernelSU-Next/kernel/hook/x86_64/syscall_hook.c new file mode 100644 index 000000000000..e399c75d37a6 --- /dev/null +++ b/KernelSU-Next/kernel/hook/x86_64/syscall_hook.c @@ -0,0 +1,262 @@ +#ifdef __x86_64__ + +#include "../syscall_hook.h" + +#include +#include +#include +#include "infra/symbol_resolver.h" +#include "../patch_memory.h" +#include "arch.h" +#include "klog.h" // IWYU pragma: keep + +sys_call_ptr_t *ksu_syscall_table = NULL; +int ksu_dispatcher_nr = -1; + +// Hook registration table — read with READ_ONCE from tracepoint/dispatcher +// context, written with WRITE_ONCE from init/exit context. +static ksu_syscall_hook_fn syscall_hooks[__NR_syscalls]; + +// Track all hooked syscall entries for restoration. +// Protected by hooked_entries_lock. +struct syscall_hook_entry { + int nr; + sys_call_ptr_t orig; +}; + +static DEFINE_MUTEX(hooked_entries_lock); +static struct syscall_hook_entry hooked_entries[16]; +static int hooked_count = 0; + +static int patch_syscall_table(int nr, sys_call_ptr_t fn) +{ + if (ksu_syscall_table == NULL) + return -ENOENT; + if (nr < 0 || nr >= __NR_syscalls) + return -EINVAL; + + pr_info("patch syscall %d, 0x%lx -> 0x%lx\n", nr, + (unsigned long)READ_ONCE(ksu_syscall_table[nr]), (unsigned long)fn); + + if (ksu_patch_text(&ksu_syscall_table[nr], &fn, sizeof(fn), + KSU_PATCH_TEXT_FLUSH_DCACHE)) { + pr_err("patch syscall %d failed\n", nr); + return -EIO; + } + + return 0; +} + +// Direct syscall table patching: overwrite syscall_table[nr] with fn, +// save original to *old, and record for restoration at module exit. +void ksu_syscall_table_hook(int nr, sys_call_ptr_t fn, sys_call_ptr_t *old) +{ + if (ksu_syscall_table == NULL) + return; + if (nr < 0 || nr >= __NR_syscalls) { + pr_info("invalid nr: %d\n", nr); + return; + } + + mutex_lock(&hooked_entries_lock); + + sys_call_ptr_t orig = READ_ONCE(ksu_syscall_table[nr]); + if (old) + *old = orig; + + // Record for later restoration + int i; + bool found = false; + for (i = 0; i < hooked_count; i++) { + if (hooked_entries[i].nr == nr) { + found = true; + break; + } + } + if (!found) { + if (hooked_count < ARRAY_SIZE(hooked_entries)) { + hooked_entries[hooked_count].nr = nr; + hooked_entries[hooked_count].orig = orig; + hooked_count++; + } else { + pr_warn( + "hooked_entries full, cannot track syscall %d for restoration\n", + nr); + } + } + + patch_syscall_table(nr, fn); + + mutex_unlock(&hooked_entries_lock); +} + +// Restore syscall_table[nr] to its original value and remove from tracking list. +void ksu_syscall_table_unhook(int nr) +{ + int i; + + if (ksu_syscall_table == NULL) + return; + if (nr < 0 || nr >= __NR_syscalls) + return; + + mutex_lock(&hooked_entries_lock); + + for (i = 0; i < hooked_count; i++) { + if (hooked_entries[i].nr == nr) { + patch_syscall_table(nr, hooked_entries[i].orig); + // Remove entry by swapping with last + hooked_entries[i] = hooked_entries[--hooked_count]; + mutex_unlock(&hooked_entries_lock); + pr_info("unhooked syscall %d\n", nr); + return; + } + } + + mutex_unlock(&hooked_entries_lock); + pr_warn("syscall %d not found in hooked entries\n", nr); +} + +static int ksu_find_ni_syscall_slots(int *out_slots, int max_slots) +{ + unsigned long ni_syscall; + int i, count = 0; + + if (!ksu_syscall_table || max_slots <= 0) + return 0; + + ni_syscall = (unsigned long)ksu_lookup_symbol("__x64_sys_ni_syscall"); + + pr_info("sys_ni_syscall: 0x%lx\n", ni_syscall); + + if (!ni_syscall) + return 0; + + for (i = 0; i < __NR_syscalls && count < max_slots; i++) { + if ((unsigned long)ksu_syscall_table[i] == ni_syscall) { + out_slots[count++] = i; + pr_info("ni_syscall %d: %d\n", count, i); + } + } + + return count; +} + +// Unified dispatcher: reads original NR from orig_ax, dispatches to handler. +// Validates that orig_ax matches our dispatcher slot (i.e. we redirected it), +// otherwise it's a spurious call — return -ENOSYS. +static long __nocfi ksu_syscall_dispatcher(const struct pt_regs *regs) +{ + if (regs->orig_ax != ksu_dispatcher_nr) + return -ENOSYS; + + // On x86_64, orig_ax was overwritten by our tracepoint to route here. + // The original syscall number passed by userspace is still sitting untouched in ax. + int orig_nr = (int)regs->ax; + + if (regs->orig_ax == orig_nr) + return -ENOSYS; + + // Restore registers to original state before dispatching + ((struct pt_regs *)regs)->orig_ax = orig_nr; + + if (likely(orig_nr >= 0 && orig_nr < __NR_syscalls)) { + ksu_syscall_hook_fn fn = READ_ONCE(syscall_hooks[orig_nr]); + if (likely(fn)) + return fn(orig_nr, regs); + } + + return -ENOSYS; +} + +// Register a handler into the dispatcher's routing table. +// Does not modify the syscall table — the dispatcher slot is shared by all hooks. +int ksu_register_syscall_hook(int nr, ksu_syscall_hook_fn fn) +{ + if (nr < 0 || nr >= __NR_syscalls) + return -EINVAL; + if (READ_ONCE(syscall_hooks[nr])) { + pr_warn("syscall hook for nr=%d already registered, skip\n", nr); + return -EEXIST; + } + WRITE_ONCE(syscall_hooks[nr], fn); + pr_info("registered syscall hook for nr=%d\n", nr); + return 0; +} + +// Remove a handler from the dispatcher's routing table. +// The syscall table is not touched — only the dispatcher stops routing this nr. +void ksu_unregister_syscall_hook(int nr) +{ + if (nr < 0 || nr >= __NR_syscalls) + return; + WRITE_ONCE(syscall_hooks[nr], NULL); + pr_info("unregistered syscall hook for nr=%d\n", nr); +} + +bool ksu_has_syscall_hook(int nr) +{ + if (nr < 0 || nr >= __NR_syscalls) + return false; + return READ_ONCE(syscall_hooks[nr]) != NULL; +} + +void __init ksu_syscall_hook_init(void) +{ + int ni_slot; + + memset(syscall_hooks, 0, sizeof(syscall_hooks)); + + ksu_syscall_table = (sys_call_ptr_t *)ksu_lookup_symbol("sys_call_table"); + pr_info("sys_call_table=0x%lx", (unsigned long)ksu_syscall_table); + + if (!ksu_syscall_table) + return; + + // Find one ni_syscall slot for the dispatcher + if (ksu_find_ni_syscall_slots(&ni_slot, 1) < 1) { + pr_err("failed to find ni_syscall slot for dispatcher\n"); + return; + } + + ksu_dispatcher_nr = ni_slot; + ksu_syscall_table_hook(ksu_dispatcher_nr, + (sys_call_ptr_t)ksu_syscall_dispatcher, NULL); + pr_info("dispatcher installed at slot %d\n", ksu_dispatcher_nr); +} + +void __exit ksu_syscall_hook_exit(void) +{ + int i; + + if (!ksu_syscall_table) + goto clear_state; + + // First, restore all patched syscall table entries while the dispatcher + // and hook table are still intact, so in-flight syscalls see valid state. + mutex_lock(&hooked_entries_lock); + for (i = 0; i < hooked_count; i++) { + int nr = hooked_entries[i].nr; + sys_call_ptr_t orig = hooked_entries[i].orig; + + pr_info("restore syscall %d to 0x%lx\n", nr, (unsigned long)orig); + if (ksu_patch_text(&ksu_syscall_table[nr], &orig, sizeof(orig), + KSU_PATCH_TEXT_FLUSH_DCACHE)) { + pr_err("restore syscall %d failed\n", nr); + } + } + hooked_count = 0; + mutex_unlock(&hooked_entries_lock); + +clear_state: + // Now that the syscall table is restored, clear internal state. + // At this point the tracepoint is already unregistered and synchronized + // (done by ksu_syscall_hook_manager_exit before calling us), so no new + // dispatches will occur. + memset(syscall_hooks, 0, sizeof(syscall_hooks)); + ksu_dispatcher_nr = -1; + + pr_info("all syscall hooks restored\n"); +} + +#endif /* __x86_64__ */ diff --git a/KernelSU-Next/kernel/include/arch.h b/KernelSU-Next/kernel/include/arch.h new file mode 100644 index 000000000000..7aba885eb03c --- /dev/null +++ b/KernelSU-Next/kernel/include/arch.h @@ -0,0 +1,75 @@ +#ifndef __KSU_H_ARCH +#define __KSU_H_ARCH + +#include + +#if defined(__aarch64__) + +#define __PT_PARM1_REG regs[0] +#define __PT_PARM2_REG regs[1] +#define __PT_PARM3_REG regs[2] +#define __PT_SYSCALL_PARM4_REG regs[3] +#define __PT_CCALL_PARM4_REG regs[3] +#define __PT_PARM5_REG regs[4] +#define __PT_PARM6_REG regs[5] +#define __PT_RET_REG regs[30] +#define __PT_FP_REG regs[29] /* Works only with CONFIG_FRAME_POINTER */ +#define __PT_RC_REG regs[0] +#define __PT_SP_REG sp +#define __PT_IP_REG pc +#define __PT_ORIG_SYSCALL_REG regs[8] + +#define REBOOT_SYMBOL "__arm64_sys_reboot" +#define SYS_READ_SYMBOL "__arm64_sys_read" +#define SYS_EXECVE_SYMBOL "__arm64_sys_execve" +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/scripts/syscalltbl.sh;l=57;drc=9142be9e6443fd641ca37f820efe00d9cd890eb1 +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/scripts/syscall.tbl;l=104;drc=b36d4b6aa88ef039647228b98c59a875e92f8c8e +#define SYS_FSTAT_SYMBOL "__arm64_sys_newfstat" + +#elif defined(__x86_64__) + +#define __PT_PARM1_REG di +#define __PT_PARM2_REG si +#define __PT_PARM3_REG dx +/* syscall uses r10 for PARM4 */ +#define __PT_SYSCALL_PARM4_REG r10 +#define __PT_CCALL_PARM4_REG cx +#define __PT_PARM5_REG r8 +#define __PT_PARM6_REG r9 +#define __PT_RET_REG sp +#define __PT_FP_REG bp +#define __PT_RC_REG ax +#define __PT_SP_REG sp +#define __PT_IP_REG ip +#define __PT_ORIG_SYSCALL_REG orig_ax +#define REBOOT_SYMBOL "__x64_sys_reboot" +#define SYS_READ_SYMBOL "__x64_sys_read" +#define SYS_EXECVE_SYMBOL "__x64_sys_execve" +#define SYS_FSTAT_SYMBOL "__x64_sys_newfstat" + +#else +#error "Unsupported arch" +#endif + +/* allow some architecutres to override `struct pt_regs` */ +#ifndef __PT_REGS_CAST +#define __PT_REGS_CAST(x) (x) +#endif + +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG) +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG) +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG) +#define PT_REGS_SYSCALL_PARM4(x) (__PT_REGS_CAST(x)->__PT_SYSCALL_PARM4_REG) +#define PT_REGS_CCALL_PARM4(x) (__PT_REGS_CAST(x)->__PT_CCALL_PARM4_REG) +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG) +#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->__PT_PARM6_REG) +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG) +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG) +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG) +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) +#define PT_REGS_ORIG_SYSCALL(x) (__PT_REGS_CAST(x)->__PT_ORIG_SYSCALL_REG) + +#define PT_REAL_REGS(regs) ((struct pt_regs *)PT_REGS_PARM1(regs)) + +#endif diff --git a/KernelSU-Next/kernel/include/klog.h b/KernelSU-Next/kernel/include/klog.h new file mode 100644 index 000000000000..a934027fbeeb --- /dev/null +++ b/KernelSU-Next/kernel/include/klog.h @@ -0,0 +1,11 @@ +#ifndef __KSU_H_KLOG +#define __KSU_H_KLOG + +#include + +#ifdef pr_fmt +#undef pr_fmt +#define pr_fmt(fmt) "KernelSU: " fmt +#endif + +#endif diff --git a/KernelSU-Next/kernel/include/ksu.h b/KernelSU-Next/kernel/include/ksu.h new file mode 100644 index 000000000000..64e2693ba5dd --- /dev/null +++ b/KernelSU-Next/kernel/include/ksu.h @@ -0,0 +1,29 @@ +#ifndef __KSU_H_KSU +#define __KSU_H_KSU + +#include +#include +#include + +#define KERNEL_SU_VERSION KSU_VERSION +#define KERNEL_SU_VERSION_TAG KSU_VERSION_TAG + +extern struct cred *ksu_cred; +extern bool ksu_late_loaded; +extern bool allow_shell; + +static inline int startswith(char *s, char *prefix) +{ + return strncmp(s, prefix, strlen(prefix)); +} + +static inline int endswith(const char *s, const char *t) +{ + size_t slen = strlen(s); + size_t tlen = strlen(t); + if (tlen > slen) + return 1; + return strcmp(s + slen - tlen, t); +} + +#endif diff --git a/KernelSU-Next/kernel/include/uapi b/KernelSU-Next/kernel/include/uapi new file mode 120000 index 000000000000..8fd1b18bf2b7 --- /dev/null +++ b/KernelSU-Next/kernel/include/uapi @@ -0,0 +1 @@ +../../uapi \ No newline at end of file diff --git a/KernelSU-Next/kernel/infra/file_wrapper.c b/KernelSU-Next/kernel/infra/file_wrapper.c new file mode 100644 index 000000000000..dbad19bcb4c2 --- /dev/null +++ b/KernelSU-Next/kernel/infra/file_wrapper.c @@ -0,0 +1,627 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "objsec.h" + +#include "klog.h" // IWYU pragma: keep +#include "selinux/selinux.h" + +#include "infra/file_wrapper.h" + +struct ksu_file_wrapper { + struct file *orig; + struct file_operations ops; +}; + +static struct ksu_file_wrapper *ksu_create_file_wrapper(struct file *fp); + +static int ksu_wrapper_open(struct inode *ino, struct file *fp) +{ + struct path *orig_path = fp->f_path.dentry->d_fsdata; + struct file *orig_file = + dentry_open(orig_path, fp->f_flags, current_cred()); + if (IS_ERR(orig_file)) { + return PTR_ERR(orig_file); + } + struct ksu_file_wrapper *wrapper = ksu_create_file_wrapper(orig_file); + if (IS_ERR(wrapper)) { + filp_close(orig_file, current->files); + return PTR_ERR(wrapper); + } + fp->private_data = wrapper; + const struct file_operations *new_fops = fops_get(&wrapper->ops); + replace_fops(fp, new_fops); + return 0; +} + +static const struct file_operations ksu_file_wrapper_inode_fops = { + .owner = THIS_MODULE, + .open = ksu_wrapper_open +}; + +static loff_t ksu_wrapper_llseek(struct file *fp, loff_t off, int flags) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->llseek(data->orig, off, flags); +} + +static ssize_t ksu_wrapper_read(struct file *fp, char __user *ptr, size_t sz, + loff_t *off) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->read(orig, ptr, sz, off); +} + +static ssize_t ksu_wrapper_write(struct file *fp, const char __user *ptr, + size_t sz, loff_t *off) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->write(orig, ptr, sz, off); +} + +static ssize_t ksu_wrapper_read_iter(struct kiocb *iocb, struct iov_iter *iovi) +{ + struct ksu_file_wrapper *data = iocb->ki_filp->private_data; + struct file *orig = data->orig; + iocb->ki_filp = orig; + return orig->f_op->read_iter(iocb, iovi); +} + +static ssize_t ksu_wrapper_write_iter(struct kiocb *iocb, struct iov_iter *iovi) +{ + struct ksu_file_wrapper *data = iocb->ki_filp->private_data; + struct file *orig = data->orig; + iocb->ki_filp = orig; + return orig->f_op->write_iter(iocb, iovi); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +static int ksu_wrapper_iopoll(struct kiocb *kiocb, struct io_comp_batch *icb, + unsigned int v) +{ + struct ksu_file_wrapper *data = kiocb->ki_filp->private_data; + struct file *orig = data->orig; + kiocb->ki_filp = orig; + return orig->f_op->iopoll(kiocb, icb, v); +} +#else +static int ksu_wrapper_iopoll(struct kiocb *kiocb, bool spin) +{ + struct ksu_file_wrapper *data = kiocb->ki_filp->private_data; + struct file *orig = data->orig; + kiocb->ki_filp = orig; + return orig->f_op->iopoll(kiocb, spin); +} +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0) +static int ksu_wrapper_iterate(struct file *fp, struct dir_context *dc) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->iterate(orig, dc); +} +#endif + +static int ksu_wrapper_iterate_shared(struct file *fp, struct dir_context *dc) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->iterate_shared(orig, dc); +} + +static __poll_t ksu_wrapper_poll(struct file *fp, struct poll_table_struct *pts) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->poll(orig, pts); +} + +static long ksu_wrapper_unlocked_ioctl(struct file *fp, unsigned int cmd, + unsigned long arg) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->unlocked_ioctl(orig, cmd, arg); +} + +static long ksu_wrapper_compat_ioctl(struct file *fp, unsigned int cmd, + unsigned long arg) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->compat_ioctl(orig, cmd, arg); +} + +static int ksu_wrapper_mmap(struct file *fp, struct vm_area_struct *vma) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->mmap(orig, vma); +} + +static int ksu_wrapper_flush(struct file *fp, fl_owner_t id) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->flush(orig, id); +} + +static int ksu_wrapper_fsync(struct file *fp, loff_t off1, loff_t off2, + int datasync) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->fsync(orig, off1, off2, datasync); +} + +static int ksu_wrapper_fasync(int arg, struct file *fp, int arg2) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->fasync(arg, orig, arg2); +} + +static int ksu_wrapper_lock(struct file *fp, int arg1, struct file_lock *fl) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + return orig->f_op->lock(orig, arg1, fl); +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0) +static ssize_t ksu_wrapper_sendpage(struct file *fp, struct page *pg, int arg1, + size_t sz, loff_t *off, int arg2) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->sendpage) { + return orig->f_op->sendpage(orig, pg, arg1, sz, off, arg2); + } + return -EINVAL; +} +#endif + +static unsigned long ksu_wrapper_get_unmapped_area(struct file *fp, + unsigned long arg1, + unsigned long arg2, + unsigned long arg3, + unsigned long arg4) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->get_unmapped_area) { + return orig->f_op->get_unmapped_area(orig, arg1, arg2, arg3, arg4); + } + return -EINVAL; +} + +// static int ksu_wrapper_check_flags(int arg) {} + +static int ksu_wrapper_flock(struct file *fp, int arg1, struct file_lock *fl) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->flock) { + return orig->f_op->flock(orig, arg1, fl); + } + return -EINVAL; +} + +static ssize_t ksu_wrapper_splice_write(struct pipe_inode_info *pii, + struct file *fp, loff_t *off, size_t sz, + unsigned int arg1) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->splice_write) { + return orig->f_op->splice_write(pii, orig, off, sz, arg1); + } + return -EINVAL; +} + +static ssize_t ksu_wrapper_splice_read(struct file *fp, loff_t *off, + struct pipe_inode_info *pii, size_t sz, + unsigned int arg1) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->splice_read) { + return orig->f_op->splice_read(orig, off, pii, sz, arg1); + } + return -EINVAL; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0) +void ksu_wrapper_splice_eof(struct file *fp) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->splice_eof) { + return orig->f_op->splice_eof(orig); + } +} +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) +static int ksu_wrapper_setlease(struct file *fp, int arg1, + struct file_lease **fl, void **p) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->setlease) { + return orig->f_op->setlease(orig, arg1, fl, p); + } + return -EINVAL; +} +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0) +static int ksu_wrapper_setlease(struct file *fp, int arg1, + struct file_lock **fl, void **p) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->setlease) { + return orig->f_op->setlease(orig, arg1, fl, p); + } + return -EINVAL; +} +#else +static int ksu_wrapper_setlease(struct file *fp, long arg1, + struct file_lock **fl, void **p) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->setlease) { + return orig->f_op->setlease(orig, arg1, fl, p); + } + return -EINVAL; +} +#endif + +static long ksu_wrapper_fallocate(struct file *fp, int mode, loff_t offset, + loff_t len) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->fallocate) { + return orig->f_op->fallocate(orig, mode, offset, len); + } + return -EINVAL; +} + +static void ksu_wrapper_show_fdinfo(struct seq_file *m, struct file *f) +{ + struct ksu_file_wrapper *data = f->private_data; + struct file *orig = data->orig; + if (orig->f_op->show_fdinfo) { + orig->f_op->show_fdinfo(m, orig); + } +} + +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/fs/read_write.c;l=1593-1606;drc=398da7defe218d3e51b0f3bdff75147e28125b60 +static ssize_t ksu_wrapper_copy_file_range(struct file *file_in, loff_t pos_in, + struct file *file_out, + loff_t pos_out, size_t len, + unsigned int flags) +{ + struct ksu_file_wrapper *data = file_out->private_data; + struct file *orig = data->orig; + return orig->f_op->copy_file_range(file_in, pos_in, orig, pos_out, len, + flags); +} + +// no REMAP_FILE_DEDUP: use file_in +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/fs/read_write.c;l=1598-1599;drc=398da7defe218d3e51b0f3bdff75147e28125b60 +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/fs/remap_range.c;l=403-404;drc=398da7defe218d3e51b0f3bdff75147e28125b60 +// REMAP_FILE_DEDUP: use file_out +// https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/fs/remap_range.c;l=483-484;drc=398da7defe218d3e51b0f3bdff75147e28125b60 +static loff_t ksu_wrapper_remap_file_range(struct file *file_in, loff_t pos_in, + struct file *file_out, + loff_t pos_out, loff_t len, + unsigned int remap_flags) +{ + if (remap_flags & REMAP_FILE_DEDUP) { + struct ksu_file_wrapper *data = file_out->private_data; + struct file *orig = data->orig; + return orig->f_op->remap_file_range(file_in, pos_in, orig, pos_out, len, + remap_flags); + } else { + struct ksu_file_wrapper *data = file_in->private_data; + struct file *orig = data->orig; + return orig->f_op->remap_file_range(orig, pos_in, file_out, pos_out, + len, remap_flags); + } +} + +static int ksu_wrapper_fadvise(struct file *fp, loff_t off1, loff_t off2, + int flags) +{ + struct ksu_file_wrapper *data = fp->private_data; + struct file *orig = data->orig; + if (orig->f_op->fadvise) { + return orig->f_op->fadvise(orig, off1, off2, flags); + } + return -EINVAL; +} + +static void ksu_release_file_wrapper(struct ksu_file_wrapper *data); + +static int ksu_wrapper_release(struct inode *inode, struct file *filp) +{ + // https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/fs/file_table.c;l=467-473;drc=3be0b283b562eabbc2b1f3bb534dc8903079bbaa + // f_op->release is called before fops_put(f_op), so we put it manually. + fops_put(filp->f_op); + // prevent it from being put again + filp->f_op = NULL; + ksu_release_file_wrapper(filp->private_data); + return 0; +} + +static struct ksu_file_wrapper *ksu_create_file_wrapper(struct file *fp) +{ + struct ksu_file_wrapper *p = + kcalloc(1, sizeof(struct ksu_file_wrapper), GFP_KERNEL); + if (!p) { + return ERR_PTR(-ENOMEM); + } + + get_file(fp); + + p->orig = fp; + p->ops.owner = THIS_MODULE; + p->ops.llseek = fp->f_op->llseek ? ksu_wrapper_llseek : NULL; + p->ops.read = fp->f_op->read ? ksu_wrapper_read : NULL; + p->ops.write = fp->f_op->write ? ksu_wrapper_write : NULL; + p->ops.read_iter = fp->f_op->read_iter ? ksu_wrapper_read_iter : NULL; + p->ops.write_iter = fp->f_op->write_iter ? ksu_wrapper_write_iter : NULL; + p->ops.iopoll = fp->f_op->iopoll ? ksu_wrapper_iopoll : NULL; +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0) + p->ops.iterate = fp->f_op->iterate ? ksu_wrapper_iterate : NULL; +#endif + p->ops.iterate_shared = + fp->f_op->iterate_shared ? ksu_wrapper_iterate_shared : NULL; + p->ops.poll = fp->f_op->poll ? ksu_wrapper_poll : NULL; + p->ops.unlocked_ioctl = + fp->f_op->unlocked_ioctl ? ksu_wrapper_unlocked_ioctl : NULL; + p->ops.compat_ioctl = + fp->f_op->compat_ioctl ? ksu_wrapper_compat_ioctl : NULL; + p->ops.mmap = fp->f_op->mmap ? ksu_wrapper_mmap : NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) + p->ops.fop_flags = fp->f_op->fop_flags; +#else + p->ops.mmap_supported_flags = fp->f_op->mmap_supported_flags; +#endif + p->ops.flush = fp->f_op->flush ? ksu_wrapper_flush : NULL; + p->ops.release = ksu_wrapper_release; + p->ops.fsync = fp->f_op->fsync ? ksu_wrapper_fsync : NULL; + p->ops.fasync = fp->f_op->fasync ? ksu_wrapper_fasync : NULL; + p->ops.lock = fp->f_op->lock ? ksu_wrapper_lock : NULL; +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0) + p->ops.sendpage = fp->f_op->sendpage ? ksu_wrapper_sendpage : NULL; +#endif + p->ops.get_unmapped_area = + fp->f_op->get_unmapped_area ? ksu_wrapper_get_unmapped_area : NULL; + p->ops.check_flags = fp->f_op->check_flags; + p->ops.flock = fp->f_op->flock ? ksu_wrapper_flock : NULL; + p->ops.splice_write = + fp->f_op->splice_write ? ksu_wrapper_splice_write : NULL; + p->ops.splice_read = fp->f_op->splice_read ? ksu_wrapper_splice_read : NULL; + p->ops.setlease = fp->f_op->setlease ? ksu_wrapper_setlease : NULL; + p->ops.fallocate = fp->f_op->fallocate ? ksu_wrapper_fallocate : NULL; + p->ops.show_fdinfo = fp->f_op->show_fdinfo ? ksu_wrapper_show_fdinfo : NULL; + p->ops.copy_file_range = + fp->f_op->copy_file_range ? ksu_wrapper_copy_file_range : NULL; + p->ops.remap_file_range = + fp->f_op->remap_file_range ? ksu_wrapper_remap_file_range : NULL; + p->ops.fadvise = fp->f_op->fadvise ? ksu_wrapper_fadvise : NULL; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0) + p->ops.splice_eof = fp->f_op->splice_eof ? ksu_wrapper_splice_eof : NULL; +#endif + + return p; +} + +static void ksu_release_file_wrapper(struct ksu_file_wrapper *data) +{ + fput((struct file *)data->orig); + kfree(data); +} + +static char *ksu_wrapper_d_dname(struct dentry *dentry, char *buffer, + int buflen) +{ + struct path *orig_path = dentry->d_fsdata; + return d_path(orig_path, buffer, buflen); +} + +static void ksu_wrapper_d_release(struct dentry *dentry) +{ + struct path *orig_path = dentry->d_fsdata; + path_put(orig_path); + kfree(orig_path); +} + +static const struct dentry_operations ksu_file_wrapper_d_ops = { + .d_dname = ksu_wrapper_d_dname, + .d_release = ksu_wrapper_d_release +}; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) +#define ksu_anon_inode_create_getfile_compat anon_inode_create_getfile +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) +#define ksu_anon_inode_create_getfile_compat anon_inode_getfile_secure +#else +// There is no anon_inode_create_getfile before 5.16, but it's not difficult to implement it. +// https://cs.android.com/android/kernel/superproject/+/common-android12-5.10:common/fs/anon_inodes.c;l=58-125;drc=0d34ce8aa78e38affbb501690bcabec4df88620e + +// Borrow kernel's anon_inode_mnt, so that we don't need to mount one by ourselves. +static struct vfsmount *anon_inode_mnt __read_mostly; + +static struct inode * +ksu_anon_inode_make_secure_inode(const char *name, + const struct inode *context_inode) +{ + struct inode *inode; + const struct qstr qname = QSTR_INIT(name, strlen(name)); + int error; + + if (unlikely(!anon_inode_mnt)) { + return ERR_PTR(-ENODEV); + } + + inode = alloc_anon_inode(anon_inode_mnt->mnt_sb); + if (IS_ERR(inode)) + return inode; + inode->i_flags &= ~S_PRIVATE; + error = security_inode_init_security_anon(inode, &qname, context_inode); + if (error) { + iput(inode); + return ERR_PTR(error); + } + return inode; +} + +static struct file *ksu_anon_inode_create_getfile_compat( + const char *name, const struct file_operations *fops, void *priv, int flags, + const struct inode *context_inode) +{ + struct inode *inode; + struct file *file; + + if (fops->owner && !try_module_get(fops->owner)) + return ERR_PTR(-ENOENT); + + inode = ksu_anon_inode_make_secure_inode(name, context_inode); + if (IS_ERR(inode)) { + file = ERR_CAST(inode); + goto err; + } + + file = alloc_file_pseudo(inode, anon_inode_mnt, name, + flags & (O_ACCMODE | O_NONBLOCK), fops); + if (IS_ERR(file)) + goto err_iput; + + file->f_mapping = inode->i_mapping; + + file->private_data = priv; + + return file; + +err_iput: + iput(inode); +err: + module_put(fops->owner); + return file; +} +#endif + +int ksu_install_file_wrapper(int fd) +{ + int out_fd, ret; + struct file *orig_file = fget(fd); + if (!orig_file) { + return -EBADF; + } + + out_fd = get_unused_fd_flags(O_CLOEXEC); + if (out_fd < 0) { + ret = out_fd; + goto done; + } + + struct ksu_file_wrapper *file_wrapper_data = + ksu_create_file_wrapper(orig_file); + if (IS_ERR(file_wrapper_data)) { + ret = PTR_ERR(file_wrapper_data); + goto out_put_fd; + } + + struct file *wrapper_file = ksu_anon_inode_create_getfile_compat( + "[ksu_fdwrapper]", &file_wrapper_data->ops, file_wrapper_data, + orig_file->f_flags, NULL); + if (IS_ERR(wrapper_file)) { + pr_err("ksu_fdwrapper: getfile failed: %ld\n", PTR_ERR(wrapper_file)); + ret = PTR_ERR(wrapper_file); + goto out_release_wrapper; + } + + // Now do magic on inode and dentry. + // It should be safe to modify them since the file hasn't been published. + + struct inode *wrapper_inode = file_inode(wrapper_file); + // libc's stdio relies on the fstat() result of the fd to determine its buffer type. + wrapper_inode->i_mode = file_inode(orig_file)->i_mode; + struct inode_security_struct *wrapper_sec = selinux_inode(wrapper_inode); + // Use ksu_file_sid to bypass SELinux check. + // When we call `su` from terminal app, this is useful. + if (wrapper_sec) { + wrapper_sec->sid = ksu_file_sid; + } + // Install open file operation for inode. + wrapper_inode->i_fop = &ksu_file_wrapper_inode_fops; + + struct path *orig_path = kmalloc(sizeof(struct path), GFP_KERNEL); + if (!orig_path) { + ret = -ENOMEM; + goto out_put_wrapper_file; + } + *orig_path = orig_file->f_path; + path_get(orig_path); + // Some applications (such as screen) won't work if the tty's path is weird, + // Therefore, we use d_dname to spoof it to return the path to the original file. + wrapper_file->f_path.dentry->d_fsdata = orig_path; + wrapper_file->f_path.dentry->d_op = &ksu_file_wrapper_d_ops; + + fd_install(out_fd, wrapper_file); + ret = out_fd; + goto done; + +out_put_wrapper_file: + fput(wrapper_file); + // file_wrapper will be released by fput + goto out_put_fd; +out_release_wrapper: + ksu_release_file_wrapper(file_wrapper_data); +out_put_fd: + put_unused_fd(out_fd); +done: + fput(orig_file); + + return ret; +} + +void __init ksu_file_wrapper_init(void) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) + static const struct file_operations tmp = { .owner = THIS_MODULE }; + struct file *dummy = anon_inode_getfile("dummy", &tmp, NULL, 0); + if (IS_ERR(dummy)) { + pr_err( + "file_wrapper: initialize anon_inode_mnt failed, can't get file: %ld\n", + PTR_ERR(dummy)); + return; + } + anon_inode_mnt = dummy->f_path.mnt; + if (unlikely(!anon_inode_mnt)) { + pr_err("file_wrapper: initialize anon_inode_mnt failed, got NULL\n"); + } + fput(dummy); +#endif +} diff --git a/KernelSU-Next/kernel/infra/file_wrapper.h b/KernelSU-Next/kernel/infra/file_wrapper.h new file mode 100644 index 000000000000..faae4dded301 --- /dev/null +++ b/KernelSU-Next/kernel/infra/file_wrapper.h @@ -0,0 +1,10 @@ +#ifndef KSU_FILE_WRAPPER_H +#define KSU_FILE_WRAPPER_H + +#include +#include + +int ksu_install_file_wrapper(int fd); +void ksu_file_wrapper_init(void); + +#endif // KSU_FILE_WRAPPER_H diff --git a/KernelSU-Next/kernel/infra/seccomp_cache.c b/KernelSU-Next/kernel/infra/seccomp_cache.c new file mode 100644 index 000000000000..6511066bfb86 --- /dev/null +++ b/KernelSU-Next/kernel/infra/seccomp_cache.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include +#include +#include "klog.h" // IWYU pragma: keep +#include "infra/seccomp_cache.h" + +struct action_cache { + DECLARE_BITMAP(allow_native, SECCOMP_ARCH_NATIVE_NR); +#ifdef SECCOMP_ARCH_COMPAT + DECLARE_BITMAP(allow_compat, SECCOMP_ARCH_COMPAT_NR); +#endif +}; + +struct seccomp_filter { + refcount_t refs; + refcount_t users; + bool log; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + bool wait_killable_recv; +#endif + struct action_cache cache; + struct seccomp_filter *prev; + struct bpf_prog *prog; + struct notification *notif; + struct mutex notify_lock; + wait_queue_head_t wqh; +}; + +void ksu_seccomp_clear_cache(struct seccomp_filter *filter, int nr) +{ + if (!filter) { + return; + } + + if (nr >= 0 && nr < SECCOMP_ARCH_NATIVE_NR) { + clear_bit(nr, filter->cache.allow_native); + } + +#ifdef SECCOMP_ARCH_COMPAT + if (nr >= 0 && nr < SECCOMP_ARCH_COMPAT_NR) { + clear_bit(nr, filter->cache.allow_compat); + } +#endif +} + +void ksu_seccomp_allow_cache(struct seccomp_filter *filter, int nr) +{ + if (!filter) { + return; + } + + if (nr >= 0 && nr < SECCOMP_ARCH_NATIVE_NR) { + set_bit(nr, filter->cache.allow_native); + } + +#ifdef SECCOMP_ARCH_COMPAT + if (nr >= 0 && nr < SECCOMP_ARCH_COMPAT_NR) { + set_bit(nr, filter->cache.allow_compat); + } +#endif +} \ No newline at end of file diff --git a/KernelSU-Next/kernel/infra/seccomp_cache.h b/KernelSU-Next/kernel/infra/seccomp_cache.h new file mode 100644 index 000000000000..270381d94338 --- /dev/null +++ b/KernelSU-Next/kernel/infra/seccomp_cache.h @@ -0,0 +1,10 @@ +#ifndef __KSU_H_KERNEL_COMPAT +#define __KSU_H_KERNEL_COMPAT + +#include +#include + +extern void ksu_seccomp_clear_cache(struct seccomp_filter *filter, int nr); +extern void ksu_seccomp_allow_cache(struct seccomp_filter *filter, int nr); + +#endif diff --git a/KernelSU-Next/kernel/infra/su_mount_ns.c b/KernelSU-Next/kernel/infra/su_mount_ns.c new file mode 100644 index 000000000000..595b93b419ad --- /dev/null +++ b/KernelSU-Next/kernel/infra/su_mount_ns.c @@ -0,0 +1,191 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arch.h" +#include "klog.h" // IWYU pragma: keep +#include "ksu.h" +#include "infra/su_mount_ns.h" + +extern int path_mount(const char *dev_name, struct path *path, + const char *type_page, unsigned long flags, + void *data_page); + +#if defined(__aarch64__) +extern long __arm64_sys_setns(const struct pt_regs *regs); +#elif defined(__x86_64__) +extern long __x64_sys_setns(const struct pt_regs *regs); +#endif + +static long ksu_sys_setns(int fd, int flags) +{ + struct pt_regs regs; + memset(®s, 0, sizeof(regs)); + + PT_REGS_PARM1(®s) = fd; + PT_REGS_PARM2(®s) = flags; + +#if defined(__aarch64__) + return __arm64_sys_setns(®s); +#elif defined(__x86_64__) + return __x64_sys_setns(®s); +#else +#error "Unsupported arch" +#endif +} + +// global mode , need CAP_SYS_ADMIN and CAP_SYS_CHROOT to perform setns +static void ksu_mnt_ns_global(void) +{ + // save current working directory as absolute path before setns + char *pwd_path = NULL; + char *pwd_buf = kmalloc(PATH_MAX, GFP_KERNEL); + if (!pwd_buf) { + pr_warn("no mem for pwd buffer, skip restore pwd!!\n"); + goto try_setns; + } + + struct path saved_pwd; + get_fs_pwd(current->fs, &saved_pwd); + pwd_path = d_path(&saved_pwd, pwd_buf, PATH_MAX); + path_put(&saved_pwd); + + if (IS_ERR(pwd_path)) { + if (PTR_ERR(pwd_path) == -ENAMETOOLONG) { + pr_warn("absolute pwd longer than: %d, skip restore pwd!!\n", + PATH_MAX); + } else { + pr_warn("get absolute pwd failed: %ld\n", PTR_ERR(pwd_path)); + } + pwd_path = NULL; + } + +try_setns: + + rcu_read_lock(); + // &init_task is not init, but swapper/idle, which forks the init process + // so we need find init process + struct pid *pid_struct = find_pid_ns(1, &init_pid_ns); + if (unlikely(!pid_struct)) { + rcu_read_unlock(); + pr_warn("failed to find pid_struct for PID 1\n"); + goto out; + } + + struct task_struct *pid1_task = get_pid_task(pid_struct, PIDTYPE_PID); + rcu_read_unlock(); + if (unlikely(!pid1_task)) { + pr_warn("failed to get task_struct for PID 1\n"); + goto out; + } + struct path ns_path; + long ret = ns_get_path(&ns_path, pid1_task, &mntns_operations); + put_task_struct(pid1_task); + if (ret) { + pr_warn("failed get path for init mount namespace: %ld\n", ret); + goto out; + } + struct file *ns_file = dentry_open(&ns_path, O_RDONLY, ksu_cred); + + path_put(&ns_path); + if (IS_ERR(ns_file)) { + pr_warn("failed open file for init mount namespace: %ld\n", + PTR_ERR(ns_file)); + goto out; + } + + int fd = get_unused_fd_flags(O_CLOEXEC); + if (fd < 0) { + pr_warn("failed to get an unused fd: %d\n", fd); + fput(ns_file); + goto out; + } + + fd_install(fd, ns_file); + ret = ksu_sys_setns(fd, CLONE_NEWNS); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0) + ksys_close(fd); +#else + close_fd(fd); +#endif + + if (ret) { + pr_warn("call setns failed: %ld\n", ret); + goto out; + } + // try to restore working directory using absolute path after setns + if (pwd_path) { + struct path new_pwd; + int err = kern_path(pwd_path, 0, &new_pwd); + if (!err) { + set_fs_pwd(current->fs, &new_pwd); + path_put(&new_pwd); + } else { + pr_warn("restore pwd failed: %d, path: %s\n", err, pwd_path); + } + } +out: + kfree(pwd_buf); +} + +// individual mode , need CAP_SYS_ADMIN to perform unshare and remount +static void ksu_mnt_ns_individual(void) +{ + long ret = ksys_unshare(CLONE_NEWNS); + if (ret) { + pr_warn("call ksys_unshare failed: %ld\n", ret); + return; + } + + // make root mount private + struct path root_path; + get_fs_root(current->fs, &root_path); + int pm_ret = path_mount(NULL, &root_path, NULL, MS_PRIVATE | MS_REC, NULL); + path_put(&root_path); + + if (pm_ret < 0) { + pr_err("failed to make root private, err: %d\n", pm_ret); + } +} + +void setup_mount_ns(int32_t ns_mode) +{ + // inherit mode + if (ns_mode == KSU_NS_INHERITED) { + // do nothing + return; + } + + if (ns_mode != KSU_NS_GLOBAL && ns_mode != KSU_NS_INDIVIDUAL) { + pr_warn("pid: %d ,unknown mount namespace mode: %d\n", current->pid, + ns_mode); + return; + } + + if (!ksu_cred) { + pr_err("no ksu cred! skip mnt_ns magic for pid: %d.\n", current->pid); + return; + } + + const struct cred *old_cred = override_creds(ksu_cred); + if (ns_mode == KSU_NS_GLOBAL) { + ksu_mnt_ns_global(); + } else { + ksu_mnt_ns_individual(); + } + revert_creds(old_cred); +} diff --git a/KernelSU-Next/kernel/infra/su_mount_ns.h b/KernelSU-Next/kernel/infra/su_mount_ns.h new file mode 100644 index 000000000000..2411e6190c71 --- /dev/null +++ b/KernelSU-Next/kernel/infra/su_mount_ns.h @@ -0,0 +1,17 @@ +#ifndef __KSU_SU_MOUNT_NS_H +#define __KSU_SU_MOUNT_NS_H + +#include + +#define KSU_NS_INHERITED 0 +#define KSU_NS_GLOBAL 1 +#define KSU_NS_INDIVIDUAL 2 + +struct ksu_mns_tw { + struct callback_head cb; + int32_t ns_mode; +}; + +void setup_mount_ns(int32_t ns_mode); + +#endif diff --git a/KernelSU-Next/kernel/infra/symbol_resolver.c b/KernelSU-Next/kernel/infra/symbol_resolver.c new file mode 100644 index 000000000000..b2989c2eb275 --- /dev/null +++ b/KernelSU-Next/kernel/infra/symbol_resolver.c @@ -0,0 +1,29 @@ +#include +#include + +#include "infra/symbol_resolver.h" + +void *ksu_lookup_symbol(const char *symbol_name) +{ + char cfi_name[KSYM_NAME_LEN]; + void *addr; + size_t symbol_len; + static const char cfi_suffix[] = ".cfi_jt"; + size_t cfi_suffix_len = sizeof(cfi_suffix) - 1; + + if (!symbol_name || !symbol_name[0]) + return NULL; + + symbol_len = strlen(symbol_name); + + if ((symbol_len < cfi_suffix_len || strcmp(symbol_name + symbol_len - cfi_suffix_len, cfi_suffix) != 0) && + strscpy(cfi_name, symbol_name, sizeof(cfi_name)) > 0 && + strlen(cfi_name) + strlen(".cfi_jt") + 1 <= sizeof(cfi_name)) { + strlcat(cfi_name, ".cfi_jt", sizeof(cfi_name)); + addr = (void *)kallsyms_lookup_name(cfi_name); + if (addr) + return addr; + } + + return (void *)kallsyms_lookup_name(symbol_name); +} diff --git a/KernelSU-Next/kernel/infra/symbol_resolver.h b/KernelSU-Next/kernel/infra/symbol_resolver.h new file mode 100644 index 000000000000..445cd0c4632f --- /dev/null +++ b/KernelSU-Next/kernel/infra/symbol_resolver.h @@ -0,0 +1,6 @@ +#ifndef __KSU_SYMBOL_RESOLVER_H +#define __KSU_SYMBOL_RESOLVER_H + +void *ksu_lookup_symbol(const char *symbol_name); + +#endif diff --git a/KernelSU-Next/kernel/manager/apk_sign.c b/KernelSU-Next/kernel/manager/apk_sign.c new file mode 100644 index 000000000000..bf4937e286c5 --- /dev/null +++ b/KernelSU-Next/kernel/manager/apk_sign.c @@ -0,0 +1,388 @@ +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_KSU_DEBUG +#include +#endif +#include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) +#include +#else +#include +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) +#include +#endif + +#include "manager/apk_sign.h" +#include "uapi/app_profile.h" +#include "klog.h" // IWYU pragma: keep + +struct sdesc { + struct shash_desc shash; + char ctx[]; +}; + +static struct sdesc *init_sdesc(struct crypto_shash *alg) +{ + struct sdesc *sdesc; + int size; + + size = sizeof(struct shash_desc) + crypto_shash_descsize(alg); + sdesc = kzalloc(size, GFP_KERNEL); + if (!sdesc) + return ERR_PTR(-ENOMEM); + sdesc->shash.tfm = alg; + return sdesc; +} + +static int calc_hash(struct crypto_shash *alg, const unsigned char *data, + unsigned int datalen, unsigned char *digest) +{ + struct sdesc *sdesc; + int ret; + + sdesc = init_sdesc(alg); + if (IS_ERR(sdesc)) { + pr_info("can't alloc sdesc\n"); + return PTR_ERR(sdesc); + } + + ret = crypto_shash_digest(&sdesc->shash, data, datalen, digest); + kfree(sdesc); + return ret; +} + +static int ksu_sha256(const unsigned char *data, unsigned int datalen, + unsigned char *digest) +{ + struct crypto_shash *alg; + char *hash_alg_name = "sha256"; + int ret; + + alg = crypto_alloc_shash(hash_alg_name, 0, 0); + if (IS_ERR(alg)) { + pr_info("can't alloc alg %s\n", hash_alg_name); + return PTR_ERR(alg); + } + ret = calc_hash(alg, data, datalen, digest); + crypto_free_shash(alg); + return ret; +} + +static bool check_block(struct file *fp, u32 *size4, loff_t *pos, u32 *offset, + unsigned expected_size, const char *expected_sha256) +{ + kernel_read(fp, size4, 0x4, pos); // signer-sequence length + kernel_read(fp, size4, 0x4, pos); // signer length + kernel_read(fp, size4, 0x4, pos); // signed data length + + *offset += 0x4 * 3; + + kernel_read(fp, size4, 0x4, pos); // digests-sequence length + + *pos += *size4; + *offset += 0x4 + *size4; + + kernel_read(fp, size4, 0x4, pos); // certificates length + kernel_read(fp, size4, 0x4, pos); // certificate length + *offset += 0x4 * 2; + + if (*size4 == expected_size) { + *offset += *size4; + +#define CERT_MAX_LENGTH 1024 + char cert[CERT_MAX_LENGTH]; + if (*size4 > CERT_MAX_LENGTH) { + pr_info("cert length overlimit\n"); + return false; + } + kernel_read(fp, cert, *size4, pos); + unsigned char digest[SHA256_DIGEST_SIZE]; + if (IS_ERR(ksu_sha256(cert, *size4, digest))) { + pr_info("sha256 error\n"); + return false; + } + + char hash_str[SHA256_DIGEST_SIZE * 2 + 1]; + hash_str[SHA256_DIGEST_SIZE * 2] = '\0'; + + bin2hex(hash_str, digest, SHA256_DIGEST_SIZE); + pr_info("sha256: %s, expected: %s\n", hash_str, expected_sha256); + if (strcmp(expected_sha256, hash_str) == 0) { + return true; + } + } + return false; +} + +struct zip_entry_header { + uint32_t signature; + uint16_t version; + uint16_t flags; + uint16_t compression; + uint16_t mod_time; + uint16_t mod_date; + uint32_t crc32; + uint32_t compressed_size; + uint32_t uncompressed_size; + uint16_t file_name_length; + uint16_t extra_field_length; +} __attribute__((packed)); + +// This is a necessary but not sufficient condition, but it is enough for us +static bool has_v1_signature_file(struct file *fp) +{ + struct zip_entry_header header; + const char MANIFEST[] = "META-INF/MANIFEST.MF"; + + loff_t pos = 0; + + while (kernel_read(fp, &header, sizeof(struct zip_entry_header), &pos) == + sizeof(struct zip_entry_header)) { + if (header.signature != 0x04034b50) { + // ZIP magic: 'PK' + return false; + } + // Read the entry file name + if (header.file_name_length == sizeof(MANIFEST) - 1) { + char fileName[sizeof(MANIFEST)]; + kernel_read(fp, fileName, header.file_name_length, &pos); + fileName[header.file_name_length] = '\0'; + + // Check if the entry matches META-INF/MANIFEST.MF + if (strncmp(MANIFEST, fileName, sizeof(MANIFEST) - 1) == 0) { + return true; + } + } else { + // Skip the entry file name + pos += header.file_name_length; + } + + // Skip to the next entry + pos += header.extra_field_length + header.compressed_size; + } + + return false; +} + +static __always_inline bool check_v2_signature(char *path, + unsigned expected_size, + const char *expected_sha256) +{ + unsigned char buffer[0x11] = { 0 }; + u32 size4; + u64 size8, size_of_block; + + loff_t pos; + + bool v2_signing_valid = false; + int v2_signing_blocks = 0; + bool v3_signing_exist = false; + bool v3_1_signing_exist = false; + + int i; + struct file *fp = filp_open(path, O_RDONLY, 0); + if (IS_ERR(fp)) { + pr_err("open %s error.\n", path); + return false; + } + + // disable inotify for this file + fp->f_mode |= FMODE_NONOTIFY; + + // https://en.wikipedia.org/wiki/Zip_(file_format)#End_of_central_directory_record_(EOCD) + for (i = 0;; ++i) { + unsigned short n; + pos = generic_file_llseek(fp, -i - 2, SEEK_END); + kernel_read(fp, &n, 2, &pos); + if (n == i) { + pos -= 22; + kernel_read(fp, &size4, 4, &pos); + if ((size4 ^ 0xcafebabeu) == 0xccfbf1eeu) { + break; + } + } + if (i == 0xffff) { + pr_info("error: cannot find eocd\n"); + goto clean; + } + } + + pos += 12; + // offset + kernel_read(fp, &size4, 0x4, &pos); + pos = size4 - 0x18; + + kernel_read(fp, &size8, 0x8, &pos); + kernel_read(fp, buffer, 0x10, &pos); + if (strcmp((char *)buffer, "APK Sig Block 42")) { + goto clean; + } + + pos = size4 - (size8 + 0x8); + kernel_read(fp, &size_of_block, 0x8, &pos); + if (size_of_block != size8) { + goto clean; + } + + int loop_count = 0; + while (loop_count++ < 10) { + uint32_t id; + uint32_t offset; + kernel_read(fp, &size8, 0x8, + &pos); // sequence length + if (size8 == size_of_block) { + break; + } + kernel_read(fp, &id, 0x4, &pos); // id + offset = 4; + if (id == 0x7109871au) { + v2_signing_blocks++; + v2_signing_valid = check_block(fp, &size4, &pos, &offset, + expected_size, expected_sha256); + } else if (id == 0xf05368c0u) { + // http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#73 + v3_signing_exist = true; + } else if (id == 0x1b93ad61u) { + // http://aospxref.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java#74 + v3_1_signing_exist = true; + } else { +#ifdef CONFIG_KSU_DEBUG + pr_info("Unknown id: 0x%08x\n", id); +#endif + } + pos += (size8 - offset); + } + + if (v2_signing_blocks != 1) { +#ifdef CONFIG_KSU_DEBUG + pr_err("Unexpected v2 signature count: %d\n", v2_signing_blocks); +#endif + v2_signing_valid = false; + } + + if (v2_signing_valid) { + int has_v1_signing = has_v1_signature_file(fp); + if (has_v1_signing) { + pr_err("Unexpected v1 signature scheme found!\n"); + filp_close(fp, 0); + return false; + } + } +clean: + filp_close(fp, 0); + + if (v3_signing_exist || v3_1_signing_exist) { +#ifdef CONFIG_KSU_DEBUG + pr_err("Unexpected v3 signature scheme found!\n"); +#endif + return false; + } + + return v2_signing_valid; +} + +#ifdef CONFIG_KSU_DEBUG + +int ksu_debug_manager_appid = -1; + +#include "manager/manager_identity.h" + +static int set_expected_size(const char *val, const struct kernel_param *kp) +{ + int rv = param_set_uint(val, kp); + ksu_set_manager_appid(ksu_debug_manager_appid); + pr_info("ksu_manager_appid set to %d\n", ksu_debug_manager_appid); + return rv; +} + +static struct kernel_param_ops expected_size_ops = { + .set = set_expected_size, + .get = param_get_uint, +}; + +module_param_cb(ksu_debug_manager_appid, &expected_size_ops, + &ksu_debug_manager_appid, S_IRUSR | S_IWUSR); + +#endif + +int get_pkg_from_apk_path(char *pkg, const char *path) +{ + int len = strlen(path); + if (len >= KSU_MAX_PACKAGE_NAME || len < 1) + return -1; + + const char *last_slash = NULL; + const char *second_last_slash = NULL; + + int i; + for (i = len - 1; i >= 0; i--) { + if (path[i] == '/') { + if (!last_slash) { + last_slash = &path[i]; + } else { + second_last_slash = &path[i]; + break; + } + } + } + + if (!last_slash || !second_last_slash) + return -1; + + const char *last_hyphen = strchr(second_last_slash, '-'); + if (!last_hyphen || last_hyphen > last_slash) + return -1; + + int pkg_len = last_hyphen - second_last_slash - 1; + if (pkg_len >= KSU_MAX_PACKAGE_NAME || pkg_len <= 0) + return -1; + + // Copying the package name + strncpy(pkg, second_last_slash + 1, pkg_len); + pkg[pkg_len] = '\0'; + + return 0; +} + +bool is_manager_apk(char *path) +{ +#ifdef KSU_MANAGER_PACKAGE + char pkg[KSU_MAX_PACKAGE_NAME]; + if (get_pkg_from_apk_path(pkg, path) < 0) { + pr_err("Failed to get package name from apk path: %s\n", path); + return false; + } + + // pkg is `` + if (strncmp(pkg, KSU_MANAGER_PACKAGE, sizeof(KSU_MANAGER_PACKAGE))) { + return false; + } +#endif + + const char *p = KSU_NEXT_MANAGER_LIST; + + while (*p) { + unsigned int size; + char hash[65] = {0}; + + if (sscanf(p, "%x:%64[^,]", &size, hash) == 2) { + if (check_v2_signature(path, size, hash)) { + pr_info("KernelSU: matched manager APK: %s (size=0x%x, hash=%s)\n", + path, size, hash); + return true; + } + } + + p = strchr(p, ','); + if (!p) + break; + p++; // skip comma + } + + return false; +} diff --git a/KernelSU-Next/kernel/manager/apk_sign.h b/KernelSU-Next/kernel/manager/apk_sign.h new file mode 100644 index 000000000000..d3a44bd207c2 --- /dev/null +++ b/KernelSU-Next/kernel/manager/apk_sign.h @@ -0,0 +1,9 @@ +#ifndef __KSU_H_APK_V2_SIGN +#define __KSU_H_APK_V2_SIGN + +#include + +bool is_manager_apk(char *path); +int get_pkg_from_apk_path(char *pkg, const char *path); + +#endif diff --git a/KernelSU-Next/kernel/manager/manager_identity.h b/KernelSU-Next/kernel/manager/manager_identity.h new file mode 100644 index 000000000000..1268f443aa28 --- /dev/null +++ b/KernelSU-Next/kernel/manager/manager_identity.h @@ -0,0 +1,73 @@ +#ifndef __KSU_H_MANAGER_IDENTITY +#define __KSU_H_MANAGER_IDENTITY + +#include +#include + +#define KSU_INVALID_APPID -1 +#define KSU_PER_USER_RANGE 100000 + +#ifdef CONFIG_KSU_DISABLE_MANAGER +static inline bool ksu_is_manager_appid_valid() +{ + return true; +} + +static inline bool is_manager() +{ + return current_uid().val == 0; +} + +static inline bool is_uid_manager(uid_t uid) +{ + return uid == 0; +} + +static inline uid_t ksu_get_manager_appid() +{ + return 0; +} + +static inline void ksu_set_manager_appid(uid_t appid) +{ + (void)appid; +} + +static inline void ksu_invalidate_manager_uid() +{ +} +#else +extern uid_t ksu_manager_appid; // DO NOT DIRECT USE + +static inline bool ksu_is_manager_appid_valid() +{ + return ksu_manager_appid != KSU_INVALID_APPID; +} + +static inline bool is_manager() +{ + return unlikely(ksu_manager_appid == current_uid().val % KSU_PER_USER_RANGE); +} + +static inline bool is_uid_manager(uid_t uid) +{ + return unlikely(ksu_manager_appid == uid % KSU_PER_USER_RANGE); +} + +static inline uid_t ksu_get_manager_appid() +{ + return ksu_manager_appid; +} + +static inline void ksu_set_manager_appid(uid_t appid) +{ + ksu_manager_appid = appid; +} + +static inline void ksu_invalidate_manager_uid() +{ + ksu_manager_appid = KSU_INVALID_APPID; +} +#endif + +#endif // __KSU_H_MANAGER_IDENTITY diff --git a/KernelSU-Next/kernel/manager/manager_observer.h b/KernelSU-Next/kernel/manager/manager_observer.h new file mode 100644 index 000000000000..03f3b12787d9 --- /dev/null +++ b/KernelSU-Next/kernel/manager/manager_observer.h @@ -0,0 +1,18 @@ +#ifndef __KSU_H_MANAGER_OBSERVER +#define __KSU_H_MANAGER_OBSERVER + +#ifdef CONFIG_KSU_DISABLE_MANAGER +static inline int ksu_observer_init(void) +{ + return 0; +} + +static inline void ksu_observer_exit(void) +{ +} +#else +int ksu_observer_init(void); +void ksu_observer_exit(void); +#endif + +#endif // __KSU_H_MANAGER_OBSERVER diff --git a/KernelSU-Next/kernel/manager/pkg_observer.c b/KernelSU-Next/kernel/manager/pkg_observer.c new file mode 100644 index 000000000000..0bae3d582759 --- /dev/null +++ b/KernelSU-Next/kernel/manager/pkg_observer.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include "klog.h" // IWYU pragma: keep +#include "manager/throne_tracker.h" + +#define MASK_SYSTEM (FS_CREATE | FS_MOVE | FS_EVENT_ON_CHILD) + +struct watch_dir { + const char *path; + u32 mask; + struct path kpath; + struct inode *inode; + struct fsnotify_mark *mark; +}; + +static struct fsnotify_group *g; + +static int ksu_handle_inode_event(struct fsnotify_mark *mark, u32 mask, + struct inode *inode, struct inode *dir, + const struct qstr *file_name, u32 cookie) +{ + if (!file_name) + return 0; + if (mask & FS_ISDIR) + return 0; + if (file_name->len == 13 && !memcmp(file_name->name, "packages.list", 13)) { + pr_info("packages.list detected: %d\n", mask); + track_throne(false); + } + return 0; +} + +static const struct fsnotify_ops ksu_ops = { + .handle_inode_event = ksu_handle_inode_event, +}; + +static int add_mark_on_inode(struct inode *inode, u32 mask, + struct fsnotify_mark **out) +{ + struct fsnotify_mark *m; + + m = kzalloc(sizeof(*m), GFP_KERNEL); + if (!m) + return -ENOMEM; + + fsnotify_init_mark(m, g); + m->mask = mask; + + if (fsnotify_add_inode_mark(m, inode, 0)) { + fsnotify_put_mark(m); + return -EINVAL; + } + *out = m; + return 0; +} + +static int watch_one_dir(struct watch_dir *wd) +{ + int ret = kern_path(wd->path, LOOKUP_FOLLOW, &wd->kpath); + if (ret) { + pr_info("path not ready: %s (%d)\n", wd->path, ret); + return ret; + } + wd->inode = d_inode(wd->kpath.dentry); + ihold(wd->inode); + + ret = add_mark_on_inode(wd->inode, wd->mask, &wd->mark); + if (ret) { + pr_err("Add mark failed for %s (%d)\n", wd->path, ret); + path_put(&wd->kpath); + iput(wd->inode); + wd->inode = NULL; + return ret; + } + pr_info("watching %s\n", wd->path); + return 0; +} + +static void unwatch_one_dir(struct watch_dir *wd) +{ + if (wd->mark) { + fsnotify_destroy_mark(wd->mark, g); + fsnotify_put_mark(wd->mark); + wd->mark = NULL; + } + if (wd->inode) { + iput(wd->inode); + wd->inode = NULL; + } + if (wd->kpath.dentry) { + path_put(&wd->kpath); + memset(&wd->kpath, 0, sizeof(wd->kpath)); + } +} + +static struct watch_dir g_watch = { .path = "/data/system", + .mask = MASK_SYSTEM }; + +int ksu_observer_init(void) +{ + int ret = 0; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) + g = fsnotify_alloc_group(&ksu_ops, 0); +#else + g = fsnotify_alloc_group(&ksu_ops); +#endif + if (IS_ERR(g)) + return PTR_ERR(g); + + ret = watch_one_dir(&g_watch); + pr_info("observer init done\n"); + return 0; +} + +void __exit ksu_observer_exit(void) +{ + unwatch_one_dir(&g_watch); + fsnotify_put_group(g); + pr_info("observer exit done\n"); +} diff --git a/KernelSU-Next/kernel/manager/throne_tracker.c b/KernelSU-Next/kernel/manager/throne_tracker.c new file mode 100644 index 000000000000..f06905075d8a --- /dev/null +++ b/KernelSU-Next/kernel/manager/throne_tracker.c @@ -0,0 +1,435 @@ + +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_KSU_THRONE_TRACKER_ALWAYS_THREADED +#include +#include +#endif +#include // WRITE_ONCE +#include // msleep +#include // in_atomic() +#include // irqs_disabled() +#include // cmpxchg + +#include "policy/allowlist.h" +#include "manager/apk_sign.h" +#include "klog.h" // IWYU pragma: keep +#include "manager/manager_identity.h" +#include "manager/throne_tracker.h" + +uid_t ksu_manager_appid = KSU_INVALID_APPID; + +#define SYSTEM_PACKAGES_LIST_PATH "/data/system/packages.list" + +struct uid_data { + struct list_head list; + u32 uid; + char package[KSU_MAX_PACKAGE_NAME]; +}; + +static void crown_manager(const char *apk, struct list_head *uid_data) +{ + char pkg[KSU_MAX_PACKAGE_NAME]; + if (get_pkg_from_apk_path(pkg, apk) < 0) { + pr_err("Failed to get package name from apk path: %s\n", apk); + return; + } + + pr_info("manager pkg: %s\n", pkg); + + struct list_head *list = (struct list_head *)uid_data; + struct uid_data *np; + + list_for_each_entry (np, list, list) { + if (strncmp(np->package, pkg, KSU_MAX_PACKAGE_NAME) == 0) { + pr_info("Crowning manager: %s(uid=%d)\n", pkg, np->uid); + ksu_set_manager_appid(np->uid); + break; + } + } +} + +#define DATA_PATH_LEN 384 // 384 is enough for /data/app//base.apk + +struct data_path { + char dirpath[DATA_PATH_LEN]; + int depth; + struct list_head list; +}; + +struct apk_path_hash { + unsigned int hash; + bool exists; + struct list_head list; +}; + +static struct list_head apk_path_hash_list = LIST_HEAD_INIT(apk_path_hash_list); + +struct my_dir_context { + struct dir_context ctx; + struct list_head *data_path_list; + char *parent_dir; + void *private_data; + int depth; + int *stop; +}; +// https://docs.kernel.org/filesystems/porting.html +// filldir_t (readdir callbacks) calling conventions have changed. Instead of returning 0 or -E... it returns bool now. false means "no more" (as -E... used to) and true - "keep going" (as 0 in old calling conventions). Rationale: callers never looked at specific -E... values anyway. -> iterate_shared() instances require no changes at all, all filldir_t ones in the tree converted. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) +#define FILLDIR_RETURN_TYPE bool +#define FILLDIR_ACTOR_CONTINUE true +#define FILLDIR_ACTOR_STOP false +#else +#define FILLDIR_RETURN_TYPE int +#define FILLDIR_ACTOR_CONTINUE 0 +#define FILLDIR_ACTOR_STOP -EINVAL +#endif +extern bool is_manager_apk(char *path); +FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name, + int namelen, loff_t off, u64 ino, + unsigned int d_type) +{ + struct my_dir_context *my_ctx = + container_of(ctx, struct my_dir_context, ctx); + char dirpath[DATA_PATH_LEN]; + + if (!my_ctx) { + pr_err("Invalid context\n"); + return FILLDIR_ACTOR_STOP; + } + if (my_ctx->stop && *my_ctx->stop) { + pr_info("Stop searching\n"); + return FILLDIR_ACTOR_STOP; + } + + if (!strncmp(name, "..", namelen) || !strncmp(name, ".", namelen)) + return FILLDIR_ACTOR_CONTINUE; // Skip "." and ".." + + if (d_type == DT_DIR && namelen >= 8 && !strncmp(name, "vmdl", 4) && + !strncmp(name + namelen - 4, ".tmp", 4)) { + pr_info("Skipping directory: %.*s\n", namelen, name); + return FILLDIR_ACTOR_CONTINUE; // Skip staging package + } + + if (snprintf(dirpath, DATA_PATH_LEN, "%s/%.*s", my_ctx->parent_dir, namelen, + name) >= DATA_PATH_LEN) { + pr_err("Path too long: %s/%.*s\n", my_ctx->parent_dir, namelen, name); + return FILLDIR_ACTOR_CONTINUE; + } + + if (d_type == DT_DIR && my_ctx->depth > 0 && + (my_ctx->stop && !*my_ctx->stop)) { + struct data_path *data = kzalloc(sizeof(struct data_path), GFP_KERNEL); + + if (!data) { + pr_err("Failed to allocate memory for %s\n", dirpath); + return FILLDIR_ACTOR_CONTINUE; + } + + strscpy(data->dirpath, dirpath, DATA_PATH_LEN); + data->depth = my_ctx->depth - 1; + list_add_tail(&data->list, my_ctx->data_path_list); + } else { + if ((namelen == 8) && (strncmp(name, "base.apk", namelen) == 0)) { + struct apk_path_hash *pos, *n; + unsigned int hash = full_name_hash(NULL, dirpath, strlen(dirpath)); + list_for_each_entry (pos, &apk_path_hash_list, list) { + if (hash == pos->hash) { + pos->exists = true; + return FILLDIR_ACTOR_CONTINUE; + } + } + + bool is_manager = is_manager_apk(dirpath); + pr_info("Found new base.apk at path: %s, is_manager: %d\n", dirpath, + is_manager); + if (is_manager) { + crown_manager(dirpath, my_ctx->private_data); + *my_ctx->stop = 1; + + // Manager found, clear APK cache list + list_for_each_entry_safe (pos, n, &apk_path_hash_list, list) { + list_del(&pos->list); + kfree(pos); + } + } else { + struct apk_path_hash *apk_data = kzalloc(sizeof(struct apk_path_hash), GFP_KERNEL); + apk_data->hash = hash; + apk_data->exists = true; + list_add_tail(&apk_data->list, &apk_path_hash_list); + } + } + } + + return FILLDIR_ACTOR_CONTINUE; +} + +void search_manager(const char *path, int depth, struct list_head *uid_data) +{ + int i, stop = 0; + struct list_head data_path_list; + INIT_LIST_HEAD(&data_path_list); + unsigned long data_app_magic = 0; + + // Initialize APK cache list + struct apk_path_hash *pos, *n; + list_for_each_entry (pos, &apk_path_hash_list, list) { + pos->exists = false; + } + + // First depth + struct data_path data; + strscpy(data.dirpath, path, DATA_PATH_LEN); + data.depth = depth; + list_add_tail(&data.list, &data_path_list); + + for (i = depth; i >= 0; i--) { + struct data_path *pos, *n; + + list_for_each_entry_safe (pos, n, &data_path_list, list) { + struct my_dir_context ctx = { .ctx.actor = my_actor, + .data_path_list = &data_path_list, + .parent_dir = pos->dirpath, + .private_data = uid_data, + .depth = pos->depth, + .stop = &stop }; + struct file *file; + + if (!stop) { + file = filp_open(pos->dirpath, O_RDONLY | O_NOFOLLOW | O_DIRECTORY, 0); + if (IS_ERR(file)) { + pr_err("Failed to open directory: %s, err: %ld\n", + pos->dirpath, PTR_ERR(file)); + goto skip_iterate; + } + + // grab magic on first folder, which is /data/app + if (!data_app_magic) { + if (file->f_inode->i_sb->s_magic) { + data_app_magic = file->f_inode->i_sb->s_magic; + pr_info("%s: dir: %s got magic! 0x%lx\n", __func__, + pos->dirpath, data_app_magic); + } else { + filp_close(file, NULL); + goto skip_iterate; + } + } + + if (file->f_inode->i_sb->s_magic != data_app_magic) { + pr_info("%s: skip: %s magic: 0x%lx expected: 0x%lx\n", + __func__, pos->dirpath, + file->f_inode->i_sb->s_magic, data_app_magic); + filp_close(file, NULL); + goto skip_iterate; + } + + iterate_dir(file, &ctx.ctx); + filp_close(file, NULL); + } + skip_iterate: + list_del(&pos->list); + if (pos != &data) + kfree(pos); + } + } + + // Remove stale cached APK entries + list_for_each_entry_safe (pos, n, &apk_path_hash_list, list) { + if (!pos->exists) { + list_del(&pos->list); + kfree(pos); + } + } +} + +static bool is_uid_exist(uid_t uid, char *package, void *data) +{ + struct list_head *list = (struct list_head *)data; + struct uid_data *np; + + bool exist = false; + list_for_each_entry (np, list, list) { + if (np->uid == uid % PER_USER_RANGE && + strncmp(np->package, package, KSU_MAX_PACKAGE_NAME) == 0) { + exist = true; + break; + } + } + return exist; +} + +static void track_throne_function(bool prune_only) +{ + struct file *fp = NULL; + int t; + long err = -ENOENT; + + // Retry (open; avoids races with pkg. mgr. packages.list update(s); hint: is_lock_held) + for (t = 0; + t < 10 && IS_ERR(fp = filp_open(SYSTEM_PACKAGES_LIST_PATH, O_RDONLY, 0)); + t++) { + err = PTR_ERR(fp); + if (!is_lock_held(SYSTEM_PACKAGES_LIST_PATH) && + err != -EBUSY && err != -EAGAIN && err != -ENOENT) + break; + msleep(100); + } + if (IS_ERR(fp)) { + pr_err("%s: open " SYSTEM_PACKAGES_LIST_PATH " failed: %ld\n", + __func__, err); + return; + } + + struct list_head uid_list; + INIT_LIST_HEAD(&uid_list); + + char chr = 0; + loff_t pos = 0; + loff_t line_start = 0; + char buf[KSU_MAX_PACKAGE_NAME]; + for (;;) { + ssize_t count = kernel_read(fp, &chr, sizeof(chr), &pos); + if (count != sizeof(chr)) + break; + if (chr != '\n') + continue; + + count = kernel_read(fp, buf, sizeof(buf) - 1, &line_start); + if (count <= 0) { + break; + } + buf[count] = '\0'; + + struct uid_data *data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) { + filp_close(fp, 0); + goto out; + } + + char *tmp = buf; + const char *delim = " "; + char *package = strsep(&tmp, delim); + char *uid = strsep(&tmp, delim); + if (!uid || !package) { + kfree(data); + pr_err("update_uid: package or uid is NULL!\n"); + break; + } + + u32 res; + if (kstrtou32(uid, 10, &res)) { + kfree(data); + pr_err("update_uid: uid parse err\n"); + break; + } + data->uid = res; + strncpy(data->package, package, KSU_MAX_PACKAGE_NAME); + list_add_tail(&data->list, &uid_list); + // reset line start + line_start = pos; + } + filp_close(fp, 0); + + // now update uid list + struct uid_data *np; + struct uid_data *n; + + if (prune_only) + goto prune; + + // first, check if manager_uid exist! + bool manager_exist = false; + list_for_each_entry (np, &uid_list, list) { + if (np->uid == ksu_get_manager_appid()) { + manager_exist = true; + break; + } + } + + if (!manager_exist) { + if (ksu_is_manager_appid_valid()) { + pr_info("manager is uninstalled, invalidate it!\n"); + ksu_invalidate_manager_uid(); + goto prune; + } + pr_info("Searching manager...\n"); + search_manager("/data/app", 2, &uid_list); + pr_info("Search manager finished\n"); + } + +prune: + // then prune the allowlist + ksu_prune_allowlist(is_uid_exist, &uid_list); +out: + // free uid_list + list_for_each_entry_safe (np, n, &uid_list, list) { + list_del(&np->list); + kfree(np); + } +} + +#ifdef CONFIG_KSU_THRONE_TRACKER_ALWAYS_THREADED +static struct task_struct *throne_thread; +static int throne_tracker_thread(void *data); + +// Wrapper +void track_throne(bool prune_only) +{ + struct task_struct *t; + + /* + * Single-flight; do nothing if thread running + * race closure via sentinel set: ERR_PTR(-EINPROGRESS) + * + */ + if (cmpxchg(&throne_thread, NULL, + (struct task_struct *)ERR_PTR(-EINPROGRESS)) != NULL) + return; + + t = kthread_run(throne_tracker_thread, + (void *)(unsigned long)prune_only, + "throne_tracker"); + + if (IS_ERR(t)) + WRITE_ONCE(throne_thread, NULL); + else + WRITE_ONCE(throne_thread, t); +} + +// Threaded +static int throne_tracker_thread(void *data) +{ + bool prune_only = (bool)(unsigned long)data; + + pr_info("%s: pid: %d started (prune_only=%d)\n", + __func__, current->pid, prune_only); + + track_throne_function(prune_only); + + // clear slot + WRITE_ONCE(throne_thread, NULL); + + pr_info("%s: pid: %d exit\n", __func__, current->pid); + return 0; +} +#else +void track_throne(bool prune_only) +{ + track_throne_function(prune_only); +} +#endif // CONFIG_KSU_THRONE_TRACKER_ALWAYS_THREADED + +void __init ksu_throne_tracker_init() +{ + // nothing to do +} + +void __exit ksu_throne_tracker_exit() +{ + // nothing to do +} diff --git a/KernelSU-Next/kernel/manager/throne_tracker.h b/KernelSU-Next/kernel/manager/throne_tracker.h new file mode 100644 index 000000000000..616ba87a7fc8 --- /dev/null +++ b/KernelSU-Next/kernel/manager/throne_tracker.h @@ -0,0 +1,70 @@ +#ifndef __KSU_H_UID_OBSERVER +#define __KSU_H_UID_OBSERVER + +#include +#include +#include + +#ifdef CONFIG_KSU_DISABLE_MANAGER +static inline void ksu_throne_tracker_init(void) +{ +} + +static inline void ksu_throne_tracker_exit(void) +{ +} + +static inline void track_throne(bool prune_only) +{ + (void)prune_only; +} +#else +void ksu_throne_tracker_init(void); + +void ksu_throne_tracker_exit(void); + +void track_throne(bool prune_only); + +/* + * small helper to check if lock is held / file stability + * false - file is stable + * true - file is being deleted / renamed | written / replaced + * + */ +static inline bool is_lock_held(const char *path) +{ + struct path kpath; + + // kern_path returns 0 on success + if (kern_path(path, 0, &kpath)) + return true; + + // just being defensive + if (!kpath.dentry) { + path_put(&kpath); + return true; + } + + // Dentry (deleted / renamed) + if (!spin_trylock(&kpath.dentry->d_lock)) { + pr_info("%s: lock held, bail out!\n", __func__); + path_put(&kpath); + return true; + } + + // trylock succeeded; no dentry locked + + spin_unlock(&kpath.dentry->d_lock); + + // Inode (written / replaced) + if (inode_is_locked(kpath.dentry->d_inode)) { + path_put(&kpath); + return true; + } + + path_put(&kpath); + return false; +} +#endif + +#endif diff --git a/KernelSU-Next/kernel/policy/allowlist.c b/KernelSU-Next/kernel/policy/allowlist.c new file mode 100644 index 000000000000..823cb8c8d277 --- /dev/null +++ b/KernelSU-Next/kernel/policy/allowlist.c @@ -0,0 +1,623 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "klog.h" // IWYU pragma: keep +#include "ksu.h" +#include "runtime/ksud_boot.h" +#include "selinux/selinux.h" +#include "policy/allowlist.h" +#include "manager/manager_identity.h" +#include "infra/su_mount_ns.h" + +#define FILE_MAGIC 0x7f4b5355 // ' KSU', u32 +#define FILE_FORMAT_VERSION 3 // u32 + +#define KSU_APP_PROFILE_PRESERVE_UID 9999 // NOBODY_UID +#define KSU_DEFAULT_SELINUX_DOMAIN "u:r:" KERNEL_SU_DOMAIN ":s0" + +static DEFINE_MUTEX(allowlist_mutex); + +// default profiles, these may be used frequently, so we cache it +static struct root_profile default_root_profile; +static struct non_root_profile default_non_root_profile; + +static void __init init_default_profiles() +{ + kernel_cap_t full_cap = CAP_FULL_SET; + + default_root_profile.uid = 0; + default_root_profile.gid = 0; + default_root_profile.groups_count = 1; + default_root_profile.groups[0] = 0; + memcpy(&default_root_profile.capabilities.effective, &full_cap, + sizeof(default_root_profile.capabilities.effective)); + default_root_profile.namespaces = KSU_NS_INHERITED; + strcpy(default_root_profile.selinux_domain, KSU_DEFAULT_SELINUX_DOMAIN); + + // This means that we will umount modules by default! + default_non_root_profile.umount_modules = true; +} + +struct perm_data { + struct hlist_node list; + struct rcu_head rcu; + struct kref ref; + struct app_profile profile; +}; + +// protected by rcu +#define ALLOW_LIST_BITS 8 +static DEFINE_HASHTABLE(allow_list, ALLOW_LIST_BITS); +static u16 allow_list_count = 0; + +#define KERNEL_SU_ALLOWLIST "/data/adb/ksu/.allowlist" + +void ksu_persistent_allow_list(void); + +void ksu_show_allow_list(void) +{ + int i; + struct perm_data *p = NULL; + pr_info("ksu_show_allow_list\n"); + rcu_read_lock(); + hash_for_each_rcu (allow_list, i, p, list) { + pr_info("uid :%d, allow: %d\n", p->profile.curr_uid, p->profile.allow_su); + } + rcu_read_unlock(); +} + +#ifdef CONFIG_KSU_DEBUG +static void ksu_grant_root_to_shell() +{ + struct app_profile profile = { + .version = KSU_APP_PROFILE_VER, + .allow_su = true, + .current_uid = 2000, + }; + strcpy(profile.key, "com.android.shell"); + strcpy(profile.rp_config.profile.selinux_domain, + KSU_DEFAULT_SELINUX_DOMAIN); + ksu_set_app_profile(&profile); +} +#endif + +struct app_profile *ksu_get_app_profile(uid_t uid) +{ + struct perm_data *p = NULL; + bool found; + +retry: + found = false; + hash_for_each_possible_rcu (allow_list, p, list, uid) { + if (uid == p->profile.curr_uid) { + // found it, override it with ours + found = true; + break; + } + } + + if (!found) + return NULL; + + if (!kref_get_unless_zero(&p->ref)) { + goto retry; + } + + return &p->profile; +} + +static inline bool forbid_system_uid(uid_t uid) +{ +#define SHELL_UID 2000 +#define SYSTEM_UID 1000 + return uid < SHELL_UID && uid != SYSTEM_UID; +} + +static bool profile_valid(struct app_profile *profile) +{ + if (!profile) { + return false; + } + + bool need_migrate_su_domain = false; + + if (unlikely(profile->version == 2)) { + profile->version = KSU_APP_PROFILE_VER; + need_migrate_su_domain = true; + } + + if (strnlen(profile->key, sizeof(profile->key)) >= sizeof(profile->key)) { + pr_err("invalid app_profile key\n"); + return false; + } + + if (profile->version < KSU_APP_PROFILE_VER) { + pr_info("Unsupported profile version: %d\n", profile->version); + return false; + } + + if (profile->allow_su) { +#ifndef CONFIG_KSU_DISABLE_POLICY + if (profile->rp_config.profile.groups_count > KSU_MAX_GROUPS) { + pr_err("invalid groups_count in app_profile: %s\n", profile->key); + return false; + } + + char *domain = profile->rp_config.profile.selinux_domain; + static const size_t domain_len = sizeof(profile->rp_config.profile.selinux_domain); + if (unlikely(need_migrate_su_domain)) { + if (strncmp(domain, "u:r:su:s0", domain_len) == 0) { + strscpy_pad(domain, KSU_DEFAULT_SELINUX_DOMAIN, domain_len); + pr_info("migrated profile domain: %s\n", profile->key); + } + } + size_t len = strnlen(domain, domain_len); + + if (len == 0 || len >= domain_len) { + pr_err("invalid selinux_domain in app_profile: %s\n", profile->key); + return false; + } +#endif + } + + return true; +} + + +static void release_perm_data(struct kref *ref) +{ + struct perm_data *p = container_of(ref, struct perm_data, ref); + kfree_rcu(p, rcu); +} + +static void put_perm_data(struct perm_data *data) +{ + kref_put(&data->ref, release_perm_data); +} + +int ksu_set_app_profile(struct app_profile *profile) +{ + struct perm_data *p, *np; + int result = 0; + + if (!profile_valid(profile)) { + pr_err("Failed to set app profile: invalid profile!\n"); + return -EINVAL; + } + +#ifdef CONFIG_KSU_DISABLE_POLICY + if (profile->allow_su) { + profile->rp_config.use_default = true; + memset(profile->rp_config.template_name, 0, sizeof(profile->rp_config.template_name)); + memset(&profile->rp_config.profile, 0, sizeof(profile->rp_config.profile)); + } else { + profile->nrp_config.use_default = true; + memset(&profile->nrp_config.profile, 0, sizeof(profile->nrp_config.profile)); + } +#endif + + + // only allow default non root profile + if (unlikely(profile->curr_uid == KSU_APP_PROFILE_PRESERVE_UID && strcmp(profile->key, "$") != 0)) { + return -EINVAL; + } + + mutex_lock(&allowlist_mutex); + + hash_for_each_possible (allow_list, p, list, profile->curr_uid) { + if (profile->curr_uid == p->profile.curr_uid) { + if (strcmp(profile->key, p->profile.key) != 0) { + pr_warn("ksu_set_app_profile: key changed: uid=%d orig=%s new=%s\n", profile->curr_uid, p->profile.key, + profile->key); + } + // found it, just override it all! + np = (struct perm_data *)kzalloc(sizeof(struct perm_data), + GFP_KERNEL); + if (!np) { + result = -ENOMEM; + goto out_unlock; + } + kref_init(&np->ref); + memcpy(&np->profile, profile, sizeof(*profile)); + hlist_replace_rcu(&p->list, &np->list); + put_perm_data(p); + goto out; + } + } + + if (unlikely(allow_list_count == U16_MAX)) { + pr_err("too many app profile\n"); + result = -E2BIG; + goto out_unlock; + } + + // not found, alloc a new node! + np = (struct perm_data *)kzalloc(sizeof(struct perm_data), GFP_KERNEL); + if (!np) { + pr_err("ksu_set_app_profile alloc failed\n"); + result = -ENOMEM; + goto out_unlock; + } + + kref_init(&np->ref); + memcpy(&np->profile, profile, sizeof(*profile)); + if (profile->allow_su) { + pr_info("set root profile, key: %s, uid: %d, gid: %d, context: %s\n", profile->key, profile->curr_uid, + profile->rp_config.profile.gid, + profile->rp_config.profile.selinux_domain); + } else { + pr_info("set app profile, key: %s, uid: %d, umount modules: %d\n", profile->key, profile->curr_uid, + profile->nrp_config.profile.umount_modules); + } + + hash_add_rcu(allow_list, &np->list, np->profile.curr_uid); + ++allow_list_count; + +out: + result = 0; + + if (unlikely(profile->curr_uid == KSU_APP_PROFILE_PRESERVE_UID)) { + // set default non root profile + default_non_root_profile.umount_modules = profile->nrp_config.profile.umount_modules; + } + +out_unlock: + mutex_unlock(&allowlist_mutex); + return result; +} + +bool __ksu_is_allow_uid(uid_t uid) +{ + struct perm_data *p; + + if (forbid_system_uid(uid)) { + // do not bother going through the list if it's system + return false; + } + + if (unlikely(is_uid_manager(uid))) { + // manager is always allowed! + return true; + } + + rcu_read_lock(); + hash_for_each_possible_rcu (allow_list, p, list, uid) { + if (uid == p->profile.curr_uid && p->profile.allow_su) { + rcu_read_unlock(); + return true; + } + } + rcu_read_unlock(); + + return false; +} + +bool __ksu_is_allow_uid_for_current(uid_t uid) +{ + if (unlikely(uid == 0)) { + // already root, but only allow our domain. + return is_ksu_domain(); + } + return __ksu_is_allow_uid(uid); +} + +bool ksu_uid_should_umount(uid_t uid) +{ + struct app_profile *profile; + bool res; +#ifndef CONFIG_KSU_SUSFS + if (likely(ksu_is_manager_appid_valid()) && unlikely(ksu_get_manager_appid() == uid % PER_USER_RANGE)) { + // we should not umount on manager! + return false; + } + if (unlikely(uid == WEBVIEW_ZYGOTE_UID)) { + // we should not umount for webview zygote + return false; + } +#endif +#ifdef CONFIG_KSU_DISABLE_POLICY + return !__ksu_is_allow_uid(uid); +#else + rcu_read_lock(); + profile = ksu_get_app_profile(uid); + if (!profile) { + // no app profile found, it must be non root app + res = default_non_root_profile.umount_modules; + } else if (profile->allow_su) { + // if found and it is granted to su, we shouldn't umount for it + res = false; + } else { + // found an app profile + if (profile->nrp_config.use_default) { + res = default_non_root_profile.umount_modules; + } else { + res = profile->nrp_config.profile.umount_modules; + } + } + rcu_read_unlock(); + + if (profile) + ksu_put_app_profile(profile); + return res; +#endif +} + +void ksu_put_app_profile(struct app_profile *profile) +{ + struct perm_data *p = container_of(profile, struct perm_data, profile); + put_perm_data(p); +} + +struct root_profile *ksu_get_root_profile(uid_t uid) +{ +#ifdef CONFIG_KSU_DISABLE_POLICY + (void)uid; + return &default_root_profile; +#else + struct perm_data *p = NULL; + struct root_profile *res; + + rcu_read_lock(); + if (is_uid_manager(uid)) { + goto use_default; + } + +retry: + res = NULL; + hash_for_each_possible_rcu (allow_list, p, list, uid) { + if (uid == p->profile.curr_uid && p->profile.allow_su) { + if (!p->profile.rp_config.use_default) { + if (!kref_get_unless_zero(&p->ref)) { + goto retry; + } + res = &p->profile.rp_config.profile; + } + break; + } + } + + if (unlikely(!res)) { + use_default: + res = &default_root_profile; + } + + rcu_read_unlock(); + return res; +#endif +} + +void ksu_put_root_profile(struct root_profile *profile) +{ + if (likely(profile == &default_root_profile)) + return; + struct perm_data *p = container_of(profile, struct perm_data, profile.rp_config.profile); + put_perm_data(p); +} + +bool ksu_get_allow_list(int *array, u16 length, u16 *out_length, u16 *out_total, + bool allow) +{ + struct perm_data *p = NULL; + u16 i = 0, j = 0; + int iter; + rcu_read_lock(); + hash_for_each_rcu (allow_list, iter, p, list) { + // pr_info("get_allow_list uid: %d allow: %d\n", p->uid, p->allow); + if (p->profile.allow_su == allow && !is_uid_manager(p->profile.curr_uid)) { + if (j < length) { + array[j++] = p->profile.curr_uid; + } + ++i; + } + } + rcu_read_unlock(); + if (out_length) { + *out_length = j; + } + if (out_total) { + *out_total = i; + } + + return true; +} + +// TODO: move to kernel thread or work queue +static void do_persistent_allow_list(struct callback_head *_cb) +{ + u32 magic = FILE_MAGIC; + u32 version = FILE_FORMAT_VERSION; + struct perm_data *p = NULL; + loff_t off = 0; + int i; + + const struct cred *saved = override_creds(ksu_cred); + struct file *fp = + filp_open(KERNEL_SU_ALLOWLIST, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (IS_ERR(fp)) { + pr_err("save_allow_list create file failed: %ld\n", PTR_ERR(fp)); + goto out; + } + + // store magic and version + if (kernel_write(fp, &magic, sizeof(magic), &off) != sizeof(magic)) { + pr_err("save_allow_list write magic failed.\n"); + goto close_file; + } + + if (kernel_write(fp, &version, sizeof(version), &off) != sizeof(version)) { + pr_err("save_allow_list write version failed.\n"); + goto close_file; + } + + mutex_lock(&allowlist_mutex); + hash_for_each (allow_list, i, p, list) { + pr_info("save allow list, name: %s uid :%d, allow: %d\n", p->profile.key, p->profile.curr_uid, + p->profile.allow_su); + + kernel_write(fp, &p->profile, sizeof(p->profile), &off); + } + mutex_unlock(&allowlist_mutex); + +close_file: + filp_close(fp, 0); +out: + revert_creds(saved); + kfree(_cb); +} + +void ksu_persistent_allow_list() +{ + struct task_struct *tsk; + + rcu_read_lock(); + tsk = get_pid_task(find_vpid(1), PIDTYPE_PID); + if (!tsk) { + rcu_read_unlock(); + pr_err("save_allow_list find init task err\n"); + return; + } + rcu_read_unlock(); + + struct callback_head *cb = + kzalloc(sizeof(struct callback_head), GFP_KERNEL); + if (!cb) { + pr_err("save_allow_list alloc cb err\b"); + goto put_task; + } + cb->func = do_persistent_allow_list; + if (task_work_add(tsk, cb, TWA_RESUME)) { + kfree(cb); + pr_warn("save_allow_list add task_work failed\n"); + } + +put_task: + put_task_struct(tsk); +} + +void ksu_load_allow_list() +{ +#ifdef CONFIG_KSU_DISABLE_POLICY + pr_info("allowlist load skipped because policy is disabled\n"); + return; +#endif + + loff_t off = 0; + ssize_t ret = 0; + struct file *fp = NULL; + u32 magic; + u32 version; + +#ifdef CONFIG_KSU_DEBUG + // always allow adb shell by default + ksu_grant_root_to_shell(); +#endif + + // load allowlist now! + fp = filp_open(KERNEL_SU_ALLOWLIST, O_RDONLY, 0); + if (IS_ERR(fp)) { + pr_err("load_allow_list open file failed: %ld\n", PTR_ERR(fp)); + return; + } + + // verify magic + if (kernel_read(fp, &magic, sizeof(magic), &off) != sizeof(magic) || + magic != FILE_MAGIC) { + pr_err("allowlist file invalid: %d!\n", magic); + goto exit; + } + + if (kernel_read(fp, &version, sizeof(version), &off) != sizeof(version)) { + pr_err("allowlist read version: %d failed\n", version); + goto exit; + } + + pr_info("allowlist version: %d\n", version); + + while (true) { + struct app_profile profile; + + ret = kernel_read(fp, &profile, sizeof(profile), &off); + + if (ret <= 0) { + pr_info("load_allow_list read err: %zd\n", ret); + break; + } + + pr_info("load_allow_uid, name: %s, uid: %d, allow: %d\n", profile.key, profile.curr_uid, profile.allow_su); + ksu_set_app_profile(&profile); + } + +exit: + ksu_show_allow_list(); + filp_close(fp, 0); +} + +void ksu_prune_allowlist(bool (*is_uid_valid)(uid_t, char *, void *), + void *data) +{ + struct perm_data *np = NULL; + struct hlist_node *tmp; + int i; + + if (!ksu_boot_completed) { + pr_info("boot not completed, skip prune\n"); + return; + } + + bool modified = false; + mutex_lock(&allowlist_mutex); + hash_for_each_safe (allow_list, i, tmp, np, list) { + uid_t uid = np->profile.curr_uid; + char *package = np->profile.key; + // we use this uid for special cases, don't prune it! + bool is_preserved_uid = uid == KSU_APP_PROFILE_PRESERVE_UID; + if (!is_preserved_uid && !is_uid_valid(uid, package, data)) { + modified = true; + pr_info("prune uid: %d, package: %s\n", uid, package); + hlist_del_rcu(&np->list); + put_perm_data(np); + --allow_list_count; + } + } + mutex_unlock(&allowlist_mutex); + + if (modified) { + smp_mb(); + ksu_persistent_allow_list(); + } +} + +void __init ksu_allowlist_init(void) +{ + init_default_profiles(); +} + +void __exit ksu_allowlist_exit(void) +{ + struct perm_data *np = NULL; + struct hlist_node *tmp; + int i; + + // free allowlist + mutex_lock(&allowlist_mutex); + hash_for_each_safe (allow_list, i, tmp, np, list) { + hlist_del(&np->list); + put_perm_data(np); + } + mutex_unlock(&allowlist_mutex); +} diff --git a/KernelSU-Next/kernel/policy/allowlist.h b/KernelSU-Next/kernel/policy/allowlist.h new file mode 100644 index 000000000000..6da37a4e0c5e --- /dev/null +++ b/KernelSU-Next/kernel/policy/allowlist.h @@ -0,0 +1,61 @@ +#ifndef __KSU_H_ALLOWLIST +#define __KSU_H_ALLOWLIST + +#include +#include +#include "uapi/app_profile.h" + +#define PER_USER_RANGE 100000 +#define WEBVIEW_ZYGOTE_UID 1053 +#define FIRST_APPLICATION_UID 10000 +#define LAST_APPLICATION_UID 19999 +#define FIRST_ISOLATED_UID 99000 +#define LAST_ISOLATED_UID 99999 + +void ksu_allowlist_init(void); + +void ksu_allowlist_exit(void); + +void ksu_load_allow_list(void); + +void ksu_show_allow_list(void); + +// Check if the uid is in allow list +bool __ksu_is_allow_uid(uid_t uid); +#define ksu_is_allow_uid(uid) unlikely(__ksu_is_allow_uid(uid)) + +// Check if the uid is in allow list, or current is ksu domain root +bool __ksu_is_allow_uid_for_current(uid_t uid); +#define ksu_is_allow_uid_for_current(uid) \ + unlikely(__ksu_is_allow_uid_for_current(uid)) + +bool ksu_get_allow_list(int *array, u16 length, u16 *out_length, u16 *out_total, + bool allow); + +void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, char *, void *), + void *data); +void ksu_persistent_allow_list(); + +// should be called with rcu read lock +struct app_profile *ksu_get_app_profile(uid_t uid); +// only used to put the app_profile returned by ksu_get_app_profile +void ksu_put_app_profile(struct app_profile *); +int ksu_set_app_profile(struct app_profile *); + +bool ksu_uid_should_umount(uid_t uid); +struct root_profile *ksu_get_root_profile(uid_t uid); +// only used to put the root_profile returned by ksu_get_root_profile +void ksu_put_root_profile(struct root_profile *); + +static inline bool is_appuid(uid_t uid) +{ + uid_t appid = uid % PER_USER_RANGE; + return appid >= FIRST_APPLICATION_UID && appid <= LAST_APPLICATION_UID; +} + +static inline bool is_isolated_process(uid_t uid) +{ + uid_t appid = uid % PER_USER_RANGE; + return appid >= FIRST_ISOLATED_UID && appid <= LAST_ISOLATED_UID; +} +#endif diff --git a/KernelSU-Next/kernel/policy/app_profile.c b/KernelSU-Next/kernel/policy/app_profile.c new file mode 100644 index 000000000000..7d817e8af10d --- /dev/null +++ b/KernelSU-Next/kernel/policy/app_profile.c @@ -0,0 +1,223 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_KSU_SUSFS +#include +#endif + +#include "policy/allowlist.h" +#include "policy/app_profile.h" +#include "klog.h" // IWYU pragma: keep +#include "selinux/selinux.h" +#include "infra/su_mount_ns.h" +#include "hook/tp_marker.h" + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 7, 0) +static struct group_info root_groups = { .usage = REFCOUNT_INIT(2) }; +#else +static struct group_info root_groups = { .usage = ATOMIC_INIT(2) }; +#endif + +void setup_groups(struct root_profile *profile, struct cred *cred) +{ + if (profile->groups_count > KSU_MAX_GROUPS) { + pr_warn("Failed to setgroups, too large group: %d!\n", profile->uid); + return; + } + + if (profile->groups_count == 1 && profile->groups[0] == 0) { + // setgroup to root and return early. + if (cred->group_info) + put_group_info(cred->group_info); + cred->group_info = get_group_info(&root_groups); + return; + } + + u32 ngroups = profile->groups_count; + struct group_info *group_info = groups_alloc(ngroups); + if (!group_info) { + pr_warn("Failed to setgroups, ENOMEM for: %d\n", profile->uid); + return; + } + + int i; + for (i = 0; i < ngroups; i++) { + gid_t gid = profile->groups[i]; + kgid_t kgid = make_kgid(current_user_ns(), gid); + if (!gid_valid(kgid)) { + pr_warn("Failed to setgroups, invalid gid: %d\n", gid); + put_group_info(group_info); + return; + } + group_info->gid[i] = kgid; + } + + groups_sort(group_info); + set_groups(cred, group_info); + put_group_info(group_info); +} + +void seccomp_filter_release(struct task_struct *tsk); + +void disable_seccomp(void) +{ + struct task_struct *fake; + + fake = kmalloc(sizeof(*fake), GFP_KERNEL); + if (!fake) { + pr_warn("failed to alloc fake task_struct\n"); + return; + } + + // Refer to kernel/seccomp.c: seccomp_set_mode_strict + // When disabling Seccomp, ensure that current->sighand->siglock is held during the operation. + spin_lock_irq(¤t->sighand->siglock); + // disable seccomp +#if defined(CONFIG_GENERIC_ENTRY) && \ + LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + clear_syscall_work(SECCOMP); +#else + clear_thread_flag(TIF_SECCOMP); +#endif + + memcpy(fake, current, sizeof(*fake)); + + current->seccomp.mode = 0; + current->seccomp.filter = NULL; + atomic_set(¤t->seccomp.filter_count, 0); + spin_unlock_irq(¤t->sighand->siglock); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 11, 0) + // https://github.com/torvalds/linux/commit/bfafe5efa9754ebc991750da0bcca2a6694f3ed3#diff-45eb79a57536d8eccfc1436932f093eb5c0b60d9361c39edb46581ad313e8987R576-R577 + fake->flags |= PF_EXITING; +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + // https://github.com/torvalds/linux/commit/0d8315dddd2899f519fe1ca3d4d5cdaf44ea421e#diff-45eb79a57536d8eccfc1436932f093eb5c0b60d9361c39edb46581ad313e8987R556-R558 + fake->sighand = NULL; +#endif + + seccomp_filter_release(fake); + kfree(fake); +} + +int escape_with_root_profile(void) +{ + int ret = 0; + struct cred *cred; + struct task_struct *p = current; + struct task_struct *t; + struct root_profile *profile = NULL; + struct user_struct *new_user; + + cred = prepare_creds(); + if (!cred) { + pr_warn("prepare_creds failed!\n"); + return -ENOMEM; + } + +#ifdef CONFIG_KSU_SUSFS + if (susfs_is_current_ksu_domain()) { +#else + if (cred->euid.val == 0) { +#endif + pr_warn("Already root, don't escape!\n"); + goto out_abort_creds; + } + + profile = ksu_get_root_profile(cred->uid.val); + + cred->uid.val = profile->uid; + cred->suid.val = profile->uid; + cred->euid.val = profile->uid; + cred->fsuid.val = profile->uid; + + cred->gid.val = profile->gid; + cred->fsgid.val = profile->gid; + cred->sgid.val = profile->gid; + cred->egid.val = profile->gid; + cred->securebits = 0; + + BUILD_BUG_ON(sizeof(profile->capabilities.effective) != sizeof(kernel_cap_t)); + + /* + * Mirror the kernel set*uid path: update cred->user first, then + * cred->ucounts, before commit_creds(). commit_creds() moves + * RLIMIT_NPROC accounting based on cred->user; if uid changes while + * user/ucounts stay stale, the old charge can remain pinned to the + * previous UID. + * See kernel/sys.c:set_user() and kernel/cred.c:set_cred_ucounts() / + * commit_creds(): + * https://github.com/torvalds/linux/blob/v5.14/kernel/sys.c + * https://github.com/torvalds/linux/blob/v5.14/kernel/cred.c + */ + new_user = alloc_uid(cred->uid); + if (!new_user) { + ret = -ENOMEM; + goto out_abort_creds; + } + + free_uid(cred->user); + cred->user = new_user; + + // v5.14+ added cred->ucounts, so we must refresh it after changing uid/user: + // https://github.com/torvalds/linux/commit/905ae01c4ae2ae3df05bb141801b1db4b7d83c61#diff-ff6060da281bd9ef3f24e17b77a9b0b5b2ed2d7208bb69b29107bee69732bd31 + // on older kernels, per-UID process accounting lives in user_struct. +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0) + if (set_cred_ucounts(cred)) { + goto out_abort_creds; + } +#endif + + // setup capabilities + // we need CAP_DAC_READ_SEARCH becuase `/data/adb/ksud` is not accessible for non root process + // we add it here but don't add it to cap_inhertiable, it would be dropped automaticly after exec! + u64 cap_for_ksud = profile->capabilities.effective | CAP_DAC_READ_SEARCH; + memcpy(&cred->cap_effective, &cap_for_ksud, sizeof(cred->cap_effective)); + memcpy(&cred->cap_permitted, &profile->capabilities.effective, sizeof(cred->cap_permitted)); + memcpy(&cred->cap_bset, &profile->capabilities.effective, sizeof(cred->cap_bset)); + + setup_groups(profile, cred); + setup_selinux(profile->selinux_domain, cred); + + commit_creds(cred); + + if (likely(test_thread_flag(TIF_SECCOMP))) + disable_seccomp(); + +#ifndef CONFIG_KSU_SUSFS + for_each_thread (p, t) { + ksu_set_task_tracepoint_flag(t); + } +#endif + + setup_mount_ns(profile->namespaces); + ksu_put_root_profile(profile); + return 0; + +out_abort_creds: + if (profile) + ksu_put_root_profile(profile); + abort_creds(cred); + return ret; +} + +int escape_to_root_for_init(void) +{ + struct cred *cred = prepare_creds(); + if (!cred) { + pr_err("Failed to prepare init's creds!\n"); + return -EINVAL; + } + + setup_selinux(KERNEL_SU_CONTEXT, cred); + commit_creds(cred); + + return 0; +} diff --git a/KernelSU-Next/kernel/policy/app_profile.h b/KernelSU-Next/kernel/policy/app_profile.h new file mode 100644 index 000000000000..bd89937acc98 --- /dev/null +++ b/KernelSU-Next/kernel/policy/app_profile.h @@ -0,0 +1,9 @@ +#ifndef __KSU_H_APP_PROFILE +#define __KSU_H_APP_PROFILE + +// Escalate current process to root with the appropriate profile +int escape_with_root_profile(void); + +int escape_to_root_for_init(void); + +#endif diff --git a/KernelSU-Next/kernel/policy/feature.c b/KernelSU-Next/kernel/policy/feature.c new file mode 100644 index 000000000000..6c1dc97006f5 --- /dev/null +++ b/KernelSU-Next/kernel/policy/feature.c @@ -0,0 +1,174 @@ +#include "policy/feature.h" +#include "klog.h" // IWYU pragma: keep + +#include + +static const struct ksu_feature_handler *feature_handlers[KSU_FEATURE_MAX]; + +static DEFINE_MUTEX(feature_mutex); + +int __init ksu_register_feature_handler(const struct ksu_feature_handler *handler) +{ + if (!handler) { + pr_err("feature: register handler is NULL\n"); + return -EINVAL; + } + + if (handler->feature_id >= KSU_FEATURE_MAX) { + pr_err("feature: invalid feature_id %u\n", handler->feature_id); + return -EINVAL; + } + + if (!handler->get_handler && !handler->set_handler) { + pr_err("feature: no handler provided for feature %u\n", + handler->feature_id); + return -EINVAL; + } + + mutex_lock(&feature_mutex); + + if (feature_handlers[handler->feature_id]) { + pr_warn("feature: handler for %u already registered, overwriting\n", + handler->feature_id); + } + + feature_handlers[handler->feature_id] = handler; + + pr_info("feature: registered handler for %s (id=%u)\n", + handler->name ? handler->name : "unknown", handler->feature_id); + + mutex_unlock(&feature_mutex); + return 0; +} + +int ksu_unregister_feature_handler(u32 feature_id) +{ + int ret = 0; + + if (feature_id >= KSU_FEATURE_MAX) { + pr_err("feature: invalid feature_id %u\n", feature_id); + return -EINVAL; + } + + mutex_lock(&feature_mutex); + + if (!feature_handlers[feature_id]) { + pr_warn("feature: no handler registered for %u\n", feature_id); + ret = -ENOENT; + goto out; + } + + feature_handlers[feature_id] = NULL; + + pr_info("feature: unregistered handler for id=%u\n", feature_id); + +out: + mutex_unlock(&feature_mutex); + return ret; +} + +int ksu_get_feature(u32 feature_id, u64 *value, bool *supported) +{ + int ret = 0; + const struct ksu_feature_handler *handler; + + if (feature_id >= KSU_FEATURE_MAX) { + pr_err("feature: invalid feature_id %u\n", feature_id); + return -EINVAL; + } + + if (!value || !supported) { + pr_err("feature: invalid parameters\n"); + return -EINVAL; + } + + mutex_lock(&feature_mutex); + + handler = feature_handlers[feature_id]; + + if (!handler) { + *supported = false; + *value = 0; + pr_debug("feature: feature %u not supported\n", feature_id); + goto out; + } + + *supported = true; + + if (!handler->get_handler) { + pr_warn("feature: no get_handler for feature %u\n", feature_id); + ret = -EOPNOTSUPP; + goto out; + } + + ret = handler->get_handler(value); + if (ret) { + pr_err("feature: get_handler for %u failed: %d\n", feature_id, ret); + } + +out: + mutex_unlock(&feature_mutex); + return ret; +} + +int ksu_set_feature(u32 feature_id, u64 value) +{ + int ret = 0; + const struct ksu_feature_handler *handler; + + if (feature_id >= KSU_FEATURE_MAX) { + pr_err("feature: invalid feature_id %u\n", feature_id); + return -EINVAL; + } + + mutex_lock(&feature_mutex); + + handler = feature_handlers[feature_id]; + + if (!handler) { + pr_err("feature: feature %u not registered\n", feature_id); + ret = -EOPNOTSUPP; + goto out; + } + + if (!handler->set_handler) { + pr_warn("feature: no set_handler for feature %u\n", feature_id); + ret = -EOPNOTSUPP; + goto out; + } + + ret = handler->set_handler(value); + if (ret) { + pr_err("feature: set_handler for %u failed: %d\n", feature_id, ret); + } + +out: + mutex_unlock(&feature_mutex); + return ret; +} + +void __init ksu_feature_init(void) +{ + int i; + + for (i = 0; i < KSU_FEATURE_MAX; i++) { + feature_handlers[i] = NULL; + } + + pr_info("feature: feature management initialized\n"); +} + +void __exit ksu_feature_exit(void) +{ + int i; + + mutex_lock(&feature_mutex); + + for (i = 0; i < KSU_FEATURE_MAX; i++) { + feature_handlers[i] = NULL; + } + + mutex_unlock(&feature_mutex); + + pr_info("feature: feature management cleaned up\n"); +} diff --git a/KernelSU-Next/kernel/policy/feature.h b/KernelSU-Next/kernel/policy/feature.h new file mode 100644 index 000000000000..7c3d5cfcc068 --- /dev/null +++ b/KernelSU-Next/kernel/policy/feature.h @@ -0,0 +1,29 @@ +#ifndef __KSU_H_FEATURE +#define __KSU_H_FEATURE + +#include +#include "uapi/feature.h" // IWYU pragma: keep + +typedef int (*ksu_feature_get_t)(u64 *value); +typedef int (*ksu_feature_set_t)(u64 value); + +struct ksu_feature_handler { + u32 feature_id; + const char *name; + ksu_feature_get_t get_handler; + ksu_feature_set_t set_handler; +}; + +int ksu_register_feature_handler(const struct ksu_feature_handler *handler); + +int ksu_unregister_feature_handler(u32 feature_id); + +int ksu_get_feature(u32 feature_id, u64 *value, bool *supported); + +int ksu_set_feature(u32 feature_id, u64 value); + +void ksu_feature_init(void); + +void ksu_feature_exit(void); + +#endif // __KSU_H_FEATURE diff --git a/KernelSU-Next/kernel/runtime/boot_event.c b/KernelSU-Next/kernel/runtime/boot_event.c new file mode 100644 index 000000000000..ce2ef7164d6a --- /dev/null +++ b/KernelSU-Next/kernel/runtime/boot_event.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include + +#include "policy/allowlist.h" +#include "klog.h" // IWYU pragma: keep +#include "runtime/ksud_boot.h" +#include "runtime/ksud.h" +#include "manager/manager_observer.h" +#include "manager/throne_tracker.h" + +#include "linux/jump_label.h" + +bool ksu_module_mounted __read_mostly = false; +bool ksu_boot_completed __read_mostly = false; + +#ifdef CONFIG_KSU_SUSFS +extern struct static_key_true ksu_is_input_hook_enabled; +#endif + +extern void ksu_avc_spoof_late_init(void); + +void on_post_fs_data(void) +{ + static bool done = false; + + if (done) { + pr_info("on_post_fs_data already done\n"); + return; + } + + done = true; + pr_info("on_post_fs_data!\n"); + + ksu_load_allow_list(); + ksu_observer_init(); + // Sanity check for safe mode only needs early-boot input samples. +#ifdef CONFIG_KSU_SUSFS + if (static_key_enabled(&ksu_is_input_hook_enabled)) { + static_branch_disable(&ksu_is_input_hook_enabled); + pr_info("ksu_is_input_hook is disabled\n"); + } +#else + ksu_stop_input_hook_runtime(); +#endif +} + +#ifdef CONFIG_EXT4_FS +extern void ext4_unregister_sysfs(struct super_block *sb); + +int nuke_ext4_sysfs(const char *mnt) +{ + struct path path; + int err = kern_path(mnt, 0, &path); + + if (err) { + pr_err("nuke path err: %d\n", err); + return err; + } + + if (strcmp(path.dentry->d_inode->i_sb->s_type->name, "ext4") != 0) { + pr_info("nuke but module aren't mounted\n"); + path_put(&path); + return -EINVAL; + } + + ext4_unregister_sysfs(path.dentry->d_inode->i_sb); + path_put(&path); + return 0; +} +#else +int nuke_ext4_sysfs(const char *mnt) +{ + return -EOPNOTSUPP; +} +#endif + +void on_module_mounted(void) +{ + pr_info("on_module_mounted!\n"); + ksu_module_mounted = true; +} + +void on_boot_completed(void) +{ + ksu_boot_completed = true; + pr_info("on_boot_completed!\n"); + track_throne(true); + ksu_avc_spoof_late_init(); +} diff --git a/KernelSU-Next/kernel/runtime/ksud.h b/KernelSU-Next/kernel/runtime/ksud.h new file mode 100644 index 000000000000..ad0a2e93ce6f --- /dev/null +++ b/KernelSU-Next/kernel/runtime/ksud.h @@ -0,0 +1,34 @@ +#ifndef __KSU_H_KSUD +#define __KSU_H_KSUD + +#include + +#define KSUD_PATH "/data/adb/ksud" + +void ksu_ksud_init(); +void ksu_ksud_exit(); + +void ksu_handle_sys_read(unsigned int fd); +void ksu_execve_hook_ksud(const struct pt_regs *regs); +void ksu_stop_input_hook_runtime(void); + +#define MAX_ARG_STRINGS 0x7FFFFFFF +struct user_arg_ptr { +#ifdef CONFIG_COMPAT + bool is_compat; +#endif + union { + const char __user *const __user *native; +#ifdef CONFIG_COMPAT + const compat_uptr_t __user *compat; +#endif + } ptr; +}; + +#ifdef CONFIG_KSU_SUSFS +int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr, + struct user_arg_ptr *argv, + struct user_arg_ptr *envp, int *flags); +#endif + +#endif diff --git a/KernelSU-Next/kernel/runtime/ksud_boot.h b/KernelSU-Next/kernel/runtime/ksud_boot.h new file mode 100644 index 000000000000..c12c520aedfb --- /dev/null +++ b/KernelSU-Next/kernel/runtime/ksud_boot.h @@ -0,0 +1,17 @@ +#ifndef __KSU_H_KSUD_BOOT +#define __KSU_H_KSUD_BOOT + +#include + +void on_post_fs_data(void); +void on_module_mounted(void); +void on_boot_completed(void); + +bool ksu_is_safe_mode(void); + +int nuke_ext4_sysfs(const char *mnt); + +extern bool ksu_module_mounted; +extern bool ksu_boot_completed; + +#endif // __KSU_H_KSUD_BOOT diff --git a/KernelSU-Next/kernel/runtime/ksud_integration.c b/KernelSU-Next/kernel/runtime/ksud_integration.c new file mode 100644 index 000000000000..183843905239 --- /dev/null +++ b/KernelSU-Next/kernel/runtime/ksud_integration.c @@ -0,0 +1,618 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arch.h" +#include "klog.h" // IWYU pragma: keep +#include "ksu.h" +#include "runtime/ksud.h" +#include "runtime/ksud_boot.h" +#include "selinux/selinux.h" +#include "hook/syscall_hook.h" +#include "hook/syscall_event_bridge.h" + +#include "linux/jump_label.h" + +#ifdef CONFIG_KSU_SUSFS +DEFINE_STATIC_KEY_TRUE(ksu_is_init_rc_hook_enabled); +DEFINE_STATIC_KEY_TRUE(ksu_is_input_hook_enabled); +#endif + +// clang-format off +static const char KERNEL_SU_RC[] = + "\n" + "on post-fs-data\n" + " start logd\n" + // We should wait for the post-fs-data finish + " exec u:r:" KERNEL_SU_DOMAIN ":s0 root -- " KSUD_PATH " post-fs-data\n" + "\n" + "on nonencrypted\n" + " exec u:r:" KERNEL_SU_DOMAIN ":s0 root -- " KSUD_PATH " services\n" + "\n" + "on property:vold.decrypt=trigger_restart_framework\n" + " exec u:r:" KERNEL_SU_DOMAIN ":s0 root -- " KSUD_PATH " services\n" + "\n" + "on property:sys.boot_completed=1\n" + " exec u:r:" KERNEL_SU_DOMAIN ":s0 root -- " KSUD_PATH " boot-completed\n" + "\n" + "\n"; +// clang-format on + +#ifndef CONFIG_KSU_SUSFS +static void stop_init_rc_hook(); +static void stop_execve_hook(); +#endif + +static struct work_struct stop_input_hook_work; + +static const char __user *get_user_arg_ptr_local(struct user_arg_ptr argv, int nr) +{ + const char __user *native; + +#ifdef CONFIG_COMPAT + if (unlikely(argv.is_compat)) { + compat_uptr_t compat; + + if (get_user(compat, argv.ptr.compat + nr)) + return ERR_PTR(-EFAULT); + + return compat_ptr(compat); + } +#endif + + if (get_user(native, argv.ptr.native + nr)) + return ERR_PTR(-EFAULT); + + return native; +} + +/* + * count() counts the number of strings in array ARGV. + */ + +/* + * Make sure old GCC compiler can use __maybe_unused, + * Test passed in 4.4.x ~ 4.9.x when use GCC. + */ + +static int __maybe_unused count(struct user_arg_ptr argv, int max) +{ + int i = 0; + + if (argv.ptr.native != NULL) { + for (;;) { + const char __user *p = get_user_arg_ptr_local(argv, i); + + if (!p) + break; + + if (IS_ERR(p)) + return -EFAULT; + + if (i >= max) + return -E2BIG; + ++i; + + if (fatal_signal_pending(current)) + return -ERESTARTNOHAND; + } + } + return i; +} + +static bool check_argv(struct user_arg_ptr argv, int index, const char *expected, char *buf, size_t buf_len) +{ + const char __user *p; + int argc; + + argc = count(argv, MAX_ARG_STRINGS); + if (argc <= index) + return false; + + p = get_user_arg_ptr_local(argv, index); + if (!p || IS_ERR(p)) + goto fail; + + #ifdef CONFIG_KSU_SUSFS + if (strncpy_from_user(buf, p, buf_len) <= 0) + goto fail; + #else + if (strncpy_from_user_nofault(buf, p, buf_len) <= 0) + goto fail; + #endif + + buf[buf_len - 1] = '\0'; + + return !strcmp(buf, expected); + +fail: + return false; +} + +#ifdef CONFIG_KSU_SUSFS +extern int ksu_handle_execveat_init(struct filename *filename, struct user_arg_ptr *argv_user, struct user_arg_ptr *envp_user); + +// IMPORTANT NOTE: the call from execve_handler_pre WON'T provided correct value for envp and flags in GKI version +int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr, + struct user_arg_ptr *argv, + struct user_arg_ptr *envp, int *flags) +{ + struct filename *filename; + static const char app_process[] = "/system/bin/app_process"; + static bool first_zygote = true; + + /* This applies to versions Android 10+ */ + static const char system_bin_init[] = "/system/bin/init"; + static bool init_second_stage_executed = false; + + if (!filename_ptr) + return 0; + + filename = *filename_ptr; + if (IS_ERR(filename)) { + return 0; + } + + // https://cs.android.com/android/platform/superproject/+/android-16.0.0_r2:system/core/init/main.cpp;l=77 + if (unlikely(!memcmp(filename->name, system_bin_init, sizeof(system_bin_init) - 1) && argv)) + { + char buf[16]; + if (!init_second_stage_executed && + check_argv(*argv, 1, "second_stage", buf, sizeof(buf))) + { + pr_info("/system/bin/init second_stage executed\n"); + apply_kernelsu_rules(); + cache_sid(); + setup_ksu_cred(); + init_second_stage_executed = true; + } + } + + if (unlikely(first_zygote && !memcmp(filename->name, app_process, sizeof(app_process) - 1) && argv)) + { + char buf[16]; + if (check_argv(*argv, 1, "-Xzygote", buf, sizeof(buf))) { + pr_info("exec zygote, /data prepared, second_stage: %d\n", init_second_stage_executed); + on_post_fs_data(); + first_zygote = false; + } + } + + // - We need to run ksu_handle_execveat_init() at the very end in case the above checks are skipped + (void)ksu_handle_execveat_init(filename, argv, envp); + + return 0; +} +#else +void ksu_handle_execveat_ksud(const char *path, struct user_arg_ptr *argv) +{ + static const char app_process[] = "/system/bin/app_process"; + static bool first_zygote = true; + + /* This applies to versions Android 10+ */ + static const char system_bin_init[] = "/system/bin/init"; + static bool init_second_stage_executed = false; + + // https://cs.android.com/android/platform/superproject/+/android-16.0.0_r2:system/core/init/main.cpp;l=77 + if (unlikely(!memcmp(path, system_bin_init, sizeof(system_bin_init) - 1) && argv)) { + char buf[16]; + if (!init_second_stage_executed && check_argv(*argv, 1, "second_stage", buf, sizeof(buf))) { + pr_info("/system/bin/init second_stage executed\n"); + apply_kernelsu_rules(); + cache_sid(); + setup_ksu_cred(); + init_second_stage_executed = true; + } + } + + if (unlikely(first_zygote && !memcmp(path, app_process, sizeof(app_process) - 1) && argv)) { + char buf[16]; + if (check_argv(*argv, 1, "-Xzygote", buf, sizeof(buf))) { + pr_info("exec zygote, /data prepared, second_stage: %d\n", init_second_stage_executed); + on_post_fs_data(); + first_zygote = false; + ksu_stop_ksud_execve_hook(); + } + } +} +#endif + +static ssize_t (*orig_read)(struct file *, char __user *, size_t, loff_t *); +static ssize_t (*orig_read_iter)(struct kiocb *, struct iov_iter *); +static struct file_operations fops_proxy; +static ssize_t ksu_rc_pos = 0; +const size_t ksu_rc_len = sizeof(KERNEL_SU_RC) - 1; + +// https://cs.android.com/android/platform/superproject/main/+/main:system/core/init/parser.cpp;l=144;drc=61197364367c9e404c7da6900658f1b16c42d0da +// https://cs.android.com/android/platform/superproject/main/+/main:system/libbase/file.cpp;l=241-243;drc=61197364367c9e404c7da6900658f1b16c42d0da +// The system will read init.rc file until EOF, whenever read() returns 0, +// so we begin append ksu rc when we meet EOF. +static ssize_t read_proxy(struct file *file, char __user *buf, size_t count, loff_t *pos) +{ + ssize_t ret = 0; + size_t append_count; + if (ksu_rc_pos && ksu_rc_pos < ksu_rc_len) + goto append_ksu_rc; + + ret = orig_read(file, buf, count, pos); + if (ret != 0 || ksu_rc_pos >= ksu_rc_len) { + return ret; + } else { + pr_info("read_proxy: orig read finished, start append rc\n"); + } +append_ksu_rc: + append_count = ksu_rc_len - ksu_rc_pos; + if (append_count > count - ret) + append_count = count - ret; + // copy_to_user returns the number of not copied + if (copy_to_user(buf + ret, KERNEL_SU_RC + ksu_rc_pos, append_count)) { + pr_info("read_proxy: append error, totally appended %ld\n", ksu_rc_pos); + } else { + pr_info("read_proxy: append %ld\n", append_count); + + ksu_rc_pos += append_count; + if (ksu_rc_pos == ksu_rc_len) { + pr_info("read_proxy: append done\n"); + } + ret += append_count; + } + + return ret; +} + +static ssize_t read_iter_proxy(struct kiocb *iocb, struct iov_iter *to) +{ + ssize_t ret = 0; + size_t append_count; + if (ksu_rc_pos && ksu_rc_pos < ksu_rc_len) + goto append_ksu_rc; + + ret = orig_read_iter(iocb, to); + if (ret != 0 || ksu_rc_pos >= ksu_rc_len) { + return ret; + } else { + pr_info("read_iter_proxy: orig read finished, start append rc\n"); + } +append_ksu_rc: + // copy_to_iter returns the number of copied bytes + append_count = copy_to_iter(KERNEL_SU_RC + ksu_rc_pos, ksu_rc_len - ksu_rc_pos, to); + if (!append_count) { + pr_info("read_iter_proxy: append error, totally appended %ld\n", ksu_rc_pos); + } else { + pr_info("read_iter_proxy: append %ld\n", append_count); + + ksu_rc_pos += append_count; + if (ksu_rc_pos == ksu_rc_len) { + pr_info("read_iter_proxy: append done\n"); + } + ret += append_count; + } + return ret; +} + +static bool is_init_rc(struct file *fp) +{ + if (strcmp(current->comm, "init")) { + // we are only interest in `init` process + return false; + } + + if (!d_is_reg(fp->f_path.dentry)) { + return false; + } + + const char *short_name = fp->f_path.dentry->d_name.name; + if (strcmp(short_name, "init.rc")) { + // we are only interest `init.rc` file name file + return false; + } + char path[256]; + char *dpath = d_path(&fp->f_path, path, sizeof(path)); + + if (IS_ERR(dpath)) { + return false; + } + + if (strcmp(dpath, "/system/etc/init/hw/init.rc")) { + return false; + } + + return true; +} + +static void ksu_install_rc_hook(struct file *file) +{ + if (!is_init_rc(file)) { + return; + } + + // we only process the first read + static bool rc_hooked = false; + if (rc_hooked) { + // we don't need these hooks, unregister it! + + return; + } + rc_hooked = true; +#ifdef CONFIG_KSU_SUSFS + if (static_key_enabled(&ksu_is_init_rc_hook_enabled)) { + static_branch_disable(&ksu_is_init_rc_hook_enabled); + pr_info("ksu_init_rc_hook is disabled\n"); + } +#else + stop_init_rc_hook(); +#endif + + // now we can sure that the init process is reading + // `/system/etc/init/init.rc` + + pr_info("read init.rc, comm: %s, rc_count: %zu\n", current->comm, ksu_rc_len); + + // Now we need to proxy the read and modify the result! + // But, we can not modify the file_operations directly, because it's in read-only memory. + // We just replace the whole file_operations with a proxy one. + memcpy(&fops_proxy, file->f_op, sizeof(struct file_operations)); + orig_read = file->f_op->read; + if (orig_read) { + fops_proxy.read = read_proxy; + } + orig_read_iter = file->f_op->read_iter; + if (orig_read_iter) { + fops_proxy.read_iter = read_iter_proxy; + } + // replace the file_operations + file->f_op = &fops_proxy; +} + +void ksu_handle_sys_read(unsigned int fd) +{ + struct file *file = fget(fd); + if (!file) { + return; + } + ksu_install_rc_hook(file); + fput(file); +} + +#ifdef CONFIG_KSU_SUSFS +void ksu_handle_vfs_fstat(int fd, loff_t *kstat_size_ptr) +{ + loff_t new_size = *kstat_size_ptr + ksu_rc_len; + struct file *file = fget(fd); + + if (!file) + return; + + if (is_init_rc(file)) { + pr_info("stat init.rc"); + pr_info("adding ksu_rc_len: %lld -> %lld", *kstat_size_ptr, new_size); + *kstat_size_ptr = new_size; + } + fput(file); +} +#endif + +static unsigned int volumedown_pressed_count = 0; + +static bool is_volumedown_enough(unsigned int count) +{ + return count >= 3; +} + +int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int *value) +{ +#ifdef CONFIG_KSU_SUSFS + if (!static_branch_unlikely(&ksu_is_input_hook_enabled)) + return 0; +#endif + + if (*type == EV_KEY && *code == KEY_VOLUMEDOWN) { + int val = *value; + pr_info("KEY_VOLUMEDOWN val: %d\n", val); + if (val) { + // key pressed, count it + volumedown_pressed_count += 1; + if (is_volumedown_enough(volumedown_pressed_count)) { +#ifdef CONFIG_KSU_SUSFS + if (static_key_enabled(&ksu_is_input_hook_enabled)) { + static_branch_disable(&ksu_is_input_hook_enabled); + pr_info("ksu_input_hook is disabled\n"); + } +#else + ksu_stop_input_hook_runtime(); +#endif + } + } + } + + return 0; +} + +bool ksu_is_safe_mode() +{ + static bool safe_mode = false; + if (safe_mode) { + // don't need to check again, userspace may call multiple times + return true; + } + + if (ksu_late_loaded) { + return false; + } + + // stop hook first! +#ifdef CONFIG_KSU_SUSFS + if (static_key_enabled(&ksu_is_input_hook_enabled)) { + static_branch_disable(&ksu_is_input_hook_enabled); + pr_info("ksu_input_hook is disabled\n"); + } +#else + ksu_stop_input_hook_runtime(); +#endif + + pr_info("volumedown_pressed_count: %d\n", volumedown_pressed_count); + if (is_volumedown_enough(volumedown_pressed_count)) { + // pressed over 3 times + pr_info("KEY_VOLUMEDOWN pressed max times, safe mode detected!\n"); + safe_mode = true; + return true; + } + + return false; +} + +void ksu_execve_hook_ksud(const struct pt_regs *regs) +{ + const char __user **filename_user = (const char **)&PT_REGS_PARM1(regs); + const char __user *const __user *__argv = (const char __user *const __user *)PT_REGS_PARM2(regs); + struct user_arg_ptr argv = { .ptr.native = __argv }; + char path[32]; + long ret; + unsigned long addr; + const char __user *fn; + + if (!filename_user) + return; + + addr = untagged_addr((unsigned long)*filename_user); + fn = (const char __user *)addr; + + memset(path, 0, sizeof(path)); + ret = strncpy_from_user(path, fn, 32); + if (ret < 0) { + pr_err("Access filename failed for execve_handler_pre\n"); + return; + } + +#ifdef CONFIG_KSU_SUSFS + // Not supported in hook mode for SuSFS +#else + ksu_handle_execveat_ksud(path, &argv); +#endif +} + +#ifndef CONFIG_KSU_SUSFS +static long (*orig_sys_read)(const struct pt_regs *regs); +static long ksu_sys_read(const struct pt_regs *regs) +{ + unsigned int fd = PT_REGS_PARM1(regs); + + ksu_handle_sys_read(fd); + return orig_sys_read(regs); +} + +static long (*orig_sys_fstat)(const struct pt_regs *regs); +static long ksu_sys_fstat(const struct pt_regs *regs) +{ + unsigned int fd = PT_REGS_PARM1(regs); + void __user *statbuf = (void __user *)PT_REGS_PARM2(regs); + bool is_rc = false; + long ret; + + struct file *file = fget(fd); + if (file) { + if (is_init_rc(file)) { + pr_info("stat init.rc"); + is_rc = true; + } + fput(file); + } + + ret = orig_sys_fstat(regs); + + if (is_rc) { + void __user *st_size_ptr = statbuf + offsetof(struct stat, st_size); + long size, new_size; + if (!copy_from_user_nofault(&size, st_size_ptr, sizeof(long))) { + new_size = size + ksu_rc_len; + pr_info("adding ksu_rc_len: %ld -> %ld", size, new_size); + if (!copy_to_user_nofault(st_size_ptr, &new_size, sizeof(long))) { + pr_info("added ksu_rc_len"); + } else { + pr_err("add ksu_rc_len failed: statbuf 0x%lx", (unsigned long)st_size_ptr); + } + } else { + pr_err("read statbuf 0x%lx failed", (unsigned long)st_size_ptr); + } + } + + return ret; +} + +static int input_handle_event_handler_pre(struct kprobe *p, struct pt_regs *regs) +{ + unsigned int *type = (unsigned int *)&PT_REGS_PARM2(regs); + unsigned int *code = (unsigned int *)&PT_REGS_PARM3(regs); + int *value = (int *)&PT_REGS_CCALL_PARM4(regs); + return ksu_handle_input_handle_event(type, code, value); +} + +static struct kprobe input_event_kp = { + .symbol_name = "input_event", + .pre_handler = input_handle_event_handler_pre, +}; + +static void do_stop_input_hook(struct work_struct *work) +{ + unregister_kprobe(&input_event_kp); +} + +static void stop_init_rc_hook() +{ + ksu_syscall_table_unhook(__NR_read); + ksu_syscall_table_unhook(__NR_fstat); + pr_info("unregister init_rc syscall hook\n"); +} + +void ksu_stop_input_hook_runtime(void) +{ + static bool input_hook_stopped = false; + if (input_hook_stopped) { + return; + } + input_hook_stopped = true; + bool ret = schedule_work(&stop_input_hook_work); + pr_info("unregister input kprobe: %d!\n", ret); +} +#endif + +// ksud: module support +void __init ksu_ksud_init() +{ +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + int ret; + + ksu_syscall_table_hook(__NR_read, ksu_sys_read, &orig_sys_read); + ksu_syscall_table_hook(__NR_fstat, ksu_sys_fstat, &orig_sys_fstat); + + ret = register_kprobe(&input_event_kp); + pr_info("ksud: input_event_kp: %d\n", ret); + + INIT_WORK(&stop_input_hook_work, do_stop_input_hook); +#endif +} + +void __exit ksu_ksud_exit() +{ +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + // TODO: + // this should be done before unregister vfs_read_kp + // stop_init_rc_hook(); + unregister_kprobe(&input_event_kp); +#endif +} diff --git a/KernelSU-Next/kernel/selinux/rules.c b/KernelSU-Next/kernel/selinux/rules.c new file mode 100644 index 000000000000..134ded1df4ca --- /dev/null +++ b/KernelSU-Next/kernel/selinux/rules.c @@ -0,0 +1,524 @@ +#include "linux/rcupdate.h" +#include "security.h" +#include +#include +#include +#include +#include +#include + +#include "uapi/selinux.h" +#include "klog.h" // IWYU pragma: keep +#include "selinux.h" +#include "sepolicy.h" +#include "ss/services.h" +#include "linux/lsm_audit.h" // IWYU pragma: keep +#include "xfrm.h" + +#define SELINUX_POLICY_INSTEAD_SELINUX_SS + +#define ALL NULL + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +extern int avc_ss_reset(u32 seqno); +#else +extern int avc_ss_reset(struct selinux_avc *avc, u32 seqno); +#endif +// reset avc cache table, otherwise the new rules will not take effect if already denied +static void reset_avc_cache() +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + avc_ss_reset(0); + selnl_notify_policyload(0); + selinux_status_update_policyload(0); +#else + struct selinux_avc *avc = selinux_state.avc; + avc_ss_reset(avc, 0); + selnl_notify_policyload(0); + selinux_status_update_policyload(&selinux_state, 0); +#endif + selinux_xfrm_notify_policyload(); +} + +void apply_kernelsu_rules() +{ + struct selinux_policy *pol, *old_pol = selinux_state.policy; + struct policydb *db; + + if (!getenforce()) { + pr_info("SELinux permissive or disabled, apply rules!\n"); + } + + mutex_lock(&selinux_state.policy_mutex); + pol = ksu_dup_sepolicy(rcu_dereference_protected( + old_pol, lockdep_is_held(&selinux_state.policy_mutex))); + if (!pol) { + pr_err("failed to dup selinux_policy\n"); + goto out_unlock; + } + + db = &pol->policydb; + + ksu_type(db, KERNEL_SU_DOMAIN, "domain"); + ksu_permissive(db, KERNEL_SU_DOMAIN); + ksu_typeattribute(db, KERNEL_SU_DOMAIN, "mlstrustedsubject"); + ksu_typeattribute(db, KERNEL_SU_DOMAIN, "netdomain"); + ksu_typeattribute(db, KERNEL_SU_DOMAIN, "bluetoothdomain"); + + // Create unconstrained file type + ksu_type(db, KERNEL_SU_FILE, "file_type"); + ksu_typeattribute(db, KERNEL_SU_FILE, "mlstrustedobject"); + ksu_allow(db, "domain", KERNEL_SU_FILE, ALL, ALL); + + // allow all! + ksu_allow(db, KERNEL_SU_DOMAIN, ALL, ALL, ALL); + + // allow us do any ioctl + if (db->policyvers >= POLICYDB_VERSION_XPERMS_IOCTL) { + ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "blk_file", ALL); + ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "fifo_file", ALL); + ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "chr_file", ALL); + ksu_allowxperm(db, KERNEL_SU_DOMAIN, ALL, "file", ALL); + } + + // our ksud triggered by init + ksu_allow(db, "init", KERNEL_SU_DOMAIN, ALL, ALL); + + // copied from Magisk rules + // suRights + ksu_allow(db, "servicemanager", KERNEL_SU_DOMAIN, "dir", "search"); + ksu_allow(db, "servicemanager", KERNEL_SU_DOMAIN, "dir", "read"); + ksu_allow(db, "servicemanager", KERNEL_SU_DOMAIN, "file", "open"); + ksu_allow(db, "servicemanager", KERNEL_SU_DOMAIN, "file", "read"); + ksu_allow(db, "servicemanager", KERNEL_SU_DOMAIN, "process", "getattr"); + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "process", "sigchld"); + + // allowLog + ksu_allow(db, "logd", KERNEL_SU_DOMAIN, "dir", "search"); + ksu_allow(db, "logd", KERNEL_SU_DOMAIN, "file", "read"); + ksu_allow(db, "logd", KERNEL_SU_DOMAIN, "file", "open"); + ksu_allow(db, "logd", KERNEL_SU_DOMAIN, "file", "getattr"); + + // dumpsys, send fd + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "fd", "use"); + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "fifo_file", "write"); + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "fifo_file", "read"); + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "fifo_file", "open"); + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "fifo_file", "getattr"); + + // bootctl + ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "dir", "search"); + ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "file", "read"); + ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "file", "open"); + ksu_allow(db, "hwservicemanager", KERNEL_SU_DOMAIN, "process", "getattr"); + + // Allow all binder transactions + ksu_allow(db, "domain", KERNEL_SU_DOMAIN, "binder", ALL); + + // Allow system server kill su process + ksu_allow(db, "system_server", KERNEL_SU_DOMAIN, "process", "getpgid"); + ksu_allow(db, "system_server", KERNEL_SU_DOMAIN, "process", "sigkill"); + + // throne_tracker kthread; /data | /data/app traversal; apk / packages.list access + ksu_allow(db, "kernel", "kernel", "capability", "dac_read_search"); + ksu_allow(db, "kernel", "system_data_file", "dir", "search"); + ksu_allow(db, "kernel", "packages_list_file", "file", "read"); + ksu_allow(db, "kernel", "packages_list_file", "file", "open"); + ksu_allow(db, "kernel", "apk_data_file", "dir", "read"); + ksu_allow(db, "kernel", "apk_data_file", "dir", "open"); + ksu_allow(db, "kernel", "apk_data_file", "dir", "search"); + ksu_allow(db, "kernel", "apk_data_file", "file", "read"); + ksu_allow(db, "kernel", "apk_data_file", "file", "open"); + + rcu_assign_pointer(selinux_state.policy, pol); + synchronize_rcu(); + ksu_destroy_sepolicy(old_pol); + + reset_avc_cache(); +out_unlock: + mutex_unlock(&selinux_state.policy_mutex); + +#ifdef CONFIG_KSU_SUSFS + susfs_set_priv_app_sid(); + susfs_set_init_sid(); + susfs_set_ksu_sid(); + susfs_set_zygote_sid(); +#endif +} + +#define KSU_SEPOLICY_MAX_BATCH_SIZE (8U * 1024U * 1024U) +#define KSU_SEPOLICY_MAX_ARGS 5 + +struct sepol_data { + u32 cmd; + u32 subcmd; +}; + +struct sepol_batch_cursor { + const u8 *cur; + const u8 *end; +}; + +static size_t sepol_remaining(const struct sepol_batch_cursor *cursor) +{ + return (size_t)(cursor->end - cursor->cur); +} + +static int sepol_read_cmd_header(struct sepol_batch_cursor *cursor, + struct sepol_data *header) +{ + if (sepol_remaining(cursor) < sizeof(*header)) { + return -EINVAL; + } + + memcpy(header, cursor->cur, sizeof(*header)); + cursor->cur += sizeof(*header); + + return 0; +} + +static int sepol_read_string(struct sepol_batch_cursor *cursor, + const char **out) +{ + u32 len; + const char *str; + + if (sepol_remaining(cursor) < sizeof(len)) { + return -EINVAL; + } + + memcpy(&len, cursor->cur, sizeof(len)); + cursor->cur += sizeof(len); + + if (len >= sepol_remaining(cursor)) { + return -EINVAL; + } + + str = (const char *)cursor->cur; + if (memchr(str, '\0', len) != NULL || str[len] != '\0') { + return -EINVAL; + } + + cursor->cur += len + 1; + if (len == 0) { + *out = ALL; + return 0; + } + + *out = str; + return 0; +} + +static int sepol_require_not_all(const char *value, const char *name) +{ + if (value != ALL) { + return 0; + } + + pr_err("sepol: %s cannot be ALL.\n", name); + return -EINVAL; +} + +static int sepol_expected_argc(u32 cmd) +{ + switch (cmd) { + case KSU_SEPOLICY_CMD_NORMAL_PERM: + return 4; + case KSU_SEPOLICY_CMD_XPERM: + return 5; + case KSU_SEPOLICY_CMD_TYPE_STATE: + return 1; + case KSU_SEPOLICY_CMD_TYPE: + case KSU_SEPOLICY_CMD_TYPE_ATTR: + return 2; + case KSU_SEPOLICY_CMD_ATTR: + return 1; + case KSU_SEPOLICY_CMD_TYPE_TRANSITION: + return 5; + case KSU_SEPOLICY_CMD_TYPE_CHANGE: + return 4; + case KSU_SEPOLICY_CMD_GENFSCON: + return 3; + default: + return -EINVAL; + } +} + +static int apply_one_sepolicy_cmd(struct policydb *db, + const struct sepol_data *header, + const char **args) +{ + bool success = false; + int ret; + + switch (header->cmd) { + case KSU_SEPOLICY_CMD_NORMAL_PERM: + if (header->subcmd == KSU_SEPOLICY_SUBCMD_NORMAL_PERM_ALLOW) { + success = ksu_allow(db, args[0], args[1], args[2], args[3]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_NORMAL_PERM_DENY) { + success = ksu_deny(db, args[0], args[1], args[2], args[3]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_NORMAL_PERM_AUDITALLOW) { + success = ksu_auditallow(db, args[0], args[1], args[2], args[3]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_NORMAL_PERM_DONTAUDIT) { + success = ksu_dontaudit(db, args[0], args[1], args[2], args[3]); + } else { + pr_err("sepol: unknown subcmd: %d\n", header->subcmd); + } + return success ? 0 : -EINVAL; + + case KSU_SEPOLICY_CMD_XPERM: + ret = sepol_require_not_all(args[3], "operation"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[4], "perm_set"); + if (ret < 0) { + return ret; + } + + if (header->subcmd == KSU_SEPOLICY_SUBCMD_XPERM_ALLOW) { + success = ksu_allowxperm(db, args[0], args[1], args[2], args[4]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_XPERM_AUDITALLOW) { + success = + ksu_auditallowxperm(db, args[0], args[1], args[2], args[4]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_XPERM_DONTAUDIT) { + success = + ksu_dontauditxperm(db, args[0], args[1], args[2], args[4]); + } else { + pr_err("sepol: unknown subcmd: %d\n", header->subcmd); + } + return success ? 0 : -EINVAL; + + case KSU_SEPOLICY_CMD_TYPE_STATE: + ret = sepol_require_not_all(args[0], "type"); + if (ret < 0) { + return ret; + } + + if (header->subcmd == KSU_SEPOLICY_SUBCMD_TYPE_STATE_PERMISSIVE) { + success = ksu_permissive(db, args[0]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_TYPE_STATE_ENFORCE) { + success = ksu_enforce(db, args[0]); + } else { + pr_err("sepol: unknown subcmd: %d\n", header->subcmd); + } + return success ? 0 : -EINVAL; + + case KSU_SEPOLICY_CMD_TYPE: + case KSU_SEPOLICY_CMD_TYPE_ATTR: + ret = sepol_require_not_all(args[0], "type"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[1], "attribute"); + if (ret < 0) { + return ret; + } + + if (header->cmd == KSU_SEPOLICY_CMD_TYPE) { + success = ksu_type(db, args[0], args[1]); + } else { + success = ksu_typeattribute(db, args[0], args[1]); + } + if (!success) { + pr_err("sepol: %d failed.\n", header->cmd); + return -EINVAL; + } + return 0; + + case KSU_SEPOLICY_CMD_ATTR: + ret = sepol_require_not_all(args[0], "attribute"); + if (ret < 0) { + return ret; + } + + if (!ksu_attribute(db, args[0])) { + pr_err("sepol: %d failed.\n", header->cmd); + return -EINVAL; + } + return 0; + + case KSU_SEPOLICY_CMD_TYPE_TRANSITION: { + const char *object = ALL; + + ret = sepol_require_not_all(args[0], "src"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[1], "tgt"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[2], "cls"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[3], "default_type"); + if (ret < 0) { + return ret; + } + + object = args[4]; + + success = + ksu_type_transition(db, args[0], args[1], args[2], args[3], object); + return success ? 0 : -EINVAL; + } + + case KSU_SEPOLICY_CMD_TYPE_CHANGE: + ret = sepol_require_not_all(args[0], "src"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[1], "tgt"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[2], "cls"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[3], "default_type"); + if (ret < 0) { + return ret; + } + + if (header->subcmd == KSU_SEPOLICY_SUBCMD_TYPE_CHANGE_CHANGE) { + success = ksu_type_change(db, args[0], args[1], args[2], args[3]); + } else if (header->subcmd == KSU_SEPOLICY_SUBCMD_TYPE_CHANGE_MEMBER) { + success = ksu_type_member(db, args[0], args[1], args[2], args[3]); + } else { + pr_err("sepol: unknown subcmd: %d\n", header->subcmd); + } + return success ? 0 : -EINVAL; + + case KSU_SEPOLICY_CMD_GENFSCON: + ret = sepol_require_not_all(args[0], "name"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[1], "path"); + if (ret < 0) { + return ret; + } + ret = sepol_require_not_all(args[2], "context"); + if (ret < 0) { + return ret; + } + + if (!ksu_genfscon(db, args[0], args[1], args[2])) { + pr_err("sepol: %d failed.\n", header->cmd); + return -EINVAL; + } + return 0; + + default: + pr_err("sepol: unknown cmd: %d\n", header->cmd); + return -EINVAL; + } +} + +int handle_sepolicy(void __user *user_data, u64 data_len) +{ + struct selinux_policy *pol, *old_pol; + struct policydb *db; + struct sepol_batch_cursor cursor; + u8 *payload; + int ret; + int success_cmd_count; + u32 cmd_index; + + if (!user_data || !data_len) { + return -EINVAL; + } + + if (data_len > KSU_SEPOLICY_MAX_BATCH_SIZE) { + return -E2BIG; + } + + payload = kvmalloc((size_t)data_len, GFP_KERNEL); + if (!payload) { + return -ENOMEM; + } + + if (copy_from_user(payload, user_data, (size_t)data_len)) { + ret = -EFAULT; + goto out_free; + } + + if (!getenforce()) { + pr_info("SELinux permissive or disabled when handle policy!\n"); + } + + mutex_lock(&selinux_state.policy_mutex); + + old_pol = selinux_state.policy; + pol = ksu_dup_sepolicy(rcu_dereference_protected( + old_pol, lockdep_is_held(&selinux_state.policy_mutex))); + if (!pol) { + ret = -ENOMEM; + goto out_unlock; + } + db = &pol->policydb; + + cursor.cur = payload; + cursor.end = payload + (size_t)data_len; + + ret = 0; + success_cmd_count = 0; + cmd_index = 0; + while (cursor.cur < cursor.end) { + struct sepol_data header; + const char *args[KSU_SEPOLICY_MAX_ARGS] = { 0 }; + int expected_argc; + u32 arg_index; + + ret = sepol_read_cmd_header(&cursor, &header); + if (ret < 0) { + pr_err("sepol: failed to read cmd header #%u.\n", cmd_index); + goto out_drop_new_policy; + } + + expected_argc = sepol_expected_argc(header.cmd); + if (expected_argc < 0 || expected_argc > KSU_SEPOLICY_MAX_ARGS) { + ret = -EINVAL; + pr_err("sepol: invalid cmd header #%u.\n", cmd_index); + goto out_drop_new_policy; + } + + for (arg_index = 0; arg_index < (u32)expected_argc; arg_index++) { + ret = sepol_read_string(&cursor, &args[arg_index]); + if (ret < 0) { + pr_err("sepol: failed to read cmd #%u arg #%u.\n", cmd_index, + arg_index); + goto out_drop_new_policy; + } + } + + ret = apply_one_sepolicy_cmd(db, &header, args); + if (ret < 0) { + pr_err("sepol: cmd #%u failed, cmd=%u subcmd=%u.\n", cmd_index, + header.cmd, header.subcmd); + } else { + success_cmd_count++; + } + cmd_index++; + } + + rcu_assign_pointer(selinux_state.policy, pol); + synchronize_rcu(); + ksu_destroy_sepolicy(old_pol); + + reset_avc_cache(); + ret = success_cmd_count; + goto out_unlock; + +out_drop_new_policy: + ksu_destroy_sepolicy(pol); +out_unlock: + mutex_unlock(&selinux_state.policy_mutex); +out_free: + kvfree(payload); + + return ret; +} diff --git a/KernelSU-Next/kernel/selinux/selinux.c b/KernelSU-Next/kernel/selinux/selinux.c new file mode 100644 index 000000000000..9684ef2fbdaf --- /dev/null +++ b/KernelSU-Next/kernel/selinux/selinux.c @@ -0,0 +1,303 @@ +#include "selinux.h" +#include "linux/cred.h" +#include "linux/sched.h" +#include "objsec.h" +#include "linux/version.h" +#include "klog.h" // IWYU pragma: keep +#include "ksu.h" + +/* + * Cached SID values for frequently checked contexts. + * These are resolved once at init and used for fast u32 comparison + * instead of expensive string operations on every check. + * + * A value of 0 means "no cached SID is available" for that context. + * This covers both the initial "not yet cached" state and any case + * where resolving the SID (e.g. via security_secctx_to_secid) failed. + * In all such cases we intentionally fall back to the slower + * string-based comparison path; this degrades performance only and + * does not cause a functional failure. + */ +static u32 cached_su_sid __read_mostly = 0; +static u32 cached_zygote_sid __read_mostly = 0; +static u32 cached_init_sid __read_mostly = 0; +u32 ksu_file_sid __read_mostly = 0; + +static int transive_to_domain(const char *domain, struct cred *cred) +{ + u32 sid; + int error; +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 18, 0) + struct task_security_struct *tsec; +#else + struct cred_security_struct *tsec; +#endif + tsec = selinux_cred(cred); + if (!tsec) { + pr_err("tsec == NULL!\n"); + return -1; + } + error = security_secctx_to_secid(domain, strlen(domain), &sid); + if (error) { + pr_info("security_secctx_to_secid %s -> sid: %d, error: %d\n", domain, + sid, error); + } + if (!error) { + tsec->sid = sid; + tsec->create_sid = 0; + tsec->keycreate_sid = 0; + tsec->sockcreate_sid = 0; + } + return error; +} + +void setup_selinux(const char *domain, struct cred *cred) +{ + if (transive_to_domain(domain, cred)) { + pr_err("transive domain failed.\n"); + return; + } +} + +void setup_ksu_cred(void) +{ + if (ksu_cred && transive_to_domain(KERNEL_SU_CONTEXT, ksu_cred)) { + pr_err("setup ksu cred failed.\n"); + } +} + +void setenforce(bool enforce) +{ +#ifdef CONFIG_SECURITY_SELINUX_DEVELOP + selinux_state.enforcing = enforce; +#endif +} + +bool getenforce(void) +{ +#ifdef CONFIG_SECURITY_SELINUX_DISABLE + if (selinux_state.disabled) { + return false; + } +#endif + +#ifdef CONFIG_SECURITY_SELINUX_DEVELOP + return selinux_state.enforcing; +#else + return true; +#endif +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 14, 0) +struct lsm_context { + char *context; + u32 len; +}; + +static int __security_secid_to_secctx(u32 secid, struct lsm_context *cp) +{ + return security_secid_to_secctx(secid, &cp->context, &cp->len); +} +static void __security_release_secctx(struct lsm_context *cp) +{ + security_release_secctx(cp->context, cp->len); +} +#else +#define __security_secid_to_secctx security_secid_to_secctx +#define __security_release_secctx security_release_secctx +#endif + +/* + * Initialize cached SID values for frequently checked SELinux contexts. + * Called once after SELinux policy is loaded (post-fs-data). + * This eliminates expensive string comparisons in hot paths. + */ +void cache_sid(void) +{ + int err; + + err = security_secctx_to_secid(KERNEL_SU_CONTEXT, strlen(KERNEL_SU_CONTEXT), + &cached_su_sid); + if (err) { + pr_warn("Failed to cache kernel su domain SID: %d\n", err); + cached_su_sid = 0; + } else { + pr_info("Cached su SID: %u\n", cached_su_sid); + } + + err = security_secctx_to_secid(ZYGOTE_CONTEXT, strlen(ZYGOTE_CONTEXT), + &cached_zygote_sid); + if (err) { + pr_warn("Failed to cache zygote SID: %d\n", err); + cached_zygote_sid = 0; + } else { + pr_info("Cached zygote SID: %u\n", cached_zygote_sid); + } + + err = security_secctx_to_secid(INIT_CONTEXT, strlen(INIT_CONTEXT), + &cached_init_sid); + if (err) { + pr_warn("Failed to cache init SID: %d\n", err); + cached_init_sid = 0; + } else { + pr_info("Cached init SID: %u\n", cached_init_sid); + } + + err = security_secctx_to_secid(KSU_FILE_CONTEXT, strlen(KSU_FILE_CONTEXT), + &ksu_file_sid); + if (err) { + pr_warn("Failed to cache ksu_file SID: %d\n", err); + ksu_file_sid = 0; + } else { + pr_info("Cached ksu_file SID: %u\n", ksu_file_sid); + } +} + +/* + * Fast path: compare task's SID directly against cached value. + * Falls back to string comparison if cache is not initialized. + */ +static bool is_sid_match(const struct cred *cred, u32 cached_sid, + const char *fallback_context) +{ + if (!cred) { + return false; + } +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 18, 0) + const struct task_security_struct *tsec = selinux_cred(cred); +#else + const struct cred_security_struct *tsec = selinux_cred(cred); +#endif + if (!tsec) { + return false; + } + + // Fast path: use cached SID if available + if (likely(cached_sid != 0)) { + return tsec->sid == cached_sid; + } + + // Slow path fallback: string comparison (only before cache is initialized) + struct lsm_context ctx; + bool result; + if (__security_secid_to_secctx(tsec->sid, &ctx)) { + return false; + } + result = strncmp(fallback_context, ctx.context, ctx.len) == 0; + __security_release_secctx(&ctx); + return result; +} + +bool is_task_ksu_domain(const struct cred *cred) +{ + return is_sid_match(cred, cached_su_sid, KERNEL_SU_CONTEXT); +} + +bool is_ksu_domain(void) +{ + return is_task_ksu_domain(current_cred()); +} + +bool is_zygote(const struct cred *cred) +{ + return is_sid_match(cred, cached_zygote_sid, ZYGOTE_CONTEXT); +} + +bool is_init(const struct cred *cred) +{ + return is_sid_match(cred, cached_init_sid, INIT_CONTEXT); +} + +#ifdef CONFIG_KSU_SUSFS +#define KERNEL_PRIV_APP_DOMAIN "u:r:priv_app:s0:c512,c768" + +u32 susfs_ksu_sid = 0; +u32 susfs_init_sid = 0; +u32 susfs_zygote_sid = 0; +u32 susfs_priv_app_sid = 0; + +static inline void susfs_set_sid(const char *secctx_name, u32 *out_sid) +{ + int err; + + if (!secctx_name || !out_sid) { + pr_err("secctx_name || out_sid is NULL\n"); + return; + } + + err = security_secctx_to_secid(secctx_name, strlen(secctx_name), + out_sid); + if (err) { + pr_err("failed setting sid for '%s', err: %d\n", secctx_name, err); + return; + } + pr_info("sid '%u' is set for secctx_name '%s'\n", *out_sid, secctx_name); +} + +bool susfs_is_sid_equal(const struct cred *cred, u32 sid2) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 18, 0) + const struct task_security_struct *tsec = selinux_cred(cred); +#else + const struct cred_security_struct *tsec = selinux_cred(cred); +#endif + + if (!tsec) { + return false; + } + return tsec->sid == sid2; +} + +u32 susfs_get_sid_from_name(const char *secctx_name) +{ + u32 out_sid = 0; + int err; + + if (!secctx_name) { + pr_err("secctx_name is NULL\n"); + return 0; + } + err = security_secctx_to_secid(secctx_name, strlen(secctx_name), + &out_sid); + if (err) { + pr_err("failed getting sid from secctx_name: %s, err: %d\n", secctx_name, err); + return 0; + } + return out_sid; +} + +u32 susfs_get_current_sid(void) { + return current_sid(); +} + +void susfs_set_zygote_sid(void) +{ + susfs_set_sid(ZYGOTE_CONTEXT, &susfs_zygote_sid); +} + +bool susfs_is_current_zygote_domain(void) { + return unlikely(current_sid() == susfs_zygote_sid); +} + +void susfs_set_ksu_sid(void) +{ + susfs_set_sid(KERNEL_SU_CONTEXT, &susfs_ksu_sid); +} + +bool susfs_is_current_ksu_domain(void) { + return unlikely(current_sid() == susfs_ksu_sid); +} + +void susfs_set_init_sid(void) +{ + susfs_set_sid(INIT_CONTEXT, &susfs_init_sid); +} + +bool susfs_is_current_init_domain(void) { + return unlikely(current_sid() == susfs_init_sid); +} + +void susfs_set_priv_app_sid(void) +{ + susfs_set_sid(KERNEL_PRIV_APP_DOMAIN, &susfs_priv_app_sid); +} +#endif diff --git a/KernelSU-Next/kernel/selinux/selinux.h b/KernelSU-Next/kernel/selinux/selinux.h new file mode 100644 index 000000000000..be0f237f21ce --- /dev/null +++ b/KernelSU-Next/kernel/selinux/selinux.h @@ -0,0 +1,53 @@ +#ifndef __KSU_H_SELINUX +#define __KSU_H_SELINUX + +#include +#include +#include + +#define KERNEL_SU_DOMAIN "ksu" +#define KERNEL_SU_FILE "ksu_file" + +#define KERNEL_SU_CONTEXT "u:r:" KERNEL_SU_DOMAIN ":s0" +#define KSU_FILE_CONTEXT "u:object_r:" KERNEL_SU_FILE ":s0" +#define ZYGOTE_CONTEXT "u:r:zygote:s0" +#define INIT_CONTEXT "u:r:init:s0" + +void setup_selinux(const char *, struct cred *); + +void setenforce(bool); + +bool getenforce(); + +void cache_sid(void); + +bool is_task_ksu_domain(const struct cred *cred); + +bool is_ksu_domain(); + +bool is_zygote(const struct cred *cred); + +bool is_init(const struct cred *cred); + +void apply_kernelsu_rules(); + +int handle_sepolicy(void __user *user_data, u64 data_len); + +void setup_ksu_cred(); + +extern u32 ksu_file_sid; + +#ifdef CONFIG_KSU_SUSFS +bool susfs_is_sid_equal(const struct cred *cred, u32 sid2); +u32 susfs_get_sid_from_name(const char *secctx_name); +u32 susfs_get_current_sid(void); +void susfs_set_zygote_sid(void); +bool susfs_is_current_zygote_domain(void); +void susfs_set_ksu_sid(void); +bool susfs_is_current_ksu_domain(void); +void susfs_set_init_sid(void); +bool susfs_is_current_init_domain(void); +void susfs_set_priv_app_sid(void); +#endif + +#endif diff --git a/KernelSU-Next/kernel/selinux/sepolicy.c b/KernelSU-Next/kernel/selinux/sepolicy.c new file mode 100644 index 000000000000..231983fc0611 --- /dev/null +++ b/KernelSU-Next/kernel/selinux/sepolicy.c @@ -0,0 +1,1381 @@ +#include "ss/avtab.h" +#include "ss/constraint.h" +#include "ss/ebitmap.h" +#include "ss/hashtab.h" +#include "ss/policydb.h" +#include "ss/services.h" +#include +#include +#include +#include + +#include "sepolicy.h" +#include "klog.h" // IWYU pragma: keep +#include "ss/symtab.h" + +#define KSU_SUPPORT_ADD_TYPE + +////////////////////////////////////////////////////// +// Declaration +////////////////////////////////////////////////////// + +static struct avtab_node *get_avtab_node(struct policydb *db, + struct avtab_key *key, + struct avtab_extended_perms *xperms); + +static bool is_redundant_avtab_node(struct avtab_node *node); + +static bool remove_avtab_node(struct policydb *db, struct avtab_node *node); + +static bool add_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *p, int effect, bool invert); + +static bool add_rule_raw(struct policydb *db, struct type_datum *src, struct type_datum *tgt, struct class_datum *cls, + struct perm_datum *perm, int effect, bool invert); + +static void add_xperm_rule_raw(struct policydb *db, struct type_datum *src, + struct type_datum *tgt, struct class_datum *cls, + uint16_t low, uint16_t high, int effect, + bool invert); +static bool add_xperm_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *range, int effect, + bool invert); + +static bool add_type_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *d, int effect); + +static bool add_filename_trans(struct policydb *db, const char *s, + const char *t, const char *c, const char *d, + const char *o); + +static bool add_genfscon(struct policydb *db, const char *fs_name, + const char *path, const char *context); + +static bool add_type(struct policydb *db, const char *type_name, bool attr); + +static bool set_type_state(struct policydb *db, const char *type_name, + bool permissive); + +static void add_typeattribute_raw(struct policydb *db, struct type_datum *type, + struct type_datum *attr); + +static bool add_typeattribute(struct policydb *db, const char *type, + const char *attr); + +////////////////////////////////////////////////////// +// Implementation +////////////////////////////////////////////////////// + +// Invert is adding rules for auditdeny; in other cases, invert is removing +// rules +#define strip_av(effect, invert) ((effect == AVTAB_AUDITDENY) == !invert) + +#define ksu_hash_for_each(node_ptr, n_slot, cur) \ + int i; \ + for (i = 0; i < n_slot; ++i) \ + for (cur = node_ptr[i]; cur; cur = cur->next) + +// htable is a struct instead of pointer above 5.8.0: +// https://elixir.bootlin.com/linux/v5.8-rc1/source/security/selinux/ss/symtab.h +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) +#define ksu_hashtab_for_each(htab, cur) \ + ksu_hash_for_each(htab.htable, htab.size, cur) +#else +#define ksu_hashtab_for_each(htab, cur) \ + ksu_hash_for_each(htab->htable, htab->size, cur) +#endif + +// symtab_search is introduced on 5.9.0: +// https://elixir.bootlin.com/linux/v5.9-rc1/source/security/selinux/ss/symtab.h +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0) +#define symtab_search(s, name) hashtab_search((s)->table, name) +#define symtab_insert(s, name, datum) hashtab_insert((s)->table, name, datum) +#endif + +#define avtab_for_each(avtab, cur) \ + ksu_hash_for_each(avtab.htable, avtab.nslot, cur); + +static struct avtab_node *get_avtab_node(struct policydb *db, + struct avtab_key *key, + struct avtab_extended_perms *xperms) +{ + struct avtab_node *node; + + /* AVTAB_XPERMS entries are not necessarily unique */ + if (key->specified & AVTAB_XPERMS) { + bool match = false; + node = avtab_search_node(&db->te_avtab, key); + while (node) { + if ((node->datum.u.xperms->specified == xperms->specified) && + (node->datum.u.xperms->driver == xperms->driver)) { + match = true; + break; + } + node = avtab_search_node_next(node, key->specified); + } + if (!match) + node = NULL; + } else { + node = avtab_search_node(&db->te_avtab, key); + } + + if (!node) { + struct avtab_datum avdatum = {}; + /* + * AUDITDENY, aka DONTAUDIT, are &= assigned, versus |= for + * others. Initialize the data accordingly. + */ + if (key->specified & AVTAB_XPERMS) { + avdatum.u.xperms = xperms; + } else { + avdatum.u.data = key->specified == AVTAB_AUDITDENY ? ~0U : 0U; + } + /* this is used to get the node - insertion is actually unique */ + node = avtab_insert_nonunique(&db->te_avtab, key, &avdatum); + if (!node) + return NULL; + + int grow_size = sizeof(struct avtab_key); + grow_size += sizeof(struct avtab_datum); + if (key->specified & AVTAB_XPERMS) { + grow_size += sizeof(u8); + grow_size += sizeof(u8); + grow_size += sizeof(u32) * ARRAY_SIZE(avdatum.u.xperms->perms.p); + } + db->len += grow_size; + } + + return node; +} + +static bool is_redundant_avtab_node(struct avtab_node *node) +{ + if (node->key.specified & AVTAB_XPERMS) + return node->datum.u.xperms == NULL; + if (!(node->key.specified & AVTAB_AV)) + return false; + if (node->key.specified & AVTAB_AUDITDENY) + return node->datum.u.data == ~0U; + return node->datum.u.data == 0U; +} + +static bool remove_avtab_node(struct policydb *db, struct avtab_node *node) +{ + int i; + int ret; + int shrink_size = sizeof(struct avtab_key) + sizeof(struct avtab_datum); + struct avtab removed = {}; + struct avtab_node *n; + struct avtab_node *prev; + + ret = avtab_alloc(&removed, 1); + if (ret < 0) + return false; + + for (i = 0; i < db->te_avtab.nslot; i++) { + prev = NULL; + for (n = db->te_avtab.htable[i]; n; prev = n, n = n->next) { + if (n != node) + continue; + + if (prev) + prev->next = n->next; + else + db->te_avtab.htable[i] = n->next; + + if (db->te_avtab.nel > 0) + db->te_avtab.nel--; + + if ((n->key.specified & AVTAB_XPERMS) && n->datum.u.xperms) { + shrink_size += sizeof(u8) + sizeof(u8) + sizeof(u32) * ARRAY_SIZE(n->datum.u.xperms->perms.p); + } + n->next = NULL; + removed.htable[0] = n; + removed.nel = 1; + avtab_destroy(&removed); + if (db->len >= shrink_size) + db->len -= shrink_size; + return true; + } + } + + avtab_destroy(&removed); + return false; +} + +static bool add_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *p, int effect, bool invert) +{ + struct type_datum *src = NULL, *tgt = NULL; + struct class_datum *cls = NULL; + struct perm_datum *perm = NULL; + + if (s) { + src = symtab_search(&db->p_types, s); + if (src == NULL) { + pr_info("source type %s does not exist\n", s); + return false; + } + } + + if (t) { + tgt = symtab_search(&db->p_types, t); + if (tgt == NULL) { + pr_info("target type %s does not exist\n", t); + return false; + } + } + + if (c) { + cls = symtab_search(&db->p_classes, c); + if (cls == NULL) { + pr_info("class %s does not exist\n", c); + return false; + } + } + + if (p) { + if (c == NULL) { + pr_info("No class is specified, cannot add perm [%s] \n", p); + return false; + } + + perm = symtab_search(&cls->permissions, p); + if (perm == NULL && cls->comdatum != NULL) { + perm = symtab_search(&cls->comdatum->permissions, p); + } + if (perm == NULL) { + pr_info("perm %s does not exist in class %s\n", p, c); + return false; + } + } + return add_rule_raw(db, src, tgt, cls, perm, effect, invert); +} + +static bool add_rule_raw(struct policydb *db, struct type_datum *src, struct type_datum *tgt, struct class_datum *cls, + struct perm_datum *perm, int effect, bool invert) +{ + bool success = true; + + if (src == NULL) { + struct hashtab_node *node; + if (strip_av(effect, invert)) { + ksu_hashtab_for_each(db->p_types.table, node) + { + success &= add_rule_raw(db, (struct type_datum *)node->datum, tgt, cls, perm, effect, invert); + }; + } else { + ksu_hashtab_for_each(db->p_types.table, node) + { + struct type_datum *type = (struct type_datum *)(node->datum); + if (type->attribute) { + success &= add_rule_raw(db, type, tgt, cls, perm, effect, invert); + } + }; + } + } else if (tgt == NULL) { + struct hashtab_node *node; + if (strip_av(effect, invert)) { + ksu_hashtab_for_each(db->p_types.table, node) + { + success &= add_rule_raw(db, src, (struct type_datum *)node->datum, cls, perm, effect, invert); + }; + } else { + ksu_hashtab_for_each(db->p_types.table, node) + { + struct type_datum *type = (struct type_datum *)(node->datum); + if (type->attribute) { + success &= add_rule_raw(db, src, type, cls, perm, effect, invert); + } + }; + } + } else if (cls == NULL) { + struct hashtab_node *node; + ksu_hashtab_for_each(db->p_classes.table, node) + { + success &= add_rule_raw(db, src, tgt, (struct class_datum *)node->datum, perm, effect, invert); + } + } else { + struct avtab_key key; + struct avtab_node *node; + + key.source_type = src->value; + key.target_type = tgt->value; + key.target_class = cls->value; + key.specified = effect; + + if (invert && effect != AVTAB_AUDITDENY) { + node = avtab_search_node(&db->te_avtab, &key); + if (!node) + return true; + } else { + node = get_avtab_node(db, &key, NULL); + if (!node) + return false; + } + + if (invert) { + if (perm) + node->datum.u.data &= ~(1U << (perm->value - 1)); + else + node->datum.u.data = 0U; + } else { + if (perm) + node->datum.u.data |= 1U << (perm->value - 1); + else + node->datum.u.data = ~0U; + } + if (is_redundant_avtab_node(node)) + return remove_avtab_node(db, node); + } + + return success; +} + +#define ioctl_driver(x) (x >> 8 & 0xFF) +#define ioctl_func(x) (x & 0xFF) + +#define xperm_test(x, p) (1 & (p[x >> 5] >> (x & 0x1f))) +#define xperm_set(x, p) (p[x >> 5] |= (1 << (x & 0x1f))) +#define xperm_clear(x, p) (p[x >> 5] &= ~(1 << (x & 0x1f))) + +static void add_xperm_rule_raw(struct policydb *db, struct type_datum *src, + struct type_datum *tgt, struct class_datum *cls, + uint16_t low, uint16_t high, int effect, + bool invert) +{ + if (src == NULL) { + struct hashtab_node *node; + ksu_hashtab_for_each(db->p_types.table, node) + { + struct type_datum *type = (struct type_datum *)(node->datum); + if (type->attribute) { + add_xperm_rule_raw(db, type, tgt, cls, low, high, effect, + invert); + } + }; + } else if (tgt == NULL) { + struct hashtab_node *node; + ksu_hashtab_for_each(db->p_types.table, node) + { + struct type_datum *type = (struct type_datum *)(node->datum); + if (type->attribute) { + add_xperm_rule_raw(db, src, type, cls, low, high, effect, + invert); + } + }; + } else if (cls == NULL) { + struct hashtab_node *node; + ksu_hashtab_for_each(db->p_classes.table, node) + { + add_xperm_rule_raw(db, src, tgt, + (struct class_datum *)(node->datum), low, high, + effect, invert); + }; + } else { + struct avtab_key key; + key.source_type = src->value; + key.target_type = tgt->value; + key.target_class = cls->value; + key.specified = effect; + + struct avtab_datum *datum; + struct avtab_node *node; + struct avtab_extended_perms xperms; + + memset(&xperms, 0, sizeof(xperms)); + if (ioctl_driver(low) != ioctl_driver(high)) { + xperms.specified = AVTAB_XPERMS_IOCTLDRIVER; + xperms.driver = 0; + } else { + xperms.specified = AVTAB_XPERMS_IOCTLFUNCTION; + xperms.driver = ioctl_driver(low); + } + int i; + if (xperms.specified == AVTAB_XPERMS_IOCTLDRIVER) { + for (i = ioctl_driver(low); i <= ioctl_driver(high); ++i) { + if (invert) + xperm_clear(i, xperms.perms.p); + else + xperm_set(i, xperms.perms.p); + } + } else { + for (i = ioctl_func(low); i <= ioctl_func(high); ++i) { + if (invert) + xperm_clear(i, xperms.perms.p); + else + xperm_set(i, xperms.perms.p); + } + } + + node = get_avtab_node(db, &key, &xperms); + if (!node) { + pr_warn("add_xperm_rule_raw cannot found node!\n"); + return; + } + datum = &node->datum; + + if (datum->u.xperms == NULL) { + datum->u.xperms = (struct avtab_extended_perms *)(kzalloc( + sizeof(xperms), GFP_KERNEL)); + if (!datum->u.xperms) { + pr_err("alloc xperms failed\n"); + return; + } + memcpy(datum->u.xperms, &xperms, sizeof(xperms)); + } + } +} + +static bool add_xperm_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *range, int effect, + bool invert) +{ + struct type_datum *src = NULL, *tgt = NULL; + struct class_datum *cls = NULL; + + if (s) { + src = symtab_search(&db->p_types, s); + if (src == NULL) { + pr_info("source type %s does not exist\n", s); + return false; + } + } + + if (t) { + tgt = symtab_search(&db->p_types, t); + if (tgt == NULL) { + pr_info("target type %s does not exist\n", t); + return false; + } + } + + if (c) { + cls = symtab_search(&db->p_classes, c); + if (cls == NULL) { + pr_info("class %s does not exist\n", c); + return false; + } + } + + u16 low, high; + + if (range) { + if (strchr(range, '-')) { + sscanf(range, "%hx-%hx", &low, &high); + } else { + sscanf(range, "%hx", &low); + high = low; + } + } else { + low = 0; + high = 0xFFFF; + } + + add_xperm_rule_raw(db, src, tgt, cls, low, high, effect, invert); + return true; +} + +static bool add_type_rule(struct policydb *db, const char *s, const char *t, + const char *c, const char *d, int effect) +{ + struct type_datum *src, *tgt, *def; + struct class_datum *cls; + + src = symtab_search(&db->p_types, s); + if (src == NULL) { + pr_info("source type %s does not exist\n", s); + return false; + } + tgt = symtab_search(&db->p_types, t); + if (tgt == NULL) { + pr_info("target type %s does not exist\n", t); + return false; + } + cls = symtab_search(&db->p_classes, c); + if (cls == NULL) { + pr_info("class %s does not exist\n", c); + return false; + } + def = symtab_search(&db->p_types, d); + if (def == NULL) { + pr_info("default type %s does not exist\n", d); + return false; + } + + struct avtab_key key; + key.source_type = src->value; + key.target_type = tgt->value; + key.target_class = cls->value; + key.specified = effect; + + struct avtab_node *node = get_avtab_node(db, &key, NULL); + if (!node) + return false; + node->datum.u.data = def->value; + + return true; +} + +// 5.9.0 : static inline int hashtab_insert(struct hashtab *h, void *key, void +// *datum, struct hashtab_key_params key_params) 5.8.0: int +// hashtab_insert(struct hashtab *h, void *k, void *d); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0) +static u32 filenametr_hash(const void *k) +{ + const struct filename_trans_key *ft = k; + unsigned long hash; + unsigned int byte_num; + unsigned char focus; + + hash = ft->ttype ^ ft->tclass; + + byte_num = 0; + while ((focus = ft->name[byte_num++])) + hash = partial_name_hash(focus, hash); + return hash; +} + +static int filenametr_cmp(const void *k1, const void *k2) +{ + const struct filename_trans_key *ft1 = k1; + const struct filename_trans_key *ft2 = k2; + int v; + + v = ft1->ttype - ft2->ttype; + if (v) + return v; + + v = ft1->tclass - ft2->tclass; + if (v) + return v; + + return strcmp(ft1->name, ft2->name); +} + +static const struct hashtab_key_params filenametr_key_params = { + .hash = filenametr_hash, + .cmp = filenametr_cmp, +}; +#endif + +static bool add_filename_trans(struct policydb *db, const char *s, + const char *t, const char *c, const char *d, + const char *o) +{ + struct type_datum *src, *tgt, *def; + struct class_datum *cls; + + src = symtab_search(&db->p_types, s); + if (src == NULL) { + pr_warn("source type %s does not exist\n", s); + return false; + } + tgt = symtab_search(&db->p_types, t); + if (tgt == NULL) { + pr_warn("target type %s does not exist\n", t); + return false; + } + cls = symtab_search(&db->p_classes, c); + if (cls == NULL) { + pr_warn("class %s does not exist\n", c); + return false; + } + def = symtab_search(&db->p_types, d); + if (def == NULL) { + pr_warn("default type %s does not exist\n", d); + return false; + } + + struct filename_trans_key key; + key.ttype = tgt->value; + key.tclass = cls->value; + key.name = (char *)o; + + struct filename_trans_datum *last = NULL; + + struct filename_trans_datum *trans = policydb_filenametr_search(db, &key); + while (trans) { + if (ebitmap_get_bit(&trans->stypes, src->value - 1)) { + // Duplicate, overwrite existing data and return + trans->otype = def->value; + return true; + } + if (trans->otype == def->value) + break; + last = trans; + trans = trans->next; + } + + if (trans == NULL) { + trans = (struct filename_trans_datum *)kcalloc(1, sizeof(*trans), + GFP_KERNEL); + struct filename_trans_key *new_key = + (struct filename_trans_key *)kzalloc(sizeof(*new_key), GFP_KERNEL); + *new_key = key; + new_key->name = kstrdup(key.name, GFP_KERNEL); + trans->next = last; + trans->otype = def->value; + hashtab_insert(&db->filename_trans, new_key, trans, + filenametr_key_params); + } + + db->compat_filename_trans_count++; + return ebitmap_set_bit(&trans->stypes, src->value - 1, 1) == 0; +} + +static bool add_genfscon(struct policydb *db, const char *fs_name, + const char *path, const char *context) +{ + return false; +} + +// https://github.com/torvalds/linux/commit/590b9d576caec6b4c46bba49ed36223a399c3fc5#diff-cc9aa90e094e6e0f47bd7300db4f33cf4366b98b55d8753744f31eb69c691016R844-R845 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) +#define ksu_kvrealloc(p, new_size, _old_size) kvrealloc(p, new_size, GFP_KERNEL) +// https://github.com/torvalds/linux/commit/de2860f4636256836450c6543be744a50118fc66#diff-fa19cdd9c3369d7f59aa2e8404628109408dbf8e1b568d1157a27328f75b8410R638-R652 +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0) +#define ksu_kvrealloc(p, new_size, old_size) \ + kvrealloc(p, old_size, new_size, GFP_KERNEL) +#else +// https://cs.android.com/android/_/android/kernel/common/+/f5f3e54f811679761c33526e695bd296190faade +// Some 5.10 kernel don't have this backport, so copy one. +void *ksu_kvrealloc_compat(const void *p, size_t oldsize, size_t newsize, + gfp_t flags) +{ + void *newp; + + if (oldsize >= newsize) + return (void *)p; + newp = kvmalloc(newsize, flags); + if (!newp) + return NULL; + memcpy(newp, p, oldsize); + kvfree(p); + return newp; +} +#define ksu_kvrealloc(p, new_size, old_size) \ + ksu_kvrealloc_compat(p, old_size, new_size, GFP_KERNEL) +#endif + +static bool add_type(struct policydb *db, const char *type_name, bool attr) +{ + struct type_datum *type = symtab_search(&db->p_types, type_name); + if (type) { + pr_warn("Type %s already exists\n", type_name); + return true; + } + + u32 value = ++db->p_types.nprim; + type = (struct type_datum *)kzalloc(sizeof(struct type_datum), GFP_KERNEL); + if (!type) { + pr_err("add_type: alloc type_datum failed.\n"); + return false; + } + + type->primary = 1; + type->value = value; + type->attribute = attr; + + char *key = kstrdup(type_name, GFP_KERNEL); + if (!key) { + pr_err("add_type: alloc key failed.\n"); + return false; + } + + if (symtab_insert(&db->p_types, key, type)) { + pr_err("add_type: insert symtab failed.\n"); + return false; + } + + struct ebitmap *new_type_attr_map_array = + ksu_kvrealloc(db->type_attr_map_array, value * sizeof(struct ebitmap), + (value - 1) * sizeof(struct ebitmap)); + + if (!new_type_attr_map_array) { + pr_err("add_type: alloc type_attr_map_array failed\n"); + return false; + } + + struct type_datum **new_type_val_to_struct = + ksu_kvrealloc(db->type_val_to_struct, + sizeof(*db->type_val_to_struct) * value, + sizeof(*db->type_val_to_struct) * (value - 1)); + + if (!new_type_val_to_struct) { + pr_err("add_type: alloc type_val_to_struct failed\n"); + return false; + } + + char **new_val_to_name_types = + ksu_kvrealloc(db->sym_val_to_name[SYM_TYPES], sizeof(char *) * value, + sizeof(char *) * (value - 1)); + if (!new_val_to_name_types) { + pr_err("add_type: alloc val_to_name failed\n"); + return false; + } + + db->type_attr_map_array = new_type_attr_map_array; + ebitmap_init(&db->type_attr_map_array[value - 1]); + ebitmap_set_bit(&db->type_attr_map_array[value - 1], value - 1, 1); + + db->type_val_to_struct = new_type_val_to_struct; + db->type_val_to_struct[value - 1] = type; + + db->sym_val_to_name[SYM_TYPES] = new_val_to_name_types; + db->sym_val_to_name[SYM_TYPES][value - 1] = key; + + int i; + for (i = 0; i < db->p_roles.nprim; ++i) { + ebitmap_set_bit(&db->role_val_to_struct[i]->types, value - 1, 1); + } + + return true; +} + +static bool set_type_state(struct policydb *db, const char *type_name, + bool permissive) +{ + struct type_datum *type; + if (type_name == NULL) { + struct hashtab_node *node; + ksu_hashtab_for_each(db->p_types.table, node) + { + type = (struct type_datum *)(node->datum); + if (ebitmap_set_bit(&db->permissive_map, type->value, permissive)) + pr_info("Could not set bit in permissive map\n"); + }; + } else { + type = (struct type_datum *)symtab_search(&db->p_types, type_name); + if (type == NULL) { + pr_info("type %s does not exist\n", type_name); + return false; + } + if (ebitmap_set_bit(&db->permissive_map, type->value, permissive)) { + pr_info("Could not set bit in permissive map\n"); + return false; + } + } + return true; +} + +static void add_typeattribute_raw(struct policydb *db, struct type_datum *type, + struct type_datum *attr) +{ + struct ebitmap *sattr = &db->type_attr_map_array[type->value - 1]; + ebitmap_set_bit(sattr, attr->value - 1, 1); + + struct hashtab_node *node; + struct constraint_node *n; + struct constraint_expr *e; + ksu_hashtab_for_each(db->p_classes.table, node) + { + struct class_datum *cls = (struct class_datum *)(node->datum); + for (n = cls->constraints; n; n = n->next) { + for (e = n->expr; e; e = e->next) { + if (e->expr_type == CEXPR_NAMES && + ebitmap_get_bit(&e->type_names->types, attr->value - 1)) { + ebitmap_set_bit(&e->names, type->value - 1, 1); + } + } + } + }; +} + +static bool add_typeattribute(struct policydb *db, const char *type, + const char *attr) +{ + struct type_datum *type_d = symtab_search(&db->p_types, type); + if (type_d == NULL) { + pr_info("type %s does not exist\n", type); + return false; + } else if (type_d->attribute) { + pr_info("type %s is an attribute\n", attr); + return false; + } + + struct type_datum *attr_d = symtab_search(&db->p_types, attr); + if (attr_d == NULL) { + pr_info("attribute %s does not exist\n", type); + return false; + } else if (!attr_d->attribute) { + pr_info("type %s is not an attribute \n", attr); + return false; + } + + add_typeattribute_raw(db, type_d, attr_d); + return true; +} + +////////////////////////////////////////////////////////////////////////// + +// Operation on types +bool ksu_type(struct policydb *db, const char *name, const char *attr) +{ + return add_type(db, name, false) && add_typeattribute(db, name, attr); +} + +bool ksu_attribute(struct policydb *db, const char *name) +{ + return add_type(db, name, true); +} + +bool ksu_permissive(struct policydb *db, const char *type) +{ + return set_type_state(db, type, true); +} + +bool ksu_enforce(struct policydb *db, const char *type) +{ + return set_type_state(db, type, false); +} + +bool ksu_typeattribute(struct policydb *db, const char *type, const char *attr) +{ + return add_typeattribute(db, type, attr); +} + +bool ksu_exists(struct policydb *db, const char *type) +{ + return symtab_search(&db->p_types, type) != NULL; +} + +// Access vector rules +bool ksu_allow(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm) +{ + return add_rule(db, src, tgt, cls, perm, AVTAB_ALLOWED, false); +} + +bool ksu_deny(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm) +{ + return add_rule(db, src, tgt, cls, perm, AVTAB_ALLOWED, true); +} + +bool ksu_auditallow(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm) +{ + return add_rule(db, src, tgt, cls, perm, AVTAB_AUDITALLOW, false); +} +bool ksu_dontaudit(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm) +{ + return add_rule(db, src, tgt, cls, perm, AVTAB_AUDITDENY, true); +} + +// Extended permissions access vector rules +bool ksu_allowxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range) +{ + return add_xperm_rule(db, src, tgt, cls, range, AVTAB_XPERMS_ALLOWED, + false); +} + +bool ksu_auditallowxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range) +{ + return add_xperm_rule(db, src, tgt, cls, range, AVTAB_XPERMS_AUDITALLOW, + false); +} + +bool ksu_dontauditxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range) +{ + return add_xperm_rule(db, src, tgt, cls, range, AVTAB_XPERMS_DONTAUDIT, + false); +} + +// Type rules +bool ksu_type_transition(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def, const char *obj) +{ + if (obj) { + return add_filename_trans(db, src, tgt, cls, def, obj); + } else { + return add_type_rule(db, src, tgt, cls, def, AVTAB_TRANSITION); + } +} + +bool ksu_type_change(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def) +{ + return add_type_rule(db, src, tgt, cls, def, AVTAB_CHANGE); +} + +bool ksu_type_member(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def) +{ + return add_type_rule(db, src, tgt, cls, def, AVTAB_MEMBER); +} + +// File system labeling +bool ksu_genfscon(struct policydb *db, const char *fs_name, const char *path, + const char *ctx) +{ + return add_genfscon(db, fs_name, path, ctx); +} + +// https://github.com/torvalds/linux/commit/581646c3fb98494009671f6d347ea125bc0e663a +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0) +#define CONST_IF_6_10 const +#else +#define CONST_IF_6_10 +#endif + +// ======== begin copy ======== + +static int copy_hashtab_node(struct hashtab_node *new_node, + CONST_IF_6_10 struct hashtab_node *old_node, + void *data) +{ + new_node->datum = old_node->datum; + new_node->key = old_node->key; + return 0; +} + +static int destroy_hashtab_node(void *key, void *datum, void *data) +{ + // just copied pointer, no need to free + return 0; +} + +static int shallow_copy_hashtab(struct hashtab *new_tab, + struct hashtab *old_tab) +{ + return hashtab_duplicate(new_tab, old_tab, copy_hashtab_node, + destroy_hashtab_node, NULL); +} + +// ======== class_datum ======== + +static int +copy_class_datum_partially_callback(struct hashtab_node *new_node, + CONST_IF_6_10 struct hashtab_node *old_node, + void *data) +{ + struct policydb *db = data; + struct class_datum *cls = old_node->datum, *new_cls; + struct constraint_node *oldn, *n, *nprev = NULL; + struct constraint_expr *olde, *e, *eprev; + new_node->key = old_node->key; + new_cls = kmemdup(cls, sizeof(struct class_datum), GFP_KERNEL); + if (!new_cls) + return -ENOMEM; + new_node->datum = new_cls; + new_cls->constraints = NULL; + for (oldn = cls->constraints; oldn; oldn = oldn->next) { + n = kmemdup(oldn, sizeof(struct constraint_node), GFP_KERNEL); + if (!n) + goto out_nomem; + if (nprev) { + nprev->next = n; + } else { + new_cls->constraints = n; + } + eprev = NULL; + n->expr = NULL; + for (olde = oldn->expr; olde; olde = olde->next) { + e = kmemdup(olde, sizeof(struct constraint_expr), GFP_KERNEL); + if (!e) { + goto out_nomem; + } + if (eprev) { + eprev->next = e; + } else { + n->expr = e; + } + if (olde->expr_type == CEXPR_NAMES) { + if (ebitmap_cpy(&e->names, &olde->names) < 0) { + goto out_nomem; + } + } + eprev = e; + } + nprev = n; + } + + db->class_val_to_struct[new_cls->value - 1] = new_cls; + + return 0; +out_nomem: + return -ENOMEM; +} + +static int destroy_class_datum_partially_callback(void *key, void *datum, + void *data) +{ + struct class_datum *cls = datum; + struct constraint_node *n, *nprev; + struct constraint_expr *e, *eprev; + if (cls) { + for (n = cls->constraints; n;) { + for (e = n->expr; e;) { + if (e->expr_type == CEXPR_NAMES) { + ebitmap_destroy(&e->names); + } + eprev = e; + e = e->next; + kfree(eprev); + } + nprev = n; + n = n->next; + kfree(nprev); + } + } + kfree(cls); + + return 0; +} + +static void free_class_datum_partially(struct policydb *db) +{ + if (db->class_val_to_struct) { + kfree(db->class_val_to_struct); + } + + if (db->p_classes.table.htable) { + hashtab_map(&db->p_classes.table, + destroy_class_datum_partially_callback, NULL); + hashtab_destroy(&db->p_classes.table); + } +} + +static int copy_class_datum_partially(struct policydb *new_db, + struct policydb *old_db) +{ + int ret; + u32 n = new_db->symtab[SYM_CLASSES].nprim; + struct class_datum **new_class_val_to_struct; + + new_db->class_val_to_struct = NULL; + memset(&new_db->p_classes.table, 0, sizeof(new_db->p_classes.table)); + + new_class_val_to_struct = + kcalloc(n, sizeof(struct class_datum *), GFP_KERNEL); + if (!new_class_val_to_struct) { + ret = -ENOMEM; + goto exit; + } + new_db->class_val_to_struct = new_class_val_to_struct; + + ret = hashtab_duplicate(&new_db->p_classes.table, &old_db->p_classes.table, + copy_class_datum_partially_callback, + destroy_class_datum_partially_callback, new_db); + + if (ret) { + goto exit; + } + + return 0; + +exit: + free_class_datum_partially(new_db); + return ret; +} + +// ======== avtab ======== + +static int copy_avtab(struct avtab *new_avtab, struct avtab *old_avtab) +{ + int ret, i; + struct avtab_node *n, *p; + ret = avtab_alloc_dup(new_avtab, old_avtab); + if (ret < 0) + return ret; + // avtab_alloc_dup didn't zero it + new_avtab->nel = 0; + + for (i = 0; i < old_avtab->nslot; i++) { + n = old_avtab->htable[i]; + while (n) { + p = avtab_insert_nonunique(new_avtab, &n->key, &n->datum); + if (!p) { + ret = -ENOMEM; + goto out_free; + } + n = n->next; + } + } + + return 0; + +out_free: + avtab_destroy(new_avtab); + return ret; +} + +// ======== role_datum ======== + +static int +copy_role_datum_partially_callback(struct hashtab_node *new_node, + CONST_IF_6_10 struct hashtab_node *old_node, + void *data) +{ + int ret = 0; + struct policydb *db = data; + struct role_datum *role = old_node->datum, *new_role; + new_role = kmemdup(role, sizeof(struct role_datum), GFP_KERNEL); + if (!new_role) { + ret = -ENOMEM; + goto out; + } + new_node->datum = new_role; + new_node->key = old_node->key; + + ret = ebitmap_cpy(&new_role->types, &role->types); + if (ret) { + goto out; + } + db->role_val_to_struct[role->value - 1] = new_role; + +out: + return ret; +} + +static int destroy_role_datum_partially_callback(void *key, void *datum, + void *data) +{ + struct role_datum *role = datum; + if (role) { + ebitmap_destroy(&role->types); + kfree(role); + } + return 0; +} + +static void free_role_datum_partially(struct policydb *db) +{ + if (db->role_val_to_struct) { + kfree(db->role_val_to_struct); + } + if (db->p_roles.table.htable) { + hashtab_map(&db->p_roles.table, destroy_role_datum_partially_callback, + NULL); + hashtab_destroy(&db->p_roles.table); + } +} + +static int copy_role_datum_partially(struct policydb *new_db, + struct policydb *old_db) +{ + int ret; + struct role_datum **new_role_val_to_struct; + u32 n = old_db->p_roles.nprim; + + new_db->role_val_to_struct = NULL; + memset(&new_db->p_roles.table, 0, sizeof(new_db->p_roles.table)); + + new_role_val_to_struct = + kcalloc(n, sizeof(*new_db->role_val_to_struct), GFP_KERNEL); + if (!new_role_val_to_struct) { + ret = -ENOMEM; + goto out_free; + } + new_db->role_val_to_struct = new_role_val_to_struct; + + ret = hashtab_duplicate(&new_db->p_roles.table, &old_db->p_roles.table, + copy_role_datum_partially_callback, + destroy_role_datum_partially_callback, new_db); + if (ret) + goto out_free; + return 0; + +out_free: + free_role_datum_partially(new_db); + + return ret; +} + +// ======== type_datum ======== + +static void free_type_datum_partially(struct policydb *db) +{ + u32 sz = db->p_types.nprim, i; + if (db->type_attr_map_array) { + for (i = 0; i < sz; i++) { + ebitmap_destroy(&db->type_attr_map_array[i]); + } + + kvfree(db->type_attr_map_array); + } + + if (db->type_val_to_struct) { + kvfree(db->type_val_to_struct); + } + + if (db->sym_val_to_name[SYM_TYPES]) { + kvfree(db->sym_val_to_name[SYM_TYPES]); + } + + hashtab_destroy(&db->p_types.table); +} + +static int copy_type_datum_partially(struct policydb *new_db, + struct policydb *old_db) +{ + int ret = -ENOMEM; + u32 sz = new_db->p_types.nprim, i; + struct ebitmap *new_type_attr_map_array; + struct type_datum **new_type_val_to_struct; + char **new_sym_val_to_name_types; + + new_db->type_attr_map_array = NULL; + new_db->type_val_to_struct = NULL; + new_db->sym_val_to_name[SYM_TYPES] = NULL; + memset(&new_db->p_types.table, 0, sizeof(new_db->p_types.table)); + + // ======== type_attr_map_array ======== + + new_type_attr_map_array = kvcalloc(sz, sizeof(struct ebitmap), GFP_KERNEL); + + if (!new_type_attr_map_array) { + goto out; + } + + new_db->type_attr_map_array = new_type_attr_map_array; + for (i = 0; i < sz; i++) { + ret = ebitmap_cpy(&new_db->type_attr_map_array[i], + &old_db->type_attr_map_array[i]); + if (ret < 0) + goto out; + } + + // ======== type_val_to_struct ======== + ret = -ENOMEM; + + new_type_val_to_struct = + kvcalloc(sz, sizeof(*new_db->type_val_to_struct), GFP_KERNEL); + if (!new_type_val_to_struct) { + goto out; + } + new_db->type_val_to_struct = new_type_val_to_struct; + memcpy(new_db->type_val_to_struct, old_db->type_val_to_struct, + sz * sizeof(*new_db->type_val_to_struct)); + + // ======== sym_val_to_name[SYM_TYPES] ======== + + new_sym_val_to_name_types = + kvcalloc(sz, sizeof(*new_db->sym_val_to_name[SYM_TYPES]), GFP_KERNEL); + if (!new_sym_val_to_name_types) + goto out; + new_db->sym_val_to_name[SYM_TYPES] = new_sym_val_to_name_types; + memcpy(new_db->sym_val_to_name[SYM_TYPES], + old_db->sym_val_to_name[SYM_TYPES], + sz * sizeof(*new_db->sym_val_to_name[SYM_TYPES])); + + // ======== p_types ======== + + ret = shallow_copy_hashtab(&new_db->p_types.table, &old_db->p_types.table); + if (ret < 0) + goto out; + + return 0; +out: + free_type_datum_partially(new_db); + return ret; +} + +// ======== permissive_map ======== + +static void free_permissive_map(struct policydb *db) +{ + ebitmap_destroy(&db->permissive_map); +} + +static int copy_permissive_map(struct policydb *new_db, struct policydb *old_db) +{ + // On failure, the old ebitmap is cleaned. + return ebitmap_cpy(&new_db->permissive_map, &old_db->permissive_map); +} + +// ======== filename_trans ======== + +static void free_filename_trans(struct policydb *db) +{ + hashtab_destroy(&db->filename_trans); +} + +static int copy_filename_trans(struct policydb *new_db, struct policydb *old_db) +{ + // On failure, the old hashtab is cleaned. + return shallow_copy_hashtab(&new_db->filename_trans, + &old_db->filename_trans); +} + +// ======== sepolicy ======== + +void ksu_destroy_sepolicy(struct selinux_policy *pol) +{ + if (!pol) + return; + + struct policydb *db = &pol->policydb; + + free_class_datum_partially(db); + + avtab_destroy(&db->te_avtab); + + free_role_datum_partially(db); + + free_type_datum_partially(db); + + free_permissive_map(db); + + free_filename_trans(db); + + kfree(pol); +} + +struct selinux_policy *ksu_dup_sepolicy(struct selinux_policy *old_pol) +{ + int ret; + struct selinux_policy *new_pol = + kmemdup(old_pol, sizeof(*old_pol), GFP_KERNEL); + if (!new_pol) { + return NULL; + } + struct policydb *new_db = &new_pol->policydb, *old_db = &old_pol->policydb; + + ret = copy_class_datum_partially(new_db, old_db); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_class_datum_partially\n"); + goto out; + } + + ret = copy_avtab(&new_db->te_avtab, &old_db->te_avtab); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_avtab\n"); + goto out; + } + + ret = copy_role_datum_partially(new_db, old_db); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_role_datum_partially\n"); + goto out; + } + + ret = copy_type_datum_partially(new_db, old_db); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_type_datum_partially\n"); + goto out; + } + + ret = copy_permissive_map(new_db, old_db); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_permissive_map\n"); + goto out; + } + + ret = copy_filename_trans(new_db, old_db); + if (ret < 0) { + pr_err("ksu_dup_sepolicy: copy_filename_trans\n"); + goto out; + } + + return new_pol; + +out: + kfree(new_pol); + return NULL; +} diff --git a/KernelSU-Next/kernel/selinux/sepolicy.h b/KernelSU-Next/kernel/selinux/sepolicy.h new file mode 100644 index 000000000000..f7ec1469ea08 --- /dev/null +++ b/KernelSU-Next/kernel/selinux/sepolicy.h @@ -0,0 +1,50 @@ +#ifndef __KSU_H_SEPOLICY +#define __KSU_H_SEPOLICY + +#include + +#include "ss/policydb.h" + +struct selinux_policy *ksu_dup_sepolicy(struct selinux_policy *old_pol); + +void ksu_destroy_sepolicy(struct selinux_policy *orig); + +// Operation on types +bool ksu_type(struct policydb *db, const char *name, const char *attr); +bool ksu_attribute(struct policydb *db, const char *name); +bool ksu_permissive(struct policydb *db, const char *type); +bool ksu_enforce(struct policydb *db, const char *type); +bool ksu_typeattribute(struct policydb *db, const char *type, const char *attr); +bool ksu_exists(struct policydb *db, const char *type); + +// Access vector rules +bool ksu_allow(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm); +bool ksu_deny(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm); +bool ksu_auditallow(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm); +bool ksu_dontaudit(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *perm); + +// Extended permissions access vector rules +bool ksu_allowxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range); +bool ksu_auditallowxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range); +bool ksu_dontauditxperm(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *range); + +// Type rules +bool ksu_type_transition(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def, const char *obj); +bool ksu_type_change(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def); +bool ksu_type_member(struct policydb *db, const char *src, const char *tgt, + const char *cls, const char *def); + +// File system labeling +bool ksu_genfscon(struct policydb *db, const char *fs_name, const char *path, + const char *ctx); + +#endif \ No newline at end of file diff --git a/KernelSU-Next/kernel/setup.sh b/KernelSU-Next/kernel/setup.sh new file mode 100755 index 000000000000..94b94d9546f2 --- /dev/null +++ b/KernelSU-Next/kernel/setup.sh @@ -0,0 +1,82 @@ +#!/bin/sh +set -eu + +GKI_ROOT=$(pwd) +OWNER="pershoot" +REPO="KernelSU-Next" + +display_usage() { + echo "Usage: $0 [--cleanup | ]" + echo " --cleanup: Cleans up previous modifications made by the script." + echo " : Sets up or updates the KernelSU-Next to specified tag or commit." + echo " -h, --help: Displays this usage information." + echo " (no args): Sets up or updates the KernelSU-Next environment to the latest tagged version." +} + +initialize_variables() { + if test -d "$GKI_ROOT/common/drivers"; then + DRIVER_DIR="$GKI_ROOT/common/drivers" + elif test -d "$GKI_ROOT/aosp/drivers"; then + DRIVER_DIR="$GKI_ROOT/aosp/drivers" + elif test -d "$GKI_ROOT/drivers"; then + DRIVER_DIR="$GKI_ROOT/drivers" + else + echo '[ERROR] "drivers/" directory not found.' + exit 127 + fi + + DRIVER_MAKEFILE=$DRIVER_DIR/Makefile + DRIVER_KCONFIG=$DRIVER_DIR/Kconfig +} + +# Reverts modifications made by this script +perform_cleanup() { + echo "[+] Cleaning up..." + [ -L "$DRIVER_DIR/kernelsu" ] && rm "$DRIVER_DIR/kernelsu" && echo "[-] Symlink removed." + grep -q "kernelsu" "$DRIVER_MAKEFILE" && sed -i '/kernelsu/d' "$DRIVER_MAKEFILE" && echo "[-] Makefile reverted." + grep -q "drivers/kernelsu/Kconfig" "$DRIVER_KCONFIG" && sed -i '/drivers\/kernelsu\/Kconfig/d' "$DRIVER_KCONFIG" && echo "[-] Kconfig reverted." + if [ -d "$GKI_ROOT/$REPO" ]; then + rm -rf "$GKI_ROOT/$REPO" && echo "[-] $REPO directory deleted." + fi +} + +# Sets up or update KernelSU-Next environment +setup_kernelsu() { + echo "[+] Setting up $REPO..." + test -d "$GKI_ROOT/$REPO" || git clone "https://github.com/$OWNER/$REPO" && echo "[+] Repository cloned." + cd "$GKI_ROOT/$REPO" + git stash && echo "[-] Stashed current changes." + + BRANCH="$(git rev-parse --abbrev-ref origin/HEAD | sed 's@^origin/@@')" + if [ "$(git status | grep -Po 'v\d+(\.\d+)*' | head -n1)" ]; then + git checkout $BRANCH && echo "[-] Switched to $BRANCH branch." + fi + + git pull && echo "[+] Repository updated." + if [ -z "${1-}" ]; then + git checkout "$(git describe --abbrev=0 --tags)" && echo "[-] Checked out latest tag." + else + git checkout "$1" && echo "[-] Checked out $1." || echo "[-] Checkout default branch" + fi + cd "$DRIVER_DIR" + ln -sf "$(realpath --relative-to="$DRIVER_DIR" "$GKI_ROOT/$REPO/kernel")" "kernelsu" && echo "[+] Symlink created." + + # Add entries in Makefile and Kconfig if not already existing + grep -q "kernelsu" "$DRIVER_MAKEFILE" || printf "\nobj-\$(CONFIG_KSU) += kernelsu/\n" >> "$DRIVER_MAKEFILE" && echo "[+] Modified Makefile." + grep -q "source \"drivers/kernelsu/Kconfig\"" "$DRIVER_KCONFIG" || sed -i "/endmenu/i\source \"drivers/kernelsu/Kconfig\"" "$DRIVER_KCONFIG" && echo "[+] Modified Kconfig." + echo '[+] Done.' +} + +# Process command-line arguments +if [ "$#" -eq 0 ]; then + initialize_variables + setup_kernelsu +elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + display_usage +elif [ "$1" = "--cleanup" ]; then + initialize_variables + perform_cleanup +else + initialize_variables + setup_kernelsu "$@" +fi diff --git a/KernelSU-Next/kernel/supercall/dispatch.c b/KernelSU-Next/kernel/supercall/dispatch.c new file mode 100644 index 000000000000..38de77b8c857 --- /dev/null +++ b/KernelSU-Next/kernel/supercall/dispatch.c @@ -0,0 +1,1067 @@ +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_KSU_SUSFS +#include +#include +extern struct work_struct susfs_extra_works; +#endif + +#include "uapi/supercall.h" +#include "supercall/internal.h" +#include "arch.h" // IWYU pragma: keep +#include "policy/allowlist.h" +#include "policy/feature.h" +#include "klog.h" // IWYU pragma: keep +#include "ksu.h" +#include "runtime/ksud_boot.h" +#include "feature/kernel_umount.h" +#include "manager/manager_identity.h" +#include "selinux/selinux.h" +#include "infra/file_wrapper.h" +#include "hook/tp_marker.h" +#include "policy/app_profile.h" +#include "supercall/supercall.h" + +#include "tiny_sulog.h" + +static int do_grant_root(void __user *arg) +{ + // we already check uid above on allowed_for_su() + + write_sulog('i'); // log ioctl escalation + + pr_info("allow root for: %d\n", current_uid().val); + escape_with_root_profile(); + + return 0; +} + +static int do_get_info(void __user *arg) +{ + struct ksu_get_info_cmd cmd = { .version = KERNEL_SU_VERSION, .flags = 0 }; + +#ifdef MODULE + cmd.flags |= KSU_GET_INFO_FLAG_LKM; +#endif + + if (ksuver_override) + cmd.version = ksuver_override; + + if (is_manager()) { + cmd.flags |= KSU_GET_INFO_FLAG_MANAGER; + } + if (ksu_late_loaded) { + cmd.flags |= KSU_GET_INFO_FLAG_LATE_LOAD; + } +#ifdef EXPECTED_SIZE2 + cmd.flags |= KSU_GET_INFO_FLAG_PR_BUILD; +#endif + cmd.features = KSU_FEATURE_MAX; + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_version: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_report_event(void __user *arg) +{ + struct ksu_report_event_cmd cmd; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + return -EFAULT; + } + + switch (cmd.event) { + case EVENT_POST_FS_DATA: { + static bool post_fs_data_lock = false; + if (!post_fs_data_lock) { + post_fs_data_lock = true; + if (ksu_late_loaded) { + pr_info("post-fs-data skipped (late load)\n"); + } else { + pr_info("post-fs-data triggered\n"); + on_post_fs_data(); + } + } + break; + } + case EVENT_BOOT_COMPLETED: { + static bool boot_complete_lock = false; + if (!boot_complete_lock) { + boot_complete_lock = true; + if (ksu_late_loaded) { + pr_info("boot_complete skipped (late load)\n"); + } else { + pr_info("boot_complete triggered\n"); + on_boot_completed(); + } +#ifdef CONFIG_KSU_SUSFS +#ifdef CONFIG_KSU_SUSFS_SUS_PATH + schedule_work(&susfs_extra_works); +#endif + susfs_start_sdcard_monitor_fn(); +#endif + } + break; + } + case EVENT_MODULE_MOUNTED: { + pr_info("module mounted!\n"); + on_module_mounted(); +#if defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KSU_SUSFS_SUS_PATH) + schedule_work(&susfs_extra_works); +#endif + break; + } + default: + break; + } + + return 0; +} + +static int do_set_sepolicy(void __user *arg) +{ + struct ksu_set_sepolicy_cmd cmd; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + return -EFAULT; + } + + return handle_sepolicy((void __user *)cmd.data, cmd.data_len); +} + +static int do_check_safemode(void __user *arg) +{ + struct ksu_check_safemode_cmd cmd; + + cmd.in_safe_mode = ksu_is_safe_mode(); + + if (cmd.in_safe_mode) { + pr_warn("safemode enabled!\n"); + } + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("check_safemode: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_new_get_allow_list_common(void __user *arg, bool allow) +{ + struct ksu_new_get_allow_list_cmd cmd; + int *arr = NULL; + int err = 0; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + return -EFAULT; + } + + if (cmd.count) { + arr = kmalloc(sizeof(int) * cmd.count, GFP_KERNEL); + if (!arr) { + return -ENOMEM; + } + } + + bool success = ksu_get_allow_list(arr, cmd.count, &cmd.count, &cmd.total_count, allow); + + if (!success) { + err = -EFAULT; + goto out; + } + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("new_get_allow_list: copy_to_user count failed\n"); + err = -EFAULT; + goto out; + } + + if (cmd.count && copy_to_user(&((struct ksu_new_get_allow_list_cmd *)arg)->uids, arr, sizeof(int) * cmd.count)) { + pr_err("new_get_allow_list: copy_to_user uids failed\n"); + err = -EFAULT; + } + +out: + if (arr) { + kfree(arr); + } + return err; +} + +static int do_new_get_deny_list(void __user *arg) +{ + return do_new_get_allow_list_common(arg, false); +} + +static int do_new_get_allow_list(void __user *arg) +{ + return do_new_get_allow_list_common(arg, true); +} + +static int do_get_allow_list_common(void __user *arg, bool allow) +{ + int *arr = NULL; + int err = 0; + u16 count; + u32 out_count; + static const u16 kSize = 128; + + arr = kmalloc(sizeof(int) * kSize, GFP_KERNEL); + if (!arr) { + return -ENOMEM; + } + + bool success = ksu_get_allow_list(arr, kSize, &count, NULL, allow); + + if (!success) { + err = -EFAULT; + goto out; + } + + out_count = count; + + if (copy_to_user(arg + offsetof(struct ksu_get_allow_list_cmd, count), &out_count, sizeof(u32))) { + pr_err("get_allow_list: copy_to_user count failed\n"); + err = -EFAULT; + goto out; + } + + if (copy_to_user(arg, arr, sizeof(u32) * count)) { + pr_err("get_allow_list: copy_to_user uids failed\n"); + err = -EFAULT; + } + +out: + if (arr) { + kfree(arr); + } + return err; +} + +static int do_get_deny_list(void __user *arg) +{ + return do_get_allow_list_common(arg, false); +} + +static int do_get_allow_list(void __user *arg) +{ + return do_get_allow_list_common(arg, true); +} + +static int do_uid_granted_root(void __user *arg) +{ + struct ksu_uid_granted_root_cmd cmd; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + return -EFAULT; + } + + cmd.granted = ksu_is_allow_uid_for_current(cmd.uid); + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("uid_granted_root: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_uid_should_umount(void __user *arg) +{ + struct ksu_uid_should_umount_cmd cmd; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + return -EFAULT; + } + + cmd.should_umount = ksu_uid_should_umount(cmd.uid); + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("uid_should_umount: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_get_manager_appid(void __user *arg) +{ + struct ksu_get_manager_appid_cmd cmd; + + cmd.appid = ksu_get_manager_appid(); + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_manager_appid: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_get_app_profile(void __user *arg) +{ +#ifdef CONFIG_KSU_DISABLE_POLICY + return -EOPNOTSUPP; +#endif + uid_t uid; + struct app_profile *profile; + int ret = 0; + + if (copy_from_user(&uid, (char __user *)arg + offsetof(struct ksu_get_app_profile_cmd, profile.curr_uid), + sizeof(uid_t))) { + pr_err("get_app_profile: copy_from_user failed\n"); + return -EFAULT; + } + + rcu_read_lock(); + profile = ksu_get_app_profile(uid); + rcu_read_unlock(); + if (!profile) { + ret = -ENOENT; + } else { + if (copy_to_user((char __user *)arg + offsetof(struct ksu_get_app_profile_cmd, profile), profile, + sizeof(struct app_profile))) { + pr_err("get_app_profile: copy_to_user failed\n"); + ret = -EFAULT; + } + ksu_put_app_profile(profile); + } + return ret; +} + +static int do_set_app_profile(void __user *arg) +{ +#ifdef CONFIG_KSU_DISABLE_POLICY + return -EOPNOTSUPP; +#endif + + struct ksu_set_app_profile_cmd cmd; + int ret; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("set_app_profile: copy_from_user failed\n"); + return -EFAULT; + } + + ret = ksu_set_app_profile(&cmd.profile); + if (!ret) { + ksu_persistent_allow_list(); +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_mark_running_process(); +#endif + } + return ret; +} + +static int do_get_feature(void __user *arg) +{ + struct ksu_get_feature_cmd cmd; + bool supported; + int ret; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("get_feature: copy_from_user failed\n"); + return -EFAULT; + } + + ret = ksu_get_feature(cmd.feature_id, &cmd.value, &supported); + cmd.supported = supported ? 1 : 0; + + if (ret && supported) { + pr_err("get_feature: failed for feature %u: %d\n", cmd.feature_id, ret); + return ret; + } + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_feature: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_set_feature(void __user *arg) +{ + struct ksu_set_feature_cmd cmd; + int ret; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("set_feature: copy_from_user failed\n"); + return -EFAULT; + } + + ret = ksu_set_feature(cmd.feature_id, cmd.value); + if (ret) { + pr_err("set_feature: failed for feature %u: %d\n", cmd.feature_id, ret); + return ret; + } + + return 0; +} + +static int do_get_wrapper_fd(void __user *arg) +{ + if (!ksu_file_sid) { + return -EINVAL; + } + + struct ksu_get_wrapper_fd_cmd cmd; + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("get_wrapper_fd: copy_from_user failed\n"); + return -EFAULT; + } + + return ksu_install_file_wrapper(cmd.fd); +} + +static int do_manage_mark(void __user *arg) +{ + struct ksu_manage_mark_cmd cmd; + int ret = 0; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) { + pr_err("manage_mark: copy_from_user failed\n"); + return -EFAULT; + } + + switch (cmd.operation) { + case KSU_MARK_GET: { + // Get task mark status +#ifdef CONFIG_KSU_SUSFS + if (susfs_is_current_proc_umounted()) { + ret = 0; // SYSCALL_TRACEPOINT is NOT flagged + } else { + ret = 1; // SYSCALL_TRACEPOINT is flagged + } +#else + ret = ksu_get_task_mark(cmd.pid); + if (ret < 0) { + pr_err("manage_mark: get failed for pid %d: %d\n", cmd.pid, ret); + return ret; + } +#endif + cmd.result = (u32)ret; + break; + } + case KSU_MARK_MARK: { +#ifdef CONFIG_KSU_SUSFS + if (cmd.pid != 0) + return ret; +#else + if (cmd.pid == 0) { + ksu_mark_all_process(); + } else { + ret = ksu_set_task_mark(cmd.pid, true); + if (ret < 0) { + pr_err("manage_mark: set_mark failed for pid %d: %d\n", cmd.pid, ret); + return ret; + } + } +#endif + break; + } + case KSU_MARK_UNMARK: { +#ifdef CONFIG_KSU_SUSFS + if (cmd.pid != 0) + return ret; +#else + if (cmd.pid == 0) { + ksu_unmark_all_process(); + } else { + ret = ksu_set_task_mark(cmd.pid, false); + if (ret < 0) { + pr_err("manage_mark: set_unmark failed for pid %d: %d\n", cmd.pid, ret); + return ret; + } + } +#endif + break; + } + case KSU_MARK_REFRESH: { +#if !defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KPROBES) + ksu_mark_running_process(); + pr_info("manage_mark: refreshed running processes\n"); +#endif + break; + } + default: { + pr_err("manage_mark: invalid operation %u\n", cmd.operation); + return -EINVAL; + } + } + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("manage_mark: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_nuke_ext4_sysfs(void __user *arg) +{ + struct ksu_nuke_ext4_sysfs_cmd cmd; + char mnt[256]; + long ret; + + if (copy_from_user(&cmd, arg, sizeof(cmd))) + return -EFAULT; + + if (!cmd.arg) + return -EINVAL; + + memset(mnt, 0, sizeof(mnt)); + + ret = strncpy_from_user(mnt, cmd.arg, sizeof(mnt)); + if (ret < 0) { + pr_err("nuke ext4 copy mnt failed: %ld\n", ret); + return -EFAULT; + } + + if (ret == sizeof(mnt)) { + pr_err("nuke ext4 mnt path too long\n"); + return -ENAMETOOLONG; + } + + pr_info("do_nuke_ext4_sysfs: %s\n", mnt); + + return nuke_ext4_sysfs(mnt); +} + +struct list_head mount_list = LIST_HEAD_INIT(mount_list); +DECLARE_RWSEM(mount_list_lock); + +static int add_try_umount(void __user *arg) +{ + struct mount_entry *new_entry, *entry, *tmp; + struct ksu_add_try_umount_cmd cmd; + char buf[256] = { 0 }; + + if (copy_from_user(&cmd, arg, sizeof cmd)) + return -EFAULT; + + switch (cmd.mode) { + case KSU_UMOUNT_WIPE: { + struct mount_entry *entry, *tmp; + down_write(&mount_list_lock); + list_for_each_entry_safe (entry, tmp, &mount_list, list) { + pr_info("wipe_umount_list: removing entry: %s\n", entry->umountable); + list_del(&entry->list); + kfree(entry->umountable); + kfree(entry); + } + up_write(&mount_list_lock); + + return 0; + } + + case KSU_UMOUNT_ADD: { + long len = strncpy_from_user(buf, (const char __user *)cmd.arg, 256); + if (len <= 0) + return -EFAULT; + + buf[sizeof(buf) - 1] = '\0'; + + new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); + if (!new_entry) + return -ENOMEM; + + new_entry->umountable = kstrdup(buf, GFP_KERNEL); + if (!new_entry->umountable) { + kfree(new_entry); + return -ENOMEM; + } + + down_write(&mount_list_lock); + + // disallow dupes + // if this gets too many, we can consider moving this whole task to a kthread + list_for_each_entry (entry, &mount_list, list) { + if (!strcmp(entry->umountable, buf)) { + pr_info("cmd_add_try_umount: %s is already here!\n", buf); + up_write(&mount_list_lock); + kfree(new_entry->umountable); + kfree(new_entry); + return -EEXIST; + } + } + + // now check flags and add + // this also serves as a null check + if (cmd.flags) + new_entry->flags = cmd.flags; + else + new_entry->flags = 0; + + // debug + list_add(&new_entry->list, &mount_list); + up_write(&mount_list_lock); + pr_info("cmd_add_try_umount: %s added!\n", buf); + + return 0; + } + + // this is just strcmp'd wipe anyway + case KSU_UMOUNT_DEL: { + long len = strncpy_from_user(buf, (const char __user *)cmd.arg, sizeof(buf) - 1); + if (len <= 0) + return -EFAULT; + + buf[sizeof(buf) - 1] = '\0'; + + down_write(&mount_list_lock); + list_for_each_entry_safe (entry, tmp, &mount_list, list) { + if (!strcmp(entry->umountable, buf)) { + pr_info("cmd_add_try_umount: entry removed: %s\n", entry->umountable); + list_del(&entry->list); + kfree(entry->umountable); + kfree(entry); + } + } + up_write(&mount_list_lock); + + return 0; + } + + // this way userspace can deduce the memory it has to prepare. + case KSU_UMOUNT_GETSIZE: { + // check for pointer first + if (!cmd.arg) + return -EFAULT; + + size_t total_size = 0; // size of list in bytes + + down_read(&mount_list_lock); + list_for_each_entry(entry, &mount_list, list) { + total_size = total_size + strlen(entry->umountable) + 1; // + 1 for \0 + } + up_read(&mount_list_lock); + + // debug + // pr_info("cmd_add_try_umount: total_size: %zu\n", total_size); + + if (copy_to_user((size_t __user *)cmd.arg, &total_size, sizeof(total_size))) + return -EFAULT; + + return 0; + } + + // WARNING! this is straight up pointerwalking. + // this way we dont need to redefine the ioctl defs. + // this also avoids us needing to kmalloc + // userspace have to send pointer to memory (malloc/alloca) or pointer to a VLA. + case KSU_UMOUNT_GETLIST: { + // check for pointer first + if (!cmd.arg) + return -EFAULT; + + char *user_buf = (char *)cmd.arg; + + down_read(&mount_list_lock); + list_for_each_entry(entry, &mount_list, list) { + + //debug + //pr_info("cmd_add_try_umount: entry: %s\n", entry->umountable); + + if (copy_to_user((char __user *)user_buf, entry->umountable, strlen(entry->umountable) + 1 )) { + up_read(&mount_list_lock); + return -EFAULT; + } + + // walk it! +1 for null terminator + user_buf = user_buf + strlen(entry->umountable) + 1; + } + up_read(&mount_list_lock); + + return 0; + } + + default: { + pr_err("cmd_add_try_umount: invalid operation %u\n", cmd.mode); + return -EINVAL; + } + + } // switch(cmd.mode) + + return 0; +} + +static int do_get_hook_mode(void __user *arg) +{ + struct ksu_get_hook_mode_cmd cmd = {0}; + +#ifndef CONFIG_KSU_SUSFS +#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS + strscpy(cmd.mode, "Tracepoint", sizeof(cmd.mode)); +#else + strscpy(cmd.mode, "Kprobes", sizeof(cmd.mode)); +#endif +#elif defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS) || defined(CONFIG_KPROBES) + strscpy(cmd.mode, "Hybrid", sizeof(cmd.mode)); +#else + strscpy(cmd.mode, "Inline", sizeof(cmd.mode)); +#endif + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_hook_mode: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_get_version_tag(void __user *arg) +{ + struct ksu_get_version_tag_cmd cmd = {0}; + + strscpy(cmd.tag, KERNEL_SU_VERSION_TAG, sizeof(cmd.tag)); + + if (copy_to_user(arg, &cmd, sizeof(cmd))) { + pr_err("get_version_tag: copy_to_user failed\n"); + return -EFAULT; + } + + return 0; +} + +static int do_set_init_pgrp(void __user *arg) +{ + int err; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0) + struct pid *pids[PIDTYPE_MAX] = { 0 }; +#endif + + write_lock_irq(&tasklist_lock); + struct task_struct *p = current->group_leader; + struct pid *init_group = task_pgrp(&init_task); + + err = -EPERM; + if (task_session(p) != task_session(&init_task)) + goto out; + + err = 0; + if (task_pgrp(p) != init_group) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0) + change_pid(pids, p, PIDTYPE_PGID, init_group); +#else + change_pid(p, PIDTYPE_PGID, init_group); +#endif + } + +out: + write_unlock_irq(&tasklist_lock); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0) + free_pids(pids); +#endif + + return err; +} + +// IOCTL handlers mapping table +// clang-format off +static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { + { + .cmd = KSU_IOCTL_GRANT_ROOT, + .name = "GRANT_ROOT", + .handler = do_grant_root, + .perm_check = allowed_for_su + }, + { + .cmd = KSU_IOCTL_GET_INFO, + .name = "GET_INFO", + .handler = do_get_info, + .perm_check = always_allow + }, + { + .cmd = KSU_IOCTL_REPORT_EVENT, + .name = "REPORT_EVENT", + .handler = do_report_event, + .perm_check = only_root + }, + { + .cmd = KSU_IOCTL_SET_SEPOLICY, + .name = "SET_SEPOLICY", + .handler = do_set_sepolicy, + .perm_check = only_root + }, + { + .cmd = KSU_IOCTL_CHECK_SAFEMODE, + .name = "CHECK_SAFEMODE", + .handler = do_check_safemode, + .perm_check = always_allow + }, + { + .cmd = KSU_IOCTL_GET_ALLOW_LIST, + .name = "GET_ALLOW_LIST", + .handler = do_get_allow_list, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_GET_DENY_LIST, + .name = "GET_DENY_LIST", + .handler = do_get_deny_list, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_NEW_GET_ALLOW_LIST, + .name = "NEW_GET_ALLOW_LIST", + .handler = do_new_get_allow_list, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_NEW_GET_DENY_LIST, + .name = "NEW_GET_DENY_LIST", + .handler = do_new_get_deny_list, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_UID_GRANTED_ROOT, + .name = "UID_GRANTED_ROOT", + .handler = do_uid_granted_root, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_UID_SHOULD_UMOUNT, + .name = "UID_SHOULD_UMOUNT", + .handler = do_uid_should_umount, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_GET_MANAGER_APPID, + .name = "GET_MANAGER_APPID", + .handler = do_get_manager_appid, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_GET_APP_PROFILE, + .name = "GET_APP_PROFILE", + .handler = do_get_app_profile, + .perm_check = only_manager + }, + { + .cmd = KSU_IOCTL_SET_APP_PROFILE, + .name = "SET_APP_PROFILE", + .handler = do_set_app_profile, + .perm_check = only_manager + }, + { + .cmd = KSU_IOCTL_GET_FEATURE, + .name = "GET_FEATURE", + .handler = do_get_feature, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_SET_FEATURE, + .name = "SET_FEATURE", + .handler = do_set_feature, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_GET_WRAPPER_FD, + .name = "GET_WRAPPER_FD", + .handler = do_get_wrapper_fd, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_MANAGE_MARK, + .name = "MANAGE_MARK", + .handler = do_manage_mark, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_NUKE_EXT4_SYSFS, + .name = "NUKE_EXT4_SYSFS", + .handler = do_nuke_ext4_sysfs, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_ADD_TRY_UMOUNT, + .name = "ADD_TRY_UMOUNT", + .handler = add_try_umount, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_SET_INIT_PGRP, + .name = "SET_INIT_PGRP", + .handler = do_set_init_pgrp, + .perm_check = only_root + }, + { + .cmd = KSU_IOCTL_GET_HOOK_MODE, + .name = "GET_HOOK_MODE", + .handler = do_get_hook_mode, + .perm_check = manager_or_root + }, + { + .cmd = KSU_IOCTL_GET_VERSION_TAG, + .name = "GET_VERSION_TAG", + .handler = do_get_version_tag, + .perm_check = manager_or_root + }, + { + .cmd = 0, + .name = NULL, + .handler = NULL, + .perm_check = NULL + } // Sentinel +}; +// clang-format on + +long ksu_supercall_handle_ioctl(unsigned int cmd, void __user *argp) +{ + int i; + +#ifdef CONFIG_KSU_DEBUG + pr_info("ksu ioctl: cmd=0x%x from uid=%d\n", cmd, current_uid().val); +#endif + + for (i = 0; ksu_ioctl_handlers[i].handler; i++) { + if (cmd == ksu_ioctl_handlers[i].cmd) { + // Check permission first + if (ksu_ioctl_handlers[i].perm_check && !ksu_ioctl_handlers[i].perm_check()) { + pr_warn("ksu ioctl: permission denied for cmd=0x%x uid=%d\n", cmd, current_uid().val); + return -EPERM; + } + // Execute handler + return ksu_ioctl_handlers[i].handler(argp); + } + } + + pr_warn("ksu ioctl: unsupported command 0x%x\n", cmd); + return -ENOTTY; +} + +void __init ksu_supercall_dump_commands(void) +{ + int i; + + pr_info("KernelSU IOCTL Commands:\n"); + for (i = 0; ksu_ioctl_handlers[i].handler; i++) { + pr_info(" %-18s = 0x%08x\n", ksu_ioctl_handlers[i].name, ksu_ioctl_handlers[i].cmd); + } +} + +void ksu_supercall_cleanup_state(void) +{ + struct mount_entry *entry, *tmp; + + down_write(&mount_list_lock); + list_for_each_entry_safe (entry, tmp, &mount_list, list) { + list_del(&entry->list); + kfree(entry->umountable); + kfree(entry); + } + up_write(&mount_list_lock); +} + +#ifdef CONFIG_KSU_SUSFS +/* susfs reboot commands */ +int ksu_handle_sys_reboot(int magic1, int magic2, unsigned int cmd, void __user **arg) +{ + if (magic1 != KSU_INSTALL_MAGIC1) { + return -EINVAL; + } + + if (magic2 == KSU_INSTALL_MAGIC2) { + return ksu_supercall_reboot_handler(arg); + } + + // If magic2 is susfs and current process is root + if (magic2 == SUSFS_MAGIC && current_uid().val == 0) { + switch (cmd) { +#ifdef CONFIG_KSU_SUSFS_SUS_PATH + case CMD_SUSFS_ADD_SUS_PATH: + susfs_add_sus_path(arg); + return 0; + case CMD_SUSFS_ADD_SUS_PATH_LOOP: + susfs_add_sus_path_loop(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_SUS_PATH +#ifdef CONFIG_KSU_SUSFS_SUS_MOUNT + case CMD_SUSFS_HIDE_SUS_MNTS_FOR_NON_SU_PROCS: + susfs_set_hide_sus_mnts_for_non_su_procs(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_SUS_MOUNT +#ifdef CONFIG_KSU_SUSFS_SUS_KSTAT + case CMD_SUSFS_ADD_SUS_KSTAT: + susfs_add_sus_kstat(arg); + return 0; + case CMD_SUSFS_UPDATE_SUS_KSTAT: + susfs_update_sus_kstat(arg); + return 0; + case CMD_SUSFS_ADD_SUS_KSTAT_STATICALLY: + susfs_add_sus_kstat(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_SUS_KSTAT +#ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME + case CMD_SUSFS_SET_UNAME: { + struct st_susfs_uname info; + if (!copy_from_user(&info, (struct st_susfs_uname __user *)*arg, sizeof(info))) { + if (strcmp(info.release, "default") || strcmp(info.version, "default")) { + // Dead man's switch: If enabling SuSFS, reset the Toolkit's global memory changes + ksu_toolkit_uname_reset(); + } + } + susfs_set_uname(arg); + return 0; + } +#endif // #ifdef CONFIG_KSU_SUSFS_SPOOF_UNAME +#ifdef CONFIG_KSU_SUSFS_ENABLE_LOG + case CMD_SUSFS_ENABLE_LOG: + susfs_enable_log(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_ENABLE_LOG +#ifdef CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG + case CMD_SUSFS_SET_CMDLINE_OR_BOOTCONFIG: + susfs_set_cmdline_or_bootconfig(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG +#ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT + case CMD_SUSFS_ADD_OPEN_REDIRECT: + susfs_add_open_redirect(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_OPEN_REDIRECT +#ifdef CONFIG_KSU_SUSFS_SUS_MAP + case CMD_SUSFS_ADD_SUS_MAP: + susfs_add_sus_map(arg); + return 0; +#endif // #ifdef CONFIG_KSU_SUSFS_SUS_MAP + case CMD_SUSFS_ENABLE_AVC_LOG_SPOOFING: { + struct st_susfs_avc_log_spoofing info; + if (!copy_from_user(&info, (struct st_susfs_avc_log_spoofing __user *)*arg, sizeof(info))) { + if (info.enabled) { + extern void ksu_avc_spoof_disable(void); + ksu_avc_spoof_disable(); + } + } + susfs_set_avc_log_spoofing(arg); + return 0; + } + case CMD_SUSFS_SHOW_ENABLED_FEATURES: + susfs_get_enabled_features(arg); + return 0; + case CMD_SUSFS_SHOW_VARIANT: + susfs_show_variant(arg); + return 0; + case CMD_SUSFS_SHOW_VERSION: + susfs_show_version(arg); + return 0; + default: + return -EINVAL; + } + } + + // Handle standard Toolkit MAGICS via unified handler + return ksu_handle_toolkit_reboot(magic2, cmd, *arg); +} +#endif diff --git a/KernelSU-Next/kernel/supercall/internal.h b/KernelSU-Next/kernel/supercall/internal.h new file mode 100644 index 000000000000..4603673829e5 --- /dev/null +++ b/KernelSU-Next/kernel/supercall/internal.h @@ -0,0 +1,21 @@ +#ifndef __KSU_H_SUPERCALL_INTERNAL +#define __KSU_H_SUPERCALL_INTERNAL + +#include +#include + +bool only_manager(void); +bool only_root(void); +bool manager_or_root(void); +bool always_allow(void); +bool allowed_for_su(void); + +long ksu_supercall_handle_ioctl(unsigned int cmd, void __user *argp); +void ksu_supercall_dump_commands(void); +void ksu_supercall_cleanup_state(void); +int ksu_handle_toolkit_reboot(int magic2, unsigned int cmd, void __user *arg); +void ksu_toolkit_uname_reset(void); + +extern uint32_t ksuver_override; + +#endif // __KSU_H_SUPERCALL_INTERNAL diff --git a/KernelSU-Next/kernel/supercall/perm.c b/KernelSU-Next/kernel/supercall/perm.c new file mode 100644 index 000000000000..974b5b4ec6a2 --- /dev/null +++ b/KernelSU-Next/kernel/supercall/perm.c @@ -0,0 +1,30 @@ +#include + +#include "supercall/internal.h" +#include "manager/manager_identity.h" +#include "policy/allowlist.h" + +bool only_manager(void) +{ + return is_manager(); +} + +bool only_root(void) +{ + return current_uid().val == 0; +} + +bool manager_or_root(void) +{ + return current_uid().val == 0 || is_manager(); +} + +bool always_allow(void) +{ + return true; +} + +bool allowed_for_su(void) +{ + return is_manager() || ksu_is_allow_uid_for_current(current_uid().val); +} diff --git a/KernelSU-Next/kernel/supercall/supercall.c b/KernelSU-Next/kernel/supercall/supercall.c new file mode 100644 index 000000000000..a8576883cd53 --- /dev/null +++ b/KernelSU-Next/kernel/supercall/supercall.c @@ -0,0 +1,304 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // utsname() and uts_sem + +#include "uapi/supercall.h" +#include "supercall/internal.h" +#include "arch.h" +#include "klog.h" // IWYU pragma: keep +#include "manager/manager_identity.h" + +#include "tiny_sulog.h" + +#include "linux/jump_label.h" + +#if defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KSU_SUSFS_SPOOF_UNAME) +extern struct static_key_false susfs_is_uname_spoof_buffer_set; +#endif + +uint32_t ksuver_override = 0; + +struct ksu_install_fd_tw { + struct callback_head cb; + int __user *outp; +}; + +static int anon_ksu_release(struct inode *inode, struct file *filp) +{ + pr_info("ksu fd released\n"); + return 0; +} + +static long anon_ksu_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return ksu_supercall_handle_ioctl(cmd, (void __user *)arg); +} + +static const struct file_operations anon_ksu_fops = { + .owner = THIS_MODULE, + .unlocked_ioctl = anon_ksu_ioctl, + .compat_ioctl = anon_ksu_ioctl, + .release = anon_ksu_release, +}; + +int ksu_install_fd(void) +{ + struct file *filp; + int fd; + + fd = get_unused_fd_flags(O_CLOEXEC); + if (fd < 0) { + pr_err("ksu_install_fd: failed to get unused fd\n"); + return fd; + } + + filp = anon_inode_getfile("[ksu_driver]", &anon_ksu_fops, NULL, O_RDWR | O_CLOEXEC); + if (IS_ERR(filp)) { + pr_err("ksu_install_fd: failed to create anon inode file\n"); + put_unused_fd(fd); + return PTR_ERR(filp); + } + + fd_install(fd, filp); + pr_info("ksu fd installed: %d for pid %d\n", fd, current->pid); + return fd; +} + +static void ksu_install_fd_tw_func(struct callback_head *cb) +{ + struct ksu_install_fd_tw *tw = container_of(cb, struct ksu_install_fd_tw, cb); + int fd = ksu_install_fd(); + + pr_info("[%d] install ksu fd: %d\n", current->pid, fd); + if (copy_to_user(tw->outp, &fd, sizeof(fd))) { + pr_err("install ksu fd reply err\n"); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + close_fd(fd); +#else + ksys_close(fd); +#endif + } + + kfree(tw); +} + +static char toolkit_orig_release[65] = {0}; +static char toolkit_orig_version[65] = {0}; + +void ksu_toolkit_uname_reset(void) +{ + if (toolkit_orig_release[0] != '\0') { + struct new_utsname *u = utsname(); + pr_info("ksu: resetting toolkit uname memory to stock\n"); + down_write(&uts_sem); + strscpy(u->release, toolkit_orig_release, sizeof(u->release)); + strscpy(u->version, toolkit_orig_version, sizeof(u->version)); + up_write(&uts_sem); + } +} + +int ksu_handle_toolkit_reboot(int magic2, unsigned int cmd, void __user *arg) +{ + unsigned long reply = (unsigned long)arg; + + if (magic2 == CHANGE_MANAGER_UID) { + /* only root is allowed for this command */ + if (current_uid().val != 0) + return -EPERM; + ksu_set_manager_appid(cmd); + if (cmd == ksu_get_manager_appid()) { + if (copy_to_user(arg, &reply, sizeof(reply))) + return -EFAULT; + } + return 0; + } + + if (magic2 == GET_SULOG_DUMP_V2) { + /* only root is allowed for this command */ + if (current_uid().val != 0) + return -EPERM; + int ret = send_sulog_dump(arg); + if (ret) + return ret; + if (copy_to_user(arg, &reply, sizeof(reply))) + return -EFAULT; + return 0; + } + + if (magic2 == CHANGE_KSUVER) { + /* only root is allowed for this command */ + if (current_uid().val != 0) + return -EPERM; + ksuver_override = cmd; + if (copy_to_user(arg, &reply, sizeof(reply))) + return -EFAULT; + return 0; + } + + // WARNING!!! triple ptr zone! *** + // https://wiki.c2.com/?ThreeStarProgrammer + if (magic2 == CHANGE_SPOOF_UNAME) { + /* only root is allowed for this command */ + if (current_uid().val != 0) + return -EPERM; + + char release_buf[65]; + char version_buf[65]; + + // basically void * void __user * void __user *arg + void __user **ppptr = (void __user **)arg; + uint64_t u_pptr = 0; + uint64_t u_ptr = 0; + + // arg here is ***, pull out user-space ** via copy_from_user + if (copy_from_user(&u_pptr, ppptr, sizeof(u_pptr))) + return -EFAULT; + + // now we got the __user ** + // we cannot dereference this as this is __user + // we just do another copy_from_user to get it + if (copy_from_user(&u_ptr, (void __user *)u_pptr, sizeof(u_ptr))) + return -EFAULT; + + // for release + if (strncpy_from_user(release_buf, (char __user *)u_ptr, sizeof(release_buf)) < 0) + return -EFAULT; + release_buf[sizeof(release_buf) - 1] = '\0'; + + // for version + if (strncpy_from_user(version_buf, (char __user *)(u_ptr + strlen(release_buf) + 1), sizeof(version_buf)) < 0) + return -EFAULT; + version_buf[sizeof(version_buf) - 1] = '\0'; + +#if defined(CONFIG_KSU_SUSFS) && defined(CONFIG_KSU_SUSFS_SPOOF_UNAME) + if (static_branch_unlikely(&susfs_is_uname_spoof_buffer_set) && (strcmp(release_buf, "default") || strcmp(version_buf, "default"))) { + pr_info("susfs: SuSFS uname active, blocking toolkit apply\n"); + return -EBUSY; + } +#endif + + if (toolkit_orig_release[0] == '\0') { + struct new_utsname *u_curr = utsname(); + // we save current version as the original before modifying + strscpy(toolkit_orig_release, u_curr->release, sizeof(toolkit_orig_release)); + strscpy(toolkit_orig_version, u_curr->version, sizeof(toolkit_orig_version)); + } + + // so user can reset + if (!strcmp(release_buf, "default") || !strcmp(version_buf, "default")) { + memcpy(release_buf, toolkit_orig_release, sizeof(release_buf)); + memcpy(version_buf, toolkit_orig_version, sizeof(version_buf)); + } + + struct new_utsname *u = utsname(); + down_write(&uts_sem); + strscpy(u->release, release_buf, sizeof(u->release)); + strscpy(u->version, version_buf, sizeof(u->version)); + up_write(&uts_sem); + + // we write our confirmation on ** + if (copy_to_user(arg, &reply, sizeof(reply))) + return -EFAULT; + return 0; + } + + return -EINVAL; +} + +#ifdef CONFIG_KSU_SUSFS +int ksu_supercall_reboot_handler(void __user **arg) +{ + struct ksu_install_fd_tw *tw; + + tw = kzalloc(sizeof(*tw), GFP_KERNEL); + if (!tw) + return 0; + + tw->outp = (int __user *)(*arg); + tw->cb.func = ksu_install_fd_tw_func; + + if (task_work_add(current, &tw->cb, TWA_RESUME)) { + kfree(tw); + pr_warn("install fd add task_work failed\n"); + } + + return 0; +} +#endif + +#ifndef CONFIG_KSU_SUSFS +static int reboot_handler_pre(struct kprobe *p, struct pt_regs *regs) +{ + struct pt_regs *real_regs = PT_REAL_REGS(regs); + int magic1 = (int)PT_REGS_PARM1(real_regs); + int magic2 = (int)PT_REGS_PARM2(real_regs); + unsigned int cmd = (unsigned int)PT_REGS_PARM3(real_regs); + unsigned long arg4 = (unsigned long)PT_REGS_SYSCALL_PARM4(real_regs); + + /* Check if this is a request to install KSU fd */ + if (magic1 == KSU_INSTALL_MAGIC1 && magic2 == KSU_INSTALL_MAGIC2) { + struct ksu_install_fd_tw *tw; + + tw = kzalloc(sizeof(*tw), GFP_ATOMIC); + if (!tw) + return 0; + + tw->outp = (int __user *)arg4; + tw->cb.func = ksu_install_fd_tw_func; + + if (task_work_add(current, &tw->cb, TWA_RESUME)) { + kfree(tw); + pr_warn("install fd add task_work failed\n"); + } + return 0; + } + + // Handle all other toolkit magics via unified handler + (void)ksu_handle_toolkit_reboot(magic2, cmd, (void __user *)arg4); + + return 0; +} + +static struct kprobe reboot_kp = { + .symbol_name = REBOOT_SYMBOL, + .pre_handler = reboot_handler_pre, +}; +#endif + +void __init ksu_supercalls_init(void) +{ +#ifndef CONFIG_KSU_SUSFS + int rc; +#endif + + ksu_supercall_dump_commands(); + +#ifndef CONFIG_KSU_SUSFS + rc = register_kprobe(&reboot_kp); + if (rc) { + pr_err("reboot kprobe failed: %d\n", rc); + } else { + pr_info("reboot kprobe registered successfully\n"); + } +#endif + + sulog_init_heap(); // grab heap memory +} + +void __exit ksu_supercalls_exit(void) +{ +#ifndef CONFIG_KSU_SUSFS + unregister_kprobe(&reboot_kp); +#endif + ksu_supercall_cleanup_state(); +} diff --git a/KernelSU-Next/kernel/supercall/supercall.h b/KernelSU-Next/kernel/supercall/supercall.h new file mode 100644 index 000000000000..50a35a0fc937 --- /dev/null +++ b/KernelSU-Next/kernel/supercall/supercall.h @@ -0,0 +1,28 @@ +#ifndef __KSU_H_SUPERCALL +#define __KSU_H_SUPERCALL + +#include +#include + +// IOCTL handler types +typedef int (*ksu_ioctl_handler_t)(void __user *arg); +typedef bool (*ksu_perm_check_t)(void); + +// IOCTL command mapping +struct ksu_ioctl_cmd_map { + unsigned int cmd; + const char *name; + ksu_ioctl_handler_t handler; + ksu_perm_check_t perm_check; // Permission check function +}; + +// Install KSU fd to current process +int ksu_install_fd(void); + +#ifdef CONFIG_KSU_SUSFS +int ksu_supercall_reboot_handler(void __user **arg); +#endif + +void ksu_supercalls_init(void); +void ksu_supercalls_exit(void); +#endif // __KSU_H_SUPERCALL diff --git a/KernelSU-Next/kernel/tiny_sulog.c b/KernelSU-Next/kernel/tiny_sulog.c new file mode 100644 index 000000000000..9f799a6214c7 --- /dev/null +++ b/KernelSU-Next/kernel/tiny_sulog.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tiny_sulog.h" + +// half assed ringbuffer +// 8 bytes +struct sulog_entry { + uint32_t s_time; // uptime in seconds + uint32_t data; // uint8_t[0,1,2] = uid, basically uint24_t, uint8_t[3] = symbol +} __attribute__((packed)); + +#define SULOG_ENTRY_MAX 250 +#define SULOG_BUFSIZ SULOG_ENTRY_MAX * (sizeof (struct sulog_entry)) + +static void *sulog_buf_ptr = NULL; +static uint8_t sulog_index_next = 0; + +static DEFINE_SPINLOCK(sulog_lock); + +void sulog_init_heap(void) +{ + sulog_buf_ptr = kzalloc(SULOG_BUFSIZ, GFP_KERNEL); + if (!sulog_buf_ptr) + sulog_buf_ptr = NULL; + + pr_info("sulog_init: allocated %lu bytes on 0x%p \n", SULOG_BUFSIZ, sulog_buf_ptr); +} + +void write_sulog(uint8_t sym) +{ + if (!sulog_buf_ptr) + return; + + unsigned int offset = sulog_index_next * sizeof(struct sulog_entry); + struct sulog_entry entry = {0}; + + // WARNING!!! this is LE only! + entry.s_time = (uint32_t)(ktime_get_boottime() / 1000000000); + entry.data = (uint32_t)current_uid().val; + memcpy((void *)&entry.data + 3, &sym, 1); + + spin_lock(&sulog_lock); + memcpy(sulog_buf_ptr + offset, &entry, sizeof(entry)); + spin_unlock(&sulog_lock); + + // move ptr for next iteration + sulog_index_next = sulog_index_next + 1; + + if (sulog_index_next >= SULOG_ENTRY_MAX) + sulog_index_next = 0; +} + +struct sulog_entry_rcv_ptr { + uint64_t index_ptr; // send index here + uint64_t buf_ptr; // send buf here + uint64_t uptime_ptr; // uptime +}; + +int send_sulog_dump(void __user *uptr) +{ + if (!sulog_buf_ptr) + return 1; + + struct sulog_entry_rcv_ptr sbuf = {0}; + + if (copy_from_user(&sbuf, uptr, sizeof(sbuf) )) + return 1; + + if (!sbuf.index_ptr || !sbuf.buf_ptr || !sbuf.uptime_ptr ) + return 1; + + // send uptime + uint32_t uptime = (uint32_t)(ktime_get_boottime() / 1000000000); + if (copy_to_user((void __user *)sbuf.uptime_ptr, &uptime, sizeof(uptime) )) + return 1; + + // send index + if (copy_to_user((void __user *)sbuf.index_ptr, &sulog_index_next, sizeof(sulog_index_next) )) + return 1; + + // send buffer data + spin_lock(&sulog_lock); + if (copy_to_user((void __user *)sbuf.buf_ptr, sulog_buf_ptr, SULOG_BUFSIZ )) { + spin_unlock(&sulog_lock); + return 1; + } + spin_unlock(&sulog_lock); + + return 0; +} diff --git a/KernelSU-Next/kernel/tiny_sulog.h b/KernelSU-Next/kernel/tiny_sulog.h new file mode 100644 index 000000000000..54ae0776daa9 --- /dev/null +++ b/KernelSU-Next/kernel/tiny_sulog.h @@ -0,0 +1,11 @@ +#ifndef _TINY_SULOG_H +#define _TINY_SULOG_H + +#include +#include /* void __user * */ + +void sulog_init_heap(void); +void write_sulog(uint8_t sym); +int send_sulog_dump(void __user *uptr); + +#endif /* _TINY_SULOG_H */ diff --git a/KernelSU-Next/kernel/tools/check_symbol.c b/KernelSU-Next/kernel/tools/check_symbol.c new file mode 100644 index 000000000000..5ad16abe93d7 --- /dev/null +++ b/KernelSU-Next/kernel/tools/check_symbol.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + void *data; + size_t size; + Elf64_Ehdr *ehdr; + Elf64_Shdr *shdr; + char *shstrtab; +} ElfFile; + +int open_elf(const char *path, ElfFile *elf) +{ + int fd = open(path, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Error: Cannot open file %s\n", path); + return -1; + } + + struct stat st; + if (fstat(fd, &st) < 0) { + fprintf(stderr, "Error: Cannot stat file %s\n", path); + close(fd); + return -1; + } + + elf->size = st.st_size; + elf->data = mmap(NULL, elf->size, PROT_READ, MAP_PRIVATE, fd, 0); + close(fd); + + if (elf->data == MAP_FAILED) { + fprintf(stderr, "Error: Cannot mmap file %s\n", path); + return -1; + } + + elf->ehdr = (Elf64_Ehdr *)elf->data; + + if (memcmp(elf->ehdr->e_ident, ELFMAG, SELFMAG) != 0) { + fprintf(stderr, "Error: %s is not a valid ELF file\n", path); + munmap(elf->data, elf->size); + return -1; + } + + if (elf->ehdr->e_ident[EI_CLASS] != ELFCLASS64) { + fprintf(stderr, "Error: %s is not a 64-bit ELF file\n", path); + munmap(elf->data, elf->size); + return -1; + } + + elf->shdr = (Elf64_Shdr *)((char *)elf->data + elf->ehdr->e_shoff); + + elf->shstrtab = + (char *)elf->data + elf->shdr[elf->ehdr->e_shstrndx].sh_offset; + + return 0; +} + +void close_elf(ElfFile *elf) +{ + munmap(elf->data, elf->size); +} + +Elf64_Shdr *find_symtab(ElfFile *elf) +{ + for (int i = 0; i < elf->ehdr->e_shnum; i++) { + if (elf->shdr[i].sh_type == SHT_SYMTAB) { + return &elf->shdr[i]; + } + } + return NULL; +} + +Elf64_Shdr *find_section(ElfFile *elf, const char *name) +{ + for (int i = 0; i < elf->ehdr->e_shnum; i++) { + const char *section_name = elf->shstrtab + elf->shdr[i].sh_name; + if (strcmp(section_name, name) == 0) { + return &elf->shdr[i]; + } + } + return NULL; +} + +Elf64_Sym *find_symbol(ElfFile *elf, const char *name, Elf64_Shdr *symtab, + char *strtab) +{ + Elf64_Sym *syms = (Elf64_Sym *)((char *)elf->data + symtab->sh_offset); + int sym_count = symtab->sh_size / sizeof(Elf64_Sym); + + for (int i = 0; i < sym_count; i++) { + const char *sym_name = strtab + syms[i].st_name; + if (strcmp(sym_name, name) == 0) { + return &syms[i]; + } + } + return NULL; +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *ko_path = argv[1]; + const char *vmlinux_path = argv[2]; + + ElfFile ko_elf, vmlinux; + + if (open_elf(ko_path, &ko_elf) < 0) { + return 1; + } + + if (open_elf(vmlinux_path, &vmlinux) < 0) { + close_elf(&ko_elf); + return 1; + } + + Elf64_Shdr *ko_symtab = find_symtab(&ko_elf); + Elf64_Shdr *vmlinux_symtab = find_symtab(&vmlinux); + Elf64_Shdr *ko_version_sec = find_section(&ko_elf, "__versions"); + + if (!ko_symtab) { + fprintf(stderr, "Error: No symbol table found in %s\n", ko_path); + close_elf(&ko_elf); + close_elf(&vmlinux); + return 1; + } + + if (!vmlinux_symtab) { + fprintf(stderr, "Error: No symbol table found in %s\n", vmlinux_path); + close_elf(&ko_elf); + close_elf(&vmlinux); + return 1; + } + + if (!ko_version_sec) { + fprintf(stderr, "Error: No __versions section found in %s\n", ko_path); + close_elf(&ko_elf); + close_elf(&vmlinux); + return 1; + } + + if (ko_version_sec->sh_size != 0) { + fprintf( + stderr, + "Error: __versions section in %s must have size 0 (actual=%llu)\n", + ko_path, (unsigned long long)ko_version_sec->sh_size); + close_elf(&ko_elf); + close_elf(&vmlinux); + return 1; + } + + char *ko_strtab = + (char *)ko_elf.data + ko_elf.shdr[ko_symtab->sh_link].sh_offset; + char *vmlinux_strtab = + (char *)vmlinux.data + vmlinux.shdr[vmlinux_symtab->sh_link].sh_offset; + + Elf64_Sym *ko_syms = + (Elf64_Sym *)((char *)ko_elf.data + ko_symtab->sh_offset); + int ko_sym_count = ko_symtab->sh_size / sizeof(Elf64_Sym); + + int has_error = 0; + + for (int i = 0; i < ko_sym_count; i++) { + if (ko_syms[i].st_shndx == SHN_UNDEF && ko_syms[i].st_name != 0) { + const char *sym_name = ko_strtab + ko_syms[i].st_name; + + Elf64_Sym *vmlinux_sym = + find_symbol(&vmlinux, sym_name, vmlinux_symtab, vmlinux_strtab); + + if (!vmlinux_sym || vmlinux_sym->st_shndx == SHN_UNDEF) { + fprintf(stderr, + "Error: Symbol '%s' not found or undefined in %s\n", + sym_name, vmlinux_path); + has_error = 1; + } else { + int binding = ELF64_ST_BIND(vmlinux_sym->st_info); + if (binding != STB_GLOBAL && binding != STB_WEAK) { + fprintf( + stderr, + "Warning: Symbol '%s' is defined in %s but not global (binding=%d)\n", + sym_name, vmlinux_path, binding); + } + } + } + } + + close_elf(&ko_elf); + close_elf(&vmlinux); + + return has_error ? 1 : 0; +} diff --git a/KernelSU-Next/manager/.gitignore b/KernelSU-Next/manager/.gitignore new file mode 100644 index 000000000000..e3fd7f38cce3 --- /dev/null +++ b/KernelSU-Next/manager/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +.idea +.kotlin +.DS_Store +build +captures +.cxx +local.properties +key.jks \ No newline at end of file diff --git a/KernelSU-Next/manager/app/.gitignore b/KernelSU-Next/manager/app/.gitignore new file mode 100644 index 000000000000..117b6b02e30b --- /dev/null +++ b/KernelSU-Next/manager/app/.gitignore @@ -0,0 +1,3 @@ +/build +/release/ +/src/main/resources diff --git a/KernelSU-Next/manager/app/build.gradle.kts b/KernelSU-Next/manager/app/build.gradle.kts new file mode 100644 index 000000000000..6a3787bfa987 --- /dev/null +++ b/KernelSU-Next/manager/app/build.gradle.kts @@ -0,0 +1,161 @@ +@file:Suppress("UnstableApiUsage") + +import com.android.build.gradle.internal.api.BaseVariantOutputImpl +import com.android.build.gradle.tasks.PackageAndroidArtifact + +plugins { + alias(libs.plugins.agp.app) + alias(libs.plugins.kotlin) + alias(libs.plugins.compose.compiler) + alias(libs.plugins.ksp) + alias(libs.plugins.lsplugin.apksign) + id("kotlin-parcelize") +} + +val managerVersionCode: Int by rootProject.extra +val managerVersionName: String by rootProject.extra + +apksign { + storeFileProperty = "KEYSTORE_FILE" + storePasswordProperty = "KEYSTORE_PASSWORD" + keyAliasProperty = "KEY_ALIAS" + keyPasswordProperty = "KEY_PASSWORD" +} + +android { + namespace = "com.rifsxd.ksunext" + + defaultConfig { + versionCode = rootProject.extra["managerVersionCode"] as Int + versionName = rootProject.extra["managerVersionName"] as String + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + + buildFeatures { + aidl = true + buildConfig = true + compose = true + prefab = true + } + + kotlinOptions { + jvmTarget = "21" + } + + packaging { + jniLibs { + useLegacyPackaging = true + } + resources { + // https://stackoverflow.com/a/58956288 + // It will break Layout Inspector, but it's unused for release build. + excludes += "META-INF/*.version" + // https://github.com/Kotlin/kotlinx.coroutines?tab=readme-ov-file#avoiding-including-the-debug-infrastructure-in-the-resulting-apk + excludes += "DebugProbesKt.bin" + // https://issueantenna.com/repo/kotlin/kotlinx.coroutines/issues/3158 + excludes += "kotlin-tooling-metadata.json" + } + } + + externalNativeBuild { + cmake { + path = file("src/main/cpp/CMakeLists.txt") + } + } + + applicationVariants.all { + outputs.forEach { + val output = it as BaseVariantOutputImpl + output.outputFileName = "KernelSU_Next_${managerVersionName}_${managerVersionCode}-$name.apk" + } + kotlin.sourceSets { + getByName(name) { + kotlin.srcDir("build/generated/ksp/$name/kotlin") + } + } + } + + // https://stackoverflow.com/a/77745844 + tasks.withType { + doFirst { appMetadata.asFile.orNull?.writeText("") } + } + + dependenciesInfo { + includeInApk = false + includeInBundle = false + } + + androidResources { + generateLocaleConfig = true + } +} + +ksp { + arg("compose-destinations.defaultTransitions", "none") +} + +tasks.register("mergeScripts") { + into("${project.projectDir}/src/main/resources/META-INF/com/google/android") + from(rootProject.file("scripts/update_binary.sh")) { + rename { "update-binary" } + } + from(rootProject.file("scripts/updater_script.sh")) { + rename { "updater-script" } + } +} + +tasks.named("preBuild") { + dependsOn("mergeScripts") +} + +dependencies { + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.navigation.compose) + + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material.icons.extended) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.tooling.preview) + + debugImplementation(libs.androidx.compose.ui.test.manifest) + debugImplementation(libs.androidx.compose.ui.tooling) + + implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + + implementation(libs.compose.destinations.core) + ksp(libs.compose.destinations.ksp) + + implementation(libs.com.github.topjohnwu.libsu.core) + implementation(libs.com.github.topjohnwu.libsu.service) + implementation(libs.com.github.topjohnwu.libsu.io) + + implementation(libs.dev.rikka.rikkax.parcelablelist) + + implementation(libs.io.coil.kt.coil.compose) + + implementation(libs.kotlinx.coroutines.core) + + implementation(libs.me.zhanghai.android.appiconloader.coil) + + implementation(libs.sheet.compose.dialogs.core) + implementation(libs.sheet.compose.dialogs.list) + implementation(libs.sheet.compose.dialogs.input) + + implementation(libs.markdown) + implementation(libs.androidx.webkit) + + implementation(libs.lsposed.cxx) + + implementation(libs.mmrl.ui) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/proguard-rules.pro b/KernelSU-Next/manager/app/proguard-rules.pro new file mode 100644 index 000000000000..e1b610ec6c61 --- /dev/null +++ b/KernelSU-Next/manager/app/proguard-rules.pro @@ -0,0 +1,39 @@ +-verbose +-optimizationpasses 5 + +-dontwarn org.conscrypt.** +-dontwarn kotlinx.serialization.** + +# Please add these rules to your existing keep rules in order to suppress warnings. +# This is generated automatically by the Android Gradle plugin. +-dontwarn com.google.auto.service.AutoService +-dontwarn com.google.j2objc.annotations.RetainedWith +-dontwarn javax.lang.model.SourceVersion +-dontwarn javax.lang.model.element.AnnotationMirror +-dontwarn javax.lang.model.element.AnnotationValue +-dontwarn javax.lang.model.element.Element +-dontwarn javax.lang.model.element.ElementKind +-dontwarn javax.lang.model.element.ElementVisitor +-dontwarn javax.lang.model.element.ExecutableElement +-dontwarn javax.lang.model.element.Modifier +-dontwarn javax.lang.model.element.Name +-dontwarn javax.lang.model.element.PackageElement +-dontwarn javax.lang.model.element.TypeElement +-dontwarn javax.lang.model.element.TypeParameterElement +-dontwarn javax.lang.model.element.VariableElement +-dontwarn javax.lang.model.type.ArrayType +-dontwarn javax.lang.model.type.DeclaredType +-dontwarn javax.lang.model.type.ExecutableType +-dontwarn javax.lang.model.type.TypeKind +-dontwarn javax.lang.model.type.TypeMirror +-dontwarn javax.lang.model.type.TypeVariable +-dontwarn javax.lang.model.type.TypeVisitor +-dontwarn javax.lang.model.util.AbstractAnnotationValueVisitor8 +-dontwarn javax.lang.model.util.AbstractTypeVisitor8 +-dontwarn javax.lang.model.util.ElementFilter +-dontwarn javax.lang.model.util.Elements +-dontwarn javax.lang.model.util.SimpleElementVisitor8 +-dontwarn javax.lang.model.util.SimpleTypeVisitor7 +-dontwarn javax.lang.model.util.SimpleTypeVisitor8 +-dontwarn javax.lang.model.util.Types +-dontwarn javax.tools.Diagnostic$Kind \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/AndroidManifest.xml b/KernelSU-Next/manager/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..a3282ae9f0b2 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/AndroidManifest.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/KernelSU-Next/manager/app/src/main/aidl/com/rifsxd/ksunext/IKsuInterface.aidl b/KernelSU-Next/manager/app/src/main/aidl/com/rifsxd/ksunext/IKsuInterface.aidl new file mode 100644 index 000000000000..899e79b8f4af --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/aidl/com/rifsxd/ksunext/IKsuInterface.aidl @@ -0,0 +1,9 @@ +// IKsuInterface.aidl +package com.rifsxd.ksunext; + +import android.content.pm.PackageInfo; +import rikka.parcelablelist.ParcelableListSlice; + +interface IKsuInterface { + ParcelableListSlice getPackages(int flags); +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/assets/eruda.min.js b/KernelSU-Next/manager/app/src/main/assets/eruda.min.js new file mode 100644 index 000000000000..0663865ae073 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/assets/eruda.min.js @@ -0,0 +1,9 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/eruda@3.4.3/eruda.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! eruda v3.4.3 https://eruda.liriliri.io/ */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.eruda=t():e.eruda=t()}(self,(function(){return function(){var __webpack_modules__={8:function(e,t){t=function(e){var t,i,a=e[0]/255,s=e[1]/255,c=e[2]/255,l=n(a,s,c),u=o(a,s,c),d=u-l;(t=n(60*(t=u===l?0:a===u?(s-c)/d:s===u?2+(c-a)/d:4+(a-s)/d),360))<0&&(t+=360);var h=(l+u)/2;i=u===l?0:h<=.5?d/(u+l):d/(2-u-l);var f=[r(t),r(100*i),r(100*h)];return e[3]&&(f[3]=e[3]),f};var n=Math.min,o=Math.max,r=Math.round;e.exports=t},15:function(e,t,n){var o=n(5651),r=n(8971);t=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};o(n,i);var a=n.ellipsis,s=n.separator;if(t>e.length)return e;var c=t-a.length;if(c<1)return a;var l=e.slice(0,c);if(r(s))return l+a;if(e.indexOf(s,c)!==c){var u=l.lastIndexOf(s);u>-1&&(l=l.slice(0,u))}return l+a};var i={ellipsis:"..."};e.exports=t},21:function(e,t,n){var o=n(2717),r=n(1738),i=n(9100),a=n(8178),s=new(t=o({className:"Select",initialize:function(e){return this.length=0,e?r(e)?s.find(e):void(e.nodeType&&(this[0]=e,this.length=1)):this},find:function(e){var n=new t;return this.each((function(){a(n,this.querySelectorAll(e))})),n},each:function(e){return i(this,(function(t,n){e.call(t,n,t)})),this}}))(document);e.exports=t},96:function(e,t,n){var o=n(2561);t=function(e){return o(e).toLocaleLowerCase()},e.exports=t},128:function(e,t,n){"use strict";n.d(t,{A:function(){return K}});var o=n(3029),r=n(2901),i=n(388),a=n(3954),s=n(5361),c=n(3915),l=n.n(c),u=n(6097),d=n.n(u),h=n(1738),f=n.n(h),p=n(4994),v=n.n(p),g=n(9405),m=n.n(g),b=n(5169),y=n.n(b),A=n(9548),w=n.n(A),_=n(3249),x=n.n(_),k=n(6030),C=n.n(k),S=n(5004),E=n.n(S);n(9410),n(8609);function T(e){var t="luna-".concat(e,"-");function n(e){return l()(m()(e).split(/\s+/),(function(e){return x()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=w().parse(e);return N(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),w().stringify(t)}catch(t){return n(e)}return n(e)}}function N(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===l?"light":l;return(0,o.A)(this,t),r=function(e,t,n){return t=(0,a.A)(t),(0,i.A)(e,U()?Reflect.construct(t,n||[],(0,a.A)(e).constructor):t.apply(e,n))}(this,t),r.subComponents=[],r.theme="",r.onThemeChange=function(e){"auto"===r.options.theme&&r.setTheme(e)},r.compName=c,r.c=T(c),r.options={},r.container=e,r.$container=z()(e),r.$container.addClass(["luna-".concat(c),r.c("platform-".concat((s=E()(),"os x"===s?"mac":s)))]),r.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=$().get()),r.setTheme(n),B()(r.subComponents,(function(e){return e.setOption("theme",t)}))}})),$().on("change",r.onThemeChange),r.setOption("theme",u),r}return(0,s.A)(t,e),(0,r.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");B()(n.split(/\s+/),(function(n){Q()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),$().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,B()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){H()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){B()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};G()(e,t),R()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(M());function J(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(J=function(){return!!e})()}e=n.hmd(e);var K=function(e){function t(e){var n,r,s,c,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,o.A)(this,t),r=this,s=t,c=[e,{compName:"box-model"}],s=(0,a.A)(s),(n=(0,i.A)(r,J()?Reflect.construct(s,c||[],(0,a.A)(r).constructor):s.apply(r,c))).initOptions(l),n.options.element&&n.render(),n.bindEvent(),n}return(0,s.A)(t,e),(0,r.A)(t,[{key:"bindEvent",value:function(){var e=this;this.on("changeOption",(function(t){if("element"===t)e.render()}))}},{key:"render",value:function(){var e=this,t=this.c,n=this.$container,o=this.getBoxModelData();n.html([o.position?'
'):"",o.position?'
position
').concat(o.position.top,'

').concat(o.position.left,"
"):"",'
'),'
margin
').concat(o.margin.top,'

').concat(o.margin.left,"
"),'
'),'
border
').concat(o.border.top,'

').concat(o.border.left,"
"),'
'),'
padding
').concat(o.padding.top,'

').concat(o.padding.left,"
"),'
'),"".concat(o.content.width," × ").concat(o.content.height,""),"
",'
').concat(o.padding.right,'

').concat(o.padding.bottom,"
"),"
",'
').concat(o.border.right,'

').concat(o.border.bottom,"
"),"
",'
').concat(o.margin.right,'

').concat(o.margin.bottom,"
"),"
",o.position?'
').concat(o.position.right,'

').concat(o.position.bottom,"
"):"",o.position?"
":""].join(""));var r=this.find(".margin"),i=this.find(".border"),a=this.find(".padding"),s=this.find(".content"),c=function(){r.addClass(t("highlighted")),i.addClass(t("highlighted")),a.addClass(t("highlighted")),s.addClass(t("highlighted"))};c();var l=function(n){var o;switch(e.find(".highlighted").rmClass(t("highlighted")),n){case"margin":o=r;break;case"border":o=i;break;case"padding":o=a;break;default:o=s}o.addClass(t("highlighted")),e.emit("highlight",n)},u=v()(l,this,"margin"),d=v()(l,this,"border"),h=v()(l,this,"padding"),f=v()(l,this,"content");r.on("mouseenter",u).on("mouseleave",(function(){c(),e.emit("highlight","all")})),i.on("mouseenter",d).on("mouseleave",u),a.on("mouseenter",h).on("mouseleave",d),s.on("mouseenter",f).on("mouseleave",h)}},{key:"getBoxModelData",value:function(){var e=this.options.element,t=window.getComputedStyle(e);function n(e){var n=["top","left","right","bottom"];return"position"!==e&&(n=l()(n,(function(t){return"".concat(e,"-").concat(t)}))),"border"===e&&(n=l()(n,(function(e){return"".concat(e,"-width")}))),{top:V(t[n[0]],e),left:V(t[n[1]],e),right:V(t[n[2]],e),bottom:V(t[n[3]],e)}}var o,r,i,a,s,c,u={margin:n("margin"),border:n("border"),padding:n("padding"),content:(o=e,r=window.getComputedStyle(o),i=O(r.paddingLeft)+O(r.paddingRight),a=O(r.paddingTop)+O(r.paddingBottom),s=O(r.borderLeftWidth)+O(r.borderRightWidth),c=O(r.borderTopWidth)+O(r.borderBottomWidth),{width:V(o.offsetWidth-i-s),height:V(o.offsetHeight-a-c)})};return"static"!==t.position&&(u.position=n("position")),u}}])}(W);function V(e,t){if(d()(e))return e;if(!f()(e))return"‒";var n=O(e);return isNaN(n)?e:"position"===t?n:0===n?"‒":n}(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,K)},162:function(e,t){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],o=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&o>=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,r,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(e){r={error:e}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return a},r=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var o,r=0,i=t.length;rn&&(e=n),e},t.adoptStyleSheet=c},187:function(e,t,n){(t=n(6314)(!1)).push([e.id,'.luna-setting{min-width:320px;color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));background-color:rgba(0,0,0,0);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-family:var(--luna-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px}.luna-setting .luna-setting-hidden,.luna-setting.luna-setting-hidden{display:none}.luna-setting .luna-setting-invisible,.luna-setting.luna-setting-invisible{visibility:hidden}.luna-setting *{box-sizing:border-box}.luna-setting.luna-setting-theme-dark{color-scheme:dark;color:hsla(0,0%,100%,.85);color:var(--luna-color-text-dark,rgba(255,255,255,.85));background-color:rgba(0,0,0,0)}.luna-setting-item.luna-setting-selected:focus{outline:1px solid}.luna-setting-item .luna-setting-title{line-height:1.4em;font-weight:600}.luna-setting-item .luna-setting-description,.luna-setting-item.luna-setting-item-markdown{line-height:1.4em}.luna-setting-item .luna-setting-description *,.luna-setting-item.luna-setting-item-markdown *{margin:0}.luna-setting-item .luna-setting-description strong,.luna-setting-item.luna-setting-item-markdown strong{font-weight:600}.luna-setting-item .luna-setting-description a,.luna-setting-item.luna-setting-item-markdown a{background-color:rgba(0,0,0,0);text-decoration:none}.luna-setting-item .luna-setting-control,.luna-setting-item .luna-setting-description{font-size:12px}.luna-setting-item .luna-setting-description{margin-bottom:8px}.luna-setting-item .luna-setting-control{display:flex;align-items:center}.luna-setting-item-button,.luna-setting-item-checkbox,.luna-setting-item-input,.luna-setting-item-markdown,.luna-setting-item-number,.luna-setting-item-select,.luna-setting-item-title{padding:10px}.luna-setting-item-title{font-weight:600}.luna-setting-item-title.luna-setting-level-1{font-size:18px}.luna-setting-item-title.luna-setting-level-2{font-size:16px}.luna-setting-item-title.luna-setting-level-3{font-size:14px}.luna-setting-item-input.luna-setting-disabled input{opacity:.6}.luna-setting-item-input input{-webkit-tap-highlight-color:transparent;color:rgba(0,0,0,.88);-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid;outline:0;padding:2px 8px;border-radius:2px;font-size:14px;width:100%}.luna-setting-item-number.luna-setting-disabled .luna-setting-range-container,.luna-setting-item-number.luna-setting-disabled input{opacity:.6}.luna-setting-item-number.luna-setting-disabled .luna-setting-range-container input{opacity:1}.luna-setting-item-number input[type=number]{-webkit-tap-highlight-color:transparent;color:rgba(0,0,0,.88);-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid;outline:0;padding:2px 8px;border-radius:2px;font-size:14px;width:200px;padding:2px}.luna-setting-item-number .luna-setting-range-container{flex:2;position:relative;top:1px}.luna-setting-item-number .luna-setting-range-container .luna-setting-range-track{height:4px;width:100%;padding:0 10px;position:absolute;left:0;top:4px}.luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar{border-radius:2px;overflow:hidden;width:100%;height:4px}.luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar .luna-setting-range-track-progress{height:100%;width:50%}.luna-setting-item-number .luna-setting-range-container input{-webkit-appearance:none;background:rgba(0,0,0,0);height:4px;width:100%;position:relative;top:-3px;margin:0 auto;outline:0;border-radius:2px}.luna-setting-item-number .luna-setting-range-container input::-webkit-slider-thumb{-webkit-appearance:none;position:relative;top:0;z-index:1;width:16px;border:none;height:16px;border-radius:10px;border:1px solid}.luna-setting-item-checkbox.luna-setting-disabled .luna-setting-control{opacity:.6}.luna-setting-item-checkbox input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border:1px solid;border-radius:0;position:relative;outline:0;margin-left:0;margin-right:8px;transition:background-color .1s;align-self:flex-start;flex-shrink:0}.luna-setting-item-checkbox input:checked:after{content:"";width:100%;height:100%;position:absolute;left:0;top:0;background-image:url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzMwMHB4JyB3aWR0aD0nMzAwcHgnICBmaWxsPSIjZmZmZmZmIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4PSIwcHgiIHk9IjBweCI+PHRpdGxlPmljb25fYnlfUG9zaGx5YWtvdjEwPC90aXRsZT48ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz48ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48ZyBmaWxsPSIjZmZmZmZmIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNi4wMDAwMDAsIDI2LjAwMDAwMCkiPjxwYXRoIGQ9Ik0xNy45OTk5ODc4LDMyLjQgTDEwLjk5OTk4NzgsMjUuNCBDMTAuMjI2Nzg5MSwyNC42MjY4MDE0IDguOTczMTg2NDQsMjQuNjI2ODAxNCA4LjE5OTk4Nzc5LDI1LjQgTDguMTk5OTg3NzksMjUuNCBDNy40MjY3ODkxNCwyNi4xNzMxOTg2IDcuNDI2Nzg5MTQsMjcuNDI2ODAxNCA4LjE5OTk4Nzc5LDI4LjIgTDE2LjU4NTc3NDIsMzYuNTg1Nzg2NCBDMTcuMzY2ODIyOCwzNy4zNjY4MzUgMTguNjMzMTUyOCwzNy4zNjY4MzUgMTkuNDE0MjAxNCwzNi41ODU3ODY0IEw0MC41OTk5ODc4LDE1LjQgQzQxLjM3MzE4NjQsMTQuNjI2ODAxNCA0MS4zNzMxODY0LDEzLjM3MzE5ODYgNDAuNTk5OTg3OCwxMi42IEw0MC41OTk5ODc4LDEyLjYgQzM5LjgyNjc4OTEsMTEuODI2ODAxNCAzOC41NzMxODY0LDExLjgyNjgwMTQgMzcuNzk5OTg3OCwxMi42IEwxNy45OTk5ODc4LDMyLjQgWiI+PC9wYXRoPjwvZz48L2c+PC9nPjwvc3ZnPg==);background-size:30px;background-repeat:no-repeat;background-position:center}.luna-setting-item-checkbox label{-webkit-tap-highlight-color:transparent}.luna-setting-item-checkbox label *{margin:0}.luna-setting-item-select.luna-setting-disabled .luna-setting-select{opacity:.6}.luna-setting-item-select .luna-setting-select{position:relative}.luna-setting-item-select .luna-setting-select select{margin:0;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid;padding:2px 8px;padding-right:18px;outline:0;border-radius:2px;-webkit-tap-highlight-color:transparent}.luna-setting-item-select .luna-setting-select:after{content:"";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;position:absolute;top:0;bottom:0;right:6px;margin:auto;pointer-events:none}.luna-setting-item-select .luna-setting-select select{width:300px}.luna-setting-item-button button{-webkit-tap-highlight-color:transparent;border:1px solid;padding:2px 8px;font-size:14px;border-radius:2px}.luna-setting-item-button button:active{border:1px solid}.luna-setting-item-separator{border-bottom:1px solid}.luna-setting-theme-light .luna-setting-item.luna-setting-selected,.luna-setting-theme-light .luna-setting-item:hover{background-color:rgba(0,0,0,.06);background-color:var(--luna-color-fill-secondary,rgba(0,0,0,.06))}.luna-setting-theme-light .luna-setting-item.luna-setting-selected:focus{outline-color:#1a73e8;outline-color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item .luna-setting-description a,.luna-setting-theme-light .luna-setting-item.luna-setting-item-markdown a{color:#1a73e8;color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item-separator{border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-input input{background-color:#fff;background-color:var(--luna-color-bg-container,#fff);color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-checkbox input{border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-checkbox input:checked{background-color:#1a73e8;background-color:var(--luna-color-primary,#1a73e8);border-color:#1a73e8;border-color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item-select .luna-setting-select select{background-color:#fff;background-color:var(--luna-color-bg-container,#fff);color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-select .luna-setting-select:after{border-top-color:rgba(0,0,0,.88);border-top-color:var(--luna-color-text,rgba(0,0,0,.88))}.luna-setting-theme-light .luna-setting-item-button button{background-color:#fff;background-color:var(--luna-color-bg-container,#fff);border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9);color:#1a73e8;color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item-button button:active,.luna-setting-theme-light .luna-setting-item-button button:hover{background-color:rgba(0,0,0,.06);background-color:var(--luna-color-fill-secondary,rgba(0,0,0,.06))}.luna-setting-theme-light .luna-setting-item-button button:active{border-color:#1a73e8;border-color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item-number input[type=number]{background-color:#fff;background-color:var(--luna-color-bg-container,#fff);color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar{background-color:#d9d9d9;background-color:var(--luna-color-border,#d9d9d9)}.luna-setting-theme-light .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar .luna-setting-range-track-progress{background-color:#1a73e8;background-color:var(--luna-color-primary,#1a73e8)}.luna-setting-theme-light .luna-setting-item-number .luna-setting-range-container input::-webkit-slider-thumb{border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9);background:radial-gradient(circle at center,#eee 0,#eee 15%,#fff 22%,#fff 100%)}.luna-setting-theme-dark .luna-setting-item.luna-setting-selected,.luna-setting-theme-dark .luna-setting-item:hover{background-color:hsla(0,0%,100%,.12);background-color:var(--luna-color-fill-secondary,rgba(255,255,255,.12))}.luna-setting-theme-dark .luna-setting-item.luna-setting-selected:focus{outline-color:#1965c8;outline-color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item .luna-setting-description a,.luna-setting-theme-dark .luna-setting-item.luna-setting-item-markdown a{color:#1965c8;color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item-separator{border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-input input{background-color:#141414;background-color:var(--luna-color-bg-container,#141414);color:hsla(0,0%,100%,.85);color:var(--luna-color-text,rgba(255,255,255,.85));border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-checkbox input{border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-checkbox input:checked{background-color:#1965c8;background-color:var(--luna-color-primary,#1965c8);border-color:#1965c8;border-color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item-select .luna-setting-select select{background-color:#141414;background-color:var(--luna-color-bg-container,#141414);color:hsla(0,0%,100%,.85);color:var(--luna-color-text,rgba(255,255,255,.85));border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-select .luna-setting-select:after{border-top-color:hsla(0,0%,100%,.85);border-top-color:var(--luna-color-text,rgba(255,255,255,.85))}.luna-setting-theme-dark .luna-setting-item-button button{background-color:#141414;background-color:var(--luna-color-bg-container,#141414);border-color:#424242;border-color:var(--luna-color-border,#424242);color:#1965c8;color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item-button button:active,.luna-setting-theme-dark .luna-setting-item-button button:hover{background-color:hsla(0,0%,100%,.12);background-color:var(--luna-color-fill-secondary,rgba(255,255,255,.12))}.luna-setting-theme-dark .luna-setting-item-button button:active{border-color:#1965c8;border-color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item-number input[type=number]{background-color:#141414;background-color:var(--luna-color-bg-container,#141414);color:hsla(0,0%,100%,.85);color:var(--luna-color-text,rgba(255,255,255,.85));border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar{background-color:#424242;background-color:var(--luna-color-border,#424242)}.luna-setting-theme-dark .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar .luna-setting-range-track-progress{background-color:#1965c8;background-color:var(--luna-color-primary,#1965c8)}.luna-setting-theme-dark .luna-setting-item-number .luna-setting-range-container input::-webkit-slider-thumb{border-color:#424242;border-color:var(--luna-color-border,#424242);background:radial-gradient(circle at center,#aaa 0,#aaa 15%,#ccc 22%,#ccc 100%)}',""]),e.exports=t},199:function(e,t,n){var o=n(3089),r=n(7468);t=function(e){return e=o({},e),function(t){return r(t,e)}},e.exports=t},282:function(e,t,n){var o=n(438),r=n(9405),i=n(3915),a=n(769);t=function(e){var t=a(e.match(s));return o(i(t,(function(e){return r(e)})))};var s=/((https?)|(ftp)):\/\/[\w.]+[^ \f\n\r\t\v"\\<>[\]\u2100-\uFFFF(),]*/gi;e.exports=t},311:function(e,t,n){var o=n(3957),r=n(9993),i=n(5651),a=n(9760),s=n(7257);function c(e,t,n,r){return o(t)&&(r=n,n=t,t={}),{url:e,data:t,success:n,dataType:r}}(t=function(e){i(e,t.setting);var n,o=e.type,c=e.url,l=e.data,u=e.dataType,d=e.success,h=e.error,f=e.timeout,p=e.complete,v=e.xhr();return v.onreadystatechange=function(){if(4===v.readyState){var e;clearTimeout(n);var t=v.status;if(t>=200&&t<300||304===t){e=v.responseText,"xml"===u&&(e=v.responseXML);try{"json"===u&&(e=JSON.parse(e))}catch(e){}d(e,v)}else h(v);p(v)}},"GET"===o?(l=s.stringify(l))&&(c+=c.indexOf("?")>-1?"&"+l:"?"+l):"application/x-www-form-urlencoded"===e.contentType?a(l)&&(l=s.stringify(l)):"application/json"===e.contentType&&a(l)&&(l=JSON.stringify(l)),v.open(o,c,!0),v.setRequestHeader("Content-Type",e.contentType),f>0&&(n=setTimeout((function(){v.onreadystatechange=r,v.abort(),h(v,"timeout"),p(v)}),f)),v.send("GET"===o?null:l),v}).setting={type:"GET",success:r,error:r,complete:r,dataType:"json",contentType:"application/x-www-form-urlencoded",data:{},xhr:function(){return new XMLHttpRequest},timeout:0},t.get=function(){return t(c.apply(null,arguments))},t.post=function(){var e=c.apply(null,arguments);return e.type="POST",t(e)},e.exports=t},365:function(e,t){var n=Object.prototype.hasOwnProperty;t=function(e,t){return n.call(e,t)},e.exports=t},383:function(e,t,n){var o=n(3497),r=n(1849),i=n(1009),a=n(96);t=function(e,t){for(var n,r=[],h=e;e;){if(n=!0,o(r)&&d[o(r)]){var f=new RegExp("]*>")).exec(e);if(f){var p=e.substring(0,f.index);e=e.substring(f.index+f[0].length),p&&t.text&&t.text(p)}_("",o(r))}else{if(i(e,"\x3c!--")){var v=e.indexOf("--\x3e");v>=0&&(t.comment&&t.comment(e.substring(4,v)),e=e.substring(v+3),n=!1)}else if(i(e,"=0&&r[o]!==n;o--);else o=0;if(o>=0){for(var i=r.length-1;i>=o;i--)t.end&&t.end(r[i]);r.length=o}}_()};var s=/^\s]+))?)*)\s*(\/?)>/i,c=/^<\/([-A-Za-z0-9_]+)[^>]*>/,l=/^<([-A-Za-z0-9_]+)((?:\s+[-A-Za-z0-9_:@.]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/i,u=/([-A-Za-z0-9_:@.]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,d=r("script,style".split(","));e.exports=t},387:function(e,t,n){var o=n(6833);function r(e,t){this[t]=e.replace(/\w/,(function(e){return e.toUpperCase()}))}t=function(e){var t=o(e),n=t[0];return t.shift(),t.forEach(r,t),n+=t.join("")},e.exports=t},388:function(e,t,n){"use strict";n.d(t,{A:function(){return r}});var o=n(2284);function r(e,t){if(t&&("object"==(0,o.A)(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}},438:function(e,t,n){var o=n(2571);function r(e,t){return e===t}t=function(e,t){return t=t||r,o(e,(function(e,n,o){for(var r=o.length;++n0&&r[r.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]A&&xw,S=f-y;S=(0,c.constrainNumber)(S,m,r-p-m);var E=o.minY-g-v,T=!0;E<0?(E=Math.min(i-v,o.maxY+g),T=!1):o.minY>i&&(E=i-g-v);var N=S>=o.minX&&S+p<=o.maxX&&E>=o.minY&&E+v<=o.maxY,O=So.minX&&Eo.minY;if(O&&!N)return void(d.style.display="none");if(d.style.top=E+"px",d.style.left=S+"px",C)return;var j=(0,c.createChild)(d,"div","tooltip-arrow");j.style.clipPath=T?"polygon(0 0, 100% 0, 50% 100%)":"polygon(50% 0, 0 100%, 100% 100%)",j.style.top=(T?v-1:-g)+"px",j.style.left=f-S+"px"}(this.tooltip,e.elementInfo,e.colorFormat,t,this.canvasWidth,this.canvasHeight)),this.context.restore(),{bounds:t}},t.prototype.drawAxis=function(e,t,n){e.save();var o=this.pageZoomFactor*this.pageScaleFactor*this.emulationScaleFactor,r=this.scrollX*this.pageScaleFactor,i=this.scrollY*this.pageScaleFactor;function a(e){return Math.round(e*o)}function s(e){return Math.round(e/o)}var c=this.canvasWidth/o,l=this.canvasHeight/o,u=50;e.save(),e.fillStyle=f,n?e.fillRect(0,a(l)-15,a(c),a(l)):e.fillRect(0,0,a(c),15),e.globalCompositeOperation="destination-out",e.fillStyle="red",t?e.fillRect(a(c)-15,0,a(c),a(l)):e.fillRect(0,0,15,a(l)),e.restore(),e.fillStyle=f,t?e.fillRect(a(c)-15,0,a(c),a(l)):e.fillRect(0,0,15,a(l)),e.lineWidth=1,e.strokeStyle=h,e.fillStyle=h,e.save(),e.translate(-r,.5-i);for(var p=l+s(i),v=100;v1&&o--,r=6*o<1?l+6*(t-l)*o:2*o<1?t:3*o<2?l+(t-l)*(2/3-o)*6:l,c[u]=n(255*r);return c};var n=Math.round;e.exports=t},961:function(e,t,n){var o=n(5693);t=function(e,t,n){var r=[];t=o(t,n);for(var i=-1,a=e.length;++i-1&&this._listeners.splice(t,1)},rmAllListeners:function(){this._listeners=[]},emit:function(){var e=this,t=a(arguments),n=r(this._listeners);i(n,(function(n){return n.apply(e,t)}),this)}},{mixin:function(e){i(["addListener","rmListener","emit","rmAllListeners"],(function(n){e[n]=t.prototype[n]})),e._listeners=e._listeners||[]}}),e.exports=t},1034:function(e,t,n){var o=n(9760),r=n(3957),i=n(6214),a=n(5154);t=function(e){return i(e)?e.map((function(e){return t(e)})):o(e)&&!r(e)?a(e,(function(e){return t(e)})):e},e.exports=t},1107:function(e,t,n){(t=n(6314)(!1)).push([e.id,"@font-face{font-family:luna-text-viewer-icon;src:url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAS0AAsAAAAAB2QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAFQAAAB0INElr09TLzIAAAFcAAAAPQAAAFZL+0klY21hcAAAAZwAAACfAAACEAEewxRnbHlmAAACPAAAAIYAAACkNSDggmhlYWQAAALEAAAALgAAADZzrb4oaGhlYQAAAvQAAAAWAAAAJAGRANNobXR4AAADDAAAABAAAAAoAZAAAGxvY2EAAAMcAAAAEAAAABYBWgFIbWF4cAAAAywAAAAdAAAAIAEXADtuYW1lAAADTAAAASkAAAIWm5e+CnBvc3QAAAR4AAAAOwAAAFJIWdOleJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBWAdNMDGwMQkAWK1CGlYEZyGMCstiBMpxAUUYGZgDbGgXDeJxjYGTQYJzAwMrAwFDH0AMkZaB0AgMngzEDAxMDKzMDVhCQ5prCcIAh+SMTwwkgVwhMMjAwgggAY84IrgAAAHicvZFLCsMwDERHzsdJ6aL0HD1VQiDQRbIN9Axd9aI+QTpjq5Bdd5F4Bo1lybIBNAAq8iA1YB8YZG+qlvUKl6zXGBjf6MofMWHGEyu2FPb9oCxULCtHs3yy+J2urg1rtojo0HM/MKnFGabOGlbdYvdT+1N6/7drXl8e6Vajo3efHP3b7HAUvntBMy1OJKujMTeHNZMV9McpFBC+tLgY4QB4nGNgZACBEwzrGdgZGOwZxdnVDdXNPfKEGlhchO0KhZtZ3IQYmMFq1jCsZpBi0GLQY2AwNzGzZjQSk2UUYdNmVFID8UyVRUXYlNRMlVGlTM1FjU3tmZkTmVhYmFRBhHwoCyuzKgtTIjMzWJg3ZClIGMRlZQmVB7GhMixM0aGhQIsB52sTqgAAeJxjYGRgYADi2JNxkvH8Nl8ZuBlOAAWiOB/va0DQQHCCYT2Q5GBgAnEANJ0KnQAAeJxjYGRgYDjBwIBEMjKgAi4AOvoCZQAAeJxjYACCE1CMBwAAM7gBkXicY2AAAiGGIFQIABXIAqN4nGNgZGBg4GLQZ2BmAAEmMI8LSP4H8xkADjQBUwAAAHicZZA9bsJAFITHYEgCUoIUKSmzVQoimZ+SA0BPQZfCmLUxsr3WekGiywlyhBwhp4hyghwoY/NoYC0/fzNv3u7KAAb4hYd6ebhtar1auKE6cZv0IOyTn4U76ONFuEt/KNzDG6bCfTzinTt4/h2dAUrhFu7xIdym/ynsk7+EO3jCt3CX/o9wDyv8Cffx6g3TyBSxKdxSJ/sstGd5/q60rVJTqEkwPlsLXWgbOr1R66OqDsnUuVjF1uRqzq7OMqNKa3Y6csHWuXI2GsXiB5HJkSKCQYG4qQ5LaCTYI0MIe9W91CumLSr6tVaYIMD4KrVgqmiSIZXGhsk1jqwVDjxtStcxrfhazuSkucxq3iQjK/7vurejE9EPsG2mSsww4hNf5IPmDvk/PRFeqAAAAHicXcU7CsAgFEXBe4x/l/kQBAtt3X0KSZNpRk7X91/F8eAJRBKZQqUp2Og2va19MAadyWJzpBd4kgcWAA==') format('woff')}[class*=' luna-text-viewer-icon-'],[class^=luna-text-viewer-icon-]{display:inline-block;font-family:luna-text-viewer-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.luna-text-viewer-icon-check:before{content:'\\f101'}.luna-text-viewer-icon-copy:before{content:'\\f102'}.luna-text-viewer{color:#333;background-color:#fff;font-family:Arial,Helvetica,sans-serif;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px;padding:0;unicode-bidi:embed;position:relative;overflow:auto;border:1px solid #ccc}.luna-text-viewer.luna-text-viewer-platform-windows{font-family:'Segoe UI',Tahoma,sans-serif}.luna-text-viewer.luna-text-viewer-platform-linux{font-family:Roboto,Ubuntu,Arial,sans-serif}.luna-text-viewer .luna-text-viewer-hidden,.luna-text-viewer.luna-text-viewer-hidden{display:none}.luna-text-viewer .luna-text-viewer-invisible,.luna-text-viewer.luna-text-viewer-invisible{visibility:hidden}.luna-text-viewer *{box-sizing:border-box}.luna-text-viewer.luna-text-viewer-theme-dark{color:#d9d9d9;border-color:#3d3d3d;background:#242424}.luna-text-viewer:hover .luna-text-viewer-copy{opacity:1}.luna-text-viewer-table{display:table}.luna-text-viewer-table .luna-text-viewer-line-number,.luna-text-viewer-table .luna-text-viewer-line-text{padding:0}.luna-text-viewer-table-row{display:table-row}.luna-text-viewer-line-number{display:table-cell;padding:0 3px 0 8px!important;text-align:right;vertical-align:top;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-right:1px solid #ccc}.luna-text-viewer-line-text{display:table-cell;padding-left:4px!important;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.luna-text-viewer-copy{background:#fff;opacity:0;position:absolute;right:5px;top:5px;border:1px solid #ccc;border-radius:4px;width:25px;height:25px;text-align:center;line-height:25px;cursor:pointer;transition:opacity .3s,top .3s}.luna-text-viewer-copy .luna-text-viewer-icon-check{color:#188037}.luna-text-viewer-text{padding:4px;font-size:12px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;box-sizing:border-box;white-space:pre;display:block}.luna-text-viewer-text.luna-text-viewer-line-numbers{padding:0}.luna-text-viewer-text.luna-text-viewer-wrap-long-lines{white-space:pre-wrap}.luna-text-viewer-text.luna-text-viewer-wrap-long-lines .luna-text-viewer-line-text{word-break:break-all}.luna-text-viewer-theme-dark{color-scheme:dark}.luna-text-viewer-theme-dark .luna-text-viewer-copy,.luna-text-viewer-theme-dark .luna-text-viewer-line-number{border-color:#3d3d3d}.luna-text-viewer-theme-dark .luna-text-viewer-copy .luna-text-viewer-icon-check{color:#81c995}.luna-text-viewer-theme-dark .luna-text-viewer-copy{background-color:#242424}",""]),e.exports=t},1162:function(e,t,n){"use strict";n.d(t,{Ay:function(){return ve}});var o=n(991),r=n(3029),i=n(2901),a=n(388),s=n(3954),c=n(5361),l=n(3693),u=n.n(l),d=n(5241),h=n.n(d),f=n(5902),p=n.n(f),v=n(5630),g=n.n(v),m=n(9760),b=n.n(m),y=n(5651),A=n.n(y),w=n(3915),_=n.n(w),x=n(6030),k=n.n(x),C=n(2561),S=n.n(C),E=n(3957),T=n.n(E),N=n(3497),O=n.n(N),j=n(1976),M=n.n(j),I=n(1738),z=n.n(I),D=n(9405),B=n.n(D),F=n(3249),R=n.n(F),L=n(96),G=n.n(L),P=n(4236),H=n.n(P),Y=n(9100),$=n.n(Y);var q=n(2263),Q=n.n(q),U=n(5169),W=n.n(U),J=n(9548),K=n.n(J),V=(n(6097),n(5004)),Z=n.n(V);n(9410),n(8609);function X(e){var t="luna-".concat(e,"-");function n(e){return _()(B()(e).split(/\s+/),(function(e){return R()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=K().parse(e);return ee(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),K().stringify(t)}catch(t){return n(e)}return n(e)}}function ee(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,d=void 0===l?"light":l;return(0,r.A)(this,t),o=function(e,t,n){return t=(0,s.A)(t),(0,a.A)(e,le()?Reflect.construct(t,n||[],(0,s.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=c,o.c=X(c),o.options={},o.container=e,o.$container=u()(e),o.$container.addClass(["luna-".concat(c),o.c("platform-".concat((i=Z()(),"os x"===i?"mac":i)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=ae().get()),o.setTheme(n),$()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),ae().on("change",o.onThemeChange),o.setOption("theme",d),o}return(0,c.A)(t,e),(0,i.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");$()(n.split(/\s+/),(function(n){ce()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),ae().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,$()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){re()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){$()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};A()(e,t),ne()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(Q()),de=function(e,t,n){return((e-t)/(n-t)*100).toFixed(2)};function he(e,t,n,r){var i=(0,o.A)((0,s.A)(1&r?e.prototype:e),t,n);return 2&r&&"function"==typeof i?function(e){return i.apply(n,e)}:i}function fe(e,t,n){return t=(0,s.A)(t),(0,a.A)(e,pe()?Reflect.construct(t,n||[],(0,s.A)(e).constructor):t.apply(e,n))}function pe(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(pe=function(){return!!e})()}e=n.hmd(e);var ve=function(e){function t(e){var n,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,r.A)(this,t),(n=fe(this,t,[e,{compName:"setting"},o])).items=[],n.selectedItem=null,n.initOptions(o,{separatorCollapse:!0,filter:""}),n.bindEvent(),n}return(0,c.A)(t,e),(0,i.A)(t,[{key:"appendTitle",value:function(e){var t=new me(this,e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:1);return this.append(t),t}},{key:"appendSeparator",value:function(){var e=this.items,t=this.options.separatorCollapse,n=O()(e);if(t&&n instanceof ye)return n;var o=new ye(this);return this.append(o),o}},{key:"appendNumber",value:function(e,t,n,o,r){b()(o)&&(r=o,o="");var i=new we(this,e,t,n,o,r);return this.append(i),i}},{key:"appendButton",value:function(e,t,n){T()(t)&&(n=t,t="");var o=new ke(this,e,t,n);return this.append(o),o}},{key:"appendHtml",value:function(e){var t=new Ce(this,e);return this.append(t),t}},{key:"appendMarkdown",value:function(e){var t=new be(this,e);return this.append(t),t}},{key:"appendInput",value:function(e,t,n){var o=new Ae(this,e,t,n,arguments.length>3&&void 0!==arguments[3]?arguments[3]:"");return this.append(o),o}},{key:"appendCheckbox",value:function(e,t,n,o){o||(o=n,n="");var r=new _e(this,e,t,n,o);return this.append(r),r}},{key:"appendSelect",value:function(e,t,n,o,r){b()(o)&&(r=o,o="");var i=new xe(this,e,t,n,o,r);return this.append(i),i}},{key:"remove",value:function(e){var t=this.items,n=t.indexOf(e);n>-1&&(e.detach(),t.splice(n,1),e===this.selectedItem&&this.selectItem(null))}},{key:"clear",value:function(){$()(this.items,(function(e){return e.detach()})),this.items=[],this.selectItem(null)}},{key:"selectItem",value:function(e){var t;(this.selectedItem&&(this.selectedItem.deselect(),this.selectedItem=null),H()(e))||(this.selectedItem=e,null===(t=this.selectedItem)||void 0===t||t.select())}},{key:"renderSettings",value:function(){var e=this,t=this.items;$()(t,(function(e){return e.detach()})),$()(t,(function(t){e.filterItem(t)&&e.$container.append(t.container)}))}},{key:"bindEvent",value:function(){var e=this,t=this.c;this.on("changeOption",(function(t){if("filter"===t)e.renderSettings()}));var n=this;this.$container.on("click",t(".item"),(function(){n.selectItem(this.settingItem)}))}},{key:"filterItem",value:function(e){var t=this.options.filter;if(t){if(T()(t))return t(e);if(M()(t))return t.test(e.text());if(z()(t)&&(t=B()(t)))return R()(G()(e.text()),G()(t))}return!0}},{key:"append",value:function(e){this.items.push(e),this.filterItem(e)&&this.$container.append(e.container)}}])}(ue),ge=function(){return(0,i.A)((function e(t,n,o,i){(0,r.A)(this,e),this.container=h()("div",{tabindex:"0"}),this.setting=t,this.container.settingItem=this,this.$container=u()(this.container),this.$container.addClass(t.c("item")).addClass(t.c("item-".concat(i))),this.key=n,this.value=o}),[{key:"select",value:function(){this.$container.addClass(this.setting.c("selected"))}},{key:"deselect",value:function(){this.$container.rmClass(this.setting.c("selected"))}},{key:"detach",value:function(){this.$container.remove()}},{key:"disable",value:function(){this.$container.addClass(this.setting.c("disabled"))}},{key:"enable",value:function(){this.$container.rmClass(this.setting.c("disabled"))}},{key:"text",value:function(){return this.$container.text()}},{key:"onChange",value:function(e){this.value!==e&&(this.setting.emit("change",this.key,e,this.value),this.value=e)}}])}(),me=function(e){function t(e,n,o){var i;return(0,r.A)(this,t),(i=fe(this,t,[e,"","","title"])).$container.addClass(e.c("level-".concat(o))),i.$container.text(n),i}return(0,c.A)(t,e),(0,i.A)(t)}(ge),be=function(e){function t(e,n){var o;return(0,r.A)(this,t),(o=fe(this,t,[e,"","","markdown"])).$container.html(n),o}return(0,c.A)(t,e),(0,i.A)(t)}(ge),ye=function(e){function t(e){return(0,r.A)(this,t),fe(this,t,[e,"","","separator"])}return(0,c.A)(t,e),(0,i.A)(t)}(ge),Ae=function(e){function t(e,n,o,i,a){var s;(0,r.A)(this,t),s=fe(this,t,[e,n,o,"input"]);var c=e.c;s.$container.html('
').concat(p()(i),'
\n
').concat(a,'
\n
\n \n
'));var l=s.$container.find("input");return l.val(o),l.on("change",(function(){return s.onChange(l.val())})),s.$input=l,s}return(0,c.A)(t,e),(0,i.A)(t,[{key:"setValue",value:function(e){this.$input.val(e),this.value=e}},{key:"disable",value:function(){he(t,"disable",this,3)([]),this.$input.attr("disabled","")}},{key:"enable",value:function(){he(t,"enable",this,3)([]),this.$input.rmAttr("disabled")}}])}(ge),we=function(e){function t(e,n,o,i,a){var s,c=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{};(0,r.A)(this,t),(s=fe(this,t,[e,n,o,"number"])).renderRange=function(){var e=k()(s.$input.val()),t=s.options;s.$trackProgress.css("width",de(e,t.min,t.max)+"%"),s.$value.text(S()(e))},A()(c,{min:0,max:10,step:1}),s.options=c;var l=s.$container,u=e.c,d=!!c.range;delete c.range;var h=c.min,f=c.max,v='");d&&(v="".concat(h,'
\n
\n
\n
\n
\n
\n ').concat(v,'\n
').concat(o,"/").concat(f)),l.html('
').concat(p()(i),'
\n
').concat(a,'
\n
').concat(v,"
"));var g=l.find("input");return s.$value=l.find(u(".value")),s.$trackProgress=l.find(u(".range-track-progress")),g.val(S()(o)),g.on("change",(function(){var e=k()(g.val());s.onChange(e)})),g.on("input",s.renderRange),s.$input=g,s}return(0,c.A)(t,e),(0,i.A)(t,[{key:"setValue",value:function(e){this.$input.val(S()(e)),this.value=e,this.renderRange()}},{key:"disable",value:function(){he(t,"disable",this,3)([]),this.$input.attr("disabled","")}},{key:"enable",value:function(){he(t,"enable",this,3)([]),this.$input.rmAttr("disabled")}}])}(ge),_e=function(e){function t(e,n,o,i,a){var s;(0,r.A)(this,t),s=fe(this,t,[e,n,o,"checkbox"]);var c=e.c,l=g()(e.c("checkbox-"));s.$container.html('
').concat(p()(i),'
\n
\n \n \n
"));var u=s.$container.find("input"),d=u.get(0);return d.checked=o,u.on("change",(function(){return s.onChange(d.checked)})),s.$input=u,s.input=d,s}return(0,c.A)(t,e),(0,i.A)(t,[{key:"setValue",value:function(e){this.input.checked=e,this.value=e}},{key:"disable",value:function(){he(t,"disable",this,3)([]),this.$input.attr("disabled","")}},{key:"enable",value:function(){he(t,"enable",this,3)([]),this.$input.rmAttr("disabled")}}])}(ge),xe=function(e){function t(e,n,o,i,a,s){var c;(0,r.A)(this,t),c=fe(this,t,[e,n,o,"select"]);var l=e.c;c.$container.html('
').concat(p()(i),'
\n
').concat(a,'
\n
\n
\n \n
\n
'));var u=c.$container.find("select");return c.$select=u,c.setOptions(s),u.on("change",(function(){return c.onChange(u.val())})),c}return(0,c.A)(t,e),(0,i.A)(t,[{key:"setValue",value:function(e){this.$select.val(e),this.value=e}},{key:"setOptions",value:function(e){var t=this;this.$select.html(_()(e,(function(e,n){return'")})).join(""))}},{key:"disable",value:function(){he(t,"disable",this,3)([]),this.$select.attr("disabled","")}},{key:"enable",value:function(){he(t,"enable",this,3)([]),this.$select.rmAttr("disabled")}}])}(ge),ke=function(e){function t(e,n,o,i){var a;return(0,r.A)(this,t),o||(o=n,n=""),(a=fe(this,t,[e,"","","button"])).$container.html(e.c('
'.concat(p()(n),'
\n
\n \n
"))),a.$container.find("button").on("click",i),a}return(0,c.A)(t,e),(0,i.A)(t)}(ge),Ce=function(e){function t(e,n){var o;return(0,r.A)(this,t),(o=fe(this,t,[e,"","","html"])).$container.append(n),o}return(0,c.A)(t,e),(0,i.A)(t)}(ge);(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,ve)},1167:function(e,t,n){var o=n(1909),r=n(5869),i=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i;t=r((function(e){return e=e||(o?navigator.userAgent:""),i.test(e)||a.test(e.substr(0,4))})),e.exports=t},1168:function(e,t,n){var o=n(3422);t=function(e){if(o(e))return"";try{return r.call(e)}catch(e){}try{return e+""}catch(e){}return""};var r=Function.prototype.toString;e.exports=t},1277:function(e,t,n){(t=n(6314)(!1)).push([e.id,'.luna-box-model{display:inline-block;text-align:center;white-space:nowrap;color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));background-color:#fff;background-color:var(--luna-color-bg-container,#fff);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-family:var(--luna-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px}.luna-box-model .luna-box-model-hidden,.luna-box-model.luna-box-model-hidden{display:none}.luna-box-model .luna-box-model-invisible,.luna-box-model.luna-box-model-invisible{visibility:hidden}.luna-box-model *{box-sizing:border-box}.luna-box-model.luna-box-model-theme-dark{color-scheme:dark;color:hsla(0,0%,100%,.85);color:var(--luna-color-text-dark,rgba(255,255,255,.85));background-color:#141414;background-color:var(--luna-color-bg-container-dark,#141414)}.luna-box-model{font-size:12px}.luna-box-model-label{position:absolute;margin-left:3px;padding:0 2px}.luna-box-model-bottom,.luna-box-model-left,.luna-box-model-right,.luna-box-model-top{display:inline-block}.luna-box-model-left,.luna-box-model-right{vertical-align:middle}.luna-box-model-border,.luna-box-model-content,.luna-box-model-margin,.luna-box-model-padding,.luna-box-model-position{position:relative;display:inline-block;text-align:center;vertical-align:middle;padding:3px;margin:3px;color:rgba(0,0,0,.88);background:#fff}.luna-box-model-position{border:1px gray dotted}.luna-box-model-margin{border:1px dashed}.luna-box-model-margin.luna-box-model-highlighted{color:rgba(0,0,0,.88)!important;background:rgba(246,178,107,.66)!important}.luna-box-model-border{border:1px #000 solid}.luna-box-model-border.luna-box-model-highlighted{color:rgba(0,0,0,.88)!important;background:rgba(255,229,153,.66)!important}.luna-box-model-padding{border:1px gray dashed}.luna-box-model-padding.luna-box-model-highlighted{color:rgba(0,0,0,.88)!important;background:rgba(147,196,125,.55)!important}.luna-box-model-content{border:1px gray solid;min-width:100px}.luna-box-model-content.luna-box-model-highlighted{color:rgba(0,0,0,.88)!important;background:rgba(111,168,220,.66)!important}.luna-box-model-theme-dark .luna-box-model-border,.luna-box-model-theme-dark .luna-box-model-content,.luna-box-model-theme-dark .luna-box-model-margin,.luna-box-model-theme-dark .luna-box-model-padding,.luna-box-model-theme-dark .luna-box-model-position{color:hsla(0,0%,100%,.85);background:#141414}.luna-box-model-theme-dark .luna-box-model-border{border-color:gray}',""]),e.exports=t},1443:function(e,t,n){(t=n(6314)(!1)).push([e.id,'#_resources{overflow-y:auto;-webkit-overflow-scrolling:touch;padding:10px;font-size:14px}#_resources ._section{margin-bottom:10px;overflow:hidden;border:1px solid var(--border)}#_resources ._section._warn{border:1px solid var(--console-warn-border)}#_resources ._section._warn ._title{background:var(--console-warn-background);color:var(--console-warn-foreground)}#_resources ._section._danger{border:1px solid var(--console-error-border)}#_resources ._section._danger ._title{background:var(--console-error-background);color:var(--console-error-foreground)}#_resources ._section._cookie,#_resources ._section._local-storage,#_resources ._section._session-storage{border:none}#_resources ._section._cookie ._title,#_resources ._section._local-storage ._title,#_resources ._section._session-storage ._title{border:1px solid var(--border);border-bottom:none}#_resources ._title{padding:10px;line-height:18px;color:var(--primary);background:var(--darker-background)}#_resources ._title ._btn{margin-left:5px;float:right;color:var(--primary);width:18px;height:18px;font-size:16px;cursor:pointer;transition:color .3s}#_resources ._title ._btn._filter-text{width:auto;max-width:80px;font-size:14px;overflow:hidden;font-weight:400;text-overflow:ellipsis;display:inline-block}#_resources ._title ._btn:active{color:var(--accent)}#_resources ._title ._btn._btn-disabled{color:inherit!important;cursor:default!important;pointer-events:none;opacity:.5}#_resources ._title ._btn._btn-disabled *{pointer-events:none}#_resources ._link-list{font-size:12px;color:var(--foreground)}#_resources ._link-list li{padding:10px;word-break:break-all}#_resources ._link-list li a{color:var(--link-color)!important}#_resources ._image-list{color:var(--foreground);font-size:12px;display:flex;flex-wrap:wrap;padding-left:10px;padding-top:10px}#_resources ._image-list::after{content:"";flex-grow:1000}#_resources ._image-list li{flex-grow:1;cursor:pointer;overflow-y:hidden;margin-right:10px;margin-bottom:10px;border:1px solid var(--border)}#_resources ._image-list li._image{height:100px;font-size:0}#_resources ._image-list li img{height:100px;min-width:100%;-o-object-fit:cover;object-fit:cover}._safe-area #_resources{padding-bottom:calc(10px + env(safe-area-inset-bottom))}',""]),e.exports=t},1505:function(e,t,n){var o=n(7308),r=n(6026),i=n(9405),a=n(9100),s=n(3915),c=n(1932);t=function(){var e=o("viewport");if(!e)return 1;e=s(e.split(","),(function(e){return i(e)}));var t=.25,n=5,l=1;a(e,(function(e){var o=(e=e.split("="))[0];e=e[1],"initial-scale"===o&&(l=+e),"maximum-scale"===o&&(n=+e),"minimum-scale"===o&&(t=+e)}));var u=r(l,t,n);return c(u)?1:u},e.exports=t},1532:function(e,t,n){var o=n(1009),r=n(5169),i=n(2561);function a(e,t){if(e=i(e),t=i(t),o(e,"_")&&!o(t,"_"))return 1;if(o(t,"_")&&!o(e,"_"))return-1;for(var n,a,s,c,l=/^\d+|^\D+/;;){if(!e)return t?-1:0;if(!t)return 1;if(n=e.match(l)[0],a=t.match(l)[0],s=!r.isNaN(n),c=!r.isNaN(a),s&&!c)return-1;if(c&&!s)return 1;if(s&&c){var u=n-a;if(u)return u;if(n.length!==a.length)return+n||+a?a.length-n.length:n.length-a.length}else if(n!==a)return n=0&&e.indexOf(t,n)===n},e.exports=t},1710:function(e,t){t=function(e,t){var n="";if(t<1)return"";for(;t>0;)1&t&&(n+=e),t>>=1,e+=e;return n},e.exports=t},1714:function(e,t,n){"use strict";n.d(t,{A:function(){return ne}});var o=n(3029),r=n(2901),i=n(388),a=n(3954),s=n(991),c=n(5361),l=n(2263),u=n.n(l),d=n(3693),h=n.n(d),f=n(3915),p=n.n(f),v=n(9405),g=n.n(v),m=n(5169),b=n.n(m),y=n(9548),A=n.n(y),w=(n(6097),n(3249)),_=n.n(w),x=(n(6030),n(5004)),k=n.n(x);n(8609);function C(e){var t="luna-".concat(e,"-");function n(e){return p()(g()(e).split(/\s+/),(function(e){return _()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=A().parse(e);return S(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),A().stringify(t)}catch(t){return n(e)}return n(e)}}function S(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,f=void 0===d?"light":d;return(0,o.A)(this,t),s=this,c=t,c=(0,a.A)(c),(r=(0,i.A)(s,F()?Reflect.construct(c,l||[],(0,a.A)(s).constructor):c.apply(s,l))).subComponents=[],r.compName=u,r.c=C(u),r.options={},r.container=e,r.$container=h()(e),r.$container.addClass(["luna-".concat(u),r.c("platform-".concat(T()))]),r.on("optionChange",(function(e,t,n){var o=r.c;"theme"===e&&(r.$container.rmClass(o("theme-".concat(n))).addClass(o("theme-".concat(t))),O()(r.subComponents,(function(e){return e.setOption("theme",t)})))})),r.setOption("theme",f),r}return(0,c.A)(t,e),(0,r.A)(t,[{key:"destroy",value:function(){this.destroySubComponents();var e=this.c;this.$container.rmClass("luna-".concat(this.compName)).rmClass(e("platform-".concat(T()))).rmClass(e("theme-".concat(this.options.theme))),this.$container.html(""),this.emit("destroy"),this.removeAllListeners()}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,O()(r,(function(e,t){var r=o[t];o[t]=e,n.emit("optionChange",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){B()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){O()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};z()(e,t),M()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}}])}(u()),L=n(3497),G=n.n(L),P=n(9464),H=n.n(P),Y=n(5865),$=n.n(Y),q=n(4534),Q=n.n(q),U=n(4844),W=n.n(U),J=n(5902),K=n.n(J),V=n(9389),Z=n.n(V),X=n(6948),ee=n.n(X);function te(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(te=function(){return!!e})()}e=n.hmd(e);var ne=function(e){function t(e){var n,r,s,c,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,o.A)(this,t),r=this,s=t,c=[e,{compName:"text-viewer"},l],s=(0,a.A)(s),(n=(0,i.A)(r,te()?Reflect.construct(s,c||[],(0,a.A)(r).constructor):s.apply(r,c))).lineNum=0,n.copy=function(){var e=n.c,t=n.options,o=t.text,r=t.escape;W()(r?o:Z()(ee()(o)));var i=n.$copy.find(e(".icon"));i.addClass(e("icon-check")).rmClass(e("icon-copy")),setTimeout((function(){i.rmClass(e("icon-check")).addClass(e("icon-copy"))}),1e3)},n._updateCopyPos=function(){var e=n.container;n.$copy.css({top:e.scrollTop+5,right:5-e.scrollLeft})},n.initOptions(l,{text:"",escape:!0,showLineNumbers:!0,wrapLongLines:!0,maxHeight:1/0}),n.render=$()((function(){return n._render()}),16),n.updateCopyPos=Q()((function(){return n._updateCopyPos()}),300),n.initTpl(),n.$text=n.find(".text"),n.$copy=n.find(".copy"),E&&n.$copy.css("opacity","1"),n.options.text&&n.render(),n.bindEvent(),n.updateHeight(),n}return(0,c.A)(t,e),(0,r.A)(t,[{key:"append",value:function(e){var t=this,n=this.options,o=this.$copy,r=this.c,i=this.$text,a=n.showLineNumbers;if(this.options.text+=e,!a)return this.$text.append(n.escape?K()(e):e);var s=function(e){if(0===e.length)return[];return e.split(oe)}(e);H()(s)&&(s=[" "]),g()(G()(s))||s.pop();var c="";O()(s,(function(e,o){t.lineNum+=1,c+='
').concat(t.lineNum,'
').concat(n.escape?K()(e):e||" ","
")})),i.find(r(".table")).append(c),o.hide(),i.offset().height>40&&o.show(),this.updateCopyPos()}},{key:"destroy",value:function(){var e,n,o,r,i;this.$container.off("scroll",this.updateCopyPos),(e=t,n="destroy",o=this,r=3,i=(0,s.A)((0,a.A)(1&r?e.prototype:e),n,o),2&r&&"function"==typeof i?function(e){return i.apply(o,e)}:i)([])}},{key:"updateHeight",value:function(){var e=this.options.maxHeight;e>0&&e!==1/0?this.$text.css("max-height",e):this.$text.css("max-height","none")}},{key:"initTpl",value:function(){this.$container.html(this.c('
'))}},{key:"bindEvent",value:function(){var e=this;this.on("optionChange",(function(t){if("maxHeight"===t)e.updateHeight();else e.render()})),this.$container.on("scroll",this.updateCopyPos),this.$copy.on("click",this.copy)}},{key:"_render",value:function(){var e=this.c,t=this.$text,n=this.options,o=n.text,r=n.wrapLongLines,i=n.showLineNumbers;r?t.addClass(e("wrap-long-lines")):t.rmClass(e("wrap-long-lines")),i?t.addClass(e("line-numbers")):t.rmClass(e("line-numbers")),t.html('
')),this.lineNum=0,this.options.text="",this.append(o)}}])}(R),oe=/\r\n|\r|\n/g;(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,ne)},1738:function(e,t,n){var o=n(3974);t=function(e){return"[object String]"===o(e)},e.exports=t},1751:function(e,t,n){var o=n(3974);t=function(e){return"[object Map]"===o(e)},e.exports=t},1849:function(e,t,n){var o=n(9100),r=n(8971),i=n(3957);t=function(e,t){r(t)&&(t=!0);var n=i(t),a={};return o(e,(function(e){a[e]=n?t(e):t})),a},e.exports=t},1909:function(e,t){t="object"==typeof window&&"object"==typeof document&&9===document.nodeType,e.exports=t},1931:function(e,t,n){var o=n(1947);t=function(e){var t;switch(e=e||"local"){case"local":t=window.localStorage;break;case"session":t=window.sessionStorage}try{var n="test-localStorage-"+Date.now();t.setItem(n,n);var r=t.getItem(n);if(t.removeItem(n),r!==n)throw new Error}catch(e){return o}return t},e.exports=t},1932:function(e,t,n){var o=n(6097);t=function(e){return o(e)&&e!==+e},e.exports=t},1944:function(e,t,n){"use strict";n.d(t,{A:function(){return Z}});var o=n(5458),r=n(4467),i=n(7528),a=n(3029),s=n(2901),c=n(388),l=n(3954),u=n(991),d=n(5361),h=n(2263),f=n.n(h),p=n(3693),v=n.n(p),g=n(3915),m=n.n(g),b=n(9405),y=n.n(b),A=n(5169),w=n.n(A),_=n(9548),x=n.n(_),k=(n(6097),n(3249)),C=n.n(k),S=(n(6030),n(5004)),E=n.n(S);n(9410),n(8609);function T(e){var t="luna-".concat(e,"-");function n(e){return m()(y()(e).split(/\s+/),(function(e){return C()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=x().parse(e);return N(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),x().stringify(t)}catch(t){return n(e)}return n(e)}}function N(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===s?"light":s;return(0,a.A)(this,t),o=function(e,t,n){return t=(0,l.A)(t),(0,c.A)(e,H()?Reflect.construct(t,n||[],(0,l.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=i,o.c=T(i),o.options={},o.container=e,o.$container=v()(e),o.$container.addClass(["luna-".concat(i),o.c("platform-".concat((r=E()(),"os x"===r?"mac":r)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=L().get()),o.setTheme(n),j()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),L().on("change",o.onThemeChange),o.setOption("theme",u),o}return(0,d.A)(t,e),(0,s.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");j()(n.split(/\s+/),(function(n){P()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),L().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,j()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){F()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){j()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};D()(e,t),I()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(f()),q=n(5773),Q=n.n(q),U=n(5241),W=n.n(U),J=n(6741),K=n.n(J);function V(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(V=function(){return!!e})()}e=n.hmd(e);var Z=function(e){function t(e){var n,o,r,i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,a.A)(this,t),o=this,r=t,i=[e,{compName:"modal"},s],r=(0,l.A)(r),(n=(0,c.A)(o,V()?Reflect.construct(r,i||[],(0,l.A)(o).constructor):r.apply(o,i))).render=function(){var e=n,t=e.options,o=e.c,r=e.$body;t.title?(r.rmClass(o("no-title")),n.$title.text(t.title)):r.addClass(o("no-title")),t.footer?(r.rmClass(o("no-footer")),n.$footer.html("").append(t.footer)):r.addClass(o("no-footer")),t.showClose?n.$close.show():n.$close.hide(),n.$body.css("width",t.width+"px"),n.renderContent()},n.hide(),n.initOptions(s,{title:"",content:"",footer:"",showClose:!0,width:oe()}),n.initTpl(),n.$title=n.find(".title"),n.$content=n.find(".content"),n.$body=n.find(".body"),n.$footer=n.find(".footer"),n.$close=n.find(".icon-close"),n.bindEvent(),n}return(0,d.A)(t,e),(0,s.A)(t,[{key:"show",value:function(){this.render(),this.$container.rmClass(this.c("hidden"))}},{key:"hide",value:function(){this.$container.addClass(this.c("hidden"))}},{key:"destroy",value:function(){var e,n,o,r,i;(e=t,n="destroy",o=this,r=3,i=(0,u.A)((0,l.A)(1&r?e.prototype:e),n,o),2&r&&"function"==typeof i?function(e){return i.apply(o,e)}:i)([]),this.$container.rmClass(this.c("hidden"))}},{key:"renderContent",value:function(){this.$content.html("").append(this.options.content)}},{key:"bindEvent",value:function(){var e=this;this.$body.on("click",this.c(".icon-close"),(function(){return e.hide()})),this.on("changeOption",this.render)}},{key:"initTpl",value:function(){this.$container.html(this.c(Q()(Y||(Y=(0,i.A)(['\n
\n \n
\n
\n \n
\n '])))))}}],[{key:"alert",value:function(e){return new Promise((function(n){var o=te(),i=o.c;o.setOption({title:"",content:e,width:oe(),footer:ne((0,r.A)({},t.i18n.t("ok"),{type:"primary",onclick:function(){o.hide(),n()}}),i)}),o.show()}))}},{key:"confirm",value:function(e){return new Promise((function(n){var o=te(),i=o.c;o.setOption({title:"",content:e,width:oe(),footer:ne((0,r.A)((0,r.A)({},t.i18n.t("cancel"),{type:"secondary",onclick:function(){o.hide(),n(!1)}}),t.i18n.t("ok"),{type:"primary",onclick:function(){o.hide(),n(!0)}}),i)}),o.show()}))}},{key:"prompt",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return new Promise((function(o){var i=te(),a=i.c,s=W()("input"+a(".input"),{value:n});function c(){i.hide(),o(s.value)}v()(s).on("keypress",(function(e){"Enter"===(e=e.origEvent).key&&c()})),i.setOption({title:e,content:s,width:oe(),footer:ne((0,r.A)((0,r.A)({},t.i18n.t("cancel"),{type:"secondary",onclick:function(){i.hide(),o(null)}}),t.i18n.t("ok"),{type:"primary",onclick:c}),a)}),i.show();var l=s.value.length;s.setSelectionRange(l,l),s.focus()}))}},{key:"setContainer",value:function(e){ee=e}}])}($);Z.i18n=new(K())("zh-CN"!==navigator.language?"en-US":"zh-CN",{"en-US":{ok:"OK",cancel:"Cancel"},"zh-CN":{ok:"确定",cancel:"取消"}});var X=null,ee=null;function te(){return ee||(ee=W()("div"),document.body.append(ee)),X||(X=new Z(ee,{showClose:!1})),X}function ne(e,t){var n=m()(e,(function(e,n){return W()(t(".button")+t("."+e.type),{onclick:e.onclick},n)}));return W().apply(void 0,[t(".button-group"),{}].concat((0,o.A)(n)))}function oe(){return window.innerWidth<500?window.innerWidth-32:500}(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,Z)},1947:function(e,t,n){var o=n(3145);t={getItem:function(e){return(i[e]?r[e]:this[e])||null},setItem:function(e,t){i[e]?r[e]=t:this[e]=t},removeItem:function(e){i[e]?delete r[e]:delete this[e]},key:function(e){var t=a();return e>=0&&e-1&&n[e].splice(o,1),this}},once:function(e,t){return this.on(e,s(t)),this},emit:function(e){var t=this;if(r(this._events,e)){var n=a(arguments,1),o=c(this._events[e]);return i(o,(function(e){return e.apply(t,n)}),this),this}},removeAllListeners:function(e){return e?delete this._events[e]:this._events={},this}},{mixin:function(e){i(["on","off","once","emit","removeAllListeners"],(function(n){e[n]=t.prototype[n]})),e._events=e._events||{}}}),e.exports=t},2284:function(e,t,n){"use strict";function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}n.d(t,{A:function(){return o}})},2388:function(e,t,n){"use strict";n.d(t,{A:function(){return Le}});var o=n(7528),r=n(3029),i=n(2901),a=n(388),s=n(3954),c=n(991),l=n(5361),u=n(3693),d=n.n(u),h=n(5773),f=n.n(h),p=n(2263),v=n.n(p),g=n(3915),m=n.n(g),b=n(9405),y=n.n(b),A=n(5169),w=n.n(A),_=n(9548),x=n.n(_),k=(n(6097),n(3249)),C=n.n(k),S=n(6030),E=n.n(S),T=n(5004),N=n.n(T),O=(n(9410),n(8609)),j=n.n(O);function M(e){var t="luna-".concat(e,"-");function n(e){return m()(y()(e).split(/\s+/),(function(e){return C()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=x().parse(e);return I(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),x().stringify(t)}catch(t){return n(e)}return n(e)}}function I(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===l?"light":l;return(0,r.A)(this,t),o=function(e,t,n){return t=(0,s.A)(t),(0,a.A)(e,W()?Reflect.construct(t,n||[],(0,s.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=c,o.c=M(c),o.options={},o.container=e,o.$container=d()(e),o.$container.addClass(["luna-".concat(c),o.c("platform-".concat((i=N()(),"os x"===i?"mac":i)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=q().get()),o.setTheme(n),F()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),q().on("change",o.onThemeChange),o.setOption("theme",u),o}return(0,l.A)(t,e),(0,i.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");F()(n.split(/\s+/),(function(n){U()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),q().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,F()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){Y()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){F()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};P()(e,t),L()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(v()),V=n(5902),Z=n.n(V),X=n(5241),ee=n.n(X),te=n(2561),ne=n.n(te),oe=n(2708),re=n.n(oe),ie=n(8971),ae=n.n(ie),se=n(4095),ce=n.n(se),le=n(5865),ue=n.n(le),de=n(1532),he=n.n(de),fe=n(4236),pe=n.n(fe),ve=n(3957),ge=n.n(ve),me=n(1976),be=n.n(me),ye=n(6214),Ae=n.n(ye),we=n(1738),_e=n.n(we),xe=n(96),ke=n.n(xe),Ce=n(6026),Se=n.n(Ce),Ee=n(3539),Te=n.n(Ee),Ne=n(8785),Oe=n.n(Ne),je=n(6024),Me=n.n(je),Ie=n(3981),ze=n.n(Ie),De=n(5546),Be=n.n(De);function Fe(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Fe=function(){return!!e})()}e=n.hmd(e);var Re=d()(document),Le=function(e){function t(e,n){var o,i,c,l;(0,r.A)(this,t),i=this,c=t,l=[e,{compName:"data-grid"},n],c=(0,s.A)(c),(o=(0,a.A)(i,Fe()?Reflect.construct(c,l||[],(0,s.A)(i).constructor):c.apply(i,l))).resizeIdx=0,o.resizeStartX=0,o.resizeStartLeft=0,o.resizeDeltaX=0,o.nodes=[],o.displayNodes=[],o.colWidthsInitialized=!1,o.colMap={},o.selectedNode=null,o.isAscending=!0,o.sorted=!1,o.colWidths=[],o.spaceHeight=0,o.topSpaceHeight=0,o.lastScrollTop=0,o.lastTimestamp=0,o.speedToleranceFactor=100,o.maxSpeedTolerance=2e3,o.minSpeedTolerance=100,o.scrollTimer=null,o.onResizeColMove=function(e){var t=o,n=t.resizeIdx,r=t.$resizers,i=t.colWidths,a=t.$colgroup,s=z("x",e=e.origEvent)-o.resizeStartX,c=i[n],l=i[n+1],u=Oe()(24-c,0),h=Te()(l-24,0);s=Se()(s,u,h),a.each((function(){var e=d()(this).find("col");e.eq(n).css("width",c+s+"px"),e.eq(n+1).css("width",l-s+"px")})),o.resizeDeltaX=s;var f=o.resizeStartLeft+s;r.eq(n).css("left","".concat(f,"px"))},o.onResizeColEnd=function(e){o.onResizeColMove(e);var t=o,n=t.c,r=t.colWidths,i=t.resizeIdx,a=t.resizeDeltaX,s=o.options.columns,c=s[i],l=s[i+1],u=r[i]+a,h=u+(r[i+1]-a),f=c.weight+l.weight,p=f*(u/h),v=f-p;c.weight=p,l.weight=v,o.applyColWeights(),d()(document.body).rmClass(n("resizing")),Re.off(Be()("move"),o.onResizeColMove),Re.off(Be()("up"),o.onResizeColEnd)},o.onScroll=function(){var e=o.dataContainer,t=e.scrollHeight,n=e.clientHeight,r=e.scrollTop;if(!(r<=0||n+r>t)){var i=o.lastScrollTop,a=o.lastTimestamp,s=ze()(),c=s-a,l=r-i,u=Math.abs(l/c)*o.speedToleranceFactor;c>1e3&&(u=1e3),u>o.maxSpeedTolerance&&(u=o.maxSpeedTolerance),ur+n+h||(o.renderData({topTolerance:2*d,bottomTolerance:2*h}),o.scrollTimer&&clearTimeout(o.scrollTimer),o.scrollTimer=setTimeout((function(){o.renderData()}),100))}},o.renderData=ue()((function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.topTolerance,n=void 0===t?500:t,r=e.bottomTolerance,i=void 0===r?500:r;o.sortId&&!o.sorted&&o.sortNodes(o.sortId,o.isAscending);for(var a=o,s=a.dataContainer,c=a.displayNodes,l=a.tableBody,u=s.scrollTop,d=u-n,h=u+s.clientHeight+i,f=0,p=0,v=c.length,g=[],m=0;md?(0===g.length&&Me()(m)&&(g.push(c[m-1]),f-=20),g.push(b)):p1&&void 0!==arguments[1]?arguments[1]:{};P()(t,{selectable:this.options.selectable});var n=new Ge(this,e,t);this.nodes.push(n);var o=this.filterNode(n);return o&&this.displayNodes.push(n),(this.sortId||o)&&(this.sortId&&(this.sorted=!1),this.renderData()),this.updateHeight(),n}},{key:"setData",value:function(e,t){var n=this,o=m()(e,(function(e){return Ae()(e)?(P()(e[1],{selectable:n.options.selectable}),e):[e,{selectable:n.options.selectable}]}));if(t){var r={};F()(this.nodes,(function(e){r[e.data[t]]=e}));var i=[],a=[];F()(o,(function(e){var o,s=e[0][t];r[s]?((o=r[s]).data=e[0],o.render()):o=new Ge(n,e[0],e[1]),i.push(o),n.filterNode(o)&&a.push(o)})),this.selectedNode&&!C()(i,this.selectedNode)&&this.selectNode(null),this.nodes=i,this.displayNodes=a}else this.clearData(),F()(o,(function(e){var t=new Ge(n,e[0],e[1]);n.nodes.push(t),n.filterNode(t)&&n.displayNodes.push(t)}));this.sortId&&(this.sorted=!1),this.renderData(),this.updateHeight()}},{key:"clear",value:function(){this.clearData(),this.renderData(),this.updateHeight()}},{key:"fit",value:function(){if(!j()(this.container)){var e=this.$container.parent().get(0),t=window.getComputedStyle(e),n=e.clientHeight-D(t.paddingTop)-D(t.paddingBottom);this.setOption({minHeight:n,maxHeight:n})}}},{key:"clearData",value:function(){this.nodes=[],this.displayNodes=[],this.selectNode(null)}},{key:"updateHeight",value:function(){var e=this.$fillerRow,t=this.$container,n=this.options,o=n.maxHeight,r=n.minHeight,i=this.$headerRow.offset().height+D(t.css("border-top-width"))+D(t.css("border-bottom-width"));(r-=i)<0&&(r=0),o-=i;var a=this.displayNodes.length,s=0;a>0&&(s=20*a),s>r?e.hide():e.show(),s=o&&(s=o),this.$dataContainer.css({height:s})}},{key:"selectNode",value:function(e){(pe()(e)||null!=e&&e.selectable)&&this.selectedNode!==e&&(this.selectedNode&&(this.selectedNode.deselect(),this.selectedNode=null,pe()(e)&&this.emit("deselect")),pe()(e)||(this.selectedNode=e,e.select(),this.emit("select",e)))}},{key:"onResizeColStart",value:function(e){var t=this.c,n=this.resizeIdx,o=this.$resizers;e.stopPropagation(),e.preventDefault(),e=e.origEvent,this.resizeStartX=z("x",e),this.resizeStartLeft=D(o.eq(n).css("left")),d()(document.body).addClass(t("resizing")),Re.on(Be()("move"),this.onResizeColMove),Re.on(Be()("up"),this.onResizeColEnd)}},{key:"bindEvent",value:function(){var e=this,t=this.c,n=this.$headerRow,o=this.$tableBody,r=this.$resizers,i=this.$dataContainer;this.resizeSensor.addListener(this.onResize),i.on("scroll",this.onScroll);var a=this;o.on("click",t(".node"),(function(e){var t=this;a.selectNode(this.dataGridNode),setTimeout((function(){t.hasDoubleClick||a.emit("click",e.origEvent,t.dataGridNode)}),200)})).on("dblclick",t(".node"),(function(e){var t=this;e.stopPropagation(),this.hasDoubleClick=!0,a.emit("dblclick",e.origEvent,this.dataGridNode),setTimeout((function(){t.hasDoubleClick=!1}),300)})).on("contextmenu",t(".node"),(function(e){e.preventDefault(),e.stopPropagation(),a.selectNode(this.dataGridNode),a.emit("contextmenu",e.origEvent,this.dataGridNode)})),n.on("click",t(".sortable"),(function(e){e.stopPropagation();var o=d()(this),r=o.data("id"),i="descending"!==o.data("order");o.data("order",i?"descending":"ascending"),n.find(t(".icon-caret-up")).hide(),n.find(t(".icon-caret-down")).hide();var s=o.find(t(".icon-caret-up")),c=o.find(t(".icon-caret-down"));i?s.show():c.show(),a.sortNodes(r,i),a.renderData(),n.find("th").each((function(){var e=d()(this);e.data("id")!==r&&e.rmAttr("data-order")}))})),r.on(Be()("down"),(function(e){var t=d()(this);a.resizeIdx=E()(t.data("idx")),a.onResizeColStart(e)})),this.on("changeOption",(function(t){switch(t){case"minHeight":case"maxHeight":e.updateHeight();break;case"filter":e.displayNodes=[],F()(e.nodes,(function(t){e.filterNode(t)&&e.displayNodes.push(t)})),e.selectedNode&&!e.filterNode(e.selectedNode)&&e.selectNode(null),e.renderData(),e.updateHeight()}}))}},{key:"sortNodes",value:function(e,t){var n=this.colMap[e].comparator||he().comparator;function o(o,r){var i=o.data[e],a=r.data[e];return re()(i)&&(i=i.innerText),re()(a)&&(a=a.innerText),t?n(i,a):n(a,i)}this.nodes.sort(o),this.displayNodes.sort(o),this.sorted=!0,this.sortId=e,this.isAscending=t}},{key:"updateWeights",value:function(){var e=this.container,t=this.$headerRow,n=this.options.columns,o=e.offsetWidth;if(!this.colWidthsInitialized&&o){for(var r=0,i=n.length;r'),this.colWidths[u]=h}t.html(s),this.positionResizers()}}},{key:"positionResizers",value:function(){for(var e=this.colWidths,t=[],n=e.length-1,o=0;o\n ').concat(r,'\n \n \n ')):t+="".concat(r,""),n+=""})),this.$headerRow.html(t),this.$fillerRow.html(n)}},{key:"renderResizers",value:function(){for(var e="",t=this.options.columns.length-1,n=0;n'));this.$container.append(e),this.$resizers=this.find(".resizer")}},{key:"initTpl",value:function(){this.$container.html(this.c(f()(J||(J=(0,o.A)(['\n
\n \n \n \n \n \n
\n
\n
\n
\n \n \n \n \n \n
\n
\n
\n '])))))}}])}(K),Ge=function(){return(0,i.A)((function e(t,n,o){(0,r.A)(this,e),this.container=ee()("tr"),this.selectable=!1,this.container.dataGridNode=this,this.$container=d()(this.container),this.$container.addClass(t.c("node")),this.dataGrid=t,this.data=n,o.selectable&&(this.selectable=o.selectable,this.$container.addClass(t.c("selectable"))),this.render()}),[{key:"text",value:function(){return this.$container.text()}},{key:"select",value:function(){this.$container.addClass(this.dataGrid.c("selected"))}},{key:"deselect",value:function(){this.$container.rmClass(this.dataGrid.c("selected"))}},{key:"render",value:function(){var e=this.data,t=this.$container,n=this.container,o=this.dataGrid.getOption("columns");t.html(""),F()(o,(function(t){var o=ee()("td"),r=e[t.id];ae()(r)||(re()(r)?o.appendChild(r):o.innerText=ne()(r)),n.appendChild(o)}))}}])}();(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,Le)},2455:function(e,t){t=function(e){return e},e.exports=t},2480:function(e,t,n){"use strict";var o=this&&this.__createBinding||(Object.create?function(e,t,n,o){void 0===o&&(o=n);var r=Object.getOwnPropertyDescriptor(t,n);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,o,r)}:function(e,t,n,o){void 0===o&&(o=n),e[o]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&o(t,e,n);return r(t,e),t},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.enable=function(){if(x)return;var e=(0,h.default)("div",{class:"__chobitsu-hide__",style:{all:"initial"}});c=(0,d.default)(e),document.documentElement.appendChild(e);var t=null,n=null;e.attachShadow?n=e.attachShadow({mode:"open"}):e.createShadowRoot&&(n=e.createShadowRoot());if(n){var o=document.createElement("style");o.textContent=S,o.type="text/css",n.appendChild(o),t=document.createElement("div"),n.appendChild(t)}else t=document.createElement("div"),e.appendChild(t),_||((0,f.default)(S),_=!0);s=new A.default(t,{monitorResize:(0,b.default)(m.default.ResizeObserver),showInfo:k}),window.addEventListener("resize",R),x=!0},t.disable=function(){s.destroy(),c.remove(),window.removeEventListener("resize",R),x=!1},t.highlightNode=E,t.hideHighlight=T,t.setShowViewportSizeOnResize=function(e){N=e.show},t.setInspectMode=function(e){O=e.highlightConfig,j=e.mode};var s,c,l=n(9893),u=n(6192),d=a(n(3693)),h=a(n(5241)),f=a(n(3048)),p=a(n(5651)),v=a(n(8105)),g=a(n(8665)),m=a(n(5169)),b=a(n(9e3)),y=a(n(8534)),A=a(n(9196)),w=i(n(2484)),_=!1,x=!1,k=(0,y.default)("clip-path","polygon(50% 0px, 0px 100%, 100% 100%)"),C="ontouchstart"in m.default,S=n(7119).replace("/*# sourceMappingURL=luna-dom-highlighter.css.map*/","");function E(e){var t,n=e.nodeId,o=e.highlightConfig,r=e.objectId;n&&(t=(0,l.getNode)(n)),r&&(t=w.getObj(r)),1!==t.nodeType&&3!==t.nodeType||((0,p.default)(o,{contentColor:"transparent",paddingColor:"transparent",borderColor:"transparent",marginColor:"transparent"}),k||(0,v.default)(o,{showInfo:!1}),s.highlight(t,o))}function T(){s.hide()}var N=!1;var O={},j="none";function M(e){if(C){var t=e.touches[0]||e.changedTouches[0];return document.elementFromPoint(t.clientX,t.clientY)}return document.elementFromPoint(e.clientX,e.clientY)}var I=-1;function z(e){if("none"!==j){var t=M(e);if(t&&(0,l.isValidNode)(t)){var n=(0,l.getNodeId)(t);n||(n=(0,u.pushNodesToFrontend)(t)),E({nodeId:n,highlightConfig:O}),n!==I&&(g.default.trigger("Overlay.nodeHighlightRequested",{nodeId:n}),I=n)}}}function D(e){if("none"!==j){e.preventDefault(),e.stopImmediatePropagation();var t=M(e);g.default.trigger("Overlay.inspectNodeRequested",{backendNodeId:(0,l.getNodeId)(t)}),I=-1,T()}}function B(e,t){document.documentElement.addEventListener(e,t,!0)}C?(B("touchstart",z),B("touchmove",z),B("touchend",D)):(B("mousemove",z),B("mouseout",(function(){"none"!==j&&T()})),B("click",D));var F=(0,h.default)("div",{class:"__chobitsu-hide__",style:{position:"fixed",right:0,top:0,background:"#fff",fontSize:13,opacity:.5,padding:"4px 6px"}});function R(){N&&(G.text("".concat(window.innerWidth,"px × ").concat(window.innerHeight,"px")),L?clearTimeout(L):document.documentElement.appendChild(F),L=setTimeout((function(){G.remove(),L=null}),1e3))}var L,G=(0,d.default)(F)},2484:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.clear=function(){A.clear(),w.clear(),_.clear()},t.wrap=S,t.getObj=E,t.releaseObj=function(e){var t=E(e);w.delete(t),_.delete(e),A.delete(e)},t.getProperties=function(e){for(var t=e.accessorPropertiesOnly,n=e.objectId,o=e.ownProperties,i=e.generatePreview,a=[],c={prototype:!o,unenumerable:!0,symbol:!t},l=A.get(n),h=_.get(n),f=(0,v.default)(l,c),p=(0,m.default)(l),w=0,k=f.length;wT&&(a=T,o=!0);for(var s=0;sT){o=!0;break}l.push({key:N(p),value:N(e.get(p))}),s++,p=h.next().value}n.entries=l}else if((0,d.default)(e)){var v=[],g=(s=0,e.keys());for(p=g.next().value;p;){if(s>T){o=!0;break}v.push({value:N(p)}),s++,p=g.next().value}n.entries=v}return n.overflow=o,n}function O(e,t){var n=M(t);n.name=e;var o,i=n.subtype;return o="object"===n.type?"null"===i?"null":"array"===i?"Array(".concat(t.length,")"):"map"===i?"Map(".concat(t.size,")"):"set"===i?"Set(".concat(t.size,")"):(0,y.getType)(t,!1):(0,r.default)(t),n.value=o,n}function j(e,t){void 0===t&&(t=e);var n=M(e),o=n.type,i=n.subtype;return"string"===o?e:"number"===o||"symbol"===o?(0,r.default)(e):"function"===o?(0,p.default)(e):"array"===i?"Array(".concat(e.length,")"):"map"===i?"Map(".concat(t.size,")"):"set"===i?"Set(".concat(t.size,")"):"regexp"===i?(0,r.default)(e):"error"===i?e.stack:"internal#entry"===i?e.name?'{"'.concat((0,r.default)(e.name),'" => "').concat((0,r.default)(e.value),'"}'):'"'.concat((0,r.default)(e.value),'"'):(0,y.getType)(e,!1)}function M(e){var t=typeof e,n="object";if(e instanceof I)n="internal#entry";else if((0,i.default)(e))n="null";else if((0,a.default)(e))n="array";else if((0,h.default)(e))n="regexp";else if((0,l.default)(e))n="error";else if((0,u.default)(e))n="map";else if((0,d.default)(e))n="set";else try{(0,c.default)(e)&&(n="node")}catch(e){}return{type:t,subtype:n}}var I=function(e,t){t&&(this.name=t),this.value=e};function z(e){return e instanceof I||!!(e[0]&&e[0]instanceof I)}},2508:function(e,t,n){var o=n(6186),r=n(2561),i=/{{(.*?)}}/g;t=function(e,t){return e.replace(i,(function(e,n){return r(o(t,n))}))},e.exports=t},2510:function(e,t){t=function(e,t){return t=null==t?e.length-1:+t,function(){var n,o=Math.max(arguments.length-t,0),r=new Array(o);for(n=0;n]*>/g.test(e))try{var t=C().parse(e);return j(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),C().stringify(t)}catch(t){return n(e)}return n(e)}}function j(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,d=void 0===u?"light":u;return(0,o.A)(this,t),r=function(e,t,n){return t=(0,a.A)(t),(0,i.A)(e,$()?Reflect.construct(t,n||[],(0,a.A)(e).constructor):t.apply(e,n))}(this,t),r.subComponents=[],r.theme="",r.onThemeChange=function(e){"auto"===r.options.theme&&r.setTheme(e)},r.compName=c,r.c=O(c),r.options={},r.container=e,r.$container=l()(e),r.$container.addClass(["luna-".concat(c),r.c("platform-".concat((s=N()(),"os x"===s?"mac":s)))]),r.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=P().get()),r.setTheme(n),I()(r.subComponents,(function(e){return e.setOption("theme",t)}))}})),P().on("change",r.onThemeChange),r.setOption("theme",d),r}return(0,s.A)(t,e),(0,r.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");I()(n.split(/\s+/),(function(n){Y()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),P().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,I()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){L()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){I()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};F()(e,t),D()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(m()),Q=n(8971),U=n.n(Q);function W(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(W=function(){return!!e})()}e=n.hmd(e);var J=function(e){function t(e){var n,r,s,c,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,o.A)(this,t),r=this,s=t,c=[e,{compName:"notification"},l],s=(0,a.A)(s),(n=(0,i.A)(r,W()?Reflect.construct(s,c||[],(0,a.A)(r).constructor):s.apply(r,c))).notifications=[],n.initOptions(l,{position:{x:"right",y:"bottom"},inline:!1,duration:2e3}),n.options.inline||n.$container.addClass(n.c("full")),n.initTpl(),n}return(0,s.A)(t,e),(0,r.A)(t,[{key:"notify",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};U()(n.duration)&&(n.duration=this.options.duration);var o=new K(this,e,{icon:n.icon||"none"});this.notifications.push(o),this.add(o),setTimeout((function(){return t.remove(o.id)}),n.duration)}},{key:"dismissAll",value:function(){for(var e=this.notifications,t=e[0];t;)this.remove(t.id),t=e[0]}},{key:"add",value:function(e){this.container.appendChild(e.container)}},{key:"remove",value:function(e){var t=this.notifications,n=f()(t,(function(t){return t.id===e}));if(n){n.destroy();var o=t.indexOf(n);t.splice(o,1)}}},{key:"initTpl",value:function(){var e=this.$container,t=this.options.position,n=t.x,o=t.y,r="flex-end",i="flex-end";switch(n){case"center":i="center";break;case"left":i="flex-start"}"top"===o&&(r="flex-start"),e.attr("style","justify-content: ".concat(r,"; align-items: ").concat(i))}}])}(q),K=function(){return(0,r.A)((function e(t,n,r){(0,o.A)(this,e),this.container=v()("div"),this.$container=l()(this.container),this.notification=t,this.content=n,this.id=d()("luna-notification-"),this.$container.attr({id:this.id,class:t.c("item ".concat("bottom"===t.getOption("position").y?"lower":"upper"))}),this.initTpl(r.icon)}),[{key:"destroy",value:function(){this.$container.remove()}},{key:"initTpl",value:function(e){var t=e;"success"===e?t="check":"warning"===e&&(t="warn");var n="none"===e?"":'
');this.$container.html(this.notification.c("".concat(n,'
').concat(this.content,"
")))}}])}();(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,J)},2561:function(e,t){t=function(e){return null==e?"":e.toString()},e.exports=t},2571:function(e,t,n){var o=n(5693),r=n(9100);t=function(e,t,n){var i=[];return t=o(t,n),r(e,(function(e,n,o){t(e,n,o)&&i.push(e)})),i},e.exports=t},2627:function(e,t,n){"use strict";var o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.setGlobal=function(e,t){u[e]=t},t.default=function(e){var t;(0,l.default)(u,(function(e,t){window[t]||(window[t]=e)}));try{t=eval.call(window,"(".concat(e,")"))}catch(n){t=eval.call(window,e)}return function(){(0,l.default)(u,(function(e,t){window[t]&&window[t]===e&&delete window[t]}))}(),t};var r=o(n(1738)),i=o(n(4844)),a=o(n(769)),s=o(n(3145)),c=o(n(8862)),l=o(n(9100)),u={copy:function(e){(0,r.default)(e)||(e=JSON.stringify(e,null,2)),(0,i.default)(e)},$:function(e){return document.querySelector(e)},$$:function(e){return(0,a.default)(document.querySelectorAll(e))},$x:function(e){return(0,c.default)(e)},keys:s.default}},2650:function(e,t,n){var o=n(3974);t=function(e){switch(o(e)){case"[object Error]":case"[object DOMException]":return!0;default:return e instanceof Error}},e.exports=t},2693:function(e,t,n){(t=n(6314)(!1)).push([e.id,'._container a,._container abbr,._container acronym,._container address,._container applet,._container article,._container aside,._container audio,._container b,._container big,._container blockquote,._container canvas,._container caption,._container center,._container cite,._container code,._container dd,._container del,._container details,._container dfn,._container dl,._container dt,._container em,._container embed,._container fieldset,._container figcaption,._container figure,._container footer,._container form,._container h1,._container h2,._container h3,._container h4,._container h5,._container h6,._container header,._container hgroup,._container i,._container iframe,._container img,._container ins,._container kbd,._container label,._container legend,._container li,._container mark,._container menu,._container nav,._container object,._container ol,._container output,._container p,._container pre,._container q,._container ruby,._container s,._container samp,._container section,._container small,._container span,._container strike,._container strong,._container sub,._container summary,._container sup,._container table,._container tbody,._container td,._container tfoot,._container th,._container thead,._container time,._container tr,._container tt,._container u,._container ul,._container var,._container video{margin:0;padding:0;border:0;font-size:100%}._container article,._container aside,._container details,._container figcaption,._container figure,._container footer,._container header,._container hgroup,._container menu,._container nav,._container section{display:block}._container body{line-height:1}._container ol,._container ul{list-style:none}._container blockquote,._container q{quotes:none}._container blockquote:after,._container blockquote:before,._container q:after,._container q:before{content:"";content:none}._container table{border-collapse:collapse;border-spacing:0;color:inherit;font-size:1em;font-style:inherit;font-variant:inherit;font-weight:inherit;line-height:inherit;text-decoration:inherit;white-space:inherit}',""]),e.exports=t},2708:function(e,t){t=function(e){return!(!e||1!==e.nodeType)},e.exports=t},2717:function(e,t,n){var o=n(8105),r=n(769),i=n(8009),a=n(6186),s=n(4460);var c=(t=function(e,t){return c.extend(e,t)}).Base=function e(t,n,c){c=c||{};var l=n.className||a(n,"initialize.name")||"";delete n.className;var u=function(){var e=r(arguments);return this.initialize&&this.initialize.apply(this,e)||this};if(!s)try{u=new Function("toArr","return function "+l+"(){var args = toArr(arguments);return this.initialize ? this.initialize.apply(this, args) || this : this;};")(r)}catch(e){}return i(u,t),u.prototype.constructor=u,u.extend=function(t,n){return e(u,t,n)},u.inherits=function(e){i(u,e)},u.methods=function(e){return o(u.prototype,e),u},u.statics=function(e){return o(u,e),u},u.methods(n).statics(c),u}(Object,{className:"Base",callSuper:function(e,t,n){return e.prototype[t].apply(this,n)},toString:function(){return this.constructor.name}});e.exports=t},2767:function(e,t,n){var o=n(1738),r=n(5282);t=function(e){return o(e)?i[e]:u[e]};for(var i={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,"pause/break":19,"caps lock":20,esc:27,space:32,"page up":33,"page down":34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,delete:46,windows:91,"right windows":92,"windows menu":93,"numpad *":106,"numpad +":107,"numpad -":109,"numpad .":110,"numpad /":111,"num lock":144,"scroll lock":145,";":186,"=":187,",":188,"-":189,".":190,"/":191,"`":192,"[":219,"\\":220,"]":221,"'":222},a=97;a<123;a++)i[String.fromCharCode(a)]=a-32;for(var s=48;s<58;s++)i[s-48]=s;for(var c=1;c<13;c++)i["f"+c]=c+111;for(var l=0;l<10;l++)i["numpad "+l]=l+96;var u=r(i);e.exports=t},2797:function(e,t,n){var o=n(5693),r=n(5793),i=n(3145);t=function(e,t,n){t=o(t,n);for(var a=!r(e)&&i(e),s=(a||e).length,c=0;c1&&void 0!==arguments[1])||arguments[1];return null===e&&(t="Null"),void 0===e&&(t="Undefined"),r(e)&&(t="NaN"),a(e)&&(t="Buffer"),t||(t=o(e).match(s))&&(t=t[1]),t?n?i(t):t:""};var s=/^\[object\s+(.*?)]$/;e.exports=t},2990:function(e,t){t={encode:function(e){var t,n,r=[],i=e.length,a=i%3;i-=a;for(var s=0;s>18&63]+o[t>>12&63]+o[t>>6&63]+o[63&t]));return i=e.length,1===a?(n=e[i-1],r.push(o[n>>2]),r.push(o[n<<4&63]),r.push("==")):2===a&&(n=(e[i-2]<<8)+e[i-1],r.push(o[n>>10]),r.push(o[n>>4&63]),r.push(o[n<<2&63]),r.push("=")),r.join("")},decode:function(e){var t=e.length,o=0;"="===e[t-2]?o=2:"="===e[t-1]&&(o=1);var r,i,a,s,c,l,u,d=new Array(3*t/4-o);for(t=o>0?t-4:t,r=0,i=0;r>16&255,d[i++]=h>>8&255,d[i++]=255&h}return 2===o?(u=n[e.charCodeAt(r)]<<2|n[e.charCodeAt(r+1)]>>4,d[i++]=255&u):1===o&&(u=n[e.charCodeAt(r)]<<10|n[e.charCodeAt(r+1)]<<4|n[e.charCodeAt(r+2)]>>2,d[i++]=u>>8&255,d[i++]=255&u),d}};for(var n=[],o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r=0,i=o.length;r-1:(i(e)||(e=a(e)),o(e,t)>=0)},e.exports=t},3270:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return g}});var o={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},r=/([astvzqmhlc])([^astvzqmhlc]*)/gi,i=/-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/gi;var a=function(e){var t=[],n=String(e).trim();return"M"!==n[0]&&"m"!==n[0]||n.replace(r,(function(e,n,r){var a=n.toLowerCase(),s=function(e){var t=e.match(i);return t?t.map(Number):[]}(r),c=n;if("m"===a&&s.length>2&&(t.push([c].concat(s.splice(0,2))),a="l",c="m"===c?"l":"L"),s.length=o[a]&&s.length&&o[a];)t.push([c].concat(s.splice(0,o[a])));return""})),t};function s(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,o=new Array(t);n1&&(y*=l=Math.sqrt(l),A*=l),u=y*y*A*A,f=y*y*s.y*s.y+A*A*s.x*s.x,h(k={x:y*s.y/A,y:-A*s.x/y},i!==r?Math.sqrt((u-f)/f)||0:-Math.sqrt((u-f)/f)||0),o=Math.atan2((s.y-k.y)/A,(s.x-k.x)/y),n=Math.atan2(-(s.y+k.y)/A,-(s.x+k.x)/y),d(k,c),O=k,j=(a.x+z.x)/2,M=(a.y+z.y)/2,O.x+=j,O.y+=M,e.save(),e.translate(k.x,k.y),e.rotate(c),e.scale(y,A),e.arc(0,0,1,o,n,!i),e.restore();break;case"C":C=B[3],S=B[4],p=B[5],g=B[6],e.bezierCurveTo(B[1],B[2],C,S,p,g);break;case"c":e.bezierCurveTo(B[1]+p,B[2]+g,B[3]+p,B[4]+g,B[5]+p,B[6]+g),C=B[3]+p,S=B[4]+g,p+=B[5],g+=B[6];break;case"S":null!==C&&null!==S||(C=p,S=g),e.bezierCurveTo(2*p-C,2*g-S,B[1],B[2],B[3],B[4]),C=B[1],S=B[2],p=B[3],g=B[4];break;case"s":null!==C&&null!==S||(C=p,S=g),e.bezierCurveTo(2*p-C,2*g-S,B[1]+p,B[2]+g,B[3]+p,B[4]+g),C=B[1]+p,S=B[2]+g,p+=B[3],g+=B[4];break;case"Q":E=B[1],T=B[2],p=B[3],g=B[4],e.quadraticCurveTo(E,T,p,g);break;case"q":E=B[1]+p,T=B[2]+g,p+=B[3],g+=B[4],e.quadraticCurveTo(E,T,p,g);break;case"T":null!==E&&null!==T||(E=p,T=g),E=2*p-E,T=2*g-T,p=B[1],g=B[2],e.quadraticCurveTo(E,T,p,g);break;case"t":null!==E&&null!==T||(E=p,T=g),E=2*p-E,T=2*g-T,p+=B[1],g+=B[2],e.quadraticCurveTo(E,T,p,g);break;case"z":case"Z":p=I.x,g=I.y,I=void 0,e.closePath();break;case"AC":p=B[1],g=B[2],b=B[3],o=B[4],n=B[5],N=B[6],e.arc(p,g,b,o,n,N);break;case"AT":v=B[1],m=B[2],p=B[3],g=B[4],b=B[5],e.arcTo(v,m,p,g,b);break;case"E":p=B[1],g=B[2],y=B[3],A=B[4],c=B[5],o=B[6],n=B[7],N=B[8],e.save(),e.translate(p,g),e.rotate(c),e.scale(y,A),e.arc(0,0,1,o,n,N),e.restore();break;case"R":p=B[1],g=B[2],w=B[3],_=B[4],I={x:p,y:g},e.rect(p,g,w,_)}z.x=p,z.y=g}}},p=a,v=f;"undefined"!=typeof window&&v(window);var g={path2dPolyfill:v,parsePath:p}},3277:function(e,t,n){(t=n(6314)(!1)).push([e.id,'@font-face{font-family:luna-data-grid-icon;src:url(\'data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAScAAsAAAAAB4wAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAFwAAACGIRYl5k9TLzIAAAFkAAAAPQAAAFZLxUkYY21hcAAAAaQAAADLAAACXsU3J5xnbHlmAAACcAAAACUAAAAwNxN2HmhlYWQAAAKYAAAALgAAADZzjr4QaGhlYQAAAsgAAAAYAAAAJAFyANhobXR4AAAC4AAAABAAAAA8AZAAAGxvY2EAAALwAAAAEAAAACAAnACobWF4cAAAAwAAAAAfAAAAIAEaAA9uYW1lAAADIAAAASkAAAIWm5e+CnBvc3QAAARMAAAATQAAAG/8EX8xeJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiA2A9NMDGwMMkAWF1CGFchmB4pxAnncDDxAOQ4kUV4GPqA6RgZmAE91Bj94nGNgZJBmnMDAysDAUMfQAyRloHQCAyeDMQMDEwMrMwNWEJDmmsJwgEH3IxPDCSBXCEwyMDCCCABbKQhrAAAAeJzNkksKwjAQhr+kvqpVxIUL8Qh6KFG3KtLidVx5Bq/VE+g/ySCIILhzhq+Qv8lkHgG6QCFWogPhRsDsKjUkvWCY9A611jOmUiJrNuw5cabh0sbHQ/9M23KQVksLSXu3oPPmcxbypRwGilxQ0qPSTRNl1GfMSHujDvQ+Yny3wY/7SXUX5eueaphSsAz+xar0vftqgnU6Y9VuHE1P3c/YRHdOKfaOVXlwLOrR0YQ1y4zFPzv2OmqnLxpnLC6O+tSGjL2YNmaITyYUHqgAeJxjYGQAgZUM0xmYGBjMlcVXNjtO9wCKoImbA8X9geIAqRwH2QAAAHicY2BkYGAA4hwJ4Yp4fpuvDNwMJ4ACUZyP9zUgaCBYyTAdSHIwMIE4ABioCdgAAHicY2BkYGA4wcAAJ1cyMDKgAn4AOLICS3icY2AAghNQTCIAAFMMAZF4nGNgAAIeBglcEAARPAFFeJxjYGRgYOBnYGYA0QwMTEDMBYQMDP/BfAYACkEBKgB4nGWQPW7CQBSEx2BIAlKCFCkps1UKIpmfkgNAT0GXwpi1MbK91npBossJcoQcIaeIcoIcKGPzaGAtP38zb97uygAG+IWHenm4bWq9WrihOnGb9CDsk5+FO+jjRbhLfyjcwxumwn084p07eP4dnQFK4Rbu8SHcpv8p7JO/hDt4wrdwl/6PcA8r/An38eoN08gUsSncUif7LLRnef6utK1SU6hJMD5bC11oGzq9Ueujqg7J1LlYxdbkas6uzjKjSmt2OnLB1rlyNhrF4geRyZEigkGBuKkOS2gk2CNDCHvVvdQrpi0q+rVWmCDA+Cq1YKpokiGVxobJNY6sFQ48bUrXMa34Ws7kpLnMat4kIyv+77q3oxPRD7BtpkrMMOITX+SD5g75Pz0RXqgAAAB4nF3GOQ6AIBQA0T+44YoX4VAEaNEYCNe3IDa+ZkaUNF//DIqOnoGRCc3MwsrGzoHhlMW7J2Ybrpp023LjcTxEMpbARSVRuEVebe8MtgAAAA==\') format(\'woff\')}[class*=\' luna-data-grid-icon-\'],[class^=luna-data-grid-icon-]{display:inline-block;font-family:luna-data-grid-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.luna-data-grid-icon-caret-down:before{content:\'\\f101\'}.luna-data-grid-icon-caret-up:before{content:\'\\f102\'}.luna-data-grid{position:relative;border:1px solid;overflow:hidden;outline:0;color:rgba(0,0,0,.88);color:var(--luna-color-text,rgba(0,0,0,.88));background-color:#fff;background-color:var(--luna-color-bg-container,#fff);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-family:var(--luna-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px}.luna-data-grid .luna-data-grid-hidden,.luna-data-grid.luna-data-grid-hidden{display:none}.luna-data-grid .luna-data-grid-invisible,.luna-data-grid.luna-data-grid-invisible{visibility:hidden}.luna-data-grid *{box-sizing:border-box}.luna-data-grid.luna-data-grid-theme-dark{color-scheme:dark;color:hsla(0,0%,100%,.85);color:var(--luna-color-text-dark,rgba(255,255,255,.85));background-color:#141414;background-color:var(--luna-color-bg-container-dark,#141414)}.luna-data-grid{font-size:12px}.luna-data-grid table{width:100%;min-height:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.luna-data-grid td,.luna-data-grid th{padding:1px 4px;border-left:1px solid;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.luna-data-grid td:first-child,.luna-data-grid th:first-child{border-left:none}.luna-data-grid th{font-weight:400;border-bottom:1px solid;text-align:left;position:relative}.luna-data-grid th.luna-data-grid-sortable{padding-right:12px}.luna-data-grid th .luna-data-grid-icon-caret-down,.luna-data-grid th .luna-data-grid-icon-caret-up{font-size:12px;position:absolute;display:none;top:6px;right:2px}.luna-data-grid td{height:20px;cursor:default;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.luna-data-grid:focus .luna-data-grid-node.luna-data-grid-selectable.luna-data-grid-selected{color:#fff}.luna-data-grid-data-container,.luna-data-grid-header-container{overflow:hidden}.luna-data-grid-header-container{height:21px}.luna-data-grid-data-container{overflow-y:auto;position:relative}.luna-data-grid-data-space{min-height:100%}.luna-data-grid-data{position:absolute;left:0;top:0}.luna-data-grid-filler-row td{height:auto}.luna-data-grid-resizer{position:absolute;top:0;bottom:0;width:5px;z-index:500;touch-action:none;cursor:col-resize}.luna-data-grid-resizing{cursor:col-resize!important}.luna-data-grid-resizing .luna-data-grid *{cursor:col-resize!important}.luna-data-grid-theme-light{border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-data-grid-theme-light td,.luna-data-grid-theme-light th{border-color:#d9d9d9;border-color:var(--luna-color-border,#d9d9d9)}.luna-data-grid-theme-light th{background-color:rgba(0,0,0,.06);background-color:var(--luna-color-fill-secondary,rgba(0,0,0,.06))}.luna-data-grid-theme-light th.luna-data-grid-sortable:hover{background-color:rgba(0,0,0,.15);background-color:var(--luna-color-fill,rgba(0,0,0,.15))}.luna-data-grid-theme-light .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selectable:hover,.luna-data-grid-theme-light .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selected{background-color:#ddd}.luna-data-grid-theme-light .luna-data-grid-data-container tr:nth-child(even){background-color:#f2f7fd}.luna-data-grid-theme-light:focus .luna-data-grid-node.luna-data-grid-selectable.luna-data-grid-selected{background-color:#1a73e8;background-color:var(--luna-color-primary,#1a73e8)}.luna-data-grid-theme-dark{border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-data-grid-theme-dark td,.luna-data-grid-theme-dark th{border-color:#424242;border-color:var(--luna-color-border,#424242)}.luna-data-grid-theme-dark th{background-color:hsla(0,0%,100%,.12);background-color:var(--luna-color-fill-secondary,rgba(255,255,255,.12))}.luna-data-grid-theme-dark th.luna-data-grid-sortable:hover{background-color:hsla(0,0%,100%,.18);background-color:var(--luna-color-fill,rgba(255,255,255,.18))}.luna-data-grid-theme-dark .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selectable:hover,.luna-data-grid-theme-dark .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selected{background-color:#393939}.luna-data-grid-theme-dark .luna-data-grid-data-container tr:nth-child(even){background-color:#0b2544}.luna-data-grid-theme-dark:focus .luna-data-grid-node.luna-data-grid-selectable.luna-data-grid-selected{background-color:#1965c8;background-color:var(--luna-color-primary,#1965c8)}',""]),e.exports=t},3290:function(e,t,n){var o=n(975);t=function(e){var t,n=window.location,r=n.hostname,i=n.pathname,a=r.split("."),s=i.split("/"),c="",l=s.length;if(!p())for(var u=a.length-1;u>=0;u--){var d=a[u];if(""!==d){if(p({domain:c=""===c?d:d+"."+c,path:t="/"})||p({domain:c}))return;for(var h=0;h-1&&(t=(0,d.default)(t.split("?")[0])),""===t)&&(t=new l.default(e).hostname);return t}function S(e){if(!e)return{type:"unknown",subType:"unknown"};var t=e.split(";")[0].split("/");return{type:t[0],subType:(0,c.default)(t)}}var E=window.location.origin;function T(e){var t=encodeURIComponent(e).match(/%[89ABab]/g);return e.length+(t?t.length:0)}},3422:function(e,t){t=function(e){return null==e},e.exports=t},3497:function(e,t){t=function(e){var t=e?e.length:0;if(t)return e[t-1]},e.exports=t},3539:function(e,t){t=function(){for(var e=arguments,t=e[0],n=1,o=e.length;nt&&(t=e[n]);return t},e.exports=t},3578:function(e,t,n){"use strict";n.d(t,{A:function(){return on}});var o=n(7528);var r=n(7800);function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o,r,i,a,s=[],c=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(o=i.call(n)).done)&&(s.push(o.value),s.length!==t);c=!0);}catch(e){l=!0,r=e}finally{try{if(!c&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw r}}return s}}(e,t)||(0,r.A)(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var a=n(3029),s=n(2901),c=n(388),l=n(3954),u=n(991),d=n(5361),h=n(5902),f=n.n(h),p=n(2561),v=n.n(p),g=n(3249),m=n.n(g),b=n(1009),y=n.n(b),A=n(4950),w=n.n(A),_=n(9100),x=n.n(_),k=n(1580),C=n.n(k),S=n(9464),E=n.n(S),T=n(15),N=n.n(T),O=n(9931),j=n.n(O);function M(e){return e.constructor&&e.constructor.name?e.constructor.name:j()({}.toString.call(e).replace(/(\[object )|]/g,""))}var I=n(3915),z=n.n(I),D=n(9405),B=n.n(D),F=n(5169),R=n.n(F),L=n(9548),G=n.n(L),P=n(6097),H=n.n(P),Y=n(6030),$=n.n(Y),q=n(5004),Q=n.n(q),U=(n(9410),n(8609)),W=n.n(U);function J(e){var t="luna-".concat(e,"-");function n(e){return z()(B()(e).split(/\s+/),(function(e){return m()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=G().parse(e);return K(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),G().stringify(t)}catch(t){return n(e)}return n(e)}}function K(e,t){for(var n=0,o=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=n.topObj,r=n.level,i=void 0===r?0:r,a=n.getterVal,s=void 0!==a&&a,c=n.unenumerable,l=void 0===c||c,u="",d="",h=[],p=[],g="";o=o||e;var b={getterVal:s,unenumerable:l,level:i+1},A=0===i,w=''),_=''),k=''),S=''),E=''),T=''),O=function(e){return f()(e).replace(/\\n/g,"↵").replace(/\\f|\\r|\\t/g,"").replace(/\\/g,"")},j="";function I(e){return e=v()(e),m()(ee,e)||y()(e,"Array[")?T+O(e)+j:(e.length>100&&(e=N()(e,100,{separator:" ",ellipsis:"…"})),S+O('"'.concat(e,'"'))+j)}function z(n){if(t>5)g=", …";else{var r=function(e){return w+O(e)+j}(ne(n));if(!s){var i=Object.getOwnPropertyDescriptor(e,n);if(i&&i.get)return h.push("".concat(r,": ").concat(I("(...)"))),void t++}h.push("".concat(r,": ").concat(X(o[n],b))),t++}}try{d={}.toString.call(e)}catch(e){d="[object Object]"}var D,B="[object Array]"==d,F="[object Object]"==d,R="[object Number]"==d,L="[object RegExp]"==d,G="[object Symbol]"==d,P="[object Function]"==d,H="[object Boolean]"==d;if("[object String]"==d)u=I(ne(e));else if(L)D=ne(e.toString()),u=S+D+j;else if(P)u=I("ƒ");else if(B)if(A){u="[";var Y=e.length,$="";Y>100&&(Y=100,$=", …");for(var q=0;q0&&void 0!==arguments[0])||arguments[0],t=this.container.getBoundingClientRect(),n=t.width,o=t.height-1;this.height!==o&&(this.height=o,e||this.emit("updateHeight")),this.width!==n&&(this.width=n)}},{key:"html",value:function(){return this.container.outerHTML}},{key:"text",value:function(){return this.content.textContent||""}},{key:"select",value:function(){this.$container.addClass(this.console.c("selected"))}},{key:"deselect",value:function(){this.$container.rmClass(this.console.c("selected"))}},{key:"copy",value:function(){var e=this.args,t="";x()(e,(function(e,n){0!==n&&(t+=" "),ue()(e)?t+=Ze()(e):t+=v()(e)})),et()(t)}},{key:"bindEvent",value:function(){var e=this,t=this.console.c,n=this;this.resizeSensor.addListener(this.onResize),this.$container.on("click",t(".dom-viewer"),(function(e){return e.stopPropagation()})).on("click",t(".preview"),(function(e){if(e.stopPropagation(),!V(this)){var o=$e()(this).find(t(".preview-icon-container")).find(t(".icon")),r="caret-down";o.hasClass(t("icon-caret-down"))&&(r="caret-right"),o.rmAttr("class").addClass([t("icon"),t("icon-".concat(r))]),n.renderObjectViewer(this)}})).on("click",(function(){return e.click()}))}},{key:"renderEl",value:function(){var e=this.elements,t=this.console.c,n=this;this.$container.find(t(".dom-viewer")).each((function(){var t=$e()(this).data("id");new ae.A(this,{node:e[t],theme:n.console.getOption("theme")})}))}},{key:"renderObjectViewer",value:function(e){var t=this.console,n=this.unenumerable,o=this.accessGetter,r=this.lazyEvaluation,i=t.c,a=$e()(e),s=a.data("id");if(s){var c=this.objects[s],l=a.find(i(".json"));if(l.hasClass(i("hidden"))){if("true"!==l.data("init")){if(r){var u=new re.A(l.get(0),{unenumerable:n,accessGetter:o});u.setOption("theme",t.getOption("theme")),u.set(c)}else{var d=new re.j(l.get(0));d.setOption("theme",t.getOption("theme")),d.set(c)}l.data("init","true")}l.rmClass(i("hidden"))}else l.addClass(i("hidden"))}}},{key:"renderTable",value:function(e){var t=this,n="__LunaConsoleValue",o=this.columns,r=this.$container,i=this.console,a=i.c,s=r.find(a(".data-grid")),c=e[0],l=new ie.A(s.get(0),{columns:ke()([{id:"(index)",title:"(index)",sortable:!0}],z()(o,(function(e){return{id:e,title:e===n?"Value":e,sortable:!0}}))),theme:i.getOption("theme")});x()(c,(function(e,r){var i={"(index)":v()(r)};o.forEach((function(o){ue()(e)?i[o]=o===n?"":t.formatTableVal(e[o]):ge()(e)&&(i[o]=o===n?t.formatTableVal(e):"")})),l.append(i)}))}},{key:"extractObj",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,o=this.accessGetter,r=this.unenumerable;be()(t,{accessGetter:o,unenumerable:r,symbol:r,timeout:1e3}),function(e,t,n){var o=nt()(e,t);rt()((function(){return n(o)}))}(e,t,(function(e){return n(JSON.parse(e))}))}},{key:"click",value:function(){var e=this.type,t=this.$container,n=this.console,o=n.c;switch(e){case"log":case"warn":case"info":case"debug":case"output":case"table":case"dir":break;case"group":case"groupCollapsed":V(this.container)||n.toggleGroup(this);break;case"error":V(this.container)||t.find(o(".stack")).toggleClass(o("hidden"))}}},{key:"formatMsg",value:function(){var e=this.args,t=this.type,n=this.id,o=this.header,r=this.group,i=this.console.c;e=Re()(e);var a,s,c="";switch("group"!==t&&"groupCollapsed"!==t||0===e.length&&(e=["console.group"]),t){case"log":case"info":case"debug":c=this.formatCommon(e);break;case"dir":c=this.formatDir(e);break;case"warn":a="warn",c=this.formatCommon(e);break;case"error":he()(e[0])&&1!==e.length&&(e=this.substituteStr(e)),s=e[0],a="error",s=pe()(s)?s:new Error(this.formatCommon(e)),c=this.formatErr(s);break;case"table":c=this.formatTable(e);break;case"html":c=e[0];break;case"input":c=this.formatJs(e[0]),a="input";break;case"output":c=this.formatCommon(e),a="output";break;case"groupCollapsed":c=this.formatCommon(e),a="caret-right";break;case"group":c=this.formatCommon(e),a="caret-down"}if(m()(["log","debug","warn"],t)&&this.isSimple()&&(c=at()(c,(function(e){return'').concat(e,"")}))),c=this.render({msg:c,type:t,icon:a,id:n,header:o,group:r}),this.$container.addClass("".concat(i("log-container"))).html(c),"table"===t)E()(this.columns)||this.renderTable(e);E()(this.elements)||this.renderEl(),this.$content=this.$container.find(i(".log-content")),this.content=this.$content.get(0)}},{key:"render",value:function(e){var t=this.console.c,n="",r="";if(e.group)for(var i=e.group.indentLevel,a=0;a');e.header&&(n+=ht()(oe||(oe=(0,o.A)(['\n
\n ','\n
\n '," ","\n
\n
"])),t("header"),r,t("time-from-container"),e.header.time,e.header.from));var s="";return e.icon&&(s='
')),n+='\n
\n ').concat(r,"\n ").concat(s,'\n
\n
\n
\n
\n
').concat(e.msg,"
\n
\n
")}},{key:"formatTable",value:function(e){var t=e[0],n=e[1],o=[];return he()(n)&&(n=Me()(n)),ze()(n)||(n=null),ue()(t)?(x()(t,(function(e){ge()(e)?o.push("__LunaConsoleValue"):ue()(e)&&(o=o.concat(He()(e)))})),(o=Be()(o)).sort(),n&&(o=o.filter((function(e){return m()(n,e)}))),o.length>20&&(o=o.slice(0,20)),E()(o)?this.formatCommon(e):(this.columns=o,this.console.c('
')+this.formatPreview(t))):this.formatCommon(e)}},{key:"formatErr",value:function(e){var t=e.stack?e.stack.split("\n"):[],n=e.name?"".concat(e.name,": "):"";return n+="".concat(e.message||t[0],"
"),t=t.map((function(e){return f()(e)})),n+'
').concat(t.slice(1).join("
"),"
").replace(kt,(function(e){return'').concat(e,"")}))}},{key:"formatCommon",value:function(e){var t=this.console.c,n=he()(e[0])&&1!==e.length;n&&(e=this.substituteStr(e));for(var o=0,r=e.length;o').concat(f()(v()(i)),"
"):ue()(i)?e[o]=this.formatPreview(i):Te()(i)?e[o]='undefined'):Se()(i)?e[o]='null'):H()(i)?e[o]='').concat(v()(i),""):"bigint"==typeof i?e[o]='').concat(v()(i),"n"):bt()(i)?e[o]='').concat(v()(i),""):At()(i)?e[o]='').concat(f()(v()(i)),""):(i=v()(i),0===o&&n||(i=f()(i)),i.length>5e3&&(i=N()(i,5e3,{separator:" ",ellipsis:"…"})),e[o]=i)}return e.join(" ")}},{key:"formatDir",value:function(e){return ue()(e[0])?this.formatPreview(e[0]):this.formatCommon(e)}},{key:"formatTableVal",value:function(e){var t=this.console.c;return ue()(e)?"{…}":ge()(e)?pt()('
').concat(X(e),"
")):v()(e)}},{key:"formatPreview",value:function(e){var t=this,n=this.console.c,o=gt()();this.lazyEvaluation?this.objects[o]=e:this.extractObj(e,{},(function(e){t.objects[o]=e}));var r=m()(["dir","table"],this.type),i=M(e);return"Array"===i&&e.length>1?(i="(".concat(e.length,")"),r&&(i="Array".concat(i))):"RegExp"===i?i=v()(e):Ae()(e)&&(i=this.formatElName(e)),'
')+'
')+'
')+'')+'').concat(f()(i)," ")+'').concat(r?"":X(e,{getterVal:this.accessGetter,unenumerable:!1}),"")+"
"+'
')}},{key:"substituteStr",value:function(e){var t=f()(e[0]),n=!1,o="";e.shift();for(var r=0,i=t.length;r"),n=!0,o+='');break;default:r--,e.unshift(s),o+=a}}else o+=a}return n&&(o+=""),e.unshift(o),e}},{key:"formatJs",value:function(e){var t=ct()(e,"js",Ct);return t!==e&&(t=this.console.c(t)),'
').concat(t,"
")}},{key:"formatFn",value:function(e){return'
'.concat(this.formatJs(e.toString()),"
")}},{key:"formatElName",value:function(e){var t=e.id,n=e.className,o=e.tagName.toLowerCase();if(""!==t&&(o+="#".concat(t)),he()(n)){var r="";x()(n.split(/\s+/g),(function(e){""!==e.trim()&&(r+=".".concat(e))})),o+=r}return o}},{key:"formatEl",value:function(e){var t=gt()();return this.elements[t]=e,this.console.c('
'))}}])}(We());function Et(e){var t=(e=Ge()(e)).split(";"),n={};x()(t,(function(e){if(m()(e,":")){var t=i(e.split(":"),2),o=t[0],r=t[1];n[B()(o)]=B()(r)}})),n.display="inline-block",n["max-width"]="100%",delete n.width,delete n.height;var o="";return x()(n,(function(e,t){o+="".concat(t,":").concat(e,";")})),o}var Tt=n(5820),Nt=n.n(Tt),Ot=n(3981),jt=n.n(Ot),Mt=n(8105),It=n.n(Mt),zt=n(7005),Dt=n.n(zt),Bt=n(3497),Ft=n.n(Bt),Rt=n(5865),Lt=n.n(Rt),Gt=n(8862),Pt=n.n(Gt),Ht=n(7030),Yt=n.n(Ht),$t=n(961),qt=n.n($t),Qt=n(7e3),Ut=n.n(Qt);function Wt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Wt=function(){return!!e})()}var Jt,Kt=function(e){function t(e,n){var o,r,i=n.compName,s=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===s?"light":s;return(0,a.A)(this,t),o=function(e,t,n){return t=(0,l.A)(t),(0,c.A)(e,Wt()?Reflect.construct(t,n||[],(0,l.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=i,o.c=J(i),o.options={},o.container=e,o.$container=$e()(e),o.$container.addClass(["luna-".concat(i),o.c("platform-".concat((r=Q()(),"os x"===r?"mac":r)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=Ut().get()),o.setTheme(n),x()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),Ut().on("change",o.onThemeChange),o.setOption("theme",u),o}return(0,d.A)(t,e),(0,s.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");x()(n.split(/\s+/),(function(n){y()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),Ut().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,x()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){qt()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){x()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};be()(e,t),It()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(We()),Vt=n(2228),Zt=n.n(Vt);function Xt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Xt=function(){return!!e})()}e=n.hmd(e);var en=navigator.userAgent,tn=en.indexOf("Android")>-1||en.indexOf("Adr")>-1,nn=0,on=function(e){function t(e){var n,o,r,i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,a.A)(this,t),o=this,r=t,i=[e,{compName:"console"},s],r=(0,l.A)(r),(n=(0,c.A)(o,Xt()?Reflect.construct(r,i||[],(0,l.A)(o).constructor):r.apply(o,i))).spaceHeight=0,n.topSpaceHeight=0,n.bottomSpaceHeight=0,n.lastScrollTop=0,n.lastTimestamp=0,n.speedToleranceFactor=100,n.maxSpeedTolerance=2e3,n.minSpeedTolerance=100,n.logs=[],n.displayLogs=[],n.timer={},n.counter={},n.asyncList=[],n.asyncTimer=null,n.isAtBottom=!0,n.groupStack=new(Dt()),n.selectedLog=null,n.onScroll=function(){var e=n.container,t=e.scrollHeight,o=e.offsetHeight,r=e.scrollTop;if(!(r<=0||o+r>t)){var i=!1;(t===o||Math.abs(t-o-r)<1)&&(i=!0),n.isAtBottom=i;var a=n.lastScrollTop,s=n.lastTimestamp,c=jt()(),l=c-s,u=r-a,d=Math.abs(u/l)*n.speedToleranceFactor;l>1e3&&(d=1e3),d>n.maxSpeedTolerance&&(d=n.maxSpeedTolerance),dr+o+f||n.renderViewport({topTolerance:2*h,bottomTolerance:2*f})}},n.initTpl(),n.initOptions(s,{maxNum:0,asyncRender:!0,showHeader:!1,filter:"",level:["verbose","info","warning","error"],accessGetter:!1,unenumerable:!0,lazyEvaluation:!0}),n.$el=n.find(".logs"),n.el=n.$el.get(0),n.$fakeEl=n.find(".fake-logs"),n.fakeEl=n.$fakeEl.get(0),n.$space=n.find(".logs-space"),n.space=n.$space.get(0),tn&&(n.speedToleranceFactor=800,n.maxSpeedTolerance=3e3,n.minSpeedTolerance=800),n.resizeSensor=new(ce())(e),n.renderViewport=Lt()((function(e){n._renderViewport(e)}),16),n.global={copy:function(e){he()(e)||(e=JSON.stringify(e,null,2)),et()(e)},$:function(e){return document.querySelector(e)},$$:function(e){return Me()(document.querySelectorAll(e))},$x:function(e){return Pt()(e)},clear:function(){n.clear()},dir:function(e){n.dir(e)},table:function(e,t){n.table(e,t)},keys:He()},n.bindEvent(),n}return(0,d.A)(t,e),(0,s.A)(t,[{key:"setGlobal",value:function(e,t){this.global[e]=t}},{key:"destroy",value:function(){var e,n,o,r,i;this.$container.off("scroll",this.onScroll),this.resizeSensor.destroy(),(e=t,n="destroy",o=this,r=3,i=(0,u.A)((0,l.A)(1&r?e.prototype:e),n,o),2&r&&"function"==typeof i?function(e){return i.apply(o,e)}:i)([])}},{key:"count",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default",t=this.counter;Te()(t[e])?t[e]=1:t[e]++,this.info("".concat(e,": ").concat(t[e]))}},{key:"countReset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default";this.counter[e]=0}},{key:"assert",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]?arguments[0]:"default";if(this.timer[e])return this.insert("warn",["Timer '".concat(e,"' already exists")]);this.timer[e]=Nt()()}},{key:"timeLog",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default",t=this.timer[e];if(!t)return this.insert("warn",["Timer '".concat(e,"' does not exist")]);this.info("".concat(e,": ").concat(Nt()()-t,"ms"))}},{key:"timeEnd",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"default";this.timeLog(e),delete this.timer[e]}},{key:"clear",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.logs=[],this.displayLogs=[],this.selectLog(null),this.lastLog=void 0,this.counter={},this.timer={},this.groupStack=new(Dt()),this.asyncList=[],this.asyncTimer&&(clearTimeout(this.asyncTimer),this.asyncTimer=null),e?this.render():this.insert("log",["%cConsole was cleared","color:#808080;font-style:italic;"])}},{key:"info",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&(o.group=a.peek()),It()(o,{id:++nn,accessGetter:l,unenumerable:u,lazyEvaluation:d}),"group"===o.type||"groupCollapsed"===o.type){var h={id:gt()("group"),collapsed:!1,parent:a.peek(),indentLevel:a.size+1};"groupCollapsed"===o.type&&(h.collapsed=!0),o.targetGroup=h,a.push(h)}var f=new St(this,o);f.on("updateHeight",(function(){r.isAtBottom=!1,r.renderViewport()}));var p=this.lastLog;if(p&&!m()(["html","group","groupCollapsed"],f.type)&&p.type===f.type&&f.isSimple()&&p.text()===f.text()?(p.addCount(),f.header&&p.updateTime(f.header.time),f=p,this.detachLog(p)):(i.push(f),this.lastLog=f),0!==c&&i.length>c){var v=i[0];this.detachLog(v),i.shift()}this.attachLog(f),this.emit("insert",f)}},{key:"updateTopSpace",value:function(e){this.topSpaceHeight=e,this.el.style.top=e+"px"}},{key:"updateBottomSpace",value:function(e){this.bottomSpaceHeight=e}},{key:"updateSpace",value:function(e){this.spaceHeight!==e&&(this.spaceHeight=e,this.space.style.height=e+"px")}},{key:"detachLog",value:function(e){var t=this.displayLogs,n=t.indexOf(e);n>-1&&(t.splice(n,1),this.renderViewport())}},{key:"attachLog",value:function(e){if(this.filterLog(e)&&!e.collapsed){var t=this.displayLogs;if(0===t.length)return t.push(e),void this.renderViewport();var n=Ft()(t);if(e.id>n.id)return t.push(e),void this.renderViewport();for(var o,r=0,i=t.length-1,a=0;r<=i;){if((o=t[a=r+Math.floor((i-r)/2)]).id===e.id)return;o.id0&&void 0!==arguments[0]?arguments[0]:20,n=this.asyncList;this.asyncTimer||(this.asyncTimer=setTimeout((function(){e.asyncTimer=null;var t,o,r=!1,a=n.length;a<1e3?(o=200,t=400):a<5e3?(o=500,t=800):a<1e4?(o=800,t=1e3):a<25e3?(o=1e3,t=1200):a<5e4?(o=1500,t=1500):(o=2e3,t=2500),o>a&&(o=a,r=!0);for(var s=0;s0&&o.length>n&&(e.logs=o.slice(o.length-n),e.render());break;case"filter":e.render();break;case"level":e.options.level=Me()(n),e.render()}})),this.$container.on("scroll",this.onScroll)}},{key:"_renderViewport",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.topTolerance,n=void 0===t?500:t,o=e.bottomTolerance,r=void 0===o?500:o,i=this.el,a=this.container,s=this.space;if(!W()(a)){for(var c=a.scrollTop,l=a.offsetHeight,u=s.getBoundingClientRect().width,d=c-n,h=c+l+r,f=this.displayLogs,p=0,v=0,g=0,m=f.length,b=this.fakeEl,y=document.createDocumentFragment(),A=[],w=0;w0){b.appendChild(y);for(var k=0,C=A.length;kh?v+=O:g+O>d?S.appendChild(N):g\n
\n
\n \n '])))))}}])}(Kt),rn=function(){return Yt()("HH:MM:ss ")};function an(){for(var e=new Error,t="",n=e.stack?e.stack.split("\n"):"",o=0,r=n.length;o-1&&o0)&&!(o=i.next()).done;)a.push(o.value)}catch(e){r={error:e}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return a},o=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],o=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&o>=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};function r(e,t){var n=e[3];return[(1-n)*t[0]+n*e[0],(1-n)*t[1]+n*e[1],(1-n)*t[2]+n*e[2],n+t[3]*(1-n)]}function i(e){var t=n(e,3),o=t[0],r=t[1],i=t[2];return.2126*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))}Object.defineProperty(t,"__esModule",{value:!0}),t.getContrastThreshold=t.isLargeFont=t.getAPCAThreshold=t.desiredLuminanceAPCA=t.contrastRatioByLuminanceAPCA=t.contrastRatioAPCA=t.luminanceAPCA=t.contrastRatio=t.luminance=t.rgbaToHsla=t.blendColors=void 0,t.blendColors=r,t.rgbaToHsla=function(e){var t=n(e,4),o=t[0],r=t[1],i=t[2],a=t[3],s=Math.max(o,r,i),c=Math.min(o,r,i),l=s-c,u=s+c,d=.5*u;return[c===s?0:o===s?(1/6*(r-i)/l+1)%1:r===s?1/6*(i-o)/l+1/3:1/6*(o-r)/l+2/3,0===d||1===d?0:d<=.5?l/u:l/(2-u),d,a]},t.luminance=i,t.contrastRatio=function(e,t){var n=i(r(e,t)),o=i(t);return(Math.max(n,o)+.05)/(Math.min(n,o)+.05)};var a=12.82051282051282,s=.06;function c(e){var t=n(e,3),o=t[0],r=t[1],i=t[2];return.2126729*Math.pow(o,2.4)+.7151522*Math.pow(r,2.4)+.072175*Math.pow(i,2.4)}function l(e){return e>.03?e:e+Math.pow(.03-e,1.45)}function u(e,t){if(e=l(e),t=l(t),Math.abs(e-t)<5e-4)return 0;var n=0;return 100*(n=t>=e?(n=1.25*(Math.pow(t,.55)-Math.pow(e,.58)))<.001?0:n<.078?n-n*a*s:n-s:(n=1.25*(Math.pow(t,.62)-Math.pow(e,.57)))>-.001?0:n>-.078?n-n*a*s:n+s)}t.luminanceAPCA=c,t.contrastRatioAPCA=function(e,t){return u(c(e),c(t))},t.contrastRatioByLuminanceAPCA=u,t.desiredLuminanceAPCA=function(e,t,n){function o(){return n?Math.pow(Math.abs(Math.pow(e,.62)-(-t-s)/1.25),1/.57):Math.pow(Math.abs(Math.pow(e,.55)-(t+s)/1.25),1/.58)}e=l(e),t/=100;var r=o();return(r<0||r>1)&&(n=!n,r=o()),r};var d=[[12,-1,-1,-1,-1,100,90,80,-1,-1],[14,-1,-1,-1,100,90,80,60,60,-1],[16,-1,-1,100,90,80,60,55,50,50],[18,-1,-1,90,80,60,55,50,40,40],[24,-1,100,80,60,55,50,40,38,35],[30,-1,90,70,55,50,40,38,35,40],[36,-1,80,60,50,40,38,35,30,25],[48,100,70,55,40,38,35,30,25,20],[60,90,60,50,38,35,30,25,20,20],[72,80,55,40,35,30,25,20,20,20],[96,70,50,35,30,25,20,20,20,20],[120,60,40,30,25,20,20,20,20,20]];function h(e,t){var n=72*parseFloat(e.replace("px",""))/96;return-1!==["bold","bolder","600","700","800","900"].indexOf(t)?n>=14:n>=18}d.reverse(),t.getAPCAThreshold=function(e,t){var r,i,a,s,c=parseFloat(e.replace("px","")),l=parseFloat(t);try{for(var u=o(d),h=u.next();!h.done;h=u.next()){var f=n(h.value),p=f[0],v=f.slice(1);if(c>=p)try{for(var g=(a=void 0,o([900,800,700,600,500,400,300,200,100].entries())),m=g.next();!m.done;m=g.next()){var b=n(m.value,2),y=b[0];if(l>=b[1]){var A=v[v.length-1-y];return-1===A?null:A}}}catch(e){a={error:e}}finally{try{m&&!m.done&&(s=g.return)&&s.call(g)}finally{if(a)throw a.error}}}}catch(e){r={error:e}}finally{try{h&&!h.done&&(i=u.return)&&i.call(u)}finally{if(r)throw r.error}}return null},t.isLargeFont=h;var f={aa:3,aaa:4.5},p={aa:4.5,aaa:7};t.getContrastThreshold=function(e,t){return h(e,t)?f:p}},3722:function(e,t,n){var o=n(3145);t=function(e){return Object.freeze?Object.freeze(e):(o(e).forEach((function(t){Object.getOwnPropertyDescriptor(e,t).configurable&&Object.defineProperty(e,t,{writable:!1,configurable:!1})})),e)},e.exports=t},3737:function(e,t,n){var o=n(2263);t=o.extend({className:"MediaQuery",initialize:function(e){var t=this;this.callSuper(o,"initialize"),this._listener=function(){t.emit(t.isMatch()?"match":"unmatch")},this.setQuery(e)},setQuery:function(e){this._mql&&this._mql.removeListener(this._listener),this._mql=window.matchMedia(e),this._mql.addListener(this._listener)},isMatch:function(){return this._mql.matches}}),e.exports=t},3750:function(e,t,n){var o=n(3974);t=function(e){return"[object Blob]"===o(e)},e.exports=t},3752:function(e,t,n){var o=n(2510),r=n(769);t=o((function(e,t){return function(){var n=[];return n=(n=n.concat(t)).concat(r(arguments)),e.apply(this,n)}})),e.exports=t},3793:function(e,t,n){var o=n(8966),r=n(8971),i=n(3612),a=n(9100);function s(e){return function(t,n,s,c){t=i(t),r(c)&&(c=s,s=void 0),a(t,(function(t){o[e](t,n,s,c)}))}}t={on:s("add"),off:s("remove")},e.exports=t},3805:function(e,t,n){var o=n(2561);t=function(e){return o(e).toLocaleUpperCase()},e.exports=t},3915:function(e,t,n){var o=n(5693),r=n(3145),i=n(5793);t=function(e,t,n){t=o(t,n);for(var a=!i(e)&&r(e),s=(a||e).length,c=Array(s),l=0;l=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,r,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(o=i.next()).done;)a.push(o.value)}catch(e){r={error:e}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return a},i=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var o,r=0,i=t.length;r]*>/g.test(e))try{var t=Oe().parse(e);return De(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=Be(e.attrs.class))})),Oe().stringify(t)}catch(t){return Be(e)}return Be(e)}function De(e,t){for(var n=0,o=e.length;n3||Math.abs(a)>3)&&(r._isClick=!1);var s=r._oldX+i,c=r._oldY+a;s<0?s=0:s>n-t&&(s=n-t),c<0?c=0:c>o-t&&(c=o-t),r._$el.css({left:s,top:c})})),(0,c.A)(r,"_onDragEnd",(function(e){var t=r._$el;r._isClick&&r.emit("click"),r._onDragMove(e),Ge.off(pe()("move"),r._onDragMove),Ge.off(pe()("up"),r._onDragEnd);var n=r.config;n.get("rememberPos")&&n.set("pos",{x:Me(t.css("left")),y:Me(t.css("top"))}),t.rmClass("eruda-active")})),r._style=re(n(6717)),r._$container=e,r._initTpl(),r._bindEvent(),r._registerListener(),r}return(0,s.A)(t,e),(0,r.A)(t,[{key:"hide",value:function(){this._$el.hide()}},{key:"show",value:function(){this._$el.show()}},{key:"setPos",value:function(e){this._isOutOfRange(e)&&(e=this._getDefPos()),this._$el.css({left:e.x,top:e.y}),this.config.set("pos",e)}},{key:"getPos",value:function(){return this.config.get("pos")}},{key:"destroy",value:function(){re.remove(this._style),this._unregisterListener(),this._$el.remove()}},{key:"_isOutOfRange",value:function(e){e=e||this.config.get("pos");var t=this._getDefPos();return e.x>t.x+10||e.x<0||e.y<0||e.y>t.y+10}},{key:"_registerListener",value:function(){var e=this;this._scaleListener=function(){return ue()((function(){e._isOutOfRange()&&e._resetPos()}))},h.on(h.SCALE,this._scaleListener)}},{key:"_unregisterListener",value:function(){h.off(h.SCALE,this._scaleListener)}},{key:"_initTpl",value:function(){var e=this._$container;e.append(ze('
')),this._$el=e.find(".eruda-entry-btn")}},{key:"_resetPos",value:function(e){var t=this.config,n=t.get("pos"),o=this._getDefPos();t.get("rememberPos")&&!e||(n=o),this.setPos(n)}},{key:"_bindEvent",value:function(){var e=this;this._$el.on(pe()("down"),this._onDragStart),he().on("change",(function(){return e._resetPos(!0)})),window.addEventListener("resize",(function(){return e._resetPos()}))}},{key:"initCfg",value:function(e){var t=this.config=ce.createCfg("entry-button",{rememberPos:!0,pos:this._getDefPos()});e.switch(t,"rememberPos","Remember Entry Button Position"),this._resetPos()}},{key:"_getDefPos",value:function(){var e=this._$el.get(0).offsetWidth+10;return{x:window.innerWidth-e,y:window.innerHeight-e}}}])}(u()),He=n(5458),Ye=n(7622),$e=Le=new(n.n(Ye)())("[Eruda]","warn");Le.formatter=function(e,t){return t.unshift(this.name),t};var qe=n(6097),Qe=n.n(qe),Ue=n(7e3),We=n.n(Ue),Je=n(9931),Ke=n.n(Je),Ve=n(1009),Ze=n.n(Ve),Xe=n(5570),et=n.n(Xe),tt=n(2556),nt=n(1944),ot=n(8052);function rt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(rt=function(){return!!e})()}var it=function(e){function t(e){var r,s,l,u,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},h=d.defaults,f=void 0===h?{}:h,p=d.inline,v=void 0!==p&&p;return(0,o.A)(this,t),s=this,l=t,l=(0,a.A)(l),r=(0,i.A)(s,rt()?Reflect.construct(l,u||[],(0,a.A)(s).constructor):l.apply(s,u)),(0,c.A)(r,"_checkSafeArea",(function(){var e=r.$container;!function(){var e=!1,t=document.createElement("div");if(CSS.supports("padding-bottom: env(safe-area-inset-bottom)")?(t.style.paddingBottom="env(safe-area-inset-bottom)",e=!0):CSS.supports("padding-bottom: constant(safe-area-inset-bottom)")&&(t.style.paddingBottom="constant(safe-area-inset-bottom)",e=!0),e){document.body.appendChild(t);var n=parseInt(window.getComputedStyle(t).paddingBottom);if(document.body.removeChild(t),n>0)return!0}return!1}()?e.rmClass(ze("safe-area")):e.addClass(ze("safe-area"))})),(0,c.A)(r,"_updateTabHeight",(function(e){r._tab.setOption("height",40*e),ue()((function(){r._tab.updateSlider()}))})),r._defCfg=P()({transparency:1,displaySize:80,theme:"System preference"},f),r._style=re(n(541)),r.$container=e,r._isShow=!1,r._opacity=1,r._tools={},r._isResizing=!1,r._resizeTimer=null,r._resizeStartY=0,r._resizeStartSize=0,r._inline=v,r._initTpl(),r._initTab(),r._initNotification(),r._initModal(),et()((function(){return r._checkSafeArea()})),r._bindEvent(),r}return(0,s.A)(t,e),(0,r.A)(t,[{key:"show",value:function(){var e=this;return this._isShow=!0,this._$el.show(),this._tab.updateSlider(),setTimeout((function(){e._$el.css("opacity",e._opacity)}),50),this.emit("show"),this}},{key:"hide",value:function(){var e=this;if(!this._inline)return this._isShow=!1,this.emit("hide"),this._$el.css({opacity:0}),setTimeout((function(){return e._$el.hide()}),300),this}},{key:"toggle",value:function(){return this._isShow?this.hide():this.show()}},{key:"add",value:function(e){var t=this._tab;if(!(e instanceof v)){var n=new v,o=n.init,r=n.show,i=n.hide,a=n.destroy;L()(e,{init:o,show:r,hide:i,destroy:a})}var s=e.name;if(!s)return $e.error("You must specify a name for a tool");if(this._tools[s])return $e.warn("Tool ".concat(s," already exists"));var c=s.replace(/\s+/g,"-");return this._$tools.prepend('
')),e.init(this._$tools.find(".".concat(ze(c),".").concat(ze("tool"))),this),e.active=!1,this._tools[s]=e,"settings"===s?t.append({id:s,title:s}):t.insert(t.length-1,{id:s,title:s}),this}},{key:"remove",value:function(e){var t=this._tools;if(!t[e])return $e.warn("Tool ".concat(e," doesn't exist"));this._tab.remove(e);var n=t[e];if(delete t[e],n.active){var o=D()(t);o.length>0&&this.showTool(t[Ae()(o)].name)}return n.destroy(),this}},{key:"removeAll",value:function(){var e=this;return x()(this._tools,(function(t){return e.remove(t.name)})),this}},{key:"get",value:function(e){var t=this._tools[e];if(t)return t}},{key:"showTool",value:function(e){if(this._curTool===e)return this;this._curTool=e;var t=this._tools,n=t[e];if(n){var o={};return x()(t,(function(e){e.active&&(o=e,e.active=!1,e.hide())})),n.active=!0,n.show(),this._tab.select(e),this.emit("showTool",e,o),this}}},{key:"initCfg",value:function(e){var t=this,n=this.config=ce.createCfg("dev-tools",this._defCfg);this._setTransparency(n.get("transparency")),this._setDisplaySize(n.get("displaySize")),this._setTheme(n.get("theme")),n.on("change",(function(e,n){switch(e){case"transparency":return t._setTransparency(n);case"displaySize":return t._setDisplaySize(n);case"theme":return t._setTheme(n)}})),e.separator().select(n,"theme","Theme",["System preference"].concat((0,He.A)(D()(re.getThemes())))),this._inline||e.range(n,"transparency","Transparency",{min:.2,max:1,step:.01}).range(n,"displaySize","Display Size",{min:40,max:100,step:1}),e.button("Restore defaults and reload",(function(){var e=je("local"),t=JSON.parse(JSON.stringify(e));x()(t,(function(t,n){E()(t)&&Ze()(n,"eruda")&&e.removeItem(n)})),window.location.reload()})).separator()}},{key:"notify",value:function(e,t){this._notification.notify(e,t)}},{key:"destroy",value:function(){re.remove(this._style),this.removeAll(),this._tab.destroy(),this._$el.remove(),window.removeEventListener("resize",this._checkSafeArea),h.off(h.SCALE,this._updateTabHeight)}},{key:"_setTheme",value:function(e){var t=this.$container;"System preference"===e&&(e=Ke()(We().get())),K(e)?t.addClass(ze("dark")):t.rmClass(ze("dark")),re.setTheme(e)}},{key:"_setTransparency",value:function(e){Qe()(e)&&(this._opacity=e,this._isShow&&this._$el.css({opacity:e}))}},{key:"_setDisplaySize",value:function(e){this._inline&&(e=100),Qe()(e)&&this._$el.css({height:e+"%"})}},{key:"_initTpl",value:function(){var e=this.$container;e.append(ze('\n
\n
\n
\n
\n
\n \n
\n ')),this._$el=e.find(ze(".dev-tools")),this._$tools=this._$el.find(ze(".tools"))}},{key:"_initTab",value:function(){var e=this;this._tab=new ot.A(this._$el.find(ze(".tab")).get(0),{height:40}),this._tab.on("select",(function(t){return e.showTool(t)}))}},{key:"_initNotification",value:function(){this._notification=new tt.A(this._$el.find(ze(".notification")).get(0),{position:{x:"center",y:"top"}})}},{key:"_initModal",value:function(){nt.A.setContainer(this._$el.find(ze(".modal")).get(0))}},{key:"_bindEvent",value:function(){var e=this,t=this._$el.find(ze(".resizer")),n=this._$el.find(ze(".nav-bar")),o=m()(document);this._inline&&t.hide();var r=function(t){if(e._isResizing){t.preventDefault(),t.stopPropagation(),t=t.origEvent;var n=(e._resizeStartY-Fe("y",t))/window.innerHeight*100,o=e._resizeStartSize+n;o<40?o=40:o>100&&(o=100),e.config.set("displaySize",Se()(o.toFixed(2)))}},i=function(){clearTimeout(e._resizeTimer),e._isResizing=!1,t.css("height",10),o.off(pe()("move"),r),o.off(pe()("up"),i)};t.css("height",10),t.on(pe()("down"),(function(n){n.preventDefault(),n.stopPropagation(),n=n.origEvent,e._isResizing=!0,e._resizeStartSize=e.config.get("displaySize"),e._resizeStartY=Fe("y",n),t.css("height","100%"),o.on(pe()("move"),r),o.on(pe()("up"),i)})),n.on("contextmenu",(function(e){return e.preventDefault()})),this.$container.on("click",(function(e){return e.stopPropagation()})),window.addEventListener("resize",this._checkSafeArea),h.on(h.SCALE,this._updateTabHeight),We().on("change",(function(){var t=e.config.get("theme");"System preference"===t&&e._setTheme(t)}))}}])}(u()),at=n(9993),st=n.n(at),ct=n(3957),lt=n.n(ct),ut=n(1976),dt=n.n(ut),ht=n(6962),ft=n.n(ht),pt=n(8609),vt=n.n(pt),gt=n(4236),mt=n.n(gt),bt=n(3578);function yt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(yt=function(){return!!e})()}function At(e,t,n,o){var r=(0,f.A)((0,a.A)(1&o?e.prototype:e),t,n);return 2&o&&"function"==typeof r?function(e){return r.apply(n,e)}:r}ft().start();var wt=function(e){function t(){var e,n,r,s,l=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).name,d=void 0===l?"console":l;return(0,o.A)(this,t),n=this,r=t,r=(0,a.A)(r),e=(0,i.A)(n,yt()?Reflect.construct(r,s||[],(0,a.A)(n).constructor):r.apply(n,s)),(0,c.A)(e,"_handleShow",(function(){vt()(e._$el.get(0))||e._logger.renderViewport()})),(0,c.A)(e,"_handleErr",(function(t){e._logger.error(t)})),u().mixin(e),e.name=d,e._selectedLog=null,e}return(0,s.A)(t,e),(0,r.A)(t,[{key:"init",value:function(e,n){At(t,"init",this,3)([e]),this._container=n,this._appendTpl(),this._initCfg(),this._initLogger(),this._exposeLogger(),this._bindEvent()}},{key:"show",value:function(){At(t,"show",this,3)([]),this._handleShow()}},{key:"overrideConsole",value:function(){var e=this,t=this._origConsole={},n=window.console;return _t.forEach((function(o){var r=t[o]=st();n[o]&&(r=t[o]=n[o].bind(n)),n[o]=function(){e[o].apply(e,arguments),r.apply(void 0,arguments)}})),this}},{key:"setGlobal",value:function(e,t){this._logger.setGlobal(e,t)}},{key:"restoreConsole",value:function(){var e=this;return this._origConsole?(_t.forEach((function(t){return window.console[t]=e._origConsole[t]})),delete this._origConsole,this):this}},{key:"catchGlobalErr",value:function(){return ft().addListener(this._handleErr),this}},{key:"ignoreGlobalErr",value:function(){return ft().rmListener(this._handleErr),this}},{key:"filter",value:function(e){var t=this._$filterText,n=this._logger;E()(e)?(t.text(e),n.setOption("filter",Te()(e))):dt()(e)?(t.text(I()(e)),n.setOption("filter",e)):lt()(e)&&(t.text("ƒ"),n.setOption("filter",e))}},{key:"destroy",value:function(){this._logger.destroy(),At(t,"destroy",this,3)([]),this._container.off("show",this._handleShow),this._style&&re.remove(this._style),this.ignoreGlobalErr(),this.restoreConsole(),this._rmCfg()}},{key:"_enableJsExecution",value:function(e){var t=this._$el,n=t.find(ze(".js-input"));e?(n.show(),t.rmClass(ze("js-input-hidden"))):(n.hide(),t.addClass(ze("js-input-hidden")))}},{key:"_appendTpl",value:function(){var e=this._$el;this._style=re(n(6567)),e.append(ze('\n
\n \n All\n Info\n Warning\n Error\n \n \n \n
\n
\n
\n
\n
Cancel
\n
Execute
\n
\n \n \n
\n '));var t=e.find(ze(".js-input")),o=t.find("textarea"),r=t.find(ze(".buttons"));P()(this,{_$control:e.find(ze(".control")),_$logs:e.find(ze(".logs-container")),_$inputContainer:t,_$input:o,_$inputBtns:r,_$filterText:e.find(ze(".filter-text"))})}},{key:"_initLogger",value:function(){var e=this.config,t=e.get("maxLogNum");t="infinite"===t?0:+t;var n=this._$control.find(ze(".level")),o=new bt.A(this._$logs.get(0),{asyncRender:e.get("asyncRender"),maxNum:t,showHeader:e.get("displayExtraInfo"),unenumerable:e.get("displayUnenumerable"),accessGetter:e.get("displayGetterVal"),lazyEvaluation:e.get("lazyEvaluation")});o.on("optionChange",(function(e,t){if("level"===e)n.each((function(){var e=m()(this),n=e.data("level");e[n===t||"all"===n&&Y()(t)?"addClass":"rmClass"](ze("active"))}))})),e.get("overrideConsole")&&this.overrideConsole(),this._logger=o}},{key:"_exposeLogger",value:function(){var e=this,t=this._logger;["html"].concat(_t).forEach((function(n){return e[n]=function(){for(var o=arguments.length,r=new Array(o),i=0;i').concat(Tt()(e.data),""));var n="Empty";e.reqHeaders&&(n=_e()(e.reqHeaders,(function(e,t){return'\n ').concat(Tt()(t),"\n ").concat(Tt()(e),"\n ")})).join(""));var o="Empty";e.resHeaders&&(o=_e()(e.resHeaders,(function(e,t){return'\n ').concat(Tt()(t),"\n ").concat(Tt()(e),"\n ")})).join(""));var r="";if(e.resTxt){var i=e.resTxt;i.length>Ft&&(i=zt()(i,Ft)),r='
').concat(Tt()(i),"
")}var a='
\n \n \n ').concat(Tt()(e.url),'\n \n
\n
\n ').concat(t,'\n
\n

Response Headers

\n \n \n ').concat(o,'\n \n
\n
\n
\n

Request Headers

\n \n \n ').concat(n,"\n \n
\n
\n ").concat(r,"\n
");this._$container.html(a).show(),this._detailData=e}},{key:"hide",value:function(){this._$container.hide(),this.emit("hide")}},{key:"_bindEvent",value:function(){var e=this,t=this._devtools;this._$container.on("click",ze(".back"),(function(){return e.hide()})).on("click",ze(".copy-res"),this._copyRes).on("click",ze(".http .response"),(function(){var t=e._detailData,o=t.resTxt;if(Mt()(o))return n("object",o);switch(t.subType){case"css":return n("css",o);case"html":return n("html",o);case"javascript":return n("js",o);case"json":return n("object",o)}return"image"===t.type?n("img",t.url):void 0}));var n=function(e,n){var o=t.get("sources");o&&(o.set(e,n),t.showTool("sources"))}}}])}(u()),Ft=1e5,Rt=n(5865),Lt=n.n(Rt),Gt=n(6476),Pt=n.n(Gt),Ht=n(5334),Yt=n(2480),$t=n(6192),qt=n(5689);function Qt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Ut(e){for(var t=1;t=300)&&(n.hasErr=!0),i&&(n.resHeaders=i,e._updateType(n)),n.render()}})),(0,c.A)(e,"_loadingFinished",(function(t){var n=e._requests[t.requestId];if(e._isRecording&&n){var o=1e3*t.timestamp;n.time=o-n.startTime,n.displayTime=kt()(n.time),n.size=t.encodedDataLength,n.done=!0,n.resTxt=Jt.domain("Network").getResponseBody({requestId:t.requestId}).body,n.render()}})),(0,c.A)(e,"_loadingFailed",(function(t){var n=e._requests[t.requestId];if(e._isRecording&&n){var o=1e3*t.timestamp;n.time=o-n.startTime,n.displayTime=kt()(n.time),n.hasErr=!0,n.status=0,n.done=!0,n.render()}})),(0,c.A)(e,"_copyCurl",(function(){var t=e._selectedRequest;Ot()(function(e){var t=nn()();"windows"===t&&(t="win");var n=[],o=rn()(["accept-encoding","host","method","path","scheme","version"]),r="win"===t?function(e){var t=/[\r\n]/.test(e)?'^"':'"';return t+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/[^a-zA-Z0-9\s_\-:=+~'/.',?;()*`&]/g,"^$&").replace(/%(?=[a-zA-Z0-9_])/g,"%^").replace(/\r?\n/g,"^\n\n")+t}:function(e){return/[\0-\x1F\x7F-\x9F!]|'/.test(e)?"$'"+e.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\0-\x1F\x7F-\x9F!]/g,(function(e){for(var t=e.charCodeAt(0).toString(16);t.length<4;)t="0"+t;return"\\u"+t}))+"'":"'"+e+"'"};n.push(r(e.url()).replace(/[[{}\]]/g,"\\$&"));var i="GET",a=[],s=e.requestFormData();s&&(a.push("--data-raw "+r(s)),o["content-length"]=!0,i="POST"),e.requestMethod!==i&&n.push("-X "+r(e.requestMethod));for(var c=e.requestHeaders(),l=0;l=3?"win"===t?" ^\n ":" \\\n ":" ")}({requestMethod:t.method,url:function(){return t.url},requestFormData:function(){return t.data},requestHeaders:function(){var e=t.reqHeaders||{};return P()(e,{"User-Agent":navigator.userAgent,Referer:location.href}),_e()(e,(function(e,t){return{name:t,value:e}}))}})),e._container.notify("Copied",{icon:"success"})})),(0,c.A)(e,"_toggleRecording",(function(){e._$control.find(ze(".record")).toggleClass(ze("recording")),e._isRecording=!e._isRecording})),(0,c.A)(e,"_showDetail",(function(){e._selectedRequest&&(e._splitMode&&e._$network.css("width","50%"),e._detail.show(e._selectedRequest))})),(0,c.A)(e,"_updateScale",(function(t){e._splitMediaQuery.setQuery("screen and (min-width: ".concat(680*t,"px)"))})),e._style=re(n(8239)),e.name="network",e._requests={},e._selectedRequest=null,e._isRecording=!0,e}return(0,s.A)(t,e),(0,r.A)(t,[{key:"init",value:function(e,n){sn(t,"init",this,3)([e]),this._container=n,this._initTpl(),this._detail=new Bt(this._$detail,n),this._splitMediaQuery=new(en())("screen and (min-width: 680px)"),this._splitMode=this._splitMediaQuery.isMatch(),this._requestDataGrid=new Kt.A(this._$requests.get(0),{columns:[{id:"name",title:"Name",sortable:!0,weight:30},{id:"method",title:"Method",sortable:!0,weight:14},{id:"status",title:"Status",sortable:!0,weight:14},{id:"type",title:"Type",sortable:!0,weight:14},{id:"size",title:"Size",sortable:!0,weight:14},{id:"time",title:"Time",sortable:!0,weight:14}]}),this._resizeSensor=new(Zt())(e.get(0)),this._bindEvent()}},{key:"show",value:function(){sn(t,"show",this,3)([]),this._updateDataGridHeight()}},{key:"clear",value:function(){this._requests={},this._requestDataGrid.clear()}},{key:"requests",value:function(){var e=[];return x()(this._requests,(function(t){e.push(t)})),e}},{key:"_updateDataGridHeight",value:function(){this._requestDataGrid.fit()}},{key:"_updateType",value:function(e){var t=function(e){if(!e)return"unknown";var t=e.split(";")[0].split("/");return{type:t[0],subType:Ae()(t)}}(e.resHeaders["content-type"]||""),n=t.type,o=t.subType;e.type=n,e.subType=o}},{key:"_updateButtons",value:function(){var e=this._$control,t=e.find(ze(".show-detail")),n=e.find(ze(".copy-curl")),o=ze("icon-disabled");t.addClass(o),n.addClass(o),this._selectedRequest&&(t.rmClass(o),n.rmClass(o))}},{key:"_bindEvent",value:function(){var e=this,t=this._$control,n=this._$filterText,o=this._requestDataGrid,r=this;t.on("click",ze(".clear-request"),(function(){return e.clear()})).on("click",ze(".show-detail"),this._showDetail).on("click",ze(".copy-curl"),this._copyCurl).on("click",ze(".record"),this._toggleRecording).on("click",ze(".filter"),(function(){nt.A.prompt("Filter").then((function(e){mt()(e)||(n.text(e),o.setOption("filter",Te()(e)))}))})),o.on("select",(function(t){var n=m()(t.container).data("id"),o=r._requests[n];e._selectedRequest=o,e._updateButtons(),e._splitMode&&e._showDetail()})),o.on("deselect",(function(){e._selectedRequest=null,e._updateButtons(),e._detail.hide()})),this._resizeSensor.addListener(Lt()((function(){return e._updateDataGridHeight()}),15)),this._splitMediaQuery.on("match",(function(){e._detail.hide(),e._splitMode=!0})),this._splitMediaQuery.on("unmatch",(function(){e._detail.hide(),e._splitMode=!1})),this._detail.on("hide",(function(){e._splitMode&&e._$network.css("width","100%")})),Jt.domain("Network").enable();var i=Jt.domain("Network");i.on("requestWillBeSent",this._reqWillBeSent),i.on("responseReceivedExtraInfo",this._resReceivedExtraInfo),i.on("responseReceived",this._resReceived),i.on("loadingFinished",this._loadingFinished),i.on("loadingFailed",this._loadingFailed),h.on(h.SCALE,this._updateScale)}},{key:"destroy",value:function(){sn(t,"destroy",this,3)([]),this._resizeSensor.destroy(),re.remove(this._style),this._splitMediaQuery.removeAllListeners();var e=Jt.domain("Network");e.off("requestWillBeSent",this._reqWillBeSent),e.off("responseReceivedExtraInfo",this._resReceivedExtraInfo),e.off("responseReceived",this._resReceived),e.off("loadingFinished",this._loadingFinished),h.off(h.SCALE,this._updateScale)}},{key:"_initTpl",value:function(){var e=this._$el;e.html(ze('
\n
\n \n \n \n \n \n \n
\n
\n
\n
')),this._$network=e.find(ze(".network")),this._$detail=e.find(ze(".detail")),this._$requests=e.find(ze(".requests")),this._$control=e.find(ze(".control")),this._$filterText=e.find(ze(".filter-text"))}}])}(v),ln=n(2708),un=n.n(ln),dn=n(1167),hn=n.n(dn),fn=n(7181),pn=n.n(fn),vn=n(5784),gn=n(96),mn=n.n(gn),bn=n(896),yn=n.n(bn),An=n(438),wn=n.n(An),_n=n(6493),xn=n.n(_n),kn=n(6186),Cn=n.n(kn),Sn=n(5241),En=n.n(Sn),Tn=n(2208),Nn=n.n(Tn),On=n(5145),jn=n.n(On);function Mn(e){for(var t={},n=0,o=e.length;no?o:n,i=0;io?1:n(t=Fn(t))?1:e1&&void 0!==arguments[1]?arguments[1]:{}).noAttr,n=void 0!==t&&t;if(e.nodeType===Node.TEXT_NODE)return'(text)');if(e.nodeType===Node.COMMENT_NODE)return'\x3c!--\x3e');if(pn()(e))return'#shadow-root');var o=e.id,r=e.className,i=e.attributes,a=''.concat(e.tagName.toLowerCase(),"");if(""!==o&&(a+='#'.concat(o,"")),E()(r)){var s="";x()(r.split(/\s+/g),(function(e){""!==e.trim()&&(s+=".".concat(e))})),a+=''.concat(s,"")}return n||x()(i,(function(e){var t=e.name;"id"!==t&&"class"!==t&&"style"!==t&&(a+=' '.concat(t,'="').concat(e.value,'"'))})),a}var Gn=function(){return(0,r.A)((function e(t,n){var r=this;(0,o.A)(this,e),(0,c.A)(this,"hide",(function(){r._$container.hide(),r._disableObserver(),Jt.domain("Overlay").hideHighlight()})),(0,c.A)(this,"_highlight",(function(e){var t=r._curEl,n={showInfo:!1};e&&"all"!==e?"margin"===e?n.marginColor="rgba(246, 178, 107, .66)":"border"===e?n.borderColor="rgba(255, 229, 153, .66)":"padding"===e?n.paddingColor="rgba(147, 196, 125, .55)":"content"===e&&(n.contentColor="rgba(111, 168, 220, .66)"):P()(n,{showInfo:!0,contentColor:"rgba(111, 168, 220, .66)",paddingColor:"rgba(147, 196, 125, .55)",borderColor:"rgba(255, 229, 153, .66)",marginColor:"rgba(246, 178, 107, .66)"});var o=Jt.domain("DOM").getNodeId({node:t}).nodeId;Jt.domain("Overlay").highlightNode({nodeId:o,highlightConfig:n})})),this._$container=t,this._devtools=n,this._curEl=document.documentElement,this._initObserver(),this._initCfg(),this._initTpl(),this._bindEvent()}),[{key:"show",value:function(e){this._curEl=e,this._rmDefComputedStyle=!0,this._computedStyleSearchKeyword="",this._enableObserver(),this._render(),this._highlight()}},{key:"destroy",value:function(){this._disableObserver(),this.restoreEventTarget(),this._rmCfg()}},{key:"overrideEventTarget",value:function(){var e=Jn(),t=this._origAddEvent=e.addEventListener,n=this._origRmEvent=e.removeEventListener;e.addEventListener=function(e,n,o){!function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!un()(e)||!lt()(n)||!xn()(o))return;var r=e.erudaEvents=e.erudaEvents||{};r[t]=r[t]||[],r[t].push({listener:n,listenerStr:n.toString(),useCapture:o})}(this,e,n,o),t.apply(this,arguments)},e.removeEventListener=function(e,t,o){!function(e,t,n){var o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!un()(e)||!lt()(n)||!xn()(o))return;var r=e.erudaEvents;if(!r||!r[t])return;for(var i=r[t],a=0,s=i.length;a\n \n \n \n \n
\n
\n
\n
\n
\n
');e.html(t),this._$elementName=e.find(ze(".element-name")),this._$attributes=e.find(ze(".attributes")),this._$styles=e.find(ze(".styles")),this._$listeners=e.find(ze(".listeners")),this._$computedStyle=e.find(ze(".computed-style"));var n=En()("div");this._$boxModel=m()(n),this._boxModel=new Rn.A(n)}},{key:"_toggleAllComputedStyle",value:function(){this._rmDefComputedStyle=!this._rmDefComputedStyle,this._render()}},{key:"_render",value:function(){var e=this._getData(this._curEl),t=this._$attributes,n=this._$elementName,o=this._$styles,r=this._$computedStyle,i=this._$listeners;n.html(e.name);var a="Empty";St()(e.attributes)||(a=_e()(e.attributes,(function(e){var t=e.name,n=e.value;return'\n ').concat(Tt()(t),'\n ').concat(n,"\n ")})).join("")),a='

Attributes

\n
\n \n \n ').concat(a," \n \n
\n
"),t.html(a);var s="";if(St()(e.styles))o.hide();else{var c=_e()(e.styles,(function(e){var t=e.selectorText,n=e.style;return n=_e()(n,(function(e,t){return'
').concat(Tt()(t),": ").concat(e,";
")})).join(""),'
\n
').concat(Tt()(t)," {
\n ").concat(n,"\n
}
\n
")})).join("");s='

Styles

\n
\n ').concat(c,"\n
"),o.html(s).show()}var l="";if(e.computedStyle){var u=ze('
\n \n
');e.rmDefComputedStyle&&(u=ze('
\n \n
')),l="

\n Computed Style\n ".concat(u,'\n
\n \n
\n ').concat(e.computedStyleSearchKeyword?'
').concat(Tt()(e.computedStyleSearchKeyword),"
"):"",'\n

\n
\n
\n \n \n ').concat(_e()(e.computedStyle,(function(e,t){return'\n \n \n ")})).join(""),"\n \n
').concat(Tt()(t),"").concat(e,"
\n
"),r.html(l).show(),this._boxModel.setOption("element",this._curEl),r.find(ze(".box-model")).append(this._$boxModel.get(0))}else r.text("").hide();var d="";e.listeners?(d=_e()(e.listeners,(function(e,t){return e=_e()(e,(function(e){var t=e.useCapture,n=e.listenerStr;return"
  • ").concat(Tt()(n),"
  • ")})).join(""),'
    \n
    ').concat(Tt()(t),'
    \n
      \n ').concat(e,"\n
    \n
    ")})).join(""),d='

    Event Listeners

    \n
    \n ').concat(d," \n
    "),i.html(d).show()):i.hide(),this._$container.show()}},{key:"_getData",value:function(e){var t={},n=new Dn(e),o=e.className,r=e.id,i=e.attributes,a=e.tagName;t.computedStyleSearchKeyword=this._computedStyleSearchKeyword,t.attributes=Hn(i),t.name=Ln({tagName:a,id:r,className:o,attributes:i});var s=e.erudaEvents;if(s&&0!==D()(s).length&&(t.listeners=s),Un(a))return t;var c=n.getComputedStyle(),l=n.getMatchedCSSRules();l.unshift(function(e){for(var t={selectorText:"element.style",style:{}},n=0,o=e.length;n
    $&').replace($n,(function(e,t){return'url("'.concat(Wn(t),'")')}))}var Qn=["script","style","meta","title","link","head"],Un=function(e){Qn.indexOf(e.toLowerCase())},Wn=function(e){return'').concat(e,"")};var Jn=function(){return Cn()(window,"EventTarget.prototype")||window.Node.prototype};function Kn(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Kn=function(){return!!e})()}function Vn(e,t,n,o){var r=(0,f.A)((0,a.A)(1&o?e.prototype:e),t,n);return 2&o&&"function"==typeof r?function(e){return r.apply(n,e)}:r}var Zn=function(e){function t(){var e,r,s,l;return(0,o.A)(this,t),r=this,s=t,s=(0,a.A)(s),e=(0,i.A)(r,Kn()?Reflect.construct(s,l||[],(0,a.A)(r).constructor):s.apply(r,l)),(0,c.A)(e,"_showDetail",(function(){e._isShow&&e._curNode&&(e._curNode.nodeType===Node.ELEMENT_NODE?e._detail.show(e._curNode):e._detail.show(e._curNode.parentNode||e._curNode.host))})),(0,c.A)(e,"_back",(function(){if(e._curNode!==e._htmlEl){for(var t=e._curParentQueue,n=t.shift();!Xn(n);)n=t.shift();e.set(n)}})),(0,c.A)(e,"_updateScale",(function(t){e._splitMediaQuery.setQuery("screen and (min-width: ".concat(680*t,"px)"))})),(0,c.A)(e,"_deleteNode",(function(){var t=e._curNode;t.parentNode&&t.parentNode.removeChild(t)})),(0,c.A)(e,"_copyNode",(function(){var t=e._curNode;t.nodeType===Node.ELEMENT_NODE?Ot()(t.outerHTML):Ot()(t.nodeValue),e._container.notify("Copied",{icon:"success"})})),(0,c.A)(e,"_toggleSelect",(function(){e._$el.find(ze(".select")).toggleClass(ze("active")),e._selectElement=!e._selectElement,e._selectElement?(Jt.domain("Overlay").setInspectMode({mode:"searchForNode",highlightConfig:{showInfo:!hn()(),showRulers:!1,showAccessibilityInfo:!hn()(),showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:"rgba(111, 168, 220, .66)",paddingColor:"rgba(147, 196, 125, .55)",borderColor:"rgba(255, 229, 153, .66)",marginColor:"rgba(246, 178, 107, .66)"}}),e._container.hide()):(Jt.domain("Overlay").setInspectMode({mode:"none"}),Jt.domain("Overlay").hideHighlight())})),(0,c.A)(e,"_inspectNodeRequested",(function(t){var n=t.backendNodeId;e._container.show(),e._toggleSelect();try{var o=Jt.domain("DOM").getNode({nodeId:n}).node;e.select(o)}catch(e){}})),(0,c.A)(e,"_setNode",(function(t){if(t!==e._curNode){e._curNode=t,e._renderCrumbs();for(var n=[],o=t.parentNode;o;)n.push(o),o=o.parentNode;e._curParentQueue=n,e._splitMode&&e._showDetail(),e._updateButtons(),e._updateHistory()}})),e._style=re(n(9111)),e.name="elements",e._selectElement=!1,e._observeElement=!0,e._history=[],u().mixin(e),e}return(0,s.A)(t,e),(0,r.A)(t,[{key:"init",value:function(e,n){var o=this;Vn(t,"init",this,3)([e]),this._container=n,this._initTpl(),this._htmlEl=document.documentElement,this._detail=new Gn(this._$detail,n),this.config=this._detail.config,this._splitMediaQuery=new(en())("screen and (min-width: 680px)"),this._splitMode=this._splitMediaQuery.isMatch(),this._domViewer=new vn.A(this._$domViewer.get(0),{node:this._htmlEl,ignore:function(e){return Ie(e)||function(e){for(;e;){var t="";if(e.getAttribute&&(t=e.getAttribute("class")||""),N()(t,"__chobitsu-hide__"))return!0;e=e.parentNode}return!1}(e)}}),this._domViewer.expand(),this._bindEvent(),Jt.domain("Overlay").enable(),ue()((function(){return o._updateHistory()}))}},{key:"show",value:function(){Vn(t,"show",this,3)([]),this._isShow=!0,this._curNode?this._splitMode&&this._showDetail():this.select(document.body)}},{key:"hide",value:function(){Vn(t,"hide",this,3)([]),this._isShow=!1,Jt.domain("Overlay").hideHighlight()}},{key:"select",value:function(e){return this._domViewer.select(e),this._setNode(e),this.emit("change",e),this}},{key:"destroy",value:function(){Vn(t,"destroy",this,3)([]),h.off(h.SCALE,this._updateScale),re.remove(this._style),this._detail.destroy(),Jt.domain("Overlay").off("inspectNodeRequested",this._inspectNodeRequested),Jt.domain("Overlay").disable(),this._splitMediaQuery.removeAllListeners()}},{key:"_updateButtons",value:function(){var e=this._$control,t=e.find(ze(".show-detail")),n=e.find(ze(".copy-node")),o=e.find(ze(".delete-node")),r=ze("icon-disabled");t.addClass(r),n.addClass(r),o.addClass(r);var i=this._curNode;i&&!pn()(i)&&(i!==document.documentElement&&i!==document.body&&o.rmClass(r),n.rmClass(r),i.nodeType===Node.ELEMENT_NODE&&t.rmClass(r))}},{key:"_initTpl",value:function(){var e=this._$el;e.html(ze('
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    ')),this._$detail=e.find(ze(".detail")),this._$domViewer=e.find(ze(".dom-viewer")),this._$control=e.find(ze(".control")),this._$crumbs=e.find(ze(".crumbs"))}},{key:"_renderCrumbs",value:function(){var e=function(e){var t=[],n=0;for(;e;)t.push({text:Ln(e,{noAttr:!0}),idx:n++}),pn()(e)&&(e=e.host),e=!e.parentElement&&pn()(e.parentNode)?e.parentNode:e.parentElement;return t.reverse()}(this._curNode),t="";St()(e)||(t=_e()(e,(function(e){var t=e.text,n=e.idx;return'
  • ').concat(t,"
  • ")})).join("")),this._$crumbs.html(t)}},{key:"_bindEvent",value:function(){var e=this,t=this;this._$el.on("click",ze(".crumb"),(function(){for(var e=Se()(m()(this).data("idx")),n=t._curNode;e--&&n.parentElement;)n=n.parentElement;Xn(n)&&t.select(n)})),this._$control.on("click",ze(".select"),this._toggleSelect).on("click",ze(".show-detail"),this._showDetail).on("click",ze(".copy-node"),this._copyNode).on("click",ze(".delete-node"),this._deleteNode),this._domViewer.on("select",this._setNode).on("deselect",this._back),Jt.domain("Overlay").on("inspectNodeRequested",this._inspectNodeRequested),this._splitMediaQuery.on("match",(function(){e._splitMode=!0,e._showDetail()})),this._splitMediaQuery.on("unmatch",(function(){e._splitMode=!1,e._detail.hide()})),h.on(h.SCALE,this._updateScale)}},{key:"_updateHistory",value:function(){var e=this._container.get("console");if(e){var t=this._history;t.unshift(this._curNode),t.length>5&&t.pop();for(var n=0;n<5;n++)e.setGlobal("$".concat(n),t[n])}}}])}(v),Xn=function(e){return un()(e)&&e.parentNode};var eo=n(3981),to=n.n(eo),no=n(4866),oo=n.n(no),ro=null,io=[{name:"Border All",fn:function(){if(ro)return re.remove(ro),void(ro=null);ro=re("* { outline: 2px dashed #707d8b; outline-offset: -3px; }",document.head)},desc:"Add color borders to all elements"},{name:"Refresh Page",fn:function(){var e=new(ge());e.setQuery("timestamp",to()()),window.location.replace(e.toString())},desc:"Add timestamp to url and refresh"},{name:"Search Text",fn:function(){nt.A.prompt("Enter the text").then((function(e){var t,n,o;e&&""!==Te()(e)&&(t=e,n=document.body,o=new RegExp(t,"ig"),ao(n,(function(e){var t=m()(e);if(t.hasClass("eruda-search-highlight-block"))return document.createTextNode(t.text())})),ao(n,(function(e){if(3===e.nodeType){var t=e.nodeValue;if((t=t.replace(o,(function(e){return''.concat(e,"")})))!==e.nodeValue){var n=m()(document.createElement("div"));return n.html(t),n.addClass("eruda-search-highlight-block"),n.get(0)}}})))}))},desc:"Highlight given text on page"},{name:"Edit Page",fn:function(){var e=document.body;e.contentEditable="true"!==e.contentEditable},desc:"Toggle body contentEditable"},{name:"Fit Screen",fn:function(){var e=document.body,t=document.documentElement,n=m()(e);if(n.data("scaled"))window.scrollTo(0,+n.data("scaled")),n.rmAttr("data-scaled"),n.css("transform","none");else{var o=Math.max(e.scrollHeight,e.offsetHeight,t.clientHeight,t.scrollHeight,t.offsetHeight),r=Math.max(document.documentElement.clientHeight,window.innerHeight||0),i=r/o;n.css("transform","scale(".concat(i,")")),n.data("scaled",window.scrollY),window.scrollTo(0,o/2-r/2)}},desc:"Scale down the whole page to fit screen"},{name:"Load Vue Plugin",fn:function(){so("vue")},desc:"Vue devtools"},{name:"Load Monitor Plugin",fn:function(){so("monitor")},desc:"Display page fps, memory and dom nodes"},{name:"Load Features Plugin",fn:function(){so("features")},desc:"Browser feature detections"},{name:"Load Timing Plugin",fn:function(){so("timing")},desc:"Show performance and resource timing"},{name:"Load Code Plugin",fn:function(){so("code")},desc:"Edit and run JavaScript"},{name:"Load Benchmark Plugin",fn:function(){so("benchmark")},desc:"Run JavaScript benchmarks"},{name:"Load Geolocation Plugin",fn:function(){so("geolocation")},desc:"Test geolocation"},{name:"Load Orientation Plugin",fn:function(){so("orientation")},desc:"Test orientation api"},{name:"Load Touches Plugin",fn:function(){so("touches")},desc:"Visualize screen touches"}];function ao(e,t){var n=e.childNodes;if(!Ie(e)){for(var o=0,r=n.length;o\n

    ').concat(Tt()(e.name),'\n
    \n \n
    \n

    \n
    \n ').concat(Tt()(e.desc),"\n
    \n ")})).join("");this._renderHtml(e)}},{key:"_renderHtml",value:function(e){e!==this._lastHtml&&(this._lastHtml=e,this._$el.html(e))}}])}(v),vo=n(4497),go=n.n(vo),mo=n(311),bo=n.n(mo),yo=n(769),Ao=n.n(yo),wo=n(4069),_o=n.n(wo),xo=function(){return(0,r.A)((function e(t,n,r,i){var a=this;(0,o.A)(this,e),(0,c.A)(this,"_updateGridHeight",(function(e){a._dataGrid.setOption({minHeight:60*e,maxHeight:223*e})})),this._type=i,this._$container=t,this._devtools=n,this._resources=r,this._selectedItem=null,this._storeData=[],this._initTpl(),this._dataGrid=new Kt.A(this._$dataGrid.get(0),{columns:[{id:"key",title:"Key",weight:30},{id:"value",title:"Value",weight:90}],minHeight:60,maxHeight:223}),this._bindEvent()}),[{key:"destroy",value:function(){h.off(h.SCALE,this._updateGridHeight)}},{key:"refresh",value:function(){var e=this._dataGrid;this._refreshStorage(),e.clear(),x()(this._storeData,(function(t){var n=t.key,o=t.val;e.append({key:n,value:o},{selectable:!0})}))}},{key:"_refreshStorage",value:function(){var e=this._resources,t=je(this._type,!1);if(t){var n=[];t=JSON.parse(JSON.stringify(t)),x()(t,(function(t,o){E()(t)&&(e.config.get("hideErudaSetting")&&(Ze()(o,"eruda")||"active-eruda"===o)||n.push({key:o,val:zt()(t,200)}))})),this._storeData=n}}},{key:"_updateButtons",value:function(){var e=this._$container,t=e.find(ze(".show-detail")),n=e.find(ze(".delete-storage")),o=e.find(ze(".copy-storage")),r=ze("btn-disabled");t.addClass(r),n.addClass(r),o.addClass(r),this._selectedItem&&(t.rmClass(r),n.rmClass(r),o.rmClass(r))}},{key:"_initTpl",value:function(){var e=this._$container,t=this._type;e.html(ze('

    \n '.concat("local"===t?"Local":"Session",' Storage\n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n

    \n
    '))),this._$dataGrid=e.find(ze(".data-grid")),this._$filterText=e.find(ze(".filter-text"))}},{key:"_getVal",value:function(e){return"local"===this._type?localStorage.getItem(e):sessionStorage.getItem(e)}},{key:"_bindEvent",value:function(){var e=this,t=this._type,n=this._devtools;function o(e,t){var o=n.get("sources");if(o)return o.set(e,t),n.showTool("sources"),!0}this._$container.on("click",ze(".refresh-storage"),(function(){n.notify("Refreshed",{icon:"success"}),e.refresh()})).on("click",ze(".clear-storage"),(function(){x()(e._storeData,(function(e){"local"===t?localStorage.removeItem(e.key):sessionStorage.removeItem(e.key)})),e.refresh()})).on("click",ze(".show-detail"),(function(){var t=e._selectedItem,n=e._getVal(t);try{o("object",JSON.parse(n))}catch(e){o("raw",n)}})).on("click",ze(".copy-storage"),(function(){var t=e._selectedItem;Ot()(e._getVal(t)),n.notify("Copied",{icon:"success"})})).on("click",ze(".filter"),(function(){nt.A.prompt("Filter").then((function(t){mt()(t)||(t=Te()(t),e._$filterText.text(t),e._dataGrid.setOption("filter",t))}))})).on("click",ze(".delete-storage"),(function(){var n=e._selectedItem;"local"===t?localStorage.removeItem(n):sessionStorage.removeItem(n),e.refresh()})),this._dataGrid.on("select",(function(t){e._selectedItem=t.data.key,e._updateButtons()})).on("deselect",(function(){e._selectedItem=null,e._updateButtons()})),h.on(h.SCALE,this._updateGridHeight)}}])}();function ko(e,t){e.rmClass(ze("ok")).rmClass(ze("danger")).rmClass(ze("warn")).addClass(ze(t))}function Co(e,t){if(0===t)return"";var n=0,o=0;switch(e){case"cookie":n=30,o=60;break;case"script":n=5,o=10;break;case"stylesheet":n=4,o=8;break;case"image":n=50,o=100}return t>=o?"danger":t>=n?"warn":"ok"}var So=function(){return(0,r.A)((function e(t,n){(0,o.A)(this,e),this._$container=t,this._devtools=n,this._selectedItem=null,this._initTpl(),this._dataGrid=new Kt.A(this._$dataGrid.get(0),{columns:[{id:"key",title:"Key",weight:30},{id:"value",title:"Value",weight:90}],minHeight:60,maxHeight:223}),this._bindEvent()}),[{key:"refresh",value:function(){var e=this._$container,t=this._dataGrid,n=Jt.domain("Network").getCookies().cookies,o=_e()(n,(function(e){return{key:e.name,val:e.value}}));t.clear(),x()(o,(function(e){var n=e.key,o=e.val;t.append({key:n,value:o},{selectable:!0})})),ko(e,Co("cookie",o.length))}},{key:"_initTpl",value:function(){var e=this._$container;e.html(ze('

    \n Cookie\n \n
    \n \n
    \n \n \n \n
    \n \n
    \n
    \n

    \n
    ')),this._$dataGrid=e.find(ze(".data-grid")),this._$filterText=e.find(ze(".filter-text"))}},{key:"_updateButtons",value:function(){var e=this._$container,t=e.find(ze(".show-detail")),n=e.find(ze(".delete-cookie")),o=e.find(ze(".copy-cookie")),r=ze("btn-disabled");t.addClass(r),n.addClass(r),o.addClass(r),this._selectedItem&&(t.rmClass(r),n.rmClass(r),o.rmClass(r))}},{key:"_getVal",value:function(e){for(var t=Jt.domain("Network").getCookies().cookies,n=0,o=t.length;n=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw i}}}}function To(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);nEmpty";St()(e)||(n=_e()(e,(function(e){return e=Tt()(e),'
  • ').concat(e,"
  • ")})).join(""));var o='

    \n Script\n
    \n \n
    \n

    \n
      \n ').concat(n,"\n
    "),r=this._$script;return ko(r,t),r.html(o),this}},{key:"refreshStylesheet",value:function(){var e=[];m()("link").each((function(){"stylesheet"===this.rel&&e.push(this.href)}));var t=Co("stylesheet",(e=wn()(e)).length),n="
  • Empty
  • ";St()(e)||(n=_e()(e,(function(e){return e=Tt()(e),'
  • ').concat(e,"
  • ")})).join(""));var o='

    \n Stylesheet\n
    \n \n
    \n

    \n
      \n ').concat(n,"\n
    "),r=this._$stylesheet;return ko(r,t),r.html(o),this}},{key:"refreshIframe",value:function(){var e=[];m()("iframe").each((function(){var t=m()(this).attr("src");t&&e.push(t)})),e=wn()(e);var t="
  • Empty
  • ";St()(e)||(t=_e()(e,(function(e){return e=Tt()(e),'
  • ').concat(e,"
  • ")})).join(""));var n='

    \n Iframe\n
    \n \n
    \n

    \n
      \n ').concat(t,"\n
    ");return this._$iframe.html(n),this}},{key:"refreshLocalStorage",value:function(){return this._localStorage.refresh(),this}},{key:"refreshSessionStorage",value:function(){return this._sessionStorage.refresh(),this}},{key:"refreshCookie",value:function(){return this._cookie.refresh(),this}},{key:"refreshImage",value:function(){var e=[],t=this._performance=window.webkitPerformance||window.performance;t&&t.getEntries?this._performance.getEntries().forEach((function(t){if("img"===t.initiatorType||Io(t.name)){if(N()(t.name,"exclude=true"))return;e.push(t.name)}})):m()("img").each((function(){var t=m()(this),n=t.attr("src");"true"!==t.data("exclude")&&e.push(n)}));(e=wn()(e)).sort();var n=Co("image",e.length),o="
  • Empty
  • ";St()(e)||(o=_e()(e,(function(e){return'
  • \n \n
  • ')})).join(""));var r='

    \n Image\n
    \n \n
    \n

    \n
      \n ').concat(o,"\n
    "),i=this._$image;return ko(i,n),i.html(r),this}},{key:"show",value:function(){return Oo(t,"show",this,3)([]),this._observeElement&&this._enableObserver(),this.refresh()}},{key:"hide",value:function(){return this._disableObserver(),Oo(t,"hide",this,3)([])}},{key:"_initTpl",value:function(){var e=this._$el;e.html(ze('
    \n
    \n \n
    \n
    \n
    \n
    ')),this._$localStorage=e.find(ze(".local-storage")),this._$sessionStorage=e.find(ze(".session-storage")),this._$cookie=e.find(ze(".cookie")),this._$script=e.find(ze(".script")),this._$stylesheet=e.find(ze(".stylesheet")),this._$iframe=e.find(ze(".iframe")),this._$image=e.find(ze(".image"))}},{key:"_bindEvent",value:function(){var e=this,t=this._$el,n=this._container;function o(e,t){var o=n.get("sources");if(o)return o.set(e,t),n.showTool("sources"),!0}function r(e){return function(t){if(n.get("sources")){t.preventDefault();var r=m()(this).attr("href");"iframe"!==e&&go()(location.href,r)?bo()({url:r,success:function(t){o(e,t)},dataType:"raw"}):o("iframe",r)}}}t.on("click",".eruda-refresh-script",(function(){n.notify("Refreshed",{icon:"success"}),e.refreshScript()})).on("click",".eruda-refresh-stylesheet",(function(){n.notify("Refreshed",{icon:"success"}),e.refreshStylesheet()})).on("click",".eruda-refresh-iframe",(function(){n.notify("Refreshed",{icon:"success"}),e.refreshIframe()})).on("click",".eruda-refresh-image",(function(){n.notify("Refreshed",{icon:"success"}),e.refreshImage()})).on("click",".eruda-img-link",(function(){o("img",m()(this).attr("src"))})).on("click",".eruda-css-link",r("css")).on("click",".eruda-js-link",r("js")).on("click",".eruda-iframe-link",r("iframe"))}},{key:"_rmCfg",value:function(){var e=this.config,t=this._container.get("settings");t&&t.remove(e,"hideErudaSetting").remove(e,"observeElement").remove("Resources")}},{key:"_initCfg",value:function(){var e=this,t=this.config=ce.createCfg("resources",{hideErudaSetting:!0,observeElement:!0});t.get("hideErudaSetting")&&(this._hideErudaSetting=!0),t.get("observeElement")||(this._observeElement=!1),t.on("change",(function(t,n){switch(t){case"hideErudaSetting":return void(e._hideErudaSetting=n);case"observeElement":return e._observeElement=n,n?e._enableObserver():e._disableObserver()}})),this._container.get("settings").text("Resources").switch(t,"hideErudaSetting","Hide Eruda Setting").switch(t,"observeElement","Auto Refresh Elements").separator()}},{key:"_initObserver",value:function(){var e=this;this._observer=new(Nn())((function(t){x()(t,(function(t){e._handleMutation(t)}))}))}},{key:"_handleMutation",value:function(e){var t=this;if(!Ie(e.target)){var n=function(e){var n=function(e){return e.tagName?e.tagName.toLowerCase():""}(e);switch(n){case"script":t.refreshScript();break;case"img":t.refreshImage();break;case"link":t.refreshStylesheet()}};if("attributes"===e.type)n(e.target);else if("childList"===e.type){n(e.target);var o,r=Ao()(e.addedNodes),i=Eo(r=_o()(r,Ao()(e.removedNodes)));try{for(i.s();!(o=i.n()).done;){n(o.value)}}catch(e){i.e(e)}finally{i.f()}}}}},{key:"_enableObserver",value:function(){this._observer.observe(document.documentElement,{attributes:!0,childList:!0,subtree:!0})}},{key:"_disableObserver",value:function(){this._observer.disconnect()}}])}(v);var Mo=/\.(jpeg|jpg|gif|png)$/,Io=function(e){return Mo.test(e)},zo=n(6620),Do=n.n(zo),Bo=Do()(),Fo=[{name:"Location",val:function(){return Tt()(location.href)}},{name:"User Agent",val:navigator.userAgent},{name:"Device",val:["",'"),""),""),"
    screen'.concat(screen.width," * ").concat(screen.height,"
    viewport".concat(window.innerWidth," * ").concat(window.innerHeight,"
    pixel ratio".concat(window.devicePixelRatio,"
    "].join("")},{name:"System",val:["",'"),""),"
    os'.concat(nn()(),"
    browser".concat(Bo.name+" "+Bo.version,"
    "].join("")},{name:"Sponsor this Project",val:function(){return""+_e()([{name:"Open Collective",link:"https://opencollective.com/eruda"},{name:"Ko-fi",link:"https://ko-fi.com/surunzi"},{name:"Wechat Pay",link:"https://surunzi.com/wechatpay.html"}],(function(e){return"")})).join(" ")+"
    ".concat(e.name,'').concat(e.link.replace("https://",""),"
    "}},{name:"About",val:'Eruda v3.4.3'}],Ro=n(1034),Lo=n.n(Ro);function Go(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Go=function(){return!!e})()}function Po(e,t,n,o){var r=(0,f.A)((0,a.A)(1&o?e.prototype:e),t,n);return 2&o&&"function"==typeof r?function(e){return r.apply(n,e)}:r}var Ho=function(e){function t(){var e,r,s,c;return(0,o.A)(this,t),r=this,s=t,s=(0,a.A)(s),(e=(0,i.A)(r,Go()?Reflect.construct(s,c||[],(0,a.A)(r).constructor):s.apply(r,c)))._style=re(n(4657)),e.name="info",e._infos=[],e}return(0,s.A)(t,e),(0,r.A)(t,[{key:"init",value:function(e,n){Po(t,"init",this,3)([e]),this._container=n,this._addDefInfo(),this._bindEvent()}},{key:"destroy",value:function(){Po(t,"destroy",this,3)([]),re.remove(this._style)}},{key:"add",value:function(e,t){var n=this._infos,o=!1;return x()(n,(function(n){e===n.name&&(n.val=t,o=!0)})),o||n.push({name:e,val:t}),this._render(),this}},{key:"get",value:function(e){var t,n=this._infos;return be()(e)?Lo()(n):(x()(n,(function(n){e===n.name&&(t=n.val)})),t)}},{key:"remove",value:function(e){for(var t=this._infos,n=t.length-1;n>=0;n--)t[n].name===e&&t.splice(n,1);return this._render(),this}},{key:"clear",value:function(){return this._infos=[],this._render(),this}},{key:"_addDefInfo",value:function(){var e=this;x()(Fo,(function(t){return e.add(t.name,t.val)}))}},{key:"_render",value:function(){var e=[];x()(this._infos,(function(t){var n=t.name,o=t.val;lt()(o)&&(o=o()),e.push({name:n,val:o})}));var t="
      ".concat(_e()(e,(function(e){return'
    • ').concat(Tt()(e.name),'

      ').concat(e.val,"
    • ")})).join(""),"
    ");this._renderHtml(t)}},{key:"_bindEvent",value:function(){var e=this._container;this._$el.on("click",ze(".copy"),(function(){var t=m()(this).parent().parent(),n=t.find(ze(".title")).text(),o=t.find(ze(".content")).text();Ot()("".concat(n,": ").concat(o)),e.notify("Copied",{icon:"success"})}))}},{key:"_renderHtml",value:function(e){e!==this._lastHtml&&(this._lastHtml=e,this._$el.html(e))}}])}(v),Yo=n(6911),$o=n(894),qo=n.n($o),Qo=n(4249),Uo=n.n(Qo),Wo=n(1714);function Jo(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Jo=function(){return!!e})()}function Ko(e,t,n,o){var r=(0,f.A)((0,a.A)(1&o?e.prototype:e),t,n);return 2&o&&"function"==typeof r?function(e){return r.apply(n,e)}:r}var Vo=function(e){function t(){var e,r,s,c;return(0,o.A)(this,t),r=this,s=t,s=(0,a.A)(s),(e=(0,i.A)(r,Jo()?Reflect.construct(s,c||[],(0,a.A)(r).constructor):s.apply(r,c)))._style=re(n(4831)),e.name="sources",e._showLineNum=!0,e}return(0,s.A)(t,e),(0,r.A)(t,[{key:"init",value:function(e,n){Ko(t,"init",this,3)([e]),this._container=n,this._bindEvent(),this._initCfg()}},{key:"destroy",value:function(){Ko(t,"destroy",this,3)([]),re.remove(this._style),this._rmCfg()}},{key:"set",value:function(e,t){if("img"===e){this._isFetchingData=!0;var n=new Image,o=this;return n.onload=function(){o._isFetchingData=!1,o._data={type:"img",val:{width:this.width,height:this.height,src:t}},o._render()},n.onerror=function(){o._isFetchingData=!1},void(n.src=t)}return this._data={type:e,val:t},this._render(),this}},{key:"show",value:function(){return Ko(t,"show",this,3)([]),this._data||this._isFetchingData||this._renderDef(),this}},{key:"_renderDef",value:function(){var e=this;if(this._html)return this._data={type:"html",val:this._html},this._render();this._isGettingHtml||(this._isGettingHtml=!0,bo()({url:location.href,success:function(t){return e._html=t},error:function(){return e._html="Sorry, unable to fetch source code:("},complete:function(){e._isGettingHtml=!1,e._renderDef()},dataType:"raw"}))}},{key:"_bindEvent",value:function(){var e=this;this._container.on("showTool",(function(t,n){t!==e.name&&n.name===e.name&&delete e._data}))}},{key:"_rmCfg",value:function(){var e=this.config,t=this._container.get("settings");t&&t.remove(e,"showLineNum").remove("Sources")}},{key:"_initCfg",value:function(){var e=this,t=this.config=ce.createCfg("sources",{showLineNum:!0});t.get("showLineNum")||(this._showLineNum=!1),t.on("change",(function(t,n){"showLineNum"!==t||(e._showLineNum=n)})),this._container.get("settings").text("Sources").switch(t,"showLineNum","Show Line Numbers").separator()}},{key:"_render",value:function(){switch(this._isInit=!0,this._data.type){case"html":case"js":case"css":return this._renderCode();case"img":return this._renderImg();case"object":return this._renderObj();case"raw":return this._renderRaw();case"iframe":return this._renderIframe()}}},{key:"_renderImg",value:function(){var e=this._data.val,t=e.width,n=e.height,o=e.src;this._renderHtml('
    \n
    ').concat(Tt()(o),'
    \n
    \n \n
    \n
    ').concat(Tt()(t)," × ").concat(Tt()(n),"
    \n
    "))}},{key:"_renderCode",value:function(){var e=this._data;this._renderHtml('
    '),!1);var t=e.val,n=e.val.length;n>er&&(t=zt()(t,er)),n'),!1);var e=this._data.val;try{E()(e)&&(e=JSON.parse(e))}catch(e){}new Yo.A(this._$el.find(".eruda-json").get(0),{unenumerable:!0,accessGetter:!0,prototype:!1}).set(e)}},{key:"_renderRaw",value:function(){var e=this._data;this._renderHtml('
    \n
    \n
    '));var t=e.val,n=this._$el.find(ze(".raw")).get(0);t.length>er&&(t=zt()(t,er)),new Wo.A(n,{text:t,wrapLongLines:!0,showLineNumbers:t.length'))}},{key:"_renderHtml",value:function(e){var t=this;(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&e===this._lastHtml||(this._lastHtml=e,this._$el.html(e),setTimeout((function(){return t._$el.get(0).scrollTop=0}),0))}}])}(v),Zo=3e4,Xo=8e4,er=1e5,tr=n(9760),nr=n.n(tr),or=n(1505),rr=n.n(or),ir=n(5701),ar=n.n(ir),sr={init:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.container,n=e.tool,o=e.autoScale,r=void 0===o||o,i=e.useShadowDom,a=void 0===i||i,s=e.inline,c=void 0!==s&&s,l=e.defaults,u=void 0===l?{}:l;this._isInit||(this._isInit=!0,this._scale=1,this._initContainer(t,a),this._initStyle(),this._initDevTools(u,c),this._initEntryBtn(),this._initSettings(),this._initTools(n),this._registerListener(),r&&this._autoScale(),c&&(this._entryBtn.hide(),this._$el.addClass("eruda-inline"),this.show()))},_isInit:!1,version:"3.4.3",util:{isErudaEl:Ie,evalCss:re,isDarkTheme:function(e){return e||(e=this.getTheme()),K(e)},getTheme:function(){var e=re.getCurTheme(),t="Light";return x()(V,(function(n,o){ar()(n,e)&&(t=o)})),t}},chobitsu:Jt,Tool:v,Console:wt,Elements:Zn,Network:cn,Sources:Vo,Resources:jo,Info:Ho,Snippets:po,Settings:ce,get:function(e){if(this._checkInit()){if("entryBtn"===e)return this._entryBtn;var t=this._devTools;return e?t.get(e):t}},add:function(e){if(this._checkInit())return lt()(e)&&(e=e(this)),this._devTools.add(e),this},remove:function(e){return this._devTools.remove(e),this},show:function(e){if(this._checkInit()){var t=this._devTools;return e?t.showTool(e):t.show(),this}},hide:function(){if(this._checkInit())return this._devTools.hide(),this},destroy:function(){this._devTools.destroy(),delete this._devTools,this._entryBtn.destroy(),delete this._entryBtn,this._unregisterListener(),m()(this._container).remove(),re.clear(),this._isInit=!1,this._container=null,this._shadowRoot=null},scale:function(e){return Qe()(e)?(this._scale=e,h.emit(h.SCALE,e),this):this._scale},position:function(e){var t=this._entryBtn;return nr()(e)?(t.setPos(e),this):t.getPos()},_autoScale:function(){hn()()&&this.scale(1/rr()())},_registerListener:function(){var e=this;this._addListener=function(){return e.add.apply(e,arguments)},this._showListener=function(){return e.show.apply(e,arguments)},h.on(h.ADD,this._addListener),h.on(h.SHOW,this._showListener),h.on(h.SCALE,re.setScale)},_unregisterListener:function(){h.off(h.ADD,this._addListener),h.off(h.SHOW,this._showListener),h.off(h.SCALE,re.setScale)},_checkInit:function(){return this._isInit||$e.error('Please call "eruda.init()" first'),this._isInit},_initContainer:function(e,t){var o,r;e||(e=document.createElement("div"),document.documentElement.appendChild(e)),e.id="eruda",e.style.all="initial",this._container=e,t&&(e.attachShadow?o=e.attachShadow({mode:"open"}):e.createShadowRoot&&(o=e.createShadowRoot()),o&&(re.container=document.head,re(n(6793)+n(7853)+n(9907)+n(879)+n(1107)+n(5259)),r=document.createElement("div"),o.appendChild(r),this._shadowRoot=o)),this._shadowRoot||(r=document.createElement("div"),e.appendChild(r)),P()(r,{className:"eruda-container __chobitsu-hide__",contentEditable:!1}),"ios"===Do()().name&&r.setAttribute("ontouchstart",""),this._$el=m()(r)},_initDevTools:function(e,t){this._devTools=new it(this._$el,{defaults:e,inline:t})},_initStyle:function(){var e="eruda-style-container",t=this._$el;this._shadowRoot?(re.container=this._shadowRoot,re(":host { all: initial }")):(t.append('
    ')),re.container=t.find(".".concat(e)).get(0)),re(n(2693)+n(9907)+n(7853)+n(5259)+n(3277)+n(879)+n(4393)+n(7253)+n(1107)+n(187)+n(1277)+n(8687)+n(6793))},_initEntryBtn:function(){var e=this;this._entryBtn=new Pe(this._$el),this._entryBtn.on("click",(function(){return e._devTools.toggle()}))},_initSettings:function(){var e=this._devTools,t=new ce;e.add(t),this._entryBtn.initCfg(t),e.initCfg(t)},_initTools:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["console","elements","network","resources","sources","info","snippets"];t=Ao()(t);var n=this._devTools;t.forEach((function(t){var o=e[Ke()(t)];try{o&&n.add(new o)}catch(e){ue()((function(){$e.error("Something wrong when initializing tool ".concat(t,":"),e.message)}))}})),n.showTool(t[0]||"settings")}}},4236:function(e,t){t=function(e){return null===e},e.exports=t},4249:function(e,t,n){var o=n(9100),r=n(5651);t=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"js",s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};r(s,i),e=e.replace(//g,">"),n=a[n];var c=0,l=[];o(n,(function(n){n.language&&(e=e.replace(n.re,(function(e,o){return o?(l[c++]=t(o,n.language,s),e.replace(o,"___subtmpl"+(c-1)+"___")):e})))})),o(n,(function(t,n){a[t.language]||(e=e.replace(t.re,"___"+n+"___$1___end"+n+"___"))}));var u=[];return e=e.replace(/___(?!subtmpl)\w+?___/g,(function(e){var t="end"===e.substr(3,3),o=(t?e.substr(6):e.substr(3)).replace(/_/g,""),r=u.length>0?u[u.length-1]:null;return!t&&(null==r||o==r||null!=r&&n[r]&&null!=n[r].embed&&n[r].embed.indexOf(o)>-1)?(u.push(o),e):t&&o==r?(u.pop(),e):""})),o(n,(function(t,n){var o=s[t.style]?' style="'.concat(s[t.style],'"'):"";e=e.replace(new RegExp("___end"+n+"___","g"),"
    ").replace(new RegExp("___"+n+"___","g"),'"))})),o(n,(function(t){t.language&&(e=e.replace(/___subtmpl\d+___/g,(function(e){var t=parseInt(e.replace(/___subtmpl(\d+)___/,"$1"),10);return l[t]})))})),e};var i={comment:"color:#63a35c;",string:"color:#183691;",number:"color:#0086b3;",keyword:"color:#a71d5d;",operator:"color:#994500;"},a={js:{comment:{re:/(\/\/.*|\/\*([\s\S]*?)\*\/)/g,style:"comment"},string:{re:/(('.*?')|(".*?"))/g,style:"string"},numbers:{re:/(-?(\d+|\d+\.\d+|\.\d+))/g,style:"number"},keywords:{re:/(?:\b)(function|for|foreach|while|if|else|elseif|switch|break|as|return|this|class|self|default|var|const|let|false|true|null|undefined)(?:\b)/gi,style:"keyword"},operator:{re:/(\+|-|\/|\*|%|=|<|>|\||\?|\.)/g,style:"operator"}}};a.html={comment:{re:/(<!--([\s\S]*?)-->)/g,style:"comment"},tag:{re:/(<\/?\w(.|\n)*?\/?>)/g,style:"keyword",embed:["string"]},string:a.js.string,css:{re:/(?:<style.*?>)([\s\S]*)?(?:<\/style>)/gi,language:"css"},script:{re:/(?:<script.*?>)([\s\S]*?)(?:<\/script>)/gi,language:"js"}},a.css={comment:a.js.comment,string:a.js.string,numbers:{re:/((-?(\d+|\d+\.\d+|\.\d+)(%|px|em|pt|in)?)|#[0-9a-fA-F]{3}[0-9a-fA-F]{3})/g,style:"number"},keywords:{re:/(@\w+|:?:\w+|[a-z-]+:)/g,style:"keyword"}},e.exports=t},4279:function(e,t,n){(t=n(6314)(!1)).push([e.id,"#_settings{overflow-y:auto;-webkit-overflow-scrolling:touch}._safe-area #_settings{padding-bottom:calc(0px + env(safe-area-inset-bottom))}",""]),e.exports=t},4307:function(e,t,n){var o=n(2263),r=n(2767),i=n(9100),a=n(438),s=n(9405),c=n(3915),l=n(3957);t={on:function(e,t,n){l(t)&&(n=t,t={}),e=e.split(f),i(e,(function(e){if(e=h(e),t.element){var o=t.element,r=o._hotkeyListeners||{};o._hotkeyListeners=r,r[e]=r[e]||[];var i=function(t){e===d(t)&&n(t)};r[e].push({listener:i,origin:n}),o.addEventListener("keydown",i)}else u.on(e,n)}))},off:function(e,t,n){l(t)&&(n=t,t={}),e=e.split(f),i(e,(function(e){if(e=h(e),t.element){var o=t.element,r=o._hotkeyListeners;if(r&&r[e]){for(var i,a=r[e],s=0,c=a.length;s]*>/g.test(e))try{var t=s.default.parse(e);return f(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),s.default.stringify(t)}catch(t){return n(e)}return n(e)}};var p,v="ontouchstart"in a.default,g={start:"touchstart",move:"touchmove",end:"touchend"},m={start:"mousedown",move:"mousemove",end:"mouseup"};t.drag=function(e){return v?g[e]:m[e]},t.eventClient=function(e,t){var n="x"===e?"clientX":"clientY";return t[n]?t[n]:t.changedTouches?t.changedTouches[0][n]:0},t.eventPage=function(e,t){var n="x"===e?"pageX":"pageY";return t[n]?t[n]:t.changedTouches?t.changedTouches[0][n]:0},t.measuredScrollbarWidth=function(){if((0,c.default)(p))return p;if(!document)return 16;var e=document.createElement("div"),t=document.createElement("div");return e.setAttribute("style","display: block; width: 100px; height: 100px; overflow: scroll;"),t.setAttribute("style","height: 200px"),e.appendChild(t),document.body.appendChild(e),p=e.offsetWidth-e.clientWidth,document.body.removeChild(e),p},t.hasVerticalScrollbar=function(e){return e.scrollHeight>e.offsetHeight},t.executeAfterTransition=function(e,t){if((0,h.default)(e))return t();var n=function(o){o.target===e&&(e.removeEventListener("transitionend",n),t())};e.addEventListener("transitionend",n)},t.pxToNum=function(e){return(0,u.default)(e.replace("px",""))},t.getPlatform=function(){var e=(0,d.default)();return"os x"===e?"mac":e},t.resetCanvasSize=function(e){e.width=Math.round(e.offsetWidth*window.devicePixelRatio),e.height=Math.round(e.offsetHeight*window.devicePixelRatio)}},4801:function(e,t,n){var o=n(4950),r=n(2989),i=n(2561),a=n(1580),s=n(1168),c=n(3145),l=n(9100),u=n(2717),d=n(5427),h=n(466),f=n(8105),p=n(8796),v=n(2571),g=n(3981),m=n(7514),b=n(3249),y=n(9760),A=n(4460),w=n(6513),_=n(1009),x=n(2806),k=n(4151),C=n(896),S=n(5793);function E(e,n,o,r){var a=[];return l(n,(function(e){var n,s=Object.getOwnPropertyDescriptor(o,e),c=s&&s.get,l=s&&s.set;if(!r.accessGetter&&c)n="(...)";else try{if(n=o[e],b(r.ignore,n))return;p(n)&&n.catch((function(){}))}catch(e){n=e.message}a.push("".concat(T(e),":").concat(t(n,r))),c&&a.push("".concat(T("get "+i(e)),":").concat(t(s.get,r))),l&&a.push("".concat(T("set "+i(e)),":").concat(t(s.set,r)))})),'"'.concat(e,'":{')+a.join(",")+"}"}function T(e){return'"'.concat(O(e),'"')}function N(e){return'"'.concat(O(i(e)),'"')}function O(e){return o(e).replace(/\\'/g,"'").replace(/\t/g,"\\t")}t=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=n.self,l=n.startTime,u=void 0===l?g():l,p=n.timeout,y=void 0===p?0:p,A=n.depth,w=void 0===A?0:A,_=n.curDepth,x=void 0===_?1:_,k=n.visitor,C=void 0===k?new j:k,S=n.unenumerable,T=void 0!==S&&S,O=n.symbol,M=void 0!==O&&O,I=n.accessGetter,z=void 0!==I&&I,D=n.ignore,B=void 0===D?[]:D,F="",R={visitor:C,unenumerable:T,symbol:M,accessGetter:z,depth:w,curDepth:x+1,timeout:y,startTime:u,ignore:B},L=r(e,!1);if("String"===L)F=N(e);else if("Number"===L)F=i(e),a(F,"Infinity")&&(F='{"value":"'.concat(F,'","type":"Number"}'));else if("NaN"===L)F='{"value":"NaN","type":"Number"}';else if("Boolean"===L)F=e?"true":"false";else if("Null"===L)F="null";else if("Undefined"===L)F='{"type":"Undefined"}';else if("Symbol"===L){var G="Symbol";try{G=i(e)}catch(e){}F='{"value":'.concat(N(G),',"type":"Symbol"}')}else{if(y&&g()-u>y)return N("Timeout");if(w&&x>w)return N("{...}");F="{";var P,H=[],Y=C.get(e);if(Y?(P=Y.id,H.push('"reference":'.concat(P))):(P=C.set(e),H.push('"id":'.concat(P))),H.push('"type":"'.concat(L,'"')),a(L,"Function")?H.push('"value":'.concat(N(s(e)))):"RegExp"===L&&H.push('"value":'.concat(N(e))),!Y){var $=c(e);if($.length&&H.push(E("enumerable",$,o||e,R)),T){var q=h(m(e,{prototype:!1,unenumerable:!0}),$);q.length&&H.push(E("unenumerable",q,o||e,R))}if(M){var Q=v(m(e,{prototype:!1,symbol:!0}),(function(e){return"symbol"==typeof e}));Q.length&&H.push(E("symbol",Q,o||e,R))}var U=d(e);if(U&&!b(B,U)){var W='"proto":'.concat(t(U,f(R,{self:o||e})));H.push(W)}}F+=H.join(",")+"}"}return F};var j=u({initialize:function(){this.id=1,this.visited=[]},set:function(e){var t=this.visited,n=this.id,o={id:n,val:e};return t.push(o),this.id++,n},get:function(e){for(var t=this.visited,n=0,o=t.length;n>6*t)+n);t>0;){o+=h(128|63&e>>6*(t-1)),t--}return o}function p(e){for(;;){if(i>=a&&l){if(e)return v();throw new Error("Invalid byte index")}if(i===a)return!1;var t=r[i];if(i++,l){if(td){if(e)return i--,v();throw new Error("Invalid continuation byte")}if(u=128,d=191,s=s<<6|63&t,++c===l){var n=s;return s=0,l=0,c=0,n}}else{if(!(128&t))return t;if(192==(224&t))l=1,s=31&t;else if(224==(240&t))224===t&&(u=160),237===t&&(d=159),l=2,s=15&t;else{if(240!=(248&t)){if(e)return v();throw new Error("Invalid UTF-8 detected")}240===t&&(u=144),244===t&&(d=143),l=3,s=7&t}}}}function v(){var e=i-c-1;return i=e+1,s=0,l=0,c=0,u=128,d=191,r[e]}e.exports=t},4983:function(e,t){t=function(e){try{return JSON.parse(e),!0}catch(e){return!1}},e.exports=t},4992:function(e,t,n){var o=n(3974);t=function(e){return"[object ArrayBuffer]"===o(e)},e.exports=t},4994:function(e,t,n){var o=n(2510);t=o((function(e,t,n){return o((function(o){return e.apply(t,n.concat(o))}))})),e.exports=t},5004:function(e,t,n){var o=n(1909),r=n(621);t=function(e){function t(t){return e.indexOf(t)>-1}if(!e&&o&&(e=navigator.userAgent),e){if(e=e.toLowerCase(),t("windows phone"))return"windows phone";if(t("win"))return"windows";if(t("android"))return"android";if(t("ipad")||t("iphone")||t("ipod"))return"ios";if(t("mac"))return"os x";if(t("linux"))return"linux"}else if(r){var n=process,i=n.platform,a=n.env;if("win32"===i||"cygwin"===a.OSTYPE||"msys"===a.OSTYPE)return"windows";if("darwin"===i)return"os x";if("linux"===i)return"linux"}return"unknown"},e.exports=t},5021:function(e,t,n){var o=n(7744),r=n(1931),i=n(9464),a=n(8032),s=n(5651),c=n(9760),l=r("local");t=o.extend({initialize:function(e,t){this._name=e,t=t||{};var n=l.getItem(e);try{n=JSON.parse(n)}catch(e){n={}}c(n)||(n={}),t=s(n,t),this.callSuper(o,"initialize",[t])},save:function(e){if(i(e))return l.removeItem(this._name);l.setItem(this._name,a(e))}}),e.exports=t},5119:function(e,t,n){var o=n(9100);t=function(e){var t=[];return o(e,(function(e){t.push(e)})),t},e.exports=t},5132:function(e,t,n){var o=n(3974);t=function(e){return"[object Arguments]"===o(e)},e.exports=t},5145:function(e,t,n){var o=n(9756),r=n(5651),i=n(3145),a=n(6214),s=n(9760);t=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(t,c);var n=t.deep,o=t.comparator,l=[],u=[];return function e(t){var r,c=l.indexOf(t);if(c>-1)return u[c];if(a(t)){r=[],l.push(t),u.push(r);for(var d=0,h=t.length;d=55296&&r<=56319&&n2?n-2:0),d=2;d=a?"":e.substr(i,a)},e.exports=t},5334:function(e,t,n){"use strict";var o=this&&this.__awaiter||function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function a(e){try{c(o.next(e))}catch(e){i(e)}}function s(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}c((o=o.apply(e,t||[])).next())}))},r=this&&this.__generator||function(e,t){var n,o,r,i={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(n=1,o&&(r=2&s[0]?o.return:s[0]?o.throw||((r=o.return)&&r.call(o),0):o.next)&&!(r=r.call(o,s[1])).done)return r;switch(o=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(r=i.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]e.length)&&(t=e.length);for(var n=0,o=Array(t);n1?n-1:0),u=1;u0?i.apply(null,p):0;return s(a(f,(function(e){return" "===e[0]?e.slice(b):e})).join("\n"))};var c=/^(\s+)\S+/;e.exports=t},5784:function(e,t,n){"use strict";n.d(t,{A:function(){return _e}});var o=n(7528),r=n(4467),i=n(3029),a=n(2901),s=n(388),c=n(3954),l=n(5361),u=n(2263),d=n.n(u),h=n(3693),f=n.n(h),p=n(3915),v=n.n(p),g=n(9405),m=n.n(g),b=n(5169),y=n.n(b),A=n(9548),w=n.n(A),_=(n(6097),n(3249)),x=n.n(_),k=(n(6030),n(5004)),C=n.n(k);n(9410),n(8609);function S(e){var t="luna-".concat(e,"-");function n(e){return v()(m()(e).split(/\s+/),(function(e){return x()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=w().parse(e);return E(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),w().stringify(t)}catch(t){return n(e)}return n(e)}}function E(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,l=void 0===a?"light":a;return(0,i.A)(this,t),o=function(e,t,n){return t=(0,c.A)(t),(0,s.A)(e,H()?Reflect.construct(t,n||[],(0,c.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=r,o.c=S(r),o.options={},o.container=e,o.$container=f()(e),o.$container.addClass(["luna-".concat(r),o.c("platform-".concat(N()))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=L().get()),o.setTheme(n),j()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),L().on("change",o.onThemeChange),o.setOption("theme",l),o}return(0,l.A)(t,e),(0,a.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");j()(n.split(/\s+/),(function(n){P()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),L().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,j()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){F()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){j()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};D()(e,t),I()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(d()),Q=n(5241),U=n.n(Q),W=n(2571),J=n.n(W),K=n(7181),V=n.n(K),Z=n(5773),X=n.n(Z),ee=n(769),te=n.n(ee),ne=n(2208),oe=n.n(ne),re=n(4249),ie=n.n(re),ae=n(15),se=n.n(ae),ce=n(3497),le=n.n(ce),ue=n(5902),de=n.n(ue),he=n(8098),fe=n.n(he),pe=n(4307),ve=n.n(pe),ge=n(96),me=n.n(ge);function be(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function ye(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return(0,i.A)(this,t),o=this,r=t,a=[e,{compName:"dom-viewer"},l],r=(0,c.A)(r),(n=(0,s.A)(o,Ae()?Reflect.construct(r,a||[],(0,c.A)(o).constructor):r.apply(o,a))).isExpanded=!1,n.childNodes=[],n.childNodeDomViewers=[],n.expand=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];n.isExpandable()&&(n.isExpanded||(n.isExpanded=!0,n.renderExpandTag(),n.renderChildNodes()),e&&j()(n.childNodeDomViewers,(function(e){e.expand(!0)})))},n.collapse=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];n.isExpandable()&&(n.isExpanded&&(n.isExpanded=!1,n.renderCollapseTag()),e&&j()(n.childNodeDomViewers,(function(e){e.collapse(!0)})))},n.toggle=function(){n.isExpanded?n.collapse():n.expand()},n.onKeyRight=function(){n.isExpanded?n.childNodeDomViewers[0].select():n.expand()},n.onKeyLeft=function(){var e;n.isExpanded?n.collapse():null===(e=n.options.parent)||void 0===e||e.select()},n.onKeyDown=function(){var e=n.options;if(n.isExpanded)n.childNodeDomViewers[0].select();else{var t=e.parent;if(t)if(e.isEndTag){if(!(t=t.getOption("parent")))return;var o=t,r=o.childNodes,i=o.childNodeDomViewers,a=o.endTagDomViewer,s=r.indexOf(e.node);r[s+1]?i[s+1].select():a&&a.select()}else{var c=t,l=c.childNodeDomViewers,u=c.endTagDomViewer,d=l.indexOf(n);l[d+1]?l[d+1].select():u&&u.select()}}},n.onKeyUp=function(){var e=n.options,t=e.parent;if(t){var o,r;if(e.isEndTag)o=le()(t.childNodeDomViewers);else{var i=t.childNodeDomViewers.indexOf(n);i<1?t.select():o=t.childNodeDomViewers[i-1]}if(o)if(o.isExpanded)null===(r=o.endTagDomViewer)||void 0===r||r.select();else o.select()}},n.initOptions(l,{node:document.documentElement,parent:null,isEndTag:!1,observe:!0,rootContainer:e,rootDomViewer:n,ignore:function(){return!1},ignoreAttr:function(){return!1},lowerCaseTagName:!0,hotkey:!0}),n.isShadowRoot=V()(n.options.node),n.initTpl(),n.bindEvent(),!n.options.isEndTag&&n.options.observe&&n.initObserver(),n}return(0,l.A)(t,e),(0,a.A)(t,[{key:"select",value:function(e){var t=this.c,n=this.options;if(!e||e&&n.node===e){if(this.$tag.hasClass(t("selected")))return;return f()(this.options.rootContainer).find(t(".selected")).rmClass(t("selected")).rmAttr("tabindex"),this.$tag.attr("tabindex","0").get(0).focus(),this.$tag.addClass(t("selected")),void n.rootDomViewer.emit("select",n.node)}if(e.nodeType===Node.ELEMENT_NODE)for(var o=e,r=e.parentElement;r;){if(r===n.node){this.expand(),this.childNodeDomViewers[this.childNodes.indexOf(o)].select(e);break}o=r,r=r.parentElement}}},{key:"attach",value:function(){this.container.appendChild(this.$tag.get(0)),this.$children&&this.container.appendChild(this.$children.get(0))}},{key:"isAttached",value:function(){return!!this.$tag.get(0).parentNode}},{key:"detach",value:function(){this.$tag.remove(),this.$children&&this.$children.remove()}},{key:"destroy",value:function(){var e=this.c;this.$tag.hasClass(e("selected"))&&this.options.rootDomViewer.emit("deselect"),this.detach(),this.observer&&this.observer.disconnect(),this.destroySubComponents(),this.options.rootDomViewer===this&&this.$container.rmClass("luna-dom-viewer").rmClass(e("platform-".concat(N()))).rmClass(e("theme-".concat(this.options.theme))),this.emit("destroy"),this.removeAllListeners()}},{key:"renderExpandTag",value:function(){var e=this.$tag,t=this.c,n=this.options.node;this.isShadowRoot||e.html(this.renderHtmlTag(ye(ye({},xe(n)),{},{hasTail:!1,hasToggleButton:!0}))),e.addClass(t("expanded")),this.$children.rmClass(t("hidden"))}},{key:"renderCollapseTag",value:function(){var e=this.$tag,t=this.c,n=this.options.node;this.$children.addClass(t("hidden")),this.isShadowRoot||this.$tag.html(this.renderHtmlTag(ye(ye({},xe(n)),{},{hasTail:!0,hasToggleButton:!0}))),e.rmClass(t("expanded"))}},{key:"initObserver",value:function(){var e=this;this.observer=new(oe())((function(t){j()(t,(function(t){e.handleMutation(t)}))})),this.observer.observe(this.options.node,{attributes:!0,childList:!0,characterData:!0})}},{key:"handleMutation",value:function(e){var t=this.$tag,n=this.c,o=this.options,r=o.node,i=o.ignore;if(x()(["attributes","childList"],e.type)){if("childList"===e.type){if(fe()(e.addedNodes,i)&&fe()(e.removedNodes,i))return;this.renderChildNodes()}this.isExpandable()?this.isExpanded?this.renderExpandTag():this.renderCollapseTag():(this.$children.addClass(n("hidden")),this.isExpanded=!1,this.isShadowRoot?t.html(this.renderShadowRoot(!1)):t.html(this.renderHtmlTag(ye(ye({},xe(r)),{},{hasTail:!1}))))}else"characterData"===e.type&&(r.nodeType===Node.TEXT_NODE?t.html(this.renderTextNode(r)):r.nodeType===Node.COMMENT_NODE&&t.html(this.renderHtmlComment(r.nodeValue)))}},{key:"bindEvent",value:function(){var e=this,t=this.c,n=this.$tag;if((this.options.node.nodeType===Node.ELEMENT_NODE||this.isShadowRoot)&&n.on("click",t(".toggle"),(function(t){t.stopPropagation(),e.toggle()})),T?n.on("click",(function(){return e.select()})):n.on("mousedown",(function(){return e.select()})),this.options.hotkey){var o={element:n.get(0)};ve().on("right",o,this.onKeyRight),ve().on("left",o,this.onKeyLeft),ve().on("down",o,this.onKeyDown),ve().on("up",o,this.onKeyUp)}}},{key:"isExpandable",value:function(){return!(this.options.node.nodeType!==Node.ELEMENT_NODE&&!this.isShadowRoot)&&this.getChildNodes().length>0}},{key:"getChildNodes",value:function(){var e=this.options,t=e.rootContainer,n=e.ignore,o=this.options.node,r=te()(o.childNodes);return r=J()(r,(function(e){if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.COMMENT_NODE){var o=e.nodeValue;if(""===m()(o))return!1}return e!==t&&!n(e)})),o.shadowRoot?r.unshift(o.shadowRoot):o.chobitsuShadowRoot&&r.unshift(o.chobitsuShadowRoot),r}},{key:"initTpl",value:function(){var e=this.container,t=this.c,n=this.options,o=n.node,r=n.isEndTag,i=n.lowerCaseTagName,a=f()(U()("li"));if(a.addClass(t("tree-item")),this.$tag=a,r){var s=o.tagName;i&&(s=me()(s)),a.html(t('</'.concat(s,'>')))}else if(o.nodeType===Node.ELEMENT_NODE){var c=this.isExpandable(),l=ye(ye({},xe(o)),{},{hasTail:c,hasToggleButton:c});a.html(this.renderHtmlTag(l))}else if(V()(o)){var u=this.isExpandable();a.html(this.renderShadowRoot(u))}else if(o.nodeType===Node.TEXT_NODE)a.html(this.renderTextNode(o));else{if(o.nodeType!==Node.COMMENT_NODE)return;var d=o.nodeValue;if(""===d.trim())return;a.html(this.renderHtmlComment(d))}if(e.appendChild(a.get(0)),o.nodeType===o.ELEMENT_NODE||this.isShadowRoot){var h=f()(U()("ul"));h.addClass([t("children"),t("hidden")]),e.appendChild(h.get(0)),this.$children=h}}},{key:"renderChildNodes",value:function(){var e=this,n=this.options.node,o=this.options,r=o.rootContainer,i=o.ignore,a=o.ignoreAttr,s=o.rootDomViewer,c=o.observe,l=o.lowerCaseTagName,u=this.$children.get(0),d=this.childNodes,h=this.childNodeDomViewers;j()(h,(function(t){t.detach(),e.removeSubComponent(t)})),this.endTagDomViewer&&this.endTagDomViewer.detach();var f=this.getChildNodes();this.childNodes=f;var p=[];this.childNodeDomViewers=p,j()(f,(function(n,o){var f,v=d.indexOf(n);(f=v>-1?h[v]:new t(u,{node:n,observe:c,parent:e,rootContainer:r,rootDomViewer:s,ignore:i,ignoreAttr:a,lowerCaseTagName:l})).attach(),p[o]=f,e.addSubComponent(f)})),j()(h,(function(e){e.isAttached()||e.destroy()})),n&&!this.isShadowRoot&&(this.endTagDomViewer?this.endTagDomViewer.attach():(this.endTagDomViewer=new t(u,{node:n,parent:this,isEndTag:!0,lowerCaseTagName:l,rootContainer:r,rootDomViewer:s,ignore:i}),this.addSubComponent(this.endTagDomViewer)))}},{key:"renderHtmlTag",value:function(e){var t=this,n=this.options.lowerCaseTagName;e.attributes=J()(e.attributes,(function(n){return!t.options.ignoreAttr(e.el,n.name,n.value)}));var r=v()(e.attributes,(function(e){var t=e.name,n=e.value,o=e.isLink;return'\n '.concat(de()(t),"").concat(n?'="').concat(de()(n),'"'):"","")})).join(""),i="",a=e.tagName;return n&&(a=me()(a)),e.hasTail?i="".concat(e.hasTail?"…":"",'</').concat(a,">"):this.isExpandable()||(i='</'.concat(a,">")),this.c(X()(Y||(Y=(0,o.A)(["\n ",'\n <',"",">",'\n '])),e.hasToggleButton?this.renderToggle():"",a,r,i))}},{key:"renderTextNode",value:function(e){var t=this.c,n=e.nodeValue,o=e.parentElement,r='',i='';if(o&&n.length<1e4){if("STYLE"===o.tagName)return t("".concat(r).concat(ie()(n,"css",we)).concat(i));if("SCRIPT"===o.tagName)return t("".concat(r).concat(ie()(n,"js",we)).concat(i))}return t('"'.concat(r).concat(de()(se()(n,1e4,{separator:" ",ellipsis:"…"}))).concat(i,'"'))}},{key:"renderHtmlComment",value:function(e){return this.c('<!-- '.concat(de()(e),' -->'))}},{key:"renderShadowRoot",value:function(e){var t=this.options.node;return this.c(X()($||($=(0,o.A)(["\n ",'\n #shadow-root (',')\n '])),e?this.renderToggle():"",t.mode))}},{key:"renderToggle",value:function(){return'
    '}}])}(q);function xe(e){var t={el:e,tagName:"",attributes:[]};t.tagName=e.tagName;var n=[];return j()(e.attributes,(function(t){var o=t.name,r=t.value;n.push({name:o,value:r,isLink:ke(e,o)})})),t.attributes=n,t}function ke(e,t){var n=e.tagName;return("SCRIPT"===n||"IMAGE"===n||"VIDEO"===n||"AUDIO"===n)&&"src"===t||"LINK"===n&&"href"===t}(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,_e)},5793:function(e,t,n){var o=n(6097),r=n(3957),i=Math.pow(2,53)-1;t=function(e){if(!e)return!1;var t=e.length;return o(t)&&t>=0&&t<=i&&!r(e)},e.exports=t},5820:function(e,t,n){var o,r=n(3981),i=n(5169),a=i.performance,s=i.process;if(a&&a.now)t=function(){return a.now()};else if(s&&s.hrtime){var c=function(){var e=s.hrtime();return 1e9*e[0]+e[1]};o=c()-1e9*s.uptime(),t=function(){return(c()-o)/1e6}}else o=r(),t=function(){return r()-o};e.exports=t},5865:function(e,t,n){var o=n(4534);t=function(e,t){return o(e,t,!0)},e.exports=t},5869:function(e,t,n){var o=n(365);t=function(e,t){var n=function(r){var i=n.cache,a=""+(t?t.apply(this,arguments):r);return o(i,a)||(i[a]=e.apply(this,arguments)),i[a]};return n.cache={},n},e.exports=t},5902:function(e,t,n){var o=n(3145),r=(t=function(e){return a.test(e)?e.replace(s,c):e}).map={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},i="(?:"+o(r).join("|")+")",a=new RegExp(i),s=new RegExp(i,"g"),c=function(e){return r[e]};e.exports=t},5945:function(e,t,n){var o=n(3974);t=function(e){return"[object Set]"===o(e)},e.exports=t},5957:function(e,t,n){var o=n(1738),r=n(2990),i=n(4992),a=n(6214),s=n(3159),c=n(2989),l=n(96);(t=function(e,t){var n;if(t=l(t),o(e))n=new Uint8Array(r.decode(e));else if(i(e))e=e.slice(0),n=new Uint8Array(e);else if(a(e))n=new Uint8Array(e);else if("uint8array"===c(e))n=e.slice(0);else if(s(e)){n=new Uint8Array(e.length);for(var u=0;un?n:e},e.exports=t},6030:function(e,t,n){var o=n(6097),r=n(9760),i=n(3957),a=n(1738);t=function(e){if(o(e))return e;if(r(e)){var t=i(e.valueOf)?e.valueOf():e;e=r(t)?t+"":t}return a(e)?+e:0===e?e:+e},e.exports=t},6032:function(e,t,n){var o=n(2717),r=n(8105),i=n(9405),a=n(7257),s=n(9464),c=n(9100),l=n(6214),u=n(769),d=n(1909),h=n(9760),f=n(2561);t=o({className:"Url",initialize:function(e){!e&&d&&(e=window.location.href),r(this,t.parse(e||""))},setQuery:function(e,t){var n=this.query;return h(e)?c(e,(function(e,t){n[t]=f(e)})):n[e]=f(t),this},rmQuery:function(e){var t=this.query;return l(e)||(e=u(e)),c(e,(function(e){delete t[e]})),this},toString:function(){return t.stringify(this)}},{parse:function(e){var t={protocol:"",auth:"",hostname:"",hash:"",query:{},port:"",pathname:"",slashes:!1},n=i(e),o=!1,r=n.match(p);if(r&&(r=r[0],t.protocol=r.toLowerCase(),n=n.substr(r.length)),r&&(o="//"===n.substr(0,2))&&(n=n.slice(2),t.slashes=!0),o){for(var s=n,c=-1,l=0,u=g.length;l-1&&(s=n.slice(0,c),n=n.slice(c));var h=s.lastIndexOf("@");-1!==h&&(t.auth=decodeURIComponent(s.slice(0,h)),s=s.slice(h+1)),t.hostname=s;var f=s.match(v);f&&(":"!==(f=f[0])&&(t.port=f.substr(1)),t.hostname=s.substr(0,s.length-f.length))}var m=n.indexOf("#");-1!==m&&(t.hash=n.substr(m),n=n.slice(0,m));var b=n.indexOf("?");return-1!==b&&(t.query=a.parse(n.substr(b+1)),n=n.slice(0,b)),t.pathname=n||"/",t},stringify:function(e){var t=e.protocol+(e.slashes?"//":"")+(e.auth?encodeURIComponent(e.auth)+"@":"")+e.hostname+(e.port?":"+e.port:"")+e.pathname;return s(e.query)||(t+="?"+a.stringify(e.query)),e.hash&&(t+=e.hash),t}});var p=/^([a-z0-9.+-]+:)/i,v=/:[0-9]*$/,g=["/","?","#"];e.exports=t},6097:function(e,t,n){var o=n(3974);t=function(e){return"[object Number]"===o(e)},e.exports=t},6167:function(e,t,n){var o=n(5693);t=function(e,t,n,r){r=r||1,t=o(t,n);for(var i=e.length,a=r>0?0:i-1;a>=0&&a"),t))return void n.push(e);var i=[];(0,A.default)(e.attributes,(function(e){var t=e.name,n=e.value;return i.push(t,n)}));for(var a=0,s=i.length;a"),v.default.parse(i)[0].attrs));var i},t.setAttributeValue=function(e){var t=e.nodeId,n=e.name,o=e.value;(0,l.getNode)(t).setAttribute(n,o)},t.setInspectedNode=function(e){var t=(0,l.getNode)(e.nodeId);O.unshift(t),O.length>5&&O.pop();for(var n=0;n<5;n++)(0,k.setGlobal)("$".concat(n),O[n])},t.setNodeValue=function(e){var t=e.nodeId,n=e.value;(0,l.getNode)(t).nodeValue=n},t.setOuterHTML=function(e){var t=e.nodeId,n=e.outerHTML;(0,l.getNode)(t).outerHTML=n},t.getDOMNodeId=function(e){var t=e.node;return{nodeId:c.getOrCreateNodeId(t)}},t.getDOMNode=function(e){var t=e.nodeId;return{node:(0,l.getNode)(t)}},t.getTopLayerElements=function(){return{nodeIds:[]}},t.getNodesForSubtreeByStyle=function(){return{nodeIds:[]}};var s=a(n(8665)),c=i(n(9893)),l=n(9893),u=i(n(2484)),d=a(n(8757)),h=a(n(3693)),f=a(n(4236)),p=a(n(9464)),v=a(n(9548)),g=a(n(3915)),m=a(n(438)),b=a(n(3249)),y=a(n(96)),A=a(n(9100)),w=a(n(769)),_=a(n(8862)),x=a(n(4069)),k=n(2627),C=n(916);var S,E=!1;(S=Element.prototype.attachShadow)&&(Element.prototype.attachShadow=function(e){var t=S.apply(this,[e]);if(!c.isValidNode(this))return t;if(this.chobitsuShadowRoot=t,E){d.default.observe(t);var n=(0,l.getNodeId)(this);n&&s.default.trigger("DOM.shadowRootPushed",{hostId:n,root:c.wrap(t,{depth:1})})}return t});var T=new Map;function N(e){for(var t=[e],n=e.parentNode;n;){if(t.push(n),r=(0,l.getNodeId)(n))break;n=n.parentNode}for(;t.length;){var o=t.pop(),r=(0,l.getNodeId)(o);s.default.trigger("DOM.setChildNodes",{parentId:r,nodes:c.getChildNodes(o,1)})}return(0,l.getNodeId)(e)}var O=[];function j(e,t){for(var n=c.filterNodes(e.childNodes),o=0,r=n.length;o0&&r[r.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]-1)return r(e.substring(n+t.length,e.indexOf(".",n)))}e.exports=t},6631:function(e,t,n){var o=n(6030);t=function(e){return e?(e=o(e))-e%1:0===e?e:0},e.exports=t},6717:function(e,t,n){(t=n(6314)(!1)).push([e.id,"._container ._entry-btn{touch-action:none;width:40px;height:40px;display:flex;background:#000;opacity:.3;border-radius:10px;position:relative;z-index:1000;transition:opacity .3s;color:#fff;font-size:25px;align-items:center;justify-content:center}._container ._entry-btn._active,._container ._entry-btn:active{opacity:.8}",""]),e.exports=t},6741:function(e,t,n){var o=n(2717),r=n(6186),i=n(8105),a=n(2508),s=n(1738),c=n(3957);t=o({initialize:function(e,t){this._locale=e,this._langs=t},set:function(e,t){this._langs[e]?i(this._langs[e],t):this._langs[e]=t},t:function(e,t){var n="",o=this._langs[this._locale];return o?(n=r(o,e),t&&(s(n)?n=a(n,t):c(n)&&(n=n(t))),n||""):""},locale:function(e){this._locale=e}}),e.exports=t},6774:function(e,t){t=function(e,t,n){null==t&&(t=e,e=0);var o=Math.random();return n||e%1||t%1?Math.min(e+o*(t-e+parseFloat("1e-"+((o+"").length-1))),t):e+Math.floor(o*(t-e+1))},e.exports=t},6793:function(e,t,n){(t=n(6314)(!1)).push([e.id,"@font-face{font-family:eruda-icon;src:url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff')}[class*=' _icon-'],[class^='_icon-']{display:inline-block;font-family:eruda-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}._icon-arrow-left:before{content:'\\f101'}._icon-arrow-right:before{content:'\\f102'}._icon-caret-down:before{content:'\\f103'}._icon-caret-right:before{content:'\\f104'}._icon-clear:before{content:'\\f105'}._icon-compress:before{content:'\\f106'}._icon-copy:before{content:'\\f107'}._icon-delete:before{content:'\\f108'}._icon-error:before{content:'\\f109'}._icon-expand:before{content:'\\f10a'}._icon-eye:before{content:'\\f10b'}._icon-filter:before{content:'\\f10c'}._icon-play:before{content:'\\f10d'}._icon-record:before{content:'\\f10e'}._icon-refresh:before{content:'\\f10f'}._icon-reset:before{content:'\\f110'}._icon-search:before{content:'\\f111'}._icon-select:before{content:'\\f112'}._icon-tool:before{content:'\\f113'}._icon-warn:before{content:'\\f114'}",""]),e.exports=t},6833:function(e,t){var n=/([A-Z])/g,o=/[_.\- ]+/g,r=/(^-)|(-$)/g;t=function(e){return(e=e.replace(n,"-$1").toLowerCase().replace(o,"-").replace(r,"")).split("-")},e.exports=t},6866:function(e,t,n){var o=n(1738),r=n(9760),i=n(7604),a=n(8971),s=n(3249),c=n(6097),l=n(3612),u=n(6969),d=n(9100);t=function(e,t,n){if(e=l(e),a(n)&&o(t))return function(e,t){return e.style[u(t)]||getComputedStyle(e,"").getPropertyValue(t)}(e[0],t);var f=t;r(f)||((f={})[t]=n),function(e,t){d(e,(function(e){var n=";";d(t,(function(e,t){t=u.dash(t),n+=t+":"+function(e,t){var n=c(t)&&!s(h,i(e));return n?t+"px":t}(t,e)+";"})),e.style.cssText+=n}))}(e,f)};var h=["column-count","columns","font-weight","line-weight","opacity","z-index","zoom"];e.exports=t},6911:function(e,t,n){"use strict";n.d(t,{j:function(){return Pe},A:function(){return $e}});var o=n(2284),r=n(3029),i=n(2901),a=n(388),s=n(3954),c=n(991),l=n(5361),u=n(5427),d=n.n(u),h=n(6097),f=n.n(h),p=n(6493),v=n.n(p),g=n(96),m=n.n(g),b=n(9760),y=n.n(b),A=n(6214),w=n.n(A),_=n(9931),x=n.n(_),k=n(3145),C=n.n(k),S=n(9100),E=n.n(S),T=n(1168),N=n.n(T),O=n(8796),j=n.n(O),M=n(2989),I=n.n(M),z=n(3693),D=n.n(z),B=n(466),F=n.n(B),R=n(15),L=n.n(R),G=n(1738),P=n.n(G),H=n(7514),Y=n.n(H),$=n(2571),q=n.n($),Q=n(7140),U=n.n(Q),W=n(2561),J=n.n(W),K=n(9993),V=n.n(K),Z=n(1532),X=n.n(Z),ee=n(8105),te=n.n(ee),ne=function(){return(0,i.A)((function e(){(0,r.A)(this,e),this.id=0,this.visited=[]}),[{key:"set",value:function(e,t){var n=this.visited,o=this.id,r={id:o,val:e};return te()(r,t),n.push(r),this.id++,o}},{key:"get",value:function(e){for(var t=this.visited,n=0,o=t.length;n500&&(e=e.slice(0,500)+"..."),"ƒ "+re()(function(e){var t=e.match(le);return t?t[0]:e}(e).replace("function",""))}var le=/function(.*?)\((.*?)\)/;var ue=n(1009),de=n.n(ue),he=n(5630),fe=n.n(he),pe=n(6030),ve=n.n(pe),ge=n(1932),me=n.n(ge),be=n(2263),ye=n.n(be),Ae=n(3915),we=n.n(Ae),_e=n(5169),xe=n.n(_e),ke=n(9548),Ce=n.n(ke),Se=n(3249),Ee=n.n(Se),Te=n(5004),Ne=n.n(Te);n(9410),n(8609);function Oe(e){var t="luna-".concat(e,"-");function n(e){return we()(re()(e).split(/\s+/),(function(e){return Ee()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=Ce().parse(e);return je(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),Ce().stringify(t)}catch(t){return n(e)}return n(e)}}function je(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===l?"light":l;return(0,r.A)(this,t),o=function(e,t,n){return t=(0,s.A)(t),(0,a.A)(e,Re()?Reflect.construct(t,n||[],(0,s.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=c,o.c=Oe(c),o.options={},o.container=e,o.$container=D()(e),o.$container.addClass(["luna-".concat(c),o.c("platform-".concat((i=Ne()(),"os x"===i?"mac":i)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=Fe().get()),o.setTheme(n),E()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),Fe().on("change",o.onThemeChange),o.setOption("theme",u),o}return(0,l.A)(t,e),(0,i.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");E()(n.split(/\s+/),(function(n){de()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),Fe().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,E()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){De()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){E()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Ie()(e,t),te()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(ye());function Ge(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Ge=function(){return!!e})()}var Pe=function(e){function t(e){var n,o,i,c;return(0,r.A)(this,t),o=this,i=t,c=[e,{compName:"object-viewer"}],i=(0,s.A)(i),(n=(0,a.A)(o,Ge()?Reflect.construct(i,c||[],(0,s.A)(o).constructor):i.apply(o,c))).onItemClick=function(e){var t=n,o=t.map,r=t.c,i=D()(e.curTarget),a=i.data("object-id"),s=i.find("span").eq(0);if(!i.data("first-level")&&(a&&(i.find("ul").html(n.objToHtml(o[a],!1)),i.rmAttr("data-object-id")),e.stopImmediatePropagation(),s.hasClass(r("expanded")))){var c=i.find("ul").eq(0);s.hasClass(r("collapsed"))?(s.rmClass(r("collapsed")),c.show()):(s.addClass(r("collapsed")),c.hide()),n.emit("change")}},n.bindEvent(),n}return(0,l.A)(t,e),(0,i.A)(t,[{key:"set",value:function(e){P()(e)&&(e=JSON.parse(e)),this.data={id:fe()("json"),enumerable:{0:e}},this.map={},He(this.map,this.data),this.render()}},{key:"destroy",value:function(){var e,n,o,r,i;(e=t,n="destroy",o=this,r=3,i=(0,c.A)((0,s.A)(1&r?e.prototype:e),n,o),2&r&&"function"==typeof i?function(e){return i.apply(o,e)}:i)([]),this.$container.off("click","li",this.onItemClick)}},{key:"objToHtml",value:function(e,t){var n=this,o="";return E()(["enumerable","unenumerable","symbol"],(function(r){if(e[r]){var i=C()(e[r]);X()(i);for(var a=0,s=i.length;a3&&void 0!==arguments[3]&&arguments[3],i=this.c,a=(0,o.A)(t);if(null===t)return"
  • ".concat(h(e),'null
  • ');if(f()(t)||v()(t))return"
  • ".concat(h(e),'').concat(se(t),"
  • ");if("RegExp"===t.type&&(a="regexp"),"Number"===t.type&&(a="number"),"Number"===t.type||"RegExp"===t.type)return"
  • ".concat(h(e),'').concat(se(t.value),"
  • ");if("Undefined"===t.type||"Symbol"===t.type)return"
  • ".concat(h(e),'').concat(m()(t.type),"
  • ");if("(...)"===t)return"
  • ".concat(h(e),'').concat(t,"
  • ");if(y()(t)){var s=t.id,c=t.reference,l=function(e){var t=e.type,n=e.value;if(!t)return;if("Function"===t)return ce(n);if("Array"===t&&e.unenumerable)return"Array(".concat(e.unenumerable.length,")");return e.type}(t)||x()(a),u=r?"":''),d="
  • ").concat(u).concat(h(e),'').concat(r?"":l,'
      ");return r&&(d+=this.objToHtml(this.map[s])),d+'
  • ')}function h(e){if(r)return"";if(y()(t)&&t.jsonSplitArr)return"";var o=i("key");return"unenumerable"===n||"symbol"===n?o=i("key-lighter"):"proto"===n&&(o=i("key-special")),'').concat(se(e),": ")}return P()(t)&&t.length>1e4&&(t=L()(t,50,{separator:" ",ellipsis:"…"})),"
  • ".concat(h(e),'"').concat(se(t),'"
  • ')}},{key:"render",value:function(){var e=this.map[this.data.id];this.$container.html(this.objToHtml(e,!0))}},{key:"bindEvent",value:function(){this.$container.on("click","li",this.onItemClick)}}])}(Le);function He(e,t){var n=t.id;if(n||0===n){if(t.type&&de()(t.type,"Array")&&t.enumerable){var o=function(e,t,n){var o=[],r={};E()(e.enumerable,(function(e,t){var n=ve()(t);me()(n)?r[t]=e:o[n]=e})),o.enumerable=r,o.type=n,o.id=t,e.unenumerable&&(o.unenumerable=e.unenumerable);e.symbol&&(o.symbol=e.symbol);e.proto&&(o.proto=e.proto);return o}(t,n,t.type);o.length>100&&(t=function(e){var t=0,n={};E()(U()(e,100),(function(e){var o={},r=t;o.type="["+r,o.enumerable={},E()(e,(function(e){o.enumerable[t]=e,t+=1}));var i=t-1;o.type+=(i-r>0?" … "+i:"")+"]",o.id=fe()("json"),o.jsonSplitArr=!0,n[t]=o}));var o={};o.enumerable=n,o.id=e.id,o.type=e.type,e.unenumerable&&(o.unenumerable=e.unenumerable);e.symbol&&(o.symbol=e.symbol);e.proto&&(o.proto=e.proto);return o}(o))}e[n]=t;var r=[];E()(["enumerable","unenumerable","symbol"],(function(e){if(t[e])for(var n in t[e])r.push(t[e][n])})),t.proto&&r.push(t.proto);for(var i=0,a=r.length;i1&&void 0!==arguments[1]?arguments[1]:{};return(0,r.A)(this,t),o=this,i=t,c=[e,{compName:"object-viewer"}],i=(0,s.A)(i),(n=(0,a.A)(o,Ye()?Reflect.construct(i,c||[],(0,s.A)(o).constructor):i.apply(o,c))).onItemClick=function(e){var t=n,o=t.map,r=t.c;if(!function(e){var t=window.getSelection();if(!t||"Range"!==t.type||""===t.toString())return!1;var n=t.anchorNode,o=t.focusNode;return t.containsNode(e,!0)||n&&e.contains(n)||o&&e.contains(o)}(e.curTarget)){var i=D()(e.curTarget),a=i.data("object-id"),s=i.find("span").eq(0);if(!i.data("first-level")&&(a&&(i.find("ul").html(n.objToHtml(o[a],!1)),i.rmAttr("data-object-id")),e.stopImmediatePropagation(),s.hasClass(r("expanded")))){var c=i.find("ul").eq(0);s.hasClass(r("collapsed"))?(s.rmClass(r("collapsed")),c.show()):(s.addClass(r("collapsed")),c.hide()),n.emit("change")}}},n.initOptions(l,{prototype:!0,unenumerable:!1,accessGetter:!1}),n.bindEvent(),n.options.object&&n.set(n.options.object),n}return(0,l.A)(t,e),(0,i.A)(t,[{key:"set",value:function(e){this.data=[e],this.visitor=new ne,this.map={},this.render()}},{key:"destroy",value:function(){var e,n,o,r,i;(e=t,n="destroy",o=this,r=3,i=(0,c.A)((0,s.A)(1&r?e.prototype:e),n,o),2&r&&"function"==typeof i?function(e){return i.apply(o,e)}:i)([]),this.$container.off("click","li",this.onItemClick)}},{key:"objToHtml",value:function(e,t){var n=this,r=this.visitor,i=e,a=!1,s=r.get(e);s&&s.self&&(i=s.self);var c="",l=["enumerable"],u=C()(e),h=[],f=[],p=[],v={};if(this.options.unenumerable&&!t&&(l.push("unenumerable"),l.push("symbol"),h=F()(Y()(e,{prototype:!1,unenumerable:!0}),u),f=q()(Y()(e,{prototype:!1,symbol:!0}),(function(e){return"symbol"===(0,o.A)(e)}))),w()(e)&&e.length>100){l.unshift("virtual"),a=!0;var g=0,m={};E()(U()(e,100),(function(e){var t=Object.create(null),n=g,o="["+n;E()(e,(function(e){t[g]=e,m[g]=!0,g++}));var r=g-1;v[o+=(r-n>0?" … "+r:"")+"]"]=t})),p=C()(v),u=q()(u,(function(e){return!m[e]}))}if(E()(l,(function(o){var r=[];r="symbol"===o?f:"unenumerable"===o?h:"virtual"===o?p:u,a||X()(r);for(var s=0,l=r.length;s4&&void 0!==arguments[4]&&arguments[4],a=this.visitor,s=this.c,c=(0,o.A)(n),l=I()(n,!1);if("virtual"===r&&(l=e),null===n)return"
  • ".concat(A(e),'null
  • ');if(f()(n)||v()(n))return"
  • ".concat(A(e),'').concat(se(n),"
  • ");if("RegExp"===l&&(c="regexp"),"Number"===l&&(c="number"),"Undefined"===l||"Symbol"===l)return"
  • ".concat(A(e),'').concat(m()(l),"
  • ");if("(...)"===n)return"
  • ".concat(A(e),'').concat(n,"
  • ");if(y()(n)){var u,d=a.get(n);if(d)u=d.id;else{var h={};"proto"===r&&(h.self=t),u=a.set(n,h),this.map[u]=n}var p="Object";p="regexp"===c?'').concat(se(n)):se(function(e,t){if(!t)return;if("Function"===t)return ce(N()(e));if("Array"===t)return"Array(".concat(e.length,")");return t}(n,l)||x()(c));var g=i?"":''),b="
  • ").concat(g).concat(A(e),'').concat(i?"":p,'
      ");return i&&(b+=this.objToHtml(n)),b+'
  • ')}function A(e){if(i)return"";if(y()(n)&&"virtual"===r)return"";var t=s("key");return"unenumerable"===r||"symbol"===r?t=s("key-lighter"):"proto"===r&&(t=s("key-special")),'').concat(se(e),": ")}return P()(n)&&n.length>1e4&&(n=L()(n,50,{separator:" ",ellipsis:"…"})),"
  • ".concat(A(e),'"').concat(se(n),'"
  • ')}},{key:"render",value:function(){this.$container.html(this.objToHtml(this.data,!0))}},{key:"bindEvent",value:function(){var e=this;this.$container.on("click","li",this.onItemClick),this.on("changeOption",(function(t,n){switch(t){case"object":e.set(n);break;case"unenumerable":case"prototype":case"accessGetter":e.render()}}))}}])}(Le);$e.Static=Pe,function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}}(e,$e)},6948:function(e,t){var n=/<[^>]*>/g;t=function(e){return e.replace(n,"")},e.exports=t},6949:function(e,t,n){var o=n(365),r=n(6214);t=function(e,t){if(r(e))return e;if(t&&o(t,e))return[e];var n=[];return e.replace(i,(function(e,t,o,r){n.push(o?r.replace(a,"$1"):t||e)})),n};var i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g;e.exports=t},6962:function(e,t,n){var o=n(1909),r=n(1023),i=!1;function a(e){i&&t.emit(e)}t={start:function(){i=!0},stop:function(){i=!1}},r.mixin(t),o?(window.addEventListener("error",(function(e){if(e.error)a(e.error);else if(e.message){var t=new Error(e.message);t.stack="Error: ".concat(e.message," \n at ").concat(e.filename,":").concat(e.lineno,":").concat(e.colno),a(t)}})),window.addEventListener("unhandledrejection",(function(e){a(e.reason)}))):(process.on("uncaughtException",a),process.on("unhandledRejection",a)),e.exports=t},6969:function(e,t,n){var o=n(5869),r=n(387),i=n(9931),a=n(365),s=n(7604);(t=o((function(e){if(e=e.replace(l,""),e=r(e),a(u,e))return e;for(var t=c.length;t--;){var n=c[t]+i(e);if(a(u,n))return n}return e}))).dash=o((function(e){var n=t(e);return(l.test(n)?"-":"")+s(n)}));var c=["O","ms","Moz","Webkit"],l=/^(O)|(ms)|(Moz)|(Webkit)|(-o-)|(-ms-)|(-moz-)|(-webkit-)/g,u=document.createElement("p").style;e.exports=t},7e3:function(e,t,n){var o=n(2263),r=new(n(3737))("(prefers-color-scheme: dark)");t={get:function(){return r.isMatch()?"dark":"light"}},o.mixin(t),r.on("match",(function(){return t.emit("change","dark")})),r.on("unmatch",(function(){return t.emit("change","light")})),e.exports=t},7005:function(e,t,n){var o=n(2717),r=n(5395);t=o({initialize:function(){this.clear()},clear:function(){this._items=[],this.size=0},push:function(e){return this._items.push(e),++this.size},pop:function(){if(this.size)return this.size--,this._items.pop()},peek:function(){return this._items[this.size-1]},forEach:function(e,t){t=arguments.length>1?t:this;for(var n=this._items,o=this.size-1,r=0;o>=0;o--,r++)e.call(t,n[o],r,this)},toArr:function(){return r(this._items)}}),e.exports=t},7030:function(e,t,n){var o=n(1738),r=n(2517),i=n(2561),a=n(6392);t=function(e,n,a,h){1===arguments.length&&o(e)&&!u.test(e)&&(n=e,e=void 0),e=e||new Date,r(e)||(e=new Date(e));var f=(n=i(t.masks[n]||n||t.masks.default)).slice(0,4);"UTC:"!==f&&"GMT:"!==f||(n=n.slice(4),a=!0,"GMT:"===f&&(h=!0));var p=a?"getUTC":"get",v=e[p+"Date"](),g=e[p+"Day"](),m=e[p+"Month"](),b=e[p+"FullYear"](),y=e[p+"Hours"](),A=e[p+"Minutes"](),w=e[p+"Seconds"](),_=e[p+"Milliseconds"](),x=a?0:e.getTimezoneOffset(),k={d:v,dd:s(v),ddd:t.i18n.dayNames[g],dddd:t.i18n.dayNames[g+7],m:m+1,mm:s(m+1),mmm:t.i18n.monthNames[m],mmmm:t.i18n.monthNames[m+12],yy:i(b).slice(2),yyyy:b,h:y%12||12,hh:s(y%12||12),H:y,HH:s(y),M:A,MM:s(A),s:w,ss:s(w),l:s(_,3),L:s(Math.round(_/10)),t:y<12?"a":"p",tt:y<12?"am":"pm",T:y<12?"A":"P",TT:y<12?"AM":"PM",Z:h?"GMT":a?"UTC":(i(e).match(l)||[""]).pop().replace(d,""),o:(x>0?"-":"+")+s(100*Math.floor(Math.abs(x)/60)+Math.abs(x)%60,4),S:["th","st","nd","rd"][v%10>3?0:(v%100-v%10!=10)*v%10]};return n.replace(c,(function(e){return e in k?k[e]:e.slice(1,e.length-1)}))};var s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;return a(i(e),t,"0")},c=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|"[^"]*"|'[^']*'/g,l=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,u=/\d/,d=/[^-+\dA-Z]/g;t.masks={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},t.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]},e.exports=t},7119:function(e){e.exports='.luna-dom-highlighter{position:fixed;left:0;top:0;width:100%;height:100%;z-index:100000;pointer-events:none;font-size:13px}.luna-dom-highlighter-fill{position:absolute;top:0;right:0;bottom:0;left:0}.luna-dom-highlighter-platform-linux{font-family:Roboto,Ubuntu,Arial,sans-serif}.luna-dom-highlighter-platform-mac{color:#303942;font-family:\'.SFNSDisplay-Regular\',\'Helvetica Neue\',\'Lucida Grande\',sans-serif}.luna-dom-highlighter-platform-windows{font-family:\'Segoe UI\',Tahoma,sans-serif}.luna-dom-highlighter-px{color:gray}#luna-dom-highlighter-element-title{position:absolute;z-index:10}.luna-dom-highlighter-tooltip-content{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#fff;padding:5px 8px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;min-width:100px;max-width:min(300px,100% - 4px);z-index:2;background-clip:padding-box;will-change:transform;text-rendering:optimizeLegibility;pointer-events:none;filter:drop-shadow(0 2px 4px rgba(0,0,0,.35))}.luna-dom-highlighter-tooltip-content .luna-dom-highlighter-tooltip-arrow{background:#fff;width:15px;height:8px;position:absolute}.luna-dom-highlighter-element-info-section{margin-top:12px;margin-bottom:6px}.luna-dom-highlighter-section-name{color:#333;font-weight:500;font-size:10px;text-transform:uppercase;letter-spacing:.05em;line-height:12px}.luna-dom-highlighter-element-info{display:flex;flex-direction:column}.luna-dom-highlighter-element-info-header{display:flex;align-items:center}.luna-dom-highlighter-element-info-body{display:flex;flex-direction:column;padding-top:2px;margin-top:2px}.luna-dom-highlighter-element-info-row{display:flex;line-height:19px}.luna-dom-highlighter-separator-container{display:flex;align-items:center;flex:auto;margin-left:7px}.luna-dom-highlighter-separator{border-top:1px solid #ddd;width:100%}.luna-dom-highlighter-element-info-name{flex-shrink:0;color:#666}.luna-dom-highlighter-element-info-gap{flex:auto}.luna-dom-highlighter-element-info-value-color{display:flex;color:#303942;margin-left:10px;align-items:baseline}.luna-dom-highlighter-a11y-icon{width:16px;height:16px;background-repeat:no-repeat;display:inline-block}.luna-dom-highlighter-element-info-value-contrast{display:flex;align-items:center;text-align:right;color:#303942;margin-left:10px}.luna-dom-highlighter-element-info-value-contrast .luna-dom-highlighter-a11y-icon{margin-left:8px}.luna-dom-highlighter-element-info-value-icon{display:flex;align-items:center}.luna-dom-highlighter-element-info-value-text{text-align:right;color:#303942;margin-left:10px;align-items:baseline;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.luna-dom-highlighter-color-swatch{display:flex;margin-right:2px;width:10px;height:10px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);line-height:10px}.luna-dom-highlighter-color-swatch-inner{flex:auto;border:1px solid #808002}.luna-dom-highlighter-element-layout-type{margin-right:10px;width:16px;height:16px}.luna-dom-highlighter-element-layout-type.luna-dom-highlighter-grid{background-image:url(\'data:image/svg+xml,\')}.luna-dom-highlighter-element-layout-type.luna-dom-highlighter-flex{background-image:url(\'data:image/svg+xml,\')}.luna-dom-highlighter-element-description{flex:1 1;font-weight:700;word-wrap:break-word;word-break:break-all}.luna-dom-highlighter-dimensions{color:#737373;text-align:right;margin-left:10px}.luna-dom-highlighter-material-node-width{margin-right:2px}.luna-dom-highlighter-material-node-height{margin-left:2px}.luna-dom-highlighter-material-tag-name{color:#881280}.luna-dom-highlighter-material-class-name,.luna-dom-highlighter-material-node-id{color:#1a1aa6}.luna-dom-highlighter-contrast-text{width:16px;height:16px;text-align:center;line-height:16px;margin-right:8px;border:1px solid #000;padding:0 1px}.luna-dom-highlighter-a11y-icon-not-ok{background-image:url(\'data:image/svg+xml,\')}.luna-dom-highlighter-a11y-icon-warning{background-image:url(\'data:image/svg+xml,\')}.luna-dom-highlighter-a11y-icon-ok{background-image:url(\'data:image/svg+xml,\')}@media (forced-colors:active){:root,body{background-color:transparent;forced-color-adjust:none}.luna-dom-highlighter-tooltip-content{border-color:Highlight;background-color:canvas;color:text;forced-color-adjust:none}.luna-dom-highlighter-tooltip-content::after{background-color:Highlight}.luna-dom-highlighter-color-swatch-inner,.luna-dom-highlighter-contrast-text,.luna-dom-highlighter-separator{border-color:Highlight}.luna-dom-highlighter-section-name{color:Highlight}.luna-dom-highlighter-dimensions,.luna-dom-highlighter-element-info-name,.luna-dom-highlighter-element-info-value-color,.luna-dom-highlighter-element-info-value-contrast,.luna-dom-highlighter-element-info-value-icon,.luna-dom-highlighter-element-info-value-text,.luna-dom-highlighter-material-class-name,.luna-dom-highlighter-material-node-id,.luna-dom-highlighter-material-tag-name{color:canvastext}}\n\n/*# sourceMappingURL=luna-dom-highlighter.css.map*/'},7140:function(e,t){t=function(e,t){var n=[];t=t||1;for(var o=0,r=Math.ceil(e.length/t);o0?n.join("="):null;o=decodeURIComponent(o),r=decodeURIComponent(r),i(t[o])?t[o]=r:a(t[o])?t[o].push(r):t[o]=[t[o],r]})),t},stringify:function(e,n){return l(s(e,(function(e,o){return u(e)&&c(e)?"":a(e)?t.stringify(e,o):(n?encodeURIComponent(n):encodeURIComponent(o))+"="+encodeURIComponent(e)})),(function(e){return e.length>0})).join("&")}};var d=/^(\?|#|&)/g;e.exports=t},7308:function(e,t,n){var o=n(9100),r=n(1738),i=n(8971),a=n(3249),s=n(6214),c=n(9760),l=n(769);(t=function(e,t){if(i(e))return n={},d((function(e,t){n[e]=t})),n;var n;if(r(e)&&i(t)||s(e))return function(e){if(!r(e)){var t={};return d((function(n,o){a(e,n)&&(t[n]=o)})),t}var n=h(e);if(n)return n.getAttribute("content")}(e);var l=e;c(l)||((l={})[e]=t),function(e){o(e,(function(e,t){var n=h(t);if(n)return n.setAttribute("content",e);(n=u.createElement("meta")).setAttribute("name",t),n.setAttribute("content",e),u.head.appendChild(n)}))}(l)}).remove=function(e){e=l(e),o(e,(function(e){var t=h(e);t&&u.head.removeChild(t)}))};var u=document;function d(e){var t=u.querySelectorAll("meta");o(t,(function(t){var n=t.getAttribute("name"),o=t.getAttribute("content");n&&o&&e(n,o)}))}function h(e){return u.querySelector('meta[name="'+e+'"]')}e.exports=t},7375:function(e,t){t=function(e,t,n){return Array.prototype.indexOf.call(e,t,n)},e.exports=t},7468:function(e,t,n){var o=n(3145);t=function(e,t){var n=o(t),r=n.length;if(null==e)return!r;e=Object(e);for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:{},n=t.prototype,c=void 0===n||n,l=t.unenumerable,u=void 0!==l&&l,d=t.symbol,h=void 0!==d&&d,f=[];if((u||h)&&a){var p=o;u&&a&&(p=a);do{f=f.concat(p(e)),h&&s&&(f=f.concat(s(e)))}while(c&&(e=r(e))&&e!==Object.prototype);f=i(f)}else if(c)for(var v in e)f.push(v);else f=o(e);return f},e.exports=t},7528:function(e,t,n){"use strict";function o(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}n.d(t,{A:function(){return o}})},7542:function(e,t){t=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},e.exports=t},7571:function(e,t,n){var o=n(2263),r=n(6186),i=window.screen;t={get:function(){if(i){var e=r(i,"orientation.type");if(e)return e.split("-").shift()}return window.innerWidth>window.innerHeight?"landscape":"portrait"}},o.mixin(t),window.addEventListener("orientationchange",(function(){setTimeout((function(){t.emit("change",t.get())}),200)}),!1),e.exports=t},7604:function(e,t,n){var o=n(6833);t=function(e){return o(e).join("-")},e.exports=t},7622:function(e,t,n){var o=n(2263),r=n(2192),i=n(769),a=n(8971),s=n(8420),c=n(1738),l=n(6097);t=o.extend({initialize:function(e,n){this.name=e,this.setLevel(a(n)?t.level.DEBUG:n),this.callSuper(o,"initialize",arguments)},setLevel:function(e){return c(e)?((e=t.level[e.toUpperCase()])&&(this._level=e),this):(l(e)&&(this._level=e),this)},getLevel:function(){return this._level},formatter:function(e,t){return t},trace:function(){return this._log("trace",arguments)},debug:function(){return this._log("debug",arguments)},info:function(){return this._log("info",arguments)},warn:function(){return this._log("warn",arguments)},error:function(){return this._log("error",arguments)},_log:function(e,n){return 0===(n=i(n)).length?this:(this.emit("all",e,s(n)),t.level[e.toUpperCase()]*{vertical-align:top}.luna-console-log-item .luna-console-log-content .luna-console-null,.luna-console-log-item .luna-console-log-content .luna-console-undefined{color:#5e5e5e}.luna-console-log-item .luna-console-log-content .luna-console-number{color:#1c00cf}.luna-console-log-item .luna-console-log-content .luna-console-boolean{color:#0d22aa}.luna-console-log-item .luna-console-log-content .luna-console-regexp,.luna-console-log-item .luna-console-log-content .luna-console-symbol{color:#881391}.luna-console-log-item .luna-console-data-grid,.luna-console-log-item .luna-console-dom-viewer{white-space:initial}.luna-console-log-item.luna-console-error{z-index:50;background:#fff0f0;color:red;border-top:1px solid #ffd6d6;border-bottom:1px solid #ffd6d6}.luna-console-log-item.luna-console-error .luna-console-stack{padding-left:1.2em;white-space:nowrap}.luna-console-log-item.luna-console-error .luna-console-count{background:red}.luna-console-log-item.luna-console-debug{z-index:20}.luna-console-log-item.luna-console-input{border-bottom-color:transparent}.luna-console-log-item.luna-console-warn{z-index:40;color:#5c5c00;background:#fffbe5;border-top:1px solid #fff5c2;border-bottom:1px solid #fff5c2}.luna-console-log-item.luna-console-warn .luna-console-count{background:#e8a400}.luna-console-log-item.luna-console-info{z-index:30}.luna-console-log-item.luna-console-group,.luna-console-log-item.luna-console-groupCollapsed{font-weight:700}.luna-console-preview{display:inline-block}.luna-console-preview .luna-console-preview-container{display:flex;align-items:center}.luna-console-preview .luna-console-json{overflow-x:auto;-webkit-overflow-scrolling:touch;padding-left:12px}.luna-console-preview .luna-console-preview-icon-container{display:block}.luna-console-preview .luna-console-preview-icon-container .luna-console-icon{position:relative;font-size:12px}.luna-console-preview .luna-console-preview-icon-container .luna-console-icon-caret-down{top:2px}.luna-console-preview .luna-console-preview-icon-container .luna-console-icon-caret-right{top:1px}.luna-console-preview .luna-console-preview-content-container{word-break:break-all}.luna-console-preview .luna-console-descriptor,.luna-console-preview .luna-console-object-preview{font-style:italic}.luna-console-preview .luna-console-key{color:#881391}.luna-console-preview .luna-console-number{color:#1c00cf}.luna-console-preview .luna-console-null{color:#5e5e5e}.luna-console-preview .luna-console-string{color:#c41a16}.luna-console-preview .luna-console-boolean{color:#0d22aa}.luna-console-preview .luna-console-special{color:#5e5e5e}.luna-console-theme-dark{color-scheme:dark}.luna-console-theme-dark .luna-console-log-container.luna-console-selected .luna-console-log-item{background:#29323d}.luna-console-theme-dark .luna-console-log-container.luna-console-selected .luna-console-log-item:not(.luna-console-error):not(.luna-console-warn){border-color:#4173b4}.luna-console-theme-dark .luna-console-log-item{color:#a5a5a5;border-bottom-color:#3d3d3d}.luna-console-theme-dark .luna-console-log-item .luna-console-code .luna-console-keyword{color:#e36eec}.luna-console-theme-dark .luna-console-log-item .luna-console-code .luna-console-number{color:#9980ff}.luna-console-theme-dark .luna-console-log-item .luna-console-code .luna-console-operator{color:#7f7f7f}.luna-console-theme-dark .luna-console-log-item .luna-console-code .luna-console-comment{color:#747474}.luna-console-theme-dark .luna-console-log-item .luna-console-code .luna-console-string{color:#f29766}.luna-console-theme-dark .luna-console-log-item.luna-console-error{background:#290000;color:#ff8080;border-top-color:#5c0000;border-bottom-color:#5c0000}.luna-console-theme-dark .luna-console-log-item.luna-console-error .luna-console-count{background:#ff8080}.luna-console-theme-dark .luna-console-log-item.luna-console-warn{color:#ffcb6b;background:#332a00;border-top-color:#650;border-bottom-color:#650}.luna-console-theme-dark .luna-console-log-item .luna-console-count{background:#42597f;color:#949494}.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-null,.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-undefined{color:#7f7f7f}.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-boolean,.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-number{color:#9980ff}.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-regexp,.luna-console-theme-dark .luna-console-log-item .luna-console-log-content .luna-console-symbol{color:#e36eec}.luna-console-theme-dark .luna-console-icon-container .luna-console-icon-caret-down,.luna-console-theme-dark .luna-console-icon-container .luna-console-icon-caret-right{color:#9aa0a6}.luna-console-theme-dark .luna-console-header{border-bottom-color:#3d3d3d}.luna-console-theme-dark .luna-console-nesting-level{border-right-color:#3d3d3d}.luna-console-theme-dark .luna-console-nesting-level::before{border-bottom-color:#3d3d3d}.luna-console-theme-dark .luna-console-preview .luna-console-key{color:#e36eec}.luna-console-theme-dark .luna-console-preview .luna-console-number{color:#9980ff}.luna-console-theme-dark .luna-console-preview .luna-console-null{color:#7f7f7f}.luna-console-theme-dark .luna-console-preview .luna-console-string{color:#f29766}.luna-console-theme-dark .luna-console-preview .luna-console-boolean{color:#9980ff}.luna-console-theme-dark .luna-console-preview .luna-console-special{color:#7f7f7f}",""]),e.exports=t},8009:function(e,t,n){var o=n(6513);t=function(e,t){e.prototype=o(t.prototype)},e.exports=t},8032:function(e,t,n){var o=n(2989),r=n(9931),i=n(2561),a=n(8971),s=n(3957),c=n(1976);t=function(e,t){return JSON.stringify(e,(n=[],l=[],function(e,t){if(n.length>0){var u=n.indexOf(this);u>-1?(n.splice(u+1),l.splice(u,1/0,e)):(n.push(this),l.push(e));var d=n.indexOf(t);d>-1&&(t=n[0]===t?"[Circular ~]":"[Circular ~."+l.slice(0,d).join(".")+"]")}else n.push(t);return c(t)||s(t)?t="["+r(o(t))+" "+i(t)+"]":a(t)&&(t=null),t}),t);var n,l},e.exports=t},8046:function(e,t,n){var o=n(7731);t=function(){var e=o(16);return e[6]=15&e[6]|64,e[8]=63&e[8]|128,r[e[0]]+r[e[1]]+r[e[2]]+r[e[3]]+"-"+r[e[4]]+r[e[5]]+"-"+r[e[6]]+r[e[7]]+"-"+r[e[8]]+r[e[9]]+"-"+r[e[10]]+r[e[11]]+r[e[12]]+r[e[13]]+r[e[14]]+r[e[15]]};for(var r=[],i=0;i<256;i++)r[i]=(i+256).toString(16).substr(1);e.exports=t},8052:function(e,t,n){"use strict";n.d(t,{A:function(){return K}});var o=n(7528),r=n(3029),i=n(2901),a=n(388),s=n(3954),c=n(5361),l=n(2263),u=n.n(l),d=n(3693),h=n.n(d),f=n(3915),p=n.n(f),v=n(9405),g=n.n(v),m=n(5169),b=n.n(m),y=n(9548),A=n.n(y),w=n(6097),_=n.n(w),x=n(3249),k=n.n(x),C=(n(6030),n(5004)),S=n.n(C);n(9410),n(8609);function E(e){var t="luna-".concat(e,"-");function n(e){return p()(g()(e).split(/\s+/),(function(e){return k()(e,t)?e:e.replace(/[\w-]+/,(function(e){return"".concat(t).concat(e)}))})).join(" ")}return function(e){if(/<[^>]*>/g.test(e))try{var t=A().parse(e);return T(t,(function(e){e.attrs&&e.attrs.class&&(e.attrs.class=n(e.attrs.class))})),A().stringify(t)}catch(t){return n(e)}return n(e)}}function T(e,t){for(var n=0,o=e.length;n2&&void 0!==arguments[2]?arguments[2]:{}).theme,u=void 0===l?"light":l;return(0,r.A)(this,t),o=function(e,t,n){return t=(0,s.A)(t),(0,a.A)(e,H()?Reflect.construct(t,n||[],(0,s.A)(e).constructor):t.apply(e,n))}(this,t),o.subComponents=[],o.theme="",o.onThemeChange=function(e){"auto"===o.options.theme&&o.setTheme(e)},o.compName=c,o.c=E(c),o.options={},o.container=e,o.$container=h()(e),o.$container.addClass(["luna-".concat(c),o.c("platform-".concat((i=S()(),"os x"===i?"mac":i)))]),o.on("changeOption",(function(e,t){if("theme"===e&&t){var n=t;"auto"===t&&(n=L().get()),o.setTheme(n),j()(o.subComponents,(function(e){return e.setOption("theme",t)}))}})),L().on("change",o.onThemeChange),o.setOption("theme",u),o}return(0,c.A)(t,e),(0,i.A)(t,[{key:"destroy",value:function(){var e=this;this.destroySubComponents();var t=this.$container,n=t.attr("class");j()(n.split(/\s+/),(function(n){P()(n,"luna-".concat(e.compName))&&t.rmClass(n)})),t.html(""),this.emit("destroy"),this.removeAllListeners(),L().off("change",this.onThemeChange)}},{key:"setOption",value:function(e,t){var n=this,o=this.options,r={};"string"==typeof e?r[e]=t:r=e,j()(r,(function(e,t){var r=o[t];o[t]=e,e!==r&&n.emit("changeOption",t,e,r)}))}},{key:"getOption",value:function(e){return this.options[e]}},{key:"addSubComponent",value:function(e){e.setOption("theme",this.options.theme),this.subComponents.push(e)}},{key:"removeSubComponent",value:function(e){F()(this.subComponents,(function(t){return t===e}))}},{key:"destroySubComponents",value:function(){j()(this.subComponents,(function(e){return e.destroy()})),this.subComponents=[]}},{key:"initOptions",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};D()(e,t),I()(this.options,e)}},{key:"find",value:function(e){return this.$container.find(this.c(e))}},{key:"setTheme",value:function(e){var t=this.c,n=this.$container;this.theme&&n.rmClass(t("theme-".concat(this.theme))),n.addClass(t("theme-".concat(e))),this.theme=e}}])}(u()),q=n(5773),Q=n.n(q),U=n(5902),W=n.n(U);function J(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(J=function(){return!!e})()}e=n.hmd(e);var K=function(e){function t(e){var n,o,i,c,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,r.A)(this,t),o=this,i=t,c=[e,{compName:"tab"},l],i=(0,s.A)(i),(n=(0,a.A)(o,J()?Reflect.construct(i,c||[],(0,s.A)(o).constructor):i.apply(o,c))).initOptions(l,{height:30}),n.initTpl(),n.$tabs=n.find(".tabs"),n.tabs=n.$tabs.get(0),n.$slider=n.find(".slider"),n.bindEvent(),n.updateHeight(),n}return(0,c.A)(t,e),(0,i.A)(t,[{key:"length",get:function(){return this.$tabs.find(this.c(".item")).length}},{key:"insert",value:function(e,t){var n=this.c,o=this.$tabs,r=this.options.height-1,i=o.find(n(".item")),a=i.length,s='
    ').concat(W()(t.title),"").concat(t.closeable?'
    '):"","
    ");e>a-1?o.append(s):i.eq(e).before(s),this.updateSlider()}},{key:"append",value:function(e){this.insert(this.length,e)}},{key:"remove",value:function(e){var t=this.c;if(1!==this.length){var n=this;this.$tabs.find(t(".item")).each((function(o){var r=h()(this);if(r.data("id")===e){if(r.remove(),r.hasClass(t("selected")))if(n.length>0){var i=o===n.length?o-1:o,a=n.$tabs.find(t(".item")).eq(i).data("id");n.select(a)}else n.emit("deselect");r.data("closeable")&&n.emit("close",e)}})),this.updateSlider()}}},{key:"select",value:function(e){var t=this.c,n=this;this.$tabs.find(t(".item")).each((function(){var o=h()(this);o.data("id")===e?(o.addClass(t("selected")),n.updateSlider(),n.scrollToSelected(),n.emit("select",e)):o.rmClass(t("selected"))}))}},{key:"deselect",value:function(){var e=this.c;this.$tabs.find(e(".item")).each((function(){h()(this).rmClass(e("selected"))})),this.emit("deselect"),this.updateSlider()}},{key:"scrollToSelected",value:function(){var e,t=this.$tabs,n=this.tabs,o=this.c,r=t.find(o(".selected")).get(0),i=r.offsetLeft,a=r.offsetWidth,s=n.offsetWidth,c=n.scrollLeft;is+c&&(e=i+a-s),_()(e)&&(n.scrollLeft=e)}},{key:"hideScrollbar",value:function(){var e=this.$tabs;if("none"!==getComputedStyle(this.tabs,"::-webkit-scrollbar").display){var t=function(){if(_()(N))return N;if(!document)return 16;var e=document.createElement("div"),t=document.createElement("div");e.setAttribute("style","display: block; width: 100px; height: 100px; overflow: scroll;"),t.setAttribute("style","height: 200px"),e.appendChild(t);var n=document.body||document.documentElement;return n.appendChild(e),N=e.offsetWidth-e.clientWidth,n.removeChild(e),N}();e.css("height",this.options.height-1+t+"px")}}},{key:"updateSlider",value:function(){var e=this.$slider,t=this.$tabs,n=this.c,o=t.find(n(".selected")).get(0);o?e.css({width:o.offsetWidth,left:o.offsetLeft-t.get(0).scrollLeft}):e.css({width:0})}},{key:"updateHeight",value:function(){var e=this.options.height,t=e-1;this.find(".tabs-container").css("height",e+"px"),this.find(".item").css({height:t,lineHeight:t}),this.hideScrollbar()}},{key:"bindEvent",value:function(){var e=this,t=this.tabs,n=this.c;this.on("changeOption",(function(t){if("height"===t)e.updateHeight()}));var o=this;this.$tabs.on("wheel",(function(e){e.preventDefault(),t.scrollLeft+=e.origEvent.deltaY})).on("click",n(".item"),(function(){var e=h()(this);o.select(e.data("id"))})).on("click",n(".close"),(function(e){e.stopPropagation();var t=h()(this).parent().parent();o.remove(t.data("id"))})).on("scroll",(function(){e.updateSlider()}))}},{key:"initTpl",value:function(){this.$container.html(this.c(Q()(Y||(Y=(0,o.A)(['\n
    \n
    \n
    \n
    \n '])))))}}])}($);(function(e,t){try{e.exports=t,e.exports.default=t}catch(e){}})(e,K)},8091:function(e,t,n){var o=n(282),r=n(9100),i=n(5207);function a(e){return''+e+""}t=function(e,t){t=t||a;var n=o(e);return r(n,(function(n){e=e.replace(new RegExp(i(n),"g"),t)})),e},e.exports=t},8098:function(e,t,n){var o=n(5693),r=n(5793),i=n(3145);t=function(e,t,n){t=o(t,n);for(var a=!r(e)&&i(e),s=(a||e).length,c=0;ct.right||e.bottomt.bottom}t=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.display,o=void 0===n||n,s=t.visibility,c=void 0!==s&&s,l=t.opacity,u=void 0!==l&&l,d=t.size,h=void 0!==d&&d,f=t.viewport,p=void 0!==f&&f,v=t.overflow,g=void 0!==v&&v,m=r(e);if(o){var b=e.tagName;if("BODY"===b||"HTML"===b||"fixed"===m.position){if("none"===m.display)return!0;for(var y=e;y=y.parentElement;){if("none"===r(y).display)return!0}}else if(null===e.offsetParent)return!0}if(c&&"hidden"===m.visibility)return!0;if(u){if("0"===m.opacity)return!0;for(var A=e;A=A.parentElement;){if("0"===r(A).opacity)return!0}}var w=e.getBoundingClientRect();if(h&&(0===w.width||0===w.height))return!0;if(p)return a(w,{top:0,left:0,right:i.documentElement.clientWidth,bottom:i.documentElement.clientHeight});if(g)for(var _=e;_=_.parentElement;){var x=r(_).overflow;if("scroll"===x||"hidden"===x)if(a(w,_.getBoundingClientRect()))return!0}return!1},e.exports=t},8665:function(e,t,n){"use strict";var o,r=this&&this.__extends||(o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.trigger=function(e,t){this.emit("message",JSON.stringify({method:e,params:t}))},t}(i(n(2263)).default);t.default=new a},8687:function(e,t,n){(t=n(6314)(!1)).push([e.id,'._container .luna-console{background:var(--background)}._container .luna-console-header{color:var(--link-color);border-bottom-color:var(--border)}._container .luna-console-nesting-level{border-right-color:var(--border)}._container .luna-console-nesting-level::before{border-bottom-color:var(--border)}._container .luna-console-log-container.luna-console-selected .luna-console-log-item{background:var(--contrast)}._container .luna-console-log-container.luna-console-selected .luna-console-log-item:not(.luna-console-error):not(.luna-console-warn){border-color:var(--border)}._container .luna-console-log-item{border-bottom-color:var(--border);color:var(--foreground)}._container .luna-console-log-item a{color:var(--link-color)!important}._container .luna-console-log-item .luna-console-icon-container .luna-console-icon{color:var(--foreground)}._container .luna-console-log-item .luna-console-icon-container .luna-console-icon-error{color:#ef3842}._container .luna-console-log-item .luna-console-icon-container .luna-console-icon-warn{color:#e8a400}._container .luna-console-log-item .luna-console-count{color:var(--select-foreground);background:var(--highlight)}._container .luna-console-log-item.luna-console-warn{color:var(--console-warn-foreground);background:var(--console-warn-background);border-color:var(--console-warn-border)}._container .luna-console-log-item.luna-console-error{background:var(--console-error-background);color:var(--console-error-foreground);border-color:var(--console-error-border)}._container .luna-console-log-item.luna-console-error .luna-console-count{background:var(--console-error-foreground)}._container .luna-console-log-item .luna-console-code .luna-console-key{color:var(--var-color)}._container .luna-console-log-item .luna-console-code .luna-console-number{color:var(--number-color)}._container .luna-console-log-item .luna-console-code .luna-console-null{color:var(--operator-color)}._container .luna-console-log-item .luna-console-code .luna-console-string{color:var(--string-color)}._container .luna-console-log-item .luna-console-code .luna-console-boolean{color:var(--keyword-color)}._container .luna-console-log-item .luna-console-code .luna-console-special{color:var(--operator-color)}._container .luna-console-log-item .luna-console-code .luna-console-keyword{color:var(--keyword-color)}._container .luna-console-log-item .luna-console-code .luna-console-operator{color:var(--operator-color)}._container .luna-console-log-item .luna-console-code .luna-console-comment{color:var(--comment-color)}._container .luna-console-log-item .luna-console-log-content .luna-console-null,._container .luna-console-log-item .luna-console-log-content .luna-console-undefined{color:var(--operator-color)}._container .luna-console-log-item .luna-console-log-content .luna-console-number{color:var(--number-color)}._container .luna-console-log-item .luna-console-log-content .luna-console-boolean{color:var(--keyword-color)}._container .luna-console-log-item .luna-console-log-content .luna-console-regexp,._container .luna-console-log-item .luna-console-log-content .luna-console-symbol{color:var(--var-color)}._container .luna-console-preview .luna-console-key{color:var(--var-color)}._container .luna-console-preview .luna-console-number{color:var(--number-color)}._container .luna-console-preview .luna-console-null{color:var(--operator-color)}._container .luna-console-preview .luna-console-string{color:var(--string-color)}._container .luna-console-preview .luna-console-boolean{color:var(--keyword-color)}._container .luna-console-preview .luna-console-special{color:var(--operator-color)}._container .luna-console-preview .luna-console-keyword{color:var(--keyword-color)}._container .luna-console-preview .luna-console-operator{color:var(--operator-color)}._container .luna-console-preview .luna-console-comment{color:var(--comment-color)}._container .luna-object-viewer{color:var(--primary);font-size:12px!important}._container .luna-object-viewer-null{color:var(--operator-color)}._container .luna-object-viewer-regexp,._container .luna-object-viewer-string{color:var(--string-color)}._container .luna-object-viewer-number{color:var(--number-color)}._container .luna-object-viewer-boolean{color:var(--keyword-color)}._container .luna-object-viewer-special{color:var(--operator-color)}._container .luna-object-viewer-key,._container .luna-object-viewer-key-lighter{color:var(--var-color)}._container .luna-object-viewer-expanded:before{border-color:transparent;border-top-color:var(--foreground)}._container .luna-object-viewer-collapsed:before{border-top-color:transparent;border-left-color:var(--foreground)}._container .luna-notification{pointer-events:none!important;padding:10px;z-index:1000}._container .luna-notification-item{z-index:500;color:var(--foreground);background:var(--background);box-shadow:none;padding:5px 10px;border:1px solid var(--border)}._container .luna-notification-upper{margin-bottom:10px}._container .luna-notification-lower{margin-top:10px}._container .luna-data-grid{color:var(--foreground);background:var(--background);border-color:var(--border)}._container .luna-data-grid td,._container .luna-data-grid th{border-color:var(--border)}._container .luna-data-grid th{background:var(--darker-background)}._container .luna-data-grid th.luna-data-grid-sortable:active,._container .luna-data-grid th.luna-data-grid-sortable:hover{color:var(--select-foreground);background:var(--highlight)}._container .luna-data-grid .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selectable:hover,._container .luna-data-grid .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selected{background:var(--highlight)}._container .luna-data-grid .luna-data-grid-data-container tr:nth-child(even){background:var(--contrast)}._container .luna-data-grid:focus .luna-data-grid-data-container .luna-data-grid-node.luna-data-grid-selected{background:var(--accent)}._container .luna-dom-viewer{color:var(--foreground)}._container .luna-dom-viewer .luna-dom-viewer-html-tag,._container .luna-dom-viewer .luna-dom-viewer-tag-name{color:var(--tag-name-color)}._container .luna-dom-viewer .luna-dom-viewer-attribute-name{color:var(--attribute-name-color)}._container .luna-dom-viewer .luna-dom-viewer-attribute-value{color:var(--string-color)}._container .luna-dom-viewer .luna-dom-viewer-html-comment{color:var(--comment-color)}._container .luna-dom-viewer .luna-dom-viewer-tree-item:hover .luna-dom-viewer-selection{background:var(--contrast)}._container .luna-dom-viewer .luna-dom-viewer-tree-item.luna-dom-viewer-selected .luna-dom-viewer-selection{background:var(--highlight)}._container .luna-dom-viewer .luna-dom-viewer-tree-item.luna-dom-viewer-selected:focus .luna-dom-viewer-selection{background:var(--accent);opacity:.2}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-key{color:var(--var-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-number{color:var(--number-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-null{color:var(--operator-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-string{color:var(--string-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-boolean{color:var(--keyword-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-special{color:var(--operator-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-keyword{color:var(--keyword-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-operator{color:var(--operator-color)}._container .luna-dom-viewer .luna-dom-viewer-text-node .luna-dom-viewer-comment{color:var(--comment-color)}._container .luna-dom-viewer-children{margin:0;padding-left:15px!important}._container ._inline .luna-modal,._container ._inline .luna-notification{position:absolute}._container .luna-modal{z-index:9999999}._container .luna-modal-body,._container .luna-modal-input{color:var(--foreground);background:var(--background)}._container .luna-modal-body{border-color:var(--border)}._container .luna-modal-input{-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;user-select:text!important;border-color:var(--border)}._container .luna-modal-button-group .luna-modal-secondary{border-color:var(--border);color:var(--foreground);background:var(--background)}._container .luna-modal-button-group .luna-modal-primary{background:var(--accent)}._container .luna-modal-button-group .luna-modal-button:active::before{background:var(--accent)}._container .luna-tab{position:absolute;left:0;top:0;color:var(--foreground);background:var(--darker-background)}._container .luna-tab-tabs-container{border-color:var(--border)}._container .luna-tab-item.luna-tab-selected,._container .luna-tab-item:hover{background:var(--highlight);color:var(--select-foreground)}._container .luna-tab-slider{background:var(--accent)}._container .luna-text-viewer{color:var(--foreground);border:none;border-bottom:1px solid var(--border);background:var(--background);font-size:12px}._container .luna-text-viewer .luna-text-viewer-line-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}._container .luna-text-viewer .luna-text-viewer-line-text *{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}._container .luna-text-viewer .luna-text-viewer-copy,._container .luna-text-viewer .luna-text-viewer-line-number{border-color:var(--border)}._container .luna-text-viewer .luna-text-viewer-copy .luna-text-viewer-icon-check{color:var(--accent)}._container .luna-text-viewer .luna-text-viewer-copy{background-color:var(--background)}._container .luna-setting{color:var(--foreground);background:var(--background)}._container .luna-setting-item.luna-setting-selected,._container .luna-setting-item:hover{background:var(--darker-background)}._container .luna-setting-item.luna-setting-selected:focus{outline:0}._container .luna-setting-item-title{font-size:14px}._container .luna-setting-item-separator{border-color:var(--border)}._container .luna-setting-item-checkbox input{border-color:var(--border)}._container .luna-setting-item-checkbox input:checked{background-color:var(--accent);border-color:var(--accent)}._container .luna-setting-item-select .luna-setting-select select{color:var(--foreground);border-color:var(--border);background:var(--background)}._container .luna-setting-item-select .luna-setting-select:after{border-top-color:var(--foreground)}._container .luna-setting-item-button button{color:var(--accent);background:var(--background);border-color:var(--border)}._container .luna-setting-item-button button:active,._container .luna-setting-item-button button:hover{background:var(--darker-background)}._container .luna-setting-item-button button:active{border:1px solid var(--accent)}._container .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar{background:var(--border)}._container .luna-setting-item-number .luna-setting-range-container .luna-setting-range-track .luna-setting-range-track-bar .luna-setting-range-track-progress{background:var(--accent)}._container .luna-setting-item-number .luna-setting-range-container input::-webkit-slider-thumb{border-color:var(--border);background:radial-gradient(circle at center,var(--dark) 0,var(--dark) 15%,var(--light) 22%,var(--light) 100%)}._container .luna-box-model{background:var(--background)}._container .luna-box-model-border,._container .luna-box-model-content,._container .luna-box-model-margin,._container .luna-box-model-padding,._container .luna-box-model-position{color:var(--foreground);background:var(--background)}._container{min-width:320px;pointer-events:none;position:fixed;left:0;top:0;width:100%;height:100%;z-index:9999999;color:var(--foreground);font-family:-apple-system,system-ui,BlinkMacSystemFont,".SFNSDisplay-Regular","Helvetica Neue","Lucida Grande","Segoe UI",Tahoma,sans-serif;font-size:14px;direction:ltr}._container._dark{color-scheme:dark}._container *{box-sizing:border-box;pointer-events:all;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:none}._container ul{list-style:none;padding:0;margin:0}._container h1,._container h2,._container h3,._container h4{margin:0}._container h2{font-size:14px}._container h2 [class*=" _icon-"],._container h2 [class^=icon-]{font-weight:400}._container._inline{position:static}._hidden{display:none}._icon-disabled{opacity:.5;pointer-events:none;cursor:default!important}._icon-disabled:active{color:inherit!important}._tag-name-color{color:var(--tag-name-color)}._function-color{color:var(--function-color)}._attribute-name-color{color:var(--attribute-name-color)}._operator-color{color:var(--operator-color)}._string-color{color:var(--string-color)}',""]),e.exports=t},8734:function(e,t,n){var o=n(2717),r=n(1738),i=n(6026),a=n(8),s=n(928),c=n(9848);t=o({initialize:function(e){r(e)&&(e=t.parse(e)),this.model=e.model,this.val=e.val},toRgb:function(){var e=this.val;"hsl"===this.model&&(e=s(e));var t="rgba";return 1===e[3]&&(t="rgb",e=e.slice(0,3)),t+"("+e.join(", ")+")"},toHex:function(){var e=this.val;"hsl"===this.model&&(e=s(e));var t=c.encode(e.slice(0,3));return t[0]===t[1]&&t[2]===t[3]&&t[4]===t[5]&&(t=t[0]+t[2]+t[5]),"#"+t},toHsl:function(){var e=this.val;"rgb"===this.model&&(e=a(e));var t="hsla";return 1===e[3]&&(t="hsl",e=e.slice(0,3)),e[1]=e[1]+"%",e[2]=e[2]+"%",t+"("+e.join(", ")+")"}},{parse:function(e){var t,n,o=[0,0,0,1],r="rgb";if(n=e.match(l))for(n=n[1],t=0;t<3;t++)o[t]=parseInt(n[t]+n[t],16);else if(n=e.match(u))for(n=n[1],t=0;t<3;t++){var a=2*t;o[t]=parseInt(n.slice(a,a+2),16)}else if(n=e.match(d)){for(t=0;t<3;t++)o[t]=parseInt(n[t+1],0);n[4]&&(o[3]=parseFloat(n[4]))}else if(n=e.match(h)){for(t=0;t<3;t++)o[t]=Math.round(2.55*parseFloat(n[t+1]));n[4]&&(o[3]=parseFloat(n[4]))}else(n=e.match(f))&&(r="hsl",o=[(parseFloat(n[1])%360+360)%360,i(parseFloat(n[2]),0,100),i(parseFloat(n[3]),0,100),i(parseFloat(n[4]),0,1)]);return{val:o,model:r}}});var l=/^#([a-fA-F0-9]{3})$/,u=/^#([a-fA-F0-9]{6})$/,d=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/,h=/^rgba?\(\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/,f=/^hsla?\(\s*([+-]?\d*[.]?\d+)(?:deg)?\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;e.exports=t},8757:function(e,t,n){"use strict";var o,r=this&&this.__extends||(o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var a=i(n(2263)),s=i(n(9100)),c=function(e){function t(){var t=e.call(this)||this;return t.observer=new MutationObserver((function(e){(0,s.default)(e,(function(e){return t.handleMutation(e)}))})),t}return r(t,e),t.prototype.observe=function(e){this.observer.observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0})},t.prototype.disconnect=function(){this.observer.disconnect()},t.prototype.handleMutation=function(e){"attributes"===e.type?this.emit("attributes",e.target,e.attributeName):"childList"===e.type?this.emit("childList",e.target,e.addedNodes,e.removedNodes):"characterData"===e.type&&this.emit("characterData",e.target)},t}(a.default);t.default=new c},8785:function(e,t){t=function(){for(var e=arguments,t=e[0],n=1,o=e.length;n0&&(n+="["+o+"]"),new i(n,e.nodeType===Node.DOCUMENT_NODE)}t=function(e,t){return o(e)?function(e){for(var t=[],n=document.evaluate(e,document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),o=0;o1&&void 0!==arguments[1]&&arguments[1];if(e.nodeType===Node.DOCUMENT_NODE)return"/";var n=[],o=e;for(;o;){var i=r(o,t);if(!i)break;if(n.push(i),i.optimized)break;o=o.parentNode}return n.reverse(),(n.length&&n[0].optimized?"":"/")+n.join("/")}(e,t)};var i=n(2717)({initialize:function(e,t){this.value=e,this.optimized=t||!1},toString:function(){return this.value}});e.exports=t},8966:function(e,t,n){var o=n(2717),r=n(3249);function i(){return!0}function a(){return!1}function s(e){var n,o=this.events[e.type],r=c.call(this,e,o);e=new t.Event(e);for(var i,a,s=0;(a=r[s++])&&!e.isPropagationStopped();)for(e.curTarget=a.el,i=0;(n=a.handlers[i++])&&!e.isImmediatePropagationStopped();)!1===n.handler.apply(a.el,[e])&&(e.preventDefault(),e.stopPropagation())}function c(e,t){var n,o,i,a,s=e.target,c=[],l=t.delegateCount;if(s.nodeType)for(;s!==this;s=s.parentNode||this){for(o=[],a=0;a=i[a[l]]){c=a[l];break}return+(n/i[c]).toFixed(2)+c};var i={ms:1,s:1e3};i.m=60*i.s,i.h=60*i.m,i.d=24*i.h,i.y=365.25*i.d;var a=["y","d","h","m","s"],s=/^((?:\d+)?\.?\d+) *(s|m|h|d|y)?$/;e.exports=t},9122:function(e,t,n){var o=n(9760),r=n(3957),i=n(1168);t=function(e){return!!o(e)&&(r(e)?s.test(i(e)):c.test(i(e)))};var a=Object.prototype.hasOwnProperty,s=new RegExp("^"+i(a).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),c=/^\[object .+?Constructor\]$/;e.exports=t},9186:function(e,t,n){var o=n(769),r=n(9760),i=n(1738),a=n(9100),s=n(8971),c=n(3612);(t=function(e,t,n){if(e=c(e),s(n)&&i(t))return function(e,t){return e.getAttribute(t)}(e[0],t);var o=t;r(o)||((o={})[t]=n),function(e,t){a(e,(function(e){a(t,(function(t,n){e.setAttribute(n,t)}))}))}(e,o)}).remove=function(e,t){e=c(e),t=o(t),a(e,(function(e){a(t,(function(t){e.removeAttribute(t)}))}))},e.exports=t},9196:function(e,t,n){"use strict";var o,r=this&&this.__extends||(o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__assign||function(){return i=Object.assign||function(e){for(var t,n=1,o=arguments.length;n=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var c=s(n(7214)),l=n(926),u=n(4725),d=s(n(4095)),h=s(n(5865)),f=s(n(96)),p=s(n(9100)),v=s(n(8734)),g=s(n(9848)),m=s(n(3805)),b=s(n(8105)),y=s(n(387)),A=s(n(3249)),w=s(n(6030)),_=s(n(3019)),x=s(n(1738));n(3270);var k=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this,t,{compName:"dom-highlighter"},n)||this;return o.overlay=new l.HighlightOverlay(window),o.reset=function(){var e=document.documentElement.clientWidth,t=document.documentElement.clientHeight;o.overlay.reset({viewportSize:{width:e,height:t},deviceScaleFactor:1,pageScaleFactor:1,pageZoomFactor:1,emulationScaleFactor:1,scrollX:window.scrollX,scrollY:window.scrollY})},o.initOptions(n,{showRulers:!1,showExtensionLines:!1,showInfo:!0,showStyles:!0,showAccessibilityInfo:!0,colorFormat:"hex",contentColor:"rgba(111, 168, 220, .66)",paddingColor:"rgba(147, 196, 125, .55)",borderColor:"rgba(255, 229, 153, .66)",marginColor:"rgba(246, 178, 107, .66)",monitorResize:!0}),o.overlay.setContainer(t),o.overlay.setPlatform("mac"),o.redraw=(0,h.default)((function(){o.reset(),o.draw()}),16),o.redraw(),o.bindEvent(),o}return r(t,e),t.prototype.highlight=function(e,t){t&&(0,b.default)(this.options,t),this.target=e,e instanceof HTMLElement&&this.options.monitorResize&&(this.resizeSensor&&this.resizeSensor.destroy(),this.resizeSensor=new d.default(e),this.resizeSensor.addListener(this.redraw)),this.redraw()},t.prototype.hide=function(){this.target=null,this.redraw()},t.prototype.intercept=function(e){this.interceptor=e},t.prototype.destroy=function(){window.removeEventListener("resize",this.redraw),window.removeEventListener("scroll",this.redraw),this.resizeSensor&&this.resizeSensor.destroy(),e.prototype.destroy.call(this)},t.prototype.draw=function(){var e=this.target;e&&(e instanceof Text?this.drawText(e):this.drawElement(e))},t.prototype.drawText=function(e){var t=this.options,n=document.createRange();n.selectNode(e);var o=n.getBoundingClientRect(),r=o.left,i=o.top,a=o.width,s=o.height;n.detach();var c={paths:[{path:this.rectToPath({left:r,top:i,width:a,height:s}),fillColor:E(t.contentColor),name:"content"}],showExtensionLines:t.showExtensionLines,showRulers:t.showRulers};t.showInfo&&(c.elementInfo={tagName:"#text",nodeWidth:a,nodeHeight:s}),this.overlay.drawHighlight(c)},t.prototype.drawElement=function(e){var t={paths:this.getPaths(e),showExtensionLines:this.options.showExtensionLines,showRulers:this.options.showRulers,colorFormat:this.options.colorFormat};if(this.options.showInfo&&(t.elementInfo=this.getElementInfo(e)),this.interceptor){var n=this.interceptor(t);n&&(t=n)}this.overlay.drawHighlight(t)},t.prototype.getPaths=function(e){var t=this.options,n=window.getComputedStyle(e),o=e.getBoundingClientRect(),r=o.left,i=o.top,a=o.width,s=o.height,c=function(e){return(0,u.pxToNum)(n.getPropertyValue(e))},l=c("margin-left"),d=c("margin-right"),h=c("margin-top"),f=c("margin-bottom"),p=c("border-left-width"),v=c("border-right-width"),g=c("border-top-width"),m=c("border-bottom-width"),b=c("padding-left"),y=c("padding-right"),A=c("padding-top"),w=c("padding-bottom");return[{path:this.rectToPath({left:r+p+b,top:i+g+A,width:a-p-b-v-y,height:s-g-A-m-w}),fillColor:E(t.contentColor),name:"content"},{path:this.rectToPath({left:r+p,top:i+g,width:a-p-v,height:s-g-m}),fillColor:E(t.paddingColor),name:"padding"},{path:this.rectToPath({left:r,top:i,width:a,height:s}),fillColor:E(t.borderColor),name:"border"},{path:this.rectToPath({left:r-l,top:i-h,width:a+l+d,height:s+h+f}),fillColor:E(t.marginColor),name:"margin"}]},t.prototype.getElementInfo=function(e){var t=e.getBoundingClientRect(),n=t.width,o=t.height,r=e.getAttribute("class")||"";r=r.split(/\s+/).map((function(e){return"."+e})).join("");var i={tagName:(0,f.default)(e.tagName),className:r,idValue:e.id,nodeWidth:n,nodeHeight:o};return this.options.showStyles&&(i.style=this.getStyles(e)),this.options.showAccessibilityInfo&&(0,b.default)(i,this.getAccessibilityInfo(e)),i},t.prototype.getStyles=function(e){for(var t=window.getComputedStyle(e),n=!1,o=e.childNodes,r=0,i=o.length;r-1)},t.prototype.getAccessibleNameAndRole=function(e){var t=e.getAttribute("labelledby")||e.getAttribute("aria-label"),n=e.getAttribute("role"),o=(0,f.default)(e.tagName);return _.default.forEach((function(t){var r,i;if(!n){var s=t[0],c=t[2];if(s===o){if(c)try{for(var l=a(c),u=l.next();!u.done;u=l.next()){var d=u.value;if(e.getAttribute(d[0])!==d[1])return}}catch(e){r={error:e}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}n=t[1]}}})),{accessibleName:t||e.getAttribute("title")||"",accessibleRole:n||"generic"}},t.prototype.bindEvent=function(){var e=this;window.addEventListener("resize",this.redraw),window.addEventListener("scroll",this.redraw),this.on("optionChange",(function(){return e.redraw()}))},t.prototype.rectToPath=function(e){var t=e.left,n=e.top,o=e.width,r=e.height,i=[];return i.push("M",t,n),i.push("L",t+o,n),i.push("L",t+o,n+r),i.push("L",t,n+r),i.push("Z"),i},t}(c.default);t.default=k,e.exports=k,e.exports.default=k;var C=/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,S=/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/;function E(e){return(0,x.default)(e)?e:e.a?"rgba(".concat(e.r,", ").concat(e.g,", ").concat(e.b,", ").concat(e.a,")"):"rgb(".concat(e.r,", ").concat(e.g,", ").concat(e.b,")")}function T(e,t,n){void 0===n&&(n=!1);var o={};return(0,p.default)(t,(function(t){var r,i=e["text-opacity"===t?"color":t];i&&(r=i,(C.test(r)||S.test(r))&&(i=function(e){var t=v.default.parse(e),n=t.val[3]||1;return t.val=t.val.slice(0,3),t.val.push(Math.round(255*n)),"#"+(0,m.default)(g.default.encode(t.val))}(i),"text-opacity"===t&&(i=i.slice(7),i=g.default.decode(i)[0]/255)),n&&(t=(0,y.default)(t)),o[t]=i)})),o}},9350:function(e,t){t=function(e){return"symbol"==typeof e},e.exports=t},9389:function(e,t,n){var o=n(5902),r=n(3145);t=function(e){return s.test(e)?e.replace(c,l):e};var i=n(5282)(o.map),a="(?:"+r(i).join("|")+")",s=new RegExp(a),c=new RegExp(a,"g");function l(e){return i[e]}e.exports=t},9405:function(e,t,n){var o=n(5333),r=n(9651);t=function(e,t){return null==t&&e.trim?e.trim():o(r(e,t),t)},e.exports=t},9410:function(e,t,n){var o=n(9993);t=function(e,t){t=t||o;var n=new Image;n.onload=function(){t(null,n)},n.onerror=function(e){t(e)},n.src=e},e.exports=t},9464:function(e,t,n){var o=n(5793),r=n(6214),i=n(1738),a=n(5132),s=n(3145);t=function(e){return null==e||(o(e)&&(r(e)||i(e)||a(e))?0===e.length:0===s(e).length)},e.exports=t},9548:function(e,t,n){var o=n(383),r=n(7005),i=n(6214),a=n(9100),s=n(1738),c=n(5154);var l=function(e){return e.replace(/"/g,'"')},u=function(e){return e.replace(/"/g,""")};t={parse:function(e){var t=[],n=new r;return o(e,{start:function(e,t){t=c(t,(function(e){return l(e)})),n.push({tag:e,attrs:t})},end:function(){var e=n.pop();if(n.size){var o=n.peek();i(o.content)||(o.content=[]),o.content.push(e)}else t.push(e)},comment:function(e){var o="\x3c!--".concat(e,"--\x3e"),r=n.peek();r?(r.content||(r.content=[]),r.content.push(o)):t.push(o)},text:function(e){var o=n.peek();o?(o.content||(o.content=[]),o.content.push(e)):t.push(e)}}),t},stringify:function e(t){var n="";return i(t)?a(t,(function(t){return n+=e(t)})):s(t)?n=t:(n+="<".concat(t.tag),a(t.attrs,(function(e,t){return n+=" ".concat(t,'="').concat(u(e),'"')})),n+=">",t.content&&(n+=e(t.content)),n+="")),n}},e.exports=t},9651:function(e,t){t=function(e,t){if(null==t){if(e.trimRight)return e.trimRight();t=" \r\n\t\f\v"}for(var n,o,r=e.length-1,i=t.length,a=!0;a&&r>=0;)for(a=!1,n=-1,o=e.charAt(r);++n=0?e.substring(0,r+1):""},e.exports=t},9756:function(e,t){t=function(e){for(var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.defComparator,o=0,r=e.length;o0)return!1;return!0},t.defComparator=function(e,t){return et?1:0},e.exports=t},9760:function(e,t){t=function(e){var t=typeof e;return!!e&&("function"===t||"object"===t)},e.exports=t},9848:function(e,t,n){var o=n(6024);t={encode:function(e){for(var t=[],n=0,o=e.length;n>>4).toString(16)),t.push((15&r).toString(16))}return t.join("")},decode:function(e){var t=[],n=e.length;o(n)&&n--;for(var r=0;r0||u)&&(i.children=g(e,o)),i}function g(e,t){var n=m(e.childNodes);return(0,r.default)(n,(function(e){return v(e,{depth:t-1})}))}function m(e){return i.default(e,(function(e){return b(e)}))}function b(e){if(1===e.nodeType){var t=e.getAttribute("class")||"";if((0,c.default)(t,"__chobitsu-hide__")||(0,c.default)(t,"html2canvas-container"))return!1}var n=!(3===e.nodeType&&""===(0,s.default)(e.nodeValue||""));return n&&e.parentNode?b(e.parentNode):n}},9907:function(e,t,n){(t=n(6314)(!1)).push([e.id,"@font-face{font-family:luna-object-viewer-icon;src:url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAS8AAsAAAAAB7QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAGEAAACMISgl+k9TLzIAAAFsAAAAPQAAAFZLxUkWY21hcAAAAawAAADWAAACdBU42qdnbHlmAAAChAAAAC4AAAAwabU7V2hlYWQAAAK0AAAALwAAADZzjr4faGhlYQAAAuQAAAAYAAAAJAFyANlobXR4AAAC/AAAABAAAABAAZAAAGxvY2EAAAMMAAAAEAAAACIAtACobWF4cAAAAxwAAAAfAAAAIAEbAA9uYW1lAAADPAAAASkAAAIWm5e+CnBvc3QAAARoAAAAUwAAAHZW8MNZeJxNjTsOQFAQRc/z/+sV1mABohKV0gZeJRJR2X9cT4RJZu7nFIMBMjoGvHGaF6rdngcNAc/c/O/Nvq2W5E1igdNE2zv1iGh1c5FQPlYXUlJRyxt9+/pUKadQa/AveGEGZQAAAHicY2BkkGScwMDKwMBQx9ADJGWgdAIDJ4MxAwMTAyszA1YQkOaawnCAQfcjE8MJIFcITDIwMIIIAFqDCGkAAAB4nM2STQ4BQRCFv54ZP8MwFhYW4gQcShBsSERi50BWDuFCcwJedddKRGKnOt8k9aanqudVAy0gF3NRQLgTsLhJDVHP6UW94Kp8zEhKwYIlG/YcOXHm0mTPp96aumLLwdUQ1fcIqmJrwpSZL+iqak5JmyE1Ayr1bdGhr/2ZPmp/qPQtuj/uJzqQl+pfDyypesQD6AT/ElV8PjyrMccT9rdLR3PUFBI227VTio1jbm6dodg5VnPvmAsHxzofHfmi+Sbs/pwdWcXFkWdNSNg9arIE2QufuSCyAAB4nGNgZACBlQzTGZgYGMyVxVc2O073AIpAxHsYloHFRc2dPZY2OTIwAACmEQesAAB4nGNgZGBgAOINe2b6x/PbfGXgZjgBFIjifLyvAUEDwUqGZUCSg4EJxAEAUn4LLAB4nGNgZGBgOMHAACdXMjAyoAIBADizAkx4nGNgAIITUEwGAABZUAGReJxjYAACHgYJ3BAAE94BXXicY2BkYGAQYGBmANEMDExAzAWEDAz/wXwGAApcASsAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxdxjkOgCAUANE/uOOGB+FQBIjaaEJIuL6FsfE1M6Lk9fXPoKioaWjp6BnQjEzMLKwYNtHepZhtuMs1vpvO/ch4HIlIxhK4KVyc7BwiD8nvDlkA') format('woff')}[class*=' luna-object-viewer-icon-'],[class^=luna-object-viewer-icon-]{display:inline-block;font-family:luna-object-viewer-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.luna-object-viewer-icon-caret-down:before{content:'\\f101'}.luna-object-viewer-icon-caret-right:before{content:'\\f102'}.luna-object-viewer{overflow-x:auto;-webkit-overflow-scrolling:touch;overflow-y:hidden;cursor:default;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;line-height:1.2;min-height:100%;color:#333;list-style:none!important}.luna-object-viewer ul{list-style:none!important;padding:0!important;padding-left:12px!important;margin:0!important}.luna-object-viewer li{position:relative;white-space:nowrap;line-height:16px;min-height:16px}.luna-object-viewer>li>.luna-object-viewer-key{display:none}.luna-object-viewer span{position:static!important}.luna-object-viewer li .luna-object-viewer-collapsed~.luna-object-viewer-close:before{color:#999}.luna-object-viewer-array .luna-object-viewer-object .luna-object-viewer-key{display:inline}.luna-object-viewer-null{color:#5e5e5e}.luna-object-viewer-regexp,.luna-object-viewer-string{color:#c41a16}.luna-object-viewer-number{color:#1c00cf}.luna-object-viewer-boolean{color:#0d22aa}.luna-object-viewer-special{color:#5e5e5e}.luna-object-viewer-key,.luna-object-viewer-key-lighter{color:#881391}.luna-object-viewer-key-lighter{opacity:.6}.luna-object-viewer-key-special{color:#5e5e5e}.luna-object-viewer-collapsed .luna-object-viewer-icon,.luna-object-viewer-expanded .luna-object-viewer-icon{position:absolute!important;left:-12px;color:#727272;font-size:12px}.luna-object-viewer-icon-caret-right{top:0}.luna-object-viewer-icon-caret-down{top:1px}.luna-object-viewer-expanded>.luna-object-viewer-icon-caret-down{display:inline}.luna-object-viewer-expanded>.luna-object-viewer-icon-caret-right{display:none}.luna-object-viewer-collapsed>.luna-object-viewer-icon-caret-down{display:none}.luna-object-viewer-collapsed>.luna-object-viewer-icon-caret-right{display:inline}.luna-object-viewer-hidden~ul{display:none}.luna-object-viewer-theme-dark{color:#fff}.luna-object-viewer-theme-dark .luna-object-viewer-null,.luna-object-viewer-theme-dark .luna-object-viewer-special{color:#a1a1a1}.luna-object-viewer-theme-dark .luna-object-viewer-regexp,.luna-object-viewer-theme-dark .luna-object-viewer-string{color:#f28b54}.luna-object-viewer-theme-dark .luna-object-viewer-boolean,.luna-object-viewer-theme-dark .luna-object-viewer-number{color:#9980ff}.luna-object-viewer-theme-dark .luna-object-viewer-key,.luna-object-viewer-theme-dark .luna-object-viewer-key-lighter{color:#5db0d7}",""]),e.exports=t},9931:function(e,t){t=function(e){return e.length<1?e:e[0].toUpperCase()+e.slice(1)},e.exports=t},9993:function(e,t){t=function(){},e.exports=t}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=function(e,t){for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},__webpack_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(2980);return __webpack_exports__}()})); +//# sourceMappingURL=eruda.js.map \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/cpp/CMakeLists.txt b/KernelSU-Next/manager/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 000000000000..fc344b5c787c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,23 @@ + +# For more information about using CMake with Android Studio, read the +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Sets the minimum version of CMake required to build the native library. +cmake_minimum_required(VERSION 3.18.1) + +project("kernelsu") + +find_package(cxx REQUIRED CONFIG) +link_libraries(cxx::cxx) + +add_library(kernelsu + SHARED + jni.cc + ksu.cc + ) + +target_include_directories(kernelsu PRIVATE .) + +find_library(log-lib log) + +target_link_libraries(kernelsu ${log-lib}) diff --git a/KernelSU-Next/manager/app/src/main/cpp/jni.cc b/KernelSU-Next/manager/app/src/main/cpp/jni.cc new file mode 100644 index 000000000000..e22908fe69d8 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/cpp/jni.cc @@ -0,0 +1,391 @@ +#include + +#include +#include +#include + +#include +#include + +#include "ksu.h" + +#define LOG_TAG "KernelSU-Next" +#ifdef NDEBUG +#define LOGD(...) (void)0 +#else +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#endif + +extern "C" +JNIEXPORT jint JNICALL +Java_com_rifsxd_ksunext_Natives_getVersion(JNIEnv *env, jobject) { + int version = get_version(); + if (version > 0) { + return version; + } + // try legacy method as fallback + return legacy_get_info().first; +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_rifsxd_ksunext_Natives_getManagerAppid(JNIEnv *env, jobject) { + uid_t appid = get_manager_appid(); + return (jint)appid; +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_com_rifsxd_ksunext_Natives_getHookMode(JNIEnv *env, jobject) { + const char* mode = get_hook_mode(); + return env->NewStringUTF(mode); +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_com_rifsxd_ksunext_Natives_getVersionTag(JNIEnv *env, jobject) { + const char* tag = get_version_tag(); + return env->NewStringUTF(tag); +} + +// deprecated +// extern "C" +// JNIEXPORT jintArray JNICALL +// Java_com_rifsxd_ksunext_Natives_getAllowList(JNIEnv *env, jobject) { +// struct ksu_get_allow_list_cmd cmd = {}; +// bool result = get_allow_list(&cmd); +// if (result) { +// auto array = env->NewIntArray(cmd.count); +// env->SetIntArrayRegion(array, 0, cmd.count, reinterpret_cast(cmd.uids)); +// return array; +// } +// return env->NewIntArray(0); +// } + +extern "C" +JNIEXPORT jint JNICALL +Java_com_rifsxd_ksunext_Natives_getSuperuserCount(JNIEnv *env, jobject) { + struct ksu_new_get_allow_list_cmd cmd = { + .count = 0 + }; + bool result = get_allow_list(&cmd); + return result ? cmd.total_count : 0; +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isSafeMode(JNIEnv *env, jclass clazz) { + return is_safe_mode(); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isLkmMode(JNIEnv *env, jclass clazz) { + return is_lkm_mode(); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isLateLoadMode(JNIEnv *env, jclass clazz) { + return is_late_load_mode(); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isManager(JNIEnv *env, jclass clazz) { + return is_manager(); +} + +static void fillIntArray(JNIEnv *env, jobject list, int *data, int count) { + auto cls = env->GetObjectClass(list); + auto add = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z"); + auto integerCls = env->FindClass("java/lang/Integer"); + auto constructor = env->GetMethodID(integerCls, "", "(I)V"); + for (int i = 0; i < count; ++i) { + auto integer = env->NewObject(integerCls, constructor, data[i]); + env->CallBooleanMethod(list, add, integer); + } +} + +static void addIntToList(JNIEnv *env, jobject list, int ele) { + auto cls = env->GetObjectClass(list); + auto add = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z"); + auto integerCls = env->FindClass("java/lang/Integer"); + auto constructor = env->GetMethodID(integerCls, "", "(I)V"); + auto integer = env->NewObject(integerCls, constructor, ele); + env->CallBooleanMethod(list, add, integer); +} + +static uint64_t capListToBits(JNIEnv *env, jobject list) { + auto cls = env->GetObjectClass(list); + auto get = env->GetMethodID(cls, "get", "(I)Ljava/lang/Object;"); + auto size = env->GetMethodID(cls, "size", "()I"); + auto listSize = env->CallIntMethod(list, size); + auto integerCls = env->FindClass("java/lang/Integer"); + auto intValue = env->GetMethodID(integerCls, "intValue", "()I"); + uint64_t result = 0; + for (int i = 0; i < listSize; ++i) { + auto integer = env->CallObjectMethod(list, get, i); + int data = env->CallIntMethod(integer, intValue); + + if (cap_valid(data)) { + result |= (1ULL << data); + } + } + + return result; +} + +static int getListSize(JNIEnv *env, jobject list) { + auto cls = env->GetObjectClass(list); + auto size = env->GetMethodID(cls, "size", "()I"); + return env->CallIntMethod(list, size); +} + +static void fillArrayWithList(JNIEnv *env, jobject list, int *data, int count) { + auto cls = env->GetObjectClass(list); + auto get = env->GetMethodID(cls, "get", "(I)Ljava/lang/Object;"); + auto integerCls = env->FindClass("java/lang/Integer"); + auto intValue = env->GetMethodID(integerCls, "intValue", "()I"); + for (int i = 0; i < count; ++i) { + auto integer = env->CallObjectMethod(list, get, i); + data[i] = env->CallIntMethod(integer, intValue); + } +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_rifsxd_ksunext_Natives_getAppProfile(JNIEnv *env, jobject, jstring pkg, jint uid) { + if (env->GetStringLength(pkg) > KSU_MAX_PACKAGE_NAME) { + return nullptr; + } + + p_key_t key = {}; + auto cpkg = env->GetStringUTFChars(pkg, nullptr); + strcpy(key, cpkg); + env->ReleaseStringUTFChars(pkg, cpkg); + + app_profile profile = {}; + profile.version = KSU_APP_PROFILE_VER; + + strcpy(profile.key, key); + profile.curr_uid = uid; + + bool useDefaultProfile = get_app_profile(&profile) != 0; + + auto cls = env->FindClass("com/rifsxd/ksunext/Natives$Profile"); + auto constructor = env->GetMethodID(cls, "", "()V"); + auto obj = env->NewObject(cls, constructor); + auto keyField = env->GetFieldID(cls, "name", "Ljava/lang/String;"); + auto currentUidField = env->GetFieldID(cls, "currentUid", "I"); + auto allowSuField = env->GetFieldID(cls, "allowSu", "Z"); + + auto rootUseDefaultField = env->GetFieldID(cls, "rootUseDefault", "Z"); + auto rootTemplateField = env->GetFieldID(cls, "rootTemplate", "Ljava/lang/String;"); + + auto uidField = env->GetFieldID(cls, "uid", "I"); + auto gidField = env->GetFieldID(cls, "gid", "I"); + auto groupsField = env->GetFieldID(cls, "groups", "Ljava/util/List;"); + auto capabilitiesField = env->GetFieldID(cls, "capabilities", "Ljava/util/List;"); + auto domainField = env->GetFieldID(cls, "context", "Ljava/lang/String;"); + auto namespacesField = env->GetFieldID(cls, "namespace", "I"); + + auto nonRootUseDefaultField = env->GetFieldID(cls, "nonRootUseDefault", "Z"); + auto umountModulesField = env->GetFieldID(cls, "umountModules", "Z"); + + env->SetObjectField(obj, keyField, env->NewStringUTF(profile.key)); + env->SetIntField(obj, currentUidField, profile.curr_uid); + + if (useDefaultProfile) { + // no profile found, so just use default profile: + // don't allow root and use default profile! + LOGD("use default profile for: %s, %d", key, uid); + + // allow_su = false + // non root use default = true + env->SetBooleanField(obj, allowSuField, false); + env->SetBooleanField(obj, nonRootUseDefaultField, true); + + return obj; + } + + auto allowSu = profile.allow_su; + + if (allowSu) { + env->SetBooleanField(obj, rootUseDefaultField, (jboolean) profile.rp_config.use_default); + if (strlen(profile.rp_config.template_name) > 0) { + env->SetObjectField(obj, rootTemplateField, + env->NewStringUTF(profile.rp_config.template_name)); + } + + env->SetIntField(obj, uidField, profile.rp_config.profile.uid); + env->SetIntField(obj, gidField, profile.rp_config.profile.gid); + + jobject groupList = env->GetObjectField(obj, groupsField); + int groupCount = profile.rp_config.profile.groups_count; + if (groupCount > KSU_MAX_GROUPS) { + LOGD("kernel group count too large: %d???", groupCount); + groupCount = KSU_MAX_GROUPS; + } + fillIntArray(env, groupList, profile.rp_config.profile.groups, groupCount); + + jobject capList = env->GetObjectField(obj, capabilitiesField); + for (int i = 0; i <= CAP_LAST_CAP; i++) { + if (profile.rp_config.profile.capabilities.effective & (1ULL << i)) { + addIntToList(env, capList, i); + } + } + + env->SetObjectField(obj, domainField, + env->NewStringUTF(profile.rp_config.profile.selinux_domain)); + env->SetIntField(obj, namespacesField, profile.rp_config.profile.namespaces); + env->SetBooleanField(obj, allowSuField, profile.allow_su); + } else { + env->SetBooleanField(obj, nonRootUseDefaultField, + (jboolean) profile.nrp_config.use_default); + env->SetBooleanField(obj, umountModulesField, profile.nrp_config.profile.umount_modules); + } + + return obj; +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_setAppProfile(JNIEnv *env, jobject clazz, jobject profile) { + auto cls = env->FindClass("com/rifsxd/ksunext/Natives$Profile"); + + auto keyField = env->GetFieldID(cls, "name", "Ljava/lang/String;"); + auto currentUidField = env->GetFieldID(cls, "currentUid", "I"); + auto allowSuField = env->GetFieldID(cls, "allowSu", "Z"); + + auto rootUseDefaultField = env->GetFieldID(cls, "rootUseDefault", "Z"); + auto rootTemplateField = env->GetFieldID(cls, "rootTemplate", "Ljava/lang/String;"); + + auto uidField = env->GetFieldID(cls, "uid", "I"); + auto gidField = env->GetFieldID(cls, "gid", "I"); + auto groupsField = env->GetFieldID(cls, "groups", "Ljava/util/List;"); + auto capabilitiesField = env->GetFieldID(cls, "capabilities", "Ljava/util/List;"); + auto domainField = env->GetFieldID(cls, "context", "Ljava/lang/String;"); + auto namespacesField = env->GetFieldID(cls, "namespace", "I"); + + auto nonRootUseDefaultField = env->GetFieldID(cls, "nonRootUseDefault", "Z"); + auto umountModulesField = env->GetFieldID(cls, "umountModules", "Z"); + + auto key = env->GetObjectField(profile, keyField); + if (!key) { + return false; + } + if (env->GetStringLength((jstring) key) > KSU_MAX_PACKAGE_NAME) { + return false; + } + + auto cpkg = env->GetStringUTFChars((jstring) key, nullptr); + p_key_t p_key = {}; + strcpy(p_key, cpkg); + env->ReleaseStringUTFChars((jstring) key, cpkg); + + auto currentUid = env->GetIntField(profile, currentUidField); + + auto uid = env->GetIntField(profile, uidField); + auto gid = env->GetIntField(profile, gidField); + auto groups = env->GetObjectField(profile, groupsField); + auto capabilities = env->GetObjectField(profile, capabilitiesField); + auto domain = env->GetObjectField(profile, domainField); + auto allowSu = env->GetBooleanField(profile, allowSuField); + auto umountModules = env->GetBooleanField(profile, umountModulesField); + + app_profile p = {}; + p.version = KSU_APP_PROFILE_VER; + + strcpy(p.key, p_key); + p.allow_su = allowSu; + p.curr_uid = currentUid; + + if (allowSu) { + p.rp_config.use_default = env->GetBooleanField(profile, rootUseDefaultField); + auto templateName = env->GetObjectField(profile, rootTemplateField); + if (templateName) { + auto ctemplateName = env->GetStringUTFChars((jstring) templateName, nullptr); + strcpy(p.rp_config.template_name, ctemplateName); + env->ReleaseStringUTFChars((jstring) templateName, ctemplateName); + } + + p.rp_config.profile.uid = uid; + p.rp_config.profile.gid = gid; + + int groups_count = getListSize(env, groups); + if (groups_count > KSU_MAX_GROUPS) { + LOGD("groups count too large: %d", groups_count); + return false; + } + p.rp_config.profile.groups_count = groups_count; + fillArrayWithList(env, groups, p.rp_config.profile.groups, groups_count); + + p.rp_config.profile.capabilities.effective = capListToBits(env, capabilities); + + auto cdomain = env->GetStringUTFChars((jstring) domain, nullptr); + strcpy(p.rp_config.profile.selinux_domain, cdomain); + env->ReleaseStringUTFChars((jstring) domain, cdomain); + + p.rp_config.profile.namespaces = env->GetIntField(profile, namespacesField); + } else { + p.nrp_config.use_default = env->GetBooleanField(profile, nonRootUseDefaultField); + p.nrp_config.profile.umount_modules = umountModules; + } + + return set_app_profile(&p); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_uidShouldUmount(JNIEnv *env, jobject thiz, jint uid) { + return uid_should_umount(uid); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isSuEnabled(JNIEnv *env, jobject thiz) { + return is_su_enabled(); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_setSuEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { + return set_su_enabled(enabled); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isZygiskEnabled(JNIEnv *env, jobject) { + return is_zygisk_enabled(); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isKernelUmountEnabled(JNIEnv *env, jobject thiz) { + return is_kernel_umount_enabled(); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_setKernelUmountEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { + return set_kernel_umount_enabled(enabled); +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_isAvcSpoofEnabled(JNIEnv *env, jobject thiz) { + return is_avc_spoof_enabled(); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_rifsxd_ksunext_Natives_setAvcSpoofEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { + return set_avc_spoof_enabled(enabled); +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_com_rifsxd_ksunext_Natives_getUserName(JNIEnv *env, jobject thiz, jint uid) { + struct passwd *pw = getpwuid((uid_t) uid); + if (pw && pw->pw_name && pw->pw_name[0] != '\0') { + return env->NewStringUTF(pw->pw_name); + } + return nullptr; +} diff --git a/KernelSU-Next/manager/app/src/main/cpp/ksu.cc b/KernelSU-Next/manager/app/src/main/cpp/ksu.cc new file mode 100644 index 000000000000..23a4bb8720c4 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/cpp/ksu.cc @@ -0,0 +1,249 @@ +// +// Created by weishu on 2022/12/9. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "ksu.h" + +static int fd = -1; + +static inline int scan_driver_fd() { + const char *kName = "[ksu_driver]"; + DIR *dir = opendir("/proc/self/fd"); + if (!dir) { + return -1; + } + + int found = -1; + struct dirent *de; + char path[64]; + char target[PATH_MAX]; + + while ((de = readdir(dir)) != NULL) { + if (de->d_name[0] == '.') { + continue; + } + + char *endptr = NULL; + long fd_long = strtol(de->d_name, &endptr, 10); + if (!de->d_name[0] || *endptr != '\0' || fd_long < 0 || fd_long > INT_MAX) { + continue; + } + + snprintf(path, sizeof(path), "/proc/self/fd/%s", de->d_name); + ssize_t n = readlink(path, target, sizeof(target) - 1); + if (n < 0) { + continue; + } + target[n] = '\0'; + + const char *base = strrchr(target, '/'); + base = base ? base + 1 : target; + + if (strstr(base, kName)) { + found = (int)fd_long; + break; + } + } + + closedir(dir); + return found; +} + +template +static int ksuctl(unsigned long op, Args &&... args) { + + if (fd < 0) { + fd = scan_driver_fd(); + } + + static_assert(sizeof...(Args) <= 1, "ioctl expects at most one extra argument"); + + return ioctl(fd, op, std::forward(args)...); +} + +static struct ksu_get_info_cmd g_version {}; + +struct ksu_get_info_cmd get_info() { + if (!g_version.version) { + ksuctl(KSU_IOCTL_GET_INFO, &g_version); + } + return g_version; +} + +uint32_t get_version() { + auto info = get_info(); + return info.version; +} + +bool get_allow_list(struct ksu_new_get_allow_list_cmd *cmd) { + return ksuctl(KSU_IOCTL_NEW_GET_ALLOW_LIST, cmd) == 0; +} + +bool is_safe_mode() { + struct ksu_check_safemode_cmd cmd = {}; + ksuctl(KSU_IOCTL_CHECK_SAFEMODE, &cmd); + return cmd.in_safe_mode; +} + +bool is_lkm_mode() { + auto info = get_info(); + if (info.version > 0) { + return (info.flags & KSU_GET_INFO_FLAG_LKM) != 0; + } + return (legacy_get_info().second & KSU_GET_INFO_FLAG_LKM) != 0; +} + +bool is_late_load_mode() { + auto info = get_info(); + if (info.version > 0) { + return (info.flags & KSU_GET_INFO_FLAG_LATE_LOAD) != 0; + } + return false; +} + +bool is_manager() { + auto info = get_info(); + if (info.version > 0) { + return (info.flags & KSU_GET_INFO_FLAG_MANAGER) != 0; + } + return legacy_get_info().first > 0; +} + +bool uid_should_umount(int uid) { + struct ksu_uid_should_umount_cmd cmd = {}; + cmd.uid = uid; + ksuctl(KSU_IOCTL_UID_SHOULD_UMOUNT, &cmd); + return cmd.should_umount; +} + +bool set_app_profile(const app_profile *profile) { + struct ksu_set_app_profile_cmd cmd = {}; + cmd.profile = *profile; + return ksuctl(KSU_IOCTL_SET_APP_PROFILE, &cmd) == 0; +} + +int get_app_profile(app_profile *profile) { + struct ksu_get_app_profile_cmd cmd = {.profile = *profile}; + int ret = ksuctl(KSU_IOCTL_GET_APP_PROFILE, &cmd); + *profile = cmd.profile; + return ret; +} + +bool set_su_enabled(bool enabled) { + struct ksu_set_feature_cmd cmd = {}; + cmd.feature_id = KSU_FEATURE_SU_COMPAT; + cmd.value = enabled ? 1 : 0; + return ksuctl(KSU_IOCTL_SET_FEATURE, &cmd) == 0; +} + +bool is_su_enabled() { + struct ksu_get_feature_cmd cmd = {}; + cmd.feature_id = KSU_FEATURE_SU_COMPAT; + if (ksuctl(KSU_IOCTL_GET_FEATURE, &cmd) != 0) { + return false; + } + if (!cmd.supported) { + return false; + } + return cmd.value != 0; +} + +bool set_avc_spoof_enabled(bool enabled) { + struct ksu_set_feature_cmd cmd = {}; + cmd.feature_id = KSU_FEATURE_AVC_SPOOF; + cmd.value = enabled ? 1 : 0; + return ksuctl(KSU_IOCTL_SET_FEATURE, &cmd) == 0; +} + +bool is_avc_spoof_enabled() { + struct ksu_get_feature_cmd cmd = {}; + cmd.feature_id = KSU_FEATURE_AVC_SPOOF; + if (ksuctl(KSU_IOCTL_GET_FEATURE, &cmd) != 0) { + return false; + } + if (!cmd.supported) { + return false; + } + return cmd.value != 0; +} + +static inline bool get_feature(uint32_t feature_id, uint64_t *out_value, bool *out_supported) { + struct ksu_get_feature_cmd cmd = {}; + cmd.feature_id = feature_id; + if (ksuctl(KSU_IOCTL_GET_FEATURE, &cmd) != 0) { + return false; + } + if (out_value) *out_value = cmd.value; + if (out_supported) *out_supported = cmd.supported; + return true; +} + +static inline bool set_feature(uint32_t feature_id, uint64_t value) { + struct ksu_set_feature_cmd cmd = {}; + cmd.feature_id = feature_id; + cmd.value = value; + return ksuctl(KSU_IOCTL_SET_FEATURE, &cmd) == 0; +} + +bool set_kernel_umount_enabled(bool enabled) { + return set_feature(KSU_FEATURE_KERNEL_UMOUNT, enabled ? 1 : 0); +} + +bool is_kernel_umount_enabled() { + uint64_t value = 0; + bool supported = false; + if (!get_feature(KSU_FEATURE_KERNEL_UMOUNT, &value, &supported)) { + return false; + } + if (!supported) { + return false; + } + return value != 0; +} + +const char* get_hook_mode(void) +{ + static struct ksu_get_hook_mode_cmd cmd = {0}; + + if (ksuctl(KSU_IOCTL_GET_HOOK_MODE, &cmd) == 0) + return cmd.mode; + + return "Unknown"; +} + +uid_t get_manager_appid(void) +{ + static struct ksu_get_manager_appid_cmd cmd = {0}; + + if (ksuctl(KSU_IOCTL_GET_MANAGER_APPID, &cmd) == 0) + return cmd.appid; + + return 0; +} + +const char* get_version_tag(void) +{ + static struct ksu_get_version_tag_cmd cmd = {0}; + + if (ksuctl(KSU_IOCTL_GET_VERSION_TAG, &cmd) == 0) + return cmd.tag; + + return "Unknown"; +} + +bool is_zygisk_enabled() { + return !!getenv("ZYGISK_ENABLED"); +} diff --git a/KernelSU-Next/manager/app/src/main/cpp/ksu.h b/KernelSU-Next/manager/app/src/main/cpp/ksu.h new file mode 100644 index 000000000000..ad0430d875f1 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/cpp/ksu.h @@ -0,0 +1,69 @@ +// +// Created by weishu on 2022/12/9. +// + +#ifndef KERNELSU_KSU_H +#define KERNELSU_KSU_H + +#include +#include +#include +#include + +#include "uapi/supercall.h" +#include "uapi/app_profile.h" +#include "uapi/feature.h" +#include "uapi/selinux.h" + +uint32_t get_version(); + +bool uid_should_umount(int uid); + +bool is_safe_mode(); + +bool is_lkm_mode(); + +bool is_late_load_mode(); + +bool is_manager(); + +using p_key_t = char[KSU_MAX_PACKAGE_NAME]; + +bool set_app_profile(const app_profile *profile); + +int get_app_profile(app_profile *profile); + +const char* get_hook_mode(void); + +const char* get_version_tag(void); + +uid_t get_manager_appid(void); + +bool is_zygisk_enabled(); + +// Su compat +bool set_su_enabled(bool enabled); + +bool is_su_enabled(); + +// Kernel umount +bool set_kernel_umount_enabled(bool enabled); + +bool is_kernel_umount_enabled(); + +// Avc spoof +bool set_avc_spoof_enabled(bool enabled); + +bool is_avc_spoof_enabled(); + +bool get_allow_list(struct ksu_new_get_allow_list_cmd *); + +inline std::pair legacy_get_info() { + int32_t version = -1; + int32_t flags = 0; + int32_t result = 0; + prctl(0xDEADBEEF, 2, &version, &flags, &result); + return {version, flags}; +} + +#endif //KERNELSU_KSU_H diff --git a/KernelSU-Next/manager/app/src/main/cpp/uapi b/KernelSU-Next/manager/app/src/main/cpp/uapi new file mode 120000 index 000000000000..947e0bc509ed --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/cpp/uapi @@ -0,0 +1 @@ +../../../../../uapi \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KernelSUApplication.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KernelSUApplication.kt new file mode 100644 index 000000000000..6e1a317c21c0 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KernelSUApplication.kt @@ -0,0 +1,71 @@ +package com.rifsxd.ksunext + +import android.app.Application +import android.system.Os +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStore +import androidx.lifecycle.ViewModelStoreOwner +import coil.Coil +import coil.ImageLoader +import com.rifsxd.ksunext.ui.util.createRootShellBuilder +import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel +import com.topjohnwu.superuser.Shell +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import me.zhanghai.android.appiconloader.coil.AppIconFetcher +import me.zhanghai.android.appiconloader.coil.AppIconKeyer +import okhttp3.Cache +import okhttp3.OkHttpClient +import java.io.File +import java.util.* + +lateinit var ksuApp: KernelSUApplication + +class KernelSUApplication : Application(), ViewModelStoreOwner { + + lateinit var okhttpClient: OkHttpClient + private val appViewModelStore by lazy { ViewModelStore() } + + override fun onCreate() { + super.onCreate() + ksuApp = this + Shell.setDefaultBuilder(createRootShellBuilder(true)) + Shell.enableVerboseLogging = BuildConfig.DEBUG + + val context = this + val iconSize = resources.getDimensionPixelSize(android.R.dimen.app_icon_size) + Coil.setImageLoader( + ImageLoader.Builder(context) + .components { + add(AppIconKeyer()) + add(AppIconFetcher.Factory(iconSize, false, context)) + } + .build() + ) + + val webroot = File(dataDir, "webroot") + if (!webroot.exists()) { + webroot.mkdir() + } + + // Provide working env for rust's temp_dir() + Os.setenv("TMPDIR", cacheDir.absolutePath, true) + + okhttpClient = + OkHttpClient.Builder().cache(Cache(File(cacheDir, "okhttp"), 10 * 1024 * 1024)) + .addInterceptor { block -> + block.proceed( + block.request().newBuilder() + .header("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + .header("Accept-Language", Locale.getDefault().toLanguageTag()).build() + ) + }.build() + } + + override val viewModelStore: ViewModelStore + get() = appViewModelStore + + +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Kernels.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Kernels.kt new file mode 100644 index 000000000000..559ae2bbdbcb --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Kernels.kt @@ -0,0 +1,71 @@ +package com.rifsxd.ksunext + +import android.system.Os + +/** + * @author weishu + * @date 2022/12/10. + */ + +data class KernelVersion(val major: Int, val patchLevel: Int, val subLevel: Int) { + override fun toString(): String { + return "$major.$patchLevel.$subLevel" + } + + fun isGKI(): Boolean { + + // kernel 6.x + if (major > 5) { + return true + } + + // kernel 5.10.x + if (major == 5) { + return patchLevel >= 10 + } + + return false + } + + fun isULegacy(): Boolean { + return major == 3 + } + + fun isLegacy(): Boolean { + return major == 4 && patchLevel in 1..18 + } + + fun isGKI1(): Boolean { + return (major == 4 && patchLevel >= 19) || (major == 5 && patchLevel < 10) + } + +} + +fun KernelVersion.getKernelType(): String { + return when { + isGKI() -> "GKI2" + isULegacy() -> "U-LEGACY" + isLegacy() -> "LEGACY" + isGKI1() -> "GKI1" + else -> "UNKNOWN" + } +} + +fun KernelVersion.isKernel510(): Boolean { + return major == 5 && patchLevel == 10 +} + +fun parseKernelVersion(version: String): KernelVersion { + val find = "(\\d+)\\.(\\d+)\\.(\\d+)".toRegex().find(version) + return if (find != null) { + KernelVersion(find.groupValues[1].toInt(), find.groupValues[2].toInt(), find.groupValues[3].toInt()) + } else { + KernelVersion(-1, -1, -1) + } +} + +fun getKernelVersion(): KernelVersion { + Os.uname().release.let { + return parseKernelVersion(it) + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KsuService.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KsuService.kt new file mode 100644 index 000000000000..ffafeb0eb4d3 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/KsuService.kt @@ -0,0 +1,71 @@ +package com.rifsxd.ksunext.ui; + +import android.content.Intent +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import android.os.IBinder +import android.os.UserHandle +import android.os.UserManager +import android.util.Log +import com.topjohnwu.superuser.ipc.RootService +import com.rifsxd.ksunext.IKsuInterface +import rikka.parcelablelist.ParcelableListSlice + +/** + * @author weishu + * @date 2023/4/18. + */ + +class KsuService : RootService() { + + companion object { + private const val TAG = "KsuService" + } + + override fun onBind(intent: Intent): IBinder { + return Stub() + } + + private fun getUserIds(): List { + val result = ArrayList() + val um = getSystemService(USER_SERVICE) as UserManager + val userProfiles = um.userProfiles + for (userProfile: UserHandle in userProfiles) { + result.add(userProfile.hashCode()) + } + return result + } + + private fun getInstalledPackagesAll(flags: Int): ArrayList { + val packages = ArrayList() + for (userId in getUserIds()) { + Log.i(TAG, "getInstalledPackagesAll: $userId") + packages.addAll(getInstalledPackagesAsUser(flags, userId)) + } + return packages + } + + @Suppress("UNCHECKED_CAST") + private fun getInstalledPackagesAsUser(flags: Int, userId: Int): List { + return try { + val pm: PackageManager = packageManager + val method = pm.javaClass.getDeclaredMethod( + "getInstalledPackagesAsUser", + Int::class.javaPrimitiveType, + Int::class.javaPrimitiveType + ) + method.invoke(pm, flags, userId) as List + } catch (e: Throwable) { + Log.e(TAG, "err", e) + ArrayList() + } + } + + private inner class Stub : IKsuInterface.Stub() { + override fun getPackages(flags: Int): ParcelableListSlice { + val list = getInstalledPackagesAll(flags) + Log.i(TAG, "getPackages: ${list.size}") + return ParcelableListSlice(list) + } + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt new file mode 100644 index 000000000000..3b30f9992616 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/Natives.kt @@ -0,0 +1,187 @@ +package com.rifsxd.ksunext + +import android.os.Parcelable +import androidx.annotation.Keep +import androidx.compose.runtime.Immutable +import kotlinx.parcelize.Parcelize + +/** + * @author weishu + * @date 2022/12/8. + */ +object Natives { + // minimal supported kernel version + // 10915: allowlist breaking change, add app profile + // 10931: app profile struct add 'version' field + // 10946: add capabilities + // 10977: change groups_count and groups to avoid overflow write + // 11071: Fix the issue of failing to set a custom SELinux type. + // 12797: zygisk query and get manager uid. + // 32310: new get_allow_list ioctl + // 33070: SET_SEPOLICY ioctl + // 33075: add set_init_pgrp ioctl + // 33110: bump app profile version, migrate selinux domain + const val MINIMAL_SUPPORTED_KERNEL = 33110 + + const val KERNEL_SU_DOMAIN = "u:r:ksu:s0" + + const val ROOT_UID = 0 + const val ROOT_GID = 0 + + init { + System.loadLibrary("kernelsu") + } + + val version: Int + external get + + // deprecated + // get the uid list of allowed su processes. + val allowList: IntArray + external get + + val isSafeMode: Boolean + external get + + val isLkmMode: Boolean + external get + + val isLateLoadMode: Boolean + external get + + val isManager: Boolean + external get + + external fun uidShouldUmount(uid: Int): Boolean + + /** + * Get the UID of the current root manager. + * @return manager UID, or 0 if unavailable. + */ + external fun getManagerAppid(): Int + + /** + * Get a string indicating the SU hook mode enabled in kernel. + * The return values are: + * - "Manual": Manual hooks was enabled. + * - "Kprobes": Kprobes hooks was enabled (CONFIG_KSU_KPROBES_HOOK). + * + * @return return hook mode, or null if unavailable. + */ + external fun getHookMode(): String? + + /** + * Get the version tag from the kernel. + * @return version tag, or null if unavailable. + */ + external fun getVersionTag(): String? + + /** + * Check if Zygisk injection is enabled in the environment. + */ + external fun isZygiskEnabled(): Boolean + + /** + * Get the profile of the given package. + * @param key usually the package name + * @return return null if failed. + */ + external fun getAppProfile(key: String?, uid: Int): Profile + external fun setAppProfile(profile: Profile?): Boolean + + /** + * `su` compat mode can be disabled temporarily. + * 0: disabled + * 1: enabled + * negative : error + */ + external fun isSuEnabled(): Boolean + external fun setSuEnabled(enabled: Boolean): Boolean + + /** + * Kernel module umount can be disabled temporarily. + * 0: disabled + * 1: enabled + * negative : error + */ + external fun isKernelUmountEnabled(): Boolean + external fun setKernelUmountEnabled(enabled: Boolean): Boolean + + /** + * Get the user name for the uid. + */ + external fun getUserName(uid: Int): String? + + /** + * Avc spoof can be enabled/disabled. + * 0: disabled + * 1: enabled + * negative : error + */ + external fun isAvcSpoofEnabled(): Boolean + external fun setAvcSpoofEnabled(enabled: Boolean): Boolean + + external fun getSuperuserCount(): Int + + private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$" + private const val NOBODY_UID = 9999 + + fun setDefaultUmountModules(umountModules: Boolean): Boolean { + Profile( + NON_ROOT_DEFAULT_PROFILE_KEY, + NOBODY_UID, + false, + umountModules = umountModules + ).let { + return setAppProfile(it) + } + } + + fun isDefaultUmountModules(): Boolean { + getAppProfile(NON_ROOT_DEFAULT_PROFILE_KEY, NOBODY_UID).let { + return it.umountModules + } + } + + fun requireNewKernel(): Boolean { + return version != -1 && version < MINIMAL_SUPPORTED_KERNEL + } + + val KSU_WORK_DIR = "/data/adb/ksu/" + + @Immutable + @Parcelize + @Keep + data class Profile( + // and there is a default profile for root and non-root + val name: String, + // current uid for the package, this is convivent for kernel to check + // if the package name doesn't match uid, then it should be invalidated. + val currentUid: Int = 0, + + // if this is true, kernel will grant root permission to this package + val allowSu: Boolean = false, + + // these are used for root profile + val rootUseDefault: Boolean = true, + val rootTemplate: String? = null, + val uid: Int = ROOT_UID, + val gid: Int = ROOT_GID, + val groups: List = mutableListOf(), + val capabilities: List = mutableListOf(), + val context: String = KERNEL_SU_DOMAIN, + val namespace: Int = Namespace.INHERITED.ordinal, + + val nonRootUseDefault: Boolean = true, + val umountModules: Boolean = true, + var rules: String = "", // this field is save in ksud!! + ) : Parcelable { + enum class Namespace { + INHERITED, + GLOBAL, + INDIVIDUAL, + } + + constructor() : this("") + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Capabilities.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Capabilities.kt new file mode 100644 index 000000000000..9eb98a121aaa --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Capabilities.kt @@ -0,0 +1,49 @@ +package com.rifsxd.ksunext.profile + +/** + * @author weishu + * @date 2023/6/3. + */ +enum class Capabilities(val cap: Int, val display: String, val desc: String) { + CAP_CHOWN(0, "CHOWN", "Make arbitrary changes to file UIDs and GIDs (see chown(2))"), + CAP_DAC_OVERRIDE(1, "DAC_OVERRIDE", "Bypass file read, write, and execute permission checks"), + CAP_DAC_READ_SEARCH(2, "DAC_READ_SEARCH", "Bypass file read permission checks and directory read and execute permission checks"), + CAP_FOWNER(3, "FOWNER", "Bypass permission checks on operations that normally require the filesystem UID of the process to match the UID of the file (e.g., chmod(2), utime(2)), excluding those operations covered by CAP_DAC_OVERRIDE and CAP_DAC_READ_SEARCH"), + CAP_FSETID(4, "FSETID", "Don’t clear set-user-ID and set-group-ID permission bits when a file is modified; set the set-group-ID bit for a file whose GID does not match the filesystem or any of the supplementary GIDs of the calling process"), + CAP_KILL(5, "KILL", "Bypass permission checks for sending signals (see kill(2))."), + CAP_SETGID(6, "SETGID", "Make arbitrary manipulations of process GIDs and supplementary GID list; allow setgid(2) manipulation of the caller’s effective and real group IDs"), + CAP_SETUID(7, "SETUID", "Make arbitrary manipulations of process UIDs (setuid(2), setreuid(2), setresuid(2), setfsuid(2)); allow changing the current process user IDs; allow changing of the current process group ID to any value in the system’s range of legal group IDs"), + CAP_SETPCAP(8, "SETPCAP", "If file capabilities are supported: grant or remove any capability in the caller’s permitted capability set to or from any other process. (This property supersedes the obsolete notion of giving a process all capabilities by granting all capabilities in its permitted set, and of removing all capabilities from a process by granting no capabilities in its permitted set. It does not permit any actions that were not permitted before.)"), + CAP_LINUX_IMMUTABLE(9, "LINUX_IMMUTABLE", "Set the FS_APPEND_FL and FS_IMMUTABLE_FL inode flags (see chattr(1))."), + CAP_NET_BIND_SERVICE(10, "NET_BIND_SERVICE", "Bind a socket to Internet domain"), + CAP_NET_BROADCAST(11, "NET_BROADCAST", "Make socket broadcasts, and listen to multicasts"), + CAP_NET_ADMIN(12, "NET_ADMIN", "Perform various network-related operations: interface configuration, administration of IP firewall, masquerading, and accounting, modify routing tables, bind to any address for transparent proxying, set type-of-service (TOS), clear driver statistics, set promiscuous mode, enabling multicasting, use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK, SO_PRIORITY (for a priority outside the range 0 to 6), SO_RCVBUFFORCE, and SO_SNDBUFFORCE"), + CAP_NET_RAW(13, "NET_RAW", "Use RAW and PACKET sockets"), + CAP_IPC_LOCK(14, "IPC_LOCK", "Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2))"), + CAP_IPC_OWNER(15, "IPC_OWNER", "Bypass permission checks for operations on System V IPC objects"), + CAP_SYS_MODULE(16, "SYS_MODULE", "Load and unload kernel modules (see init_module(2) and delete_module(2)); in kernels before 2.6.25, this also granted rights for various other operations related to kernel modules"), + CAP_SYS_RAWIO(17, "SYS_RAWIO", "Perform I/O port operations (iopl(2) and ioperm(2)); access /proc/kcore"), + CAP_SYS_CHROOT(18, "SYS_CHROOT", "Use chroot(2)"), + CAP_SYS_PTRACE(19, "SYS_PTRACE", "Trace arbitrary processes using ptrace(2)"), + CAP_SYS_PACCT(20, "SYS_PACCT", "Use acct(2)"), + CAP_SYS_ADMIN(21, "SYS_ADMIN", "Perform a range of system administration operations including: quotactl(2), mount(2), umount(2), swapon(2), swapoff(2), sethostname(2), and setdomainname(2); set and modify process resource limits (setrlimit(2)); perform various network-related operations (e.g., setting privileged socket options, enabling multicasting, interface configuration); perform various IPC operations (e.g., SysV semaphores, POSIX message queues, System V shared memory); allow reboot and kexec_load(2); override /proc/sys kernel tunables; perform ptrace(2) PTRACE_SECCOMP_GET_FILTER operation; perform some tracing and debugging operations (see ptrace(2)); administer the lifetime of kernel tracepoints (tracefs(5)); perform the KEYCTL_CHOWN and KEYCTL_SETPERM keyctl(2) operations; perform the following keyctl(2) operations: KEYCTL_CAPABILITIES, KEYCTL_CAPSQUASH, and KEYCTL_PKEY_ OPERATIONS; set state for the Extensible Authentication Protocol (EAP) kernel module; and override the RLIMIT_NPROC resource limit; allow ioperm/iopl access to I/O ports"), + CAP_SYS_BOOT(22, "SYS_BOOT", "Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution"), + CAP_SYS_NICE(23, "SYS_NICE", "Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes; set real-time scheduling policies for calling process, and set scheduling policies and priorities for arbitrary processes (sched_setscheduler(2), sched_setparam(2)"), + CAP_SYS_RESOURCE(24, "SYS_RESOURCE", "Override resource Limits. Set resource limits (setrlimit(2), prlimit(2)), override quota limits (quota(2), quotactl(2)), override reserved space on ext2 filesystem (ext2_ioctl(2)), override size restrictions on IPC message queues (msg(2)) and system V shared memory segments (shmget(2)), and override the /proc/sys/fs/pipe-size-max limit"), + CAP_SYS_TIME(25, "SYS_TIME", "Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock"), + CAP_SYS_TTY_CONFIG(26, "SYS_TTY_CONFIG", "Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals"), + CAP_MKNOD(27, "MKNOD", "Create special files using mknod(2)"), + CAP_LEASE(28, "LEASE", "Establish leases on arbitrary files (see fcntl(2))"), + CAP_AUDIT_WRITE(29, "AUDIT_WRITE", "Write records to kernel auditing log"), + CAP_AUDIT_CONTROL(30, "AUDIT_CONTROL", "Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules"), + CAP_SETFCAP(31, "SETFCAP", "If file capabilities are supported: grant or remove any capability in any capability set to any file"), + CAP_MAC_OVERRIDE(32, "MAC_OVERRIDE", "Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM)"), + CAP_MAC_ADMIN(33, "MAC_ADMIN", "Allow MAC configuration or state changes. Implemented for the Smack LSM"), + CAP_SYSLOG(34, "SYSLOG", "Perform privileged syslog(2) operations. See syslog(2) for information on which operations require privilege"), + CAP_WAKE_ALARM(35, "WAKE_ALARM", "Trigger something that will wake up the system"), + CAP_BLOCK_SUSPEND(36, "BLOCK_SUSPEND", "Employ features that can block system suspend"), + CAP_AUDIT_READ(37, "AUDIT_READ", "Allow reading the audit log via a multicast netlink socket"), + CAP_PERFMON(38, "PERFMON", "Allow performance monitoring via perf_event_open(2)"), + CAP_BPF(39, "BPF", "Allow BPF operations via bpf(2)"), + CAP_CHECKPOINT_RESTORE(40, "CHECKPOINT_RESTORE", "Allow processes to be checkpointed via checkpoint/restore in user namespace(2)"), +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Groups.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Groups.kt new file mode 100644 index 000000000000..b1bbfd816d0c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/profile/Groups.kt @@ -0,0 +1,130 @@ +package com.rifsxd.ksunext.profile + +/** + * https://cs.android.com/android/platform/superproject/main/+/main:system/core/libcutils/include/private/android_filesystem_config.h + * @author weishu + * @date 2023/6/3. + */ +enum class Groups(val gid: Int, val display: String, val desc: String) { + ROOT(0, "root", "traditional unix root user"), + DAEMON(1, "daemon", "Traditional unix daemon owner."), + BIN(2, "bin", "Traditional unix binaries owner."), + SYS(3, "sys", "A group with the same gid on Linux/macOS/Android."), + SYSTEM(1000, "system", "system server"), + RADIO(1001, "radio", "telephony subsystem, RIL"), + BLUETOOTH(1002, "bluetooth", "bluetooth subsystem"), + GRAPHICS(1003, "graphics", "graphics devices"), + INPUT(1004, "input", "input devices"), + AUDIO(1005, "audio", "audio devices"), + CAMERA(1006, "camera", "camera devices"), + LOG(1007, "log", "log devices"), + COMPASS(1008, "compass", "compass device"), + MOUNT(1009, "mount", "mountd socket"), + WIFI(1010, "wifi", "wifi subsystem"), + ADB(1011, "adb", "android debug bridge (adbd)"), + INSTALL(1012, "install", "group for installing packages"), + MEDIA(1013, "media", "mediaserver process"), + DHCP(1014, "dhcp", "dhcp client"), + SDCARD_RW(1015, "sdcard_rw", "external storage write access"), + VPN(1016, "vpn", "vpn system"), + KEYSTORE(1017, "keystore", "keystore subsystem"), + USB(1018, "usb", "USB devices"), + DRM(1019, "drm", "DRM server"), + MDNSR(1020, "mdnsr", "MulticastDNSResponder (service discovery)"), + GPS(1021, "gps", "GPS daemon"), + UNUSED1(1022, "unused1", "deprecated, DO NOT USE"), + MEDIA_RW(1023, "media_rw", "internal media storage write access"), + MTP(1024, "mtp", "MTP USB driver access"), + UNUSED2(1025, "unused2", "deprecated, DO NOT USE"), + DRMRPC(1026, "drmrpc", "group for drm rpc"), + NFC(1027, "nfc", "nfc subsystem"), + SDCARD_R(1028, "sdcard_r", "external storage read access"), + CLAT(1029, "clat", "clat part of nat464"), + LOOP_RADIO(1030, "loop_radio", "loop radio devices"), + MEDIA_DRM(1031, "media_drm", "MediaDrm plugins"), + PACKAGE_INFO(1032, "package_info", "access to installed package details"), + SDCARD_PICS(1033, "sdcard_pics", "external storage photos access"), + SDCARD_AV(1034, "sdcard_av", "external storage audio/video access"), + SDCARD_ALL(1035, "sdcard_all", "access all users external storage"), + LOGD(1036, "logd", "log daemon"), + SHARED_RELRO(1037, "shared_relro", "creator of shared GNU RELRO files"), + DBUS(1038, "dbus", "dbus-daemon IPC broker process"), + TLSDATE(1039, "tlsdate", "tlsdate unprivileged user"), + MEDIA_EX(1040, "media_ex", "mediaextractor process"), + AUDIOSERVER(1041, "audioserver", "audioserver process"), + METRICS_COLL(1042, "metrics_coll", "metrics_collector process"), + METRICSD(1043, "metricsd", "metricsd process"), + WEBSERV(1044, "webserv", "webservd process"), + DEBUGGERD(1045, "debuggerd", "debuggerd unprivileged user"), + MEDIA_CODEC(1046, "media_codec", "media_codec process"), + CAMERASERVER(1047, "cameraserver", "cameraserver process"), + FIREWALL(1048, "firewall", "firewall process"), + TRUNKS(1049, "trunks", "trunksd process"), + NVRAM(1050, "nvram", "nvram daemon"), + DNS(1051, "dns", "DNS resolution daemon (system: netd)"), + DNS_TETHER(1052, "dns_tether", "DNS resolution daemon (tether: dnsmasq)"), + WEBVIEW_ZYGOTE(1053, "webview_zygote", "WebView zygote process"), + VEHICLE_NETWORK(1054, "vehicle_network", "Vehicle network service"), + MEDIA_AUDIO(1055, "media_audio", "GID for audio files on internal media storage"), + MEDIA_VIDEO(1056, "media_video", "GID for video files on internal media storage"), + MEDIA_IMAGE(1057, "media_image", "GID for image files on internal media storage"), + TOMBSTONED(1058, "tombstoned", "tombstoned user"), + MEDIA_OBB(1059, "media_obb", "GID for OBB files on internal media storage"), + ESE(1060, "ese", "embedded secure element (eSE) subsystem"), + OTA_UPDATE(1061, "ota_update", "resource tracking UID for OTA updates"), + AUTOMOTIVE_EVS(1062, "automotive_evs", "Automotive rear and surround view system"), + LOWPAN(1063, "lowpan", "LoWPAN subsystem"), + HSM(1064, "lowpan", "hardware security module subsystem"), + RESERVED_DISK(1065, "reserved_disk", "GID that has access to reserved disk space"), + STATSD(1066, "statsd", "statsd daemon"), + INCIDENTD(1067, "incidentd", "incidentd daemon"), + SECURE_ELEMENT(1068, "secure_element", "secure element subsystem"), + LMKD(1069, "lmkd", "low memory killer daemon"), + LLKD(1070, "llkd", "live lock daemon"), + IORAPD(1071, "iorapd", "input/output readahead and pin daemon"), + GPU_SERVICE(1072, "gpu_service", "GPU service daemon"), + NETWORK_STACK(1073, "network_stack", "network stack service"), + GSID(1074, "GSID", "GSI service daemon"), + FSVERITY_CERT(1075, "fsverity_cert", "fs-verity key ownership in keystore"), + CREDSTORE(1076, "credstore", "identity credential manager service"), + EXTERNAL_STORAGE(1077, "external_storage", "Full external storage access including USB OTG volumes"), + EXT_DATA_RW(1078, "ext_data_rw", "GID for app-private data directories on external storage"), + EXT_OBB_RW(1079, "ext_obb_rw", "GID for OBB directories on external storage"), + CONTEXT_HUB(1080, "context_hub", "GID for access to the Context Hub"), + VIRTUALIZATIONSERVICE(1081, "virtualizationservice", "VirtualizationService daemon"), + ARTD(1082, "artd", "ART Service daemon"), + UWB(1083, "uwb", "UWB subsystem"), + THREAD_NETWORK(1084, "thread_network", "Thread Network subsystem"), + DICED(1085, "diced", "Android's DICE daemon"), + DMESGD(1086, "dmesgd", "dmesg parsing daemon for kernel report collection"), + JC_WEAVER(1087, "jc_weaver", "Javacard Weaver HAL - to manage omapi ARA rules"), + JC_STRONGBOX(1088, "jc_strongbox", "Javacard Strongbox HAL - to manage omapi ARA rules"), + JC_IDENTITYCRED(1089, "jc_identitycred", "Javacard Identity Cred HAL - to manage omapi ARA rules"), + SDK_SANDBOX(1090, "sdk_sandbox", "SDK sandbox virtual UID"), + SECURITY_LOG_WRITER(1091, "security_log_writer", "write to security log"), + PRNG_SEEDER(1092, "prng_seeder", "PRNG seeder daemon"), + + SHELL(2000, "shell", "adb and debug shell user"), + CACHE(2001, "cache", "cache access"), + DIAG(2002, "diag", "access to diagnostic resources"), + + /* The 3000 series are intended for use as supplemental group id's only. + * They indicate special Android capabilities that the kernel is aware of. */ + NET_BT_ADMIN(3001, "net_bt_admin", "bluetooth: create any socket"), + NET_BT(3002, "net_bt", "bluetooth: create sco, rfcomm or l2cap sockets"), + INET(3003, "inet", "can create AF_INET and AF_INET6 sockets"), + NET_RAW(3004, "net_raw", "can create raw INET sockets"), + NET_ADMIN(3005, "net_admin", "can configure interfaces and routing tables."), + NET_BW_STATS(3006, "net_bw_stats", "read bandwidth statistics"), + NET_BW_ACCT(3007, "net_bw_acct", "change bandwidth statistics accounting"), + NET_BT_STACK(3008, "net_bt_stack", "access to various bluetooth management functions"), + READPROC(3009, "readproc", "Allow /proc read access"), + WAKELOCK(3010, "wakelock", "Allow system wakelock read/write access"), + UHID(3011, "uhid", "Allow read/write to /dev/uhid node"), + READTRACEFS(3012, "readtracefs", "Allow tracefs read"), + + EVERYBODY(9997, "everybody", "Shared external storage read/write"), + MISC(9998, "misc", "Access to misc storage"), + NOBODY(9999, "nobody", "Reserved"), + APP(10000, "app", "Access to app data"), +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt new file mode 100644 index 000000000000..bc130b232c4b --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/MainActivity.kt @@ -0,0 +1,737 @@ +package com.rifsxd.ksunext.ui + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.gestures.detectDragGestures +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.IntOffset +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.animation.* +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.spring +import androidx.compose.animation.core.tween +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.detectHorizontalDragGestures +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.activity.viewModels +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.unit.Velocity +import androidx.lifecycle.lifecycleScope +import kotlin.math.abs +import kotlinx.coroutines.launch +import com.ramcosta.composedestinations.DestinationsNavHost +import com.ramcosta.composedestinations.animations.NavHostAnimatedDestinationStyle +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.HomeScreenDestination +import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination +import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.generated.destinations.ModuleScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SuperUserScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SettingScreenDestination +import com.ramcosta.composedestinations.utils.isRouteOnBackStackAsState +import com.ramcosta.composedestinations.utils.rememberDestinationsNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.screen.BottomBarDestination +import com.rifsxd.ksunext.ui.screen.FlashIt +import com.rifsxd.ksunext.ui.theme.KernelSUTheme +import com.rifsxd.ksunext.ui.util.* +import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel + +data class ScrollState( + val isScrollingDown: MutableState, + val scrollOffset: MutableState, + val previousScrollOffset: MutableState +) + +val LocalScrollState = compositionLocalOf { null } + +@Composable +fun rememberScrollConnection( + isScrollingDown: MutableState, + scrollOffset: MutableState, + previousScrollOffset: MutableState, + threshold: Float = 50f +): NestedScrollConnection { + return remember { + object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + val delta = available.y + + // Update scroll offset + val newOffset = scrollOffset.value + delta + scrollOffset.value = newOffset + + // Calculate the scroll delta from previous offset + val scrollDelta = previousScrollOffset.value - newOffset + + // Only update direction if scroll delta exceeds threshold + if (abs(scrollDelta) > threshold) { + isScrollingDown.value = scrollDelta > 0 + previousScrollOffset.value = newOffset + } + + return Offset.Zero + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + // Reset offset tracking after fling + previousScrollOffset.value = scrollOffset.value + return super.onPostFling(consumed, available) + } + } + } +} + +fun Modifier.horizontalSwipeNavigator( + currentRoute: String?, + destinations: List, + onNavigate: (Int) -> Unit +): Modifier = pointerInput(currentRoute) { + + var totalDrag = 0f + + detectHorizontalDragGestures( + onDragStart = { totalDrag = 0f }, + onHorizontalDrag = { change, dragAmount -> + change.consume() + totalDrag += dragAmount + }, + onDragEnd = { + val threshold = 150f + + if (kotlin.math.abs(totalDrag) > threshold) { + val currentIndex = destinations.indexOfFirst { + it.direction.route == currentRoute + } + + if (currentIndex == -1) return@detectHorizontalDragGestures + + if (totalDrag < 0) { + val next = (currentIndex + 1) + .coerceAtMost(destinations.lastIndex) + if (next != currentIndex) onNavigate(next) + } else { + val prev = (currentIndex - 1) + .coerceAtLeast(0) + if (prev != currentIndex) onNavigate(prev) + } + } + } + ) +} + +fun Modifier.trackScroll( + isScrollingDown: MutableState, + scrollOffset: MutableState, + previousScrollOffset: MutableState, + threshold: Float = 50f +): Modifier { + val scrollConnection = object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + val delta = available.y + + // Update scroll offset + val newOffset = scrollOffset.value + delta + scrollOffset.value = newOffset + + // Calculate the scroll delta from previous offset + val scrollDelta = previousScrollOffset.value - newOffset + + // Only update direction if scroll delta exceeds threshold + if (abs(scrollDelta) > threshold) { + isScrollingDown.value = scrollDelta > 0 + previousScrollOffset.value = newOffset + } + + return Offset.Zero + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + // Reset offset tracking after fling + previousScrollOffset.value = scrollOffset.value + return super.onPostFling(consumed, available) + } + } + + return this.nestedScroll(scrollConnection) +} + +class MainActivity : ComponentActivity() { + + var zipUri by mutableStateOf?>(null) + enum class NavigateLocation { SUPERUSER, MODULES, SETTINGS } + var navigateLoc by mutableStateOf(null) + var moduleActionId by mutableStateOf(null) + var amoledModeState = mutableStateOf(false) + private val handler = Handler(Looper.getMainLooper()) + + val moduleViewModel: ModuleViewModel by viewModels() + val superUserViewModel: SuperUserViewModel by viewModels() + + override fun attachBaseContext(newBase: Context?) { + super.attachBaseContext(newBase?.let { LocaleHelper.applyLanguage(it) }) + } + + override fun onCreate(savedInstanceState: Bundle?) { + + super.onCreate(savedInstanceState) + + lifecycleScope.launch { + if (superUserViewModel.appList.isEmpty()) { + superUserViewModel.fetchAppList() + } + if (moduleViewModel.moduleList.isEmpty()) { + moduleViewModel.fetchModuleList() + } + } + + enableEdgeToEdge() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + } + + try { + val prefsInit = getSharedPreferences("settings", MODE_PRIVATE) + amoledModeState.value = prefsInit.getBoolean("enable_amoled", false) + } catch (_: Exception) {} + + val isManager = Natives.isManager + if (isManager) install() + + if ((intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { + intent.extras?.clear() + intent = null + } + + if(intent != null) + handleIntent(intent) + + setContent { + KernelSUTheme(amoledMode = amoledModeState.value) { + val navController = rememberNavController() + val snackBarHostState = remember { SnackbarHostState() } + val currentDestination = navController.currentBackStackEntryAsState().value?.destination + val bottomBarRoutes = remember { + BottomBarDestination.entries.map { it.direction.route }.toSet() + } + val navigator = navController.rememberDestinationsNavigator() + + val isManager = Natives.isManager + val fullFeatured = isManager && !Natives.requireNewKernel() && rootAvailable() + + val currentBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = currentBackStackEntry?.destination?.route + + val homeDestination = BottomBarDestination.entries.firstOrNull() + val startRoute = homeDestination?.direction?.route + + if (homeDestination != null && startRoute != null) { + BackHandler(enabled = currentRoute != startRoute && currentRoute in bottomBarRoutes) { + navigator.navigate(homeDestination.direction) { + popUpTo(NavGraphs.root) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + } + + // Track the last bottom bar destination index for directional animations + var lastBottomBarIndex by remember { mutableStateOf(0) } + var isBottomBarNavigation by remember { mutableStateOf(false) } + + // Scroll state for bottom bar visibility + val isScrollingDown = remember { mutableStateOf(false) } + val scrollOffset = remember { mutableStateOf(0f) } + val previousScrollOffset = remember { mutableStateOf(0f) } + + // Remember the last valid navbar selection (persists across navbar hide/show) + val lastValidNavbarSelection = remember { mutableStateOf(0) } + + LaunchedEffect(zipUri, navigateLoc, moduleActionId) { + if (moduleActionId != null) { + navigator.navigate(ExecuteModuleActionScreenDestination(moduleActionId!!)) + moduleActionId = null + } + + if (!zipUri.isNullOrEmpty()) { + val uris = zipUri!! + val component = intent?.component?.className + val flashIt = when { + component?.endsWith("FlashAnyKernel") == true -> FlashIt.FlashAnyKernel(uris.first()) + else -> FlashIt.FlashModules(uris) + } + + navigator.navigate( + FlashScreenDestination(flashIt = flashIt) + ) + zipUri = null + } + + if (zipUri.isNullOrEmpty() && navigateLoc != null) { + when (navigateLoc) { + NavigateLocation.SUPERUSER -> navigator.navigate(SuperUserScreenDestination) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + NavigateLocation.MODULES -> navigator.navigate(ModuleScreenDestination) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + NavigateLocation.SETTINGS -> navigator.navigate(SettingScreenDestination) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + else -> { /* no-op for exhaustiveness */ } + } + navigateLoc = null + } + } + + val showBottomBar = when (currentDestination?.route) { + FlashScreenDestination.route -> false // Hide for FlashScreenDestination + ExecuteModuleActionScreenDestination.route -> false // Hide for ExecuteModuleActionScreen + else -> !isScrollingDown.value + } + + Scaffold( + contentWindowInsets = WindowInsets(0, 0, 0, 0) + ) { innerPadding -> + Box(modifier = Modifier.fillMaxSize()) { + CompositionLocalProvider( + LocalSnackbarHost provides snackBarHostState, + LocalScrollState provides ScrollState( + isScrollingDown = isScrollingDown, + scrollOffset = scrollOffset, + previousScrollOffset = previousScrollOffset + ) + ) { + val visibleDestinations = remember(fullFeatured) { + BottomBarDestination.entries.filter { fullFeatured || !it.rootRequired } + } + + fun navigateToIndex(index: Int) { + val destination = visibleDestinations.getOrNull(index) ?: return + if (destination.direction.route == currentRoute) return + + navigator.navigate(destination.direction) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + + val hostModifier = Modifier + .padding(innerPadding) + .fillMaxSize() + .horizontalSwipeNavigator( + currentRoute = currentRoute, + destinations = visibleDestinations, + onNavigate = { navigateToIndex(it) } + ) + + DestinationsNavHost( + modifier = hostModifier, + navGraph = NavGraphs.root, + navController = navController, + defaultTransitions = object : NavHostAnimatedDestinationStyle() { + override val enterTransition: AnimatedContentTransitionScope.() -> EnterTransition = { + val targetRoute = targetState.destination.route + val initialRoute = initialState.destination.route + + val targetIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == targetRoute } + val initialIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == initialRoute } + + when { + // Bottom bar → bottom bar: slide based on index direction + targetIndex != -1 && initialIndex != -1 -> { + val offsetSign = if (targetIndex > initialIndex) 1 else -1 + slideInHorizontally(initialOffsetX = { it * offsetSign }, animationSpec = tween(300)) + } + // Detail page → bottom bar: slide in from left + targetRoute in bottomBarRoutes && initialRoute !in bottomBarRoutes -> { + slideInHorizontally(initialOffsetX = { -it }, animationSpec = tween(300)) + } + // Bottom bar → detail page: slide in from right + else -> slideInHorizontally(initialOffsetX = { it }, animationSpec = tween(300)) + } + } + + override val exitTransition: AnimatedContentTransitionScope.() -> ExitTransition = { + val targetRoute = targetState.destination.route + val initialRoute = initialState.destination.route + + val targetIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == targetRoute } + val initialIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == initialRoute } + + when { + // Bottom bar → bottom bar: slide out opposite direction + targetIndex != -1 && initialIndex != -1 -> { + val offsetSign = if (targetIndex > initialIndex) -1 else 1 + slideOutHorizontally(targetOffsetX = { it * offsetSign }, animationSpec = tween(300)) + } + // Bottom bar → detail page: slide out to left + initialRoute in bottomBarRoutes && targetRoute !in bottomBarRoutes -> { + slideOutHorizontally(targetOffsetX = { -it }, animationSpec = tween(300)) + } + // Default + else -> slideOutHorizontally(targetOffsetX = { -it }, animationSpec = tween(300)) + } + } + + override val popEnterTransition: AnimatedContentTransitionScope.() -> EnterTransition = { + val targetRoute = targetState.destination.route + val initialRoute = initialState.destination.route + + val targetIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == targetRoute } + val initialIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == initialRoute } + + when { + // Bottom bar → bottom bar pop: mirror of exit + targetIndex != -1 && initialIndex != -1 -> { + val offsetSign = if (targetIndex > initialIndex) 1 else -1 + slideInHorizontally(initialOffsetX = { it * offsetSign }, animationSpec = tween(300)) + } + // Returning from detail → bottom bar: slide in from left + targetRoute in bottomBarRoutes -> { + slideInHorizontally(initialOffsetX = { -it }, animationSpec = tween(300)) + } + else -> slideInHorizontally(initialOffsetX = { -it }, animationSpec = tween(300)) + } + } + + override val popExitTransition: AnimatedContentTransitionScope.() -> ExitTransition = { + val targetRoute = targetState.destination.route + val initialRoute = initialState.destination.route + + val targetIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == targetRoute } + val initialIndex = BottomBarDestination.entries.indexOfFirst { it.direction.route == initialRoute } + + when { + // Bottom bar → bottom bar pop + targetIndex != -1 && initialIndex != -1 -> { + val offsetSign = if (targetIndex > initialIndex) -1 else 1 + slideOutHorizontally(targetOffsetX = { it * offsetSign }, animationSpec = tween(300)) + } + // Detail page closing: slide out to right + initialRoute !in bottomBarRoutes -> { + slideOutHorizontally(targetOffsetX = { it }, animationSpec = tween(300)) + } + else -> slideOutHorizontally(targetOffsetX = { it }, animationSpec = tween(300)) + } + } + } + ) + } + + // Floating Bottom Bar as overlay + AnimatedVisibility( + visible = showBottomBar, + modifier = Modifier.align(Alignment.BottomCenter), + enter = slideInVertically(initialOffsetY = { it }) + fadeIn(), + exit = slideOutVertically(targetOffsetY = { it }) + fadeOut() + ) { + BottomBar(navController, lastValidNavbarSelection) + } + } + } + } + } + } + + fun setAmoledMode(enabled: Boolean) { + try { + val prefs = getSharedPreferences("settings", MODE_PRIVATE) + prefs.edit().putBoolean("enable_amoled", enabled).apply() + } catch (_: Exception) {} + amoledModeState.value = enabled + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + handleIntent(intent) + setIntent(intent) + } + + private fun handleIntent(intent: Intent) { + val shortcutType = intent.getStringExtra("shortcut_type") + if (shortcutType == "module_action") { + moduleActionId = intent.getStringExtra("module_id") + } + + when (intent.action) { + Intent.ACTION_VIEW -> { + zipUri = + intent.data?.let { arrayListOf(it) } + ?: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableArrayListExtra("uris", Uri::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableArrayListExtra("uris") + } + } + + "ACTION_SETTINGS" -> navigateLoc = NavigateLocation.SETTINGS + "ACTION_SUPERUSER" -> navigateLoc = NavigateLocation.SUPERUSER + "ACTION_MODULES" -> navigateLoc = NavigateLocation.MODULES + else -> { /* ignore other actions */ } + } + } +} + +@Composable +private fun BottomBar( + navController: NavHostController, + lastValidSelection: MutableState +) { + val navigator = navController.rememberDestinationsNavigator() + val isManager = Natives.isManager + val fullFeatured = isManager && !Natives.requireNewKernel() && rootAvailable() + + val visibleDestinations = remember(fullFeatured) { + BottomBarDestination.entries.filter { fullFeatured || !it.rootRequired } + } + + val currentBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = currentBackStackEntry?.destination?.route + + val isOnBackStack = visibleDestinations.map { destination -> + navController.isRouteOnBackStackAsState(destination.direction).value + } + + val selectedIndex = run { + val exactMatch = visibleDestinations.indexOfFirst { it.direction.route == currentRoute } + if (exactMatch != -1) exactMatch + else isOnBackStack.indexOfLast { it } + } + + if (selectedIndex != -1) lastValidSelection.value = selectedIndex + val effectiveSelectedIndex = if (selectedIndex != -1) selectedIndex else lastValidSelection.value + + // Drag state + var isDraggingPill by remember { mutableStateOf(false) } + var dragTargetIndex by remember { mutableStateOf(effectiveSelectedIndex) } + + // During drag, animate toward dragTargetIndex; otherwise animate toward effectiveSelectedIndex + val animatedSelectedIndex by animateFloatAsState( + targetValue = (if (isDraggingPill) dragTargetIndex else effectiveSelectedIndex).toFloat(), + animationSpec = if (isDraggingPill) { + spring(dampingRatio = Spring.DampingRatioNoBouncy, stiffness = Spring.StiffnessMedium) + } else { + spring(dampingRatio = Spring.DampingRatioMediumBouncy, stiffness = Spring.StiffnessLow) + }, + label = "selectedIndex" + ) + + fun navigateToIndex(index: Int) { + val destination = visibleDestinations.getOrNull(index) ?: return + if (destination.direction.route == currentRoute) return + navigator.navigate(destination.direction) { + popUpTo(NavGraphs.root.startRoute) { saveState = true } + launchSingleTop = true + restoreState = true + } + } + + BoxWithConstraints( + modifier = Modifier + .fillMaxWidth() + .padding( + bottom = WindowInsets.navigationBars + .asPaddingValues() + .calculateBottomPadding() + ) + ) { + val screenWidth = maxWidth + val horizontalScreenPadding = when { + screenWidth > 600.dp -> 32.dp + screenWidth > 400.dp -> 24.dp + else -> 16.dp + } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = horizontalScreenPadding, vertical = 14.dp), + contentAlignment = Alignment.Center + ) { + Surface( + modifier = Modifier.wrapContentWidth(), + shape = RoundedCornerShape(24.dp), + tonalElevation = 3.dp, + shadowElevation = 8.dp + ) { + val itemSize = 56.dp + val itemSpacing = 4.dp + val containerPadding = 7.dp + + val navBarWidth = (itemSize * visibleDestinations.size) + + (itemSpacing * (visibleDestinations.size - 1)) + + (containerPadding * 2) + + val density = LocalDensity.current + val itemSizePx = with(density) { itemSize.toPx() } + val itemSpacingPx = with(density) { itemSpacing.toPx() } + val containerPaddingPx = with(density) { containerPadding.toPx() } + + Box( + modifier = Modifier + .width(navBarWidth) + .height(72.dp) + .pointerInput(visibleDestinations, effectiveSelectedIndex) { + detectDragGestures( + onDragStart = { offset -> + val extraTouchArea = with(density) { 20.dp.toPx() } + + val pillLeft = containerPaddingPx + + effectiveSelectedIndex * (itemSizePx + itemSpacingPx) - extraTouchArea + + val pillRight = pillLeft + itemSizePx + (extraTouchArea * 2) + + if (offset.x in pillLeft..pillRight) { + isDraggingPill = true + dragTargetIndex = effectiveSelectedIndex + } + }, + onDragEnd = { + if (isDraggingPill) { + navigateToIndex(dragTargetIndex) + isDraggingPill = false + } + }, + onDragCancel = { + isDraggingPill = false + }, + onDrag = { change, _ -> + if (isDraggingPill) { + change.consume() + // Map finger X to nearest icon index + val index = ((change.position.x - containerPaddingPx) / + (itemSizePx + itemSpacingPx)) + .toInt() + .coerceIn(0, visibleDestinations.lastIndex) + dragTargetIndex = index + } + } + ) + } + ) { + var totalWidth by remember { mutableStateOf(0) } + + Box( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = containerPadding) + .onSizeChanged { totalWidth = it.width } + ) { + // Sliding pill indicator + if (totalWidth > 0 && visibleDestinations.isNotEmpty()) { + val indicatorOffset = (itemSizePx + itemSpacingPx) * animatedSelectedIndex + + Box( + modifier = Modifier + .fillMaxHeight() + .padding(vertical = 8.dp) + .offset { + IntOffset(x = indicatorOffset.toInt(), y = 0) + } + .width(itemSize) + // Subtle scale-up when dragging, like iOS + .graphicsLayer { + scaleX = if (isDraggingPill) 1.1f else 1f + scaleY = if (isDraggingPill) 1.1f else 1f + }, + contentAlignment = Alignment.Center + ) { + Box( + modifier = Modifier + .size(itemSize) + .background( + color = MaterialTheme.colorScheme.secondaryContainer, + shape = RoundedCornerShape(16.dp) + ) + ) + } + } + // Navigation items + Row( + modifier = Modifier.fillMaxSize(), + horizontalArrangement = Arrangement.spacedBy(itemSpacing), + verticalAlignment = Alignment.CenterVertically + ) { + visibleDestinations.forEachIndexed { index, destination -> + val isSelected = index == (if (isDraggingPill) dragTargetIndex else effectiveSelectedIndex) + + Box( + modifier = Modifier + .size(itemSize) + .clip(MaterialTheme.shapes.large) + .clickable { + if (destination.direction.route == currentRoute) return@clickable + navigateToIndex(index) + }, + contentAlignment = Alignment.Center + ) { + Icon( + if (isSelected) destination.iconSelected else destination.iconNotSelected, + stringResource(destination.label), + tint = if (isSelected) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.onSurfaceVariant + } + ) + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/AboutCard.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/AboutCard.kt new file mode 100644 index 000000000000..daee0e64be4a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/AboutCard.kt @@ -0,0 +1,115 @@ +package com.rifsxd.ksunext.ui.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.* +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import com.rifsxd.ksunext.BuildConfig +import com.rifsxd.ksunext.R + +@Preview +@Composable +fun AboutCard() { + ElevatedCard( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(8.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp) + ) { + AboutCardContent() + } + } +} + +@Composable +fun AboutDialog(dismiss: () -> Unit) { + Dialog( + onDismissRequest = { dismiss() } + ) { + AboutCard() + } +} + +@Composable +private fun AboutCardContent() { + Column( + modifier = Modifier.fillMaxWidth() + ) { + Row { + Surface( + modifier = Modifier.size(40.dp), + color = colorResource(id = R.color.ic_launcher_background), + shape = CircleShape + ) { + Image( + painter = painterResource(id = R.mipmap.ic_launcher_foreground), + contentDescription = "icon", + modifier = Modifier.scale(1.5f) + ) + } + + Spacer(modifier = Modifier.width(12.dp)) + + Column { + + Text( + text = stringResource(id = R.string.app_name), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + fontSize = 18.sp + ) + Text( + BuildConfig.VERSION_NAME, + style = MaterialTheme.typography.bodySmall, + fontSize = 14.sp + ) + + Spacer(modifier = Modifier.height(8.dp)) + + val annotatedString = AnnotatedString.fromHtml( + htmlString = stringResource( + id = R.string.about_source_code, + "GitHub" + ), + linkStyles = TextLinkStyles( + style = SpanStyle( + color = MaterialTheme.colorScheme.primary, + textDecoration = TextDecoration.Underline + ), + pressedStyle = SpanStyle( + color = MaterialTheme.colorScheme.primary, + background = MaterialTheme.colorScheme.secondaryContainer, + textDecoration = TextDecoration.Underline + ) + ) + ) + Text( + text = annotatedString, + style = TextStyle( + fontSize = 14.sp + ) + ) + } + } + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/Dialog.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/Dialog.kt new file mode 100644 index 000000000000..1e3442e92ff7 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/Dialog.kt @@ -0,0 +1,458 @@ +package com.rifsxd.ksunext.ui.component + +import android.graphics.text.LineBreaker +import android.os.Build +import android.os.Parcelable +import android.text.Layout +import android.text.method.LinkMovementMethod +import android.util.Log +import android.view.ViewGroup +import android.widget.TextView +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import io.noties.markwon.Markwon +import io.noties.markwon.utils.NoCopySpannableFactory +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.ReceiveChannel +import kotlinx.coroutines.flow.FlowCollector +import kotlinx.coroutines.flow.consumeAsFlow +import kotlinx.coroutines.flow.onEach +import kotlinx.parcelize.Parcelize +import kotlin.coroutines.resume + +private const val TAG = "DialogComponent" + +interface ConfirmDialogVisuals : Parcelable { + val title: String + val content: String + val isMarkdown: Boolean + val confirm: String? + val dismiss: String? +} + +@Parcelize +private data class ConfirmDialogVisualsImpl( + override val title: String, + override val content: String, + override val isMarkdown: Boolean, + override val confirm: String?, + override val dismiss: String?, +) : ConfirmDialogVisuals { + companion object { + val Empty: ConfirmDialogVisuals = ConfirmDialogVisualsImpl("", "", false, null, null) + } +} + +interface DialogHandle { + val isShown: Boolean + val dialogType: String + fun show() + fun hide() +} + +interface LoadingDialogHandle : DialogHandle { + suspend fun withLoading(block: suspend () -> R): R + fun showLoading() +} + +sealed interface ConfirmResult { + object Confirmed : ConfirmResult + object Canceled : ConfirmResult +} + +interface ConfirmDialogHandle : DialogHandle { + val visuals: ConfirmDialogVisuals + + fun showConfirm( + title: String, + content: String, + markdown: Boolean = false, + confirm: String? = null, + dismiss: String? = null + ) + + suspend fun awaitConfirm( + title: String, + content: String, + markdown: Boolean = false, + confirm: String? = null, + dismiss: String? = null + ): ConfirmResult +} + +private abstract class DialogHandleBase( + val visible: MutableState, + val coroutineScope: CoroutineScope +) : DialogHandle { + override val isShown: Boolean + get() = visible.value + + override fun show() { + coroutineScope.launch { + visible.value = true + } + } + + final override fun hide() { + coroutineScope.launch { + visible.value = false + } + } + + override fun toString(): String { + return dialogType + } +} + +private class LoadingDialogHandleImpl( + visible: MutableState, + coroutineScope: CoroutineScope +) : LoadingDialogHandle, DialogHandleBase(visible, coroutineScope) { + override suspend fun withLoading(block: suspend () -> R): R { + return coroutineScope.async { + try { + visible.value = true + block() + } finally { + visible.value = false + } + }.await() + } + + override fun showLoading() { + show() + } + + override val dialogType: String get() = "LoadingDialog" +} + +typealias NullableCallback = (() -> Unit)? + +interface ConfirmCallback { + + val onConfirm: NullableCallback + + val onDismiss: NullableCallback + + val isEmpty: Boolean get() = onConfirm == null && onDismiss == null + + companion object { + operator fun invoke(onConfirmProvider: () -> NullableCallback, onDismissProvider: () -> NullableCallback): ConfirmCallback { + return object : ConfirmCallback { + override val onConfirm: NullableCallback + get() = onConfirmProvider() + override val onDismiss: NullableCallback + get() = onDismissProvider() + } + } + } +} + +private class ConfirmDialogHandleImpl( + visible: MutableState, + coroutineScope: CoroutineScope, + callback: ConfirmCallback, + override var visuals: ConfirmDialogVisuals = ConfirmDialogVisualsImpl.Empty, + private val resultFlow: ReceiveChannel +) : ConfirmDialogHandle, DialogHandleBase(visible, coroutineScope) { + private class ResultCollector( + private val callback: ConfirmCallback + ) : FlowCollector { + fun handleResult(result: ConfirmResult) { + Log.d(TAG, "handleResult: ${result.javaClass.simpleName}") + when (result) { + ConfirmResult.Confirmed -> onConfirm() + ConfirmResult.Canceled -> onDismiss() + } + } + + fun onConfirm() { + callback.onConfirm?.invoke() + } + + fun onDismiss() { + callback.onDismiss?.invoke() + } + + override suspend fun emit(value: ConfirmResult) { + handleResult(value) + } + } + + private val resultCollector = ResultCollector(callback) + + private var awaitContinuation: CancellableContinuation? = null + + private val isCallbackEmpty = callback.isEmpty + + init { + coroutineScope.launch { + resultFlow + .consumeAsFlow() + .onEach { result -> + awaitContinuation?.let { + awaitContinuation = null + if (it.isActive) { + it.resume(result) + } + } + } + .onEach { hide() } + .collect(resultCollector) + } + } + + private suspend fun awaitResult(): ConfirmResult { + return suspendCancellableCoroutine { + awaitContinuation = it.apply { + if (isCallbackEmpty) { + invokeOnCancellation { + visible.value = false + } + } + } + } + } + + fun updateVisuals(visuals: ConfirmDialogVisuals) { + this.visuals = visuals + } + + override fun show() { + if (visuals !== ConfirmDialogVisualsImpl.Empty) { + super.show() + } else { + throw UnsupportedOperationException("can't show confirm dialog with the Empty visuals") + } + } + + override fun showConfirm( + title: String, + content: String, + markdown: Boolean, + confirm: String?, + dismiss: String? + ) { + coroutineScope.launch { + updateVisuals(ConfirmDialogVisualsImpl(title, content, markdown, confirm, dismiss)) + show() + } + } + + override suspend fun awaitConfirm( + title: String, + content: String, + markdown: Boolean, + confirm: String?, + dismiss: String? + ): ConfirmResult { + coroutineScope.launch { + updateVisuals(ConfirmDialogVisualsImpl(title, content, markdown, confirm, dismiss)) + show() + } + return awaitResult() + } + + override val dialogType: String get() = "ConfirmDialog" + + override fun toString(): String { + return "${super.toString()}(visuals: $visuals)" + } + + companion object { + fun Saver( + visible: MutableState, + coroutineScope: CoroutineScope, + callback: ConfirmCallback, + resultChannel: ReceiveChannel + ) = Saver( + save = { + it.visuals + }, + restore = { + Log.d(TAG, "ConfirmDialog restore, visuals: $it") + ConfirmDialogHandleImpl(visible, coroutineScope, callback, it, resultChannel) + } + ) + } +} + +private class CustomDialogHandleImpl( + visible: MutableState, + coroutineScope: CoroutineScope +) : DialogHandleBase(visible, coroutineScope) { + override val dialogType: String get() = "CustomDialog" +} + +@Composable +fun rememberLoadingDialog(): LoadingDialogHandle { + val visible = remember { + mutableStateOf(false) + } + val coroutineScope = rememberCoroutineScope() + + if (visible.value) { + LoadingDialog() + } + + return remember { + LoadingDialogHandleImpl(visible, coroutineScope) + } +} + +@Composable +private fun rememberConfirmDialog(visuals: ConfirmDialogVisuals, callback: ConfirmCallback): ConfirmDialogHandle { + val visible = rememberSaveable { + mutableStateOf(false) + } + val coroutineScope = rememberCoroutineScope() + val resultChannel = remember { + Channel() + } + + val handle = rememberSaveable( + saver = ConfirmDialogHandleImpl.Saver(visible, coroutineScope, callback, resultChannel), + init = { + ConfirmDialogHandleImpl(visible, coroutineScope, callback, visuals, resultChannel) + } + ) + + if (visible.value) { + ConfirmDialog( + handle.visuals, + confirm = { coroutineScope.launch { resultChannel.send(ConfirmResult.Confirmed) } }, + dismiss = { coroutineScope.launch { resultChannel.send(ConfirmResult.Canceled) } } + ) + } + + return handle +} + +@Composable +fun rememberConfirmCallback(onConfirm: NullableCallback, onDismiss: NullableCallback): ConfirmCallback { + val currentOnConfirm by rememberUpdatedState(newValue = onConfirm) + val currentOnDismiss by rememberUpdatedState(newValue = onDismiss) + return remember { + ConfirmCallback({ currentOnConfirm }, { currentOnDismiss }) + } +} + +@Composable +fun rememberConfirmDialog(onConfirm: NullableCallback = null, onDismiss: NullableCallback = null): ConfirmDialogHandle { + return rememberConfirmDialog(rememberConfirmCallback(onConfirm, onDismiss)) +} + +@Composable +fun rememberConfirmDialog(callback: ConfirmCallback): ConfirmDialogHandle { + return rememberConfirmDialog(ConfirmDialogVisualsImpl.Empty, callback) +} + +@Composable +fun rememberCustomDialog(composable: @Composable (dismiss: () -> Unit) -> Unit): DialogHandle { + val visible = rememberSaveable { + mutableStateOf(false) + } + val coroutineScope = rememberCoroutineScope() + if (visible.value) { + composable { visible.value = false } + } + return remember { + CustomDialogHandleImpl(visible, coroutineScope) + } +} + +@Composable +private fun LoadingDialog() { + Dialog( + onDismissRequest = {}, + properties = DialogProperties(dismissOnClickOutside = false, dismissOnBackPress = false) + ) { + Surface( + modifier = Modifier.size(100.dp), shape = RoundedCornerShape(8.dp) + ) { + Box( + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator() + } + } + } +} + +@Composable +private fun ConfirmDialog(visuals: ConfirmDialogVisuals, confirm: () -> Unit, dismiss: () -> Unit) { + AlertDialog( + onDismissRequest = { + dismiss() + }, + title = { + Text( + text = visuals.title, + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.SemiBold + ) + }, + text = { + if (visuals.isMarkdown) { + MarkdownContent(content = visuals.content) + } else { + Text(text = visuals.content) + } + }, + confirmButton = { + TextButton(onClick = confirm) { + Text(text = visuals.confirm ?: stringResource(id = android.R.string.ok)) + } + }, + dismissButton = { + TextButton(onClick = dismiss) { + Text(text = visuals.dismiss ?: stringResource(id = android.R.string.cancel)) + } + }, + ) +} + +@Composable +private fun MarkdownContent(content: String) { + val contentColor = LocalContentColor.current + + AndroidView( + factory = { context -> + TextView(context).apply { + movementMethod = LinkMovementMethod.getInstance() + setSpannableFactory(NoCopySpannableFactory.getInstance()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + breakStrategy = LineBreaker.BREAK_STRATEGY_SIMPLE + } + hyphenationFrequency = Layout.HYPHENATION_FREQUENCY_NONE + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + }, + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + update = { + Markwon.create(it.context).setMarkdown(it, content) + it.setTextColor(contentColor.toArgb()) + } + ) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/KeyEventBlocker.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/KeyEventBlocker.kt new file mode 100644 index 000000000000..5aa806ca2b5b --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/KeyEventBlocker.kt @@ -0,0 +1,28 @@ +package com.rifsxd.ksunext.ui.component + +import androidx.compose.foundation.focusable +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.input.key.KeyEvent +import androidx.compose.ui.input.key.onKeyEvent + +@Composable +fun KeyEventBlocker(predicate: (KeyEvent) -> Boolean) { + val requester = remember { FocusRequester() } + Box( + Modifier + .onKeyEvent { + predicate(it) + } + .focusRequester(requester) + .focusable() + ) + LaunchedEffect(Unit) { + requester.requestFocus() + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SearchBar.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SearchBar.kt new file mode 100644 index 000000000000..8e350d93a0e6 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SearchBar.kt @@ -0,0 +1,147 @@ +package com.rifsxd.ksunext.ui.component + +import android.util.Log +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +private const val TAG = "SearchBar" + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SearchAppBar( + title: @Composable () -> Unit, + searchText: String, + onSearchTextChange: (String) -> Unit, + onClearClick: () -> Unit, + onBackClick: (() -> Unit)? = null, + onConfirm: (() -> Unit)? = null, + actionsContent: @Composable (() -> Unit)? = null, + dropdownContent: @Composable (() -> Unit)? = null, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + val keyboardController = LocalSoftwareKeyboardController.current + val focusRequester = remember { FocusRequester() } + var onSearch by remember { mutableStateOf(false) } + + if (onSearch) { + LaunchedEffect(Unit) { focusRequester.requestFocus() } + } + DisposableEffect(Unit) { + onDispose { + keyboardController?.hide() + } + } + + TopAppBar( + title = { + Box { + AnimatedVisibility( + modifier = Modifier.align(Alignment.CenterStart), + visible = !onSearch, + enter = fadeIn(), + exit = fadeOut(), + content = { title() } + ) + + AnimatedVisibility( + visible = onSearch, + enter = fadeIn(), + exit = fadeOut() + ) { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 2.dp, bottom = 2.dp, end = if (onBackClick != null) 0.dp else 14.dp) + .focusRequester(focusRequester) + .onFocusChanged { focusState -> + if (focusState.isFocused) onSearch = true + Log.d(TAG, "onFocusChanged: $focusState") + }, + value = searchText, + onValueChange = onSearchTextChange, + trailingIcon = { + IconButton( + onClick = { + onSearch = false + keyboardController?.hide() + onClearClick() + }, + content = { Icon(Icons.Filled.Close, null) } + ) + }, + maxLines = 1, + singleLine = true, + keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { + keyboardController?.hide() + onConfirm?.invoke() + }) + ) + } + } + }, + navigationIcon = { + if (onBackClick != null) { + IconButton( + onClick = onBackClick, + content = { Icon(Icons.AutoMirrored.Outlined.ArrowBack, null) } + ) + } + }, + actions = { + AnimatedVisibility( + visible = !onSearch + ) { + Row { + if (actionsContent != null) { + actionsContent() + } + + IconButton( + onClick = { onSearch = true }, + content = { Icon(Icons.Filled.Search, null) } + ) + } + } + + if (dropdownContent != null) { + dropdownContent() + } + + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +private fun SearchAppBarPreview() { + var searchText by remember { mutableStateOf("") } + SearchAppBar( + title = { Text("Search text") }, + searchText = searchText, + onSearchTextChange = { searchText = it }, + onClearClick = { searchText = "" } + ) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt new file mode 100644 index 000000000000..95d02d4643c1 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/SettingsItem.kt @@ -0,0 +1,108 @@ +package com.rifsxd.ksunext.ui.component + +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.selection.toggleable +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.graphics.Color +import androidx.compose.material3.ListItemDefaults +import androidx.compose.material3.ListItemColors +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.text.TextRow + +@Composable +fun SwitchItem( + icon: ImageVector? = null, + title: String, + summary: String? = null, + checked: Boolean, + enabled: Boolean = true, + beta: Boolean = false, + modifier: Modifier = Modifier, + colors: ListItemColors = ListItemDefaults.colors(), + onCheckedChange: (Boolean) -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + val switchInteractionSource = remember { MutableInteractionSource() } + val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) } + + ListItem( + modifier = modifier.then(Modifier + .toggleable( + value = checked, + interactionSource = interactionSource, + role = Role.Switch, + enabled = enabled, + indication = LocalIndication.current, + onValueChange = onCheckedChange + )), + colors = colors, + headlineContent = { + TextRow( + leadingContent = if (beta) { + { + LabelItem( + modifier = Modifier.then(stateAlpha), + text = "Beta" + ) + } + } else null + ) { + Text( + modifier = Modifier.then(stateAlpha), + text = title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + }, + leadingContent = icon?.let { + { + Icon( + modifier = Modifier.then(stateAlpha), + imageVector = icon, + contentDescription = title + ) + } + }, + trailingContent = { + Switch( + checked = checked, + enabled = enabled, + onCheckedChange = onCheckedChange, + interactionSource = switchInteractionSource + ) + }, + supportingContent = { + if (summary != null) { + Text( + modifier = Modifier.then(stateAlpha), + text = summary + ) + } + } + ) +} + +@Composable +fun RadioItem( + title: String, + selected: Boolean, + onClick: () -> Unit, +) { + ListItem( + headlineContent = { + Text(title) + }, + leadingContent = { + RadioButton(selected = selected, onClick = onClick) + } + ) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/ShortcutDialog.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/ShortcutDialog.kt new file mode 100644 index 000000000000..8a6924cca7d7 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/ShortcutDialog.kt @@ -0,0 +1,252 @@ +package com.rifsxd.ksunext.ui.component + +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.util.module.Shortcut + +@Composable +fun ShortcutDialog( + initialName: String, + initialIconUri: String? = null, + onDismiss: () -> Unit, + onConfirm: (String, String?) -> Unit +) { + var name by remember { mutableStateOf(initialName) } + var iconUri by remember { mutableStateOf(initialIconUri) } + val context = LocalContext.current + + val launcher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.GetContent() + ) { uri: Uri? -> + uri?.let { iconUri = it.toString() } + } + + Dialog(onDismissRequest = onDismiss) { + Card( + modifier = Modifier.fillMaxWidth(0.95f), + ) { + Column( + modifier = Modifier.padding(24.dp) + ) { + // Header + Text( + text = stringResource(R.string.module_shortcut_title), + style = MaterialTheme.typography.headlineSmall, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurface + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = stringResource(R.string.customize_your_module_shortcut), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(24.dp)) + + // Name Input + OutlinedTextField( + value = name, + onValueChange = { name = it }, + label = { + Text(stringResource(R.string.module_shortcut_name_label)) + }, + singleLine = true, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = OutlinedTextFieldDefaults.colors( + focusedBorderColor = MaterialTheme.colorScheme.primary, + unfocusedBorderColor = MaterialTheme.colorScheme.outline + ) + ) + + Spacer(modifier = Modifier.height(20.dp)) + + // Icon Section Label + Text( + text = stringResource(R.string.module_shortcut_icon_label), + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = 12.dp) + ) + + // Icon Picker + OutlinedButton( + onClick = { launcher.launch("image/*") }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.weight(1f) + ) { + // Icon Preview Box + val bitmap = remember(iconUri) { + Shortcut.loadShortcutBitmap(context, iconUri) + } + + Box( + modifier = Modifier + .size(56.dp) + .clip(RoundedCornerShape(12.dp)) + .background( + if (bitmap != null) + MaterialTheme.colorScheme.surfaceVariant + else + MaterialTheme.colorScheme.primaryContainer + ) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline.copy(alpha = 0.2f), + shape = RoundedCornerShape(12.dp) + ), + contentAlignment = Alignment.Center + ) { + if (bitmap != null) { + Image( + bitmap = bitmap.asImageBitmap(), + contentDescription = "Shortcut icon", + modifier = Modifier + .size(56.dp) + .clip(RoundedCornerShape(12.dp)), + contentScale = ContentScale.Crop + ) + } else { + Icon( + imageVector = Icons.Outlined.Image, + contentDescription = null, + modifier = Modifier.size(28.dp), + tint = MaterialTheme.colorScheme.onPrimaryContainer + ) + } + } + + Spacer(modifier = Modifier.width(16.dp)) + + Column { + Text( + text = if (iconUri != null) stringResource(R.string.module_shortcut_icon_changed) else stringResource(R.string.module_shortcut_pick_icon), + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface + ) + Text( + text = if (iconUri != null) stringResource(R.string.module_shortcut_icon_tap_to_replace) else stringResource(R.string.module_shortcut_icon_select_from_gallery), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + if (iconUri != null) { + IconButton(onClick = { iconUri = null }) { + Icon( + imageVector = Icons.Filled.Close, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(20.dp) + ) + } + } else { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(20.dp) + ) + } + } + } + + Spacer(modifier = Modifier.height(28.dp)) + + // Action Buttons + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically + ) { + TextButton( + onClick = onDismiss, + modifier = Modifier.padding(end = 8.dp) + ) { + Text( + text = stringResource(android.R.string.cancel), + style = MaterialTheme.typography.labelLarge + ) + } + + Button( + onClick = { onConfirm(name, iconUri) }, + enabled = name.isNotBlank(), + shape = RoundedCornerShape(12.dp), + modifier = Modifier.padding(start = 8.dp) + ) { + Text( + text = stringResource(R.string.module_shortcut_add), + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.SemiBold + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/AppProfileConfig.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/AppProfileConfig.kt new file mode 100644 index 000000000000..23413883b190 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/AppProfileConfig.kt @@ -0,0 +1,59 @@ +package com.rifsxd.ksunext.ui.component.profile + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.SwitchItem + +@Composable +fun AppProfileConfig( + modifier: Modifier = Modifier, + fixedName: Boolean, + enabled: Boolean, + profile: Natives.Profile, + onProfileChange: (Natives.Profile) -> Unit, +) { + Column(modifier = modifier) { + if (!fixedName) { + OutlinedTextField( + label = { Text(stringResource(R.string.profile_name)) }, + value = profile.name, + onValueChange = { onProfileChange(profile.copy(name = it)) } + ) + } + + SwitchItem( + title = stringResource(R.string.profile_umount_modules), + summary = stringResource(R.string.profile_umount_modules_summary), + checked = if (enabled) { + profile.umountModules + } else { + Natives.isDefaultUmountModules() + }, + enabled = enabled, + onCheckedChange = { + onProfileChange( + profile.copy( + umountModules = it, + nonRootUseDefault = false + ) + ) + } + ) + } +} + +@Preview +@Composable +private fun AppProfileConfigPreview() { + var profile by remember { mutableStateOf(Natives.Profile("")) } + AppProfileConfig(fixedName = true, enabled = false, profile = profile) { + profile = it + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/RootProfileConfig.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/RootProfileConfig.kt new file mode 100644 index 000000000000..4cc518411483 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/RootProfileConfig.kt @@ -0,0 +1,459 @@ +package com.rifsxd.ksunext.ui.component.profile + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.text.isDigitsOnly +import com.maxkeppeker.sheets.core.models.base.Header +import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState +import com.maxkeppeler.sheets.input.InputDialog +import com.maxkeppeler.sheets.input.models.* +import com.maxkeppeler.sheets.list.ListDialog +import com.maxkeppeler.sheets.list.models.ListOption +import com.maxkeppeler.sheets.list.models.ListSelection +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.profile.Capabilities +import com.rifsxd.ksunext.profile.Groups +import com.rifsxd.ksunext.ui.component.rememberCustomDialog +import com.rifsxd.ksunext.ui.util.isSepolicyValid + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RootProfileConfig( + modifier: Modifier = Modifier, + fixedName: Boolean, + profile: Natives.Profile, + onProfileChange: (Natives.Profile) -> Unit, +) { + Column(modifier = modifier) { + if (!fixedName) { + OutlinedTextField( + label = { Text(stringResource(R.string.profile_name)) }, + value = profile.name, + onValueChange = { onProfileChange(profile.copy(name = it)) } + ) + } + + var expanded by remember { mutableStateOf(false) } + val currentNamespace = when (profile.namespace) { + Natives.Profile.Namespace.INHERITED.ordinal -> stringResource(R.string.profile_namespace_inherited) + Natives.Profile.Namespace.GLOBAL.ordinal -> stringResource(R.string.profile_namespace_global) + Natives.Profile.Namespace.INDIVIDUAL.ordinal -> stringResource(R.string.profile_namespace_individual) + else -> stringResource(R.string.profile_namespace_inherited) + } + ListItem(headlineContent = { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded } + ) { + OutlinedTextField( + modifier = Modifier + .menuAnchor(MenuAnchorType.PrimaryNotEditable) + .fillMaxWidth(), + readOnly = true, + label = { Text(stringResource(R.string.profile_namespace)) }, + value = currentNamespace, + onValueChange = {}, + trailingIcon = { + if (expanded) Icon(Icons.Filled.ArrowDropUp, null) + else Icon(Icons.Filled.ArrowDropDown, null) + }, + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DropdownMenuItem( + text = { Text(stringResource(R.string.profile_namespace_inherited)) }, + onClick = { + onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.INHERITED.ordinal)) + expanded = false + }, + ) + DropdownMenuItem( + text = { Text(stringResource(R.string.profile_namespace_global)) }, + onClick = { + onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.GLOBAL.ordinal)) + expanded = false + }, + ) + DropdownMenuItem( + text = { Text(stringResource(R.string.profile_namespace_individual)) }, + onClick = { + onProfileChange(profile.copy(namespace = Natives.Profile.Namespace.INDIVIDUAL.ordinal)) + expanded = false + }, + ) + } + } + }) + + UidPanel(uid = profile.uid, label = "uid", onUidChange = { + onProfileChange( + profile.copy( + uid = it, + rootUseDefault = false + ) + ) + }) + + UidPanel(uid = profile.gid, label = "gid", onUidChange = { + onProfileChange( + profile.copy( + gid = it, + rootUseDefault = false + ) + ) + }) + + val selectedGroups = profile.groups.ifEmpty { listOf(0) }.let { e -> + e.mapNotNull { g -> + Groups.entries.find { it.gid == g } + } + } + GroupsPanel(selectedGroups) { + onProfileChange( + profile.copy( + groups = it.map { group -> group.gid }.ifEmpty { listOf(0) }, + rootUseDefault = false + ) + ) + } + + val selectedCaps = profile.capabilities.mapNotNull { e -> + Capabilities.entries.find { it.cap == e } + } + + CapsPanel(selectedCaps) { + onProfileChange( + profile.copy( + capabilities = it.map { cap -> cap.cap }, + rootUseDefault = false + ) + ) + } + + SELinuxPanel(profile = profile, onSELinuxChange = { domain, rules -> + onProfileChange( + profile.copy( + context = domain, + rules = rules, + rootUseDefault = false + ) + ) + }) + + } +} + +@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) +@Composable +fun GroupsPanel(selected: List, closeSelection: (selection: Set) -> Unit) { + val selectGroupsDialog = rememberCustomDialog { dismiss: () -> Unit -> + val groups = Groups.entries.toTypedArray().sortedWith( + compareBy { if (selected.contains(it)) 0 else 1 } + .then(compareBy { + when (it) { + Groups.ROOT -> 0 + Groups.SYSTEM -> 1 + Groups.SHELL -> 2 + else -> Int.MAX_VALUE + } + }) + .then(compareBy { it.name }) + + ) + val options = groups.map { value -> + ListOption( + titleText = value.display, + subtitleText = value.desc, + selected = selected.contains(value), + ) + } + + val selection = HashSet(selected) + ListDialog( + state = rememberUseCaseState(visible = true, onFinishedRequest = { + closeSelection(selection) + }, onCloseRequest = { + dismiss() + }), + header = Header.Default( + title = stringResource(R.string.profile_groups), + ), + selection = ListSelection.Multiple( + showCheckBoxes = true, + options = options, + maxChoices = 32, // Kernel only supports 32 groups at most + ) { indecies, _ -> + // Handle selection + selection.clear() + indecies.forEach { index -> + val group = groups[index] + selection.add(group) + } + } + ) + } + + OutlinedCard( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + + Column( + modifier = Modifier + .fillMaxSize() + .clickable { + selectGroupsDialog.show() + } + .padding(16.dp) + ) { + Text(stringResource(R.string.profile_groups)) + FlowRow { + selected.forEach { group -> + AssistChip( + modifier = Modifier.padding(3.dp), + onClick = { /*TODO*/ }, + label = { Text(group.display) }) + } + } + } + + } +} + +@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) +@Composable +fun CapsPanel( + selected: Collection, + closeSelection: (selection: Set) -> Unit +) { + val selectCapabilitiesDialog = rememberCustomDialog { dismiss -> + val caps = Capabilities.entries.toTypedArray().sortedWith( + compareBy { if (selected.contains(it)) 0 else 1 } + .then(compareBy { it.name }) + ) + val options = caps.map { value -> + ListOption( + titleText = value.display, + subtitleText = value.desc, + selected = selected.contains(value), + ) + } + + val selection = HashSet(selected) + ListDialog( + state = rememberUseCaseState(visible = true, onFinishedRequest = { + closeSelection(selection) + }, onCloseRequest = { + dismiss() + }), + header = Header.Default( + title = stringResource(R.string.profile_capabilities), + ), + selection = ListSelection.Multiple( + showCheckBoxes = true, + options = options + ) { indecies, _ -> + // Handle selection + selection.clear() + indecies.forEach { index -> + val group = caps[index] + selection.add(group) + } + } + ) + } + + OutlinedCard( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + + Column( + modifier = Modifier + .fillMaxSize() + .clickable { + selectCapabilitiesDialog.show() + } + .padding(16.dp) + ) { + Text(stringResource(R.string.profile_capabilities)) + FlowRow { + selected.forEach { group -> + AssistChip( + modifier = Modifier.padding(3.dp), + onClick = { /*TODO*/ }, + label = { Text(group.display) }) + } + } + } + + } +} + +@Composable +private fun UidPanel(uid: Int, label: String, onUidChange: (Int) -> Unit) { + + ListItem(headlineContent = { + var isError by remember { + mutableStateOf(false) + } + var lastValidUid by remember { + mutableIntStateOf(uid) + } + val keyboardController = LocalSoftwareKeyboardController.current + + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + label = { Text(label) }, + value = uid.toString(), + isError = isError, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions(onDone = { + keyboardController?.hide() + }), + onValueChange = { + if (it.isEmpty()) { + onUidChange(0) + return@OutlinedTextField + } + val valid = isTextValidUid(it) + + val targetUid = if (valid) it.toInt() else lastValidUid + if (valid) { + lastValidUid = it.toInt() + } + + onUidChange(targetUid) + + isError = !valid + } + ) + }) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun SELinuxPanel( + profile: Natives.Profile, + onSELinuxChange: (domain: String, rules: String) -> Unit +) { + val editSELinuxDialog = rememberCustomDialog { dismiss -> + var domain by remember { mutableStateOf(profile.context) } + var rules by remember { mutableStateOf(profile.rules) } + + val inputOptions = listOf( + InputTextField( + text = domain, + header = InputHeader( + title = stringResource(id = R.string.profile_selinux_domain), + ), + type = InputTextFieldType.OUTLINED, + required = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Ascii, + imeAction = ImeAction.Next + ), + resultListener = { + domain = it ?: "" + }, + validationListener = { value -> + // value can be a-zA-Z0-9_ + val regex = Regex("^[a-z_]+:[a-z0-9_]+:[a-z0-9_]+(:[a-z0-9_]+)?$") + if (value?.matches(regex) == true) ValidationResult.Valid + else ValidationResult.Invalid("Domain must be in the format of \"user:role:type:level\"") + } + ), + InputTextField( + text = rules, + header = InputHeader( + title = stringResource(id = R.string.profile_selinux_rules), + ), + type = InputTextFieldType.OUTLINED, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Ascii, + ), + singleLine = false, + resultListener = { + rules = it ?: "" + }, + validationListener = { value -> + if (isSepolicyValid(value)) ValidationResult.Valid + else ValidationResult.Invalid("SELinux rules is invalid!") + } + ) + ) + + InputDialog( + state = rememberUseCaseState(visible = true, + onFinishedRequest = { + onSELinuxChange(domain, rules) + }, + onCloseRequest = { + dismiss() + }), + header = Header.Default( + title = stringResource(R.string.profile_selinux_context), + ), + selection = InputSelection( + input = inputOptions, + onPositiveClick = { result -> + // Handle selection + }, + ) + ) + } + + ListItem(headlineContent = { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .clickable { + editSELinuxDialog.show() + }, + enabled = false, + colors = OutlinedTextFieldDefaults.colors( + disabledTextColor = MaterialTheme.colorScheme.onSurface, + disabledBorderColor = MaterialTheme.colorScheme.outline, + disabledPlaceholderColor = MaterialTheme.colorScheme.onSurfaceVariant, + disabledLabelColor = MaterialTheme.colorScheme.onSurfaceVariant + ), + label = { Text(text = stringResource(R.string.profile_selinux_context)) }, + value = profile.context, + onValueChange = { } + ) + }) +} + +@Preview +@Composable +private fun RootProfileConfigPreview() { + var profile by remember { mutableStateOf(Natives.Profile("")) } + RootProfileConfig(fixedName = true, profile = profile) { + profile = it + } +} + +private fun isTextValidUid(text: String): Boolean { + return text.isNotEmpty() && text.isDigitsOnly() && text.toInt() >= 0 +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/TemplateConfig.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/TemplateConfig.kt new file mode 100644 index 000000000000..a3fbacef06e9 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/component/profile/TemplateConfig.kt @@ -0,0 +1,105 @@ +package com.rifsxd.ksunext.ui.component.profile + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ReadMore +import androidx.compose.material.icons.filled.ArrowDropDown +import androidx.compose.material.icons.filled.ArrowDropUp +import androidx.compose.material.icons.filled.Create +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.util.listAppProfileTemplates +import com.rifsxd.ksunext.ui.util.setSepolicy +import com.rifsxd.ksunext.ui.viewmodel.getTemplateInfoById + +/** + * @author weishu + * @date 2023/10/21. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TemplateConfig( + profile: Natives.Profile, + onViewTemplate: (id: String) -> Unit = {}, + onManageTemplate: () -> Unit = {}, + onProfileChange: (Natives.Profile) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + var template by rememberSaveable { + mutableStateOf(profile.rootTemplate ?: "") + } + val profileTemplates = listAppProfileTemplates() + val noTemplates = profileTemplates.isEmpty() + + ListItem(headlineContent = { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = it }, + ) { + OutlinedTextField( + modifier = Modifier + .menuAnchor(MenuAnchorType.PrimaryNotEditable) + .fillMaxWidth(), + readOnly = true, + label = { Text(stringResource(R.string.profile_template)) }, + value = template.ifEmpty { "None" }, + onValueChange = {}, + trailingIcon = { + if (noTemplates) { + IconButton( + onClick = onManageTemplate + ) { + Icon(Icons.Filled.Create, null) + } + } else if (expanded) Icon(Icons.Filled.ArrowDropUp, null) + else Icon(Icons.Filled.ArrowDropDown, null) + }, + ) + if (profileTemplates.isEmpty()) { + return@ExposedDropdownMenuBox + } + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + profileTemplates.forEach { tid -> + val templateInfo = + getTemplateInfoById(tid) ?: return@forEach + DropdownMenuItem( + text = { Text(tid) }, + onClick = { + template = tid + if (setSepolicy(tid, templateInfo.rules.joinToString("\n"))) { + onProfileChange( + profile.copy( + rootTemplate = tid, + rootUseDefault = false, + uid = templateInfo.uid, + gid = templateInfo.gid, + groups = templateInfo.groups, + capabilities = templateInfo.capabilities, + context = templateInfo.context, + namespace = templateInfo.namespace, + ) + ) + } + expanded = false + }, + trailingIcon = { + IconButton(onClick = { + onViewTemplate(tid) + }) { + Icon(Icons.AutoMirrored.Filled.ReadMore, null) + } + } + ) + } + } + } + }) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/AppProfile.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/AppProfile.kt new file mode 100644 index 000000000000..5d6bdb2d1353 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/AppProfile.kt @@ -0,0 +1,398 @@ +package com.rifsxd.ksunext.ui.screen + +import androidx.annotation.StringRes +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.AccountCircle +import androidx.compose.material.icons.filled.AdminPanelSettings +import androidx.compose.material.icons.filled.Android +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import androidx.lifecycle.viewmodel.compose.viewModel +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.AppProfileTemplateScreenDestination +import com.ramcosta.composedestinations.generated.destinations.TemplateEditorScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.SwitchItem +import com.rifsxd.ksunext.ui.component.profile.AppProfileConfig +import com.rifsxd.ksunext.ui.component.profile.RootProfileConfig +import com.rifsxd.ksunext.ui.component.profile.TemplateConfig +import com.rifsxd.ksunext.ui.util.* +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel +import com.rifsxd.ksunext.ui.viewmodel.getTemplateInfoById +import kotlinx.coroutines.launch + +/** + * @author weishu + * @date 2023/5/16. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun AppProfileScreen( + navigator: DestinationsNavigator, + appInfo: SuperUserViewModel.AppInfo, +) { + val context = LocalContext.current + val snackBarHost = LocalSnackbarHost.current + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + val scope = rememberCoroutineScope() + val viewModel: SuperUserViewModel = viewModel() + val failToUpdateAppProfile = stringResource(R.string.failed_to_update_app_profile).format(appInfo.label) + val failToUpdateSepolicy = stringResource(R.string.failed_to_update_sepolicy).format(appInfo.label) + val suNotAllowed = stringResource(R.string.su_not_allowed).format(appInfo.label) + + val packageName = appInfo.packageName + val initialProfile = Natives.getAppProfile(packageName, appInfo.uid) + if (initialProfile.allowSu) { + initialProfile.rules = getSepolicy(packageName) + } + var profile by rememberSaveable { + mutableStateOf(initialProfile) + } + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { paddingValues -> + AppProfileInner( + modifier = Modifier + .padding(paddingValues) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()), + packageName = appInfo.packageName, + appLabel = appInfo.label, + appIcon = { + AsyncImage( + model = ImageRequest.Builder(context).data(appInfo.packageInfo).crossfade(true).build(), + contentDescription = appInfo.label, + modifier = Modifier + .padding(4.dp) + .width(48.dp) + .height(48.dp) + ) + }, + profile = profile, + onViewTemplate = { + getTemplateInfoById(it)?.let { info -> + navigator.navigate(TemplateEditorScreenDestination(info)) + } + }, + onManageTemplate = { + navigator.navigate(AppProfileTemplateScreenDestination()) + }, + onProfileChange = { + scope.launch { + if (it.allowSu) { + // sync with allowlist.c - forbid_system_uid + if (appInfo.uid < 2000 && appInfo.uid != 1000) { + snackBarHost.showSnackbar(suNotAllowed) + return@launch + } + if (!it.rootUseDefault && it.rules.isNotEmpty() && !setSepolicy(profile.name, it.rules)) { + snackBarHost.showSnackbar(failToUpdateSepolicy) + return@launch + } + } + if (!Natives.setAppProfile(it)) { + snackBarHost.showSnackbar(failToUpdateAppProfile.format(appInfo.uid)) + } else { + profile = it + viewModel.updateAppProfile(packageName, it) + } + } + }, + ) + } +} + +@Composable +private fun AppProfileInner( + modifier: Modifier = Modifier, + packageName: String, + appLabel: String, + appIcon: @Composable () -> Unit, + profile: Natives.Profile, + onViewTemplate: (id: String) -> Unit = {}, + onManageTemplate: () -> Unit = {}, + onProfileChange: (Natives.Profile) -> Unit, +) { + val isRootGranted = profile.allowSu + + Column(modifier = modifier) { + AppMenuBox(packageName) { + ListItem( + headlineContent = { Text( + text = appLabel, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) }, + supportingContent = { Text(packageName) }, + leadingContent = appIcon, + ) + } + + SwitchItem( + icon = Icons.Filled.AdminPanelSettings, + title = stringResource(id = R.string.superuser), + checked = isRootGranted, + onCheckedChange = { onProfileChange(profile.copy(allowSu = it)) }, + ) + + Crossfade(targetState = isRootGranted, label = "") { current -> + Column( + modifier = Modifier.padding(bottom = 6.dp + 48.dp + 6.dp /* SnackBar height */) + ) { + if (current) { + val initialMode = if (profile.rootUseDefault) { + Mode.Default + } else if (profile.rootTemplate != null) { + Mode.Template + } else { + Mode.Custom + } + var mode by rememberSaveable { + mutableStateOf(initialMode) + } + ProfileBox(mode, true) { + // template mode shouldn't change profile here! + if (it == Mode.Default || it == Mode.Custom) { + onProfileChange(profile.copy(rootUseDefault = it == Mode.Default)) + } + mode = it + } + Crossfade(targetState = mode, label = "") { currentMode -> + if (currentMode == Mode.Template) { + TemplateConfig( + profile = profile, + onViewTemplate = onViewTemplate, + onManageTemplate = onManageTemplate, + onProfileChange = onProfileChange + ) + } else if (mode == Mode.Custom) { + RootProfileConfig( + fixedName = true, + profile = profile, + onProfileChange = onProfileChange + ) + } + } + } else { + val mode = if (profile.nonRootUseDefault) Mode.Default else Mode.Custom + ProfileBox(mode, false) { + onProfileChange(profile.copy(nonRootUseDefault = (it == Mode.Default))) + } + Crossfade(targetState = mode, label = "") { currentMode -> + val modifyEnabled = currentMode == Mode.Custom + AppProfileConfig( + fixedName = true, + profile = profile, + enabled = modifyEnabled, + onProfileChange = onProfileChange + ) + } + } + } + } + } +} + +private enum class Mode(@param:StringRes private val res: Int) { + Default(R.string.profile_default), Template(R.string.profile_template), Custom(R.string.profile_custom); + + val text: String + @Composable get() = stringResource(res) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.profile), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Composable +private fun ProfileBox( + mode: Mode, + hasTemplate: Boolean, + onModeChange: (Mode) -> Unit, +) { + ListItem( + headlineContent = { Text( + text = stringResource(R.string.profile), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) }, + supportingContent = { Text(mode.text) }, + leadingContent = { Icon(Icons.Filled.AccountCircle, null) }, + ) + HorizontalDivider(thickness = Dp.Hairline) + ListItem(headlineContent = { + Row( + modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly + ) { + FilterChip( + selected = mode == Mode.Default, + label = { Text(stringResource(R.string.profile_default)) }, + onClick = { onModeChange(Mode.Default) }, + ) + if (hasTemplate) { + FilterChip( + selected = mode == Mode.Template, + label = { Text(stringResource(R.string.profile_template)) }, + onClick = { onModeChange(Mode.Template) }, + ) + } + FilterChip( + selected = mode == Mode.Custom, + label = { Text(stringResource(R.string.profile_custom)) }, + onClick = { onModeChange(Mode.Custom) }, + ) + } + }) +} + +@Composable +private fun AppMenuBox(packageName: String, content: @Composable () -> Unit) { + + var expanded by remember { mutableStateOf(false) } + var touchPoint: Offset by remember { mutableStateOf(Offset.Zero) } + val density = LocalDensity.current + + BoxWithConstraints( + Modifier + .fillMaxSize() + .pointerInput(Unit) { + detectTapGestures { + touchPoint = it + expanded = true + } + } + ) { + + content() + + val (offsetX, offsetY) = with(density) { + (touchPoint.x.toDp()) to (touchPoint.y.toDp()) + } + + DropdownMenu( + expanded = expanded, + offset = DpOffset(offsetX, -offsetY), + onDismissRequest = { + expanded = false + }, + ) { + DropdownMenuItem( + text = { Text(stringResource(id = R.string.launch_app)) }, + onClick = { + expanded = false + launchApp(packageName) + }, + ) + DropdownMenuItem( + text = { Text(stringResource(id = R.string.force_stop_app)) }, + onClick = { + expanded = false + forceStopApp(packageName) + }, + ) + DropdownMenuItem( + text = { Text(stringResource(id = R.string.restart_app)) }, + onClick = { + expanded = false + restartApp(packageName) + }, + ) + } + } + + +} + +@Preview +@Composable +private fun AppProfilePreview() { + var profile by remember { mutableStateOf(Natives.Profile("")) } + AppProfileInner( + packageName = "icu.nullptr.test", + appLabel = "Test", + appIcon = { Icon(Icons.Filled.Android, null) }, + profile = profile, + onProfileChange = { + profile = it + }, + ) +} + diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BackupRestore.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BackupRestore.kt new file mode 100644 index 000000000000..de718e0ee4b9 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BackupRestore.kt @@ -0,0 +1,422 @@ +package com.rifsxd.ksunext.ui.screen + +import android.app.Activity.RESULT_OK +import android.content.Intent +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Backup +import androidx.compose.material.icons.filled.Restore +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.component.rememberLoadingDialog +import com.rifsxd.ksunext.ui.rememberScrollConnection +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost +import com.rifsxd.ksunext.ui.util.reboot +import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.io.SuFile +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.text.SimpleDateFormat +import java.util.* + +private const val BUSYBOX = "/data/adb/ksu/bin/busybox" + +/** + * Backs up /data/adb/modules as a tar into [destUri]. + * Tar is written to cacheDir, streamed to the user-chosen URI, then deleted. + */ +private suspend fun backupModulesToUri(uri: Uri): Boolean = withContext(Dispatchers.IO) { + val modulesDir = SuFile("/data/adb/modules") + if (modulesDir.listFiles()?.isEmpty() != false) return@withContext false + + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val tmpPath = "${ksuApp.cacheDir}/modules_backup_$timestamp.tar" + + val tarCmd = "$BUSYBOX tar -cpf '$tmpPath' -C /data/adb/modules \$(ls /data/adb/modules)" + if (!ShellUtils.fastCmdResult(tarCmd)) return@withContext false + + return@withContext try { + SuFile(tmpPath).newInputStream().use { input -> + ksuApp.contentResolver.openOutputStream(uri)?.use { out -> + input.copyTo(out) + } + } + true + } catch (e: Exception) { + e.printStackTrace() + false + } finally { + SuFile(tmpPath).delete() + } +} + +/** + * Backs up /data/adb/ksu/.allowlist as a tar into [destUri]. + * Tar is written to cacheDir, streamed to the user-chosen URI, then deleted. + */ +private suspend fun backupAllowlistToUri(uri: Uri): Boolean = withContext(Dispatchers.IO) { + if (!SuFile("/data/adb/ksu/.allowlist").exists()) return@withContext false + + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val tmpPath = "${ksuApp.cacheDir}/allowlist_backup_$timestamp.tar" + + val tarCmd = "$BUSYBOX tar -cpf '$tmpPath' -C /data/adb/ksu .allowlist" + if (!ShellUtils.fastCmdResult(tarCmd)) return@withContext false + + return@withContext try { + SuFile(tmpPath).newInputStream().use { input -> + ksuApp.contentResolver.openOutputStream(uri)?.use { out -> + input.copyTo(out) + } + } + true + } catch (e: Exception) { + e.printStackTrace() + false + } finally { + SuFile(tmpPath).delete() + } +} + +/** + * Restores modules from a tar at [srcUri]. + * URI is streamed into cacheDir, extracted, then the tmp file is deleted. + */ +private suspend fun restoreModulesFromUri(uri: Uri): Boolean = withContext(Dispatchers.IO) { + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val tmpPath = "${ksuApp.cacheDir}/modules_restore_$timestamp.tar" + + try { + ksuApp.contentResolver.openInputStream(uri)?.use { input -> + SuFile(tmpPath).newOutputStream().use { out -> + input.copyTo(out) + } + } + } catch (e: Exception) { + e.printStackTrace() + return@withContext false + } + + val extractCmd = "$BUSYBOX tar -xpf '$tmpPath' -C /data/adb/modules_update" + val result = ShellUtils.fastCmdResult(extractCmd) + + SuFile(tmpPath).delete() + return@withContext result +} + +/** + * Restores allowlist from a tar at [srcUri]. + * URI is streamed into cacheDir, extracted, then the tmp file is deleted. + */ +private suspend fun restoreAllowlistFromUri(uri: Uri): Boolean = withContext(Dispatchers.IO) { + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val tmpPath = "${ksuApp.cacheDir}/allowlist_restore_$timestamp.tar" + + try { + ksuApp.contentResolver.openInputStream(uri)?.use { input -> + SuFile(tmpPath).newOutputStream().use { out -> + input.copyTo(out) + } + } + } catch (e: Exception) { + e.printStackTrace() + return@withContext false + } + + val extractCmd = "$BUSYBOX tar -xpf '$tmpPath' -C /data/adb/ksu" + val result = ShellUtils.fastCmdResult(extractCmd) + + SuFile(tmpPath).delete() + return@withContext result +} + +// ───────────────────────────────────────────────────────────────────────────── + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun BackupRestoreScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val snackBarHost = LocalSnackbarHost.current + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { + SnackbarHost( + hostState = snackBarHost, + modifier = Modifier.padding( + bottom = navBarPadding + ) + ) + }, + contentWindowInsets = WindowInsets.safeDrawing.only( + WindowInsetsSides.Top + WindowInsetsSides.Horizontal + ) + ) { paddingValues -> + val loadingDialog = rememberLoadingDialog() + val context = LocalContext.current + val scope = rememberCoroutineScope() + + // Track which backup/restore type was last requested so the single + // launcher knows what to do when the file-picker returns. + val lastBackupType = rememberSaveable { mutableStateOf("module") } + val lastRestoreType = rememberSaveable { mutableStateOf("module") } + val lastBackupName = rememberSaveable { mutableStateOf("") } + + val backupSuccess = stringResource(R.string.backup_success) + val backupFailed = stringResource(R.string.backup_failed) + val restoreSuccess = stringResource(R.string.restore_success) + val restoreFailed = stringResource(R.string.restore_failed) + val reboot = stringResource(R.string.reboot) + + // ── CREATE DOCUMENT launcher (backup) ──────────────────────────────── + val createBackupLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode != RESULT_OK) return@rememberLauncherForActivityResult + val uri = result.data?.data ?: return@rememberLauncherForActivityResult + scope.launch { + val ok = loadingDialog.withLoading { + if (lastBackupType.value == "allowlist") { + backupAllowlistToUri(uri) + } else { + backupModulesToUri(uri) + } + } + snackBarHost.showSnackbar( + message = if (ok) backupSuccess else backupFailed, + duration = SnackbarDuration.Short + ) + } + } + + // ── GET CONTENT launcher (restore) ─────────────────────────────────── + val openRestoreLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode != RESULT_OK) return@rememberLauncherForActivityResult + val uri = result.data?.data ?: return@rememberLauncherForActivityResult + scope.launch { + val ok = loadingDialog.withLoading { + if (lastRestoreType.value == "allowlist") { + restoreAllowlistFromUri(uri) + } else { + restoreModulesFromUri(uri) + } + } + if (ok && lastRestoreType.value == "module") { + val result = snackBarHost.showSnackbar( + message = restoreSuccess, + actionLabel = reboot, + duration = SnackbarDuration.Long + ) + if (result == SnackbarResult.ActionPerformed) { + reboot() + } + } else { + snackBarHost.showSnackbar( + message = if (ok) restoreSuccess else restoreFailed, + duration = SnackbarDuration.Short + ) + } + } + } + + // ── Content ─────────────────────────────────────────────────────────── + Column( + modifier = Modifier + .padding(paddingValues) + .let { modifier -> + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = bottomBarScrollState?.let { + rememberScrollConnection( + isScrollingDown = it.isScrollingDown, + scrollOffset = it.scrollOffset, + previousScrollOffset = it.previousScrollOffset, + threshold = 30f + ) + } + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + ) { + + // ── Module backup ───────────────────────────────────────────────── + val moduleBackup = stringResource(R.string.module_backup) + ListItem( + leadingContent = { Icon(Icons.Filled.Backup, moduleBackup) }, + headlineContent = { + Text( + text = moduleBackup, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + modifier = Modifier.clickable { + val ts = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val suggested = "modules_backup_$ts.tar" + lastBackupName.value = suggested + lastBackupType.value = "module" + createBackupLauncher.launch( + Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/x-tar" + putExtra(Intent.EXTRA_TITLE, suggested) + } + ) + } + ) + + // ── Module restore ──────────────────────────────────────────────── + val moduleRestore = stringResource(R.string.module_restore) + ListItem( + leadingContent = { + Icon( + Icons.Filled.Restore, + moduleRestore, + tint = MaterialTheme.colorScheme.onSurface + ) + }, + headlineContent = { + Text( + text = moduleRestore, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.onSurface + ) + }, + modifier = Modifier.clickable { + lastRestoreType.value = "module" + openRestoreLauncher.launch( + Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/x-tar" + } + ) + } + ) + + HorizontalDivider(thickness = Dp.Hairline) + + // ── Allowlist backup ────────────────────────────────────────────── + val allowlistBackup = stringResource(R.string.allowlist_backup) + ListItem( + leadingContent = { Icon(Icons.Filled.Backup, allowlistBackup) }, + headlineContent = { + Text( + text = allowlistBackup, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + modifier = Modifier.clickable { + val ts = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val suggested = "allowlist_backup_$ts.tar" + lastBackupName.value = suggested + lastBackupType.value = "allowlist" + createBackupLauncher.launch( + Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/x-tar" + putExtra(Intent.EXTRA_TITLE, suggested) + } + ) + } + ) + + // ── Allowlist restore ───────────────────────────────────────────── + val allowlistRestore = stringResource(R.string.allowlist_restore) + ListItem( + leadingContent = { Icon(Icons.Filled.Restore, allowlistRestore) }, + headlineContent = { + Text( + text = allowlistRestore, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + modifier = Modifier.clickable { + lastRestoreType.value = "allowlist" + openRestoreLauncher.launch( + Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/x-tar" + } + ) + } + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.backup_restore), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black + ) + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) + } + }, + windowInsets = WindowInsets.safeDrawing.only( + WindowInsetsSides.Top + WindowInsetsSides.Horizontal + ), + scrollBehavior = scrollBehavior + ) +} + +@Preview +@Composable +private fun BackupPreview() { + BackupRestoreScreen(EmptyDestinationsNavigator) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BottomBarDestination.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BottomBarDestination.kt new file mode 100644 index 000000000000..38c55f167a3c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/BottomBarDestination.kt @@ -0,0 +1,32 @@ +package com.rifsxd.ksunext.ui.screen + +import androidx.annotation.StringRes +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AdminPanelSettings +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Layers +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.outlined.AdminPanelSettings +import androidx.compose.material.icons.outlined.Home +import androidx.compose.material.icons.outlined.Layers +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.ui.graphics.vector.ImageVector +import com.ramcosta.composedestinations.generated.destinations.HomeScreenDestination +import com.ramcosta.composedestinations.generated.destinations.ModuleScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SettingScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SuperUserScreenDestination +import com.ramcosta.composedestinations.spec.DirectionDestinationSpec +import com.rifsxd.ksunext.R + +enum class BottomBarDestination( + val direction: DirectionDestinationSpec, + @param:StringRes val label: Int, + val iconSelected: ImageVector, + val iconNotSelected: ImageVector, + val rootRequired: Boolean, +) { + Home(HomeScreenDestination, R.string.home, Icons.Filled.Home, Icons.Outlined.Home, false), + SuperUser(SuperUserScreenDestination, R.string.superuser, Icons.Filled.AdminPanelSettings, Icons.Outlined.AdminPanelSettings, true), + Module(ModuleScreenDestination, R.string.module, Icons.Filled.Layers, Icons.Outlined.Layers, true), + Settings(SettingScreenDestination, R.string.settings, Icons.Filled.Settings, Icons.Outlined.Settings, false) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Customization.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Customization.kt new file mode 100644 index 000000000000..2870ab91d7a0 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Customization.kt @@ -0,0 +1,332 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import android.content.Intent +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Contrast +import androidx.compose.material.icons.filled.Translate +import androidx.compose.material.icons.filled.ViewCarousel +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.content.edit +import androidx.lifecycle.compose.dropUnlessResumed +import com.rifsxd.ksunext.ui.MainActivity +import com.maxkeppeker.sheets.core.models.base.Header +import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState +import com.maxkeppeler.sheets.list.ListDialog +import com.maxkeppeler.sheets.list.models.ListOption +import com.maxkeppeler.sheets.list.models.ListSelection +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.component.SwitchItem +import com.rifsxd.ksunext.ui.component.rememberCustomDialog +import com.rifsxd.ksunext.ui.util.refreshActivity +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost +import com.rifsxd.ksunext.ui.util.LocaleHelper + +/** + * @author rifsxd + * @date 2025/6/1. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun CustomizationScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + val snackBarHost = LocalSnackbarHost.current + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { + navigator.popBackStack() + }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { paddingValues -> + + Column( + modifier = Modifier + .padding(paddingValues) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + ) { + + val context = LocalContext.current + val scope = rememberCoroutineScope() + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + // Track language state with current app locale + var currentAppLocale by remember { mutableStateOf(LocaleHelper.getCurrentAppLocale(context)) } + + // Listen for preference changes + LaunchedEffect(Unit) { + currentAppLocale = LocaleHelper.getCurrentAppLocale(context) + } + + // Language setting with selection dialog + val languageDialog = rememberCustomDialog { dismiss -> + // Check if should use system language settings + if (LocaleHelper.useSystemLanguageSettings) { + // Android 13+ - Jump to system settings + LocaleHelper.launchSystemLanguageSettings(context) + dismiss() + } else { + // Android < 13 - Show app language selector + // Dynamically detect supported locales from resources + val supportedLocales = remember { + val locales = mutableListOf() + + // Add system default first + locales.add(java.util.Locale.ROOT) // This will represent "System Default" + + // Dynamically detect available locales by checking resource directories + val resourceDirs = listOf( + "ar", "bg", "de", "fa", "fr", "hu", "in", "it", + "ja", "ko", "pl", "pt-rBR", "ru", "th", "tr", + "uk", "vi", "zh-rCN", "zh-rTW" + ) + + resourceDirs.forEach { dir -> + try { + val locale = when { + dir.contains("-r") -> { + val parts = dir.split("-r") + java.util.Locale.Builder() + .setLanguage(parts[0]) + .setRegion(parts[1]) + .build() + } + else -> java.util.Locale.Builder() + .setLanguage(dir) + .build() + } + + // Test if this locale has translated resources + val config = android.content.res.Configuration() + config.setLocale(locale) + val localizedContext = context.createConfigurationContext(config) + + // Try to get a translated string to verify the locale is supported + val testString = localizedContext.getString(R.string.settings_language) + val defaultString = context.getString(R.string.settings_language) + + // If the string is different or it's English, it's supported + if (testString != defaultString || locale.language == "en") { + locales.add(locale) + } + } catch (_: Exception) { + // Skip unsupported locales + } + } + + // Sort by display name + val sortedLocales = locales.drop(1).sortedBy { it.getDisplayName(it) } + mutableListOf().apply { + add(locales.first()) // System default first + addAll(sortedLocales) + } + } + + val allOptions = supportedLocales.map { locale -> + val tag = if (locale == java.util.Locale.ROOT) { + "system" + } else if (locale.country.isEmpty()) { + locale.language + } else { + "${locale.language}_${locale.country}" + } + + val displayName = if (locale == java.util.Locale.ROOT) { + context.getString(R.string.system_default) + } else { + locale.getDisplayName(locale) + } + + tag to displayName + } + + val currentLocale = prefs.getString("app_locale", "system") ?: "system" + val options = allOptions.map { (tag, displayName) -> + ListOption( + titleText = displayName, + selected = currentLocale == tag + ) + } + + var selectedIndex by remember { + mutableIntStateOf(allOptions.indexOfFirst { (tag, _) -> currentLocale == tag }) + } + + ListDialog( + state = rememberUseCaseState( + visible = true, + onFinishedRequest = { + if (selectedIndex >= 0 && selectedIndex < allOptions.size) { + val newLocale = allOptions[selectedIndex].first + prefs.edit { putString("app_locale", newLocale) } + + // Update local state immediately + currentAppLocale = LocaleHelper.getCurrentAppLocale(context) + + // Apply locale change immediately for Android < 13 + refreshActivity(context) + } + dismiss() + }, + onCloseRequest = { + dismiss() + } + ), + header = Header.Default( + title = stringResource(R.string.settings_language), + ), + selection = ListSelection.Single( + showRadioButtons = true, + options = options + ) { index, _ -> + selectedIndex = index + } + ) + } + } + + val language = stringResource(id = R.string.settings_language) + + // Compute display name based on current app locale (similar to the reference implementation) + val currentLanguageDisplay = remember(currentAppLocale) { + val locale = currentAppLocale + if (locale != null) { + locale.getDisplayName(locale) + } else { + context.getString(R.string.system_default) + } + } + + ListItem( + leadingContent = { Icon(Icons.Filled.Translate, language) }, + headlineContent = { Text( + text = language, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + ) }, + supportingContent = { Text(currentLanguageDisplay) }, + modifier = Modifier.clickable { + languageDialog.show() + } + ) + + var useBanner by rememberSaveable { + mutableStateOf( + prefs.getBoolean("use_banner", true) + ) + } + if (ksuVersion != null) { + SwitchItem( + icon = Icons.Filled.ViewCarousel, + title = stringResource(id = R.string.settings_banner), + summary = stringResource(id = R.string.settings_banner_summary), + checked = useBanner + ) { + prefs.edit { putBoolean("use_banner", it) } + useBanner = it + } + } + + var enableAmoled by rememberSaveable { + mutableStateOf( + prefs.getBoolean("enable_amoled", false) + ) + } + if (isSystemInDarkTheme()) { + val activity = LocalContext.current as? MainActivity + SwitchItem( + icon = Icons.Filled.Contrast, + title = stringResource(id = R.string.settings_amoled_mode), + summary = stringResource(id = R.string.settings_amoled_mode_summary), + checked = enableAmoled + ) { checked -> + activity?.setAmoledMode(checked) + enableAmoled = checked + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { Text( + text = stringResource(R.string.customization), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) }, navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Preview +@Composable +private fun CustomizationPreview() { + CustomizationScreen(EmptyDestinationsNavigator) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Developer.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Developer.kt new file mode 100644 index 000000000000..acd0bce784e2 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Developer.kt @@ -0,0 +1,156 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.DeveloperMode +import androidx.compose.material.icons.filled.Web +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.core.content.edit +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.component.SwitchItem +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost + +/** + * @author rifsxd + * @date 2025/6/15. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun DeveloperScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + val snackBarHost = LocalSnackbarHost.current + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { paddingValues -> + + Column( + modifier = Modifier + .padding(paddingValues) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + ) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + // --- Developer Options Switch --- + var developerOptionsEnabled by rememberSaveable { + mutableStateOf( + prefs.getBoolean("enable_developer_options", false) + ) + } + if (ksuVersion != null) { + SwitchItem( + icon = Icons.Filled.DeveloperMode, + title = stringResource(id = R.string.enable_developer_options), + summary = stringResource(id = R.string.enable_developer_options_summary), + checked = developerOptionsEnabled + ) { + prefs.edit { putBoolean("enable_developer_options", it) } + developerOptionsEnabled = it + } + } + + var enableWebDebugging by rememberSaveable { + mutableStateOf( + prefs.getBoolean("enable_web_debugging", false) + ) + } + if (ksuVersion != null) { + SwitchItem( + enabled = developerOptionsEnabled, + icon = Icons.Filled.Web, + title = stringResource(id = R.string.enable_web_debugging), + summary = stringResource(id = R.string.enable_web_debugging_summary), + checked = enableWebDebugging + ) { + prefs.edit { putBoolean("enable_web_debugging", it) } + enableWebDebugging = it + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { Text( + text = stringResource(R.string.developer), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) }, navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Preview +@Composable +private fun DeveloperPreview() { + DeveloperScreen(EmptyDestinationsNavigator) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ExecuteModuleAction.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ExecuteModuleAction.kt new file mode 100644 index 000000000000..8c20cf7ec7bf --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ExecuteModuleAction.kt @@ -0,0 +1,182 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import android.os.Environment +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Save +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.key +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.KeyEventBlocker +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost +import com.rifsxd.ksunext.ui.util.runModuleAction +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + +@Composable +@Destination +fun ExecuteModuleActionScreen(navigator: DestinationsNavigator, moduleId: String) { + var text by rememberSaveable { mutableStateOf("") } + var tempText: String + val logContent = rememberSaveable { StringBuilder() } + val snackBarHost = LocalSnackbarHost.current + val scope = rememberCoroutineScope() + val scrollState = rememberScrollState() + var actionResult: Boolean + var isActionRunning by rememberSaveable { mutableStateOf(true) } + + val context = LocalContext.current + // Read developer options from SharedPreferences + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + val view = LocalView.current + DisposableEffect(isActionRunning) { + view.keepScreenOn = isActionRunning + onDispose { + view.keepScreenOn = false + } + } + + BackHandler(enabled = isActionRunning) { + // Disable back button if action is running + } + + LaunchedEffect(Unit) { + if (text.isNotEmpty()) { + return@LaunchedEffect + } + withContext(Dispatchers.IO) { + runModuleAction( + moduleId = moduleId, + onStdout = { + tempText = "$it\n" + if (tempText.startsWith("")) { // clear command + text = tempText.substring(6) + } else { + text += tempText + } + logContent.append(it).append("\n") + }, + onStderr = { + logContent.append(it).append("\n") + } + ).let { + actionResult = it + } + } + isActionRunning = false + } + + Scaffold( + topBar = { + TopBar( + isActionRunning = isActionRunning, + onBack = dropUnlessResumed { + navigator.popBackStack() + }, + onSave = { + if (!isActionRunning) { + scope.launch { + val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()) + val date = format.format(Date()) + val file = File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + "KernelSU_Next_module_action_log_${date}.log" + ) + file.writeText(logContent.toString()) + snackBarHost.showSnackbar("Log saved to ${file.absolutePath}") + } + } + } + ) + }, + floatingActionButton = { + if (!isActionRunning) { + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } + }, + contentWindowInsets = WindowInsets.safeDrawing, + snackbarHost = { SnackbarHost(snackBarHost) } + ) { innerPadding -> + KeyEventBlocker { + it.key == Key.VolumeDown || it.key == Key.VolumeUp + } + Column( + modifier = Modifier + .fillMaxSize(1f) + .padding(innerPadding) + .verticalScroll(scrollState), + ) { + LaunchedEffect(text) { + scrollState.animateScrollTo(scrollState.maxValue) + } + Text( + modifier = Modifier.padding(8.dp), + text = if (developerOptionsEnabled) logContent.toString() else text, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontFamily = FontFamily.Monospace, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar(isActionRunning: Boolean, onBack: () -> Unit = {}, onSave: () -> Unit = {}) { + TopAppBar( + title = { Text( + text = stringResource(R.string.action), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) }, + navigationIcon = { + IconButton( + onClick = onBack, + enabled = !isActionRunning + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + actions = { + IconButton( + onClick = onSave, + enabled = !isActionRunning + ) { + Icon( + imageVector = Icons.Filled.Save, + contentDescription = stringResource(id = R.string.save_log), + ) + } + } + ) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Flash.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Flash.kt new file mode 100644 index 000000000000..282ea22499da --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Flash.kt @@ -0,0 +1,484 @@ +package com.rifsxd.ksunext.ui.screen + +import android.app.Activity +import android.content.Context +import android.net.Uri +import android.os.Environment +import android.os.Parcelable +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Save +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.key.Key +import androidx.compose.ui.input.key.key +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.ConfirmResult +import com.rifsxd.ksunext.ui.component.KeyEventBlocker +import com.rifsxd.ksunext.ui.component.rememberConfirmDialog +import com.rifsxd.ksunext.ui.theme.GREEN +import com.rifsxd.ksunext.ui.theme.ORANGE +import com.rifsxd.ksunext.ui.theme.RED +import com.rifsxd.ksunext.ui.util.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + +enum class FlashingStatus { + FLASHING, + SUCCESS, + FAILED +} + +fun Context.findActivity(): Activity? = when (this) { + is Activity -> this + is android.content.ContextWrapper -> baseContext.findActivity() + else -> null +} + +// Lets you flash modules sequentially when mutiple zipUris are selected +fun flashModulesSequentially( + uris: List, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): FlashResult { + for (uri in uris) { + flashModule(uri, onStdout, onStderr).apply { + if (code != 0) { + return FlashResult(code, err, showReboot) + } + } + } + return FlashResult(0, "", true) +} + +/** + * @author weishu + * @date 2023/1/1. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +@Destination +fun FlashScreen( + navigator: DestinationsNavigator, + flashIt: FlashIt +) { + + var text by rememberSaveable { mutableStateOf("") } + var tempText: String + val logContent = rememberSaveable { StringBuilder() } + var showFloatAction by rememberSaveable { mutableStateOf(false) } + + val snackBarHost = LocalSnackbarHost.current + val scope = rememberCoroutineScope() + val scrollState = rememberScrollState() + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + var flashing by rememberSaveable { + mutableStateOf(FlashingStatus.FLASHING) + } + + val context = LocalContext.current + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + val activity = context.findActivity() + + val view = LocalView.current + DisposableEffect(flashing) { + view.keepScreenOn = flashing == FlashingStatus.FLASHING + onDispose { + view.keepScreenOn = false + } + } + + BackHandler(enabled = flashing == FlashingStatus.FLASHING) { + // Disable back button if flashing is running + } + + BackHandler(enabled = flashing != FlashingStatus.FLASHING) { + navigator.popBackStack() + } + + val confirmDialog = rememberConfirmDialog() + var confirmed by rememberSaveable { mutableStateOf(flashIt !is FlashIt.FlashModules && flashIt !is FlashIt.FlashAnyKernel) } + var pendingFlashIt by rememberSaveable { mutableStateOf(null) } + var hasFlashed by rememberSaveable { mutableStateOf(false) } + + LaunchedEffect(flashIt) { + when { + flashIt is FlashIt.FlashModules && !confirmed -> { + val uris = flashIt.uris + val moduleNames = + uris.mapIndexed { index, uri -> "\n${index + 1}. ${uri.getFileName(context)}" } + .joinToString("") + val confirmContent = + context.getString(R.string.module_install_prompt_with_name, moduleNames) + val confirmTitle = context.getString(R.string.module) + val result = confirmDialog.awaitConfirm( + title = confirmTitle, + content = confirmContent, + markdown = true + ) + if (result == ConfirmResult.Confirmed) { + confirmed = true + pendingFlashIt = flashIt + } else { + // User cancelled, go back + navigator.popBackStack() + } + } + flashIt is FlashIt.FlashAnyKernel && !confirmed -> { + val name = flashIt.uri.getFileName(context) + val confirmContent = + context.getString(R.string.anykernel_flash_prompt, name) + // reuse the existing label for title + val confirmTitle = context.getString(R.string.flash_anykernel) + val result = confirmDialog.awaitConfirm( + title = confirmTitle, + content = confirmContent, + markdown = true + ) + if (result == ConfirmResult.Confirmed) { + confirmed = true + pendingFlashIt = flashIt + } else { + navigator.popBackStack() + } + } + else -> { + confirmed = true + pendingFlashIt = flashIt + } + } + } + + LaunchedEffect(confirmed, pendingFlashIt) { + if (!confirmed || pendingFlashIt == null || text.isNotEmpty() || hasFlashed) return@LaunchedEffect + hasFlashed = true + withContext(Dispatchers.IO) { + flashIt(pendingFlashIt!!, onStdout = { + tempText = "$it\n" + if (tempText.startsWith("")) { // clear command + text = tempText.substring(6) + } else { + text += tempText + } + logContent.append(it).append("\n") + }, onStderr = { + logContent.append(it).append("\n") + }).apply { + if (code != 0) { + text += "Error code: $code.\n $err Please save and check the log.\n" + } + if (showReboot) { + text += "\n\n\n" + showFloatAction = true + } + flashing = if (code == 0) FlashingStatus.SUCCESS else FlashingStatus.FAILED + } + } + } + + Scaffold( + topBar = { + TopBar( + flashing, + onBack = dropUnlessResumed { + navigator.popBackStack() + }, + onSave = { + scope.launch { + val format = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault()) + val date = format.format(Date()) + val file = File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), + "KernelSU_Next_install_log_${date}.log" + ) + file.writeText(logContent.toString()) + snackBarHost.showSnackbar("Log saved to ${file.absolutePath}") + } + }, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = { + if (flashIt is FlashIt.FlashModules && (flashing == FlashingStatus.SUCCESS)) { + // Reboot button for modules flashing + ExtendedFloatingActionButton( + onClick = { + scope.launch { + withContext(Dispatchers.IO) { + reboot() + } + } + }, + icon = { Icon(Icons.Filled.Refresh, contentDescription = stringResource(R.string.reboot)) }, + text = { Text(text = stringResource(R.string.reboot)) } + ) + } + + if (flashIt is FlashIt.FlashAnyKernel && (flashing == FlashingStatus.SUCCESS)) { + ExtendedFloatingActionButton( + onClick = { + scope.launch { + withContext(Dispatchers.IO) { + reboot() + } + } + }, + icon = { Icon(Icons.Filled.Refresh, contentDescription = stringResource(R.string.reboot)) }, + text = { Text(text = stringResource(R.string.reboot)) } + ) + } + + if (flashIt is FlashIt.FlashAnyKernel && (flashing == FlashingStatus.FAILED)) { + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } + + if (flashIt is FlashIt.FlashModules && (flashing == FlashingStatus.FAILED)) { + // Close button for modules flashing + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } + + if (flashIt is FlashIt.FlashBoot && (flashing == FlashingStatus.SUCCESS || flashing == FlashingStatus.FAILED)) { + val isLocalPatch = flashIt.boot != null && !flashIt.ota + val isDirectOrOta = flashIt.boot == null || flashIt.ota + + if (flashing == FlashingStatus.FAILED) { + // Always show close on failure + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } else if (flashing == FlashingStatus.SUCCESS) { + if (isLocalPatch) { + // Local patching: show only Close + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } else if (isDirectOrOta) { + // Direct install or OTA inactive slot: show only Reboot + ExtendedFloatingActionButton( + onClick = { + scope.launch { + withContext(Dispatchers.IO) { + reboot() + } + } + }, + icon = { Icon(Icons.Filled.Refresh, contentDescription = stringResource(R.string.reboot)) }, + text = { Text(text = stringResource(R.string.reboot)) } + ) + } + } + } + + if ((flashIt is FlashIt.FlashUninstall || flashIt is FlashIt.FlashRestore) && (flashing == FlashingStatus.SUCCESS || flashing == FlashingStatus.FAILED)) { + if (flashing == FlashingStatus.SUCCESS) { + // Show reboot button on successful uninstall or restore + ExtendedFloatingActionButton( + onClick = { + scope.launch { + withContext(Dispatchers.IO) { + reboot() + } + } + }, + icon = { Icon(Icons.Filled.Refresh, contentDescription = stringResource(R.string.reboot)) }, + text = { Text(text = stringResource(R.string.reboot)) } + ) + } else { + // Show close button on failure + ExtendedFloatingActionButton( + text = { Text(text = stringResource(R.string.close)) }, + icon = { Icon(Icons.Filled.Close, contentDescription = null) }, + onClick = { + navigator.popBackStack() + } + ) + } + } + }, + contentWindowInsets = WindowInsets.safeDrawing, + snackbarHost = { SnackbarHost(hostState = snackBarHost) } + ) { innerPadding -> + KeyEventBlocker { + it.key == Key.VolumeDown || it.key == Key.VolumeUp + } + Column( + modifier = Modifier + .fillMaxSize(1f) + .padding(innerPadding) + .nestedScroll(scrollBehavior.nestedScrollConnection) + .verticalScroll(scrollState), + ) { + LaunchedEffect(text) { + scrollState.animateScrollTo(scrollState.maxValue) + } + Text( + modifier = Modifier.padding(8.dp), + text = if (developerOptionsEnabled) logContent.toString() else text, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontFamily = FontFamily.Monospace, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + ) + } + } +} + +fun Uri.getFileName(context: Context): String { + val contentResolver = context.contentResolver + val cursor = contentResolver.query(this, null, null, null, null) + return cursor?.use { + val nameIndex = it.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME) + if (it.moveToFirst() && nameIndex != -1) { + it.getString(nameIndex) + } else { + this.lastPathSegment ?: "unknown.zip" + } + } ?: (this.lastPathSegment ?: "unknown.zip") +} + +@Parcelize +sealed class FlashIt : Parcelable { + data class FlashBoot(val boot: Uri? = null, val lkm: LkmSelection, val ota: Boolean) : + FlashIt() + + data class FlashModules(val uris: List) : FlashIt() + + data class FlashAnyKernel(val uri: Uri) : FlashIt() + + data object FlashRestore : FlashIt() + + data object FlashUninstall : FlashIt() +} + +fun flashIt( + flashIt: FlashIt, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): FlashResult { + return when (flashIt) { + is FlashIt.FlashBoot -> installBoot( + flashIt.boot, + flashIt.lkm, + flashIt.ota, + onStdout, + onStderr + ) + + is FlashIt.FlashAnyKernel -> flashAnyKernelZip( + flashIt.uri, + onStdout, + onStderr + ) + + is FlashIt.FlashModules -> { + flashModulesSequentially(flashIt.uris, onStdout, onStderr) + } + + FlashIt.FlashRestore -> restoreBoot(onStdout, onStderr) + + FlashIt.FlashUninstall -> uninstallPermanently(onStdout, onStderr) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + status: FlashingStatus, + onBack: () -> Unit = {}, + onSave: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + stringResource( + when (status) { + FlashingStatus.FLASHING -> R.string.flashing + FlashingStatus.SUCCESS -> R.string.flash_success + FlashingStatus.FAILED -> R.string.flash_failed + } + ), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + color = when (status) { + FlashingStatus.FLASHING -> ORANGE + FlashingStatus.SUCCESS -> GREEN + FlashingStatus.FAILED -> RED + } + ) + }, + navigationIcon = { + IconButton( + onClick = { if (status != FlashingStatus.FLASHING) onBack() }, + enabled = status != FlashingStatus.FLASHING + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + actions = { + IconButton( + onClick = { if (status != FlashingStatus.FLASHING) onSave() }, + enabled = status != FlashingStatus.FLASHING + ) { + Icon( + imageVector = Icons.Filled.Save, + contentDescription = "Localized description" + ) + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Preview +@Composable +fun InstallPreview() { + InstallScreen(EmptyDestinationsNavigator) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt new file mode 100644 index 000000000000..a7e1fd434e99 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Home.kt @@ -0,0 +1,1405 @@ +package com.rifsxd.ksunext.ui.screen + +import androidx.core.net.toUri +import androidx.compose.foundation.Image +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.border +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.pm.ShortcutInfo +import android.os.Build +import android.os.PowerManager +import android.system.Os +import android.widget.Toast +import androidx.annotation.StringRes +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.* +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.* +import androidx.compose.material.icons.automirrored.filled.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.verticalScroll +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.distinctUntilChanged +import androidx.core.content.pm.PackageInfoCompat +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.lifecycle.viewmodel.compose.viewModel +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.dergoogler.mmrl.ui.component.text.TextRow +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.InstallScreenDestination +import com.ramcosta.composedestinations.generated.destinations.ModuleScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SettingScreenDestination +import com.ramcosta.composedestinations.generated.destinations.SuperUserScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.rifsxd.ksunext.* +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.rememberConfirmDialog +import com.rifsxd.ksunext.ui.theme.ORANGE +import com.rifsxd.ksunext.ui.util.* +import com.rifsxd.ksunext.ui.webui.WebUIActivity +import com.rifsxd.ksunext.ui.util.restartActivity +import com.rifsxd.ksunext.ui.util.module.LatestVersionInfo +import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.screen.BottomBarDestination +import com.rifsxd.ksunext.ui.trackScroll +import com.rifsxd.ksunext.ui.rememberScrollConnection +import java.util.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext + +@OptIn(ExperimentalMaterial3Api::class) +@Destination(start = true) +@Composable +fun HomeScreen(navigator: DestinationsNavigator) { + val kernelVersion = getKernelVersion() + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + + val isManager = Natives.isManager + val fullFeatured = isManager && !Natives.requireNewKernel() && rootAvailable() + val ksuVersion = if (isManager) Natives.version else null + val ksuVersionTag = if (isManager) Natives.getVersionTag() else null + + val context = LocalContext.current + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + // Get scroll state for bottom bar tracking + val bottomBarScrollState = LocalScrollState.current + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + // Create scroll connection for bottom bar + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + Scaffold( + topBar = { + TopBar( + kernelVersion, + ksuVersion, + onInstallClick = { + navigator.navigate(InstallScreenDestination) + }, + scrollBehavior = scrollBehavior + ) + }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + // Chain scroll connections - bottom bar tracking first, then topbar behavior + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + .padding(top = 16.dp) + .padding(bottom = navBarPadding) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + val lkmMode = ksuVersion?.let { + Natives.isLkmMode + } + + StatusCard(kernelVersion, ksuVersion, lkmMode, ksuVersionTag = ksuVersionTag) { + navigator.navigate(InstallScreenDestination) + } + + val homeDestination = BottomBarDestination.entries.firstOrNull() + val startRoute = homeDestination?.direction?.route + + if (fullFeatured) { + Row( + modifier = Modifier + .fillMaxWidth() + .height(IntrinsicSize.Min), + horizontalArrangement = Arrangement.spacedBy(14.dp) + ) { + Box(modifier = Modifier.weight(1f)) { + SuperuserCard( + onClick = { + navigator.navigate(SuperUserScreenDestination) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + ) + } + + Box(modifier = Modifier.weight(1f)) { + ModuleCard( + onClick = { + navigator.navigate(ModuleScreenDestination) { + popUpTo(NavGraphs.root.startRoute) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + ) + } + } + } + + if (isManager && Natives.requireNewKernel()) { + WarningCard( + stringResource(id = R.string.require_kernel_version).format( + ksuVersion, Natives.MINIMAL_SUPPORTED_KERNEL + ) + ) + } + + if (ksuVersion != null && !rootAvailable()) { + WarningCard( + stringResource(id = R.string.grant_root_failed), + onClick = { + restartActivity(context) + } + ) + } + + val checkUpdate = + LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE) + .getBoolean("check_update", true) + if (checkUpdate) { + UpdateCard() + } + + InfoCard(autoExpand = developerOptionsEnabled) + IssueReportCard() + ContributorsCard() + Spacer(Modifier) + } + } +} + +@Composable +private fun SuperuserCard(onClick: (() -> Unit)? = null) { + val count = getSuperuserCount() + ElevatedCard( + colors = CardDefaults.elevatedCardColors( + containerColor = MaterialTheme.colorScheme.secondaryContainer + ), + modifier = Modifier + .height(IntrinsicSize.Min) + .then(if (onClick != null) Modifier.clickable { onClick() } else Modifier) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .padding(8.dp), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = if (count <= 1) { + stringResource(R.string.home_superuser_count_singular) + } else { + stringResource(R.string.home_superuser_count_plural) + }, + style = MaterialTheme.typography.bodySmall + ) + Text( + text = count.toString(), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + } + } +} + +@Composable +private fun ModuleCard(onClick: (() -> Unit)? = null) { + val count = getModuleCount() + val moduleViewModel: ModuleViewModel = viewModel() + + val moduleUpdateCount = moduleViewModel.moduleList.count { + moduleViewModel.checkUpdate(it).first.isNotEmpty() + } + + // State machine: 0 = nothing, 1 = show "+ Update!", 2 = show "+ X" + var step by remember { mutableStateOf(0) } + + LaunchedEffect(moduleUpdateCount) { + if (moduleUpdateCount > 0) { + step = 1 + delay(1200) // show "+ Update!" for a moment + step = 2 + } else { + step = 0 + } + } + + ElevatedCard( + colors = CardDefaults.elevatedCardColors( + containerColor = MaterialTheme.colorScheme.secondaryContainer + ), + modifier = Modifier + .height(IntrinsicSize.Min) + .then(if (onClick != null) Modifier.clickable { onClick() } else Modifier) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .padding(8.dp), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = if (count <= 1) { + stringResource(R.string.home_module_count_singular) + } else { + stringResource(R.string.home_module_count_plural) + }, + style = MaterialTheme.typography.bodySmall + ) + + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = count.toString(), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + + if (moduleUpdateCount > 0) { + Spacer(Modifier.width(6.dp)) + + Row(verticalAlignment = Alignment.CenterVertically) { + // Keep the "|" static + Text( + text = "|", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + + Spacer(Modifier.width(4.dp)) + + // Animate only the right-side text + AnimatedContent( + targetState = step, + transitionSpec = { + slideInHorizontally { -it } + fadeIn() togetherWith + slideOutHorizontally { it } + fadeOut() + } + ) { target -> + when (target) { + 1 -> Text( + text = stringResource(id = R.string.home_module_update_available), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + 2 -> Text( + text = buildAnnotatedString { + append(moduleUpdateCount.toString()) + append("*") + }, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + } + } + } + } + } + } + } +} + +@Composable +fun UpdateCard() { + val context = LocalContext.current + val latestVersionInfo = LatestVersionInfo() + + var preferSpoofed by remember { mutableStateOf(false) } + + val newVersion by produceState(initialValue = latestVersionInfo, key1 = preferSpoofed) { + value = withContext(Dispatchers.IO) { + checkNewVersion(preferSpoofed) + } + } + + val currentVersionCode = getManagerVersion(context).second + val newVersionCode = newVersion.versionCode + val newVersionUrl = newVersion.downloadUrl + val changelog = newVersion.changelog + val newVersionTag = newVersion.versionTag + + val uriHandler = LocalUriHandler.current + val title = stringResource(id = R.string.module_changelog) + val updateText = stringResource(id = R.string.module_update) + + AnimatedVisibility( + visible = newVersionCode > currentVersionCode, + enter = fadeIn() + expandVertically(), + exit = shrinkVertically() + fadeOut() + ) { + val updateDialog = rememberConfirmDialog(onConfirm = { uriHandler.openUri(newVersionUrl) }) + ElevatedCard( + modifier = Modifier.clickable { + if (changelog.isEmpty()) { + uriHandler.openUri(newVersionUrl) + } else { + updateDialog.showConfirm( + title = title, + content = changelog, + markdown = true, + confirm = updateText + ) + } + }, + colors = CardDefaults.elevatedCardColors( + containerColor = MaterialTheme.colorScheme.primary + ) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.Update, + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimary, + modifier = Modifier.padding(end = 20.dp) + ) + Text( + text = if (!newVersionTag.isNullOrEmpty()) { + stringResource(id = R.string.new_version_available, newVersionTag, newVersionCode) + } else { + stringResource(id = R.string.new_version_available, "", newVersionCode) + }, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onPrimary + ) + Spacer(modifier = Modifier.weight(1f)) + Icon( + imageVector = Icons.AutoMirrored.Filled.ArrowForward, + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimary + ) + } + + Spacer(modifier = Modifier.height(20.dp)) + + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = stringResource(id = R.string.select_build_type), + style = MaterialTheme.typography.labelMedium, + modifier = Modifier.padding(bottom = 12.dp) + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .height(48.dp) + .background( + color = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.12f), + shape = RoundedCornerShape(12.dp) + ) + .padding(4.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + if (!preferSpoofed) { + FilledTonalButton( + onClick = { preferSpoofed = false }, + modifier = Modifier + .weight(1f) + .fillMaxHeight(), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onPrimaryContainer + ), + shape = RoundedCornerShape(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.Verified, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Text(stringResource(id = R.string.main), style = MaterialTheme.typography.labelMedium) + } + } + } else { + FilledTonalButton( + onClick = { preferSpoofed = false }, + modifier = Modifier + .weight(1f) + .fillMaxHeight(), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.69f), + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ), + shape = RoundedCornerShape(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.Verified, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Text(stringResource(id = R.string.main), style = MaterialTheme.typography.labelMedium) + } + } + } + + if (preferSpoofed) { + FilledTonalButton( + onClick = { preferSpoofed = true }, + modifier = Modifier + .weight(1f) + .fillMaxHeight(), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onPrimaryContainer + ), + shape = RoundedCornerShape(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.VisibilityOff, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Text(stringResource(id = R.string.spoofed), style = MaterialTheme.typography.labelMedium) + } + } + } else { + FilledTonalButton( + onClick = { preferSpoofed = true }, + modifier = Modifier + .weight(1f) + .fillMaxHeight(), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.69f), + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ), + shape = RoundedCornerShape(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.VisibilityOff, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Text(stringResource(id = R.string.spoofed), style = MaterialTheme.typography.labelMedium) + } + } + } + } + } + } + } + } +} + +@Composable +fun RebootDropdownItem(@StringRes id: Int, reason: String = "") { + DropdownMenuItem(text = { + Text(stringResource(id)) + }, onClick = { + reboot(reason) + }) +} + +// @Composable +// fun getSeasonalIcon(): ImageVector { +// val month = Calendar.getInstance().get(Calendar.MONTH) // 0-11 for January-December +// return when (month) { +// Calendar.DECEMBER, Calendar.JANUARY, Calendar.FEBRUARY -> Icons.Filled.AcUnit // Winter +// Calendar.MARCH, Calendar.APRIL, Calendar.MAY -> Icons.Filled.Spa // Spring +// Calendar.JUNE, Calendar.JULY, Calendar.AUGUST -> Icons.Filled.WbSunny // Summer +// Calendar.SEPTEMBER, Calendar.OCTOBER, Calendar.NOVEMBER -> Icons.Filled.Forest // Fall +// else -> Icons.Filled.Whatshot // Fallback icon +// } +// } + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + kernelVersion: KernelVersion, + ksuVersion: Int?, + onInstallClick: () -> Unit, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + var isSpinning by remember { mutableStateOf(false) } + var rotationTarget by remember { mutableStateOf(0f) } + val rotation by animateFloatAsState( + targetValue = rotationTarget, + animationSpec = tween( + durationMillis = 1400, + easing = androidx.compose.animation.core.FastOutSlowInEasing + ), + finishedListener = { + isSpinning = false + } + ) + + val moduleViewModel: ModuleViewModel = viewModel() + + val webUILauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { } + + val context = LocalContext.current + + LaunchedEffect(Unit) { + isSpinning = true + rotationTarget += 360f * 6 + } + + TopAppBar( + title = { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() } + ) { + if (!isSpinning) { + isSpinning = true + rotationTarget += 360f * 6 + } + } + ) { + Icon( + painter = painterResource(R.drawable.ic_ksu_next), + contentDescription = null, + modifier = Modifier + .padding(end = 8.dp) + .graphicsLayer { + rotationZ = rotation + } + ) + Text( + text = stringResource(R.string.app_name), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black + ) + } + }, + actions = { + if (ksuVersion != null) { + IconButton(onClick = onInstallClick) { + Icon( + imageVector = Icons.Filled.Archive, + contentDescription = stringResource(id = R.string.install) + ) + } + } + + if (ksuVersion != null) { + var showDropdown by remember { mutableStateOf(false) } + IconButton(onClick = { + showDropdown = true + }) { + Icon( + imageVector = Icons.Filled.PowerSettingsNew, + contentDescription = stringResource(id = R.string.reboot) + ) + + DropdownMenu(expanded = showDropdown, onDismissRequest = { + showDropdown = false + }) { + RebootDropdownItem(id = R.string.reboot) + RebootDropdownItem(id = R.string.reboot_userspace, reason = "soft-reboot") + + val pm = + LocalContext.current.getSystemService(Context.POWER_SERVICE) as PowerManager? + @Suppress("DEPRECATION") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && pm?.isRebootingUserspaceSupported == true) { + RebootDropdownItem(id = R.string.reboot_userspace, reason = "userspace") + } + RebootDropdownItem(id = R.string.reboot_recovery, reason = "recovery") + RebootDropdownItem(id = R.string.reboot_bootloader, reason = "bootloader") + RebootDropdownItem(id = R.string.reboot_download, reason = "download") + RebootDropdownItem(id = R.string.reboot_edl, reason = "edl") + } + } + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + + +@Composable +private fun StatusCard( + kernelVersion: KernelVersion, + ksuVersion: Int?, + lkmMode: Boolean?, + moduleUpdateCount: Int = 0, + ksuVersionTag: String? = null, + onClickInstall: () -> Unit = {} +) { + val context = LocalContext.current + + ElevatedCard( + colors = CardDefaults.elevatedCardColors(containerColor = run { + if (ksuVersion != null) MaterialTheme.colorScheme.primary + else if (kernelVersion.isGKI()) MaterialTheme.colorScheme.secondaryContainer + else MaterialTheme.colorScheme.errorContainer + }) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + if (ksuVersion == null) { + onClickInstall() + } + } + .padding(24.dp), verticalAlignment = Alignment.CenterVertically) { + when { + ksuVersion != null -> { + val workingMode = if (lkmMode == true || lkmMode == false) { + val mode = if (lkmMode == true) "LKM" else "BUILT-IN" + "$mode (" + kernelVersion.getKernelType() + ")" + } else kernelVersion.getKernelType() + + Icon( + imageVector = Icons.Filled.Mood, + contentDescription = null + ) + Column( + modifier = Modifier.padding(start = 20.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + val labelStyle = LabelItemDefaults.style + TextRow( + trailingContent = { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + LabelItem( + icon = if (Natives.isSafeMode) { + { + Icon( + imageVector = Icons.Filled.Security, + tint = MaterialTheme.colorScheme.onSecondaryContainer, + contentDescription = null + ) + } + } else { + { + Icon( + imageVector = Icons.Filled.VerifiedUser, + tint = MaterialTheme.colorScheme.onSecondaryContainer, + contentDescription = null + ) + } + }, + text = { + Text( + text = workingMode, + style = labelStyle.textStyle.copy( + color = MaterialTheme.colorScheme.onSecondaryContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer + ) + ) + if (isSuCompatDisabled()) { + LabelItem( + icon = { + Icon( + imageVector = Icons.Filled.Warning, + tint = MaterialTheme.colorScheme.onTertiaryContainer, + contentDescription = null + ) + }, + text = { + Text( + text = stringResource(R.string.sucompat_disabled), + style = labelStyle.textStyle.copy( + color = MaterialTheme.colorScheme.onTertiaryContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer + ) + ) + } + if (Natives.isLateLoadMode) { + LabelItem( + icon = { + Icon( + imageVector = Icons.Filled.Warning, + tint = MaterialTheme.colorScheme.onErrorContainer, + contentDescription = null + ) + }, + text = { + Text( + text = stringResource(R.string.jailbreak_mode), + style = labelStyle.textStyle.copy( + color = MaterialTheme.colorScheme.onErrorContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.errorContainer + ) + ) + } + } + } + ) { + Text( + text = stringResource(id = R.string.home_working), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + + val versionText = if (!ksuVersionTag.isNullOrEmpty()) { + stringResource(id = R.string.home_working_version, ksuVersionTag, ksuVersion ?: 0) + } else { + stringResource(id = R.string.home_working_version, "v0.0.0", ksuVersion ?: 0) + } + Text( + text = versionText, + style = MaterialTheme.typography.bodySmall + ) + } + } + + kernelVersion.isGKI() -> { + Icon(Icons.Filled.AutoFixHigh, null) + Column(Modifier.padding(start = 20.dp)) { + Text( + text = stringResource(R.string.home_not_installed), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(4.dp)) + Text( + text = stringResource(R.string.home_click_to_install), + style = MaterialTheme.typography.bodyMedium + ) + } + } + + else -> { + Icon(Icons.Filled.MoodBad, null) + Column(Modifier.padding(start = 20.dp)) { + Text( + text = stringResource(R.string.home_failure), + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(4.dp)) + Text( + text = stringResource(R.string.home_failure_tip), + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + } + } +} + +@Composable +fun WarningCard( + message: String, color: Color = MaterialTheme.colorScheme.error, onClick: (() -> Unit)? = null +) { + ElevatedCard( + colors = CardDefaults.elevatedCardColors( + containerColor = color + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .then(onClick?.let { Modifier.clickable { it() } } ?: Modifier) + .padding(24.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Filled.SentimentDissatisfied, + contentDescription = null, + modifier = Modifier.padding(end = 20.dp) + ) + Text( + text = message, style = MaterialTheme.typography.bodyMedium + ) + } + } +} + +@Composable +private fun InfoCard(autoExpand: Boolean = false) { + val context = LocalContext.current + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + + var expanded by rememberSaveable { mutableStateOf(false) } + + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + LaunchedEffect(autoExpand) { + if (autoExpand) { + expanded = true + } + } + + Card { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, top = 24.dp, end = 24.dp, bottom = 24.dp) + ) { + @Composable + fun InfoCardItem(label: String, content: String, icon: Any? = null) { + Row(verticalAlignment = Alignment.CenterVertically) { + if (icon != null) { + when (icon) { + is ImageVector -> Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.padding(end = 20.dp) + ) + is Painter -> Icon( + painter = icon, + contentDescription = null, + modifier = Modifier.padding(end = 20.dp) + ) + } + } + Column { + Text( + text = label, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + Text( + text = content, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(top = 4.dp) + ) + } + } + } + + Column { + val managerVersion = getManagerVersion(context) + InfoCardItem( + label = stringResource(R.string.home_manager_version), + content = if ( + developerOptionsEnabled + ) { + "${managerVersion.first} (${managerVersion.second}) | UID: ${Natives.getManagerAppid()}" + } else { + "${managerVersion.first} (${managerVersion.second})" + }, + icon = Icons.Filled.AutoAwesomeMotion, + ) + + if (ksuVersion != null) { + + val hookMode = + Natives.getHookMode() + .takeUnless { it.isNullOrBlank() } + ?: stringResource(R.string.unavailable) + + Spacer(Modifier.height(16.dp)) + + InfoCardItem( + label = stringResource(R.string.hook_mode), + content = hookMode, + icon = Icons.Filled.Phishing, + ) + } + + if (ksuVersion != null) { + val metaModule = getMetaModule() + val moduleViewModel: ModuleViewModel = viewModel() + val metaInfo = moduleViewModel.moduleList.firstOrNull { it.isMetaModule } + val metaDetail = if (metaInfo != null) " | ${metaInfo.name} | ${metaInfo.version}" else "" + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_metamodule_status), + content = when { + metaModule == "Installed" && metaInfo != null && !metaInfo.enabled -> + stringResource(R.string.disabled) + metaDetail + metaModule == "Installed" -> + stringResource(R.string.installed) + metaDetail + else -> + stringResource(R.string.home_not_installed) + }, + icon = Icons.Filled.SettingsSuggest + ) + + val suSFS = getSuSFS() + if (suSFS == "Supported") { + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_susfs_version), + content = "${stringResource(R.string.supported)} | ${getSuSFSVersion()} (${getSuSFSVariant()})", + icon = painterResource(R.drawable.ic_sus), + ) + } + + if (Natives.isZygiskEnabled()) { + Spacer(Modifier.height(16.dp)) + val zygiskInfo = moduleViewModel.moduleList.firstOrNull { it.isZygisk && it.enabled } + val zygiskDetail = if (zygiskInfo != null) " | ${zygiskInfo.name} | ${zygiskInfo.version}" else "" + InfoCardItem( + label = stringResource(R.string.zygisk_status), + content = stringResource(R.string.enabled) + zygiskDetail, + icon = Icons.Filled.Vaccines + ) + } + } + + AnimatedVisibility(visible = expanded) { + val uname = Os.uname() + Column { + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_kernel), + content = "${uname.release} (${uname.machine})", + icon = painterResource(R.drawable.ic_linux), + ) + + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_android), + content = "${Build.VERSION.RELEASE} (${Build.VERSION.SDK_INT})", + icon = Icons.Filled.Android, + ) + + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_abi), + content = Build.SUPPORTED_ABIS.joinToString(", "), + icon = Icons.Filled.Memory, + ) + + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_selinux_status), + content = getSELinuxStatus(), + icon = Icons.Filled.Security, + ) + + + val statusInt = kotlin.runCatching { + Os.prctl(21, 0, 0, 0, 0) + }.getOrDefault(-1) + + val seccompStatus = when (statusInt) { + -1 -> stringResource(R.string.seccomp_status_not_supported) + 0 -> stringResource(R.string.seccomp_status_disabled) + 1 -> stringResource(R.string.seccomp_status_strict) + 2 -> stringResource(R.string.seccomp_status_filter) + else -> stringResource(R.string.seccomp_status_unknown) + } + + Spacer(Modifier.height(16.dp)) + InfoCardItem( + label = stringResource(R.string.home_seccomp_status), + content = seccompStatus, + icon = Icons.Filled.LocalPolice + ) + } + } + + Spacer(Modifier.height(16.dp)) + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center + ) { + val rotationAngle by animateFloatAsState( + targetValue = if (expanded) 180f else 0f, + animationSpec = tween(durationMillis = 300) + ) + + IconButton( + onClick = { expanded = !expanded }, + modifier = Modifier.size(36.dp) + ) { + Icon( + imageVector = Icons.Filled.KeyboardArrowDown, + contentDescription = if (expanded) "Show less" else "Show more", + modifier = Modifier.graphicsLayer { + rotationZ = rotationAngle + } + ) + } + } + } + } + } +} + +data class Contributor( + val login: String, + val name: String? = null, + val githubUrl: String, + val role: String, + val donationUrl: String +) + +@Composable +fun ContributorsCard() { + val uriHandler = LocalUriHandler.current + + val contributors = listOf( + Contributor( + login = "rifsxd", + name = "Rifat Azad", + githubUrl = "https://github.com/rifsxd", + role = "Lead Developer", + donationUrl = "https://github.com/KernelSU-Next/KernelSU-Next/tree/dev?tab=readme-ov-file#-donations" + ), + Contributor( + login = "tiann", + name = "Weishu", + githubUrl = "https://github.com/tiann", + role = "KernelSU Author", + donationUrl = "https://www.patreon.com/weishu" + ), + Contributor( + login = "fatalcoder524", + githubUrl = "https://github.com/fatalcoder524", + role = "Frontend Maintainer", + donationUrl = "https://github.com/sponsors/fatalcoder524" + ), + Contributor( + login = "pershoot", + githubUrl = "https://github.com/pershoot", + role = "Backend Maintainer", + donationUrl = "https://github.com/sponsors/pershoot" + ), + Contributor( + login = "maxsteeel", + name = "Max", + githubUrl = "https://github.com/maxsteeel", + role = "Legacy Maintainer", + donationUrl = "https://github.com/sponsors/maxsteeel" + ) + ) + + Card { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + Text( + text = stringResource(R.string.contributors), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + + contributors.forEach { contributor -> + ContributorRow( + contributor = contributor, + onProfileClick = { uriHandler.openUri(contributor.githubUrl) }, + onDonateClick = { uriHandler.openUri(contributor.donationUrl) } + ) + } + } + } +} + +@Composable +private fun ContributorRow( + contributor: Contributor, + onProfileClick: () -> Unit, + onDonateClick: () -> Unit +) { + var imageLoadFailed by remember { mutableStateOf(false) } + + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + // Avatar + name/role + Row( + modifier = Modifier + .weight(1f) + .clip(RoundedCornerShape(8.dp)) + .clickable { onProfileClick() } + .padding(vertical = 4.dp, horizontal = 4.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + // Avatar + Box( + modifier = Modifier + .size(38.dp) + .clip(CircleShape) + .border( + width = 0.5.dp, + color = MaterialTheme.colorScheme.outlineVariant, + shape = CircleShape + ), + contentAlignment = Alignment.Center + ) { + if (!imageLoadFailed) { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data("https://avatars.githubusercontent.com/${contributor.login}?s=80") + .crossfade(true) + .build(), + contentDescription = contributor.login, + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize(), + onError = { imageLoadFailed = true } + ) + } else { + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.secondaryContainer), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = Icons.Filled.Person, + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = MaterialTheme.colorScheme.onSecondaryContainer + ) + } + } + } + + // Name + role + Column { + Text( + text = contributor.name?.takeIf { it.isNotBlank() } + ?.let { "${contributor.login} ($it)" } + ?: contributor.login, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold + ) + Text( + text = contributor.role, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + OutlinedButton( + onClick = onDonateClick, + contentPadding = PaddingValues(horizontal = 12.dp, vertical = 4.dp), + modifier = Modifier.height(30.dp), + shape = RoundedCornerShape(20.dp), + border = BorderStroke(0.5.dp, MaterialTheme.colorScheme.outlineVariant) + ) { + Icon( + imageVector = Icons.Filled.Favorite, + contentDescription = null, + modifier = Modifier.size(13.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(Modifier.width(5.dp)) + Text( + text = stringResource(R.string.support), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } +} + +@Composable +fun IssueReportCard() { + val uriHandler = LocalUriHandler.current + val githubIssueUrl = stringResource(R.string.issue_report_github_link) + val telegramUrl = stringResource(R.string.issue_report_telegram_link) + + Card { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = stringResource(R.string.issue_report_title), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + Spacer(Modifier.height(4.dp)) + Text( + text = stringResource(R.string.issue_report_body), + style = MaterialTheme.typography.bodySmall + ) + Spacer(Modifier.height(4.dp)) + Text( + text = stringResource(R.string.issue_report_body_2), + style = MaterialTheme.typography.bodySmall + ) + } + Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { + IconButton(onClick = { uriHandler.openUri(githubIssueUrl) }) { + Icon( + painter = painterResource(R.drawable.ic_github), + contentDescription = stringResource(R.string.issue_report_github), + ) + } + IconButton(onClick = { uriHandler.openUri(telegramUrl) }) { + Icon( + painter = painterResource(R.drawable.ic_telegram), + contentDescription = stringResource(R.string.issue_report_telegram), + ) + } + } + } + } +} + +@SuppressLint("RestrictedApi") +fun handleDynamicShortcuts(context: Context, moduleConfigs: List >) { + ShortcutManagerCompat.removeAllDynamicShortcuts(context) + + moduleConfigs.forEach { (module, iconRes) -> + val shortcut = ShortcutInfoCompat.Builder(context, module.id) + .setShortLabel(module.name) + .setLongLabel(module.name) + .setIcon(IconCompat.createWithResource(context, iconRes)) + .setCategories(setOf(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION)) + .setIntent( + Intent(context, WebUIActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = "kernelsu://webui/${module.id}".toUri() + putExtra("id", module.id) + putExtra("name", module.name) + } + ) + .build() + + ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) + } +} + +fun getManagerVersion(context: Context): Pair { + val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)!! + val versionCode = PackageInfoCompat.getLongVersionCode(packageInfo) + return Pair(packageInfo.versionName!!, versionCode) +} + +@Preview +@Composable +private fun StatusCardPreview() { + Column { + StatusCard(KernelVersion(5, 10, 101), 1, null) + StatusCard(KernelVersion(5, 10, 101), 20000, true) + StatusCard(KernelVersion(5, 10, 101), null, true) + StatusCard(KernelVersion(4, 10, 101), null, false) + } +} + +@Preview +@Composable +private fun WarningCardPreview() { + Column { + WarningCard(message = "Warning message") + WarningCard( + message = "Warning message", + MaterialTheme.colorScheme.outlineVariant, + onClick = {}) + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Install.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Install.kt new file mode 100644 index 000000000000..fee7eb705016 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Install.kt @@ -0,0 +1,426 @@ +package com.rifsxd.ksunext.ui.screen + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.StringRes +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.selection.toggleable +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.FileUpload +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.stringResource +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.maxkeppeker.sheets.core.models.base.Header +import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState +import com.maxkeppeler.sheets.list.ListDialog +import com.maxkeppeler.sheets.list.models.ListOption +import com.maxkeppeler.sheets.list.models.ListSelection +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.* +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.DialogHandle +import com.rifsxd.ksunext.ui.component.rememberConfirmDialog +import com.rifsxd.ksunext.ui.component.rememberCustomDialog +import com.rifsxd.ksunext.ui.util.* +import java.util.Locale + +/** + * @author weishu + * @date 2024/3/12. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun InstallScreen(navigator: DestinationsNavigator) { + + var installMethod by remember { + mutableStateOf(null) + } + + var lkmSelection by remember { + mutableStateOf(LkmSelection.KmiNone) + } + + val context = LocalContext.current + + val onInstall = { + installMethod?.let { method -> + if (method is InstallMethod.AnyKernel) { + method.uri?.let { + navigator.navigate( + FlashScreenDestination(FlashIt.FlashAnyKernel(it)) + ) + } + return@let + } + + val flashIt = FlashIt.FlashBoot( + boot = if (method is InstallMethod.SelectFile) method.uri else null, + lkm = lkmSelection, + ota = method is InstallMethod.DirectInstallToInactiveSlot + ) + navigator.navigate(FlashScreenDestination(flashIt)) + } + } + + val currentKmi by produceState(initialValue = "") { value = getCurrentKmi() } + + val selectKmiDialog = rememberSelectKmiDialog { kmi -> + kmi?.let { + lkmSelection = LkmSelection.KmiString(it) + onInstall() + } + } + + val onClickNext = { + when (installMethod) { + is InstallMethod.AnyKernel -> { + onInstall() + } + + else -> { + if (lkmSelection == LkmSelection.KmiNone && currentKmi.isBlank()) { + // no lkm file selected and cannot get current kmi + selectKmiDialog.show() + } else { + onInstall() + } + } + } + } + + val selectLkmLauncher = + rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + it.data?.data?.let { uri -> + lkmSelection = LkmSelection.LkmUri(uri) + } + } + } + + val onLkmUpload = { + selectLkmLauncher.launch(Intent(Intent.ACTION_GET_CONTENT).apply { + type = "application/octet-stream" + }) + } + + val kernelVersion = getKernelVersion() + + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + onLkmUpload = if (kernelVersion.isGKI()) onLkmUpload else null, + scrollBehavior = scrollBehavior + ) + }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + ) { + SelectInstallMethod { method -> + installMethod = method + } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + (lkmSelection as? LkmSelection.LkmUri)?.let { + Text( + stringResource( + id = R.string.selected_lkm, + it.uri.lastPathSegment ?: "(file)" + ) + ) + } + Button(modifier = Modifier.fillMaxWidth(), + enabled = installMethod != null, + onClick = { + onClickNext() + }) { + Text( + stringResource(id = R.string.install_next), + fontSize = MaterialTheme.typography.bodyMedium.fontSize + ) + } + } + } + } +} + +sealed class InstallMethod { + data class SelectFile( + val uri: Uri? = null, + @param:StringRes override val label: Int = R.string.select_file, + override val summary: String? + ) : InstallMethod() + + data class AnyKernel( + val uri: Uri? = null, + @param:StringRes override val label: Int = R.string.flash_anykernel, + override val summary: String? = null + ) : InstallMethod() + + data object DirectInstall : InstallMethod() { + override val label: Int + get() = R.string.direct_install + } + + data object DirectInstallToInactiveSlot : InstallMethod() { + override val label: Int + get() = R.string.install_inactive_slot + } + + abstract val label: Int + open val summary: String? = null +} + +@Composable +private fun SelectInstallMethod(onSelected: (InstallMethod) -> Unit = {}) { + val rootAvailable = rootAvailable() + val isAbDevice = produceState(initialValue = false) { + value = isAbDevice() + }.value + val kernelVersion = getKernelVersion() + val selectFileTip = stringResource( + id = R.string.select_file_tip, + if (kernelVersion.isKernel510()) + "boot" + else + "init_boot/vendor_boot" + ) + val radioOptions = mutableListOf() + + radioOptions.add(InstallMethod.SelectFile(summary = selectFileTip)) + + if (rootAvailable) { + if (kernelVersion.isGKI()) { + radioOptions.add(InstallMethod.DirectInstall) + if (isAbDevice) { + radioOptions.add(InstallMethod.DirectInstallToInactiveSlot) + } + } + + radioOptions.add(InstallMethod.AnyKernel()) + } + + var selectedOption by remember { mutableStateOf(null) } + val selectImageLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { + if (it.resultCode == Activity.RESULT_OK) { + it.data?.data?.let { uri -> + val option = InstallMethod.SelectFile(uri, summary = selectFileTip) + selectedOption = option + onSelected(option) + } + } + } + + val selectAnyKernelLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { + if (it.resultCode == Activity.RESULT_OK) { + it.data?.data?.let { uri -> + val option = InstallMethod.AnyKernel(uri) + selectedOption = option + onSelected(option) + } + } + } + + val confirmDialog = rememberConfirmDialog(onConfirm = { + selectedOption = InstallMethod.DirectInstallToInactiveSlot + onSelected(InstallMethod.DirectInstallToInactiveSlot) + }, onDismiss = null) + val dialogTitle = stringResource(id = android.R.string.dialog_alert_title) + val dialogContent = stringResource(id = R.string.install_inactive_slot_warning) + + val onClick = { option: InstallMethod -> + + when (option) { + is InstallMethod.SelectFile -> { + selectImageLauncher.launch(Intent(Intent.ACTION_GET_CONTENT).apply { + type = "application/octet-stream" + }) + } + + is InstallMethod.AnyKernel -> { + selectAnyKernelLauncher.launch(Intent(Intent.ACTION_GET_CONTENT).apply { + type = "application/zip" + putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/zip", "application/x-zip-compressed", "application/octet-stream")) + addCategory(Intent.CATEGORY_OPENABLE) + }) + } + + is InstallMethod.DirectInstall -> { + selectedOption = option + onSelected(option) + } + + is InstallMethod.DirectInstallToInactiveSlot -> { + confirmDialog.showConfirm(dialogTitle, dialogContent) + } + } + } + + Column { + radioOptions.forEach { option -> + val interactionSource = remember { MutableInteractionSource() } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .toggleable( + value = option.javaClass == selectedOption?.javaClass, + onValueChange = { + onClick(option) + }, + role = Role.RadioButton, + indication = LocalIndication.current, + interactionSource = interactionSource + ) + ) { + RadioButton( + selected = option.javaClass == selectedOption?.javaClass, + onClick = { + onClick(option) + }, + interactionSource = interactionSource + ) + Column( + modifier = Modifier.padding(vertical = 12.dp) + ) { + Text( + text = stringResource(id = option.label), + fontSize = MaterialTheme.typography.titleMedium.fontSize, + fontFamily = MaterialTheme.typography.titleMedium.fontFamily, + fontStyle = MaterialTheme.typography.titleMedium.fontStyle + ) + option.summary?.let { + Text( + text = it, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + fontStyle = MaterialTheme.typography.bodySmall.fontStyle + ) + } + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun rememberSelectKmiDialog(onSelected: (String?) -> Unit): DialogHandle { + return rememberCustomDialog { dismiss -> + val supportedKmi by produceState(initialValue = emptyList()) { + value = getSupportedKmis() + } + val options = supportedKmi.map { value -> + ListOption( + titleText = value + ) + } + + var selection by remember { mutableStateOf(null) } + ListDialog(state = rememberUseCaseState(visible = true, onFinishedRequest = { + onSelected(selection) + }, onCloseRequest = { + dismiss() + }), header = Header.Default( + title = stringResource(R.string.select_kmi), + ), selection = ListSelection.Single( + showRadioButtons = true, + options = options, + ) { _, option -> + selection = option.titleText + }) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + onLkmUpload: (() -> Unit)? = null, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { Text( + text = stringResource(R.string.install), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) }, navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, actions = { + onLkmUpload?.let { action -> + IconButton(onClick = action) { + Icon(Icons.Filled.FileUpload, contentDescription = null) + } + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Composable +@Preview +fun SelectInstallPreview() { + InstallScreen(EmptyDestinationsNavigator) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/MetaModule.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/MetaModule.kt new file mode 100644 index 000000000000..497bbab99379 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/MetaModule.kt @@ -0,0 +1,677 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.BuildConfig +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost +import com.rifsxd.ksunext.ui.screen.FlashIt +import com.rifsxd.ksunext.ui.util.download +import com.rifsxd.ksunext.ui.util.DownloadListener +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import androidx.lifecycle.viewmodel.compose.viewModel +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel +import org.json.JSONArray +import java.io.BufferedReader +import java.io.InputStreamReader +import java.net.URL +import android.content.Intent + +data class MetaModule( + val id: String, + val name: String, + val description: String, + val author: String, + val repoUrl: String, + val bannerLink: String = "", + val license: String = "", + val visibility: Int = 1, + val latestVersion: String = "", + val downloadUrl: String = "", + val stars: Int = -1, + val isLoading: Boolean = true +) + +sealed class MetaModuleState { + object Loading : MetaModuleState() + data class Success(val modules: List) : MetaModuleState() + data class Error(val message: String) : MetaModuleState() +} + +/** + * @author rifsxd + * @date 2026/1/29. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun MetaModuleScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + val snackBarHost = LocalSnackbarHost.current + val context = LocalContext.current + val scope = rememberCoroutineScope() + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + val modulesJsonUrl = "https://raw.githubusercontent.com/KernelSU-Next/KernelSU-Next-Modules-Repo/refs/heads/main/meta_modules.json" + + var moduleState by remember { mutableStateOf(MetaModuleState.Loading) } + var selectedModule by remember { mutableStateOf(null) } + var downloadingModuleId by remember { mutableStateOf(null) } + var downloadedUri by remember { mutableStateOf(null) } + + DownloadListener(context) { uri -> + downloadedUri = uri + downloadingModuleId = null + navigator.navigate( + FlashScreenDestination(FlashIt.FlashModules(listOf(uri))) + ) + } + + val moduleViewModel = viewModel() + + suspend fun fetchMetaModulesFromJson(jsonUrl: String): List? { + return withContext(Dispatchers.IO) { + try { + val conn = URL(jsonUrl).openConnection() as java.net.HttpURLConnection + conn.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + val text = BufferedReader(InputStreamReader(conn.inputStream)).use { it.readText() } + conn.disconnect() + + val arr = JSONArray(text) + val out = mutableListOf() + for (i in 0 until arr.length()) { + val obj = arr.getJSONObject(i) + out += MetaModule( + id = obj.optString("id"), + name = obj.optString("name"), + description = obj.optString("description"), + author = obj.optString("author"), + repoUrl = obj.optString("repoUrl"), + bannerLink = obj.optString("bannerUrl"), + license = obj.optString("license", ""), + visibility = obj.optInt("visibility", 1) + ) + } + out + } catch (e: Exception) { + e.printStackTrace() + null + } + } + } + + suspend fun loadModules() { + try { + moduleState = MetaModuleState.Loading + + val baseList = withContext(Dispatchers.IO) { fetchMetaModulesFromJson(modulesJsonUrl) } + + if (baseList == null) { + moduleState = MetaModuleState.Error("Failed to load module list") + return + } + + // Filter out modules with visibility = 0 + val visibleModules = baseList.filter { it.visibility == 1 } + + moduleState = MetaModuleState.Success( + visibleModules.map { it.copy(latestVersion = "", downloadUrl = "", stars = -1, isLoading = true) } + ) + + kotlinx.coroutines.coroutineScope { + visibleModules.forEach { baseModule -> + launch { + try { + val releaseInfo = withContext(Dispatchers.IO) { fetchLatestReleaseInfo(baseModule.repoUrl) } + val updated = baseModule.copy( + latestVersion = releaseInfo?.version ?: "null", + downloadUrl = releaseInfo?.zipUrl ?: "", + stars = releaseInfo?.stars ?: -1, + isLoading = false + ) + + val current = moduleState + if (current is MetaModuleState.Success) { + val mutable = current.modules.toMutableList() + val idx = mutable.indexOfFirst { it.id == baseModule.id } + if (idx >= 0) mutable[idx] = updated else mutable.add(updated) + moduleState = MetaModuleState.Success(mutable) + } + } catch (e: Exception) { + val updated = baseModule.copy(latestVersion = "null", downloadUrl = "", stars = -1, isLoading = false) + val current = moduleState + if (current is MetaModuleState.Success) { + val mutable = current.modules.toMutableList() + val idx = mutable.indexOfFirst { it.id == baseModule.id } + if (idx >= 0) mutable[idx] = updated else mutable.add(updated) + moduleState = MetaModuleState.Success(mutable) + } + } + } + } + } + } catch (e: Exception) { + moduleState = MetaModuleState.Error(e.message ?: "Unknown error") + } + } + + LaunchedEffect(Unit) { + scope.launch { + loadModules() + } + } + + Scaffold( + topBar = { + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { paddingValues -> + when (val state = moduleState) { + is MetaModuleState.Loading -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() + } + } + is MetaModuleState.Success -> { + val installedIds = moduleViewModel.moduleList.map { it.id } + + val hasInstalledMetaModule = state.modules.any { installedIds.contains(it.id) } + + // Sort modules alphabetically by name (A to Z) + val sortedModules = state.modules.sortedBy { it.name.lowercase() } + val isRefreshing = moduleState is MetaModuleState.Loading + + PullToRefreshBox( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + isRefreshing = isRefreshing, + onRefresh = { + scope.launch { + moduleState = MetaModuleState.Loading + loadModules() + } + } + ) { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + }, + contentPadding = PaddingValues(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 16.dp + navBarPadding), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(sortedModules) { module -> + val isInstalled = installedIds.contains(module.id) + val isThisModuleDownloading = downloadingModuleId == module.id + + val isInstallEnabled = when { + downloadingModuleId != null && !isThisModuleDownloading -> false + isInstalled -> true + hasInstalledMetaModule -> false + else -> true + } + + MetaModuleCard( + module = module, + isInstalled = isInstalled, + isInstallEnabled = isInstallEnabled, + isDownloading = isThisModuleDownloading, + onCardClick = { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(module.repoUrl)) + context.startActivity(intent) + }, + onDownload = { selectedModule -> + downloadingModuleId = selectedModule.id + scope.launch { + try { + val fileName = "${selectedModule.name.replace(" ", "_")}_${selectedModule.latestVersion.replace("/", "_")}.zip" + download( + context, + selectedModule.downloadUrl, + fileName, + "Downloading ${selectedModule.name}" + ) + } catch (e: Exception) { + snackBarHost.showSnackbar("Error downloading module: ${e.message}") + downloadingModuleId = null + } + } + } + ) + } + } + } + } + is MetaModuleState.Error -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(16.dp) + ) { + Text( + text = stringResource(R.string.error_loading_modules), + style = MaterialTheme.typography.titleMedium + ) + Button( + onClick = { + scope.launch { + moduleState = MetaModuleState.Loading + loadModules() + } + }, + modifier = Modifier.padding(top = 16.dp) + ) { + Text(stringResource(R.string.retry)) + } + } + } + } + } + } +} + +@Composable +private fun MetaModuleCard( + module: MetaModule, + isInstalled: Boolean = false, + isInstallEnabled: Boolean = true, + isDownloading: Boolean = false, + onCardClick: () -> Unit, + onDownload: (MetaModule) -> Unit, + modifier: Modifier = Modifier +) { + Card( + modifier = modifier + .fillMaxWidth() + .clickable { onCardClick() } + ) { + Box(modifier = Modifier.fillMaxWidth()) { + val context = LocalContext.current + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val useBanner = prefs.getBoolean("use_banner", true) + + if (useBanner && module.bannerLink.isNotEmpty()) { + val isDark = isSystemInDarkTheme() + val colorScheme = MaterialTheme.colorScheme + val amoledMode = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + .getBoolean("amoled_mode", false) + val isDynamic = colorScheme.primary != colorScheme.secondary + + val fadeColor = when { + amoledMode && isDark -> Color.Black + isDynamic -> colorScheme.surface + isDark -> Color(0xFF222222) + else -> Color.White + } + + Box( + modifier = Modifier + .matchParentSize(), + contentAlignment = Alignment.Center + ) { + if (module.bannerLink.startsWith("http", true)) { + AsyncImage( + model = module.bannerLink, + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), + contentScale = ContentScale.Crop, + alpha = 0.18f + ) + } + + Box( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .background( + Brush.verticalGradient( + colors = listOf( + fadeColor.copy(alpha = 0.0f), + fadeColor.copy(alpha = 0.8f) + ), + startY = 0f, + endY = Float.POSITIVE_INFINITY + ) + ) + ) + } + } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(22.dp, 18.dp, 22.dp, 12.dp) + ) { + val hasLicense = module.license.isNotEmpty() + val hasStars = !module.isLoading && module.stars >= 0 + + if (hasLicense || hasStars || isInstalled) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + if (hasLicense) { + LabelItem( + icon = { + Icon( + tint = LabelItemDefaults.style.contentColor, + imageVector = Icons.Filled.LocalOffer, + contentDescription = null + ) + }, + text = { + Text( + text = module.license, + style = LabelItemDefaults.style.textStyle.copy( + color = LabelItemDefaults.style.contentColor, + ) + ) + } + ) + } + if (isInstalled) { + LabelItem( + icon = { + Icon( + imageVector = Icons.Filled.Check, + tint = MaterialTheme.colorScheme.onSecondaryContainer, + contentDescription = null + ) + }, + text = { + Text( + text = stringResource(R.string.installed), + style = LabelItemDefaults.style.textStyle.copy( + color = MaterialTheme.colorScheme.onSecondaryContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer + ) + ) + } + if (hasStars) { + val starsText = when { + module.stars >= 1_000 -> "${"%.1f".format(module.stars / 1000.0)}k" + else -> "${module.stars}" + } + LabelItem( + icon = { + Icon( + imageVector = Icons.Filled.Star, + tint = MaterialTheme.colorScheme.onTertiaryContainer, + contentDescription = null + ) + }, + text = { + Text( + text = starsText, + style = LabelItemDefaults.style.textStyle.copy( + color = MaterialTheme.colorScheme.onTertiaryContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer + ) + ) + } + } + Spacer(modifier = Modifier.height(8.dp)) + } + + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column( + modifier = Modifier.weight(1f) + ) { + Text( + text = module.name, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold + ) + Text( + text = "by ${module.author}", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + Text( + text = module.description, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(top = 8.dp) + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + text = stringResource(R.string.latest_version), + style = MaterialTheme.typography.labelSmall + ) + Text( + text = if (module.latestVersion.isNotEmpty()) module.latestVersion else stringResource(R.string.loading), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold + ) + } + + Button( + onClick = { onDownload(module) }, + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = module.downloadUrl.isNotEmpty() && isInstallEnabled, + shape = ButtonDefaults.textShape, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + if (isDownloading) { + CircularProgressIndicator( + modifier = Modifier.size(18.dp), + strokeWidth = 2.dp, + color = MaterialTheme.colorScheme.onPrimary + ) + } else { + Icon( + imageVector = Icons.Default.CloudDownload, + contentDescription = "Download", + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(7.dp)) + Text( + modifier = Modifier.padding(start = 0.dp), + text = if (isInstalled) stringResource(R.string.reinstall) else stringResource(R.string.install), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize + ) + } + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.meta_module_screen), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +private suspend fun fetchLatestReleaseInfo(repoUrl: String): ReleaseInfo? { + return withContext(Dispatchers.IO) { + try { + val stars = try { + val htmlConn = URL(repoUrl).openConnection() as java.net.HttpURLConnection + htmlConn.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + htmlConn.setRequestProperty("Accept", "text/html") + val html = BufferedReader(InputStreamReader(htmlConn.inputStream)).use { it.readText() } + htmlConn.disconnect() + val titleMatch = """id="repo-stars-counter-star"[^>]*title="([^"]+)"""".toRegex() + .find(html)?.groupValues?.get(1) + titleMatch?.replace(",", "")?.trim()?.toIntOrNull() ?: -1 + } catch (e: Exception) { + e.printStackTrace() + -1 + } + + // ── Latest release ZIP ─────────────────────────────────────────── + val latestUrl = "$repoUrl/releases/latest" + val connection = URL(latestUrl).openConnection() as java.net.HttpURLConnection + connection.instanceFollowRedirects = false + connection.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + + val redirectUrl = connection.getHeaderField("Location") + connection.disconnect() + + if (redirectUrl == null) return@withContext ReleaseInfo( + version = "null", + zipUrl = "", + stars = stars + ) + + val tagMatch = """/tag/([^/?\s]+)""".toRegex() + .find(redirectUrl)?.groupValues?.get(1) + ?: return@withContext ReleaseInfo(version = "null", zipUrl = "", stars = stars) + + val releasePageUrl = "$repoUrl/releases/expanded_assets/$tagMatch" + val pageConnection = URL(releasePageUrl).openConnection() + pageConnection.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + + val pageHtml = BufferedReader(InputStreamReader(pageConnection.getInputStream())).use { + it.readText() + } + + val zipUrlMatch = """href="(/[^"]+/releases/download/[^"]+\.zip)"""".toRegex() + .find(pageHtml)?.groupValues?.get(1) + + ReleaseInfo( + version = tagMatch, + zipUrl = if (zipUrlMatch != null) "https://github.com$zipUrlMatch" else "", + stars = stars + ) + } catch (e: Exception) { + e.printStackTrace() + null + } + } +} + +data class ReleaseInfo( + val version: String, + val zipUrl: String, + val stars: Int = -1 +) + +@Preview +@Composable +private fun MetaModuleScreenPreview() { + MetaModuleScreen(EmptyDestinationsNavigator) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt new file mode 100644 index 000000000000..31a4eb38ec08 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Module.kt @@ -0,0 +1,1460 @@ +package com.rifsxd.ksunext.ui.screen + + +import android.app.Activity.RESULT_OK +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.* +import androidx.compose.animation.core.tween +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Wysiwyg +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Cloud +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.AttachMoney +import androidx.compose.material.icons.outlined.Download +import androidx.compose.material.icons.outlined.Restore +import androidx.compose.material.icons.outlined.Terminal +import androidx.compose.material3.* +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.core.content.edit +import androidx.core.net.toUri +import androidx.lifecycle.compose.dropUnlessResumed +import androidx.lifecycle.viewmodel.compose.viewModel +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.ModuleRepoScreenDestination +import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination +import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.component.ConfirmResult +import com.rifsxd.ksunext.ui.component.SearchAppBar +import com.rifsxd.ksunext.ui.component.rememberConfirmDialog +import com.rifsxd.ksunext.ui.component.rememberLoadingDialog +import com.rifsxd.ksunext.ui.component.ShortcutDialog +import com.rifsxd.ksunext.ui.util.module.Shortcut +import com.rifsxd.ksunext.ui.util.* +import com.rifsxd.ksunext.ui.viewmodel.ModuleViewModel +import com.rifsxd.ksunext.ui.webui.WebUIActivity +import com.topjohnwu.superuser.io.SuFile +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun ModuleScreen(navigator: DestinationsNavigator) { + val viewModel = viewModel() + val context = LocalContext.current + val snackBarHost = LocalSnackbarHost.current + val scope = rememberCoroutineScope() + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + LaunchedEffect(Unit) { + viewModel.sortAToZ = prefs.getBoolean("module_sort_a_to_z", true) + viewModel.sortZToA = prefs.getBoolean("module_sort_z_to_a", false) + viewModel.sortSizeLowToHigh = prefs.getBoolean("module_sort_size_low_to_high", false) + viewModel.sortSizeHighToLow = prefs.getBoolean("module_sort_size_high_to_low", false) + viewModel.sortEnabledFirst = prefs.getBoolean("module_sort_enabled_first", false) + viewModel.sortActionFirst = prefs.getBoolean("module_sort_action_first", false) + viewModel.sortWebUiFirst = prefs.getBoolean("module_sort_webui_first", false) + + if (viewModel.moduleList.isEmpty() || viewModel.isNeedRefresh) { + viewModel.fetchModuleList() + } + } + + val hasMagisk = hasMagisk() + + val hideInstallButton = hasMagisk + + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + + var zipUri by remember { mutableStateOf(null) } + var zipUris by remember { mutableStateOf>(emptyList()) } + + var showConfirmDialog by remember { mutableStateOf(false) } + + val webUILauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { viewModel.fetchModuleList() } + + val selectZipLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode != RESULT_OK) { + return@rememberLauncherForActivityResult + } + val data = result.data ?: return@rememberLauncherForActivityResult + val clipData = data.clipData + + val uris = mutableListOf() + if (clipData != null) { + for (i in 0 until clipData.itemCount) { + clipData.getItemAt(i)?.uri?.let { uris.add(it) } + } + } else { + data.data?.let { uris.add(it) } + } + + if (uris.isEmpty()) return@rememberLauncherForActivityResult + + viewModel.updateZipUris(uris) + + navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(uris))) + viewModel.clearZipUris() + viewModel.markNeedRefresh() + } + + val listState = rememberLazyListState() + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + Scaffold( + topBar = { + SearchAppBar( + title = { + Text( + text = stringResource(R.string.module), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + searchText = viewModel.search, + onSearchTextChange = { viewModel.search = it }, + onClearClick = { viewModel.search = "" }, + actionsContent = { + IconButton( + onClick = { navigator.navigate(ModuleRepoScreenDestination) } + ) { + Icon( + imageVector = Icons.Filled.Cloud, + contentDescription = stringResource(id = R.string.module_repo_screen) + ) + } + + if (!hideInstallButton) { + IconButton( + onClick = { + val intent = Intent(Intent.ACTION_GET_CONTENT).apply { + type = "application/zip" + putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) + } + selectZipLauncher.launch(intent) + } + ) { + Icon( + imageVector = Icons.Filled.Add, + contentDescription = stringResource(id = R.string.module_install) + ) + } + } + }, + dropdownContent = { + var showDropdown by remember { mutableStateOf(false) } + IconButton( + onClick = { showDropdown = true }, + ) { + Icon( + imageVector = Icons.Filled.MoreVert, + contentDescription = stringResource(id = R.string.settings) + ) + DropdownMenu( + expanded = showDropdown, + onDismissRequest = { + showDropdown = false + } + ) { + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_a_to_z)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortAToZ, onCheckedChange = null) + }, + onClick = { + viewModel.sortAToZ = !viewModel.sortAToZ + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false + viewModel.sortEnabledFirst = false + viewModel.sortActionFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_a_to_z", viewModel.sortAToZ) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_action_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_z_to_a)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortZToA, onCheckedChange = null) + }, + onClick = { + viewModel.sortZToA = !viewModel.sortZToA + viewModel.sortAToZ = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false + viewModel.sortEnabledFirst = false + viewModel.sortActionFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_z_to_a", viewModel.sortZToA) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_action_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_size_low_to_high)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortSizeLowToHigh, onCheckedChange = null) + }, + onClick = { + viewModel.sortSizeLowToHigh = !viewModel.sortSizeLowToHigh + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeHighToLow = false + viewModel.sortEnabledFirst = false + viewModel.sortActionFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_size_low_to_high", viewModel.sortSizeLowToHigh) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_action_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_size_high_to_low)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortSizeHighToLow, onCheckedChange = null) + }, + onClick = { + viewModel.sortSizeHighToLow = !viewModel.sortSizeHighToLow + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortEnabledFirst = false + viewModel.sortActionFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_size_high_to_low", viewModel.sortSizeHighToLow) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_action_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_enabled_first)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortEnabledFirst, onCheckedChange = null) + }, + onClick = { + viewModel.sortEnabledFirst = !viewModel.sortEnabledFirst + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false + viewModel.sortActionFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_enabled_first", viewModel.sortEnabledFirst) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_action_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_action_first)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortActionFirst, onCheckedChange = null) + }, + onClick = { + viewModel.sortActionFirst = !viewModel.sortActionFirst + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false + viewModel.sortEnabledFirst = false + viewModel.sortWebUiFirst = false + prefs.edit { + putBoolean("module_sort_action_first", viewModel.sortActionFirst) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_webui_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_webui_first)) + }, + trailingIcon = { + Checkbox(checked = viewModel.sortWebUiFirst, onCheckedChange = null) + }, + onClick = { + viewModel.sortWebUiFirst = !viewModel.sortWebUiFirst + viewModel.sortAToZ = false + viewModel.sortZToA = false + viewModel.sortSizeLowToHigh = false + viewModel.sortSizeHighToLow = false + viewModel.sortEnabledFirst = false + viewModel.sortActionFirst = false + prefs.edit { + putBoolean("module_sort_webui_first", viewModel.sortWebUiFirst) + putBoolean("module_sort_a_to_z", false) + putBoolean("module_sort_z_to_a", false) + putBoolean("module_sort_size_low_to_high", false) + putBoolean("module_sort_size_high_to_low", false) + putBoolean("module_sort_enabled_first", false) + putBoolean("module_sort_action_first", false) + } + scope.launch { + viewModel.fetchModuleList() + } + } + ) + } + } + }, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = {}, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + snackbarHost = { + SnackbarHost( + hostState = snackBarHost, + modifier = Modifier.padding(bottom = navBarPadding) + ) + } + ) { innerPadding -> + + when { + hasMagisk -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(24.dp), + contentAlignment = Alignment.Center + ) { + Text( + stringResource(R.string.module_magisk_conflict), + textAlign = TextAlign.Center, + ) + } + } + + else -> { + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + ModuleList( + navigator, + viewModel = viewModel, + modifier = Modifier + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + }, + boxModifier = Modifier.padding(innerPadding), + onInstallModule = { + navigator.navigate(FlashScreenDestination(FlashIt.FlashModules(listOf(it)))) + }, + onClickModule = { id, name, hasWebUi -> + if (hasWebUi) { + webUILauncher.launch( + Intent(context, WebUIActivity::class.java) + .setData("kernelsu://webui/$id".toUri()) + .putExtra("id", id) + .putExtra("name", name) + ) + } + }, + context = context, + snackBarHost = snackBarHost, + listState = listState + ) + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun ModuleList( + navigator: DestinationsNavigator, + viewModel: ModuleViewModel, + modifier: Modifier = Modifier, + boxModifier: Modifier = Modifier, + onInstallModule: (Uri) -> Unit, + onClickModule: (id: String, name: String, hasWebUi: Boolean) -> Unit, + context: Context, + snackBarHost: SnackbarHostState, + listState: LazyListState +) { + val failedEnable = stringResource(R.string.module_failed_to_enable) + val failedDisable = stringResource(R.string.module_failed_to_disable) + val failedUninstall = stringResource(R.string.module_uninstall_failed) + val failedRestore = stringResource(R.string.module_restore_failed) + val successUninstall = stringResource(R.string.module_uninstall_success) + val successRestore = stringResource(R.string.module_restore_success) + val reboot = stringResource(R.string.reboot) + val rebootToApply = stringResource(R.string.reboot_to_apply) + val moduleStr = stringResource(R.string.module) + val uninstall = stringResource(R.string.uninstall) + val uninstalled = stringResource(R.string.uninstalled) + val restore = stringResource(R.string.restore) + val cancel = stringResource(android.R.string.cancel) + val moduleUninstallConfirm = stringResource(R.string.module_uninstall_confirm) + val moduleRestoreConfirm = stringResource(R.string.module_restore_confirm) + val updateText = stringResource(R.string.module_update) + val updateLable = stringResource(R.string.module_update_available) + val changelogText = stringResource(R.string.module_changelog) + val downloadingText = stringResource(R.string.module_downloading) + val startDownloadingText = stringResource(R.string.module_start_downloading) + val fetchChangeLogFailed = stringResource(R.string.module_changelog_failed) + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + val loadingDialog = rememberLoadingDialog() + val confirmDialog = rememberConfirmDialog() + + var expandedModuleId by rememberSaveable { mutableStateOf(null) } + + suspend fun onModuleUpdate( + module: ModuleViewModel.ModuleInfo, + changelogUrl: String, + downloadUrl: String, + fileName: String, + ) { + val changelogResult = loadingDialog.withLoading { + withContext(Dispatchers.IO) { + runCatching { + ksuApp.okhttpClient.newCall( + okhttp3.Request.Builder().url(changelogUrl).build() + ).execute().body!!.string() + } + } + } + + val showToast: suspend (String) -> Unit = { msg -> + withContext(Dispatchers.Main) { + Toast.makeText( + context, + msg, + Toast.LENGTH_SHORT + ).show() + } + } + + val changelog = changelogResult.getOrElse { + showToast(fetchChangeLogFailed.format(it.message)) + return + }.ifBlank { + showToast(fetchChangeLogFailed.format(module.name)) + return + } + + // changelog is not empty, show it and wait for confirm + val confirmResult = confirmDialog.awaitConfirm( + changelogText, + content = changelog, + markdown = true, + confirm = updateText, + ) + + if (confirmResult != ConfirmResult.Confirmed) { + return + } + + showToast(startDownloadingText.format(module.name)) + + val downloading = downloadingText.format(module.name) + withContext(Dispatchers.IO) { + download( + context, + downloadUrl, + fileName, + downloading, + onDownloaded = onInstallModule, + onDownloading = { + launch(Dispatchers.Main) { + Toast.makeText(context, downloading, Toast.LENGTH_SHORT).show() + } + } + ) + } + } + + suspend fun onModuleUninstall(module: ModuleViewModel.ModuleInfo) { + val confirmResult = confirmDialog.awaitConfirm( + moduleStr, + content = moduleUninstallConfirm.format(module.name), + confirm = uninstall, + dismiss = cancel + ) + if (confirmResult != ConfirmResult.Confirmed) { + return + } + + val success = withContext(Dispatchers.IO) { + uninstallModule(module.id) + } + + if (success) { + viewModel.fetchModuleList() + } + val message = if (success) { + successUninstall.format(module.name) + } else { + failedUninstall.format(module.name) + } + val actionLabel = if (success) { + reboot + } else { + null + } + val result = snackBarHost.showSnackbar( + message = message, + actionLabel = actionLabel, + duration = SnackbarDuration.Long + ) + if (result == SnackbarResult.ActionPerformed) { + reboot() + } + } + + suspend fun onModuleRestore(module: ModuleViewModel.ModuleInfo) { + val confirmResult = confirmDialog.awaitConfirm( + moduleStr, + content = moduleRestoreConfirm.format(module.name), + confirm = restore, + dismiss = cancel + ) + if (confirmResult != ConfirmResult.Confirmed) { + return + } + + val success = withContext(Dispatchers.IO) { + restoreModule(module.id) + } + + if (success) { + viewModel.fetchModuleList() + } + val message = if (success) { + successRestore.format(module.name) + } else { + failedRestore.format(module.name) + } + } + PullToRefreshBox( + modifier = boxModifier, + isRefreshing = viewModel.isRefreshing, + onRefresh = { + viewModel.fetchModuleList() + } + ) { + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + LazyColumn( + state = listState, + modifier = modifier + .fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(16.dp), + contentPadding = PaddingValues( + start = 16.dp, + top = 16.dp, + end = 16.dp, + bottom = 16.dp + navBarPadding + ) + ) { + when { + viewModel.moduleList.isEmpty() -> { + item { + Box( + modifier = Modifier.fillParentMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + stringResource(R.string.module_empty), + textAlign = TextAlign.Center + ) + } + } + } + else -> { + items(viewModel.moduleList) { module -> + val scope = rememberCoroutineScope() + val updatedModule by produceState(key1 = module.id, initialValue = Triple("", "", "")) { + value = withContext(Dispatchers.IO) { + viewModel.checkUpdate(module) + } + } + + ModuleItem( + navigator = navigator, + module = module, + updateUrl = updatedModule.first, + onUninstall = { + scope.launch { onModuleUninstall(module) } + }, + onRestore = { + scope.launch { onModuleRestore(module) } + }, + onCheckChanged = { + scope.launch { + val success = withContext(Dispatchers.IO) { + toggleModule(module.id, !module.enabled) + } + if (success) { + viewModel.fetchModuleList() + + val result = snackBarHost.showSnackbar( + message = rebootToApply, + actionLabel = reboot, + duration = SnackbarDuration.Long + ) + if (result == SnackbarResult.ActionPerformed) { + reboot() + } + } else { + val message = + if (module.enabled) failedDisable else failedEnable + snackBarHost.showSnackbar(message.format(module.name)) + } + } + }, + onUpdate = { + scope.launch { + onModuleUpdate( + module, + updatedModule.third, + updatedModule.first, + "${module.name}-${updatedModule.second}.zip" + ) + viewModel.markNeedRefresh() + } + }, + onClick = { + onClickModule(it.id, it.name, it.hasWebUi) + }, + expanded = if (developerOptionsEnabled) true else expandedModuleId == module.id, + onExpandToggle = { + if (!developerOptionsEnabled) { + expandedModuleId = if (expandedModuleId == module.id) null else module.id + } + } + ) + + // fix last item shadow incomplete in LazyColumn + Spacer(Modifier.height(1.dp)) + } + } + } + } + + DownloadListener(context, onInstallModule) + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun ModuleItem( + navigator: DestinationsNavigator, + module: ModuleViewModel.ModuleInfo, + updateUrl: String, + onUninstall: (ModuleViewModel.ModuleInfo) -> Unit, + onRestore: (ModuleViewModel.ModuleInfo) -> Unit, + onCheckChanged: (Boolean) -> Unit, + onUpdate: (ModuleViewModel.ModuleInfo) -> Unit, + onClick: (ModuleViewModel.ModuleInfo) -> Unit, + expanded: Boolean, + onExpandToggle: () -> Unit, +) { + val viewModel = viewModel() + var showMenu by remember { mutableStateOf(false) } + var showShortcutDialog by remember { mutableStateOf(false) } + var shortcutType by remember { mutableStateOf("") } + var dialogInitialIcon by remember { mutableStateOf(null) } + + fun normalizeIconPath(p: String?): String? { + if (p.isNullOrBlank()) return null + + try { + val candidate = "/data/adb/modules/${module.id}/$p" + val f = SuFile(candidate) + if (f.exists()) return "su://$candidate" + } catch (_: Exception) { + } + + if (p.startsWith("/")) { + try { + val f = SuFile(p) + if (f.exists()) return "su://$p" + } catch (_: Exception) { + } + return "file://$p" + } + + return p + } + + val haptic = LocalHapticFeedback.current + + val context = LocalContext.current + + if (showShortcutDialog) { + ShortcutDialog( + initialName = module.name, + initialIconUri = dialogInitialIcon, + onDismiss = { showShortcutDialog = false }, + onConfirm = { name, iconUri -> + showShortcutDialog = false + if (shortcutType == "action") { + Shortcut.createModuleActionShortcut(context, module.id, name, iconUri) + } else if (shortcutType == "webui") { + Shortcut.createModuleWebUiShortcut(context, module.id, name, iconUri) + } + } + ) + } + + if (module.hasWebUi || module.hasActionScript) { + if (showMenu) { + Dialog( + onDismissRequest = { showMenu = false } + ) { + Card( + modifier = Modifier.fillMaxWidth(0.95f), + ) { + Column(modifier = Modifier.padding(24.dp)) { + Text( + text = stringResource(R.string.module_shortcut), + style = MaterialTheme.typography.headlineSmall, + fontWeight = FontWeight.Bold + ) + + Spacer(modifier = Modifier.height(14.dp)) + + // Stacked buttons: top (WebUI) and bottom (Action) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + if (module.hasWebUi) { + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + showMenu = false + shortcutType = "webui" + dialogInitialIcon = normalizeIconPath(module.webUiIconPath) + showShortcutDialog = true + }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.AutoMirrored.Outlined.Wysiwyg, + contentDescription = null + ) + Text( + modifier = Modifier.padding(start = 8.dp), + text = stringResource(R.string.create_webui_shortcut), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize + ) + } + } + + if (module.hasActionScript) { + FilledTonalButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + showMenu = false + shortcutType = "action" + dialogInitialIcon = normalizeIconPath(module.actionIconPath) + showShortcutDialog = true + }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.Terminal, + contentDescription = null + ) + Text( + modifier = Modifier.padding(start = 8.dp), + text = stringResource(R.string.create_action_shortcut), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize + ) + } + } + } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End + ) { + TextButton(onClick = { showMenu = false }) { + Text(stringResource(R.string.cancel)) + } + } + } + } + } + } + } + + Card( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .combinedClickable( + onClick = onExpandToggle, + onLongClick = { + showMenu = true + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + } + ) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + ) { + val context = LocalContext.current + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + val useBanner = prefs.getBoolean("use_banner", true) + + val textDecoration = if (!module.remove) null else TextDecoration.LineThrough + + if (useBanner && module.banner.isNotEmpty()) { + val isDark = isSystemInDarkTheme() + val colorScheme = MaterialTheme.colorScheme + val context = LocalContext.current + val amoledMode = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + .getBoolean("amoled_mode", false) + val isDynamic = colorScheme.primary != colorScheme.secondary + + val fadeColor = when { + amoledMode && isDark -> Color.Black + isDynamic -> colorScheme.surface + isDark -> Color(0xFF222222) + else -> Color.White + } + + Box( + modifier = Modifier + .matchParentSize(), + contentAlignment = Alignment.Center + ) { + if (module.banner.startsWith("http", true)) { + AsyncImage( + model = module.banner, + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), + contentScale = ContentScale.Crop, + alpha = 0.18f + ) + } else { + val bannerData = remember(module.banner) { + try { + val file = SuFile("/data/adb/modules/${module.id}/${module.banner}") + return@remember file.newInputStream().use { it.readBytes() } + } catch (_: Exception) { + } + + try { + val file = SuFile("/data/adb/modules_update/${module.id}/${module.banner}") + return@remember file.newInputStream().use { it.readBytes() } + } catch (_: Exception) { + } + + null + } + if (bannerData != null) { + AsyncImage( + model = ImageRequest.Builder(context) + .data(bannerData) + .build(), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), + contentScale = ContentScale.Crop, + alpha = 0.18f + ) + } + } + Box( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .background( + Brush.verticalGradient( + colors = listOf( + fadeColor.copy(alpha = 0.0f), + fadeColor.copy(alpha = 0.8f) + ), + startY = 0f, + endY = Float.POSITIVE_INFINITY + ) + ) + ) + } + } + Column { + val interactionSource = remember { MutableInteractionSource() } + + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + val filterZygiskModules = Natives.isZygiskEnabled() || !module.zygiskRequired + + Column( + modifier = Modifier + .padding(22.dp, 18.dp, 22.dp, 12.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + ) { + val moduleVersion = stringResource(id = R.string.module_version) + val moduleAuthor = stringResource(id = R.string.module_author) + val moduleId = stringResource(id = R.string.module_id) + val moduleVersionCode = stringResource(id = R.string.module_version_code) + val moduleUpdateJson = stringResource(id = R.string.module_update_json) + val moduleUpdateJsonEmpty = stringResource(id = R.string.module_update_json_empty) + + Column( + modifier = Modifier.fillMaxWidth(0.8f) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + LabelItem( + text = formatSize(module.size) + ) + if (module.remove) { + LabelItem( + text = stringResource(R.string.uninstalled), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer + ) + ) + } + if (!Natives.isZygiskEnabled() && module.zygiskRequired && !module.remove) { + LabelItem( + text = stringResource(R.string.zygisk_required), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.errorContainer, + contentColor = MaterialTheme.colorScheme.onErrorContainer + ) + ) + } + if (module.isMetaModule && !module.remove) { + LabelItem( + text = stringResource(R.string.meta_module), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } + if (module.isZygisk && !module.remove) { + LabelItem( + text = stringResource(R.string.zygisk), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } + if (module.enabled && !module.remove) { + if (module.hasWebUi && filterZygiskModules) { + LabelItem( + text = stringResource(R.string.webui), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } + if (module.hasActionScript && filterZygiskModules) { + LabelItem( + text = stringResource(R.string.action), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } + } + if (updateUrl.isNotEmpty() && !module.remove && !module.update) { + LabelItem( + text = stringResource(R.string.module_update_available), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer + ) + ) + } + if (!module.remove) { + if (module.update) { + LabelItem( + text = stringResource(R.string.module_updated), + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer + ) + ) + } + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + Text( + text = module.name, + fontSize = MaterialTheme.typography.titleMedium.fontSize, + fontWeight = FontWeight.SemiBold, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.titleMedium.fontFamily, + textDecoration = textDecoration + ) + + Text( + text = "$moduleVersion: ${module.version}", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + textDecoration = textDecoration + ) + + Text( + text = "$moduleAuthor: ${module.author}", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + textDecoration = textDecoration + ) + + if (developerOptionsEnabled) { + + Text( + text = "$moduleId: ${module.id}", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + textDecoration = textDecoration + ) + + Text( + text = "$moduleVersionCode: ${module.versionCode}", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + textDecoration = textDecoration + ) + + Text( + text = if (module.updateJson.isNotEmpty()) "$moduleUpdateJson: ${module.updateJson}" else "$moduleUpdateJson: $moduleUpdateJsonEmpty", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + textDecoration = textDecoration + ) + } + } + + Spacer(modifier = Modifier.weight(1f)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End, + ) { + Switch( + enabled = !module.update && !module.remove, + checked = module.enabled, + onCheckedChange = onCheckChanged, + interactionSource = if (!module.hasWebUi) interactionSource else null + ) + } + } + + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = module.description, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontFamily = MaterialTheme.typography.bodySmall.fontFamily, + lineHeight = MaterialTheme.typography.bodySmall.lineHeight, + fontWeight = MaterialTheme.typography.bodySmall.fontWeight, + overflow = TextOverflow.Ellipsis, + maxLines = 3, + textDecoration = textDecoration + ) + + Spacer(modifier = Modifier.height(2.dp)) + + if (expanded) { + Spacer(modifier = Modifier.height(10.dp)) + } + + AnimatedVisibility( + visible = expanded, + enter = fadeIn() + expandVertically(), + exit = shrinkVertically() + fadeOut() + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + if (module.hasActionScript) { + FilledTonalButton( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = !module.remove && module.enabled && filterZygiskModules, + onClick = { + navigator.navigate(ExecuteModuleActionScreenDestination(module.id)) + viewModel.markNeedRefresh() + }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.Terminal, + contentDescription = null + ) + if (!module.hasWebUi && updateUrl.isEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + text = stringResource(R.string.action), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize + ) + } + } + + Spacer(modifier = Modifier.weight(0.1f, true)) + } + + if (module.hasWebUi) { + FilledTonalButton( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = !module.remove && module.enabled && filterZygiskModules, + onClick = { onClick(module) }, + interactionSource = interactionSource, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.AutoMirrored.Outlined.Wysiwyg, + contentDescription = null + ) + if (!module.hasActionScript && updateUrl.isEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize, + text = stringResource(R.string.open) + ) + } + } + + Spacer(modifier = Modifier.weight(0.1f, true)) + } + + if (module.donate.isNotEmpty()) { + val donateUrl = module.donate + val ctx = LocalContext.current + FilledTonalButton( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = !module.remove && module.enabled && filterZygiskModules, + onClick = { + try { + val intent = Intent(Intent.ACTION_VIEW, donateUrl.toUri()) + ctx.startActivity(intent) + } catch (e: Exception) { + Toast.makeText(ctx, "Invalid donate url", Toast.LENGTH_SHORT).show() + } + }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.AttachMoney, + contentDescription = null + ) + if (!module.hasActionScript && !module.hasWebUi && updateUrl.isEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize, + text = stringResource(R.string.donate) + ) + } + } + } + + Spacer(modifier = Modifier.weight(1f, true)) + + if (updateUrl.isNotEmpty() && !module.remove && !module.update) { + Button( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = !module.remove, + onClick = { onUpdate(module) }, + shape = ButtonDefaults.textShape, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.Download, + contentDescription = null + ) + if (!module.hasActionScript || !module.hasWebUi || module.donate.isNotEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize, + text = stringResource(R.string.module_update) + ) + } + } + + Spacer(modifier = Modifier.weight(0.1f, true)) + } + + if (module.remove) { + FilledTonalButton( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + onClick = { onRestore(module) }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.Restore, + contentDescription = null + ) + if (!module.hasActionScript && !module.hasWebUi && updateUrl.isEmpty() && module.donate.isEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize, + text = stringResource(R.string.restore) + ) + } + } + } else { + FilledTonalButton( + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = true, + onClick = { onUninstall(module) }, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + Icon( + modifier = Modifier.size(20.dp), + imageVector = Icons.Outlined.Delete, + contentDescription = null + ) + if (!module.hasActionScript && !module.hasWebUi && updateUrl.isEmpty()) { + Text( + modifier = Modifier.padding(start = 7.dp), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize, + text = stringResource(R.string.uninstall) + ) + } + } + } + } + } + } + } + } + } +} + +fun formatSize(size: Long): String { + if (size == 0L) return "null" + val kb = 1024 + val mb = kb * 1024 + val gb = mb * 1024 + return when { + size >= gb -> "%.2f GB".format(size.toDouble() / gb) + size >= mb -> "%.2f MB".format(size.toDouble() / mb) + size >= kb -> "%.2f KB".format(size.toDouble() / kb) + else -> "$size B" + } +} + +@Preview +@Composable +fun ModuleItemPreview() { + val module = ModuleViewModel.ModuleInfo( + id = "id", + name = "name", + version = "version", + versionCode = 1, + author = "author", + description = "I am a test module and i do nothing but show a very long description", + enabled = true, + update = true, + remove = false, + updateJson = "", + hasWebUi = false, + hasActionScript = false, + size = 12345678L, + banner = "", + zygiskRequired = false, + isMetaModule = false, + actionIconPath = null, + webUiIconPath = null, + donate = "", + isZygisk = false, + ) + ModuleItem( + EmptyDestinationsNavigator, + module, + "", + {}, + {}, + {}, + {}, + {}, + false, + {} + ) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ModuleRepo.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ModuleRepo.kt new file mode 100644 index 000000000000..733f95bfe456 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/ModuleRepo.kt @@ -0,0 +1,1009 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import android.content.SharedPreferences +import android.net.Uri +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.FlashScreenDestination +import com.ramcosta.composedestinations.generated.destinations.MetaModuleScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.BuildConfig +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.util.LocalSnackbarHost +import com.rifsxd.ksunext.ui.screen.FlashIt +import com.rifsxd.ksunext.ui.util.download +import com.rifsxd.ksunext.ui.util.DownloadListener +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.rifsxd.ksunext.ui.component.SearchAppBar +import org.json.JSONArray +import java.io.BufferedReader +import java.io.InputStreamReader +import java.net.URL +import android.content.Intent + +data class ModuleRepo( + val name: String, + val description: String, + val author: String, + val repoUrl: String, + val bannerLink: String = "", + val license: String = "", + val visibility: Int = 1, + val latestVersion: String = "", + val downloadUrl: String = "", + val stars: Int = -1, + val isLoading: Boolean = true +) + +sealed class ModuleRepoState { + object Loading : ModuleRepoState() + data class Success(val modules: List) : ModuleRepoState() + data class Error(val message: String) : ModuleRepoState() +} + +// SharedPreferences helper functions +private const val PREFS_NAME = "module_repo_prefs" +private const val KEY_JSON_URLS = "json_urls" +private const val KEY_NON_FREE_ENABLED = "non_free_enabled" +private const val DEFAULT_JSON_URL = "https://raw.githubusercontent.com/KernelSU-Next/KernelSU-Next-Modules-Repo/refs/heads/main/modules.json" +private const val NON_FREE_JSON_URL = "https://raw.githubusercontent.com/KernelSU-Next/KernelSU-Next-Modules-Repo/refs/heads/main/non_free_modules.json" +private const val URL_SEPARATOR = "|||" + +private fun getModuleRepoPrefs(context: Context): SharedPreferences { + return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) +} + +private fun saveJsonUrls(context: Context, urls: List) { + val joined = urls.joinToString(URL_SEPARATOR) + getModuleRepoPrefs(context).edit().putString(KEY_JSON_URLS, joined).apply() +} + +private fun loadJsonUrls(context: Context): List { + val raw = getModuleRepoPrefs(context).getString(KEY_JSON_URLS, null) + return if (raw.isNullOrBlank()) { + listOf(DEFAULT_JSON_URL) + } else { + raw.split(URL_SEPARATOR).filter { it.isNotBlank() } + } +} + +private fun saveNonFreeEnabled(context: Context, enabled: Boolean) { + getModuleRepoPrefs(context).edit().putBoolean(KEY_NON_FREE_ENABLED, enabled).apply() +} + +private fun loadNonFreeEnabled(context: Context): Boolean { + return getModuleRepoPrefs(context).getBoolean(KEY_NON_FREE_ENABLED, false) +} + +/** + * @author rifsxd + * @date 2026/1/29. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun ModuleRepoScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + val snackBarHost = LocalSnackbarHost.current + val context = LocalContext.current + val scope = rememberCoroutineScope() + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + var jsonUrls by remember { mutableStateOf(loadJsonUrls(context)) } + var nonFreeEnabled by remember { mutableStateOf(loadNonFreeEnabled(context)) } + + // Repo manager dialog + var showRepoManagerDialog by remember { mutableStateOf(false) } + // Add/edit URL dialog — editingIndex == null means adding new + var showAddEditDialog by remember { mutableStateOf(false) } + var editingIndex by remember { mutableStateOf(null) } + var pendingUrl by remember { mutableStateOf("") } + + var searchText by remember { mutableStateOf("") } + var moduleState by remember { mutableStateOf(ModuleRepoState.Loading) } + var downloadingModuleName by remember { mutableStateOf(null) } + var downloadedUri by remember { mutableStateOf(null) } + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + var sortAToZ by remember { mutableStateOf(prefs.getBoolean("module_sort_a_to_z", true)) } + var sortZToA by remember { mutableStateOf(prefs.getBoolean("module_sort_z_to_a", false)) } + var sortStarsLowToHigh by remember { mutableStateOf(prefs.getBoolean("module_sort_stars_low_to_high", false)) } + var sortStarsHighToLow by remember { mutableStateOf(prefs.getBoolean("module_sort_stars_high_to_low", false)) } + + DownloadListener(context) { uri -> + downloadedUri = uri + downloadingModuleName = null + navigator.navigate( + FlashScreenDestination(FlashIt.FlashModules(listOf(uri))) + ) + } + + suspend fun fetchModuleReposFromJson(jsonUrl: String): List { + return withContext(Dispatchers.IO) { + try { + val conn = URL(jsonUrl).openConnection() as java.net.HttpURLConnection + conn.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + val text = BufferedReader(InputStreamReader(conn.inputStream)).use { it.readText() } + conn.disconnect() + + val arr = JSONArray(text) + val out = mutableListOf() + for (i in 0 until arr.length()) { + val obj = arr.getJSONObject(i) + out += ModuleRepo( + name = obj.optString("name"), + description = obj.optString("description"), + author = obj.optString("author"), + repoUrl = obj.optString("repoUrl"), + bannerLink = obj.optString("bannerUrl", ""), + license = obj.optString("license", ""), + visibility = obj.optInt("visibility", 1) + ) + } + out + } catch (e: Exception) { + e.printStackTrace() + emptyList() + } + } + } + + suspend fun loadModules() { + try { + moduleState = ModuleRepoState.Loading + + // Fetch all repo JSONs in parallel then merge + val effectiveUrls = if (nonFreeEnabled) jsonUrls + NON_FREE_JSON_URL else jsonUrls + val allModules = withContext(Dispatchers.IO) { + effectiveUrls.map { url -> async { fetchModuleReposFromJson(url) } } + .awaitAll() + .flatten() + } + + // Deduplicate by (name + repoUrl), keep first occurrence + val seen = mutableSetOf() + val visibleModules = allModules + .filter { it.visibility == 1 } + .filter { module -> seen.add("${module.name}||${module.repoUrl}") } + + if (visibleModules.isEmpty()) { + moduleState = ModuleRepoState.Error("No modules found across all repositories") + return + } + + moduleState = ModuleRepoState.Success( + visibleModules.map { it.copy(latestVersion = "", downloadUrl = "", stars = -1, isLoading = true) } + ) + + kotlinx.coroutines.coroutineScope { + visibleModules.forEach { baseModule -> + launch { + try { + val releaseInfo = withContext(Dispatchers.IO) { fetchLatestReleaseInfo(baseModule.repoUrl) } + val updated = baseModule.copy( + latestVersion = releaseInfo?.version ?: "null", + downloadUrl = releaseInfo?.zipUrl ?: "", + stars = releaseInfo?.stars ?: -1, + isLoading = false + ) + val current = moduleState + if (current is ModuleRepoState.Success) { + val mutable = current.modules.toMutableList() + val idx = mutable.indexOfFirst { it.name == baseModule.name && it.repoUrl == baseModule.repoUrl } + if (idx >= 0) mutable[idx] = updated else mutable.add(updated) + moduleState = ModuleRepoState.Success(mutable) + } + } catch (e: Exception) { + val updated = baseModule.copy(latestVersion = "null", downloadUrl = "", stars = -1, isLoading = false) + val current = moduleState + if (current is ModuleRepoState.Success) { + val mutable = current.modules.toMutableList() + val idx = mutable.indexOfFirst { it.name == baseModule.name && it.repoUrl == baseModule.repoUrl } + if (idx >= 0) mutable[idx] = updated else mutable.add(updated) + moduleState = ModuleRepoState.Success(mutable) + } + } + } + } + } + } catch (e: Exception) { + moduleState = ModuleRepoState.Error(e.message ?: "Unknown error") + } + } + + LaunchedEffect(jsonUrls, nonFreeEnabled) { + scope.launch { loadModules() } + } + + if (showRepoManagerDialog) { + AlertDialog( + onDismissRequest = { showRepoManagerDialog = false }, + title = { Text(stringResource(R.string.manage_repositories)) }, + text = { + Column(modifier = Modifier.fillMaxWidth()) { + // Non-free repo toggle + Row( + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 4.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = stringResource(R.string.non_free_repo), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold + ) + Text( + text = stringResource(R.string.non_free_repo_summary), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + Switch( + checked = nonFreeEnabled, + onCheckedChange = { enabled -> + nonFreeEnabled = enabled + saveNonFreeEnabled(context, enabled) + } + ) + } + + HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp)) + + if (jsonUrls.isEmpty()) { + Text( + text = stringResource(R.string.no_repositories_configured), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 8.dp) + ) + } else { + jsonUrls.forEachIndexed { index, url -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = url, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.weight(1f), + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + IconButton( + onClick = { + editingIndex = index + pendingUrl = url + showAddEditDialog = true + } + ) { + Icon(Icons.Default.Edit, contentDescription = "Edit") + } + // Prevent deletion of the last remaining repo + IconButton( + onClick = { + val updated = jsonUrls.toMutableList().also { it.removeAt(index) } + jsonUrls = updated + saveJsonUrls(context, updated) + }, + enabled = jsonUrls.size > 1 + ) { + Icon(Icons.Default.Delete, contentDescription = "Remove") + } + } + if (index < jsonUrls.lastIndex) { + HorizontalDivider() + } + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + OutlinedButton( + onClick = { + editingIndex = null + pendingUrl = "" + showAddEditDialog = true + }, + modifier = Modifier.fillMaxWidth() + ) { + Icon(Icons.Default.Add, contentDescription = null, modifier = Modifier.size(18.dp)) + Spacer(modifier = Modifier.width(6.dp)) + Text(stringResource(R.string.add_repository)) + } + + TextButton( + onClick = { + jsonUrls = listOf(DEFAULT_JSON_URL) + saveJsonUrls(context, listOf(DEFAULT_JSON_URL)) + }, + modifier = Modifier.fillMaxWidth() + ) { + Text(stringResource(R.string.reset_to_default)) + } + } + }, + confirmButton = { + TextButton(onClick = { showRepoManagerDialog = false }) { + Text(stringResource(R.string.close)) + } + } + ) + } + + if (showAddEditDialog) { + AlertDialog( + onDismissRequest = { + showAddEditDialog = false + pendingUrl = "" + }, + title = { Text(if (editingIndex == null) "Add Repository" else "Edit Repository") }, + text = { + Column { + Text( + text = "Enter the module repository JSON URL:", + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 8.dp) + ) + OutlinedTextField( + value = pendingUrl, + onValueChange = { pendingUrl = it }, + modifier = Modifier.fillMaxWidth(), + singleLine = false, + maxLines = 3, + placeholder = { Text("https://...") } + ) + } + }, + confirmButton = { + TextButton( + onClick = { + val trimmed = pendingUrl.trim() + if (trimmed.isNotBlank()) { + val updated = jsonUrls.toMutableList() + val idx = editingIndex + if (idx == null) updated.add(trimmed) else updated[idx] = trimmed + jsonUrls = updated + saveJsonUrls(context, updated) + showAddEditDialog = false + pendingUrl = "" + } + } + ) { + Text(if (editingIndex == null) "Add" else "Apply") + } + }, + dismissButton = { + TextButton( + onClick = { + showAddEditDialog = false + pendingUrl = "" + } + ) { + Text("Cancel") + } + } + ) + } + + Scaffold( + topBar = { + SearchAppBar( + title = { + Text( + text = stringResource(R.string.module_repo_screen), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + searchText = searchText, + onSearchTextChange = { searchText = it }, + onClearClick = { searchText = "" }, + onBackClick = dropUnlessResumed { navigator.popBackStack() }, + actionsContent = { + IconButton(onClick = { showRepoManagerDialog = true }) { + Icon( + imageVector = Icons.Filled.Edit, + contentDescription = "Manage Repositories" + ) + } + IconButton(onClick = { navigator.navigate(MetaModuleScreenDestination) }) { + Icon( + imageVector = Icons.Filled.SettingsSuggest, + contentDescription = stringResource(id = R.string.module_repo_screen) + ) + } + }, + dropdownContent = { + var showDropdown by remember { mutableStateOf(false) } + IconButton( + onClick = { showDropdown = true }, + ) { + Icon( + imageVector = Icons.Filled.MoreVert, + contentDescription = stringResource(id = R.string.settings) + ) + DropdownMenu( + expanded = showDropdown, + onDismissRequest = { + showDropdown = false + } + ) { + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_a_to_z)) + }, + trailingIcon = { + Checkbox(checked = sortAToZ, onCheckedChange = null) + }, + onClick = { + sortAToZ = !sortAToZ + sortZToA = false + sortStarsLowToHigh = false + sortStarsHighToLow = false + prefs.edit().putBoolean("module_sort_a_to_z", sortAToZ).apply() + prefs.edit().putBoolean("module_sort_z_to_a", false).apply() + prefs.edit().putBoolean("module_sort_stars_low_to_high", false).apply() + prefs.edit().putBoolean("module_sort_stars_high_to_low", false).apply() + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_z_to_a)) + }, + trailingIcon = { + Checkbox(checked = sortZToA, onCheckedChange = null) + }, + onClick = { + sortZToA = !sortZToA + sortAToZ = false + sortStarsLowToHigh = false + sortStarsHighToLow = false + prefs.edit().putBoolean("module_sort_z_to_a", sortZToA).apply() + prefs.edit().putBoolean("module_sort_a_to_z", false).apply() + prefs.edit().putBoolean("module_sort_stars_low_to_high", false).apply() + prefs.edit().putBoolean("module_sort_stars_high_to_low", false).apply() + } + ) + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_stars_low_to_high)) + }, + trailingIcon = { + Checkbox(checked = sortStarsLowToHigh, onCheckedChange = null) + }, + onClick = { + sortStarsLowToHigh = !sortStarsLowToHigh + sortStarsHighToLow = false + sortAToZ = false + sortZToA = false + prefs.edit().putBoolean("module_sort_stars_low_to_high", sortStarsLowToHigh).apply() + prefs.edit().putBoolean("module_sort_stars_high_to_low", false).apply() + prefs.edit().putBoolean("module_sort_a_to_z", false).apply() + prefs.edit().putBoolean("module_sort_z_to_a", false).apply() + } + ) + + DropdownMenuItem( + text = { + Text(stringResource(R.string.module_sort_stars_high_to_low)) + }, + trailingIcon = { + Checkbox(checked = sortStarsHighToLow, onCheckedChange = null) + }, + onClick = { + sortStarsHighToLow = !sortStarsHighToLow + sortStarsLowToHigh = false + sortAToZ = false + sortZToA = false + prefs.edit().putBoolean("module_sort_stars_high_to_low", sortStarsHighToLow).apply() + prefs.edit().putBoolean("module_sort_stars_low_to_high", false).apply() + prefs.edit().putBoolean("module_sort_a_to_z", false).apply() + prefs.edit().putBoolean("module_sort_z_to_a", false).apply() + } + ) + } + } + }, + scrollBehavior = scrollBehavior + ) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { paddingValues -> + when (val state = moduleState) { + is ModuleRepoState.Loading -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() + } + } + is ModuleRepoState.Success -> { + val filteredModules = if (searchText.isBlank()) { + state.modules + } else { + state.modules.filter { module -> + module.name.contains(searchText, ignoreCase = true) || + module.description.contains(searchText, ignoreCase = true) || + module.author.contains(searchText, ignoreCase = true) + } + } + + val sortedModules = when { + sortAToZ -> filteredModules.sortedBy { it.name.lowercase() } + sortZToA -> filteredModules.sortedByDescending { it.name.lowercase() } + sortStarsLowToHigh -> filteredModules.sortedWith(compareBy { if (it.stars < 0) Int.MAX_VALUE else it.stars }) + sortStarsHighToLow -> filteredModules.sortedWith(compareByDescending { if (it.stars < 0) Int.MIN_VALUE else it.stars }) + else -> filteredModules + } + + val isRefreshing = moduleState is ModuleRepoState.Loading + + PullToRefreshBox( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + isRefreshing = isRefreshing, + onRefresh = { + scope.launch { + moduleState = ModuleRepoState.Loading + loadModules() + } + } + ) { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + }, + contentPadding = PaddingValues(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 16.dp + navBarPadding), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(sortedModules) { module -> + val isThisModuleDownloading = downloadingModuleName == module.name + + val isInstallEnabled = when { + downloadingModuleName != null && !isThisModuleDownloading -> false + else -> true + } + + ModuleRepoCard( + module = module, + isInstallEnabled = isInstallEnabled, + isDownloading = isThisModuleDownloading, + onCardClick = { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(module.repoUrl)) + context.startActivity(intent) + }, + onDownload = { selectedModule -> + downloadingModuleName = selectedModule.name + scope.launch { + try { + val fileName = "${selectedModule.name.replace(" ", "_")}_${selectedModule.latestVersion.replace("/", "_")}.zip" + download( + context, + selectedModule.downloadUrl, + fileName, + "Downloading ${selectedModule.name}" + ) + } catch (e: Exception) { + snackBarHost.showSnackbar("Error downloading module: ${e.message}") + downloadingModuleName = null + } + } + } + ) + } + } + } + } + is ModuleRepoState.Error -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(16.dp) + ) { + Text( + text = stringResource(R.string.error_loading_modules), + style = MaterialTheme.typography.titleMedium + ) + Button( + onClick = { + scope.launch { + moduleState = ModuleRepoState.Loading + loadModules() + } + }, + modifier = Modifier.padding(top = 16.dp) + ) { + Text(stringResource(R.string.retry)) + } + } + } + } + } + } +} + +@Composable +private fun ModuleRepoCard( + module: ModuleRepo, + isInstallEnabled: Boolean = true, + isDownloading: Boolean = false, + onCardClick: () -> Unit, + onDownload: (ModuleRepo) -> Unit, + modifier: Modifier = Modifier +) { + Card( + modifier = modifier + .fillMaxWidth() + .clickable { onCardClick() } + ) { + Box(modifier = Modifier.fillMaxWidth()) { + val context = LocalContext.current + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val useBanner = prefs.getBoolean("use_banner", true) + + if (useBanner && module.bannerLink.isNotEmpty()) { + val isDark = isSystemInDarkTheme() + val colorScheme = MaterialTheme.colorScheme + val amoledMode = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + .getBoolean("amoled_mode", false) + val isDynamic = colorScheme.primary != colorScheme.secondary + + val fadeColor = when { + amoledMode && isDark -> Color.Black + isDynamic -> colorScheme.surface + isDark -> Color(0xFF222222) + else -> Color.White + } + + Box( + modifier = Modifier + .matchParentSize(), + contentAlignment = Alignment.Center + ) { + if (module.bannerLink.startsWith("http", true)) { + AsyncImage( + model = module.bannerLink, + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), + contentScale = ContentScale.Crop, + alpha = 0.18f + ) + } + + Box( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .background( + Brush.verticalGradient( + colors = listOf( + fadeColor.copy(alpha = 0.0f), + fadeColor.copy(alpha = 0.8f) + ), + startY = 0f, + endY = Float.POSITIVE_INFINITY + ) + ) + ) + } + } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(22.dp, 18.dp, 22.dp, 12.dp) + ) { + val hasLicense = module.license.isNotEmpty() + val hasStars = !module.isLoading && module.stars >= 0 + + if (hasLicense || hasStars) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + if (hasLicense) { + LabelItem( + icon = { + Icon( + tint = LabelItemDefaults.style.contentColor, + imageVector = Icons.Filled.LocalOffer, + contentDescription = null + ) + }, + text = { + Text( + text = module.license, + style = LabelItemDefaults.style.textStyle.copy( + color = LabelItemDefaults.style.contentColor, + ) + ) + } + ) + } + if (hasStars) { + val starsText = when { + module.stars >= 1_000 -> "${"%.1f".format(module.stars / 1000.0)}k" + else -> "${module.stars}" + } + LabelItem( + icon = { + Icon( + imageVector = Icons.Filled.Star, + tint = MaterialTheme.colorScheme.onTertiaryContainer, + contentDescription = null + ) + }, + text = { + Text( + text = starsText, + style = LabelItemDefaults.style.textStyle.copy( + color = MaterialTheme.colorScheme.onTertiaryContainer, + ) + ) + }, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer + ) + ) + } + } + Spacer(modifier = Modifier.height(8.dp)) + } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Text( + text = module.name, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold + ) + Text( + text = "by ${module.author}", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + Text( + text = module.description, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(top = 8.dp) + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + text = stringResource(R.string.latest_version), + style = MaterialTheme.typography.labelSmall + ) + Text( + text = if (module.latestVersion.isNotEmpty()) module.latestVersion else stringResource(R.string.loading), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold + ) + } + + Button( + onClick = { onDownload(module) }, + modifier = Modifier.defaultMinSize(52.dp, 32.dp), + enabled = module.downloadUrl.isNotEmpty() && isInstallEnabled, + shape = ButtonDefaults.textShape, + contentPadding = ButtonDefaults.TextButtonContentPadding + ) { + if (isDownloading) { + CircularProgressIndicator( + modifier = Modifier.size(18.dp), + strokeWidth = 2.dp, + color = MaterialTheme.colorScheme.onPrimary + ) + } else { + Icon( + imageVector = Icons.Default.CloudDownload, + contentDescription = "Download", + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(7.dp)) + Text( + modifier = Modifier.padding(start = 0.dp), + text = stringResource(R.string.install), + fontFamily = MaterialTheme.typography.labelMedium.fontFamily, + fontSize = MaterialTheme.typography.labelMedium.fontSize + ) + } + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit = {}, + onMetaModuleClick: () -> Unit = {}, + onManageRepos: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.module_repo_screen), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + navigationIcon = { + IconButton(onClick = onBack) { + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) + } + }, + actions = { + IconButton(onClick = onManageRepos) { + Icon(Icons.Filled.Edit, contentDescription = "Manage Repositories") + } + IconButton(onClick = onMetaModuleClick) { + Icon(Icons.Filled.SettingsSuggest, contentDescription = stringResource(id = R.string.module_repo_screen)) + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +private suspend fun fetchLatestReleaseInfo(repoUrl: String): ReleaseInfoModuleRepo? { + return withContext(Dispatchers.IO) { + try { + val stars = try { + val htmlConn = URL(repoUrl).openConnection() as java.net.HttpURLConnection + htmlConn.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + htmlConn.setRequestProperty("Accept", "text/html") + val html = BufferedReader(InputStreamReader(htmlConn.inputStream)).use { it.readText() } + htmlConn.disconnect() + val titleMatch = """id="repo-stars-counter-star"[^>]*title="([^"]+)"""".toRegex() + .find(html)?.groupValues?.get(1) + titleMatch?.replace(",", "")?.trim()?.toIntOrNull() ?: -1 + } catch (e: Exception) { + e.printStackTrace() + -1 + } + + val latestUrl = "$repoUrl/releases/latest" + val connection = URL(latestUrl).openConnection() as java.net.HttpURLConnection + connection.instanceFollowRedirects = false + connection.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + + val redirectUrl = connection.getHeaderField("Location") + connection.disconnect() + + if (redirectUrl == null) return@withContext ReleaseInfoModuleRepo( + version = "null", + zipUrl = "", + stars = stars + ) + + val tagMatch = """/tag/([^/?\s]+)""".toRegex() + .find(redirectUrl)?.groupValues?.get(1) + ?: return@withContext ReleaseInfoModuleRepo(version = "null", zipUrl = "", stars = stars) + + val releasePageUrl = "$repoUrl/releases/expanded_assets/$tagMatch" + val pageConnection = URL(releasePageUrl).openConnection() + pageConnection.setRequestProperty("User-Agent", "KernelSU-Next/${BuildConfig.VERSION_CODE}") + + val pageHtml = BufferedReader(InputStreamReader(pageConnection.getInputStream())).use { + it.readText() + } + + val zipUrlMatch = """href="(/[^"]+/releases/download/[^"]+\.zip)"""".toRegex() + .find(pageHtml)?.groupValues?.get(1) + + ReleaseInfoModuleRepo( + version = tagMatch, + zipUrl = if (zipUrlMatch != null) "https://github.com$zipUrlMatch" else "", + stars = stars + ) + } catch (e: Exception) { + e.printStackTrace() + null + } + } +} + +data class ReleaseInfoModuleRepo( + val version: String, + val zipUrl: String, + val stars: Int = -1 +) + +@Preview +@Composable +private fun ModuleRepoScreenPreview() { + ModuleRepoScreen(EmptyDestinationsNavigator) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt new file mode 100644 index 000000000000..4720ba4fdc6d --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Settings.kt @@ -0,0 +1,675 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.background +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.ui.draw.clip +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Undo +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.LineHeightStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.content.FileProvider +import androidx.core.content.edit +import androidx.compose.ui.graphics.Color +import androidx.compose.material3.ListItemDefaults +import com.maxkeppeker.sheets.core.models.base.Header +import com.maxkeppeker.sheets.core.models.base.IconSource +import com.maxkeppeker.sheets.core.models.base.rememberUseCaseState +import com.maxkeppeler.sheets.list.ListDialog +import com.maxkeppeler.sheets.list.models.ListOption +import com.maxkeppeler.sheets.list.models.ListSelection +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.* +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator +import com.rifsxd.ksunext.BuildConfig +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.* +import com.rifsxd.ksunext.ui.util.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +/** + * @author weishu + * @date 2023/1/1. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +fun SettingScreen(navigator: DestinationsNavigator) { + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val snackBarHost = LocalSnackbarHost.current + + val isManager = Natives.isManager + val ksuVersion = if (isManager) Natives.version else null + + val context = LocalContext.current + val scope = rememberCoroutineScope() + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + val aboutDialog = rememberCustomDialog { + AboutDialog(it) + } + val loadingDialog = rememberLoadingDialog() + + val exportBugreportLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.CreateDocument("application/gzip") + ) { uri: Uri? -> + if (uri == null) return@rememberLauncherForActivityResult + scope.launch(Dispatchers.IO) { + loadingDialog.show() + context.contentResolver.openOutputStream(uri)?.use { output -> + getBugreportFile(context).inputStream().use { + it.copyTo(output) + } + } + loadingDialog.hide() + snackBarHost.showSnackbar(context.getString(R.string.log_saved)) + } + } + + var avcSpoofStatus by rememberSaveable { mutableStateOf("") } + var suCompatStatus by rememberSaveable { mutableStateOf("") } + var kernelUmountStatus by rememberSaveable { mutableStateOf("") } + + LaunchedEffect(Unit) { + avcSpoofStatus = getFeatureStatus("avc_spoof") + suCompatStatus = getFeatureStatus("su_compat") + kernelUmountStatus = getFeatureStatus("kernel_umount") + } + + Scaffold( + topBar = { + TopBar(scrollBehavior = scrollBehavior) + }, + snackbarHost = { SnackbarHost(snackBarHost, modifier = Modifier.padding(bottom = navBarPadding)) }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + .padding(top = 16.dp) + .padding(bottom = navBarPadding) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + if (ksuVersion != null) { + KernelFeaturesCard( + suCompatStatus = suCompatStatus, + kernelUmountStatus = kernelUmountStatus, + avcSpoofStatus = avcSpoofStatus + ) + SecurityCard( + navigator = navigator, + loadingDialog = loadingDialog + ) + } + + AppSettingsCard( + navigator = navigator, + prefs = prefs, + aboutDialog = aboutDialog, + exportBugreportLauncher = exportBugreportLauncher, + loadingDialog = loadingDialog, + scope = scope, + context = context + ) + + Spacer(Modifier) + } + } +} + +@Composable +private fun KernelFeaturesCard( + suCompatStatus: String, + kernelUmountStatus: String, + avcSpoofStatus: String +) { + val context = LocalContext.current + + Card(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + var umountChecked by rememberSaveable { + mutableStateOf(Natives.isDefaultUmountModules()) + } + + SwitchItem( + icon = Icons.Filled.FolderDelete, + title = stringResource(R.string.settings_umount_modules_default), + summary = stringResource(R.string.settings_umount_modules_default_summary), + checked = umountChecked, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { + if (Natives.setDefaultUmountModules(it)) { + umountChecked = it + } + } + + if (suCompatStatus == "supported") { + var isSuEnabled by rememberSaveable { + mutableStateOf(Natives.isSuEnabled()) + } + SwitchItem( + icon = Icons.Filled.RemoveModerator, + title = stringResource(R.string.settings_enable_su), + summary = stringResource(R.string.settings_enable_su_summary), + checked = isSuEnabled, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { checked -> + val prefsLocal = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + if (Natives.setSuEnabled(checked)) { + execKsud("feature save", true) + prefsLocal.edit { putInt("su_compat_mode", if (checked) 0 else 2) } + isSuEnabled = checked + } + } + } + + if (kernelUmountStatus == "supported") { + var isKernelUmountEnabled by rememberSaveable { + mutableStateOf(Natives.isKernelUmountEnabled()) + } + SwitchItem( + icon = Icons.Filled.RemoveCircle, + title = stringResource(id = R.string.settings_enable_kernel_umount), + summary = stringResource(id = R.string.settings_enable_kernel_umount_summary), + checked = isKernelUmountEnabled, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { checked -> + val prefsLocal = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + if (Natives.setKernelUmountEnabled(checked)) { + execKsud("feature save", true) + prefsLocal.edit { putInt("kernel_umount_mode", if (checked) 0 else 2) } + isKernelUmountEnabled = checked + } + } + } + + if (avcSpoofStatus == "supported") { + var isAvcSpoofEnabled by rememberSaveable { + mutableStateOf(Natives.isAvcSpoofEnabled()) + } + SwitchItem( + icon = Icons.Filled.Shield, + title = stringResource(id = R.string.settings_enable_avc_spoof), + summary = stringResource(id = R.string.settings_enable_avc_spoof_summary), + checked = isAvcSpoofEnabled, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { checked -> + val prefsLocal = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + if (Natives.setAvcSpoofEnabled(checked)) { + execKsud("feature save", true) + prefsLocal.edit { putInt("avc_spoof_mode", if (checked) 0 else 2) } + isAvcSpoofEnabled = checked + } + } + } + } + } +} + +@Composable +private fun SecurityCard( + navigator: DestinationsNavigator, + loadingDialog: LoadingDialogHandle +) { + Card(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + var isSelinuxPermissive by rememberSaveable { + mutableStateOf(getSelinuxEnforce() == false) + } + + SwitchItem( + icon = Icons.Filled.Security, + title = stringResource(R.string.set_selinux), + summary = stringResource(R.string.set_selinux_summary), + checked = isSelinuxPermissive, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { checked -> + val shouldEnforce = !checked + if (setSelinuxEnforce(shouldEnforce)) { + isSelinuxPermissive = !shouldEnforce + } + } + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { navigator.navigate(AppProfileTemplateScreenDestination) }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.Fence, null) }, + headlineContent = { + Text( + text = stringResource(R.string.settings_profile_template), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + }, + supportingContent = { + Text(stringResource(R.string.settings_profile_template_summary)) + } + ) + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { navigator.navigate(BackupRestoreScreenDestination) }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.Backup, null) }, + headlineContent = { + Text( + text = stringResource(R.string.backup_restore), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { navigator.navigate(DeveloperScreenDestination) }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.DeveloperBoard, null) }, + headlineContent = { + Text( + text = stringResource(R.string.developer), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) + + if (Natives.isLkmMode) { + UninstallItem( + navigator = navigator, + withLoading = { loadingDialog.withLoading(it) }, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)) + ) + } + } + } +} + +@Composable +private fun AppSettingsCard( + navigator: DestinationsNavigator, + prefs: android.content.SharedPreferences, + aboutDialog: DialogHandle, + exportBugreportLauncher: androidx.activity.result.ActivityResultLauncher, + loadingDialog: LoadingDialogHandle, + scope: kotlinx.coroutines.CoroutineScope, + context: android.content.Context +) { + Card(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + var checkUpdate by rememberSaveable { + mutableStateOf(prefs.getBoolean("check_update", true)) + } + + SwitchItem( + icon = Icons.Filled.Update, + title = stringResource(R.string.settings_check_update), + summary = stringResource(R.string.settings_check_update_summary), + checked = checkUpdate, + modifier = Modifier.fillMaxWidth().clip(RoundedCornerShape(8.dp)), + colors = ListItemDefaults.colors(containerColor = Color.Transparent) + ) { + prefs.edit { putBoolean("check_update", it) } + checkUpdate = it + } + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { navigator.navigate(CustomizationScreenDestination) }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.Palette, null) }, + headlineContent = { + Text( + text = stringResource(R.string.customization), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) + + var showBottomsheet by remember { mutableStateOf(false) } + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { showBottomsheet = true }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.BugReport, null) }, + headlineContent = { + Text( + text = stringResource(R.string.export_log), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) + + if (showBottomsheet) { + ExportLogBottomSheet( + onDismiss = { showBottomsheet = false }, + onSave = { + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm") + val current = LocalDateTime.now().format(formatter) + exportBugreportLauncher.launch("KernelSU_Next_bugreport_${current}.tar.gz") + showBottomsheet = false + }, + onShare = { + scope.launch { + val bugreport = loadingDialog.withLoading { + withContext(Dispatchers.IO) { + getBugreportFile(context) + } + } + val uri: Uri = FileProvider.getUriForFile( + context, + "${BuildConfig.APPLICATION_ID}.fileprovider", + bugreport + ) + val shareIntent = Intent(Intent.ACTION_SEND).apply { + putExtra(Intent.EXTRA_STREAM, uri) + setDataAndType(uri, "application/gzip") + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + context.startActivity( + Intent.createChooser(shareIntent, context.getString(R.string.send_log)) + ) + } + showBottomsheet = false + } + ) + } + + ListItem( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { aboutDialog.show() }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.ContactPage, null) }, + headlineContent = { + Text( + text = stringResource(R.string.about), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun ExportLogBottomSheet( + onDismiss: () -> Unit, + onSave: () -> Unit, + onShare: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = onDismiss, + content = { + Row( + modifier = Modifier + .padding(10.dp) + .align(Alignment.CenterHorizontally) + ) { + Box { + Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + IconButton( + onClick = onSave, + modifier = Modifier.size(56.dp).clip(CircleShape) + ) { + Icon(Icons.Filled.Save, contentDescription = null) + } + Text( + text = stringResource(id = R.string.save_log), + modifier = Modifier.padding(top = 16.dp), + textAlign = TextAlign.Center.also { + LineHeightStyle( + alignment = LineHeightStyle.Alignment.Center, + trim = LineHeightStyle.Trim.None + ) + } + ) + } + } + Box { + Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + IconButton( + onClick = onShare, + modifier = Modifier.size(56.dp).clip(CircleShape) + ) { + Icon(Icons.Filled.Share, contentDescription = null) + } + Text( + text = stringResource(id = R.string.send_log), + modifier = Modifier.padding(top = 16.dp), + textAlign = TextAlign.Center.also { + LineHeightStyle( + alignment = LineHeightStyle.Alignment.Center, + trim = LineHeightStyle.Trim.None + ) + } + ) + } + } + } + } + ) +} + +@Composable +fun UninstallItem( + navigator: DestinationsNavigator, + withLoading: suspend (suspend () -> Unit) -> Unit, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + val uninstallConfirmDialog = rememberConfirmDialog() + val showTodo = { + Toast.makeText(context, "TODO", Toast.LENGTH_SHORT).show() + } + val uninstallDialog = rememberUninstallDialog { uninstallType -> + scope.launch { + val result = uninstallConfirmDialog.awaitConfirm( + title = context.getString(uninstallType.title), + content = context.getString(uninstallType.message) + ) + if (result == ConfirmResult.Confirmed) { + withLoading { + when (uninstallType) { + UninstallType.TEMPORARY -> showTodo() + UninstallType.PERMANENT -> navigator.navigate( + FlashScreenDestination(FlashIt.FlashUninstall) + ) + UninstallType.RESTORE_STOCK_IMAGE -> navigator.navigate( + FlashScreenDestination(FlashIt.FlashRestore) + ) + UninstallType.NONE -> Unit + } + } + } + } + } + val uninstall = stringResource(id = R.string.settings_uninstall) + ListItem( + modifier = modifier.clickable { uninstallDialog.show() }, + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + leadingContent = { Icon(Icons.Filled.Delete, uninstall) }, + headlineContent = { + Text( + text = uninstall, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + ) +} + +enum class UninstallType(val title: Int, val message: Int, val icon: ImageVector) { + TEMPORARY( + R.string.settings_uninstall_temporary, + R.string.settings_uninstall_temporary_message, + Icons.Filled.Delete + ), + PERMANENT( + R.string.settings_uninstall_permanent, + R.string.settings_uninstall_permanent_message, + Icons.Filled.DeleteForever + ), + RESTORE_STOCK_IMAGE( + R.string.settings_restore_stock_image, + R.string.settings_restore_stock_image_message, + Icons.AutoMirrored.Filled.Undo + ), + NONE(0, 0, Icons.Filled.Delete) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle { + return rememberCustomDialog { dismiss -> + val options = listOf( + // UninstallType.TEMPORARY, + UninstallType.PERMANENT, + UninstallType.RESTORE_STOCK_IMAGE + ) + val listOptions = options.map { + ListOption( + titleText = stringResource(it.title), + subtitleText = if (it.message != 0) stringResource(it.message) else null, + icon = IconSource(it.icon) + ) + } + + var selection = UninstallType.NONE + ListDialog( + state = rememberUseCaseState(visible = true, onFinishedRequest = { + if (selection != UninstallType.NONE) { + onSelected(selection) + } + }, onCloseRequest = { + dismiss() + }), + header = Header.Default(title = stringResource(R.string.settings_uninstall)), + selection = ListSelection.Single( + showRadioButtons = false, + options = listOptions, + ) { index, _ -> + selection = options[index] + } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + scrollBehavior: TopAppBarScrollBehavior? = null, +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.settings), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Preview +@Composable +private fun SettingsPreview() { + SettingScreen(EmptyDestinationsNavigator) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/SuperUser.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/SuperUser.kt new file mode 100644 index 000000000000..bc9b1fdd2e70 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/SuperUser.kt @@ -0,0 +1,289 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.Context +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.* +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.compose.dropUnlessResumed +import androidx.lifecycle.viewmodel.compose.viewModel +import coil.compose.AsyncImage +import coil.request.ImageRequest +import androidx.compose.material3.ListItemDefaults +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.AppProfileScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.SearchAppBar +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@Destination +@Composable +fun SuperUserScreen(navigator: DestinationsNavigator) { + val viewModel = viewModel() + val scope = rememberCoroutineScope() + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + val listState = rememberLazyListState() + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + LaunchedEffect(navigator) { + viewModel.search = "" + if (viewModel.appList.isEmpty()) { + viewModel.fetchAppList() + } + } + + Scaffold( + topBar = { + SearchAppBar( + title = { + Text( + text = stringResource(R.string.superuser), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + searchText = viewModel.search, + onSearchTextChange = { viewModel.search = it }, + onClearClick = { viewModel.search = "" }, + dropdownContent = { + var showDropdown by remember { mutableStateOf(false) } + + IconButton( + onClick = { showDropdown = true }, + ) { + Icon( + imageVector = Icons.Filled.MoreVert, + contentDescription = stringResource(id = R.string.settings) + ) + + DropdownMenu(expanded = showDropdown, onDismissRequest = { + showDropdown = false + }) { + DropdownMenuItem(text = { + Text(stringResource(R.string.refresh)) + }, onClick = { + scope.launch { + viewModel.fetchAppList() + } + showDropdown = false + }) + DropdownMenuItem(text = { + Text( + if (viewModel.showSystemApps) { + stringResource(R.string.hide_system_apps) + } else { + stringResource(R.string.show_system_apps) + } + ) + }, onClick = { + viewModel.updateShowSystemApps(!viewModel.showSystemApps) + showDropdown = false + }) + } + } + }, + scrollBehavior = scrollBehavior + ) + }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + PullToRefreshBox( + modifier = Modifier.padding(innerPadding), + onRefresh = { + scope.launch { viewModel.fetchAppList() } + }, + isRefreshing = viewModel.isRefreshing + ) { + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + LazyColumn( + state = listState, + modifier = Modifier + .fillMaxSize() + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + }, + verticalArrangement = Arrangement.spacedBy(16.dp), + contentPadding = PaddingValues( + start = 16.dp, + top = 16.dp, + end = 16.dp, + bottom = 16.dp + navBarPadding + ) + ) { + items( + viewModel.appList.filter { it.packageName != ksuApp.packageName }, + key = { it.packageName + it.uid } + ) { app -> + AppItem(app) { + navigator.navigate(AppProfileScreenDestination(app)) + } + } + } + } + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun AppItem( + app: SuperUserViewModel.AppInfo, + onClickListener: () -> Unit, +) { + val context = LocalContext.current + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + + Card( + modifier = Modifier + .fillMaxWidth() + .clip(MaterialTheme.shapes.medium) + .clickable(onClick = onClickListener) + ) { + ListItem( + modifier = Modifier.fillMaxWidth(), + colors = ListItemDefaults.colors(containerColor = Color.Transparent), + headlineContent = { + Text( + text = app.label, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + ) + }, + supportingContent = { + Column { + Text( + text = app.packageName, + style = MaterialTheme.typography.bodySmall + ) + + Spacer(modifier = Modifier.height(4.dp)) + + FlowRow( + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + if (app.allowSu) { + val rootLabel = if (developerOptionsEnabled) { + "ROOT | UID: ${app.uid}" + } else { + "ROOT" + } + LabelItem( + text = rootLabel, + ) + } else { + if (Natives.uidShouldUmount(app.uid)) { + LabelItem( + text = "UMOUNT", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } + } + if (app.hasCustomProfile) { + LabelItem( + text = "CUSTOM", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer, + ) + ) + } else if (!app.allowSu && !Natives.uidShouldUmount(app.uid)) { + LabelItem( + text = "DEFAULT", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer, + ) + ) + } + } + } + }, + leadingContent = { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data(app.packageInfo) + .crossfade(true) + .build(), + contentDescription = app.label, + modifier = Modifier + .padding(4.dp) + .width(48.dp) + .height(48.dp) + ) + }, + ) + } +} + +@Composable +fun LabelText(label: String) { + Box( + modifier = Modifier + .padding(top = 4.dp, end = 4.dp) + .background( + Color.Black, + shape = RoundedCornerShape(4.dp) + ) + ) { + Text( + text = label, + modifier = Modifier.padding(vertical = 2.dp, horizontal = 5.dp), + style = TextStyle( + fontSize = 8.sp, + color = Color.White, + ) + ) + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Template.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Template.kt new file mode 100644 index 000000000000..df7dfa7810a5 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/Template.kt @@ -0,0 +1,312 @@ +package com.rifsxd.ksunext.ui.screen + +import android.content.ClipData +import android.widget.Toast +import androidx.compose.animation.* +import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.ImportExport +import androidx.compose.material.icons.filled.Sync +import androidx.compose.material3.* +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.ClipEntry +import androidx.compose.ui.platform.LocalClipboard +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.dropUnlessResumed +import androidx.lifecycle.viewmodel.compose.viewModel +import com.dergoogler.mmrl.ui.component.LabelItem +import com.dergoogler.mmrl.ui.component.LabelItemDefaults +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.TemplateEditorScreenDestination +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.result.ResultRecipient +import com.ramcosta.composedestinations.result.getOr +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.viewmodel.TemplateViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +/** + * @author weishu + * @date 2023/10/20. + */ + +@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@Destination +@Composable +fun AppProfileTemplateScreen( + navigator: DestinationsNavigator, + resultRecipient: ResultRecipient +) { + val viewModel = viewModel() + val scope = rememberCoroutineScope() + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + LaunchedEffect(Unit) { + if (viewModel.templateList.isEmpty()) { + viewModel.fetchTemplates() + } + } + + // handle result from TemplateEditorScreen, refresh if needed + resultRecipient.onNavResult { result -> + if (result.getOr { false }) { + scope.launch { viewModel.fetchTemplates() } + } + } + + val listState = rememberLazyListState() + + Scaffold( + topBar = { + val clipboard = LocalClipboard.current + val context = LocalContext.current + val showToast = fun(msg: String) { + scope.launch(Dispatchers.Main) { + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() + } + } + TopBar( + onBack = dropUnlessResumed { navigator.popBackStack() }, + + onImport = { + scope.launch { + clipboard.getClipEntry()?.clipData?.getItemAt(0)?.text?.toString()?.let { + if (it.isEmpty()) { + showToast(context.getString(R.string.app_profile_template_import_empty)) + return@let + } + viewModel.importTemplates( + it, { + showToast(context.getString(R.string.app_profile_template_import_success)) + viewModel.fetchTemplates(false) + }, + showToast + ) + } + } + }, + onExport = { + scope.launch { + viewModel.exportTemplates( + { + showToast(context.getString(R.string.app_profile_template_export_empty)) + }, + { + scope.launch { clipboard.setClipEntry(ClipEntry(ClipData.newPlainText("template", it))) } + } + ) + + + } + }, + onCreate = { + navigator.navigate( + TemplateEditorScreenDestination( + TemplateViewModel.TemplateInfo(), + false + ) + ) + }, + scrollBehavior = scrollBehavior + ) + }, + floatingActionButton = {}, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + PullToRefreshBox( + modifier = Modifier.padding(innerPadding), + isRefreshing = viewModel.isRefreshing, + onRefresh = { + scope.launch { viewModel.fetchTemplates(true) } + } + ) { + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + LazyColumn( + state = listState, + modifier = Modifier + .fillMaxSize() + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + }, + contentPadding = PaddingValues( + bottom = 16.dp + navBarPadding + ) + ) { + items(viewModel.templateList, key = { it.id }) { app -> + TemplateItem(navigator, app) + } + } + } + } +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +private fun TemplateItem( + navigator: DestinationsNavigator, + template: TemplateViewModel.TemplateInfo +) { + ListItem( + modifier = Modifier + .clickable { + navigator.navigate(TemplateEditorScreenDestination(template, !template.local)) + }, + headlineContent = { Text( + text = template.name, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + ) }, + supportingContent = { + Column { + Text( + text = "${template.id}${if (template.author.isEmpty()) "" else "@${template.author}"}", + style = MaterialTheme.typography.bodySmall, + fontSize = MaterialTheme.typography.bodySmall.fontSize, + ) + Text(template.description) + + Spacer(modifier = Modifier.height(4.dp)) + + FlowRow( + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + LabelItem( + text = "UID: ${template.uid}" + ) + LabelItem( + text = "GID: ${template.gid}", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + LabelItem( + text = template.context, + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + if (template.local) { + LabelItem( + text = "local", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer + ) + ) + } else { + LabelItem( + text = "remote", + style = LabelItemDefaults.style.copy( + containerColor = MaterialTheme.colorScheme.tertiaryContainer, + contentColor = MaterialTheme.colorScheme.onTertiaryContainer + ) + ) + } + } + } + }, + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + onBack: () -> Unit, + onImport: () -> Unit = {}, + onExport: () -> Unit = {}, + onCreate: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Text( + text = stringResource(R.string.settings_profile_template), + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + }, + navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, + actions = { + IconButton(onClick = onCreate) { + Icon( + Icons.Filled.Add, + contentDescription = stringResource(id = R.string.app_profile_template_create) + ) + } + + var showDropdown by remember { mutableStateOf(false) } + IconButton(onClick = { + showDropdown = true + }) { + Icon( + imageVector = Icons.Filled.ImportExport, + contentDescription = stringResource(id = R.string.app_profile_import_export) + ) + + DropdownMenu(expanded = showDropdown, onDismissRequest = { + showDropdown = false + }) { + DropdownMenuItem(text = { + Text(stringResource(id = R.string.app_profile_import_from_clipboard)) + }, onClick = { + onImport() + showDropdown = false + }) + DropdownMenuItem(text = { + Text(stringResource(id = R.string.app_profile_export_to_clipboard)) + }, onClick = { + onExport() + showDropdown = false + }) + } + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/TemplateEditor.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/TemplateEditor.kt new file mode 100644 index 000000000000..dee34bfbad7c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/screen/TemplateEditor.kt @@ -0,0 +1,350 @@ +package com.rifsxd.ksunext.ui.screen + +import android.widget.Toast +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.DeleteForever +import androidx.compose.material.icons.filled.Save +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.input.pointer.pointerInteropFilter +import androidx.compose.ui.platform.LocalContext +import com.rifsxd.ksunext.ui.LocalScrollState +import com.rifsxd.ksunext.ui.rememberScrollConnection +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.lifecycle.compose.dropUnlessResumed +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.result.ResultBackNavigator +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.component.profile.RootProfileConfig +import com.rifsxd.ksunext.ui.util.deleteAppProfileTemplate +import com.rifsxd.ksunext.ui.util.getAppProfileTemplate +import com.rifsxd.ksunext.ui.util.setAppProfileTemplate +import com.rifsxd.ksunext.ui.viewmodel.TemplateViewModel +import com.rifsxd.ksunext.ui.viewmodel.toJSON + +/** + * @author weishu + * @date 2023/10/20. + */ +@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class) +@Destination +@Composable +fun TemplateEditorScreen( + navigator: ResultBackNavigator, + initialTemplate: TemplateViewModel.TemplateInfo, + readOnly: Boolean = true, +) { + + val isCreation = initialTemplate.id.isBlank() + val autoSave = !isCreation + + var template by rememberSaveable { + mutableStateOf(initialTemplate) + } + + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Bottom bar scroll tracking + val bottomBarScrollState = LocalScrollState.current + val bottomBarScrollConnection = if (bottomBarScrollState != null) { + rememberScrollConnection( + isScrollingDown = bottomBarScrollState.isScrollingDown, + scrollOffset = bottomBarScrollState.scrollOffset, + previousScrollOffset = bottomBarScrollState.previousScrollOffset, + threshold = 30f + ) + } else null + + val scrollState = LocalScrollState.current + val isNavBarHidden = scrollState?.isScrollingDown?.value ?: false + val navBarPadding = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + if (isNavBarHidden) 0.dp else 112.dp + + BackHandler { + navigator.navigateBack(result = !readOnly) + } + + Scaffold( + topBar = { + val author = + if (initialTemplate.author.isNotEmpty()) "@${initialTemplate.author}" else "" + val readOnlyHint = if (readOnly) { + " - ${stringResource(id = R.string.app_profile_template_readonly)}" + } else { + "" + } + val titleSummary = "${initialTemplate.id}$author$readOnlyHint" + val saveTemplateFailed = stringResource(id = R.string.app_profile_template_save_failed) + val context = LocalContext.current + + TopBar( + title = if (isCreation) { + stringResource(R.string.app_profile_template_create) + } else if (readOnly) { + stringResource(R.string.app_profile_template_view) + } else { + stringResource(R.string.app_profile_template_edit) + }, + readOnly = readOnly, + summary = titleSummary, + onBack = dropUnlessResumed { navigator.navigateBack(result = !readOnly) }, + onDelete = { + if (deleteAppProfileTemplate(template.id)) { + navigator.navigateBack(result = true) + } + }, + onSave = { + if (saveTemplate(template, isCreation)) { + navigator.navigateBack(result = true) + } else { + Toast.makeText(context, saveTemplateFailed, Toast.LENGTH_SHORT).show() + } + }, + scrollBehavior = scrollBehavior + ) + }, + contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .let { modifier -> + if (bottomBarScrollConnection != null) { + modifier + .nestedScroll(bottomBarScrollConnection) + .nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } + } + .verticalScroll(rememberScrollState()) + .padding(bottom = navBarPadding) + .pointerInteropFilter { + // disable click and ripple if readOnly + readOnly + } + ) { + if (isCreation) { + var errorHint by remember { + mutableStateOf("") + } + val idConflictError = stringResource(id = R.string.app_profile_template_id_exist) + val idInvalidError = stringResource(id = R.string.app_profile_template_id_invalid) + TextEdit( + label = stringResource(id = R.string.app_profile_template_id), + text = template.id, + errorHint = errorHint, + isError = errorHint.isNotEmpty() + ) { value -> + errorHint = if (isTemplateExist(value)) { + idConflictError + } else if (!isValidTemplateId(value)) { + idInvalidError + } else { + "" + } + template = template.copy(id = value) + } + } + + TextEdit( + label = stringResource(id = R.string.app_profile_template_name), + text = template.name + ) { value -> + template.copy(name = value).run { + if (autoSave) { + if (!saveTemplate(this)) { + // failed + return@run + } + } + template = this + } + } + TextEdit( + label = stringResource(id = R.string.app_profile_template_description), + text = template.description + ) { value -> + template.copy(description = value).run { + if (autoSave) { + if (!saveTemplate(this)) { + // failed + return@run + } + } + template = this + } + } + + RootProfileConfig(fixedName = true, + profile = toNativeProfile(template), + onProfileChange = { + template.copy( + uid = it.uid, + gid = it.gid, + groups = it.groups, + capabilities = it.capabilities, + context = it.context, + namespace = it.namespace, + rules = it.rules.split("\n") + ).run { + if (autoSave) { + if (!saveTemplate(this)) { + // failed + return@run + } + } + template = this + } + }) + } + } +} + +fun toNativeProfile(templateInfo: TemplateViewModel.TemplateInfo): Natives.Profile { + return Natives.Profile().copy(rootTemplate = templateInfo.id, + uid = templateInfo.uid, + gid = templateInfo.gid, + groups = templateInfo.groups, + capabilities = templateInfo.capabilities, + context = templateInfo.context, + namespace = templateInfo.namespace, + rules = templateInfo.rules.joinToString("\n").ifBlank { "" }) +} + +fun isTemplateValid(template: TemplateViewModel.TemplateInfo): Boolean { + if (template.id.isBlank()) { + return false + } + + if (!isValidTemplateId(template.id)) { + return false + } + + return true +} + +fun saveTemplate(template: TemplateViewModel.TemplateInfo, isCreation: Boolean = false): Boolean { + if (!isTemplateValid(template)) { + return false + } + + if (isCreation && isTemplateExist(template.id)) { + return false + } + + val json = template.toJSON() + json.put("local", true) + return setAppProfileTemplate(template.id, json.toString()) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar( + title: String, + readOnly: Boolean, + summary: String = "", + onBack: () -> Unit, + onDelete: () -> Unit = {}, + onSave: () -> Unit = {}, + scrollBehavior: TopAppBarScrollBehavior? = null +) { + TopAppBar( + title = { + Column { + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Black, + ) + if (summary.isNotBlank()) { + Text( + text = summary, + style = MaterialTheme.typography.bodyMedium, + ) + } + } + }, navigationIcon = { + IconButton( + onClick = onBack + ) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) } + }, actions = { + if (readOnly) { + return@TopAppBar + } + IconButton(onClick = onDelete) { + Icon( + Icons.Filled.DeleteForever, + contentDescription = stringResource(id = R.string.app_profile_template_delete) + ) + } + IconButton(onClick = onSave) { + Icon( + imageVector = Icons.Filled.Save, + contentDescription = stringResource(id = R.string.app_profile_template_save) + ) + } + }, + windowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), + scrollBehavior = scrollBehavior + ) +} + +@Composable +private fun TextEdit( + label: String, + text: String, + errorHint: String = "", + isError: Boolean = false, + onValueChange: (String) -> Unit = {} +) { + ListItem(headlineContent = { + val keyboardController = LocalSoftwareKeyboardController.current + OutlinedTextField( + value = text, + modifier = Modifier.fillMaxWidth(), + label = { Text(label) }, + suffix = { + if (errorHint.isNotBlank()) { + Text( + text = if (isError) errorHint else "", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error + ) + } + }, + isError = isError, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Ascii, imeAction = ImeAction.Next + ), + keyboardActions = KeyboardActions(onDone = { + keyboardController?.hide() + }), + onValueChange = onValueChange + ) + }) +} + +private fun isValidTemplateId(id: String): Boolean { + return Regex("""^([A-Za-z][A-Za-z\d_]*\.)*[A-Za-z][A-Za-z\d_]*$""").matches(id) +} + +private fun isTemplateExist(id: String): Boolean { + return getAppProfileTemplate(id).isNotBlank() +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Color.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Color.kt new file mode 100644 index 000000000000..c26aeb2b4e7c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Color.kt @@ -0,0 +1,20 @@ +package com.rifsxd.ksunext.ui.theme + +import androidx.compose.ui.graphics.Color + +val PRIMARY = Color(0xFF8AADF4) // Catppuccin Blue +val PRIMARY_LIGHT = Color(0xFFB7BDF8) // Catppuccin Lavender +val SECONDARY_LIGHT = Color(0xFFA6DA95) // Catppuccin Green + +val PRIMARY_DARK = Color(0xFF7DC4E4) // Catppuccin Sky +val SECONDARY_DARK = Color(0xFFF5BDE6) // Catppuccin Pink + +val AMOLED_BLACK = Color(0xFF000000) // Pure black for AMOLED + +val DARK_PURPLE = Color(0xFF6E6CB6) // Catppuccin Mauve (dark purple) +val DARK_GREY = Color(0xFF363A4F) // Catppuccin Surface (dark grey) + +val GREEN = Color(0xFF4CAF50) // Green +val RED = Color(0xFFF44336) // Red +val YELLOW = Color(0xFFFFEB3B) // Yellow +val ORANGE = Color(0xFFFF9800) // Orange \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Theme.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Theme.kt new file mode 100644 index 000000000000..1213c956c6c2 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Theme.kt @@ -0,0 +1,118 @@ +package com.rifsxd.ksunext.ui.theme + +import android.os.Build +import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = PRIMARY, + secondary = PRIMARY_DARK, + tertiary = SECONDARY_DARK +) + +private val LightColorScheme = lightColorScheme( + primary = PRIMARY, + secondary = PRIMARY_LIGHT, + tertiary = SECONDARY_LIGHT +) + +fun Color.blend(other: Color, ratio: Float): Color { + val inverse = 1f - ratio + return Color( + red = red * inverse + other.red * ratio, + green = green * inverse + other.green * ratio, + blue = blue * inverse + other.blue * ratio, + alpha = alpha + ) +} + +@Composable +fun KernelSUTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + amoledMode: Boolean = false, + content: @Composable () -> Unit +) { + val colorScheme = when { + amoledMode && darkTheme && dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + val dynamicScheme = dynamicDarkColorScheme(context) + dynamicScheme.copy( + background = AMOLED_BLACK, + surface = AMOLED_BLACK, + surfaceVariant = dynamicScheme.surfaceVariant.blend(AMOLED_BLACK, 0.6f), + surfaceContainer = dynamicScheme.surfaceContainer.blend(AMOLED_BLACK, 0.6f), + surfaceContainerLow = dynamicScheme.surfaceContainerLow.blend(AMOLED_BLACK, 0.6f), + surfaceContainerLowest = dynamicScheme.surfaceContainerLowest.blend(AMOLED_BLACK, 0.6f), + surfaceContainerHigh = dynamicScheme.surfaceContainerHigh.blend(AMOLED_BLACK, 0.6f), + surfaceContainerHighest = dynamicScheme.surfaceContainerHighest.blend(AMOLED_BLACK, 0.6f) + ) + } + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + amoledMode && darkTheme -> { + DarkColorScheme.copy( + background = AMOLED_BLACK, + surface = AMOLED_BLACK, + surfaceVariant = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + surfaceContainer = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + surfaceContainerLow = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + surfaceContainerLowest = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + surfaceContainerHigh = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + surfaceContainerHighest = DARK_GREY.blend(AMOLED_BLACK, 0.8f), + ) + } + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + SystemBarStyle( + darkMode = darkTheme + ) + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} + +@Composable +private fun SystemBarStyle( + darkMode: Boolean, + statusBarScrim: Color = Color.Transparent, + navigationBarScrim: Color = Color.Transparent, +) { + val context = LocalContext.current + val activity = context as ComponentActivity + + SideEffect { + activity.enableEdgeToEdge( + statusBarStyle = SystemBarStyle.auto( + statusBarScrim.toArgb(), + statusBarScrim.toArgb(), + ) { darkMode }, + navigationBarStyle = when { + darkMode -> SystemBarStyle.dark( + navigationBarScrim.toArgb() + ) + + else -> SystemBarStyle.light( + navigationBarScrim.toArgb(), + navigationBarScrim.toArgb(), + ) + } + ) + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Type.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Type.kt new file mode 100644 index 000000000000..27794e7076dc --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/theme/Type.kt @@ -0,0 +1,33 @@ +package com.rifsxd.ksunext.ui.theme + +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = androidx.compose.material3.Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/CompositionProvider.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/CompositionProvider.kt new file mode 100644 index 000000000000..d0da793cfa66 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/CompositionProvider.kt @@ -0,0 +1,8 @@ +package com.rifsxd.ksunext.ui.util + +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.compositionLocalOf + +val LocalSnackbarHost = compositionLocalOf { + error("CompositionLocal LocalSnackbarController not present") +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/Downloader.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/Downloader.kt new file mode 100644 index 000000000000..6e349d96e418 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/Downloader.kt @@ -0,0 +1,168 @@ +package com.rifsxd.ksunext.ui.util + +import android.annotation.SuppressLint +import android.app.DownloadManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.Uri +import android.os.Environment +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.core.content.ContextCompat +import androidx.core.net.toUri +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.util.module.LatestVersionInfo + +/** + * @author weishu + * @date 2023/6/22. + */ +@SuppressLint("Range") +fun download( + context: Context, + url: String, + fileName: String, + description: String, + onDownloaded: (Uri) -> Unit = {}, + onDownloading: () -> Unit = {} +) { + val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + + val query = DownloadManager.Query() + query.setFilterByStatus(DownloadManager.STATUS_RUNNING or DownloadManager.STATUS_PAUSED or DownloadManager.STATUS_PENDING) + downloadManager.query(query).use { cursor -> + while (cursor.moveToNext()) { + val uri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)) + val localUri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)) + val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) + val columnTitle = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)) + if (url == uri || fileName == columnTitle) { + if (status == DownloadManager.STATUS_RUNNING || status == DownloadManager.STATUS_PENDING) { + onDownloading() + return + } else if (status == DownloadManager.STATUS_SUCCESSFUL) { + onDownloaded(localUri.toUri()) + return + } + } + } + } + + val request = DownloadManager.Request(url.toUri()) + .setDestinationInExternalPublicDir( + Environment.DIRECTORY_DOWNLOADS, + fileName + ) + .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + .setMimeType("application/zip") + .setTitle(fileName) + .setDescription(description) + + downloadManager.enqueue(request) +} + +fun checkNewVersion(preferSpoofed: Boolean? = null): LatestVersionInfo { + // Next version updates + val url = "https://api.github.com/repos/KernelSU-Next/KernelSU-Next/releases/latest" + // default null value if failed + val defaultValue = LatestVersionInfo() + runCatching { + ksuApp.okhttpClient.newCall(okhttp3.Request.Builder().url(url).build()).execute() + .use { response -> + if (!response.isSuccessful) { + return defaultValue + } + val body = response.body?.string() ?: return defaultValue + val json = org.json.JSONObject(body) + val changelog = json.optString("body") + val versionTag = json.optString("tag_name", "") + + val assets = json.getJSONArray("assets") + + val mainApk = mutableListOf>() + val spoofedApk = mutableListOf>() + + for (i in 0 until assets.length()) { + val asset = assets.getJSONObject(i) + val name = asset.getString("name") + val isApk = name.endsWith(".apk") + if (!isApk) continue + + val regex = Regex("v(.+?)_(\\d+)-") + val matchResult = regex.find(name) ?: continue + val versionName = matchResult.groupValues[1] + val versionCode = matchResult.groupValues[2] + val downloadUrl = asset.getString("browser_download_url") + + val isSpoofed = name.contains("spoofed", ignoreCase = true) + val apkInfo = Triple(versionName, versionCode, downloadUrl) + + if (isSpoofed) { + spoofedApk.add(apkInfo) + } else { + mainApk.add(apkInfo) + } + } + + val selectedApk = when (preferSpoofed) { + true -> spoofedApk.firstOrNull() ?: mainApk.firstOrNull() + false -> mainApk.firstOrNull() ?: spoofedApk.firstOrNull() + null -> mainApk.firstOrNull() ?: spoofedApk.firstOrNull() // Default to main + } + + if (selectedApk != null) { + val versionCode = selectedApk.second.toInt() + val downloadUrl = selectedApk.third + return LatestVersionInfo( + versionCode, + downloadUrl, + changelog, + versionTag + ) + } + } + } + return defaultValue +} + +@Composable +fun DownloadListener(context: Context, onDownloaded: (Uri) -> Unit) { + DisposableEffect(context) { + val receiver = object : BroadcastReceiver() { + @SuppressLint("Range") + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == DownloadManager.ACTION_DOWNLOAD_COMPLETE) { + val id = intent.getLongExtra( + DownloadManager.EXTRA_DOWNLOAD_ID, -1 + ) + val query = DownloadManager.Query().setFilterById(id) + val downloadManager = + context?.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + val cursor = downloadManager.query(query) + if (cursor.moveToFirst()) { + val status = cursor.getInt( + cursor.getColumnIndex(DownloadManager.COLUMN_STATUS) + ) + if (status == DownloadManager.STATUS_SUCCESSFUL) { + val uri = cursor.getString( + cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI) + ) + onDownloaded(uri.toUri()) + } + } + } + } + } + ContextCompat.registerReceiver( + context, + receiver, + IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), + ContextCompat.RECEIVER_EXPORTED + ) + onDispose { + context.unregisterReceiver(receiver) + } + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HanziToPinyin.java b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HanziToPinyin.java new file mode 100644 index 000000000000..260594b329a5 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HanziToPinyin.java @@ -0,0 +1,572 @@ +package com.rifsxd.ksunext.ui.util; +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.text.TextUtils; +import android.util.Log; + +import java.text.Collator; +import java.util.ArrayList; +import java.util.Locale; + +/** + * An object to convert Chinese character to its corresponding pinyin string. For characters with + * multiple possible pinyin string, only one is selected according to collator. Polyphone is not + * supported in this implementation. This class is implemented to achieve the best runtime + * performance and minimum runtime resources with tolerable sacrifice of accuracy. This + * implementation highly depends on zh_CN ICU collation data and must be always synchronized with + * ICU. + *

    + * Currently this file is aligned to zh.txt in ICU 4.6 + */ +@SuppressWarnings("SizeReplaceableByIsEmpty") +public record HanziToPinyin(boolean mHasChinaCollator) { + private static final String TAG = "HanziToPinyin"; + + // Turn on this flag when we want to check internal data structure. + private static final boolean DEBUG = false; + + /** + * Unihans array. + *

    + * Each unihans is the first one within same pinyin when collator is zh_CN. + */ + public static final char[] UNIHANS = { + '阿', '哎', '安', '肮', '凹', '八', + '挀', '扳', '邦', '勹', '陂', '奔', + '伻', '屄', '边', '灬', '憋', '汃', + '冫', '癶', '峬', '嚓', '偲', '参', + '仓', '撡', '冊', '嵾', '曽', '曾', + '層', '叉', '芆', '辿', '伥', '抄', + '车', '抻', '沈', '沉', '阷', '吃', + '充', '抽', '出', '欻', '揣', '巛', + '刅', '吹', '旾', '逴', '呲', '匆', + '凑', '粗', '汆', '崔', '邨', '搓', + '咑', '呆', '丹', '当', '刀', '嘚', + '扥', '灯', '氐', '嗲', '甸', '刁', + '爹', '丁', '丟', '东', '吺', '厾', + '耑', '襨', '吨', '多', '妸', '诶', + '奀', '鞥', '儿', '发', '帆', '匚', + '飞', '分', '丰', '覅', '仏', '紑', + '伕', '旮', '侅', '甘', '冈', '皋', + '戈', '给', '根', '刯', '工', '勾', + '估', '瓜', '乖', '关', '光', '归', + '丨', '呙', '哈', '咍', '佄', '夯', + '茠', '诃', '黒', '拫', '亨', '噷', + '叿', '齁', '乯', '花', '怀', '犿', + '巟', '灰', '昏', '吙', '丌', '加', + '戋', '江', '艽', '阶', '巾', '坕', + '冂', '丩', '凥', '姢', '噘', '军', + '咔', '开', '刊', '忼', '尻', '匼', + '肎', '劥', '空', '抠', '扝', '夸', + '蒯', '宽', '匡', '亏', '坤', '扩', + '垃', '来', '兰', '啷', '捞', '肋', + '勒', '崚', '刕', '俩', '奁', '良', + '撩', '列', '拎', '刢', '溜', '囖', + '龙', '瞜', '噜', '娈', '畧', '抡', + '罗', '呣', '妈', '埋', '嫚', '牤', + '猫', '么', '呅', '门', '甿', '咪', + '宀', '喵', '乜', '民', '名', '谬', + '摸', '哞', '毪', '嗯', '拏', '腉', + '囡', '囔', '孬', '疒', '娞', '恁', + '能', '妮', '拈', '嬢', '鸟', '捏', + '囜', '宁', '妞', '农', '羺', '奴', + '奻', '疟', '黁', '郍', '喔', '讴', + '妑', '拍', '眅', '乓', '抛', '呸', + '喷', '匉', '丕', '囨', '剽', '氕', + '姘', '乒', '钋', '剖', '仆', '七', + '掐', '千', '呛', '悄', '癿', '亲', + '狅', '芎', '丘', '区', '峑', '缺', + '夋', '呥', '穣', '娆', '惹', '人', + '扔', '日', '茸', '厹', '邚', '挼', + '堧', '婑', '瞤', '捼', '仨', '毢', + '三', '桒', '掻', '閪', '森', '僧', + '杀', '筛', '山', '伤', '弰', '奢', + '申', '莘', '敒', '升', '尸', '収', + '书', '刷', '衰', '闩', '双', '谁', + '吮', '说', '厶', '忪', '捜', '苏', + '狻', '夊', '孙', '唆', '他', '囼', + '坍', '汤', '夲', '忑', '熥', '剔', + '天', '旫', '帖', '厅', '囲', '偷', + '凸', '湍', '推', '吞', '乇', '穵', + '歪', '弯', '尣', '危', '昷', '翁', + '挝', '乌', '夕', '虲', '仚', '乡', + '灱', '些', '心', '星', '凶', '休', + '吁', '吅', '削', '坃', '丫', '恹', + '央', '幺', '倻', '一', '囙', '应', + '哟', '佣', '优', '扜', '囦', '曰', + '晕', '筠', '筼', '帀', '災', '兂', + '匨', '傮', '则', '贼', '怎', '増', + '扎', '捚', '沾', '张', '长', '長', + '佋', '蜇', '贞', '争', '之', '峙', + '庢', '中', '州', '朱', '抓', '拽', + '专', '妆', '隹', '宒', '卓', '乲', + '宗', '邹', '租', '钻', '厜', '尊', + '昨', '兙', '鿃', '鿄'}; + + /** + * Pinyin array. + *

    + * Each pinyin is corresponding to unihans of same + * offset in the unihans array. + */ + public static final byte[][] PINYINS = { + {65, 0, 0, 0, 0, 0}, {65, 73, 0, 0, 0, 0}, + {65, 78, 0, 0, 0, 0}, {65, 78, 71, 0, 0, 0}, + {65, 79, 0, 0, 0, 0}, {66, 65, 0, 0, 0, 0}, + {66, 65, 73, 0, 0, 0}, {66, 65, 78, 0, 0, 0}, + {66, 65, 78, 71, 0, 0}, {66, 65, 79, 0, 0, 0}, + {66, 69, 73, 0, 0, 0}, {66, 69, 78, 0, 0, 0}, + {66, 69, 78, 71, 0, 0}, {66, 73, 0, 0, 0, 0}, + {66, 73, 65, 78, 0, 0}, {66, 73, 65, 79, 0, 0}, + {66, 73, 69, 0, 0, 0}, {66, 73, 78, 0, 0, 0}, + {66, 73, 78, 71, 0, 0}, {66, 79, 0, 0, 0, 0}, + {66, 85, 0, 0, 0, 0}, {67, 65, 0, 0, 0, 0}, + {67, 65, 73, 0, 0, 0}, {67, 65, 78, 0, 0, 0}, + {67, 65, 78, 71, 0, 0}, {67, 65, 79, 0, 0, 0}, + {67, 69, 0, 0, 0, 0}, {67, 69, 78, 0, 0, 0}, + {67, 69, 78, 71, 0, 0}, {90, 69, 78, 71, 0, 0}, + {67, 69, 78, 71, 0, 0}, {67, 72, 65, 0, 0, 0}, + {67, 72, 65, 73, 0, 0}, {67, 72, 65, 78, 0, 0}, + {67, 72, 65, 78, 71, 0}, {67, 72, 65, 79, 0, 0}, + {67, 72, 69, 0, 0, 0}, {67, 72, 69, 78, 0, 0}, + {83, 72, 69, 78, 0, 0}, {67, 72, 69, 78, 0, 0}, + {67, 72, 69, 78, 71, 0}, {67, 72, 73, 0, 0, 0}, + {67, 72, 79, 78, 71, 0}, {67, 72, 79, 85, 0, 0}, + {67, 72, 85, 0, 0, 0}, {67, 72, 85, 65, 0, 0}, + {67, 72, 85, 65, 73, 0}, {67, 72, 85, 65, 78, 0}, + {67, 72, 85, 65, 78, 71}, {67, 72, 85, 73, 0, 0}, + {67, 72, 85, 78, 0, 0}, {67, 72, 85, 79, 0, 0}, + {67, 73, 0, 0, 0, 0}, {67, 79, 78, 71, 0, 0}, + {67, 79, 85, 0, 0, 0}, {67, 85, 0, 0, 0, 0}, + {67, 85, 65, 78, 0, 0}, {67, 85, 73, 0, 0, 0}, + {67, 85, 78, 0, 0, 0}, {67, 85, 79, 0, 0, 0}, + {68, 65, 0, 0, 0, 0}, {68, 65, 73, 0, 0, 0}, + {68, 65, 78, 0, 0, 0}, {68, 65, 78, 71, 0, 0}, + {68, 65, 79, 0, 0, 0}, {68, 69, 0, 0, 0, 0}, + {68, 69, 78, 0, 0, 0}, {68, 69, 78, 71, 0, 0}, + {68, 73, 0, 0, 0, 0}, {68, 73, 65, 0, 0, 0}, + {68, 73, 65, 78, 0, 0}, {68, 73, 65, 79, 0, 0}, + {68, 73, 69, 0, 0, 0}, {68, 73, 78, 71, 0, 0}, + {68, 73, 85, 0, 0, 0}, {68, 79, 78, 71, 0, 0}, + {68, 79, 85, 0, 0, 0}, {68, 85, 0, 0, 0, 0}, + {68, 85, 65, 78, 0, 0}, {68, 85, 73, 0, 0, 0}, + {68, 85, 78, 0, 0, 0}, {68, 85, 79, 0, 0, 0}, + {69, 0, 0, 0, 0, 0}, {69, 73, 0, 0, 0, 0}, + {69, 78, 0, 0, 0, 0}, {69, 78, 71, 0, 0, 0}, + {69, 82, 0, 0, 0, 0}, {70, 65, 0, 0, 0, 0}, + {70, 65, 78, 0, 0, 0}, {70, 65, 78, 71, 0, 0}, + {70, 69, 73, 0, 0, 0}, {70, 69, 78, 0, 0, 0}, + {70, 69, 78, 71, 0, 0}, {70, 73, 65, 79, 0, 0}, + {70, 79, 0, 0, 0, 0}, {70, 79, 85, 0, 0, 0}, + {70, 85, 0, 0, 0, 0}, {71, 65, 0, 0, 0, 0}, + {71, 65, 73, 0, 0, 0}, {71, 65, 78, 0, 0, 0}, + {71, 65, 78, 71, 0, 0}, {71, 65, 79, 0, 0, 0}, + {71, 69, 0, 0, 0, 0}, {71, 69, 73, 0, 0, 0}, + {71, 69, 78, 0, 0, 0}, {71, 69, 78, 71, 0, 0}, + {71, 79, 78, 71, 0, 0}, {71, 79, 85, 0, 0, 0}, + {71, 85, 0, 0, 0, 0}, {71, 85, 65, 0, 0, 0}, + {71, 85, 65, 73, 0, 0}, {71, 85, 65, 78, 0, 0}, + {71, 85, 65, 78, 71, 0}, {71, 85, 73, 0, 0, 0}, + {71, 85, 78, 0, 0, 0}, {71, 85, 79, 0, 0, 0}, + {72, 65, 0, 0, 0, 0}, {72, 65, 73, 0, 0, 0}, + {72, 65, 78, 0, 0, 0}, {72, 65, 78, 71, 0, 0}, + {72, 65, 79, 0, 0, 0}, {72, 69, 0, 0, 0, 0}, + {72, 69, 73, 0, 0, 0}, {72, 69, 78, 0, 0, 0}, + {72, 69, 78, 71, 0, 0}, {72, 77, 0, 0, 0, 0}, + {72, 79, 78, 71, 0, 0}, {72, 79, 85, 0, 0, 0}, + {72, 85, 0, 0, 0, 0}, {72, 85, 65, 0, 0, 0}, + {72, 85, 65, 73, 0, 0}, {72, 85, 65, 78, 0, 0}, + {72, 85, 65, 78, 71, 0}, {72, 85, 73, 0, 0, 0}, + {72, 85, 78, 0, 0, 0}, {72, 85, 79, 0, 0, 0}, + {74, 73, 0, 0, 0, 0}, {74, 73, 65, 0, 0, 0}, + {74, 73, 65, 78, 0, 0}, {74, 73, 65, 78, 71, 0}, + {74, 73, 65, 79, 0, 0}, {74, 73, 69, 0, 0, 0}, + {74, 73, 78, 0, 0, 0}, {74, 73, 78, 71, 0, 0}, + {74, 73, 79, 78, 71, 0}, {74, 73, 85, 0, 0, 0}, + {74, 85, 0, 0, 0, 0}, {74, 85, 65, 78, 0, 0}, + {74, 85, 69, 0, 0, 0}, {74, 85, 78, 0, 0, 0}, + {75, 65, 0, 0, 0, 0}, {75, 65, 73, 0, 0, 0}, + {75, 65, 78, 0, 0, 0}, {75, 65, 78, 71, 0, 0}, + {75, 65, 79, 0, 0, 0}, {75, 69, 0, 0, 0, 0}, + {75, 69, 78, 0, 0, 0}, {75, 69, 78, 71, 0, 0}, + {75, 79, 78, 71, 0, 0}, {75, 79, 85, 0, 0, 0}, + {75, 85, 0, 0, 0, 0}, {75, 85, 65, 0, 0, 0}, + {75, 85, 65, 73, 0, 0}, {75, 85, 65, 78, 0, 0}, + {75, 85, 65, 78, 71, 0}, {75, 85, 73, 0, 0, 0}, + {75, 85, 78, 0, 0, 0}, {75, 85, 79, 0, 0, 0}, + {76, 65, 0, 0, 0, 0}, {76, 65, 73, 0, 0, 0}, + {76, 65, 78, 0, 0, 0}, {76, 65, 78, 71, 0, 0}, + {76, 65, 79, 0, 0, 0}, {76, 69, 0, 0, 0, 0}, + {76, 69, 73, 0, 0, 0}, {76, 69, 78, 71, 0, 0}, + {76, 73, 0, 0, 0, 0}, {76, 73, 65, 0, 0, 0}, + {76, 73, 65, 78, 0, 0}, {76, 73, 65, 78, 71, 0}, + {76, 73, 65, 79, 0, 0}, {76, 73, 69, 0, 0, 0}, + {76, 73, 78, 0, 0, 0}, {76, 73, 78, 71, 0, 0}, + {76, 73, 85, 0, 0, 0}, {76, 79, 0, 0, 0, 0}, + {76, 79, 78, 71, 0, 0}, {76, 79, 85, 0, 0, 0}, + {76, 85, 0, 0, 0, 0}, {76, 85, 65, 78, 0, 0}, + {76, 85, 69, 0, 0, 0}, {76, 85, 78, 0, 0, 0}, + {76, 85, 79, 0, 0, 0}, {77, 0, 0, 0, 0, 0}, + {77, 65, 0, 0, 0, 0}, {77, 65, 73, 0, 0, 0}, + {77, 65, 78, 0, 0, 0}, {77, 65, 78, 71, 0, 0}, + {77, 65, 79, 0, 0, 0}, {77, 69, 0, 0, 0, 0}, + {77, 69, 73, 0, 0, 0}, {77, 69, 78, 0, 0, 0}, + {77, 69, 78, 71, 0, 0}, {77, 73, 0, 0, 0, 0}, + {77, 73, 65, 78, 0, 0}, {77, 73, 65, 79, 0, 0}, + {77, 73, 69, 0, 0, 0}, {77, 73, 78, 0, 0, 0}, + {77, 73, 78, 71, 0, 0}, {77, 73, 85, 0, 0, 0}, + {77, 79, 0, 0, 0, 0}, {77, 79, 85, 0, 0, 0}, + {77, 85, 0, 0, 0, 0}, {78, 0, 0, 0, 0, 0}, + {78, 65, 0, 0, 0, 0}, {78, 65, 73, 0, 0, 0}, + {78, 65, 78, 0, 0, 0}, {78, 65, 78, 71, 0, 0}, + {78, 65, 79, 0, 0, 0}, {78, 69, 0, 0, 0, 0}, + {78, 69, 73, 0, 0, 0}, {78, 69, 78, 0, 0, 0}, + {78, 69, 78, 71, 0, 0}, {78, 73, 0, 0, 0, 0}, + {78, 73, 65, 78, 0, 0}, {78, 73, 65, 78, 71, 0}, + {78, 73, 65, 79, 0, 0}, {78, 73, 69, 0, 0, 0}, + {78, 73, 78, 0, 0, 0}, {78, 73, 78, 71, 0, 0}, + {78, 73, 85, 0, 0, 0}, {78, 79, 78, 71, 0, 0}, + {78, 79, 85, 0, 0, 0}, {78, 85, 0, 0, 0, 0}, + {78, 85, 65, 78, 0, 0}, {78, 85, 69, 0, 0, 0}, + {78, 85, 78, 0, 0, 0}, {78, 85, 79, 0, 0, 0}, + {79, 0, 0, 0, 0, 0}, {79, 85, 0, 0, 0, 0}, + {80, 65, 0, 0, 0, 0}, {80, 65, 73, 0, 0, 0}, + {80, 65, 78, 0, 0, 0}, {80, 65, 78, 71, 0, 0}, + {80, 65, 79, 0, 0, 0}, {80, 69, 73, 0, 0, 0}, + {80, 69, 78, 0, 0, 0}, {80, 69, 78, 71, 0, 0}, + {80, 73, 0, 0, 0, 0}, {80, 73, 65, 78, 0, 0}, + {80, 73, 65, 79, 0, 0}, {80, 73, 69, 0, 0, 0}, + {80, 73, 78, 0, 0, 0}, {80, 73, 78, 71, 0, 0}, + {80, 79, 0, 0, 0, 0}, {80, 79, 85, 0, 0, 0}, + {80, 85, 0, 0, 0, 0}, {81, 73, 0, 0, 0, 0}, + {81, 73, 65, 0, 0, 0}, {81, 73, 65, 78, 0, 0}, + {81, 73, 65, 78, 71, 0}, {81, 73, 65, 79, 0, 0}, + {81, 73, 69, 0, 0, 0}, {81, 73, 78, 0, 0, 0}, + {81, 73, 78, 71, 0, 0}, {81, 73, 79, 78, 71, 0}, + {81, 73, 85, 0, 0, 0}, {81, 85, 0, 0, 0, 0}, + {81, 85, 65, 78, 0, 0}, {81, 85, 69, 0, 0, 0}, + {81, 85, 78, 0, 0, 0}, {82, 65, 78, 0, 0, 0}, + {82, 65, 78, 71, 0, 0}, {82, 65, 79, 0, 0, 0}, + {82, 69, 0, 0, 0, 0}, {82, 69, 78, 0, 0, 0}, + {82, 69, 78, 71, 0, 0}, {82, 73, 0, 0, 0, 0}, + {82, 79, 78, 71, 0, 0}, {82, 79, 85, 0, 0, 0}, + {82, 85, 0, 0, 0, 0}, {82, 85, 65, 0, 0, 0}, + {82, 85, 65, 78, 0, 0}, {82, 85, 73, 0, 0, 0}, + {82, 85, 78, 0, 0, 0}, {82, 85, 79, 0, 0, 0}, + {83, 65, 0, 0, 0, 0}, {83, 65, 73, 0, 0, 0}, + {83, 65, 78, 0, 0, 0}, {83, 65, 78, 71, 0, 0}, + {83, 65, 79, 0, 0, 0}, {83, 69, 0, 0, 0, 0}, + {83, 69, 78, 0, 0, 0}, {83, 69, 78, 71, 0, 0}, + {83, 72, 65, 0, 0, 0}, {83, 72, 65, 73, 0, 0}, + {83, 72, 65, 78, 0, 0}, {83, 72, 65, 78, 71, 0}, + {83, 72, 65, 79, 0, 0}, {83, 72, 69, 0, 0, 0}, + {83, 72, 69, 78, 0, 0}, {88, 73, 78, 0, 0, 0}, + {83, 72, 69, 78, 0, 0}, {83, 72, 69, 78, 71, 0}, + {83, 72, 73, 0, 0, 0}, {83, 72, 79, 85, 0, 0}, + {83, 72, 85, 0, 0, 0}, {83, 72, 85, 65, 0, 0}, + {83, 72, 85, 65, 73, 0}, {83, 72, 85, 65, 78, 0}, + {83, 72, 85, 65, 78, 71}, {83, 72, 85, 73, 0, 0}, + {83, 72, 85, 78, 0, 0}, {83, 72, 85, 79, 0, 0}, + {83, 73, 0, 0, 0, 0}, {83, 79, 78, 71, 0, 0}, + {83, 79, 85, 0, 0, 0}, {83, 85, 0, 0, 0, 0}, + {83, 85, 65, 78, 0, 0}, {83, 85, 73, 0, 0, 0}, + {83, 85, 78, 0, 0, 0}, {83, 85, 79, 0, 0, 0}, + {84, 65, 0, 0, 0, 0}, {84, 65, 73, 0, 0, 0}, + {84, 65, 78, 0, 0, 0}, {84, 65, 78, 71, 0, 0}, + {84, 65, 79, 0, 0, 0}, {84, 69, 0, 0, 0, 0}, + {84, 69, 78, 71, 0, 0}, {84, 73, 0, 0, 0, 0}, + {84, 73, 65, 78, 0, 0}, {84, 73, 65, 79, 0, 0}, + {84, 73, 69, 0, 0, 0}, {84, 73, 78, 71, 0, 0}, + {84, 79, 78, 71, 0, 0}, {84, 79, 85, 0, 0, 0}, + {84, 85, 0, 0, 0, 0}, {84, 85, 65, 78, 0, 0}, + {84, 85, 73, 0, 0, 0}, {84, 85, 78, 0, 0, 0}, + {84, 85, 79, 0, 0, 0}, {87, 65, 0, 0, 0, 0}, + {87, 65, 73, 0, 0, 0}, {87, 65, 78, 0, 0, 0}, + {87, 65, 78, 71, 0, 0}, {87, 69, 73, 0, 0, 0}, + {87, 69, 78, 0, 0, 0}, {87, 69, 78, 71, 0, 0}, + {87, 79, 0, 0, 0, 0}, {87, 85, 0, 0, 0, 0}, + {88, 73, 0, 0, 0, 0}, {88, 73, 65, 0, 0, 0}, + {88, 73, 65, 78, 0, 0}, {88, 73, 65, 78, 71, 0}, + {88, 73, 65, 79, 0, 0}, {88, 73, 69, 0, 0, 0}, + {88, 73, 78, 0, 0, 0}, {88, 73, 78, 71, 0, 0}, + {88, 73, 79, 78, 71, 0}, {88, 73, 85, 0, 0, 0}, + {88, 85, 0, 0, 0, 0}, {88, 85, 65, 78, 0, 0}, + {88, 85, 69, 0, 0, 0}, {88, 85, 78, 0, 0, 0}, + {89, 65, 0, 0, 0, 0}, {89, 65, 78, 0, 0, 0}, + {89, 65, 78, 71, 0, 0}, {89, 65, 79, 0, 0, 0}, + {89, 69, 0, 0, 0, 0}, {89, 73, 0, 0, 0, 0}, + {89, 73, 78, 0, 0, 0}, {89, 73, 78, 71, 0, 0}, + {89, 79, 0, 0, 0, 0}, {89, 79, 78, 71, 0, 0}, + {89, 79, 85, 0, 0, 0}, {89, 85, 0, 0, 0, 0}, + {89, 85, 65, 78, 0, 0}, {89, 85, 69, 0, 0, 0}, + {89, 85, 78, 0, 0, 0}, {74, 85, 78, 0, 0, 0}, + {89, 85, 78, 0, 0, 0}, {90, 65, 0, 0, 0, 0}, + {90, 65, 73, 0, 0, 0}, {90, 65, 78, 0, 0, 0}, + {90, 65, 78, 71, 0, 0}, {90, 65, 79, 0, 0, 0}, + {90, 69, 0, 0, 0, 0}, {90, 69, 73, 0, 0, 0}, + {90, 69, 78, 0, 0, 0}, {90, 69, 78, 71, 0, 0}, + {90, 72, 65, 0, 0, 0}, {90, 72, 65, 73, 0, 0}, + {90, 72, 65, 78, 0, 0}, {90, 72, 65, 78, 71, 0}, + {67, 72, 65, 78, 71, 0}, {90, 72, 65, 78, 71, 0}, + {90, 72, 65, 79, 0, 0}, {90, 72, 69, 0, 0, 0}, + {90, 72, 69, 78, 0, 0}, {90, 72, 69, 78, 71, 0}, + {90, 72, 73, 0, 0, 0}, {83, 72, 73, 0, 0, 0}, + {90, 72, 73, 0, 0, 0}, {90, 72, 79, 78, 71, 0}, + {90, 72, 79, 85, 0, 0}, {90, 72, 85, 0, 0, 0}, + {90, 72, 85, 65, 0, 0}, {90, 72, 85, 65, 73, 0}, + {90, 72, 85, 65, 78, 0}, {90, 72, 85, 65, 78, 71}, + {90, 72, 85, 73, 0, 0}, {90, 72, 85, 78, 0, 0}, + {90, 72, 85, 79, 0, 0}, {90, 73, 0, 0, 0, 0}, + {90, 79, 78, 71, 0, 0}, {90, 79, 85, 0, 0, 0}, + {90, 85, 0, 0, 0, 0}, {90, 85, 65, 78, 0, 0}, + {90, 85, 73, 0, 0, 0}, {90, 85, 78, 0, 0, 0}, + {90, 85, 79, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, + {83, 72, 65, 78, 0, 0}, {0, 0, 0, 0, 0, 0}}; + + /** + * First and last Chinese character with known Pinyin according to zh collation + */ + private static final String FIRST_PINYIN_UNIHAN = "阿"; + private static final String LAST_PINYIN_UNIHAN = "鿿"; + + private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA); + + private static HanziToPinyin sInstance; + + public static class Token { + /** + * Separator between target string for each source char + */ + public static final String SEPARATOR = " "; + + public static final int LATIN = 1; + public static final int PINYIN = 2; + public static final int UNKNOWN = 3; + + public Token() { + } + + public Token(int type, String source, String target) { + this.type = type; + this.source = source; + this.target = target; + } + + /** + * Type of this token, ASCII, PINYIN or UNKNOWN. + */ + public int type; + /** + * Original string before translation. + */ + public String source; + /** + * Translated string of source. For Han, target is corresponding Pinyin. Otherwise target is + * original string in source. + */ + public String target; + } + + public static HanziToPinyin getInstance() { + synchronized (HanziToPinyin.class) { + if (sInstance != null) { + return sInstance; + } + // Check if zh_CN collation data is available + final Locale[] locale = Collator.getAvailableLocales(); + for (Locale value : locale) { + if (value.equals(Locale.CHINA) || value.getLanguage().contains("zh")) { + // Do self validation just once. + if (DEBUG) { + Log.d(TAG, "Self validation. Result: " + doSelfValidation()); + } + sInstance = new HanziToPinyin(true); + return sInstance; + } + } + if (sInstance == null) {//这个判断是用于处理国产ROM的兼容性问题 + if (Locale.CHINA.equals(Locale.getDefault())) { + sInstance = new HanziToPinyin(true); + return sInstance; + } + } + Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled"); + sInstance = new HanziToPinyin(false); + return sInstance; + } + } + + /** + * Validate if our internal table has some wrong value. + * + * @return true when the table looks correct. + */ + private static boolean doSelfValidation() { + char lastChar = UNIHANS[0]; + String lastString = Character.toString(lastChar); + for (char c : UNIHANS) { + if (lastChar == c) { + continue; + } + final String curString = Character.toString(c); + int cmp = COLLATOR.compare(lastString, curString); + if (cmp >= 0) { + Log.e(TAG, "Internal error in Unihan table. " + "The last string \"" + lastString + + "\" is greater than current string \"" + curString + "\"."); + return false; + } + lastString = curString; + } + return true; + } + + private Token getToken(char character) { + Token token = new Token(); + final String letter = Character.toString(character); + token.source = letter; + int offset = -1; + int cmp; + if (character < 256) { + token.type = Token.LATIN; + token.target = letter; + return token; + } else { + cmp = COLLATOR.compare(letter, FIRST_PINYIN_UNIHAN); + if (cmp < 0) { + token.type = Token.UNKNOWN; + token.target = letter; + return token; + } else if (cmp == 0) { + token.type = Token.PINYIN; + offset = 0; + } else { + cmp = COLLATOR.compare(letter, LAST_PINYIN_UNIHAN); + if (cmp > 0) { + token.type = Token.UNKNOWN; + token.target = letter; + return token; + } else if (cmp == 0) { + token.type = Token.PINYIN; + offset = UNIHANS.length - 1; + } + } + } + + token.type = Token.PINYIN; + if (offset < 0) { + int begin = 0; + int end = UNIHANS.length - 1; + while (begin <= end) { + offset = (begin + end) / 2; + final String unihan = Character.toString(UNIHANS[offset]); + cmp = COLLATOR.compare(letter, unihan); + if (cmp == 0) { + break; + } else if (cmp > 0) { + begin = offset + 1; + } else { + end = offset - 1; + } + } + } + if (cmp < 0) { + offset--; + } + StringBuilder pinyin = new StringBuilder(); + for (int j = 0; j < PINYINS[offset].length && PINYINS[offset][j] != 0; j++) { + pinyin.append((char) PINYINS[offset][j]); + } + token.target = pinyin.toString(); + if (TextUtils.isEmpty(token.target)) { + token.type = Token.UNKNOWN; + token.target = token.source; + } + return token; + } + + /** + * Convert the input to a array of tokens. The sequence of ASCII or Unknown characters without + * space will be put into a Token, One Hanzi character which has pinyin will be treated as a + * Token. If these is no China collator, the empty token array is returned. + */ + public ArrayList get(final String input) { + ArrayList tokens = new ArrayList<>(); + if (!mHasChinaCollator || TextUtils.isEmpty(input)) { + // return empty tokens. + return tokens; + } + final int inputLength = input.length(); + final StringBuilder sb = new StringBuilder(); + int tokenType = Token.LATIN; + // Go through the input, create a new token when + // a. Token type changed + // b. Get the Pinyin of current charater. + // c. current character is space. + for (int i = 0; i < inputLength; i++) { + final char character = input.charAt(i); + if (character == ' ') { + if (sb.length() > 0) { + addToken(sb, tokens, tokenType); + } + } else if (character < 256) { + if (tokenType != Token.LATIN && sb.length() > 0) { + addToken(sb, tokens, tokenType); + } + tokenType = Token.LATIN; + sb.append(character); + } else { + Token t = getToken(character); + if (t.type == Token.PINYIN) { + if (sb.length() > 0) { + addToken(sb, tokens, tokenType); + } + tokens.add(t); + tokenType = Token.PINYIN; + } else { + if (tokenType != t.type && sb.length() > 0) { + addToken(sb, tokens, tokenType); + } + tokenType = t.type; + sb.append(character); + } + } + } + if (sb.length() > 0) { + addToken(sb, tokens, tokenType); + } + return tokens; + } + + private void addToken( + final StringBuilder sb, final ArrayList tokens, final int tokenType) { + String str = sb.toString(); + tokens.add(new Token(tokenType, str, str)); + sb.setLength(0); + } + + public String toPinyinString(String string) { + if (string == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + ArrayList tokens = get(string); + for (Token token : tokens) { + sb.append(token.target); + } + return sb.toString().toLowerCase(); + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HyperlinkText.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HyperlinkText.kt new file mode 100644 index 000000000000..9efa3874ee2f --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/HyperlinkText.kt @@ -0,0 +1,88 @@ +package com.rifsxd.ksunext.ui.util + +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextDecoration +import java.util.regex.Pattern + +@Composable +fun LinkifyText( + text: String, + modifier: Modifier = Modifier +) { + val uriHandler = LocalUriHandler.current + val layoutResult = remember { + mutableStateOf(null) + } + val linksList = extractUrls(text) + val annotatedString = buildAnnotatedString { + append(text) + linksList.forEach { + addStyle( + style = SpanStyle( + color = MaterialTheme.colorScheme.primary, + textDecoration = TextDecoration.Underline + ), + start = it.start, + end = it.end + ) + addStringAnnotation( + tag = "URL", + annotation = it.url, + start = it.start, + end = it.end + ) + } + } + Text( + text = annotatedString, + modifier = modifier.pointerInput(Unit) { + detectTapGestures { offsetPosition -> + layoutResult.value?.let { + val position = it.getOffsetForPosition(offsetPosition) + annotatedString.getStringAnnotations(position, position).firstOrNull() + ?.let { result -> + if (result.tag == "URL") { + uriHandler.openUri(result.item) + } + } + } + } + }, + onTextLayout = { layoutResult.value = it } + ) +} + +private val urlPattern: Pattern = Pattern.compile( + "(?:^|\\W)((ht|f)tp(s?)://|www\\.)" + + "(([\\w\\-]+\\.)+([\\w\\-.~]+/?)*" + + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]*$~@!:/{};']*)", + Pattern.CASE_INSENSITIVE or Pattern.MULTILINE or Pattern.DOTALL +) + +private data class LinkInfo( + val url: String, + val start: Int, + val end: Int +) + +@Suppress("HttpUrlsUsage") +private fun extractUrls(text: String): List = buildList { + val matcher = urlPattern.matcher(text) + while (matcher.find()) { + val matchStart = matcher.start(1) + val matchEnd = matcher.end() + val url = text.substring(matchStart, matchEnd).replaceFirst("http://", "https://") + add(LinkInfo(url, matchStart, matchEnd)) + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt new file mode 100644 index 000000000000..79e2a3b2c10b --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/KsuCli.kt @@ -0,0 +1,661 @@ +package com.rifsxd.ksunext.ui.util + +import android.app.Activity +import android.content.Intent +import android.content.ContentResolver +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.os.Environment +import android.os.Parcelable +import android.os.SystemClock +import android.provider.OpenableColumns +import android.system.Os +import android.util.Log +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.ksuApp +import com.topjohnwu.superuser.CallbackList +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.io.SuFile +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import org.json.JSONArray +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + +/** + * @author weishu + * @date 2023/1/1. + */ +private const val TAG = "KsuCli" +private const val BUSYBOX = "/data/adb/ksu/bin/busybox" + +private fun getKsuDaemonPath(): String { + return ksuApp.applicationInfo.nativeLibraryDir + File.separator + "libksud.so" +} + +data class FlashResult(val code: Int, val err: String, val showReboot: Boolean) { + constructor(result: Shell.Result, showReboot: Boolean) : this(result.code, result.err.joinToString("\n"), showReboot) + constructor(result: Shell.Result) : this(result, result.isSuccess) +} + +inline fun withNewRootShell( + globalMnt: Boolean = false, + block: Shell.() -> T +): T { + return createRootShell(globalMnt).use(block) +} + +fun Uri.getFileName(context: Context): String? { + var fileName: String? = null + val contentResolver: ContentResolver = context.contentResolver + val cursor: Cursor? = contentResolver.query(this, null, null, null, null) + cursor?.use { + if (it.moveToFirst()) { + fileName = it.getString(it.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)) + } + } + return fileName +} + +fun createRootShellBuilder(globalMnt: Boolean = false): Shell.Builder { + return Shell.Builder.create().run { + val cmd = buildString { + append("${getKsuDaemonPath()} debug su") + if (globalMnt) append(" -g") + append(" || ") + append("su") + if (globalMnt) append(" --mount-master") + append(" || ") + append("sh") + } + setCommands("sh", "-c", cmd) + } +} + +fun createRootShell(globalMnt: Boolean = false): Shell { + return runCatching { + createRootShellBuilder(globalMnt).build() + }.getOrElse { e -> + Log.w(TAG, "su failed: ", e) + Shell.Builder.create().apply { + if (globalMnt) setFlags(Shell.FLAG_MOUNT_MASTER) + }.build() + } +} + +fun execKsud(args: String, newShell: Boolean = false): Boolean { + return if (newShell) { + withNewRootShell { + ShellUtils.fastCmdResult(this, "${getKsuDaemonPath()} $args") + } + } else { + ShellUtils.fastCmdResult("${getKsuDaemonPath()} $args") + } +} + +suspend fun getFeatureStatus(feature: String): String = withContext(Dispatchers.IO) { + val shell = createRootShell(true) + + val out = shell.newJob() + .add("${getKsuDaemonPath()} feature check $feature").to(ArrayList(), null).exec().out + out.firstOrNull()?.trim().orEmpty() +} + +suspend fun getFeaturePersistValue(feature: String): Long? = withContext(Dispatchers.IO) { + val shell = createRootShell(true) + + val out = shell.newJob() + .add("${getKsuDaemonPath()} feature get --config $feature").to(ArrayList(), null).exec().out + val valueLine = out.firstOrNull { it.trim().startsWith("Value:") } ?: return@withContext null + valueLine.substringAfter("Value:").trim().toLongOrNull() +} + +fun install() { + val start = SystemClock.elapsedRealtime() + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so").absolutePath + val result = execKsud("install --magiskboot $magiskboot", true) + Log.w(TAG, "install result: $result, cost: ${SystemClock.elapsedRealtime() - start}ms") +} + +fun listModules(): String { + val out = + Shell.cmd("${getKsuDaemonPath()} module list").to(ArrayList(), null).exec().out + return out.joinToString("\n").ifBlank { "[]" } +} + +fun getModuleCount(): Int { + return runCatching { + JSONArray(listModules()).length() + }.getOrDefault(0) +} + +fun getSuperuserCount(): Int { + return Natives.getSuperuserCount() +} + +fun toggleModule(id: String, enable: Boolean): Boolean { + val cmd = if (enable) { + "module enable $id" + } else { + "module disable $id" + } + val result = execKsud(cmd, true) + Log.i(TAG, "$cmd result: $result") + return result +} + +fun uninstallModule(id: String): Boolean { + val cmd = "module uninstall $id" + val result = execKsud(cmd, true) + Log.i(TAG, "uninstall module $id result: $result") + return result +} + +fun restoreModule(id: String): Boolean { + val cmd = "module restore $id" + val result = execKsud(cmd, true) + Log.i(TAG, "restore module $id result: $result") + return result +} + +fun getSelinuxEnforce(): Boolean? { + return runCatching { + val out = ShellUtils.fastCmd("getenforce").trim() + when { + out.equals("Enforcing", ignoreCase = true) -> true + out.equals("Permissive", ignoreCase = true) -> false + else -> null + } + }.getOrNull() +} + +fun setSelinuxEnforce(enforce: Boolean): Boolean { + return runCatching { + val valStr = if (enforce) "1" else "0" + ShellUtils.fastCmdResult("setenforce $valStr") + }.getOrDefault(false) +} + +private fun processUiPrintLine(s: String?): Pair { + if (s == null) { + return Pair(1,null) + } + + val check1 = s.startsWith("ui_print") + val trimmed = s.trim() + val check2 = trimmed.startsWith("ui_print") + if (!check1 && check2) return Pair(1,null) + + return if(check1) { + Pair(1,trimmed.drop(8).dropWhile { it.isWhitespace() }) + } + else { + Pair(2, trimmed) + } +} + +private fun flashWithIO_ak3( + cmd: String, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): Shell.Result { + + val stdoutCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + val (type, text) = processUiPrintLine(s) + if(type == 1) { + text?.let(onStdout) + } else { + text?.let(onStderr) + } + } + } + + val stderrCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStderr(s ?: "") + } + } + + return withNewRootShell { + newJob().add(cmd).to(stdoutCallback, stderrCallback).exec() + } +} + +private fun flashWithIO( + cmd: String, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): Shell.Result { + + val stdoutCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStdout(s ?: "") + } + } + + val stderrCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStderr(s ?: "") + } + } + + return withNewRootShell { + newJob().add(cmd).to(stdoutCallback, stderrCallback).exec() + } +} + +fun flashModule( + uri: Uri, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): FlashResult { + val resolver = ksuApp.contentResolver + with(resolver.openInputStream(uri)) { + val file = File(ksuApp.cacheDir, "module.zip") + file.outputStream().use { output -> + this?.copyTo(output) + } + val cmd = "module install ${file.absolutePath}" + val result = flashWithIO("${getKsuDaemonPath()} $cmd", onStdout, onStderr) + Log.i("KernelSU", "install module $uri result: $result") + + file.delete() + + return FlashResult(result) + } +} + +fun runModuleAction( + moduleId: String, onStdout: (String) -> Unit, onStderr: (String) -> Unit +): Boolean { + val shell = createRootShell(true) + + val stdoutCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStdout(s ?: "") + } + } + + val stderrCallback: CallbackList = object : CallbackList() { + override fun onAddElement(s: String?) { + onStderr(s ?: "") + } + } + + val result = shell.newJob().add("${getKsuDaemonPath()} module action $moduleId") + .to(stdoutCallback, stderrCallback).exec() + Log.i("KernelSU", "Module runAction result: $result") + + return result.isSuccess +} + +fun restoreBoot( + onStdout: (String) -> Unit, onStderr: (String) -> Unit +): FlashResult { + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") + val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr) + return FlashResult(result) +} + +fun uninstallPermanently( + onStdout: (String) -> Unit, onStderr: (String) -> Unit +): FlashResult { + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") + val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr) + return FlashResult(result) +} + +@Parcelize +sealed class LkmSelection : Parcelable { + data class LkmUri(val uri: Uri) : LkmSelection() + data class KmiString(val value: String) : LkmSelection() + data object KmiNone : LkmSelection() +} + +fun installBoot( + bootUri: Uri?, + lkm: LkmSelection, + ota: Boolean, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit, +): FlashResult { + val resolver = ksuApp.contentResolver + + val bootFile = bootUri?.let { uri -> + with(resolver.openInputStream(uri)) { + val bootFile = File(ksuApp.cacheDir, "boot.img") + bootFile.outputStream().use { output -> + this?.copyTo(output) + } + + bootFile + } + } + + val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libmagiskboot.so") + var cmd = "boot-patch --magiskboot ${magiskboot.absolutePath}" + + cmd += if (bootFile == null) { + // no boot.img, use -f to force install + " -f" + } else { + " -b ${bootFile.absolutePath}" + } + + if (ota) { + cmd += " -u" + } + + var lkmFile: File? = null + when (lkm) { + is LkmSelection.LkmUri -> { + lkmFile = with(resolver.openInputStream(lkm.uri)) { + val file = File(ksuApp.cacheDir, "kernelsu-tmp-lkm.ko") + file.outputStream().use { output -> + this?.copyTo(output) + } + + file + } + cmd += " -m ${lkmFile.absolutePath}" + } + + is LkmSelection.KmiString -> { + cmd += " --kmi ${lkm.value}" + } + + LkmSelection.KmiNone -> { + // do nothing + } + } + + // output dir + val downloadsDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + cmd += " -o $downloadsDir" + + val result = flashWithIO("${getKsuDaemonPath()} $cmd", onStdout, onStderr) + Log.i("KernelSU", "install boot result: ${result.isSuccess}") + + bootFile?.delete() + lkmFile?.delete() + + // if boot uri is empty, it is direct install, when success, we should show reboot button + return FlashResult(result, bootUri == null && result.isSuccess) +} + +fun reboot(reason: String = "") { + if (reason == "soft-reboot") { + // ksud (userspace) + com.rifsxd.ksunext.ui.util.execKsud("soft-reboot") + return + } + + if (reason == "recovery") { + // KEYCODE_POWER = 26, hide incorrect "Factory data reset" message + ShellUtils.fastCmdResult("/system/bin/input keyevent 26") + } + ShellUtils.fastCmdResult("/system/bin/svc power reboot $reason || /system/bin/reboot $reason") +} + +fun flashAnyKernelZip( + uri: Uri, + onStdout: (String) -> Unit, + onStderr: (String) -> Unit +): FlashResult { + val resolver = ksuApp.contentResolver + + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) + val tmpFile = File(ksuApp.cacheDir, "anykernel_${timestamp}.zip") + resolver.openInputStream(uri).use { input -> + tmpFile.outputStream().use { out -> + input?.copyTo(out) + } + } + + val destZip = tmpFile.absolutePath + val destZipName = File(destZip).name + val destDirFile = File(ksuApp.cacheDir, "anykernel3_${timestamp}") + val destDir = destDirFile.absolutePath + + // Validate that the zip contains the required META-INF installer script + val hasInstaller = runCatching { + java.util.zip.ZipFile(tmpFile).use { zip -> + zip.getEntry("META-INF/com/google/android/update-binary") != null + } + }.getOrDefault(false) + + if (!hasInstaller) { + tmpFile.delete() + val errMsg = "Invalid AnyKernel3 zip: META-INF/com/google/android/update-binary not found!" + onStderr(errMsg) + return FlashResult(1, "", false) + } + + val cmd = """ + mkdir -p '$destDir' && \ + $BUSYBOX unzip -p -o '$destZip' "META-INF/com/google/android/update-binary" > '$destDir/update-binary' 2>/dev/null && \ + cp '$destZip' '$destDir/$destZipName' 2>/dev/null || true && \ + $BUSYBOX chmod 755 '$destDir/update-binary' && \ + $BUSYBOX chown root:root '$destDir/update-binary' && \ + (cd '$destDir' && \ + if [ -f './update-binary' ]; then \ + AKHOME='$destDir/tmp' $BUSYBOX ash '$destDir/update-binary' 3 1 '$destDir/$destZipName'; \ + else \ + echo 'No installer script found' >&2; exit 1; \ + fi) + """.trimIndent().replace(Regex("\\s+\\\\\\s*"), " ") + + val result = flashWithIO_ak3(cmd, onStdout, onStderr) + try { + return FlashResult(result, result.isSuccess) + } finally { + try { + runCatching { + createRootShell(true).use { sh -> + sh.newJob().add("rm -rf '$destDir' '$destZip'").exec() + } + } + } catch (_: Throwable) { + } + } +} + +fun rootAvailable() = Shell.isAppGrantedRoot() == true + +fun isInitBoot(): Boolean { + return !Os.uname().release.contains("android12-") +} + +suspend fun getCurrentKmi(): String = withContext(Dispatchers.IO) { + val cmd = "boot-info current-kmi" + ShellUtils.fastCmd("${getKsuDaemonPath()} $cmd") +} + +suspend fun getSupportedKmis(): List = withContext(Dispatchers.IO) { + val cmd = "boot-info supported-kmis" + val out = Shell.cmd("${getKsuDaemonPath()} $cmd").to(ArrayList(), null).exec().out + out.filter { it.isNotBlank() }.map { it.trim() } +} + +suspend fun isAbDevice(): Boolean = withContext(Dispatchers.IO) { + val cmd = "boot-info is-ab-device" + ShellUtils.fastCmd("${getKsuDaemonPath()} $cmd").trim().toBoolean() +} + +suspend fun getDefaultPartition(): String = withContext(Dispatchers.IO) { + if (rootAvailable()) { + val cmd = "boot-info default-partition" + ShellUtils.fastCmd("${getKsuDaemonPath()} $cmd").trim() + } else { + if (!Os.uname().release.contains("android12-")) "init_boot" else "boot" + } +} + +suspend fun getSlotSuffix(ota: Boolean): String = withContext(Dispatchers.IO) { + val cmd = if (ota) { + "boot-info slot-suffix --ota" + } else { + "boot-info slot-suffix" + } + ShellUtils.fastCmd("${getKsuDaemonPath()} $cmd").trim() +} + +suspend fun getAvailablePartitions(): List = withContext(Dispatchers.IO) { + val shell = createRootShell(true) + val cmd = "boot-info available-partitions" + val out = shell.newJob().add("${getKsuDaemonPath()} $cmd").to(ArrayList(), null).exec().out + out.filter { it.isNotBlank() }.map { it.trim() } +} + +fun hasMagisk(): Boolean { + val result = ShellUtils.fastCmdResult("which magisk") + Log.i(TAG, "has magisk: $result") + return result +} + +fun isSepolicyValid(rules: String?): Boolean { + if (rules == null) { + return true + } + val result = + Shell.cmd("${getKsuDaemonPath()} sepolicy check '$rules'").to(ArrayList(), null) + .exec() + return result.isSuccess +} + +fun getSepolicy(pkg: String): String { + val result = + Shell.cmd("${getKsuDaemonPath()} profile get-sepolicy $pkg").to(ArrayList(), null) + .exec() + Log.i(TAG, "code: ${result.code}, out: ${result.out}, err: ${result.err}") + return result.out.joinToString("\n") +} + +fun setSepolicy(pkg: String, rules: String): Boolean { + val result = Shell.cmd("${getKsuDaemonPath()} profile set-sepolicy $pkg '$rules'") + .to(ArrayList(), null).exec() + Log.i(TAG, "set sepolicy result: ${result.code}") + return result.isSuccess +} + +fun listAppProfileTemplates(): List { + return Shell.cmd("${getKsuDaemonPath()} profile list-templates").to(ArrayList(), null) + .exec().out +} + +fun getAppProfileTemplate(id: String): String { + return Shell.cmd("${getKsuDaemonPath()} profile get-template '${id}'") + .to(ArrayList(), null).exec().out.joinToString("\n") +} + +fun getFileName(context: Context, uri: Uri): String { + var name = "Unknown Module" + if (uri.scheme == ContentResolver.SCHEME_CONTENT) { + val cursor: Cursor? = context.contentResolver.query(uri, null, null, null, null) + cursor?.use { + if (it.moveToFirst()) { + name = it.getString(it.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)) + } + } + } else if (uri.scheme == "file") { + name = uri.lastPathSegment ?: "Unknown Module" + } + return name +} + +fun currentMountSystem(): String { + val result = ShellUtils.fastCmd("${getKsuDaemonPath()} module mount").trim() + return result.substringAfter(":").substringAfter(" ").trim() +} + +fun getModuleSize(dir: File): Long { + val result = ShellUtils.fastCmd("$BUSYBOX du -sb '${dir.absolutePath}' | awk '{print $1}'").trim() + return result.toLongOrNull() ?: 0L +} + +fun isSuCompatDisabled(): Boolean { + return !Natives.isSuEnabled() +} + +fun zygiskRequired(dir: File): Boolean { + return (SuFile(dir, "zygisk").listFiles()?.size ?: 0) > 0 +} + +fun isZygiskImpl(dir: File): Boolean { + return SuFile(dir, "bin/zygiskd").exists() || SuFile(dir, "bin/zygiskd64").exists() +} + +fun refreshActivity(context: Context) { + if (context is Activity) { + context.recreate() + } +} + +fun restartActivity(context: Context) { + val packageManager = context.packageManager + val intent = packageManager.getLaunchIntentForPackage(context.packageName) + intent?.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + context.startActivity(intent) + if (context is Activity) { + context.finish() + } +} + +fun getSuSFS(): String { + return ShellUtils.fastCmd("${getKsuDaemonPath()} susfs support") +} + +fun getSuSFSVersion(): String { + return ShellUtils.fastCmd("${getKsuDaemonPath()} susfs version") +} + +fun getSuSFSVariant(): String { + return ShellUtils.fastCmd("${getKsuDaemonPath()} susfs variant") +} + +fun getSuSFSFeatures(): String { + return ShellUtils.fastCmd("${getKsuDaemonPath()} susfs features") +} + +fun getMetaModule(): String { + return ShellUtils.fastCmd("${getKsuDaemonPath()} module metamodule") +} + +fun setAppProfileTemplate(id: String, template: String): Boolean { + val escapedTemplate = template.replace("\"", "\\\"") + val cmd = """${getKsuDaemonPath()} profile set-template "$id" "$escapedTemplate'"""" + return Shell.cmd(cmd) + .to(ArrayList(), null).exec().isSuccess +} + +fun deleteAppProfileTemplate(id: String): Boolean { + return Shell.cmd("${getKsuDaemonPath()} profile delete-template '${id}'") + .to(ArrayList(), null).exec().isSuccess +} + +fun forceStopApp(packageName: String) { + val result = Shell.cmd("am force-stop $packageName").exec() + Log.i(TAG, "force stop $packageName result: $result") +} + +fun launchApp(packageName: String) { + val result = + Shell.cmd("cmd package resolve-activity --brief $packageName | tail -n 1 | xargs cmd activity start-activity -n") + .exec() + Log.i(TAG, "launch $packageName result: $result") +} + +fun restartApp(packageName: String) { + forceStopApp(packageName) + launchApp(packageName) +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LocaleHelper.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LocaleHelper.kt new file mode 100644 index 000000000000..2531da61aef2 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LocaleHelper.kt @@ -0,0 +1,141 @@ +package com.rifsxd.ksunext.ui.util + +import android.annotation.TargetApi +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.res.Configuration +import android.net.Uri +import android.os.Build +import android.provider.Settings +import java.util.* + +object LocaleHelper { + + /** + * Check if should use system language settings (Android 13+) + */ + val useSystemLanguageSettings: Boolean + get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + + /** + * Launch system app locale settings (Android 13+) + */ + fun launchSystemLanguageSettings(context: Context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + try { + val intent = Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { + data = Uri.fromParts("package", context.packageName, null) + } + context.startActivity(intent) + } catch (_: Exception) { + // Fallback to app language settings if system settings not available + } + } + } + + /** + * Apply saved language setting to context (for Android < 13) + */ + fun applyLanguage(context: Context): Context { + // On Android 13+, language is handled by system + if (useSystemLanguageSettings) { + return context + } + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val localeTag = prefs.getString("app_locale", "system") ?: "system" + + return if (localeTag == "system") { + context + } else { + val locale = parseLocaleTag(localeTag) + setLocale(context, locale) + } + } + + /** + * Set locale for context (Android < 13) + */ + private fun setLocale(context: Context, locale: Locale): Context { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + updateResources(context, locale) + } else { + updateResourcesLegacy(context, locale) + } + } + + @TargetApi(Build.VERSION_CODES.N) + private fun updateResources(context: Context, locale: Locale): Context { + val configuration = Configuration() + configuration.setLocale(locale) + configuration.setLayoutDirection(locale) + return context.createConfigurationContext(configuration) + } + + @Suppress("DEPRECATION") + @SuppressWarnings("deprecation") + private fun updateResourcesLegacy(context: Context, locale: Locale): Context { + Locale.setDefault(locale) + val resources = context.resources + val configuration = resources.configuration + configuration.locale = locale + configuration.setLayoutDirection(locale) + resources.updateConfiguration(configuration, resources.displayMetrics) + return context + } + + /** + * Parse locale tag to Locale object + */ + private fun parseLocaleTag(tag: String): Locale { + return try { + if (tag.contains("_")) { + val parts = tag.split("_") + Locale.Builder() + .setLanguage(parts[0]) + .setRegion(parts.getOrNull(1) ?: "") + .build() + } else { + Locale.Builder() + .setLanguage(tag) + .build() + } + } catch (_: Exception) { + Locale.getDefault() + } + } + + /** + * Get current app locale + */ + fun getCurrentAppLocale(context: Context): Locale? { + return if (useSystemLanguageSettings) { + // Android 13+ - get from system app locale settings + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + try { + val localeManager = context.getSystemService(Context.LOCALE_SERVICE) as? android.app.LocaleManager + val locales = localeManager?.applicationLocales + if (locales != null && !locales.isEmpty) { + locales.get(0) + } else { + null // System default + } + } catch (_: Exception) { + null // System default + } + } else { + null // System default + } + } else { + // Android < 13 - get from SharedPreferences + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val localeTag = prefs.getString("app_locale", "system") ?: "system" + if (localeTag == "system") { + null // System default + } else { + parseLocaleTag(localeTag) + } + } + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LogEvent.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LogEvent.kt new file mode 100644 index 000000000000..5a6a98e58c84 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/LogEvent.kt @@ -0,0 +1,116 @@ +package com.rifsxd.ksunext.ui.util + +import android.content.Context +import android.os.Build +import android.system.Os +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.ui.screen.getManagerVersion +import com.topjohnwu.superuser.Shell +import com.topjohnwu.superuser.ShellUtils +import java.io.File +import java.io.FileWriter +import java.io.PrintWriter +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +fun getBugreportFile(context: Context): File { + + val bugreportDir = File(context.cacheDir, "bugreport") + bugreportDir.mkdirs() + + val processFile = File(bugreportDir, "process.txt") + val dmesgFile = File(bugreportDir, "dmesg.txt") + val logcatFile = File(bugreportDir, "logcat.txt") + val tombstonesFile = File(bugreportDir, "tombstones.tar.gz") + val dropboxFile = File(bugreportDir, "dropbox.tar.gz") + val pstoreFile = File(bugreportDir, "pstore.tar.gz") + // Xiaomi/Readmi devices have diag in /data/vendor/diag + val diagFile = File(bugreportDir, "diag.tar.gz") + val oplusFile = File(bugreportDir, "oplus.tar.gz") + val bootlogFile = File(bugreportDir, "bootlog.tar.gz") + val mountsFile = File(bugreportDir, "mounts.txt") + val fileSystemsFile = File(bugreportDir, "filesystems.txt") + val adbFileTree = File(bugreportDir, "adb_tree.txt") + val adbFileDetails = File(bugreportDir, "adb_details.txt") + val ksuFileSize = File(bugreportDir, "ksu_size.txt") + val appListFile = File(bugreportDir, "packages.txt") + val propFile = File(bugreportDir, "props.txt") + val allowListFile = File(bugreportDir, "allowlist.bin") + val procModules = File(bugreportDir, "proc_modules.txt") + val bootConfig = File(bugreportDir, "boot_config.txt") + val kernelConfig = File(bugreportDir, "defconfig.gz") + + val shell = createRootShell(true) + + // busybox ps has very few features for embed devices + shell.newJob().add("toybox ps -T -A -w -o PID,TID,UID,COMM,CMDLINE,CMD,LABEL,STAT,WCHAN > ${processFile.absolutePath}").exec() + shell.newJob().add("dmesg -r > ${dmesgFile.absolutePath}").exec() + shell.newJob().add("logcat -b all -v uid -d > ${logcatFile.absolutePath}").exec() + shell.newJob().add("tar -czf ${tombstonesFile.absolutePath} -C /data/tombstones .").exec() + shell.newJob().add("tar -czf ${dropboxFile.absolutePath} -C /data/system/dropbox .").exec() + shell.newJob().add("tar -czf ${pstoreFile.absolutePath} -C /sys/fs/pstore .").exec() + shell.newJob().add("tar -czf ${diagFile.absolutePath} -C /data/vendor/diag . --exclude=./minidump.gz").exec() + shell.newJob().add("tar -czf ${oplusFile.absolutePath} -C /mnt/oplus/op2/media/log/boot_log/ .").exec() + shell.newJob().add("tar -czf ${bootlogFile.absolutePath} -C /data/adb/ksu/log .").exec() + + shell.newJob().add("cat /proc/1/mountinfo > ${mountsFile.absolutePath}").exec() + shell.newJob().add("cat /proc/filesystems > ${fileSystemsFile.absolutePath}").exec() + shell.newJob().add("busybox tree /data/adb > ${adbFileTree.absolutePath}").exec() + shell.newJob().add("ls -alRZ /data/adb > ${adbFileDetails.absolutePath}").exec() + shell.newJob().add("du -sh /data/adb/ksu/* > ${ksuFileSize.absolutePath}").exec() + shell.newJob().add("cp /data/system/packages.list ${appListFile.absolutePath}").exec() + shell.newJob().add("getprop > ${propFile.absolutePath}").exec() + shell.newJob().add("cp /data/adb/ksu/.allowlist ${allowListFile.absolutePath}").exec() + shell.newJob().add("cp /proc/modules ${procModules.absolutePath}").exec() + shell.newJob().add("cp /proc/bootconfig ${bootConfig.absolutePath}").exec() + shell.newJob().add("cp /proc/config.gz ${kernelConfig.absolutePath}").exec() + + val selinux = ShellUtils.fastCmd("getenforce") + + // basic information + val buildInfo = File(bugreportDir, "basic.txt") + PrintWriter(FileWriter(buildInfo)).use { pw -> + pw.println("Kernel: ${System.getProperty("os.version")}") + pw.println("BRAND: " + Build.BRAND) + pw.println("MODEL: " + Build.MODEL) + pw.println("PRODUCT: " + Build.PRODUCT) + pw.println("MANUFACTURER: " + Build.MANUFACTURER) + pw.println("ANDROID: " + Build.VERSION.RELEASE) + pw.println("SDK: " + Build.VERSION.SDK_INT) + pw.println("PREVIEW_SDK: " + Build.VERSION.PREVIEW_SDK_INT) + pw.println("FINGERPRINT: " + Build.FINGERPRINT) + pw.println("DEVICE: " + Build.DEVICE) + pw.println("Manager: " + getManagerVersion(context)) + pw.println("SELinux: $selinux") + + val uname = Os.uname() + pw.println("KernelRelease: ${uname.release}") + pw.println("KernelVersion: ${uname.version}") + pw.println("Machine: ${uname.machine}") + pw.println("Nodename: ${uname.nodename}") + pw.println("Sysname: ${uname.sysname}") + + val ksuKernel = Natives.version + pw.println("KernelSU: $ksuKernel") + val safeMode = Natives.isSafeMode + pw.println("SafeMode: $safeMode") + val lkmMode = Natives.isLkmMode + pw.println("LKM: $lkmMode") + } + + // modules + val modulesFile = File(bugreportDir, "modules.json") + modulesFile.writeText(listModules()) + + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm") + val current = LocalDateTime.now().format(formatter) + + val targetFile = File(context.cacheDir, "KernelSU_Next_bugreport_${current}.tar.gz") + + Shell.cmd("tar czf ${targetFile.absolutePath} -C ${bugreportDir.absolutePath} .").exec() + Shell.cmd("rm -rf ${bugreportDir.absolutePath}").exec() + Shell.cmd("chmod 0644 ${targetFile.absolutePath}").exec() + + return targetFile +} + diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/SELinuxChecker.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/SELinuxChecker.kt new file mode 100644 index 000000000000..6dd976573a52 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/SELinuxChecker.kt @@ -0,0 +1,21 @@ +package com.rifsxd.ksunext.ui.util + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.rifsxd.ksunext.R +import com.topjohnwu.superuser.io.SuFile + +@Composable +fun getSELinuxStatus() = SuFile("/sys/fs/selinux/enforce").run { + when { + !exists() -> stringResource(R.string.selinux_status_disabled) + !isFile -> stringResource(R.string.selinux_status_unknown) + !canRead() -> stringResource(R.string.selinux_status_enforcing) + else -> when (runCatching { newInputStream() }.getOrNull()?.bufferedReader() + ?.use { it.runCatching { readLine() }.getOrNull()?.trim()?.toIntOrNull() }) { + 1 -> stringResource(R.string.selinux_status_enforcing) + 0 -> stringResource(R.string.selinux_status_permissive) + else -> stringResource(R.string.selinux_status_unknown) + } + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/LatestVersionInfo.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/LatestVersionInfo.kt new file mode 100644 index 000000000000..41d611d4f419 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/LatestVersionInfo.kt @@ -0,0 +1,8 @@ +package com.rifsxd.ksunext.ui.util.module + +data class LatestVersionInfo( + val versionCode : Int = 0, + val downloadUrl : String = "", + val changelog : String = "", + val versionTag : String = "v0.0.0" +) diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/Shortcut.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/Shortcut.kt new file mode 100644 index 000000000000..129b6c8f7247 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/util/module/Shortcut.kt @@ -0,0 +1,209 @@ +package com.rifsxd.ksunext.ui.util.module + +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.os.Build +import android.util.Log +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.core.graphics.scale +import androidx.core.net.toUri +import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileInputStream +import com.rifsxd.ksunext.R +import com.rifsxd.ksunext.ui.MainActivity +import com.rifsxd.ksunext.ui.util.createRootShell +import com.rifsxd.ksunext.ui.webui.WebUIActivity + +object Shortcut { + + fun createModuleActionShortcut( + context: Context, + moduleId: String, + name: String, + iconUri: String? + ) { + val intent = Intent(context, MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + putExtra("shortcut_type", "module_action") + putExtra("module_id", moduleId) + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + } + requestPin(context, "module_action_$moduleId", name, iconUri, intent) + } + + fun createModuleWebUiShortcut( + context: Context, + moduleId: String, + name: String, + iconUri: String? + ) { + val intent = Intent(context, WebUIActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = "kernelsu://webui/$moduleId".toUri() + putExtra("id", moduleId) + putExtra("name", name) + putExtra("from_webui_shortcut", true) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + } + requestPin(context, "module_webui_$moduleId", name, iconUri, intent) + } + + fun hasModuleActionShortcut(context: Context, moduleId: String) = + hasPinnedShortcut(context, "module_action_$moduleId") + + fun hasModuleWebUiShortcut(context: Context, moduleId: String) = + hasPinnedShortcut(context, "module_webui_$moduleId") + + fun deleteModuleActionShortcut(context: Context, moduleId: String) = + deleteShortcut(context, "module_action_$moduleId") + + fun deleteModuleWebUiShortcut(context: Context, moduleId: String) = + deleteShortcut(context, "module_webui_$moduleId") + + private fun requestPin( + context: Context, + shortcutId: String, + name: String, + iconUri: String?, + shortcutIntent: Intent + ) { + if (!ShortcutManagerCompat.isRequestPinShortcutSupported(context)) { + Toast.makeText( + context, + context.getString(R.string.module_shortcut_not_supported), + Toast.LENGTH_LONG + ).show() + return + } + + val icon = buildIcon(context, iconUri) + ?: IconCompat.createWithResource(context, R.mipmap.ic_launcher) + + val shortcut = ShortcutInfoCompat.Builder(context, shortcutId) + .setShortLabel(name) + .setLongLabel(name) + .setIcon(icon) + .setIntent(shortcutIntent) + .build() + + runCatching { ShortcutManagerCompat.pushDynamicShortcut(context, shortcut) } + + if (hasPinnedShortcut(context, shortcutId)) { + Toast.makeText( + context, + context.getString(R.string.module_shortcut_updated), + Toast.LENGTH_SHORT + ).show() + return + } + + val callbackAction = "${context.packageName}.SHORTCUT_PINNED.$shortcutId" + + val receiver = object : BroadcastReceiver() { + override fun onReceive(ctx: Context, intent: Intent) { + ctx.unregisterReceiver(this) + Toast.makeText( + ctx, + ctx.getString(R.string.module_shortcut_created), + Toast.LENGTH_SHORT + ).show() + } + } + + ContextCompat.registerReceiver( + context, + receiver, + IntentFilter(callbackAction), + ContextCompat.RECEIVER_NOT_EXPORTED + ) + + val pendingIntentFlags = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + else + PendingIntent.FLAG_UPDATE_CURRENT + + val callbackPendingIntent = PendingIntent.getBroadcast( + context, + shortcutId.hashCode(), + Intent(callbackAction).setPackage(context.packageName), + pendingIntentFlags + ) + + val accepted = runCatching { + ShortcutManagerCompat.requestPinShortcut( + context, + shortcut, + callbackPendingIntent.intentSender + ) + }.getOrElse { t -> + false + } + + if (!accepted) { + context.unregisterReceiver(receiver) + Toast.makeText( + context, + context.getString(R.string.module_shortcut_not_supported), + Toast.LENGTH_LONG + ).show() + } + } + + private fun hasPinnedShortcut(context: Context, id: String): Boolean = + runCatching { + ShortcutManagerCompat + .getShortcuts(context, ShortcutManagerCompat.FLAG_MATCH_PINNED) + .any { it.id == id && it.isEnabled } + }.getOrDefault(false) + + private fun deleteShortcut(context: Context, id: String) { + runCatching { ShortcutManagerCompat.removeDynamicShortcuts(context, listOf(id)) } + runCatching { ShortcutManagerCompat.disableShortcuts(context, listOf(id), "") } + } + + fun loadShortcutBitmap(context: Context, iconUri: String?): Bitmap? { + if (iconUri.isNullOrBlank()) return null + return runCatching { + val uri = iconUri.toUri() + val raw = when { + uri.scheme.equals("su", ignoreCase = true) -> { + val path = uri.path?.takeIf { it.isNotBlank() } ?: return null + val shell = createRootShell(true) + val suFile = SuFile(path).also { it.shell = shell } + SuFileInputStream.open(suFile).use { BitmapFactory.decodeStream(it) } + } + else -> context.contentResolver.openInputStream(uri) + ?.use { BitmapFactory.decodeStream(it) } + } ?: return null + + val side = minOf(raw.width, raw.height) + val squared = runCatching { + Bitmap.createBitmap(raw, (raw.width - side) / 2, (raw.height - side) / 2, side, side) + }.getOrDefault(raw) + if (squared !== raw && !raw.isRecycled) raw.recycle() + + if (side > 512) { + runCatching { squared.scale(512, 512) } + .getOrDefault(squared) + .also { if (it !== squared && !squared.isRecycled) squared.recycle() } + } else { + squared + } + }.getOrElse { t -> + null + } + } + + private fun buildIcon(context: Context, iconUri: String?): IconCompat? = + loadShortcutBitmap(context, iconUri)?.let { IconCompat.createWithBitmap(it) } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt new file mode 100644 index 000000000000..86f0ed8d036c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/ModuleViewModel.kt @@ -0,0 +1,230 @@ +package com.rifsxd.ksunext.ui.viewmodel + +import android.net.Uri +import android.os.SystemClock +import android.util.Log +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.util.HanziToPinyin +import com.rifsxd.ksunext.ui.util.getModuleSize +import com.rifsxd.ksunext.ui.util.listModules +import com.rifsxd.ksunext.ui.util.zygiskRequired +import com.rifsxd.ksunext.ui.util.isZygiskImpl +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.json.JSONArray +import org.json.JSONObject +import java.io.File +import java.text.Collator +import java.util.* + +class ModuleViewModel : ViewModel() { + + companion object { + private const val TAG = "ModuleViewModel" + private var modules by mutableStateOf>(emptyList()) + } + + class ModuleInfo( + val id: String, + val name: String, + val author: String, + val version: String, + val versionCode: Int, + val description: String, + val enabled: Boolean, + val update: Boolean, + val remove: Boolean, + val updateJson: String, + val hasWebUi: Boolean, + val hasActionScript: Boolean, + val size: Long, + val banner: String, + val zygiskRequired: Boolean, + val isMetaModule: Boolean, + val actionIconPath: String?, + val webUiIconPath: String?, + val donate: String, + val isZygisk: Boolean, + ) + + data class ModuleUpdateInfo( + val version: String, + val versionCode: Int, + val zipUrl: String, + val changelog: String, + ) + + var isRefreshing by mutableStateOf(false) + private set + + var search by mutableStateOf("") + + var sortAToZ by mutableStateOf(false) + var sortZToA by mutableStateOf(false) + var sortSizeLowToHigh by mutableStateOf(false) + var sortSizeHighToLow by mutableStateOf(false) + var sortEnabledFirst by mutableStateOf(false) + var sortActionFirst by mutableStateOf(false) + var sortWebUiFirst by mutableStateOf(false) + + val moduleList by derivedStateOf { + val comparator = when { + sortWebUiFirst -> compareByDescending { it.hasWebUi } + sortEnabledFirst -> compareByDescending { it.enabled } + sortActionFirst -> compareByDescending { it.hasActionScript } + sortAToZ -> compareBy { it.name.lowercase() } + sortZToA -> compareByDescending { it.name.lowercase() } + sortSizeLowToHigh -> compareBy { it.size } + sortSizeHighToLow -> compareByDescending { it.size } + else -> compareBy { it.id } + }.thenBy(Collator.getInstance(Locale.getDefault()), ModuleInfo::id) + + modules.filter { + it.id.contains(search, ignoreCase = true) || + it.name.contains(search, ignoreCase = true) || + HanziToPinyin.getInstance().toPinyinString(it.name).contains(search, ignoreCase = true) + }.sortedWith(comparator).also { + isRefreshing = false + } + } + + + var isNeedRefresh by mutableStateOf(false) + private set + + fun markNeedRefresh() { + isNeedRefresh = true + } + + var zipUris by mutableStateOf>(emptyList()) + + fun updateZipUris(uris: List) { + zipUris = uris + } + + fun clearZipUris() { + zipUris = emptyList() + } + + fun fetchModuleList() { + + viewModelScope.launch { + + isRefreshing = true + + withContext(Dispatchers.IO) { + val start = SystemClock.elapsedRealtime() + val oldModuleList = modules + + kotlin.runCatching { + val result = listModules() + Log.i(TAG, "result: $result") + + val array = JSONArray(result) + modules = (0 until array.length()) + .asSequence() + .map { array.getJSONObject(it) } + .map { obj -> + val id = obj.getString("id") + val moduleDir = File("/data/adb/modules/$id") + val size = getModuleSize(moduleDir) + val zygiskRequired = zygiskRequired(moduleDir) + val metaModule = + obj.optInt("metamodule") != 0 || + obj.optBoolean("metamodule") + + val isZygisk = isZygiskImpl(moduleDir) + + + ModuleInfo( + id, + obj.optString("name"), + obj.optString("author", "Unknown"), + obj.optString("version", "Unknown"), + obj.optInt("versionCode", 0), + obj.optString("description"), + obj.getBoolean("enabled"), + obj.getBoolean("update"), + obj.getBoolean("remove"), + obj.optString("updateJson"), + obj.optBoolean("web"), + obj.optBoolean("action"), + size, + obj.optString("banner"), + zygiskRequired, + metaModule, + obj.optString("actionIcon").takeIf { it.isNotBlank() }, + obj.optString("webuiIcon").takeIf { it.isNotBlank() }, + obj.optString("donate"), + isZygisk + ) + }.toList() + isNeedRefresh = false + }.onFailure { e -> + Log.e(TAG, "fetchModuleList: ", e) + isRefreshing = false + } + + // when both old and new is kotlin.collections.EmptyList + // moduleList update will don't trigger + if (oldModuleList === modules) { + isRefreshing = false + } + + Log.i(TAG, "load cost: ${SystemClock.elapsedRealtime() - start}, modules: $modules") + } + } + } + + private fun sanitizeVersionString(version: String): String { + return version.replace(Regex("[^a-zA-Z0-9.\\-_]"), "_") + } + + fun checkUpdate(m: ModuleInfo): Triple { + val empty = Triple("", "", "") + if (m.updateJson.isEmpty() || m.remove || m.update || !m.enabled) { + return empty + } + // download updateJson + val result = kotlin.runCatching { + val url = m.updateJson + Log.i(TAG, "checkUpdate url: $url") + val response = ksuApp.okhttpClient.newCall( + okhttp3.Request.Builder().url(url).build() + ).execute() + Log.d(TAG, "checkUpdate code: ${response.code}") + if (response.isSuccessful) { + response.body?.string() ?: "" + } else { + "" + } + }.getOrDefault("") + Log.i(TAG, "checkUpdate result: $result") + + if (result.isEmpty()) { + return empty + } + + val updateJson = kotlin.runCatching { + JSONObject(result) + }.getOrNull() ?: return empty + + var version = updateJson.optString("version", "") + version = sanitizeVersionString(version) + val versionCode = updateJson.optInt("versionCode", 0) + val zipUrl = updateJson.optString("zipUrl", "") + val changelog = updateJson.optString("changelog", "") + if (versionCode <= m.versionCode || zipUrl.isEmpty()) { + return empty + } + + return Triple(zipUrl, version, changelog) + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/SuperUserViewModel.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/SuperUserViewModel.kt new file mode 100644 index 000000000000..4584857871cd --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/SuperUserViewModel.kt @@ -0,0 +1,191 @@ +package com.rifsxd.ksunext.ui.viewmodel + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection +import android.content.pm.ApplicationInfo +import android.content.pm.PackageInfo +import android.os.IBinder +import android.os.Parcelable +import android.os.SystemClock +import android.util.Log +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.core.content.edit +import android.graphics.drawable.Drawable +import androidx.lifecycle.ViewModel +import com.rifsxd.ksunext.IKsuInterface +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.ui.KsuService +import com.rifsxd.ksunext.ui.util.HanziToPinyin +import com.topjohnwu.superuser.ipc.RootService +import com.topjohnwu.superuser.Shell +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import java.text.Collator +import java.util.* +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +class SuperUserViewModel : ViewModel() { + + companion object { + private const val TAG = "SuperUserViewModel" + var apps by mutableStateOf>(emptyList()) + + @JvmStatic + fun getAppIconDrawable(context: Context, packageName: String): Drawable? { + val appDetail = apps.find { it.packageName == packageName } + return appDetail?.packageInfo?.applicationInfo?.loadIcon(context.packageManager) + } + private var profileOverrides by mutableStateOf>(emptyMap()) + } + + @Parcelize + data class AppInfo( + val label: String, + val packageInfo: PackageInfo, + val profile: Natives.Profile?, + ) : Parcelable { + val packageName: String + get() = packageInfo.packageName + val uid: Int + get() = packageInfo.applicationInfo!!.uid + + val allowSu: Boolean + get() = profile != null && profile.allowSu + val hasCustomProfile: Boolean + get() { + if (profile == null) { + return false + } + + return if (profile.allowSu) { + !profile.rootUseDefault + } else { + !profile.nonRootUseDefault + } + } + } + + private val prefs = ksuApp.getSharedPreferences("settings", Context.MODE_PRIVATE)!! + + var search by mutableStateOf("") + var showSystemApps by mutableStateOf(prefs.getBoolean("show_system_apps", false)) + private set + var isRefreshing by mutableStateOf(false) + private set + + fun updateShowSystemApps(newValue: Boolean) { + showSystemApps = newValue + prefs.edit { putBoolean("show_system_apps", newValue) } + } + + private val sortedList by derivedStateOf { + val comparator = compareBy { + when { + it.profile != null && it.profile.allowSu -> 0 + it.profile != null && ( + if (it.profile.allowSu) !it.profile.rootUseDefault else !it.profile.nonRootUseDefault + ) -> 1 + else -> 2 + } + }.then(compareBy(Collator.getInstance(Locale.getDefault()), AppInfo::label)) + apps.sortedWith(comparator).also { + isRefreshing = false + } + } + + val appList by derivedStateOf { + sortedList.map { app -> + profileOverrides[app.packageName]?.let { app.copy(profile = it) } ?: app + }.filter { + it.label.contains(search, true) || it.packageName.contains( + search, + true + ) || HanziToPinyin.getInstance() + .toPinyinString(it.label).contains(search, true) + }.filter { + it.uid == 2000 // Always show shell + || showSystemApps || it.packageInfo.applicationInfo!!.flags.and(ApplicationInfo.FLAG_SYSTEM) == 0 + } + } + + fun updateAppProfile(packageName: String, newProfile: Natives.Profile) { + profileOverrides = profileOverrides.toMutableMap().apply { + put(packageName, newProfile) + } + } + + private suspend inline fun connectKsuService( + crossinline onDisconnect: () -> Unit = {} + ): Pair = suspendCoroutine { + val connection = object : ServiceConnection { + override fun onServiceDisconnected(name: ComponentName?) { + onDisconnect() + } + + override fun onServiceConnected(name: ComponentName?, binder: IBinder?) { + it.resume(binder as IBinder to this) + } + } + + val intent = Intent(ksuApp, KsuService::class.java) + + val task = RootService.bindOrTask( + intent, + Shell.EXECUTOR, + connection, + ) + task?.let { it1 -> Shell.getShell().execTask(it1) } + } + + private fun stopKsuService() { + val intent = Intent(ksuApp, KsuService::class.java) + RootService.stop(intent) + } + + suspend fun fetchAppList() { + Mutex().withLock { + + isRefreshing = true + + val result = connectKsuService { + Log.w(TAG, "KsuService disconnected") + } + + withContext(Dispatchers.IO) { + val pm = ksuApp.packageManager + val start = SystemClock.elapsedRealtime() + + val binder = result.first + val allPackages = IKsuInterface.Stub.asInterface(binder).getPackages(0) + + withContext(Dispatchers.Main) { + stopKsuService() + } + + val packages = allPackages.list + + apps = packages.map { + val appInfo = it.applicationInfo + val uid = appInfo!!.uid + val profile = Natives.getAppProfile(it.packageName, uid) + AppInfo( + label = appInfo.loadLabel(pm).toString(), + packageInfo = it, + profile = profile, + ) + } + Log.i(TAG, "load cost: ${SystemClock.elapsedRealtime() - start}") + } + } + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/TemplateViewModel.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/TemplateViewModel.kt new file mode 100644 index 000000000000..99742145f4d9 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/viewmodel/TemplateViewModel.kt @@ -0,0 +1,321 @@ +package com.rifsxd.ksunext.ui.viewmodel + +import android.os.Parcelable +import android.util.Log +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import com.rifsxd.ksunext.Natives +import com.rifsxd.ksunext.ksuApp +import com.rifsxd.ksunext.profile.Capabilities +import com.rifsxd.ksunext.profile.Groups +import com.rifsxd.ksunext.ui.util.getAppProfileTemplate +import com.rifsxd.ksunext.ui.util.listAppProfileTemplates +import com.rifsxd.ksunext.ui.util.setAppProfileTemplate +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.parcelize.Parcelize +import okhttp3.Request +import org.json.JSONArray +import org.json.JSONObject +import java.text.Collator +import java.util.* + + +/** + * @author weishu + * @date 2023/10/20. + */ +const val TEMPLATE_INDEX_URL = "https://kernelsu.org/templates/index.json" +const val TEMPLATE_URL = "https://kernelsu.org/templates/%s" + +const val TAG = "TemplateViewModel" + +class TemplateViewModel : ViewModel() { + companion object { + + private var templates by mutableStateOf>(emptyList()) + } + + @Parcelize + data class TemplateInfo( + val id: String = "", + val name: String = "", + val description: String = "", + val author: String = "", + val local: Boolean = true, + + val namespace: Int = Natives.Profile.Namespace.INHERITED.ordinal, + val uid: Int = Natives.ROOT_UID, + val gid: Int = Natives.ROOT_GID, + val groups: List = mutableListOf(), + val capabilities: List = mutableListOf(), + val context: String = Natives.KERNEL_SU_DOMAIN, + val rules: List = mutableListOf(), + ) : Parcelable + + var isRefreshing by mutableStateOf(false) + private set + + val templateList by derivedStateOf { + val comparator = compareBy(TemplateInfo::local).reversed().then( + compareBy( + Collator.getInstance(Locale.getDefault()), TemplateInfo::id + ) + ) + templates.sortedWith(comparator).apply { + isRefreshing = false + } + } + + suspend fun fetchTemplates(sync: Boolean = false) { + isRefreshing = true + withContext(Dispatchers.IO) { + val localTemplateIds = listAppProfileTemplates() + Log.i(TAG, "localTemplateIds: $localTemplateIds") + if (localTemplateIds.isEmpty() || sync) { + // if no templates, fetch remote templates + fetchRemoteTemplates() + } + + // fetch templates again + templates = listAppProfileTemplates().mapNotNull(::getTemplateInfoById) + + isRefreshing = false + } + } + + suspend fun importTemplates( + templates: String, + onSuccess: suspend () -> Unit, + onFailure: suspend (String) -> Unit + ) { + withContext(Dispatchers.IO) { + runCatching { + JSONArray(templates) + }.getOrElse { + runCatching { + val json = JSONObject(templates) + JSONArray().apply { put(json) } + }.getOrElse { + onFailure("invalid templates: $templates") + return@withContext + } + }.let { + 0.until(it.length()).forEach { i -> + runCatching { + val template = it.getJSONObject(i) + val id = template.getString("id") + template.put("local", true) + setAppProfileTemplate(id, template.toString()) + }.onFailure { e -> + Log.e(TAG, "ignore invalid template: $it", e) + } + } + onSuccess() + } + } + } + + suspend fun exportTemplates(onTemplateEmpty: () -> Unit, callback: (String) -> Unit) { + withContext(Dispatchers.IO) { + val templates = listAppProfileTemplates().mapNotNull(::getTemplateInfoById).filter { + it.local + } + templates.ifEmpty { + onTemplateEmpty() + return@withContext + } + JSONArray(templates.map { + it.toJSON() + }).toString().let(callback) + } + } +} + +private fun fetchRemoteTemplates() { + runCatching { + ksuApp.okhttpClient.newCall( + Request.Builder().url(TEMPLATE_INDEX_URL).build() + ).execute().use { response -> + if (!response.isSuccessful) { + return + } + val remoteTemplateIds = JSONArray(response.body!!.string()) + Log.i(TAG, "fetchRemoteTemplates: $remoteTemplateIds") + 0.until(remoteTemplateIds.length()).forEach { i -> + val id = remoteTemplateIds.getString(i) + Log.i(TAG, "fetch template: $id") + val templateJson = ksuApp.okhttpClient.newCall( + Request.Builder().url(TEMPLATE_URL.format(id)).build() + ).runCatching { + execute().use { response -> + if (!response.isSuccessful) { + return@forEach + } + response.body!!.string() + } + }.getOrNull() ?: return@forEach + Log.i(TAG, "template: $templateJson") + + // validate remote template + runCatching { + val json = JSONObject(templateJson) + fromJSON(json)?.let { + // force local template + json.put("local", false) + setAppProfileTemplate(id, json.toString()) + } + }.onFailure { + Log.e(TAG, "ignore invalid template: $it", it) + return@forEach + } + } + } + }.onFailure { Log.e(TAG, "fetchRemoteTemplates: $it", it) } +} + +@Suppress("UNCHECKED_CAST") +private fun JSONArray.mapCatching( + transform: (T) -> R, onFail: (Throwable) -> Unit +): List { + return List(length()) { i -> get(i) as T }.mapNotNull { element -> + runCatching { + transform(element) + }.onFailure(onFail).getOrNull() + } +} + +private inline fun > getEnumOrdinals( + jsonArray: JSONArray?, enumClass: Class +): List { + return jsonArray?.mapCatching({ name -> + enumValueOf(name.uppercase()) + }, { + Log.e(TAG, "ignore invalid enum ${enumClass.simpleName}: $it", it) + }).orEmpty() +} + +fun getTemplateInfoById(id: String): TemplateViewModel.TemplateInfo? { + return runCatching { + fromJSON(JSONObject(getAppProfileTemplate(id))) + }.onFailure { + Log.e(TAG, "ignore invalid template: $it", it) + }.getOrNull() +} + +private fun getLocaleString(json: JSONObject, key: String): String { + val fallback = json.getString(key) + val locale = Locale.getDefault() + val localeKey = "${locale.language}_${locale.country}" + json.optJSONObject("locales")?.let { + // check locale first + it.optJSONObject(localeKey)?.let { json-> + return json.optString(key, fallback) + } + // fallback to language + it.optJSONObject(locale.language)?.let { json-> + return json.optString(key, fallback) + } + } + return fallback +} + +private fun fromJSON(templateJson: JSONObject): TemplateViewModel.TemplateInfo? { + return runCatching { + val groupsJsonArray = templateJson.optJSONArray("groups") + val capabilitiesJsonArray = templateJson.optJSONArray("capabilities") + val context = templateJson.optString("context").takeIf { it.isNotEmpty() } + ?: Natives.KERNEL_SU_DOMAIN + val namespace = templateJson.optString("namespace").takeIf { it.isNotEmpty() } + ?: Natives.Profile.Namespace.INHERITED.name + + val rulesJsonArray = templateJson.optJSONArray("rules") + val templateInfo = TemplateViewModel.TemplateInfo( + id = templateJson.getString("id"), + name = getLocaleString(templateJson, "name"), + description = getLocaleString(templateJson, "description"), + author = templateJson.optString("author"), + local = templateJson.optBoolean("local"), + namespace = Natives.Profile.Namespace.valueOf( + namespace.uppercase() + ).ordinal, + uid = templateJson.optInt("uid", Natives.ROOT_UID), + gid = templateJson.optInt("gid", Natives.ROOT_GID), + groups = getEnumOrdinals(groupsJsonArray, Groups::class.java).map { it.gid }, + capabilities = getEnumOrdinals( + capabilitiesJsonArray, Capabilities::class.java + ).map { it.cap }, + context = context, + rules = rulesJsonArray?.mapCatching({ it }, { + Log.e(TAG, "ignore invalid rule: $it", it) + }).orEmpty() + ) + templateInfo + }.onFailure { + Log.e(TAG, "ignore invalid template: $it", it) + }.getOrNull() +} + +fun TemplateViewModel.TemplateInfo.toJSON(): JSONObject { + val template = this + return JSONObject().apply { + + put("id", template.id) + put("name", template.name.ifBlank { template.id }) + put("description", template.description.ifBlank { template.id }) + if (template.author.isNotEmpty()) { + put("author", template.author) + } + put("namespace", Natives.Profile.Namespace.entries[template.namespace].name) + put("uid", template.uid) + put("gid", template.gid) + + if (template.groups.isNotEmpty()) { + put("groups", JSONArray( + Groups.entries.filter { + template.groups.contains(it.gid) + }.map { + it.name + } + )) + } + + if (template.capabilities.isNotEmpty()) { + put("capabilities", JSONArray( + Capabilities.entries.filter { + template.capabilities.contains(it.cap) + }.map { + it.name + } + )) + } + + if (template.context.isNotEmpty()) { + put("context", template.context) + } + + if (template.rules.isNotEmpty()) { + put("rules", JSONArray(template.rules)) + } + } +} + +@Suppress("unused") +fun generateTemplates() { + val templateJson = JSONObject() + templateJson.put("id", "com.example") + templateJson.put("name", "Example") + templateJson.put("description", "This is an example template") + templateJson.put("local", true) + templateJson.put("namespace", Natives.Profile.Namespace.INHERITED.name) + templateJson.put("uid", 0) + templateJson.put("gid", 0) + + templateJson.put("groups", JSONArray().apply { put(Groups.INET.name) }) + templateJson.put("capabilities", JSONArray().apply { put(Capabilities.CAP_NET_RAW.name) }) + templateJson.put("context", "u:r:ksu:s0") + Log.i(TAG, "$templateJson") +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/AppIconUtil.java b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/AppIconUtil.java new file mode 100644 index 000000000000..5688e85f0e0c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/AppIconUtil.java @@ -0,0 +1,43 @@ +package com.rifsxd.ksunext.ui.webui; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.LruCache; +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel; + +public class AppIconUtil { + // Limit cache size to 200 icons + private static final int CACHE_SIZE = 200; + private static final LruCache iconCache = new LruCache<>(CACHE_SIZE); + + public static synchronized Bitmap loadAppIconSync(Context context, String packageName, int sizePx) { + Bitmap cached = iconCache.get(packageName); + if (cached != null) return cached; + + try { + Drawable drawable = SuperUserViewModel.getAppIconDrawable(context, packageName); + Bitmap raw = drawableToBitmap(drawable, sizePx); + Bitmap icon = Bitmap.createScaledBitmap(raw, sizePx, sizePx, true); + iconCache.put(packageName, icon); + return icon; + } catch (Exception e) { + return null; + } + } + + private static Bitmap drawableToBitmap(Drawable drawable, int size) { + if (drawable instanceof BitmapDrawable) return ((BitmapDrawable) drawable).getBitmap(); + + int width = drawable.getIntrinsicWidth() > 0 ? drawable.getIntrinsicWidth() : size; + int height = drawable.getIntrinsicHeight() > 0 ? drawable.getIntrinsicHeight() : size; + + Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bmp); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bmp; + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/Inset.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/Inset.kt new file mode 100644 index 000000000000..6bb98da4f330 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/Inset.kt @@ -0,0 +1,26 @@ +package com.rifsxd.ksunext.ui.webui + +data class Insets( + val top: Int, + val bottom: Int, + val left: Int, + val right: Int, +) { + val css + get() = buildString { + appendLine(":root {") + appendLine("\t--safe-area-inset-top: ${top}px;") + appendLine("\t--safe-area-inset-right: ${right}px;") + appendLine("\t--safe-area-inset-bottom: ${bottom}px;") + appendLine("\t--safe-area-inset-left: ${left}px;") + appendLine("\t--window-inset-top: var(--safe-area-inset-top, 0px);") + appendLine("\t--window-inset-bottom: var(--safe-area-inset-bottom, 0px);") + appendLine("\t--window-inset-left: var(--safe-area-inset-left, 0px);") + appendLine("\t--window-inset-right: var(--safe-area-inset-right, 0px);") + appendLine("\t--f7-safe-area-top: var(--window-inset-top, 0px) !important;") + appendLine("\t--f7-safe-area-bottom: var(--window-inset-bottom, 0px) !important;") + appendLine("\t--f7-safe-area-left: var(--window-inset-left, 0px) !important;") + appendLine("\t--f7-safe-area-right: var(--window-inset-right, 0px) !important;") + append("}") + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MimeUtil.java b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MimeUtil.java new file mode 100644 index 000000000000..e02ac462c470 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MimeUtil.java @@ -0,0 +1,88 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rifsxd.ksunext.ui.webui; + +import java.net.URLConnection; + +class MimeUtil { + + public static String getMimeFromFileName(String fileName) { + if (fileName == null) { + return null; + } + + // Copying the logic and mapping that Chromium follows. + // First we check against the OS (this is a limited list by default) + // but app developers can extend this. + // We then check against a list of hardcoded mime types above if the + // OS didn't provide a result. + String mimeType = URLConnection.guessContentTypeFromName(fileName); + + if (mimeType != null) { + return mimeType; + } + + return guessHardcodedMime(fileName); + } + + // We should keep this map in sync with the lists under + // //net/base/mime_util.cc in Chromium. + // A bunch of the mime types don't really apply to Android land + // like word docs so feel free to filter out where necessary. + private static String guessHardcodedMime(String fileName) { + int finalFullStop = fileName.lastIndexOf('.'); + if (finalFullStop == -1) { + return null; + } + + final String extension = fileName.substring(finalFullStop + 1).toLowerCase(); + + return switch (extension) { + case "webm" -> "video/webm"; + case "mpeg", "mpg" -> "video/mpeg"; + case "mp3" -> "audio/mpeg"; + case "wasm" -> "application/wasm"; + case "xhtml", "xht", "xhtm" -> "application/xhtml+xml"; + case "flac" -> "audio/flac"; + case "ogg", "oga", "opus" -> "audio/ogg"; + case "wav" -> "audio/wav"; + case "m4a" -> "audio/x-m4a"; + case "gif" -> "image/gif"; + case "jpeg", "jpg", "jfif", "pjpeg", "pjp" -> "image/jpeg"; + case "png" -> "image/png"; + case "apng" -> "image/apng"; + case "svg", "svgz" -> "image/svg+xml"; + case "webp" -> "image/webp"; + case "mht", "mhtml" -> "multipart/related"; + case "css" -> "text/css"; + case "html", "htm", "shtml", "shtm", "ehtml" -> "text/html"; + case "js", "mjs" -> "application/javascript"; + case "xml" -> "text/xml"; + case "mp4", "m4v" -> "video/mp4"; + case "ogv", "ogm" -> "video/ogg"; + case "ico" -> "image/x-icon"; + case "woff" -> "application/font-woff"; + case "gz", "tgz" -> "application/gzip"; + case "json" -> "application/json"; + case "pdf" -> "application/pdf"; + case "zip" -> "application/zip"; + case "bmp" -> "image/bmp"; + case "tiff", "tif" -> "image/tiff"; + default -> null; + }; + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MonetColorsProvider.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MonetColorsProvider.kt new file mode 100644 index 000000000000..c4a5dc0ea758 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/MonetColorsProvider.kt @@ -0,0 +1,159 @@ +package com.rifsxd.ksunext.ui.webui + +import android.content.Context +import android.content.res.Configuration +import android.os.Build +import androidx.annotation.RequiresApi + +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.surfaceColorAtElevation +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.unit.dp + +import com.rifsxd.ksunext.ui.theme.AMOLED_BLACK + +/** + * @author rifsxd + * @date 2025/6/2. + */ +object MonetColorsProvider { + @RequiresApi(Build.VERSION_CODES.S) + fun getColorsCss(context: Context): String { + + val isDark = (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES + + val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + val amoledMode = prefs.getBoolean("enable_amoled", false) + + val colorScheme = if (isDark) { + dynamicDarkColorScheme(context) + } else { + dynamicLightColorScheme(context) + } + + fun blend(c1: Color, c2: Color, ratio: Float): Color { + val inv = 1f - ratio + return Color( + red = c1.red * inv + c2.red * ratio, + green = c1.green * inv + c2.green * ratio, + blue = c1.blue * inv + c2.blue * ratio, + alpha = c1.alpha + ) + } + + val monetColors = if (isDark && amoledMode) { + mapOf( + "primary" to colorScheme.primary.toArgb().toHex(), + "onPrimary" to colorScheme.onPrimary.toArgb().toHex(), + "primaryContainer" to colorScheme.primaryContainer.toArgb().toHex(), + "onPrimaryContainer" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "inversePrimary" to colorScheme.inversePrimary.toArgb().toHex(), + "secondary" to colorScheme.secondary.toArgb().toHex(), + "onSecondary" to colorScheme.onSecondary.toArgb().toHex(), + "secondaryContainer" to colorScheme.secondaryContainer.toArgb().toHex(), + "onSecondaryContainer" to colorScheme.onSecondaryContainer.toArgb().toHex(), + "tertiary" to colorScheme.tertiary.toArgb().toHex(), + "onTertiary" to colorScheme.onTertiary.toArgb().toHex(), + "tertiaryContainer" to colorScheme.tertiaryContainer.toArgb().toHex(), + "onTertiaryContainer" to colorScheme.onTertiaryContainer.toArgb().toHex(), + "background" to AMOLED_BLACK.toArgb().toHex(), + "onBackground" to colorScheme.onBackground.toArgb().toHex(), + "surface" to AMOLED_BLACK.toArgb().toHex(), + "tonalSurface" to blend(colorScheme.surfaceColorAtElevation(1.dp), AMOLED_BLACK, 0.8f).toArgb().toHex(), + "onSurface" to colorScheme.onSurface.toArgb().toHex(), + "surfaceVariant" to blend(colorScheme.surfaceVariant, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "onSurfaceVariant" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "surfaceTint" to colorScheme.surfaceTint.toArgb().toHex(), + "inverseSurface" to colorScheme.inverseSurface.toArgb().toHex(), + "inverseOnSurface" to colorScheme.inverseOnSurface.toArgb().toHex(), + "error" to colorScheme.error.toArgb().toHex(), + "onError" to colorScheme.onError.toArgb().toHex(), + "errorContainer" to colorScheme.errorContainer.toArgb().toHex(), + "onErrorContainer" to colorScheme.onErrorContainer.toArgb().toHex(), + "outline" to colorScheme.outline.toArgb().toHex(), + "outlineVariant" to colorScheme.outlineVariant.toArgb().toHex(), + "scrim" to colorScheme.scrim.toArgb().toHex(), + "surfaceBright" to blend(colorScheme.surfaceBright, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceDim" to blend(colorScheme.surfaceDim, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceContainer" to blend(colorScheme.surfaceContainer, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceContainerHigh" to blend(colorScheme.surfaceContainerHigh, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceContainerHighest" to blend(colorScheme.surfaceContainerHighest, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceContainerLow" to blend(colorScheme.surfaceContainerLow, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "surfaceContainerLowest" to blend(colorScheme.surfaceContainerLowest, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "filledTonalButtonContentColor" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "filledTonalButtonContainerColor" to blend(colorScheme.secondaryContainer, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "filledTonalButtonDisabledContentColor" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "filledTonalButtonDisabledContainerColor" to blend(colorScheme.surfaceVariant, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "filledCardContentColor" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "filledCardContainerColor" to blend(colorScheme.primaryContainer, AMOLED_BLACK, 0.8f).toArgb().toHex(), + "filledCardDisabledContentColor" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "filledCardDisabledContainerColor" to blend(colorScheme.surfaceVariant, AMOLED_BLACK, 0.8f).toArgb().toHex() + ) + } else { + mapOf( + "primary" to colorScheme.primary.toArgb().toHex(), + "onPrimary" to colorScheme.onPrimary.toArgb().toHex(), + "primaryContainer" to colorScheme.primaryContainer.toArgb().toHex(), + "onPrimaryContainer" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "inversePrimary" to colorScheme.inversePrimary.toArgb().toHex(), + "secondary" to colorScheme.secondary.toArgb().toHex(), + "onSecondary" to colorScheme.onSecondary.toArgb().toHex(), + "secondaryContainer" to colorScheme.secondaryContainer.toArgb().toHex(), + "onSecondaryContainer" to colorScheme.onSecondaryContainer.toArgb().toHex(), + "tertiary" to colorScheme.tertiary.toArgb().toHex(), + "onTertiary" to colorScheme.onTertiary.toArgb().toHex(), + "tertiaryContainer" to colorScheme.tertiaryContainer.toArgb().toHex(), + "onTertiaryContainer" to colorScheme.onTertiaryContainer.toArgb().toHex(), + "background" to colorScheme.background.toArgb().toHex(), + "onBackground" to colorScheme.onBackground.toArgb().toHex(), + "surface" to colorScheme.surface.toArgb().toHex(), + "tonalSurface" to colorScheme.surfaceColorAtElevation(1.dp).toArgb().toHex(), + "onSurface" to colorScheme.onSurface.toArgb().toHex(), + "surfaceVariant" to colorScheme.surfaceVariant.toArgb().toHex(), + "onSurfaceVariant" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "surfaceTint" to colorScheme.surfaceTint.toArgb().toHex(), + "inverseSurface" to colorScheme.inverseSurface.toArgb().toHex(), + "inverseOnSurface" to colorScheme.inverseOnSurface.toArgb().toHex(), + "error" to colorScheme.error.toArgb().toHex(), + "onError" to colorScheme.onError.toArgb().toHex(), + "errorContainer" to colorScheme.errorContainer.toArgb().toHex(), + "onErrorContainer" to colorScheme.onErrorContainer.toArgb().toHex(), + "outline" to colorScheme.outline.toArgb().toHex(), + "outlineVariant" to colorScheme.outlineVariant.toArgb().toHex(), + "scrim" to colorScheme.scrim.toArgb().toHex(), + "surfaceBright" to colorScheme.surfaceBright.toArgb().toHex(), + "surfaceDim" to colorScheme.surfaceDim.toArgb().toHex(), + "surfaceContainer" to colorScheme.surfaceContainer.toArgb().toHex(), + "surfaceContainerHigh" to colorScheme.surfaceContainerHigh.toArgb().toHex(), + "surfaceContainerHighest" to colorScheme.surfaceContainerHighest.toArgb().toHex(), + "surfaceContainerLow" to colorScheme.surfaceContainerLow.toArgb().toHex(), + "surfaceContainerLowest" to colorScheme.surfaceContainerLowest.toArgb().toHex(), + "filledTonalButtonContentColor" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "filledTonalButtonContainerColor" to colorScheme.secondaryContainer.toArgb().toHex(), + "filledTonalButtonDisabledContentColor" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "filledTonalButtonDisabledContainerColor" to colorScheme.surfaceVariant.toArgb().toHex(), + "filledCardContentColor" to colorScheme.onPrimaryContainer.toArgb().toHex(), + "filledCardContainerColor" to colorScheme.primaryContainer.toArgb().toHex(), + "filledCardDisabledContentColor" to colorScheme.onSurfaceVariant.toArgb().toHex(), + "filledCardDisabledContainerColor" to colorScheme.surfaceVariant.toArgb().toHex() + ) + } + return monetColors.toCssVars() + } + + private fun Map.toCssVars(): String { + return buildString { + append(":root {\n") + for ((k, v) in this@toCssVars) { + append(" --$k: $v;\n") + } + append("}\n") + } + } + + private fun Int.toHex(): String { + return String.format("#%06X", 0xFFFFFF and this) + } +} \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/SuFilePathHandler.java b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/SuFilePathHandler.java new file mode 100644 index 000000000000..7f287d195438 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/SuFilePathHandler.java @@ -0,0 +1,232 @@ +package com.rifsxd.ksunext.ui.webui; + +import android.content.Context; +import android.os.Build; +import android.util.Log; +import android.webkit.WebResourceResponse; +import androidx.annotation.NonNull; +import androidx.annotation.WorkerThread; +import androidx.webkit.WebViewAssetLoader; +import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.io.SuFile; +import com.topjohnwu.superuser.io.SuFileInputStream; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPInputStream; + +/** + * Handler class to open files from file system by root access + * For more information about android storage please refer to + * Android Developers + * Docs: Data and file storage overview. + *

    + * To avoid leaking user or app data to the web, make sure to choose {@code directory} + * carefully, and assume any file under this directory could be accessed by any web page subject + * to same-origin rules. + *

    + * A typical usage would be like: + *

    + * File publicDir = new File(context.getFilesDir(), "public");
    + * // Host "files/public/" in app's data directory under:
    + * // http://appassets.androidplatform.net/public/...
    + * WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
    + *          .addPathHandler("/public/", new InternalStoragePathHandler(context, publicDir))
    + *          .build();
    + * 
    + */ +public final class SuFilePathHandler implements WebViewAssetLoader.PathHandler { + private static final String TAG = "SuFilePathHandler"; + + /** + * Default value to be used as MIME type if guessing MIME type failed. + */ + public static final String DEFAULT_MIME_TYPE = "text/plain"; + + /** + * Forbidden subdirectories of {@link Context#getDataDir} that cannot be exposed by this + * handler. They are forbidden as they often contain sensitive information. + *

    + * Note: Any future addition to this list will be considered breaking changes to the API. + */ + private static final String[] FORBIDDEN_DATA_DIRS = + new String[] {"/data/data", "/data/system"}; + + @NonNull + private final File mDirectory; + + private final Shell mShell; + private final Context mContext; + private final InsetsSupplier mInsetsSupplier; + private final OnInsetsRequestedListener mOnInsetsRequestedListener; + + public interface InsetsSupplier { + @NonNull + Insets get(); + } + + public interface OnInsetsRequestedListener { + void onInsetsRequested(boolean enable); + } + + /** + * Creates PathHandler for app's internal storage. + * The directory to be exposed must be inside either the application's internal data + * directory {@link Context#getDataDir} or cache directory {@link Context#getCacheDir}. + * External storage is not supported for security reasons, as other apps with + * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} may be able to modify the + * files. + *

    + * Exposing the entire data or cache directory is not permitted, to avoid accidentally + * exposing sensitive application files to the web. Certain existing subdirectories of + * {@link Context#getDataDir} are also not permitted as they are often sensitive. + * These files are ({@code "app_webview/"}, {@code "databases/"}, {@code "lib/"}, + * {@code "shared_prefs/"} and {@code "code_cache/"}). + *

    + * The application should typically use a dedicated subdirectory for the files it intends to + * expose and keep them separate from other files. + * + * @param context {@link Context} that is used to access app's internal storage. + * @param directory the absolute path of the exposed app internal storage directory from + * which files can be loaded. + * @param rootShell {@link Shell} instance with root access to read files. + * @param insetsSupplier {@link InsetsSupplier} to provide window insets for styling web content. + * @param onInsetsRequestedListener {@link OnInsetsRequestedListener} to notify when insets are requested. + * @throws IllegalArgumentException if the directory is not allowed. + */ + + public SuFilePathHandler(@NonNull Context context, @NonNull File directory, Shell rootShell, @NonNull InsetsSupplier insetsSupplier, OnInsetsRequestedListener onInsetsRequestedListener) { + try { + mContext = context; + mInsetsSupplier = insetsSupplier; + mOnInsetsRequestedListener = onInsetsRequestedListener; + mDirectory = new File(getCanonicalDirPath(directory)); + if (!isAllowedInternalStorageDir(context)) { + throw new IllegalArgumentException("The given directory \"" + directory + + "\" doesn't exist under an allowed app internal storage directory"); + } + mShell = rootShell; + } catch (IOException e) { + throw new IllegalArgumentException( + "Failed to resolve the canonical path for the given directory: " + + directory.getPath(), e); + } + } + + private boolean isAllowedInternalStorageDir(@NonNull Context context) throws IOException { + String dir = getCanonicalDirPath(mDirectory); + + for (String forbiddenPath : FORBIDDEN_DATA_DIRS) { + if (dir.startsWith(forbiddenPath)) { + return false; + } + } + return true; + } + + /** + * Opens the requested file from the exposed data directory. + *

    + * The matched prefix path used shouldn't be a prefix of a real web path. Thus, if the + * requested file cannot be found or is outside the mounted directory a + * {@link WebResourceResponse} object with a {@code null} {@link InputStream} will be + * returned instead of {@code null}. This saves the time of falling back to network and + * trying to resolve a path that doesn't exist. A {@link WebResourceResponse} with + * {@code null} {@link InputStream} will be received as an HTTP response with status code + * {@code 404} and no body. + *

    + * The MIME type for the file will be determined from the file's extension using + * {@link java.net.URLConnection#guessContentTypeFromName}. Developers should ensure that + * files are named using standard file extensions. If the file does not have a + * recognised extension, {@code "text/plain"} will be used by default. + * + * @param path the suffix path to be handled. + * @return {@link WebResourceResponse} for the requested file. + */ + @Override + @WorkerThread + @NonNull + public WebResourceResponse handle(@NonNull String path) { + if ("internal/insets.css".equals(path)) { + if (mOnInsetsRequestedListener != null) { + mOnInsetsRequestedListener.onInsetsRequested(true); + } + String css = mInsetsSupplier.get().getCss(); + return new WebResourceResponse( + "text/css", + "utf-8", + new ByteArrayInputStream(css.getBytes(StandardCharsets.UTF_8)) + ); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + if ("internal/colors.css".equals(path)) { + String css = MonetColorsProvider.INSTANCE.getColorsCss(mContext); + return new WebResourceResponse( + "text/css", + "utf-8", + new ByteArrayInputStream(css.getBytes(StandardCharsets.UTF_8)) + ); + } + } + try { + File file = getCanonicalFileIfChild(mDirectory, path); + if (file != null) { + InputStream is = openFile(file, mShell); + String mimeType = guessMimeType(path); + return new WebResourceResponse(mimeType, null, is); + } else { + Log.e(TAG, String.format( + "The requested file: %s is outside the mounted directory: %s", path, + mDirectory)); + } + } catch (IOException e) { + Log.e(TAG, "Error opening the requested path: " + path, e); + } + return new WebResourceResponse(null, null, null); + } + + public static String getCanonicalDirPath(@NonNull File file) throws IOException { + String canonicalPath = file.getCanonicalPath(); + if (!canonicalPath.endsWith("/")) canonicalPath += "/"; + return canonicalPath; + } + + public static File getCanonicalFileIfChild(@NonNull File parent, @NonNull String child) + throws IOException { + String parentCanonicalPath = getCanonicalDirPath(parent); + String childCanonicalPath = new File(parent, child).getCanonicalPath(); + if (childCanonicalPath.startsWith(parentCanonicalPath)) { + return new File(childCanonicalPath); + } + return null; + } + + @NonNull + private static InputStream handleSvgzStream(@NonNull String path, + @NonNull InputStream stream) throws IOException { + return path.endsWith(".svgz") ? new GZIPInputStream(stream) : stream; + } + + public static InputStream openFile(@NonNull File file, @NonNull Shell shell) throws IOException { + SuFile suFile = new SuFile(file.getAbsolutePath()); + suFile.setShell(shell); + InputStream fis = SuFileInputStream.open(suFile); + return handleSvgzStream(file.getPath(), fis); + } + + /** + * Use {@link MimeUtil#getMimeFromFileName} to guess MIME type or return the + * {@link #DEFAULT_MIME_TYPE} if it can't guess. + * + * @param filePath path of the file to guess its MIME type. + * @return MIME type guessed from file extension or {@link #DEFAULT_MIME_TYPE}. + */ + @NonNull + public static String guessMimeType(@NonNull String filePath) { + String mimeType = MimeUtil.getMimeFromFileName(filePath); + return mimeType == null ? DEFAULT_MIME_TYPE : mimeType; + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt new file mode 100644 index 000000000000..0252dc84ccb3 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebUIActivity.kt @@ -0,0 +1,426 @@ +package com.rifsxd.ksunext.ui.webui + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.ActivityManager +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Color +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.util.Base64 +import android.webkit.* +import android.widget.FrameLayout +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.enableEdgeToEdge +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.viewModels +import androidx.annotation.RequiresApi +import androidx.core.net.toUri +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.lifecycleScope +import androidx.webkit.WebViewAssetLoader +import com.rifsxd.ksunext.ui.util.createRootShell +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel +import kotlinx.coroutines.CancellableContinuation +import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine +import org.json.JSONObject +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.File +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +@SuppressLint("SetJavaScriptEnabled") +class WebUIActivity : ComponentActivity() { + + private lateinit var webviewInterface: WebViewInterface + private val rootShell by lazy { createRootShell(true) } + private var webView: WebView? = null + private lateinit var container: FrameLayout + private lateinit var insets: Insets + private lateinit var moduleId: String + + private lateinit var fileChooserLauncher: ActivityResultLauncher + private var filePathCallback: ValueCallback>? = null + + private lateinit var saveFileLauncher: ActivityResultLauncher + private var pendingDownloadData: ByteArray? = null + private var pendingDownloadSuggestedFilename: String? = null + + private val superUserViewModel: SuperUserViewModel by viewModels() + + private var insetsContinuation: CancellableContinuation? = null + private var isInsetsEnabled = false + + fun erudaConsole(context: android.content.Context): String { + return context.assets.open("eruda.min.js").bufferedReader().use { it.readText() } + } + + @RequiresApi(Build.VERSION_CODES.Q) + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.isNavigationBarContrastEnforced = false + } + + super.onCreate(savedInstanceState) + + lifecycleScope.launch { + if (SuperUserViewModel.apps.isEmpty()) { + SuperUserViewModel().fetchAppList() + } + } + + fileChooserLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val data = result.data + var uris: Array? = null + + data?.dataString?.let { + uris = arrayOf(it.toUri()) + } + + data?.clipData?.let { clipData -> + uris = Array(clipData.itemCount) { i -> + clipData.getItemAt(i).uri + } + } + + filePathCallback?.onReceiveValue(uris) + } else { + filePathCallback?.onReceiveValue(null) + } + filePathCallback = null + } + + saveFileLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + result.data?.data?.let { uri -> + contentResolver.openOutputStream(uri)?.use { out -> + pendingDownloadData?.let { out.write(it) } + } + } + } + pendingDownloadData = null + pendingDownloadSuggestedFilename = null + } + + moduleId = intent.getStringExtra("id") ?: run { + finishAndRemoveTask() + return + } + + val name = intent.getStringExtra("name") ?: run { + finishAndRemoveTask() + return + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + @Suppress("DEPRECATION") + setTaskDescription(ActivityManager.TaskDescription("WebUI-Next | $name")) + } else { + setTaskDescription( + ActivityManager.TaskDescription.Builder() + .setLabel("WebUI-Next | $name") + .build() + ) + } + + val prefs = getSharedPreferences("settings", MODE_PRIVATE) + val developerOptionsEnabled = prefs.getBoolean("enable_developer_options", false) + val enableWebDebugging = prefs.getBoolean("enable_web_debugging", false) + + WebView.setWebContentsDebuggingEnabled(developerOptionsEnabled && enableWebDebugging) + + val moduleDir = "/data/adb/modules/$moduleId" + val webRoot = File("$moduleDir/webroot") + + insets = Insets(0, 0, 0, 0) + + val assetLoader = WebViewAssetLoader.Builder() + .setDomain("mui.kernelsu.org") + .addPathHandler( + "/", + SuFilePathHandler( + this, + webRoot, + rootShell, + { insets }, + { enable -> enableInsets(enable) } + ) + ) + .build() + + container = FrameLayout(this) + + webView = WebView(this).apply { + setBackgroundColor(Color.TRANSPARENT) + + val density = resources.displayMetrics.density + + ViewCompat.setOnApplyWindowInsetsListener(container) { view, windowInsets -> + val inset = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + insets = Insets( + top = (inset.top / density).toInt(), + bottom = (inset.bottom / density).toInt(), + left = (inset.left / density).toInt(), + right = (inset.right / density).toInt() + ) + + if (isInsetsEnabled) { + view.setPadding(0, 0, 0, 0) + } else { + view.setPadding(inset.left, inset.top, inset.right, inset.bottom) + } + + insetsContinuation?.resumeWith(Result.success(Unit)) + insetsContinuation = null + + WindowInsetsCompat.CONSUMED + } + + settings.javaScriptEnabled = true + settings.domStorageEnabled = true + settings.allowFileAccess = false + + addJavascriptInterface( + WebViewInterface(this@WebUIActivity, this, moduleDir), + "ksu" + ) + + webChromeClient = object : WebChromeClient() { + + override fun onShowFileChooser( + webView: WebView?, + filePathCallback: ValueCallback>?, + fileChooserParams: FileChooserParams? + ): Boolean { + this@WebUIActivity.filePathCallback = filePathCallback + + val intent = + fileChooserParams?.createIntent() + ?: Intent(Intent.ACTION_GET_CONTENT).apply { + type = "*/*" + } + + if (fileChooserParams?.mode == FileChooserParams.MODE_OPEN_MULTIPLE) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) + } + + return try { + fileChooserLauncher.launch(intent) + true + } catch (e: Exception) { + this@WebUIActivity.filePathCallback?.onReceiveValue(null) + this@WebUIActivity.filePathCallback = null + false + } + } + + @RequiresApi(Build.VERSION_CODES.Q) + override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { + consoleMessage?.message()?.let { msg -> + val prefix = "ksuBlobData:" + if (msg.startsWith(prefix)) { + try { + val json = JSONObject(msg.substring(prefix.length)) + saveDataUrlToDownloads( + json.getString("dataUrl"), + json.getString("mimeType") + ) + return true + } catch (_: Exception) { + } + } + } + return super.onConsoleMessage(consoleMessage) + } + } + + webViewClient = object : WebViewClient() { + + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + val url = request.url + + // Handle ksu://icon/ + if (url.scheme.equals("ksu", true) + && url.host.equals("icon", true) + ) { + val packageName = url.path?.removePrefix("/") + if (!packageName.isNullOrEmpty()) { + val icon = AppIconUtil.loadAppIconSync( + this@WebUIActivity, + packageName, + 512 + ) + + if (icon != null) { + val out = ByteArrayOutputStream() + icon.compress(Bitmap.CompressFormat.PNG, 100, out) + return WebResourceResponse( + "image/png", + null, + ByteArrayInputStream(out.toByteArray()) + ) + } + } + } + + // Fallback to asset loader + return assetLoader.shouldInterceptRequest(request.url) + } + + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { + return false + } + + override fun onPageFinished(view: WebView?, url: String?) { + if (developerOptionsEnabled && enableWebDebugging) { + view?.evaluateJavascript(erudaConsole(this@WebUIActivity), null) + view?.evaluateJavascript("eruda.init();", null) + } + } + } + + loadUrl("https://mui.kernelsu.org/index.html") + } + + setupWebUIBackHandler() + + container.addView(webView) + setContentView(container) + + // coroutine-safe inset wait + if (insets == Insets(0, 0, 0, 0)) { + lifecycleScope.launch { + suspendCancellableCoroutine { cont -> + insetsContinuation = cont + cont.invokeOnCancellation { + if (insetsContinuation === cont) { + insetsContinuation = null + } + } + } + } + } + } + private fun setupWebUIBackHandler() { + val backCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val currentWebView = webView + if (currentWebView != null && currentWebView.canGoBack()) { + currentWebView.goBack() + } else { + isEnabled = false + finish() + } + } + } + + onBackPressedDispatcher.addCallback(this, backCallback) + } + + private fun extractMimeTypeAndBase64Data(dataUrl: String): Pair? { + if (!dataUrl.startsWith("data:")) return null + val commaIndex = dataUrl.indexOf(',') + if (commaIndex == -1) return null + + val header = dataUrl.substring(5, commaIndex) + val data = dataUrl.substring(commaIndex + 1) + val mimeType = header.substringBefore(';').ifEmpty { + "application/octet-stream" + } + + return mimeType to data + } + + @RequiresApi(Build.VERSION_CODES.Q) + private fun saveDataUrlToDownloads( + dataUrl: String, + mimeTypeFromListener: String + ) { + val extracted = extractMimeTypeAndBase64Data(dataUrl) ?: run { + Toast.makeText(this, "Invalid data URL", Toast.LENGTH_SHORT).show() + return + } + + val (mimeFromData, base64Data) = extracted + + val finalMimeType = + if (mimeFromData == "application/octet-stream" && mimeTypeFromListener.isNotBlank()) + mimeTypeFromListener + else + mimeFromData + + var extension = + MimeTypeMap.getSingleton().getExtensionFromMimeType(finalMimeType) + + if (!extension.isNullOrEmpty() && !extension.startsWith(".")) { + extension = ".$extension" + } + + val sdf = SimpleDateFormat("yyyy-MM-dd_HHmmss", Locale.getDefault()) + val fileName = "${moduleId}_${sdf.format(Date())}${extension ?: ""}" + + try { + pendingDownloadData = Base64.decode(base64Data, Base64.DEFAULT) + pendingDownloadSuggestedFilename = fileName + + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = finalMimeType + putExtra(Intent.EXTRA_TITLE, fileName) + } + + saveFileLauncher.launch(intent) + + } catch (e: Exception) { + Toast.makeText( + this, + "Error preparing file: ${e.message}", + Toast.LENGTH_LONG + ).show() + pendingDownloadData = null + pendingDownloadSuggestedFilename = null + } + } + + fun enableInsets(enable: Boolean = true) { + runOnUiThread { + if (isInsetsEnabled != enable) { + isInsetsEnabled = enable + ViewCompat.requestApplyInsets(container) + } + } + } + + override fun onDestroy() { + webView?.apply { + stopLoading() + removeAllViews() + destroy() + } + webView = null + runCatching { + webviewInterface.destroy() + webView?.destroy() + rootShell?.close() + } + super.onDestroy() + } +} diff --git a/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebViewInterface.kt b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebViewInterface.kt new file mode 100644 index 000000000000..1fff812ff594 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/java/com/rifsxd/ksunext/ui/webui/WebViewInterface.kt @@ -0,0 +1,587 @@ +package com.rifsxd.ksunext.ui.webui + +import android.app.Activity +import android.content.Context +import android.content.pm.ApplicationInfo +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.text.TextUtils +import android.util.Base64 +import android.util.Log +import android.view.Window +import android.webkit.JavascriptInterface +import android.webkit.WebView +import android.widget.Toast +import androidx.core.content.pm.PackageInfoCompat +import androidx.core.graphics.createBitmap +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat +import com.rifsxd.ksunext.ui.util.createRootShell +import com.rifsxd.ksunext.ui.util.listModules +import com.rifsxd.ksunext.ui.util.withNewRootShell +import com.rifsxd.ksunext.ui.viewmodel.SuperUserViewModel +import com.topjohnwu.superuser.CallbackList +import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.internal.UiThreadHandler +import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileInputStream +import com.topjohnwu.superuser.io.SuFileOutputStream +import com.rifsxd.ksunext.ui.util.module.Shortcut +import org.json.JSONArray +import org.json.JSONObject +import java.io.BufferedOutputStream +import java.io.File +import java.util.UUID +import java.util.concurrent.CompletableFuture +import java.util.concurrent.ConcurrentHashMap + +const val TAG = "WebViewInterface" + +@Suppress("unused") +class WebViewInterface( + val context: Context, + private val webView: WebView, + private val modDir: String +) { + + @JavascriptInterface + fun exec(cmd: String): String { + return withNewRootShell(true) { ShellUtils.fastCmd(this, cmd) } + } + + @JavascriptInterface + fun exec(cmd: String, callbackFunc: String) { + exec(cmd, null, callbackFunc) + } + + private fun processOptions(sb: StringBuilder, options: String?) { + val opts = if (options == null) JSONObject() else { + JSONObject(options) + } + + val cwd = opts.optString("cwd") + if (!TextUtils.isEmpty(cwd)) { + sb.append("cd ${cwd};") + } + + opts.optJSONObject("env")?.let { env -> + env.keys().forEach { key -> + sb.append("export ${key}=${env.getString(key)};") + } + } + } + + @JavascriptInterface + fun exec( + cmd: String, + options: String?, + callbackFunc: String + ) { + val finalCommand = buildString { + processOptions(this, options) + append(cmd) + } + + val result = withNewRootShell(true) { + newJob().add(finalCommand).to(ArrayList(), ArrayList()).exec() + } + val stdout = result.out.joinToString(separator = "\n") + val stderr = result.err.joinToString(separator = "\n") + + val jsCode = + "(function() { try { ${callbackFunc}(${result.code}, ${ + JSONObject.quote( + stdout + ) + }, ${JSONObject.quote(stderr)}); } catch(e) { console.error(e); } })();" + webView.post { + webView.evaluateJavascript(jsCode, null) + } + } + + @JavascriptInterface + fun spawn(command: String, args: String, options: String?, callbackFunc: String) { + val finalCommand = buildString { + processOptions(this, options) + + if (!TextUtils.isEmpty(args)) { + append(command).append(" ") + JSONArray(args).let { argsArray -> + for (i in 0 until argsArray.length()) { + append(argsArray.getString(i)) + append(" ") + } + } + } else { + append(command) + } + } + + val shell = createRootShell(true) + + val emitData = fun(name: String, data: String) { + val jsCode = + "(function() { try { ${callbackFunc}.${name}.emit('data', ${ + JSONObject.quote( + data + ) + }); } catch(e) { console.error('emitData', e); } })();" + webView.post { + webView.evaluateJavascript(jsCode, null) + } + } + + val stdout = object : CallbackList(UiThreadHandler::runAndWait) { + override fun onAddElement(s: String) { + emitData("stdout", s) + } + } + + val stderr = object : CallbackList(UiThreadHandler::runAndWait) { + override fun onAddElement(s: String) { + emitData("stderr", s) + } + } + + val future = shell.newJob().add(finalCommand.toString()).to(stdout, stderr).enqueue() + val completableFuture = CompletableFuture.supplyAsync { + future.get() + } + + completableFuture.thenAccept { result -> + val emitExitCode = + "(function() { try { ${callbackFunc}.emit('exit', ${result.code}); } catch(e) { console.error(`emitExit error: \${e}`); } })();" + webView.post { + webView.evaluateJavascript(emitExitCode, null) + } + + if (result.code != 0) { + val emitErrCode = + "(function() { try { var err = new Error(); err.exitCode = ${result.code}; err.message = ${ + JSONObject.quote( + result.err.joinToString( + "\n" + ) + ) + };${callbackFunc}.emit('error', err); } catch(e) { console.error('emitErr', e); } })();" + webView.post { + webView.evaluateJavascript(emitErrCode, null) + } + } + }.whenComplete { _, _ -> + runCatching { shell.close() } + } + } + + @JavascriptInterface + fun toast(msg: String) { + webView.post { + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show() + } + } + + @JavascriptInterface + fun fullScreen(enable: Boolean) { + if (context is Activity) { + Handler(Looper.getMainLooper()).post { + if (enable) { + hideSystemUI(context.window) + } else { + showSystemUI(context.window) + } + } + } + } + + @JavascriptInterface + fun enableInsets(enable: Boolean = true) { + if (context is WebUIActivity) { + context.enableInsets(enable) + } + } + + @JavascriptInterface + fun moduleInfo(): String { + val moduleInfos = JSONArray(listModules()) + val currentModuleInfo = JSONObject() + currentModuleInfo.put("moduleDir", modDir) + val moduleId = File(modDir).getName() + for (i in 0 until moduleInfos.length()) { + val currentInfo = moduleInfos.getJSONObject(i) + + if (currentInfo.getString("id") != moduleId) { + continue + } + + val keys = currentInfo.keys() + for (key in keys) { + currentModuleInfo.put(key, currentInfo.get(key)) + } + break + } + return currentModuleInfo.toString() + } + + fun canGoBack(): Boolean { + return webView.canGoBack() + } + + fun goBack() { + webView.post { + webView.goBack() + } + } + + @JavascriptInterface + fun createShortcut(): Boolean { + return try { + val moduleId = File(modDir).name + + val infoJson = JSONObject(moduleInfo()) + val moduleName = infoJson.optString("name", moduleId) + val webuiIcon = infoJson.optString("webuiIcon").takeIf { it.isNotBlank() } + + fun resolveIcon(p: String?): String? { + if (p.isNullOrBlank()) return null + + try { + val candidate = "/data/adb/modules/$moduleId/$p" + val f = SuFile(candidate) + if (f.exists()) return "su://$candidate" + } catch (_: Exception) { + } + + if (p.startsWith("/")) { + try { + val f = SuFile(p) + if (f.exists()) return "su://$p" + } catch (_: Exception) { + } + return "file://$p" + } + + return p + } + + val resolved = resolveIcon(webuiIcon) + + Handler(Looper.getMainLooper()).post { + Shortcut.createModuleWebUiShortcut(context, moduleId, moduleName, resolved) + } + true + } catch (e: Exception) { + false + } + } + + @JavascriptInterface + fun listPackages(type: String): String { + val packageNames = SuperUserViewModel.apps + .filter { appInfo -> + val flags = appInfo.packageInfo.applicationInfo?.flags ?: 0 + when (type.lowercase()) { + "system" -> (flags and ApplicationInfo.FLAG_SYSTEM) != 0 + "user" -> (flags and ApplicationInfo.FLAG_SYSTEM) == 0 + else -> true + } + } + .map { it.packageName } + .sorted() + + val jsonArray = JSONArray() + for (pkgName in packageNames) { + jsonArray.put(pkgName) + } + return jsonArray.toString() + } + + @JavascriptInterface + fun getPackagesInfo(packageNamesJson: String): String { + val packageNames = JSONArray(packageNamesJson) + val jsonArray = JSONArray() + val appMap = SuperUserViewModel.apps.associateBy { it.packageName } + for (i in 0 until packageNames.length()) { + val pkgName = packageNames.getString(i) + val appInfo = appMap[pkgName] + if (appInfo != null) { + val pkg = appInfo.packageInfo + val app = pkg.applicationInfo + val obj = JSONObject() + obj.put("packageName", pkg.packageName) + obj.put("versionName", pkg.versionName ?: "") + obj.put("versionCode", PackageInfoCompat.getLongVersionCode(pkg)) + obj.put("appLabel", appInfo.label) + obj.put("isSystem", if (app != null) ((app.flags and ApplicationInfo.FLAG_SYSTEM) != 0) else JSONObject.NULL) + obj.put("uid", app?.uid ?: JSONObject.NULL) + jsonArray.put(obj) + } else { + val obj = JSONObject() + obj.put("packageName", pkgName) + obj.put("error", "Package not found or inaccessible") + jsonArray.put(obj) + } + } + return jsonArray.toString() + } + + private val packageIconCache = HashMap() + + @JavascriptInterface + fun cacheAllPackageIcons(size: Int) { + val outputStream = java.io.ByteArrayOutputStream() + SuperUserViewModel.apps.forEach { appInfo -> + val pkgName = appInfo.packageName + if (packageIconCache.containsKey(pkgName)) return@forEach + try { + SuperUserViewModel.getAppIconDrawable(context, pkgName)?.let { drawable -> + val bitmap = drawableToBitmap(drawable, size) + outputStream.reset() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + val byteArray = outputStream.toByteArray() + val iconBase64 = "data:image/png;base64," + Base64.encodeToString(byteArray, Base64.NO_WRAP) + packageIconCache[pkgName] = iconBase64 + } ?: run { + packageIconCache[pkgName] = "" + } + } catch (_: Exception) { + packageIconCache[pkgName] = "" + } + } + } + + @JavascriptInterface + fun getPackagesIcons(packageNamesJson: String, size: Int): String { + val packageNames = JSONArray(packageNamesJson) + val jsonArray = JSONArray() + val outputStream = java.io.ByteArrayOutputStream() + for (i in 0 until packageNames.length()) { + val pkgName = packageNames.getString(i) + val obj = JSONObject() + obj.put("packageName", pkgName) + var iconBase64 = packageIconCache[pkgName] + if (iconBase64 == null) { + try { + SuperUserViewModel.getAppIconDrawable(context, pkgName)?.let { drawable -> + val bitmap = drawableToBitmap(drawable, size) + outputStream.reset() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + val byteArray = outputStream.toByteArray() + iconBase64 = "data:image/png;base64," + Base64.encodeToString(byteArray, Base64.NO_WRAP) + } ?: run { + iconBase64 = "" + } + } catch (_: Exception) { + iconBase64 = "" + } + packageIconCache[pkgName] = iconBase64 ?: "" + } + obj.put("icon", iconBase64) + jsonArray.put(obj) + } + return jsonArray.toString() + } + + @JavascriptInterface + fun listFile(path: String): String { + return try { + val suFile = SuFile(path) + val files = suFile.listFiles()?.map { it.name } ?: emptyList() + JSONArray(files).toString() + } catch (e: Exception) { + JSONArray().toString() + } + } + + @JavascriptInterface + fun readFile(path: String): String { + return try { + val cmd = "cat '${path.replace("'", "'\\''")}'" + withNewRootShell(true) { ShellUtils.fastCmd(this, cmd) } + } catch (e: Exception) { + "" + } + } + + @JavascriptInterface + fun writeFile(path: String, content: String): Boolean { + return try { + val tmpFile = File.createTempFile("webuinext_write", null, context.cacheDir) + tmpFile.writeText(content) + val cmd = "cat '${tmpFile.absolutePath.replace("'", "'\\''")}' > '${path.replace("'", "'\\''")}'" + var result = "" + withNewRootShell(true) { + result = ShellUtils.fastCmd(this, cmd) + this.close() + } + tmpFile.delete() + result.isNotEmpty() + } catch (e: Exception) { + false + } + } + + @JavascriptInterface + fun removeFile(path: String): Boolean { + return try { + val cmd = "rm -rf '${path.replace("'", "'\\''")}'" + var result = "" + withNewRootShell(true) { + result = ShellUtils.fastCmd(this, cmd) + this.close() + } + result.isNotEmpty() + } catch (e: Exception) { + false + } + } + + @JavascriptInterface + fun moveFile(src: String, dest: String): Boolean { + return try { + val cmd = "mv '${src.replace("'", "'\\''")}' '${dest.replace("'", "'\\''")}'" + var result = "" + withNewRootShell(true) { + result = ShellUtils.fastCmd(this, cmd) + this.close() + } + result.isNotEmpty() + } catch (e: Exception) { + false + } + } + + @JavascriptInterface + fun copyFile(src: String, dest: String): Boolean { + return try { + val cmd = "cp -a '${src.replace("'", "'\\''")}' '${dest.replace("'", "'\\''")}'" + var result = "" + withNewRootShell(true) { + result = ShellUtils.fastCmd(this, cmd) + this.close() + } + result.isNotEmpty() + } catch (e: Exception) { + false + } + } + + val fileOutputStream = FileOutputStreamInterface() + + @JavascriptInterface + fun fileOutputStream(): FileOutputStreamInterface { + return fileOutputStream + } + + fun destroy() { + fileOutputStream.closeAll() + } +} + +class FileOutputStreamInterface { + private val openStreams = ConcurrentHashMap() + + @JavascriptInterface + fun open(path: String, append: Boolean): String { + return try { + val file = SuFile(path) + val fos = SuFileOutputStream.open(file, append) + val bos = BufferedOutputStream(fos, 64 * 1024) + val id = UUID.randomUUID().toString() + openStreams[id] = bos + id + } catch (e: Exception) { + Log.e(TAG, "open failed", e) + "" + } + } + + @JavascriptInterface + fun open(path: String): String { + return open(path, false) + } + + @JavascriptInterface + fun writeByte(id: String, b: Int): Boolean { + return runCatching { + val bos = openStreams[id] ?: return false + synchronized(bos) { bos.write(b) } + true + }.getOrElse { + Log.e(TAG, "writeByte failed", it) + false + } + } + + @JavascriptInterface + fun write(id: String, base64: String): Boolean { + return runCatching { + val bos = openStreams[id] ?: return false + val data = Base64.decode(base64, Base64.NO_WRAP) + synchronized(bos) { bos.write(data) } + true + }.getOrElse { + Log.e(TAG, "write failed", it) + false + } + } + + @JavascriptInterface + fun flush(id: String): Boolean { + return runCatching { + val bos = openStreams[id] ?: return false + synchronized(bos) { bos.flush() } + true + }.getOrElse { + Log.e(TAG, "flush failed", it) + false + } + } + + @JavascriptInterface + fun close(id: String): Boolean { + val bos = openStreams.remove(id) ?: return false + return runCatching { + synchronized(bos) { bos.close() } + true + }.getOrElse { + Log.e(TAG, "close failed", it) + false + } + } + + fun closeAll() { + openStreams.forEach { (id, bos) -> + runCatching { + synchronized(bos) { bos.close() } + }.onFailure { + Log.e(TAG, "closeAll failed for $id", it) + } + } + openStreams.clear() + } +} + +fun drawableToBitmap(drawable: Drawable, size: Int): Bitmap { + if (drawable is BitmapDrawable && drawable.bitmap.width == size && drawable.bitmap.height == size) { + return drawable.bitmap + } + val bitmap = createBitmap(size, size) + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, size, size) + drawable.draw(canvas) + return bitmap +} + +fun hideSystemUI(window: Window) = + WindowInsetsControllerCompat(window, window.decorView).let { controller -> + controller.hide(WindowInsetsCompat.Type.systemBars()) + controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } + +fun showSystemUI(window: Window) = + WindowInsetsControllerCompat(window, window.decorView).show(WindowInsetsCompat.Type.systemBars()) \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/jniLibs/.gitignore b/KernelSU-Next/manager/app/src/main/jniLibs/.gitignore new file mode 100644 index 000000000000..3e4871122315 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/jniLibs/.gitignore @@ -0,0 +1 @@ +libksud.so diff --git a/KernelSU-Next/manager/app/src/main/res/drawable/ic_github.xml b/KernelSU-Next/manager/app/src/main/res/drawable/ic_github.xml new file mode 100644 index 000000000000..4d3218529c87 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/drawable/ic_github.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/drawable/ic_ksu_next.xml b/KernelSU-Next/manager/app/src/main/res/drawable/ic_ksu_next.xml new file mode 100644 index 000000000000..5a3dd0a9a39a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/drawable/ic_ksu_next.xml @@ -0,0 +1,12 @@ + + + + diff --git a/KernelSU-Next/manager/app/src/main/res/drawable/ic_linux.xml b/KernelSU-Next/manager/app/src/main/res/drawable/ic_linux.xml new file mode 100644 index 000000000000..046bc6ef15da --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/drawable/ic_linux.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/drawable/ic_sus.xml b/KernelSU-Next/manager/app/src/main/res/drawable/ic_sus.xml new file mode 100644 index 000000000000..ea7946703e8d --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/drawable/ic_sus.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/drawable/ic_telegram.xml b/KernelSU-Next/manager/app/src/main/res/drawable/ic_telegram.xml new file mode 100644 index 000000000000..f9c308a43d18 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/drawable/ic_telegram.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 000000000000..715473377634 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_modules.xml b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_modules.xml new file mode 100644 index 000000000000..012319b56f81 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_modules.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_settings.xml b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_settings.xml new file mode 100644 index 000000000000..f32b36aac21a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_settings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_superuser.xml b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_superuser.xml new file mode 100644 index 000000000000..3d29eeb3a64f --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/mipmap-anydpi/ic_superuser.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..20ebf833bcd8bcda8b1d607eb3c3046180110df4 GIT binary patch literal 5039 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 FV1mCxjz<6h literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..56fd7d1b080a7f258a113e32343f630dc1f0b40b GIT binary patch literal 4426 zcmds52wHL27g}N@9dG(p|bKF%T)~QhEYIV07pJ5fGFvfq`_l zfPnJj^Edq7eP7&rUp?pC=iGCjbDtY$sINhNo9Q+Y5fQbPCd~Mz7X24M@|)as1Z5^7 z0)w?+$|fO*-FZOr(_S#S-6P*DMi!aaY{tAcrP8j!02*=e0#^0d4JQZ!4#mRgFq4}SK zWHbI?iOrYxsm2pf;)#z9pznH_Y?eMB{wc=~kt)($2_59)n@D0a=bg9N(qSy#m++o< zXVlibK8JXI(q2jy=^As8=Je*li$hk%>-lcQ(RX z?!|J_h4&zd@jRO`uA4w_gc`7kkSWUf^ix;8p}GcMMMmxStWRkuXwbaRkIVW9~-uIG6{HtDxGL>}}1Ruh<{pQ3Ud$SCCVCh%HT`ryM zf)~e7L$^NBiZtb_hfL<>=aPrax$wzn`ya>Pk4bGQuCNE~WuRFB7%YC9oDDMFNJ9+P zONxz%O#sS7ad%R*dM=s~cdQ&zG9Gu!>`|bC$)B5s=;LBN0bEQ1vRuJH4z=s-Xe+AP zca#w_2LvQ%$cAiA3pXSu3GvXb`2kpwOkr6W<(-)~yd_$x3;TMPv|VFS9d+j{;Y&ZQ zwye-WBN7o?2=+HpnR21nVQMH(OIX8rQ?M|+c_hSEvCkn~fz|oER{=@s4V%G}l9*Fw zv7fGj4wI&C5m;yk9yw^`lzSid#F7uf4GcqU9mlN{g%4)%-%@<(<1oDK){C7e!6eSY zfLR;~3yE8^(`)wr9+LJ`53;K^*gwdvNRfkaWay4|zW~H&W91jBGLf^eWpSBw^jYra z8*Ta{OfcYq2%tFGDCa`wV^fH5|SP@TV{(4oaCN{ zXy1Yv3SH1CzrBl!R4>^`^LLF9z3NY-(o!jWpL;8aJfsumefbTatA3APGWq;|ubQh1 z)1iDBV=(nWNp6NIM^VHcj#TV!WD4k0@Zus$_+EL{UDfvu7pgSJ(r3chvKC#I%M&7l z7tm1Uyb}x(AAuW{15>+51A#pO>7xmSw1MV}J;c$JsubQ+B16XnO}Ymhf)9gJG2tem z%d*b3xAw1Nh_g8*lk~m`fe>S_DtPFu+6+G$#gikTN->4YQRPV<&n11fD6~ahjCF6O z^Tx3!vk(5jOB{ds7x??431m?=TvD(9B{q68G(X=5>Zr{odcpFOFAUoRMVv_a=I!Wd zJ^Z~Qqc7m+Nsc)%(~#4;1jsz#ITP&I8%^}cMt`dq-~G+|XU!?$q8({{G~6XB!Yc^g z>{+L4d}_`T{0?c^|3s|@5uE~QTq|+ndMsA&dA|4K!9t9v_5(Z0;fm)dWN60AQ8kJp z29=(_7fw!pFAp8`Km}mF!yLe(te_dl%MNrc88@Z@Ik-*S9RME{0H?z~SZ}T*aW4y! zXSrf!g}?ZlEq>Fn*;aVH`s98ED|9BaeznVYPMmah{h4`iYv>0VXZR==cnHiSMMg0n z;P9lZfpY+(S%@10RMXc02OuV#49BAe0D>Zyy<6-4r0>B5sNM#Mpl3W$D@W~!~ju=iIrF23Qw5}${U?}hhA<3O@$s+H?q*C0} z<8g)cR(%f`U5$bWN1|r30g-uFB~Oc;gxQTSd;%)t1pzsXJeJ%=y78kI4`Rye){w|h zGr^+rx_ASg(9aI8eW$OTE_`qENOEGqhpUCAojYDlQ5kglQ>R};4V8Xe$WS_>*)cC^ z5Bu-mG!#E#!!w+&Ly>JECNOV~1AYfuQ$|sW3s>;&1aKsjS}<(pCQqU<_X@g48)mtR zUXw#jS42L7!CqEM^o{51Ri@KpjjDw`f+R;%dYT@vD+gCedB;-)F<;IYzSo9uWemY` zqM_xzP_jwMQB|mbM;XuCxweg$-*)ep7;&+cTEXbx)~ASO{!og@xVaoVn#F;D&fbst#Fe5O)#6g)z67vTSy|KVEs&4p^Q% zu>dIP>=NiG+|T`B1uGGRzr61#o-XM+UJ_LWal30Vsk$)na*v^GBHa~+otHiBN+Op@hP zUzGa2vWWoSb$^3~azDY3n^yF3V50t=s&9)CEf*Tu{)1pWlKAwnWKjEJkPw0(%9jdHvUgQm|Gv0%WBfNLrV*d03 zqHNrQ)bA@)r>Kyx&%dRqTD`W~2JgObg?LfQIh5f3fQLc}Vl~G-k|sK~pP|cxBQzsq z_SLER_t%=g`;^~sH=Q9U_!THk1-;%%aVcP}mEkt_5eRjj_q3O(9DGsQy$rcbc#b)? z^`tO&eSIjU>beMf z(SaYfD#{Mg@<*eD;WT8iW7FhbsghrRoxo^hF4mkTGtws~<-6ImP<-9g8~bLf2a8M< z-Y2QJv{(H4HFgBKRfv(Hot&NOc@o)RH!ZxvH{4DGFL{gdGEJf)Socjd#~t=UHLfte zwrF2%lP#scYi;Ds~~ z7BX_m@>eXRBkk7{pYXFZXpO{#NFxEt^>=_V5sW~)bV!cJgu&|Nyt7Mfe{O2@`QjK& z|C2C!R*c>XW6-E)S4ps-o}Ev~AjsC(RT7SjBvs7!Y2SS1?)PWYX=}R7fFM3LxYePb zG+<&}hJ344|FevLd9W5OlFP(w*N%csY*LG}Xnl8>+ zT2(X$p*f{^h3}-){U(ZpWOK7JiD=+*ckY4v%wR^XHgWOLN}x`ZICnx_-$dBoAPiky z$9y|uS*i>3Rn}yj>!rhf*>-q)Q0J)s;d|bWBV{z87GZ;#nfJ|GvOrv@7x~R12%|9r z!?l^P+jbtdZ|kUdgpEblY~@{NG9GyK8r5cLKO0`)-KBL7mkmthLEw-r5dkl}F^+p5=d*B6kq+@~TVfZ9!nlZr1is?46PB0cT9dHYmIAyaAchr8SF-T*lq>S|1 zRlH`z-%JhQ-=Ddju8|aS*>ii=ynf{gtK!*ni7boA`#^K{T=`7=p_k>&Awq?}Tn*r} zwzv$lzU06C;N!ZU-~E!alZr8~4E|&<{fcsldUkHCMrWz=cmAxEREOv?qC76|W^YTg zXmo-dpTt8|0fLY1iFMFI9d=))mh{!xuZFrS$YDrdoxJL28xJ_JLmO72M42zdTr+Rg zWCSm_pot4por!I5*zD{ek@{gBWa(wuUHJ)Wan@})zSZM4D{*#MsSX=j{!P;;)>sxS z%;o1@M(4;*-WpzJJZGC>t@NrQd~>Ld2a!_3erham71`hFo8f+7gN~R2ATxg1nI1w z7|s3Zo&~CrCdz~QCV=}$(s}8H#_@DIH|MK~q7Ahxy59*gZvKjo*iNK%r*b*oB}7U8 zs7y0@vb?{PO7i9COGP+zR$M=*GG*9ZzE;a^AbpGCQTInNa2tCLL$L~g*jtDAVn|4O z*Rvo-9_8JUD3T;5-cuT8l0KDd>M0B>UVrXpS8Ucal3IhRTU?9x6PYbEihB`pwBOZl-&lbXQhUbA-|gl4`HRg6 zeWc|itW_5jmG&w3Dc8{{lHix(@Qq`<#7C7m2V|DX=OGAAc|3S#vU5=3#1qoH9oLc_ ztvOj5uyQj0i0C_OB-2)Go~k9?*J5**nSj0KsEEH$8=1guE}5Z57J{FJB>4>5Q?hg{ zKXRR7cFHoQ~KK_v1wfsAJMTmw&v-2gSIZ@9UMkP7vR^xMVLYd@jisI_d@V z7Vi2hQPfx)MFa3JgS)UR$?>N&YKdf+ZrJ~v(f)t^85XZ;3@bX-00M7rek4R%YWlEh I6}y-J2efu5B>(^b literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..56fd7d1b080a7f258a113e32343f630dc1f0b40b GIT binary patch literal 4426 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 I6}y-J2efu5B>(^b literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules.png new file mode 100644 index 0000000000000000000000000000000000000000..7510d3aa08a260302604d9af037c7da513ad528d GIT binary patch literal 4454 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e61af61cdeb84efb43bab87cab93673bfb470d4d GIT binary patch literal 5438 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_modules_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..e61af61cdeb84efb43bab87cab93673bfb470d4d GIT binary patch literal 5438 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_settings.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d1e1fa072b57b1f1a610177119b65a598a8cec GIT binary patch literal 4501 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 z

    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 X-^lQs8tVWWSAwSw(E^u0w+j6)=v=?2 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_superuser_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-hdpi/ic_superuser_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7a8e25dd22a191656577d594cca036d353b72b GIT binary patch literal 5516 zcmb7|Wmr_*x4`MH0SRdaP(eaKN@74~$XBF6T3t65PA} zh=~mkj}A{AtgP>gzne)}X>Q=xJ^a!|jm(cuSyuwc^tFnxwnwIHPrqt!>3i81RmNJY z5vET}Q3kaJ<6jWVGWsSu8YOvlCBiS*ifaqyAIw@mfov)5C{YqaR+OTwTH$OS$4yx1 z^*8T*#p~T5&R&J7nzPrbr=UfX#q+(ob1X6#c`Lsm;*c9GK)_2E0`3H;J)ixk!V3_q zvf=~6VKVggYHabauQE^Q0cv3O$fvn6g|q-Yk?*lez_;UDCBt10fs+qYbTI1wNsYA- z>Gp`C2Xu??eQy|xgnds*teQuFJFEV=-rVy7E^n?`3pG3fxC@Ob`pad)Wc+1|hMA}< zA4b9mi5@r7h!RA?I-;D@{63KJ0cq$;SD!Wi6-4Xp*YW?3PpL9t=isl_NQ0#3|!bNG8tyD1K6^9G( z{DNydZnIhls&AxDZ zCB{p3jMmi-0DGBlqsPa`H{zK^OzU?aF=~9+TbF)dhK^W-ouYStQrI~ z?)RmiQL?RE>~vVAZ0&`gj?ocl;(QwBa60%yo11;a5X1zFH5|6;WN zfxp{RV|BWk7a~DTF`sm;!wy2g4J___N8ld+!IP5{Bc9b?oUO(5o5O2$K%Qj!9Vg4PZ&R+}S ze=HUb=?>8IPEZyCEXR|o)%up4VX{J}hJn~|(gBBAP}s{EmsE}-+OHD>(BhhcduMIp zZupGXoMe7`qj{Ra@wYMrXyw*BV;HeL=qS1KpUymelsDgg9^a9Jh!Rresc8DwuLtvS zE`A*rE_M!eQR|g2>=-ycf#=8{K4iHyS2dnw=5e15pU&&gpl`-#@eX`_N_Z}@TZ4aF0F`hX2RUmbx5D^!r z%@L=nlKQazCx&T{=2Na9WP;O?^3gGQJ$IDi_JlzAt^D{}e8UXJcBgwN$E0DF*93T0 ztj*)ua#I_%WSN9^x^iGX>(73fG&Am9W503oLMH&M*{N+`ES_s_3dhx$<7(^~{@3KM zplw5Wr4Q&wOhTj`9z1@jwjSb?e(Yt6RoXM~jPTQglz#pV+a}yf!na9hby8*u8ZXf! zk)hFkXL)}~MkzDM=EDk}_gQi~lymz?jZus%lk6%dl<0L`?<_?6XT4xnHm&ZWe5hhi z^C0v$X^{x+DR5I4LKV;AZhz{=kc=N2^*dinU^hkCR4LiKMX?WvGZp_SrBf?wD7qV^ z4~ThA)MFIqk}hWnZCSrx-!iAz3laz76?!zQz5eA22J*>Va~X>GxA&G_WtQU#lPc=&eUMyV^Lde>3O3*BOs+mrhq~ z1Hdv`HVtgt;UEFTIoueupXaAhP_u`*3R`XRu1V)g925FEq=nqLdIdW4n!|d6zny2BM7P}W>G~ZcEVUD z`Q@Lapj*JHvkrZH?jAqCAsyI{k`W@%*RqbBDvjG*FECHKBnpBfo>~=JhH>!D`nu37m`A&91g42ivOaGsWMh;JPZ*C6N(%p8gEC z?0}&!U)PE)RJ$%BkGYow=ngEp=GsKyCOiZ>^oQADG)Fgm#nb*>ju86r+Z`5?EN(gW zw9gi2`KFGyZ|0K@Jl1#U4yMsReJmq}?w%T|G!-R7vgH8%Us&+blVzs-h~7aOlywV# ziPS4D=RUk{h@Bqp$myqZQYPW*a+%xHZ_R=z~r+;!-h3^=L z99LlxSap$HY_!IO22~LO{YR*2DcH$v-)ejsfPTjDw3KBvWyo-ZG( zUSxFo9lm;EWQlSJvGfw2{j8RNRA)>RRAD#I*Cnz3{5fuk!8+XZJx%dTkPYYN{<7Om zadSBW#rixGPb44V`l;En4I@-ZaY1R7IAD`}BF%6sCJ_8_i(?Z@cvs;bcFiahK!B_( zfsfF~cY>aW%0F#T@aAq@ExMbmKtW3@oR)>nzBUuRsPJs>C<@*9b56W|cwm0DqQSTm z?^{xd{->@vRdDO-hTkN=L^bLQ>|-$LfxJ6g~3Y)T~;&Y%ur=EYf_fo7F&dEWh2-hORQez(SV6Je3-(2gta#QU$FSmpRUP)I6 zp*{O|4KZYa*!)G znATdJG<+iw=8N+k_&J!*nfKt=hw|601z&q~gKssciTR;%O4SiMMwx8o>lp`Tu#08cc=m`MeUa z#m;>i$ksGDjqJG>9+z#juH)uN?Wt(=y|g)JNH!-prVk`I<1S;{c=I0nIQJ(f`Yueq zs3GSLuPMOzo$3T6LckH5y)n0WDNO)yuiuQ6k(BfX<=pu!eV2Spg;vp&^1lh|NmYf< zWcRC%xpJMKVVN2PfhI*mp+c(5db1g%*PN>_WG)`iAigVfI=4SS+81Be3sIqdn_qgtr2AK2>+hFkgk!)4NMLfTVnpfV-pCmS%+kGG6CbW}M!(0eZyn`Eck@(76qPv zR|z|^<;UHCZf3+mwLAgwzbWdNLFmVT-5xof(L5O>p!pLrZU-8JO|LYksQ=JM5j}YN z=bNNxc5(T-M1;<5AwPipOp#`!fp?KWgN%E_d&@#*_zFZ#l!|UICVdBLzd#u)^}?9b?=hb|LwgWjAY*|m zVag#OkEp&_AZQt}P(kfvo5@8WYICWo>9)*iJQ_&yuK?8b$XVDJp*Fu5Puxi{diz2ULhv%Pe87&mo z9c@^7jKkQ(!qcl0#1SI=I(4xV!-8p^5MVrlf^;-~p-iIl@53eaf0N8Blj5%yyHMoi%9Z(kWph zXW$$^%0LrEqZIm2N+K$(J$(o^M6!kHm@*arg|Vnmx^sbDrSfZjxuMcDK^M~;FJzpB zM=)1MqY^hI?3wH(Ul9iG@AOr4{GbC$(!aYHb;*_l1kuKrB-J|+atoUq#8#`~znJk-v0dX{mI7h~`~Al#9n z8cnnnxOUfjgBbM73J;_{OP4VN5$zM-k?#|7&fbbA-@PeKyZl8+u7EkE-ftG}!~UQb zAHHI_xY{IyaBIoRQb z2EAuaH97IZ z*~qTgA&XWa+k*7S!be3_FByqMNvZ{ByiVoD7eo%1|1iPa@vop{Vta2`eNDRscm1+H zo~uZfq-Ta|Rheka-l+tW`pO;1dYx>1>?|$g2iAx4vh9A1_EG-Y@O(f*tvUIKtI{|! z(BqK*D#e}W(0{jp0JD>`{Zm21yE(znvi}WQbTeQYnVct$n2SDPi%d9K++6&$FUUO; zbiZAY<#a;qT7Q-vpxKciAgmMjyhk+jm}ma}%Z$DY*B{C*l8+UdZ8d%F-1aeIi_Y+) zOuD_N2POw>OEF59J3U4cF|WeqGd4=ZxBctDo!H|oo^jEm2A5CgD7#m$O6D1SgGev* zZ7D~+A(sS%bBb=7V0Ia6`;a$(nGcH&$BOK^&lCgTT-w9F(Jw{`xZM0n;$=Mwhm__Q zd-B%SC2;`hn04ss4E8TA3g%7ul0JolSwoI8W7gMfAtSuY*nM>qk!@U=N+$BkDG>NJ z$m9O$xBsLrA9$qNa&qIm{(n)~17!@Ii+jv&^+F;$Yk2Ph#P X-^lQs8tVWWSAwSw(E^u0w+j6)=v=?2 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher.png b/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..365a84ce4735b563ba7ae8cb3ca27624135d50c8 GIT binary patch literal 3145 zcmV-P47T%$P)+Q*dHlP_k0_u8_3qK5hkxhJoonRHo3}>x?Afbj%a*O8x3_nY zQL5zReU5x>(ILwEGJj4T$x$2WXTD*IKfH@ zD+LG}ze|@cO~e9!O?{fRyHdc-n>WkUsZ-_t{rmFa!w32J@uToK2S2l9$)YBxR>qDU zD@~d-5ic)y01&x&@nU4@(xs!)c7o1rH_TQbsrVi^a3HK^&6@voWh(HxY}&L*7A;yN zU=c*7uM!dxB2ZdNlqjJrosf_qj~+de^XJdY-Me>fN>#30Sr9*zB8VL>cjVx~gMDk& zsE1-Yta-7dABreC{lmtlrzV zZ{Mdu$)IMIwtxkencYpe(D87ybm-7QX3m@`88c?Iv^-%(w)y<|vrL{mS=zR3 zYjxJ4tyJE!(>C&Z(Z5?CGK+2*NR_UAr&47_UwrbU?%=-1~AK`2wPZK_V5UgdhX3b*F zB%3#Ho(vy8T#)uE7RivoD*sFkc6f+TVFV$iM6qJUbYrL8r+6aHwcRyk3rXFc6UC+qa6_@9 zs8SCkY|^e>J0+yHygiIk6a)_+K5QDTA?v@&mMuGyFrotF{=f$h9;^k={?Spm3l}aZ z=E<2erywJB2^~*QlEsi5%KP{4?OJxp8HA$Z zI6S|QqY%t-x_0d<;9ps~bgA9x?@9e%zkV%En>JM#H{xC|tdB9a?A*Cis#U9IcxEa@ zvBot}eJ%WWLj@Rxf{}b(1heFDRA9k^1&R^+^ywqhrcLwI$fnmZcVg6DwQ7|mbo4GD zjS)IJDAQ>z!1@IeL&mCCT7hi9wjyNQS=kkY^f}fNBoIb^#{pTdqwc5;2q_;RY=W;}zaEDWjZkSna9rj6 ztfmMFvq3sU5w0S&nPrUvyHifz&*z;zdsd1RDdO}<$g~?Y+z}^~0?f#QjvYHT4ar)# zNC0^VZ#b@Kl!;ux!i5W4g@uL9H>*=)V`G&c5Jua#Z+D80Os#dL#RMip25&)Y#1^%w zJR>Vp3{Q50*D&Uo;h)NZ8GE7@A)ZwrV`7sT2~=K$?lXRVeokp7EnBf-MIoHFY}w+J z%#kUmq_!@D4|mHrm`5=cv36dH@l~BiJ4IRFtinSrkx;d2)jt4UOy)jN0b4M`!5HKi z&XEHbMMp==`0?XaL?)jbt1u>dMuuYhK_em}ROdo>W-NurCgjhXUny_jsYp#)m;|D@?~1^>k?_Gx(h4XTVPr?t+>8!E zX-D())dW7x1^sy61eqeqWcWoCM4)KNLc znHDWtm_mmH06!ZX9v;r3{w*f^rYXjHhipU#&JL{p2mD*fs&hujj2JOO1uZ^s=+L2x zWk{P$A*`%!cbuc0a~ zG)HoG{?D-f=G5kvD&HI%TdKUo3s&{pkPV(lps8B zEL!vq&~Lb7tTQ@x>?m2YW;L}u4<;ohN$k?tVc`9h_(>OsK?73MYk^rXGcwU9Ezg54s3<5%!n;@$=w zy|&p7XvLW1@oh{nO1rU0BYI{8*1bJwiMz9`tMl}m#Kc57a^%QDWTKPPEU$(C7HHBI zu~LAi=?@HW+=<{NOO|xRw*NgaFfg-Of@LmL`d$H&D$xu}Kz}L{RLu_I8%#^#tsrES zMJqvi4MaPzG#F|O7^60s$CGX}7jvfuBP^|cVR2C0CksHoa)+qNE-Cr`dI+BrRW+hVi~p+bw(+41800`jXF=%wz% zHEbEu>SP^J?db@pB?8*nsU~PL#kCSZ25L%g$p9CVot5mLBxr$(!@_0E?1_}ij z7XYig2gP1M(f?lr!4qiio`eES3212w&D0<%0udI|rPYn=rdI)duU3T6qN9_s^yF_I z=QTQArzIKsIZ1`IFhBM8@A@}`^gzgLH}w6sfBH~@7eR%0Q@p`eT6lFYAoUelEGq+(U(qYbdH6C}00000NkvXXu0mjfp~m%+ literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab2d5f0975fbd39d76ac5cbc9e1ca78983348bf GIT binary patch literal 2817 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

    o@00b<|Z#bUT zz`p~?eVVgyF7E&Uz6gsO*PWx-)@f+6sEK6vAirObA2;s#^B~2P++|oH=&8O)Ism7?;7s}lj|n)#gYJb9TVCG@23zDYZydiws5U4wkBT%- z1n`Uci&6E2Q=zA{e^kN)u%9!w_{6bEayZ58}?VPMNV2+gy z5j^lXN^~~g&~@SL1veha?1p8_$Dy%)ek+8OiiLVcxyr3^Ix0S;8ewB&QwPQ~`&jb7 zlQsD5EEdd_@BiM@Yk~eJyYhU;c^9?cC9me=XG^-kQ{jqx8I^!;5CMaheuKGB@NDF z5J!_!t|;YC)M4LGhqz1h0!XkFXP_*8`4J){UzJ(bhlB>|hs})d?(RnK&3bg)z8EB< zn`hLCOS(Ad@&M2G2DjGPw25mZC_Eg|WQ0^f!TQ4ET|&)yHyKN|c+adaw$a zz4?xHK6L1a)RXDd7>K9P_{>b4681Z^;$wwdeZRB94dgzPMvLhGG&ObCFzYEZ%c}WX zia)T8ti7VuSmBZQy6=tRTmZkLxzBk1W1YO7O+eIBCUeJ;K4M(?JY{Elo8s(oxi?J? z=&dT2`!FVinOl`b>AZ7a4nmM6wA#zPMX>sklatSDiC*|$a+ec4*kt2VSU{&rB% z?9}jZsMcMHa3gmJ-3Uj3-gNUW>Xdi-VWZt5tYYJ>xPpm}diA~Ob|oG{IP-#R3OzsljsGo@Y_D5`qOc0HOc{+9ED5TM8>SK!!j)IAna4`#WrvnK%44p1y~9jI z=K|A|ta}Gg4rP{KSi>d^9-xVX5NK$h03d|?6O zY&taa8`Xl@{ersVs|+I<^u1%!Hu2KEs+MPD$s{T5;Q3A+_7JhiZK+@61V1%4Gro_{ za@>}h*FGg>XJ6LrxrMX*Nn^PY!#WrI$hHe6%9Zp?P(&V2fxS!!PIl9iO<>-DxMKVDLWW}nskd3jai zx>T4iQs#rRUEjj|y7v3K`G(^*56m3=-iEWzHuIXtrY0Oquf%0zMGeGAyLK~}M$pjj0`+7Gz2<1EOi*>-C3tk>TX&Rz(Sd*lC=u@FGMf?zL4w1)>Q zjD8b;*;|`CB=~crLVp{c-)?RqxR!GDy6fpfk!e@loDce#r571_=gzb{R0nEoY>r0!df1BSW|#!Z8##bg)>^1g%(p`Odt=TT2La3@<0x?tP>*jOqna43bDjp#?Q zZp*NDm*p5Vv~;|Bb)-)BZ1b+=e4kn(Lphgl*KS@NC2U(1Xi~GST-UiJ&c5SQQcmOc z1;&u$q(6(VkqTGC24TT7^2<;7*hwFZc%jdaYdV7$qUVb0lbh_coE=Mrk)f)r=^@II zXJgLNThxQ(4jbeh@@&+{#fbI*~z9};NF#> z-*&=XszN0bjd(}GK|kzVt!c*5B9RTAJdZU#-<}^dD$LuBmKNsep?;h6+M4y8a-@NN zZGJcpw#wp3cG3!|VMq0YKcj?-`)Q?(4>5eIAwD%(rS>Y$d~!;y2N3g@lrj&geg8)b zw>-9&sCSBg@tThWYq{7u7BH5L#vfTIp0#-|8NPZ5Rr?aIU4<{?U~>HR z@os0O8%0;!^#tqp-F~zju%iaqR)qmhZOu2R>D-mC-g+C6vNO4Rg6_*vq#M93aI`N) z8WO-8qdt3A6RI@H!0N}8W-K{CFN{pwdY&C~3fo@l;r!5hEy#vD+T9fF*#IM%Kp^vWCPkaWSvH+-1 zRkkrNDv|KA${LXSDfLxJIYIBu(cJ1-PE{f9<^j)ICv zRf3J-6u0sP@Cwf;Hd&FLR7?u;6RmM^6SMu~*@)AfZ>bjERqxK>nlL+Zckb95g90c; zi#ixszyN;EaN4UU^$!8cM1sN(v!89dqG7pt8|hPy7UBgvqVo>7OeantX$Kmjb7k+X zo^R>V*5>863iadNIV)SZeUM>YjYICcYM{JZy$>R1HW#(St&bA@T>D-0StP*u1=xf|z`^O(2viat+u) zQmJa=8Xow=hMsC#Q}WTa+}3S}XmXx8V}w-3okaRCZ4*sS;EPbquFNjzPTXJ3P5=}% z*I~gCanmISG3Cb~N{{)m&TgtVni!DKH+EO;0`5t?%~JjnM`2R`Jc!q!5!>O#Pkokj zG0PyxqUiQ5+Md%HPXDOUPlp$=2-Tf~a3{F zA=o-z&_Xg@%_B;hbA|)+qU=R2|LOoE;%h%6&lGCSw(xy;FF8=EbEsBmzs z+AbhqKW|3AJ$S%3BJ@D)KbsE>@W7Y;fa&&A`dYdo^l#{O3RF?!GnD^JUH`>24o-=V zkmxAgNaf!me=~Fi|Lb1qDSw`vj3y{|oeJ*136ulyoez5HqUGoBrxSpMiS3Pgqnk

    ;&~y{NXBZZ55+l{O{4ZB$b+^IuzxeTgNugu&SN%Y-0^A@(+?NQHm{0)dUJY?vgi;V)4C_eC|ZvG3#`L!Zg>ZD1N(hnRs@YhS1F3tV^`|sC& z_0?C?KmPdR9`C&K&Y$0W^UZRpsi{Q^6ey4i(T0Z%9dxn579aQ$2u23qY9?RulK{?B z^+bywI&`R8)22-qfBEH?KbI<1s!@?5MM@?gGFuZHZ1I6FeBxWud?k`>0)S83zI}V$ zjvYJB%E-w0@$I+Y{*!{el7cUM;+q(9%DX~LH4~R)5mMmF2vCEg2 z;+q)6l9xgvVylW@@={0{J$iJB6DLlL{rvOKhrjX08z07Z^=c%yCnKEVC%0bfQ)~#DMZQ8ULnmTo= z-Mo1-X+J0u8w_d}7J*4s?h?l2R6sT2@w;J%9e(*#+yTPoLW3$B&&XKR;jr6WCkRgPPgm@ZVFXPT7M84`PJcSz~xX#)S(Pf-Jj#|GsI}iQz{x zzyvn&a!sY^1XB9;?VGOQY9yt&g+O)d*0nly>e#GVvrK0kr@Lm&8f)IXdEBS(M?<@= zEnT|Q+1$N**JjR~X*FxswCdHXo7R8FkM{#MFiIZ5?HfG(v|6=l)qD5dcPmLDwA{OQ z&$@K!Vizx7w4FP5TGy^!tx}~**0yb1)9{+kHKBIVOmvzxYi2E4w6F>lDi|;J)~#EO zk-?9DAkj9y4K^^UA9)v|6DU}^bm__xh8CWnPLK{HZLdUNUR-!#gdY50y=c)QJAeK> zY)9xEIda4nFJ2rOMJEXS=XSj(g5K0zZ2frd_@ z0Zwc;X#eoxLz_H#vJop*JDUSWu&U><^TYH>)p}d;_19ldmmsDPh|OuojvY=$AEHAI z`8GAAqqAjXWSEWx_TGE%MV@LG~0)9yV;4UA}xd zM-p4*V0G^S380atCsvk57)fTCnVD9!Xwirmz|n-DP@zJm1DK5*Ins1#v5!9b$Wi(7 z5jKAOcq?4EaOl&;7e0y=D`tKA^f7^?8%n|hRuV80a8pP(rqZF>Vy2{|SY~FX zO_?&qG<=}|cyc<=Tl@CyWf5Llw{C6Sx^**j(eR*stpl7pLk%1_&~%GKC6scoI_&(Q zl%n0P6peU95;bbnFpdMvYl1@PQ|pFhRjO2>n~=Wy?mJVg$V0#u1Hft7pW5 z7ms8QR^EZ^5vW+PVi9FrB%Xoi^W?M^+goqFz5AgKSq}mV zFUk=eKX)zM?vA z(I^?`oodyp*};Pc-P9o%gb@IAj4;BXc0X&=rj4=P`=DNzKBVtEHhubZ&yK0*%$ehsQv4yrhT7B7qerb} z%a%53)F|^hUKU;FU?qX)B!KMM)vH%e&aX# zMY*%ixpU{-`DxIgL2illM-lYB9c@p+c^KtjB>}ezxe?F_^B_*b3|M*k_wOGO z1@)r)nx8gy>{xf)ZrHG)=}v34Yu9$0Tb3?6IEmJ$A5FXy#L`EvXm+HHEm*~PDsm%0 z0#Ee4a-jp!gU=4mu1`$* zK?0+E?iK%u=tTlL>m1W??-Db#a0FnNeeJc^B1w2f49)0zdn=3}@kHv^ukTKn$OsIvfw6ni_7pAmJnCpZHh!8QgUXdF=cXL7 z& zdyIbo$btkWuq|1#vm@yIJhUWWPB$9RG^oR`xu!wO- z1U4|LnO#z{t6aal-4Dh2RcDeP^dFP?JO%ZWD!T5ukGpI}kiMpwCuB)EkrFY94F+|8 z6@dwCYQ8982_SV-Nh`ydp+kp`*t~i3EIxJcG9mmei5SEpCb7YwcrjB)JXhi+fRH5a zX}SD&<;s-@ty;C}2OXj=vz#IPEePMlAQmx+tvL5YU{MuY5+%S~!w?788Z>C|qrRs7 zU2E|MPMz$EvF>s>`K<7TPka-DSaNYqbYBDpu&5bZ5+#5(hB#mduj`z$P~S9rEM2;E z#L1H<_Yst*=2saEk|k`g#RtCdiEm=a$8{0lIq!f$-SCoE0^W)w9;tKl*s)`0^l|p5 z&Ye4V&=F$Do;`d1rD6XMKzQ*0#XJU}^j)D14;eb>VuLL{@P$u&%Ygqwg}$(o#gt?d zz>pPyWz0>f_3PIkYt^dN&-yyuS(la8S|SH-+O%no&No|iVmza}^L-tCpFypsu>;r;MF@0a((Ip_DB^MB5#^PK0ObpvX_&nv|X008(cuU~UG zsfd39c*_z}aT3I1X zShWz%YK38i6)rrlNG?u)?b-xC!!)9G*1#GGVt<<)3o8E}D#Q{Ly0rlN9j9pZoPTiW zLm0iYhkTp3vDmJKBr84xlS7I75XP0=DB}B)*z#C1v9wqQ@%-vd$?K@%JnXa;N`Zj( z>-`jcGwr{@(~;h^zdpcxhFYQjTZr~MU%NF^WZlprWtkmxU06j?C-}VrkE6V$2EQe0 zu*N*M9YhEQU96R}Y$^I!uTcnc&IJu>gLuTANa<|mabh3W6s0>0s?;XvKu%`s!ryh- zzM-1j-cUPmINV#fgpAA*1$S>}9z!oEJ2ZbLjtB}0V)XX*64{L6koP!zsTC`&#p39% zJwmO5P}PiE1d-rWy~9rpZ&W`4v%CZ@ql1Ij&!kR2s_tzp7DF8UJn)6tTHLkd-`khX z=IS0+-7hh_{Yx?e*0WS4j0Po&#&l+GA4-`>U&EV%7^d#(h_ces#5}eY zuJ+7UH*~(6*qr_jLvM3)v&^VOx%VDTPYiOMrMD-(9zoQuW1G!hH5I{lOErn1z8aT= z+{d2TEnZZ||5<(1ySlpSGhcY$FeRzPFd;0P%dUQB&46iszA`DbM;Lvmu|Mz%TmPyv zaATonsmM%DLNr=Kaw3Qbw+fFoE!T}O>gj}v%qh9g1S8EnaTAb+=Q~?(TvXGCfK96c zdywHEXVNKz)`tt6zOy~QdGhaXJGh;9iInM*|3N#_F1<((zecwodSTtwm2pcB9b^}N z>G*VaM2NdOG;KEW+DetpgDeM?2_>g&&tY*Vht~-aHZ4aO0e=2aWjX^K=Bno>`6-uj*o#ZN9|`{Im74EcyHtfek9h@)2M5K7Ag)NNNh9bTJH?uj>lTZx_3U7 zMoJ+9+rCH^_1((;9o;`{MBVc=L67vg=FFlVgCiu?Oc+b;!2CL_X zm&LW@J!uIu5aR@`9c*1~?Q0u5yE|hoT*sGMa=KY-OU6cSA9T+c44N#QXUD6pX(QcP zO*sC)u-2>kfm$+Kpy#>YjJa4}`uh67g4@G&(9*bc+|AyFGmG}&0s}g$$clm>Sy2vn zo2Uo5JPg({Iy$=ZmBaz~qreK2bh%?M<3$Yxue^_(nVgo0;#`CDRn!@WB^{N~a9!jL z(bNnwnY?1%1(d=ma!s8cmz%c*krYt|6FzW@%gl&wyX8@K7WdsyskPSk$yhP(w|*Yq zXys;&XTOxN<+@Cvf`-Y^GQ)Pv0|YlqQ0{zH308G>1j2sYEusYNdNlbKFYYpIXFS}| zCcL-LcFe;t4)a~&)8mtBli<9`UQpk9HT>6>2d5nyQsH{lM+8UJrOCfac<+Q#zR0aw zv`__RUi>MKb!>_g$UgvLXOXJSE;(lEg*F(jGELX| zTwkslv=N>p?8+Rt{|324c=Z7926F);8yXD*+oFdd!10FImIa47dR072-kh+17H4(A zq8+OnJE#nVyL|2#@25N7-qzryyXRh6aP@s3X}YL<$3+32%bz?2&)rf!m+!p@oDo@l zL-|6#;4i@5FXuRR(?h^;5xrX)Kwa(2mw)=uj~UWSZfqa4Hhp8) zZ0xLG`t@jLQgja@F;wvD+}Vya-8=wQlLjng%!+LLC^Z{|xT$GIu}0y^6%c?NPG&4e$TO- z*b_4@5s*DS!pzU4tJe+BW>HQ-+n?D}apyNey(wF_@d*_)>phFiDy+ zp{tD?X8fwQB#e9`y~zRFm{?(At`Zr)oXc)^^DtH=R+$hY1Ek+g z*z!Gp*zG)pYO8-`F*o(LLPztO_7%=%`Ca+^u;h|4QMkRF; zoK-nDru>eJU{RWMRnb|+%L`|RvzR+X$ERpe;aw_W?@wOfcwaP&mNABU7@b$`FZq3A zR-vcyn~Fi{$#qN{vO5Ia4@kx1{Li3*b`5lvvu<#w^hpo=BJecbD$8N&E~dz3Ww_3I6E?n!zr zKB?z4eZ*ly^UrJNd#szX6dvbX++$7H`WB1t#ILt-rPKj(qMyc8e&Wy@9PFp0c#6b8 zzBnnIGr=zq{5NTmKfCW|3XrOC^_=p`e3>;2z606H_&t&4kF|Amn8`h-37^cr30x1l zbG{42vrSJX2vt(e@aHC?RA2tyayaISKpnIqVFV15U3j!VYQKz+X*b}O7DUk3**0%{ zcZFo&#S~PFDQlR_!9ujjwtVKVl~Tv#41GzWqkO>u;XRC3uMGk`)Ze=4yA<4o!;LTS zPciJrcY^{6&fXsCpY2)ID!b<&8%jS;yj{|)uQgPwr6ysLfcZ$tI!Kx){?h*rTTG(; zp+DvCsjk{{ZbNVSbPD~UU(0x_tIcwk_t$psu>;r;MF@0a((Ip_DB^MB5#^PK0ObpvX_&nv|X008(cuU~UG zsfd39c*_z}aT3I1X zShWz%YK38i6)rrlNG?u)?b-xC!!)9G*1#GGVt<<)3o8E}D#Q{Ly0rlN9j9pZoPTiW zLm0iYhkTp3vDmJKBr84xlS7I75XP0=DB}B)*z#C1v9wqQ@%-vd$?K@%JnXa;N`Zj( z>-`jcGwr{@(~;h^zdpcxhFYQjTZr~MU%NF^WZlprWtkmxU06j?C-}VrkE6V$2EQe0 zu*N*M9YhEQU96R}Y$^I!uTcnc&IJu>gLuTANa<|mabh3W6s0>0s?;XvKu%`s!ryh- zzM-1j-cUPmINV#fgpAA*1$S>}9z!oEJ2ZbLjtB}0V)XX*64{L6koP!zsTC`&#p39% zJwmO5P}PiE1d-rWy~9rpZ&W`4v%CZ@ql1Ij&!kR2s_tzp7DF8UJn)6tTHLkd-`khX z=IS0+-7hh_{Yx?e*0WS4j0Po&#&l+GA4-`>U&EV%7^d#(h_ces#5}eY zuJ+7UH*~(6*qr_jLvM3)v&^VOx%VDTPYiOMrMD-(9zoQuW1G!hH5I{lOErn1z8aT= z+{d2TEnZZ||5<(1ySlpSGhcY$FeRzPFd;0P%dUQB&46iszA`DbM;Lvmu|Mz%TmPyv zaATonsmM%DLNr=Kaw3Qbw+fFoE!T}O>gj}v%qh9g1S8EnaTAb+=Q~?(TvXGCfK96c zdywHEXVNKz)`tt6zOy~QdGhaXJGh;9iInM*|3N#_F1<((zecwodSTtwm2pcB9b^}N z>G*VaM2NdOG;KEW+DetpgDeM?2_>g&&tY*Vht~-aHZ4aO0e=2aWjX^K=Bno>`6-uj*o#ZN9|`{Im74EcyHtfek9h@)2M5K7Ag)NNNh9bTJH?uj>lTZx_3U7 zMoJ+9+rCH^_1((;9o;`{MBVc=L67vg=FFlVgCiu?Oc+b;!2CL_X zm&LW@J!uIu5aR@`9c*1~?Q0u5yE|hoT*sGMa=KY-OU6cSA9T+c44N#QXUD6pX(QcP zO*sC)u-2>kfm$+Kpy#>YjJa4}`uh67g4@G&(9*bc+|AyFGmG}&0s}g$$clm>Sy2vn zo2Uo5JPg({Iy$=ZmBaz~qreK2bh%?M<3$Yxue^_(nVgo0;#`CDRn!@WB^{N~a9!jL z(bNnwnY?1%1(d=ma!s8cmz%c*krYt|6FzW@%gl&wyX8@K7WdsyskPSk$yhP(w|*Yq zXys;&XTOxN<+@Cvf`-Y^GQ)Pv0|YlqQ0{zH308G>1j2sYEusYNdNlbKFYYpIXFS}| zCcL-LcFe;t4)a~&)8mtBli<9`UQpk9HT>6>2d5nyQsH{lM+8UJrOCfac<+Q#zR0aw zv`__RUi>MKb!>_g$UgvLXOXJSE;(lEg*F(jGELX| zTwkslv=N>p?8+Rt{|324c=Z7926F);8yXD*+oFdd!10FImIa47dR072-kh+17H4(A zq8+OnJE#nVyL|2#@25N7-qzryyXRh6aP@s3X}YL<$3+32%bz?2&)rf!m+!p@oDo@l zL-|6#;4i@5FXuRR(?h^;5xrX)Kwa(2mw)=uj~UWSZfqa4Hhp8) zZ0xLG`t@jLQgja@F;wvD+}Vya-8=wQlLjng%!+LLC^Z{|xT$GIu}0y^6%c?NPG&4e$TO- z*b_4@5s*DS!pzU4tJe+BW>HQ-+n?D}apyNey(wF_@d*_)>phFiDy+ zp{tD?X8fwQB#e9`y~zRFm{?(At`Zr)oXc)^^DtH=R+$hY1Ek+g z*z!Gp*zG)pYO8-`F*o(LLPztO_7%=%`Ca+^u;h|4QMkRF; zoK-nDru>eJU{RWMRnb|+%L`|RvzR+X$ERpe;aw_W?@wOfcwaP&mNABU7@b$`FZq3A zR-vcyn~Fi{$#qN{vO5Ia4@kx1{Li3*b`5lvvu<#w^hpo=BJecbD$8N&E~dz3Ww_3I6E?n!zr zKB?z4eZ*ly^UrJNd#szX6dvbX++$7H`WB1t#ILt-rPKj(qMyc8e&Wy@9PFp0c#6b8 zzBnnIGr=zq{5NTmKfCW|3XrOC^_=p`e3>;2z606H_&t&4kF|Amn8`h-37^cr30x1l zbG{42vrSJX2vt(e@aHC?RA2tyayaISKpnIqVFV15U3j!VYQKz+X*b}O7DUk3**0%{ zcZFo&#S~PFDQlR_!9ujjwtVKVl~Tv#41GzWqkO>u;XRC3uMGk`)Ze=4yA<4o!;LTS zPciJrcY^{6&fXsCpY2)ID!b<&8%jS;yj{|)uQgPwr6ysLfcZ$tI!Kx){?h*rTTG(; zp+DvCsjk{{ZbNVSbPD~UU(0x_tIcwk_t$>_$e$P#wdU43^%3&V=&RMZ{^Rc5yBnT7d2;OS+qd@w z{yqdx8Fk1Yi;f%>XwKuukN0lf zy7kJ^rAz;mH*enN*|KHJ6T8b~Np#S~2DY$?ZPjKdkXQo%e8Rqc`xtk|ig8 z{q@(?fWN3O>a~PO$`lOqLTTPW(wuCgsVK=l79Keta#q@qsT{$s)qH zKH*a|fw=MG$LBtG?%dx?lqfOki!Z*&AKuibslf-n@QH6(jfgQ)W!$JyqY|4pZ~nI; zMT+#2q5o^bC%(ZT$6;}XtDroq4E(uZ!GfJ+Ag1);!v}l)`n5fN{McT+cwyvYQVb)6 zZ!oAjs|ZZ`q)vW?OrFd~j~?w;tXQ$0sm1+s@7}$$t5>g@)^^iGG%b@R$2Ncdd^>gO zlncsVGkPf)z#>WZ46un!NofN>AYtp)t&Iy8F5ERm%%7u$&zw19lP6EM9zA+kmo8mw z`SRta4a;`!+-bdf^|H>LJKKm6BW(BX-S+MT=a;ix>X` zlSvA`$phZIcW-Ojw5g39JJtby_UxIHryd5tYCY3NWo_HGwZ@Gb+xG3-jUJ;uRssu{ zz$P6US)b$-8UPiU`}gnP;k)m?YnWV}@(Y+pj~>~PBS&1T)~Z#@7A#m`+D+}{%a>eaKPq$F3SV}_4L`XVraO*N^8QfL5i0|yRFRChI(P^!d) z1Z>ZqJ*|HI`nF=l3J2P2X@osK+LvJV?Ac?@nl-altyMviUd-n+qZAq;K74!!-fs^>eVY(=K&=X%9D?km={Bb4zdGGy6BDb(V#Jg2fO+}QuTG(%Szq4Mk44rq07kGX@38a3@QK%YTj}%9KTlMJZ^9Ww zC11#orwj_MkCyjjk&8xP1gqrSsnrW0L6MbJVbm1PS!lV(d*7%=Gbj+i>gE9fpq`-1 zMsb*M1Q^JxhYzLDa(L>zFT6)y8Q+hk09FDp0&qh}H>P}%4W`rrCMB1`g)2wGZ=6Sx zM<*NwusZDgAQz|IE-#E9;T&fkArmW~R#srcRyesBYc5h7V+8p#WCq zKynXMs#GbP?ycFvDQC{is+Cd;crOHmeumtYyub)xQ7!`(U*PJXjEcDOIYJ&6qL6DpaW8q~yoWo;_=e7caJ1 zvu4@MnKNze+O>A+(j`|P%a3dXvAO`H^g)-9pY`=k2?+@X5P(An@%1Qe-YeH--KI~U z9t4lv$dMzhef##-y?b}#Yy~ll+O=!vhL*q~7Lfv2-PxP~K1lkV9-gl2>zfFG)2CMn zK#%8}HcuI(XOdLl^?YIzCQLB(xN-DmSZ2wR#hps`?%ivH1`RUZgDqMR0jvb@fdKIJ zUI(^wFn)xia^=do@#}%*>k&F>c~%=8yr^=3h71{Et5>fM-UY~W2I3~yrcE0+i8*g^ zIoh;olbdf&+2<#Kl>po-l+VSXU)wBKk_q)7&x=T{%F@594 zjqbkT1k(IS{x(=u{8p3_fSxZ-U%7JSfC_yRt<|7G1Jj#ky6y#3s1kYYmcgZx@&5ez z^PnE}{rdH@s#U96&6+iB&YU@}cPPgWH^2M$@581eFoIPT1mK2{cw;=h(qq!UBi&aC zV&cS!R<>+e2L^`_2Kaj9<@rLP<>YlSv1-+-S?=7qO;<&ux7Zt~^T=%3!>tO; zt_PHN0lc0!Z{EhsmoFcpAROUT=W!QAI2i!nym>SDoWg|G0nCY4u3XtIt&0{dvSrJb zxmOH$mfJ#w3OSkl`SV+@T)7+{`U5syZIe{?T0{WB9$+54S+i!%bv<{li+0hjSh1pw z8#m7MdX}mu01nBx>9yGyHt-x3bf0yy@LcQx$p)!cYSa1NSYo{Z8a8YgoYd$;U;^8! zRjY0&|3(DnU;xV7JN>*IK79BhJw|P1qABm2SVd~ru5EMY&UMb&C(;V;*s;TI-MZz9 z3lu2eo>iFCOO`CL(W6J3#0{lff4v zuSXl{BpFT(~KWM9c{Q zY5o|SlTNm7Q=%nVi9B6eR8Jx{d-iP81C?F7cFk64uKVTnZNel?3rjXP67R@(oQ&O8QZUsGE#eDt`^aHa_r$PkhS{ zFUDXIn?6MffU$-m2JY%DbE4iv|EjfkJCC{Sis{V-N;3Gt7B;bs4}8hQUD0z97{DSn zeTozS(kNnpF1)Ar{^h!O^wqI=%=z=@kKmM6W7$MFBZLmR*uWMxv5gPexhDcV=N&L8 z>z|?p;As&A=Z}XvRbJBheX9PU(RJz4rNgz_Y*x450SFThP>f>$ddl#WQHKn&=%9-Y zY+)1I(s?NIov|;Bck9LBpSq+B z)=9N}!GZ-F>cm+^cZl*3JZ01&gDg7IXSc@&wrCt|M;tQJNtHe(01V&+XE>$1AFB`` zKkIuC}Zp2vQn?fbBW#7pV8p;qVWX;&7FpRCYvTunLQ^>xX7{u7J zO=hek6(ajOe7)~E?>XQ9@5jCOInTY%dH&t=Bv@G(f;ogZ7#JA9#zy)!f2Qx>#m4fd zr=lDN7#KhRV|^XFP{!3kzzkK&_K?B@EFiKU_KAEyxG- zK>&r+s2ZI`NO1Y}&NyLD1cYP=%)fe+1joBM84~`7$Gh=*k^N|AaF|PYCa~~>TsP~= zID3iW`C!#_jm{>Rjgg#nW!l&ecSY+;rw1do%7eZd0+87C`u^8iITt2twXd2A660v?^8Fp`>bQnI`+O6~rl~xqsm)?(~vr+~lEmyWjZstO_4UDRvRSb+3%YyuDd zIZu9Wuh`2^Qdh9BQtagtoB@_+>n!whz+8LzYm;m(@`rl*&X$Gl!~!ZX#@v!F+_-@^ zM~gWAMbJ_XuPnm%W^N%Ot>A`W#u^uKPd+m-Eq-vjY~kgG{ee9?GRhp+%HEv=bWk{_ zGckANuUP+&?B9~ypFsab1mL?^4Z_=+ht5V5ImnxU0l-$jul?!B!qyRf>Vejf!>Wr) z-iU4+Lw8nfByJ$MQ^BFq*^!7jzSy;K$t;_r?{7<6dvM-Q54!2R!met6ofwNlWq~Pp zv5jl3lq`{>PJs0h0u5l9AP;bg5nuObnHTWHe-TM!L!3~@%*uI&L?Yo?Cj+!wwPII( z@4+tXhn`ESu*)~*2QZGh5h|8%15Q~3)TPGCJ9a;D3hDmYuIK05C2LSTs7HERqR$k& z1bO-d{R2pS{EBKIbyk@yW6#yu_9z~0cy)sCcnkaP#Z%aF z8+F%Vo$z4E4x18ZEJG)eNL;-BsP4ax3?Gc z^}Dhk5B)%mOA^T^)aXeX9Gn^QMei`J3~kAi$HvB(A$P@LcGsPS(j_d~@H$nDYdZNX z>osINickE!Sc&!{QdhRi?G9JKjOmG5;ZZ@T^W+qEmsykkiGx<*!Lsfq0AJnukChkc zFDBWdM2Fj$bvIDz8g?US|09jAq5HrfO_*T5Um&&TvxpKpicsBazOBQ_{P6uMLwb

    hRr##XK$SDuAq0(0PeN)82h291*y|-7;>30CAd-I9JfrE1P7s&%BWZE2;dX^bS1v zWGlHNlt$W8xNp&)*3BpebQHT#gSl@4AE;TQH)( zvwJkH>V54=Q17Q5$?c3V^8U5z`|21pu+Q7&4kQm2B-Ta9PdX8rgjhd~Vx*FpaDJ#KAIG3d#q<1l9# zOH_EqCy%yzXe7idg0xvb2Y3yj4x&DEMeZO6kw^@EC6a~`B8KoOkMgt) zPsBK&S)3z%GUz`ZLHP1FM#TZrVt^A;tc^<#Lwfun7d zE9UMO#A!XX-L?NPY9O%2>9E?chwxJ=4o$Vlkv;|M>l|;tAGn@9wiKGY6Ow;C6Duza zD_(PGsvwuFF><0YY-Y8*WW1+aeQA+}T*L*xPM@AcB2 z_%-sHyl;h?FmT1*BfMrBhDhb0lnLlVTva;o literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_superuser_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-mdpi/ic_superuser_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..f300e963f2c804ddba53ace4acca0fe89e0698f3 GIT binary patch literal 2895 zcmbtWX*3iJ7q-mUra>C}Zp2vQn?fbBW#7pV8p;qVWX;&7FpRCYvTunLQ^>xX7{u7J zO=hek6(ajOe7)~E?>XQ9@5jCOInTY%dH&t=Bv@G(f;ogZ7#JA9#zy)!f2Qx>#m4fd zr=lDN7#KhRV|^XFP{!3kzzkK&_K?B@EFiKU_KAEyxG- zK>&r+s2ZI`NO1Y}&NyLD1cYP=%)fe+1joBM84~`7$Gh=*k^N|AaF|PYCa~~>TsP~= zID3iW`C!#_jm{>Rjgg#nW!l&ecSY+;rw1do%7eZd0+87C`u^8iITt2twXd2A660v?^8Fp`>bQnI`+O6~rl~xqsm)?(~vr+~lEmyWjZstO_4UDRvRSb+3%YyuDd zIZu9Wuh`2^Qdh9BQtagtoB@_+>n!whz+8LzYm;m(@`rl*&X$Gl!~!ZX#@v!F+_-@^ zM~gWAMbJ_XuPnm%W^N%Ot>A`W#u^uKPd+m-Eq-vjY~kgG{ee9?GRhp+%HEv=bWk{_ zGckANuUP+&?B9~ypFsab1mL?^4Z_=+ht5V5ImnxU0l-$jul?!B!qyRf>Vejf!>Wr) z-iU4+Lw8nfByJ$MQ^BFq*^!7jzSy;K$t;_r?{7<6dvM-Q54!2R!met6ofwNlWq~Pp zv5jl3lq`{>PJs0h0u5l9AP;bg5nuObnHTWHe-TM!L!3~@%*uI&L?Yo?Cj+!wwPII( z@4+tXhn`ESu*)~*2QZGh5h|8%15Q~3)TPGCJ9a;D3hDmYuIK05C2LSTs7HERqR$k& z1bO-d{R2pS{EBKIbyk@yW6#yu_9z~0cy)sCcnkaP#Z%aF z8+F%Vo$z4E4x18ZEJG)eNL;-BsP4ax3?Gc z^}Dhk5B)%mOA^T^)aXeX9Gn^QMei`J3~kAi$HvB(A$P@LcGsPS(j_d~@H$nDYdZNX z>osINickE!Sc&!{QdhRi?G9JKjOmG5;ZZ@T^W+qEmsykkiGx<*!Lsfq0AJnukChkc zFDBWdM2Fj$bvIDz8g?US|09jAq5HrfO_*T5Um&&TvxpKpicsBazOBQ_{P6uMLwb

    hRr##XK$SDuAq0(0PeN)82h291*y|-7;>30CAd-I9JfrE1P7s&%BWZE2;dX^bS1v zWGlHNlt$W8xNp&)*3BpebQHT#gSl@4AE;TQH)( zvwJkH>V54=Q17Q5$?c3V^8U5z`|21pu+Q7&4kQm2B-Ta9PdX8rgjhd~Vx*FpaDJ#KAIG3d#q<1l9# zOH_EqCy%yzXe7idg0xvb2Y3yj4x&DEMeZO6kw^@EC6a~`B8KoOkMgt) zPsBK&S)3z%GUz`ZLHP1FM#TZrVt^A;tc^<#Lwfun7d zE9UMO#A!XX-L?NPY9O%2>9E?chwxJ=4o$Vlkv;|M>l|;tAGn@9wiKGY6Ow;C6Duza zD_(PGsvwuFF><0YY-Y8*WW1+aeQA+}T*L*xPM@AcB2 z_%-sHyl;h?FmT1*BfMrBhDhb0lnLlVTva;o literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d33ab295a0c9d0ce5d00604a1e35f1db43c6c598 GIT binary patch literal 6947 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 b?jCA5^*uVkldHY|I>FOa*Hf!ifg}G15?9#Z literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..a1598b53c060481fb6b925298f5b9291e0cb56b1 GIT binary patch literal 6497 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 b?jCA5^*uVkldHY|I>FOa*Hf!ifg}G15?9#Z literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_modules.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_modules.png new file mode 100644 index 0000000000000000000000000000000000000000..c209bcecc62ca8e0843bfaafd766aa98e6207fb7 GIT binary patch literal 6799 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_settings_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_settings_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..fe168e57b3894a1888856b58106db771917ce92e GIT binary patch literal 7328 zcmaiZcQ{<_wj3-$XUqo@bIV}X{s6k&&it~DKYRL z%O$jphewO|NLA^XKmL{lMY5e?z)p5{cF*7z68A;bhMr!PTbY-T9L(+1`-UMk=EJi+ zP3VZ~9ge66x5`38MT?kj*#;>>?Kxaik4`jvZ_e5wBFz9xD-X+sVm{B3H#}HtG*6+*@1-qIg79QEE-TN0z?FMWs zfJ{R0y9+E|Pmv7LWsTLr7KMV#gnx;<(*q>_ukX$MrQfiLOM_d)d=fUuD+B0$(Te3K zY638^kxrXDMBf3r0;TW#4e}_6-u(-fP2Njq1Q5omS>7F{0~X~|^aWBt*1(&!#cCQz zULU}vW3C0?rTrJID8sT`zy{d8#Tm36czq)RE87IxYT#QjG_8Iu*8opvmDTDoCSf1w z1Z{rR;%<%{w=Ckqk26ptGs@U!kt7Gu_1PS@?JNM`O#{mnY*{-z${0zd?wA1n3{cXf z`Reyt1lS}ls8Nr71_-f`#IjkQ3BU^<2^eBgGoKLy-sRsK2&96t0XP})6b89tUk2+jcM)RQ0Z&$(lH9mAO z1;@_i`hHXZBy#9Hl=8VvTclsYRkFWH9gb<>rgcB!C)rEDO;j%6l^VPS$+e49wSc0^ z1L$_Ekd-anjm&-VD-I%cHHtahaVl+IYin!Nj^-sAfRyB$W=ddgX?ES!4xgY&y}Z2m zEA1R94R$X812hWXkl@w1>U8@g>LOZmP_tuRI+{yt8^!DQ%*Ot|0p^oElv2g5Bm=G- z(!3=4zvPhYldj|q&gii_(%H2eb2)?q z=>s^?13K6CnOk$7tdj0*>wQVge6JRS+$A#N;h~bX6PB-^a1|Pa1IEFkx}IE9Q$wd2 zb(fbpi(Ld({xO`8#8zbI_iY^E3^BTReSJL*&et1S4t8xv&UnVf#nDNf7MEq$X)3Je z-$=5GNhsx0dp*R~KJo2Z>6|$r%$D(*gK48m%V4fvmr%IUzBEi|i6tzu%PAJGNc6!2 zZ@b?6RyQ8=%SEoqeXfZjOe0KoqSEU6b-U831$lw3%S6Q`v`U!Z0fj?Oen!lw|j>(Tz`gt_5Q^jv%$F5It5WDu`BZ2KXT%R?4-i!#=xUjdhi z?Y0-qBdsjBEluzV?F)1Qj%_>c(7$r~hv)AgBxy(rS1U`&pO)kKN+laq{67LEB;`KD z5RQd8BU4#LU*Wh>@F4SlEB%KJI>Kj7uor)}F3KrJS`x6-r7kiTY*~Ph6n&*J88&3A z$4k78T6kUoBWTrVx|BBC?g#0$j>rDzkq(z9j2i)SQwKu|pc_93q*Wn3HfU994=~vY zP0YH&u9Dn8`GkL|C38q~BKSCMI|Uh04=Zf2;@*&Mu`CtekNGf*><-nh9KCD~1TbbA*);cr>r2rdru=4OMgteE_SsI=X5xR(v716hr4FKIDgx90 zh;~E%l~6$vz!XdTh=vPXma2QB;K?o-`cRyRHq1T-9N#=DziV>Ea}c894RwEQMv8El zvItpw^HwqNGPb$%M6UEz@*?2N_{LQ?-jKS8&U8HP6zuM~j``;fCVePO^m*{2t0y?g?6^w{`fBW_IngD?}&|5xkOvo)LD2 zQ-!4OY<~rv_sS6UTKCtN(H#_9hnR6X=hXIDXWvLa-c};1$Ame@%V~=LMhEzV)}_Xk zS6!j7d&XO2-2z+1UWbl%#b1YQ=p>_k2irT=t91ySo@8`6$2xEoC?|4a_bHvfn-20$thiyWiKB(k(8JiBDI**&ESLFvpO0YY6Ow! zBHd5z&x`!cM_P&a_Y5a9DZ*%=4R}Wsy9kQC480-2m}VxSlZu>ruB6@-5u+#-j$M4N zY2BHg5Aafv*A`)PJ9v0Kux1k!R>O$Ko9V9*j_}esGgksbxh3EJTTD#sd~33L<=fQM zRE=I6+sR|3E+&WI+F{ao*$zR2J+Ex{%PWV=H`a))Y$@WxTWN!+an6aS{XAFq`fWx+ zbVR@3NIvIX@$w=g1obshMY}ytvO zGAsC_0tP!=ec8aj?jB4LJrimkzBWBTkjUhO`MQS!zu)PM7vnp@V(>VERF#is~!tm83C(V$Wc3% zuGG2B9O>!jy02t@&zT159?^|9Dkp(Dc83|HW#=+Fg7HPES$w+UZhB;7q~yTBKrrW_ zllBSqLLz zzz_f2b@$R`UT-%uP9V@Gt4NmP*SlTR@imbU#|Pgf4mW)`>9FddX#-vM)(@Y#K>XJ9Qnrs(G$uv z-1-%d>OOk1?Q1^x5lH&z;zt96JmkD<0?loPR)CtE3=i@2Da5>8pSb1Tni~=LxfB*a zj2f%Zq7bysHkQ$#qUc8%TeE7lkdWrgDA!bsGH;d}wb+!3W#1`d zFJwzX2ru!Iq6zaY_@xQSnpY|eWUl=_GxJ23QjUfm;x2h4pAj7_&CuuTD|~l1C-}*}>fe-luT@bUT(|-XE$c~PHp5!c0GEs2CY|s0GQTB&`WVbHudynrsdh?6 z^}>)?s|u8sOrI4BG7@loUQ-_Pn#)sm+AZnF2#4L0&?YRJ7`I?jM>O?jnKp{dx_r^UB{eq?+ zKIi&sLRM*fayNAin>OdSKN*W{KcdYqZZ0GgNEbVSnf5Wv4m>xyZ^oe0Z%|`B66nXD z7%f3^cGKw*l<5hDPI~~PP0xa*!wXH+u79D*C%uBd&MxB9*!r8 z`|!)}(~aXQZ2VPpGYW7sd7oo`SB8T7jSCDpEt>tdiyDZUn91sB z=Bfrt6=u}9a@ouXrc3o;G<6mGGfW6V&-2v!TmO>az-vp~{-dFx0ZTC1rtz$z5~u)J ziME?-@?}kVz7TqT)_KH-he!G7rWXK)6B;{bZbC~rFWTN5(p*^goSaBGR?@&P3}l~% z^_YL7;qH?fZTn~J`)!`Pn6KgT;^MxO%gf6v4K^Ocvxf6!8ZM;|bfP^>B}LMSyBnmo zaj#fw_Mnq|gL#cAVNV0v-YUSNCrXoeMiK|uxxVCq1*I1=4F|hpy;(n0E{YjniIH4Sz{ zE*)ZH{e=$j66Gp)KMIH{XLqH>NF?a^{ZJ7$2SWQqUWkChm)m-OoH6~rBG}ggM&J2^ zMV63zbFJqR-|SF8d2*92Qaxe3Q!SYTIuu?uyFk8b5SV4*p!u;J*^u0o}5EYITwr*!K>|Z$B()mI~Jl1W*KQ%6OY zzx@n3PV3rAu353iu>WLz{WaYy6w&#^VWX|WT_K#pv`it(>c}s1EZJGjV%KTOx$5ll z98&e18@x`u_+V@(Ql4FkD)uGy7PS4a{b@tjSBgvB?xwk?dXxR2oVXDd)NNa9wi@P# zk`xadzI#Gio2f zHA0vE{{A2c|4!!>zWR)~Gu5EJH%6iGC(EQTsBv`|T$X{~7$tK$OPr{yT}6E%>97n# zCe*2B!=*MaJ|h2GXDmR~BaPvi725TeB;%EvQue3#9Br7*aN5*YBLv){V?MF>_ zkU!@K6M{Lhu#mW#V#JS9j;=TAf?=9fiS1R5KTs89ANP)0Ne`t+* zUQWEoJN8J?snfBRmSqexo)IhE^_FDNnqy1B|bT+?!8&0*uw$NFm>PxSh3Vmzq z%l`E3X`wb(*vfmM=?b>_znLuu&S$EMP!k@)ek0UFcK#@fY-bh4w%HB^-r-M52uQDe zJeDLlV7Jj|Xi>J_D+mW-rpWCH4E4Jeq~H2E{&MGzmWVF6-{yj$x6TTt^i!G`xUexm zu+iyvX2u)Ps%assboOV-jwKyKi~H3V3-;ggUkYHRY0fF#J?0Yx#1Q1;YI?774McD# zC}j1mI#2@3CI4vfDAz$i;#FLFm(N00ex6;uoLfe#$|N4?IQ2-j9?DwNcD@1kzth~B zon=F?EkP{De**;vLtgGV)_n5b+_b{26fYi<31eS2^G832+)7WCC6>hN?+;+==7~6A zKBNUUKu&oan{L6v%DQr2VxIuxe)J+z#zm?cHCl5K7A>&LF+9|H%(b{|N)b2uDP=r5 z#Czb2d)|G*?%&0SVW#UOnmKffD}U7gG73C$0fiKYd1PUX>`9i}A|0&rk#vUoNFwTE zY`OXS=NTl*?7}G2flx;X#R+?VC@fL35`nO`UZNg5ebR~mDfh%uWy;ASFGZ zmQG#OCS|x}`Bl^4eSO&5+k3U>k&~T$NpY~(_9KKMb*pocjRtld+W zpu;@HkC8w{{85^;=(E1u$E(=r;r=`yLwNQ?E_myto-tPr21CI7HC9wt`PHX6tZn7p zqjpaNeD|3pe*`ioC)xSq`-y>ZPOhWJ6T#Iz-G0C2Z&woF1Q_Q_7OXF97}Zi$ z0q2g!U-;qUD{;Gj zDKwUh$biNv#pj><1Gl+_Rh8Y4@`Me9##iUGYi^Lo#`dzNmWrrxrFcqTkA{cVg8l zl`{9@CRSB(Wzd_&cU8LEK4q!`3PpSh_s%7V5Ak8gb=sHrq_bLGILUD422Yfh0AnK> z0QhNei0VZgZTSZcF-PAXIRlK)d*db!ean1qXzBAYPOB0q-43<-HgQw2rVbiStU-fn z|G6bP<9w~bK6MAr|Do0bn!tJQcG#k6NIt+Y-ml zX4V^O(n7M`EDq*^_!t;2G|4lMqm(F6Fy>!POY(p_2)Nfe!n7PGul{qt+#CD`?^68Yvm0-(t+ z0mqDXa+@N_h}#N&ep&(|kvDTbQI4HOi7wEQ3!ZLHNgh~gqhY7SI*Ck=^SMxK`ejp-o}V>t(n zOly5ZgFhFCdOU%Pp4HpBgS4&+i{^$z(aFo|oSC?8swujtu1K7 z;Jj-#_Gc}ivWlXo8h7<>sF~arEmWKUf=yGp4ttT}%{0O$;af6j?p~fp+NPPb?>i8b zewflonODD1vHk|mQ0KBxkqoG=p{igt@|QQga`Rtf9+C_(1Sh~M=6ANfmr| zH)hfFz5ljwAOD#(d)f~$YNK#AecUPl>^6U6;c@_Ih;jyRzg_?W!=Z%@6>SaZkk6$5 zyURiWfcO8IK9w7X;U`oOvL+9+@aX`Qyf|KMABNsotELkb-OWfwDyjJ>P!aenG4Dan z!}z+|SHOE14sIhZlfKh1t8q( zgMOhe`E;{n`M)h4h+ys|2z;TB`F~8{cCUf);`Md1u3`xALVR~)e2=e^1lFZmdvXF literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser.png new file mode 100644 index 0000000000000000000000000000000000000000..0e41874c62f2de6f566b688235a77684759e9dd5 GIT binary patch literal 6928 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 B8I=G4 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..826bf7fbdbf27dc424c4e0eafb43f727bd670ede GIT binary patch literal 7634 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 ShzbK5EOk{Km0Bg6i2ng~sMz`d literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xhdpi/ic_superuser_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..826bf7fbdbf27dc424c4e0eafb43f727bd670ede GIT binary patch literal 7634 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 ShzbK5EOk{Km0Bg6i2ng~sMz`d literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..64f994cf22e1b4bd1321d9b66c44724b5ed02aef GIT binary patch literal 11072 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2be3aaba816a14700b2794a6f9fd6147d4575aa4 GIT binary patch literal 11052 zcmeHt=U0-b+FPA$f#QF$%QWE~3iiSNB79&G1o?@`_dFFNfp z{Wmx#eH+YnN9^wIxFrvkUhnbIREjvjRi)^n?o5!;52=aK)4yc_3MlBO9GdGN67N5)}m02dWg=5i|A=gRux_&Ua&2D*a26ee_Vs6jf|j}9?nv0(y)B$V=>+R=8GXySRH zmUUr#qWTrsE)-`eNx-6#DaOFP03hh%1?KVP)^y4VZ+bE$f~B{A?*LT{2=Th_-Byv5TTN<7r&i4mk;+}l!NHqF3*=YkNE#^xD zNCWvwfLfUU4P;g&8)Tz-u8xY2w^SgIp(4P&XG>EJ9km(ugCp`kBjUs0gcMW_-MKy3 z&?l2Zmly&*84{8@^Hw6P#0Y523r-M%#C2OtyB4I;y{Cq1!&$NUM~{d_JtS-J_cE6d zBRwN6?IOo{%mH{6x(#*F%j2jqdOO2711R=cz63GM^rqZ;;xyUE0hw4)h*^Lok1t!C zQIes>d6hsO}eq+}MP z!{gmOd?1s_Pb1`#M>vr+WtM@BQ`GC8Q*72u{ua>W)8lRv-pxgpJ8vL2)$ixCEh+R* z<}R$v#aMoNFyQqDsUHrEi&!d8TPkOkX^*~8E-!QQ66WYpp^yk=A7hVuaeT^w8v{B0 zsgJK6vXo!my^O|8$1l&lp9pxi0`0d};ZlLJh?2R7R%38j4{m=A@JcRJqE7ASl@!4o zWlewn9Q+R1&Kw6@VQwDH=dwzwbY0o^t-uV$THYqCpwRXMO39ra%7j>y=d<7Iy;`ZS zrM}(Q^e@ja4l?dhJ*j5$pTKZRlhuimAXbEEvGFIh>|JOYkgy0ChW3@bac55r2NQXb z88{HL(ZNetLwVBL*}LXLh?^3fGHaAjAz*0Nou2Vs-hD(P9RxA#y9TUM0H7+mFX#jr z6gX5qBQLsh9don+%A*Seje|0qd~lSX(rsoniHhGAf-b%};)Nf_Fvtb4ySap z*9=wOhj`1bRl-;-=jMAm^zbC0nm;P+dq!)A00EBTM3t#`+b!Qu^0|wiaB-A{?(!q( z%v{Z%fWe1h5Q4*q9wNP=Q{qqKW0R?y70ODllGC;Lv+2S7$_j)sl-*hM-6!j2KR-fr z-{s9bZw`S1l5@RKoB2R&inuJu3y#X92*`WNbjg0LNv7YqLW64F&C+mV>53QpD}{xL zxqm2(j5ZA-m+iT8HcZaJ3jw%J`#bzR9>tVmf3O{Giz8JU1S|qXLH-@$g`-+6o8p#^ z&ja1?i*f`P2geqZlO=$=1qGOLhc3hm+*bWDbXS=(;&@VA_t}yFu63D(iQxxDRhR}| z2MZi{oWLy7Z4+vQN9K+{*US(t^qkH>EU)B-QITm==5Z+T5x$`|_W;MAV`NmOI<6#= zM_vksqc;}|yMrw7BeY3;rG&INMQOU?hiR978^d-%Mk-udTF-^3#^1xe_wktOJG!|v z5#oeLBUAwzO?e&-R+rCon=X9uepurLXU(wl^_4EFI8em+gh<6Ca=$Pd_A+impKkQ1 zPV{I)T=wx}W+<2|8D5$MuHzMd*ZqnLy)uesnN{VuOs!YX~jIonZAB5ms3FueSYnC(X=z_wxw%IC{Koh6_4;+ zbRj|U(RkWl4OTu4C$8mzFza{adOa^HrRt(2rw_5R#uV)~nXw!2uzwi)wD8Vd{C(1o z$!JzIILifZj!vafLrv8Zi+L3WnkVn`CzDVlE+1`ceN8IGp*eo2m$?66_P-X_CC@`@ zJW%06l}bOH1u3(y`N4yGL3MZHYZFQs=l2`eXm4~NcJw!0v-&-hr7JS@QBkS3>4=dQ}zk;wv~tdSHC#>!6QbWqXLrF`H|0q@LdnjxdUlZUV!M(W56H3 zOb6D)*eiiGobkqY$2R(?qP=VOO>VC2m7CaCd1zk4S`PI%Z4>qiUY2I+!xpIS_4)=h zJldl3y9wWOa8$sI{mjNzS^K-9$Y}iN`>{K)#P~7DJA=og^K}e82Qu3N6YBtER3_Y@ zdhg@>ea-k{o-SuI+OUUU-g7PWe}0h(>1F|ys>WhUk0d~27yY>iPOVzKeXSp5kko&8 zIY>WyUR<xZLA{o`xjzgFIgpywz ze#=ge?yFT_4S%U04e~}7Q>1a<<1fCV77 znJaUbV9EnmXNkG1*fe4RnNNnTsUUtACX5S@d+ug%NlKJB-t44Dm%k?BHAQkytN3ef z-GSy{NV0oEgNW>7mqe?2=%CgTMT~$GRxvj6qxD$cv!6W!Z{Edvw_MUBsCZ?UDaWMi zG&aS*!W&q>^*A_Xru5Ej{3RJQm9&$!8(a-o`$^OGQKpPm9R;eHH`L!zMvAA7(Y?sv zoe0U6h|_H=B?%>E0$?Yhq?EPl_>qq`qwlHZUN(;Nx;h>+*tvgfgpkbp^lhdkIUp~p z`_rBU?o0^5oS^7Reug5v5ic2|H?yw?54~m0c!#wLp(DY|=$B96&9S+Y)yS|ujOSnL z;fBR#sLxVdn^1Mp#1D4h$KG3VKdhRfKLR&;d5Vpq1m;(hA>Eo@SvNO z-@to8RO_rqnBA9MG%@76TEhbLS$z%p+Ki!u;{iuuc#AksJi#G>QE3Mz#`y76$vSnr zHuJSBcZR|vARtxjmv%vy%-yX`;}O`L(t#&Uq${Yv@J{7Zf$M5cqD47t{E8i=A`d>e zCyettxz3=f;k5;$PX#9|rgWztAr6k@tn+GCS z(|Me(^Rf{_Rmt{4im*X;>*C7gyg-hd<@$CdyZWlJ;uu|KPTV$)kT;we8Zd7G!06xi z<9fuj?BtZIl+a^d9>)DKo^SXUD}dZ2#^)b*Gwc|H%6$($`x8FcClF`#69?%jes2%X zI}Uu~UZJ%yoHQAOEz7`&v08qM8Z_^~sk@EPx?e^^ zoXJxMv{TG%mpopLu?h<`Z7)-d%-UPa{qd_{;Oo!nLZMp5JOc##gkL`aoh)jAj zI=?TU+UhORne|Q`&CoWcO};nKZSC#L9;JY6XOH{CJ+Yb=`|7Bx`&L$inrv-vK3K56 zMfF;o^)?Yp$F!v%GOsMgT=dC#wsk*cH-whQ`?hp)v9VDkEI2cbP9-y(x88}nN`uPo z=rlJa%hZ0<&4r0Vr2eBlXRos~Ef?pF^q)~2qVQb0r#*U|f5!V@ZfQeD`mNtWv}Sg0 zgQ0&x3))T8I-5Vpqo66;lt%#yB+F+a*qGTaqyzV19tCH-og4xMg3}x8ey(3)Y2TYh ztR<2f@)G$DUJUJwPhB+U`jPeiy>bLW_<+mfX8Aq^eocVvbO+<0#m=qyZ5)SD8{NCh zW>7n!4K)8>J*MYbnB$=f#stTDp~~!`(m_L^>l=l&GhG6as`Lpmj=FFV*R&Cu2sHt2 znIb!~1-Duq!UJG-zEa#yema*x8c*ijXM#HC=3cm2fWrOZ&f4wI#=)v87S!hZ zx0a2uO=o3KucBp;d`qE1aHm@q@trNJY1Hk5WBE)w8uL|BuMD+I?P?&|?o3nfo1Hf= zw5)Jvyit#4^!IM7&KyAkE+8{cdTVMLuk^CKbQNkr_V*sVX=E@UQ5hHh!`ULmYSs7_ z+fc%_wc03SXhtS%4m3{jTaaj*aZ``VyhqX3WBuJIlDGhp->TWk7r86Kb3GT%7q3@? zIUSND&*wq7A`}Aj!TrPMnZRLz*POlkiS-F&mQPiLNg4)T_5_#9%F&qj=Fzj--q1a5 zwt^2ngRcVhKJl(_`#23sQk{O{iVsP2UWR2}+c)!RACJ)3wlpq)%%tc&e76D(@2kBJ zW8BGkMvIJt_0?y$Nx3DHaFC4vMShY_#U?v3ja$>munOa1#5!deyAg0vj7WIiFX$k_td6=H)C@tY$TmAW^fkPG^?aUoced!_jI;VgopdRGu zj?52s&W8d3{S|JZHaAiPs6NFUg?_j_O3DfbqWe>HyuVqM^Bxx;S&@6^QqAVLX3 zxQVJ9VoGmB9_KsgTx_4LmEv}7#2p0QKpbzhrgKkl6jtR}!ZnSYvA^qmou8(W1T=U# z(L#N*g+|$Bd#*;lGr0j3!xb&A4%-3RwYcQ6GVjLT4zC%-j^dO>X4nzFmZcTz^EDpS z(H3K=OejGanu*Pu_yX_eK(LI}m@1^TJ!P#0^PY${v8k{+L8fu^r zx?j!R`!^RLYxrlP11<0Kt#@OFvh`?EL66jaz|5zc<{0e|?#VUPw-z^XuUwkUEq%$P zUvW&1T0zfrP$c|WOWL)dMT6IR>-0&|Q)_D0ZXfsFQHi#~p=$0+jf>YH-2wBp!S9%k zLNotnQ?Q40%(yzRB|f%dZ~jai)tTyYW*i|Ro+&p{C3QGciRg3;^O_O8v%Ex2`={cC zqR5L~lpDf(lbNsI=wwNJ^p@{W2G_QUmN9>x6-&fcS5jA2USxDG`-ZB&aHy238*{gE znp3KnNwSJ>d4zi+*aXAp(T%oWC9hq*miVSdF$Qyfv=!VEZTkKTOSh^GbPleUm$37q z-d5;Y>?EpqP93zmoo4eO2F49BJ zq4{;z$7oZA9WJi=nKcJRpz?$Hcs!t1@70#!&q_Ogm3IFhK3?xapQnZU9*LLtHqk5G zcFQ9Vh7TSL&6I{v&RM7kQ{~*nQv@uT&iGgKE-?`D>(z!QPmEFP+p_nBgY!aKrnvM* zZv@=M-=wjHH&-lo@Gw6NbZN1*AIYPCDHP}Jkqds&Jd%6HZ*x);{h7F3Uhi%~vJX`e z=^OXwwdx2fl|DuzGbFW?=fqgR;PIQ4Oe~d;3ncqXhyvJw!=f?KLL-y5blF>!r@p^_ zlgzh#R)r{=2T;(8FAV#rU)a&)XfLa`ND;hKz*C`imR-MgM7B}_Gjp_AvD<)JAih7_ z(xjSq?Vn!BQ46)fmPx&Ap}|3TJvr7}AvMub)a{2YEcFty^BAR;bRMXkM}&8IQ62-; zM@he_-*?_U{!q_`8@{xE=zdsoHoT3IQJ}09wh0B*Uh184eDxJRG_t0jV?CO$d$?Js zfEvmbU_K1l8F!G!3H_y-Ul_^Izt5~qNn~v)--y}=O`OQ7pNw|=lnLEpCOsuBpfPLI zc+@f>#=y9`|8Z8#U+;q#KjZg}rl-`iiakcaA=&9NzVlMtNsI6ozVLxj-szXAyxxXO zb68lm69;3I9>M^x&zo9aK|;hYB$Khi30Kj0OMbVRPnjvK}2^2?78y2VQ?=oXkl zI*K)BI8n*-5%;T0blyqR*q%1p+pQg;hCHIrgD=8O@V0w?K_)DX%h%OX}-Quij&dbHu(idUifRTdozvw`54#s1a7bFS@o% zx7ZB+=WZgXHWm^B9q^RqR)_m1ikw2$_pJYMUwkmhQGP-ZB$JXva=bIoM|iP%Z|aj~ zDJ0ud4{7O1ry%W?XD5|916bJ_VtZEXNd$gLwas^C^{vQdu(CC4rt2YCK<7s_|E@*@ zAT8FipJSSH$Jy#8FsifoUFrLq9evxPQVrZv9)M9enek|w4j%;6YIf7XP9gWw+`K#aQSoFpVxJ9l-Ip~_D#%xqe+-j&Q(z+o`cd(5gKP* zeOSPkqs!N4I5+E3$kD`KuOFS%RHu=FS&vp@~zbg!A?`B&sm`+q)SUDz^TXSs$-4ArG|rIuyIdx&_< zOpi((GZjU=zCGuvgTG{qZ=f^|Gr6w@G=9A;WO>J`Tk%`+pyq8|V*-tWZ1N#Sl-dfh z+3QDrYoLXH%B6UX@>zGiu)xS=2*qbNQq1=#}d&qHnPcnjNY&EdjtOzC#YwvNilcx z*djC>Vd@dU=|ANCw><*i%CMfby@zrWEtEC<;@bbq-$0|COGlAN9fd@G-ldu9220cq z)Co&eef9-=h->F*3dkCOzcf(RS(edJK${IsMV(fL5LPjdTxqjwHO=}?T!#x?`A^69|B zZXuWPNYW(_ays;FZZO~1qql?#aD6bn`YGN5rlnQI&d&pi`!i!aomJSmd#G?P*)9am z+@*bsyLU6EFoD}?r_EzE=b%XKXKYT_C?<_@Z@;D8keHLL%|JRYV?vB(Poy;MV|G)b zd$e1)yo>}fw#)w%=7;7wd~S8h

    Hk{>+11N??*|0Yx@&mh(b2Qusr{DDZU&Z(CKtcBZU_7ft%;t-vY0 zn;pAjW9Z2WOXi~c9&73fdlmOKNwNj0|BMe&_h{n0xI_KZ3t?KF!Ekw)hYE#%;*J_l zuE-(C%9UIx{`lpnDb{}+o)8Tq`5SApB9CoxNF8lB{k}(vI(VUW1ta{@jG5 zJ))8&H&wQuEgbUu`KF(?kMLOKu8)Kz|E=~1&eozQe7EzTk&wZaNyu3`&Pb&8Y;h82_cDMz0mS^*&c5KDi3Vrt z>czq<>}(GPu{reXw4(ni3YGlE4=Xye>H zpw*O@hX4A}CXG5luZg_Mw-|tE<@*m}kBTvJ6z7UMD>`GOT)SB@cu7|e2hpAt(NG$!5 z$8Px^AIO)WUmR)S&>9OS9Rd?G<|HIE>;KjQ*xVawu`Eny7xZai;nXrLNBw1Qso)IjgPBo|Fk|~A(w#hCDT^;-$pa5ssc$6-cYyin^L7xp%=|TjBIR%>|~#& zO|U25?6{kazNSi+6$e%mw~;d!cuJ7>(XJ9{m6cgi>un$p?T3xmeYjf}*B}4T{P4+J$A*bkTKrfzt|AzRypzop4>0<2Vm}S_SyPkK?~a) z>*>-SZs+`LO4Dq%*&4szs}C8%$Pw*1uNd8&KzOhc{E|<YS`Arvb4tabj;MQq?}j8!53PH^hUw>`NN z{vGi9QNs|CaUAu@;LEszyHF2HO7HHJdVOjC$eQnfdAI^go(-^)S_xh`B%wSXw!_o= zJS-8_C=anXH<%@n_<2KBEx0PB-t7jBtyw$Vx6gnx2VBkLOiNaKVx{}QEk*)sU(YWC z$|q2x1lKcVGok;8rxBp=0VuZFN6dg8wyN z*eV}t{!dh9a|I`9cRK!+1@m(4XAi=Skf$nKbeDr-NET0UFOt^4=P`3zVId&M8@zLW zQTIe`N(>HHGx|e&=lOBTJI{erRK#Km1`@>yp&8->Lp(Hu zK=bZIP_+F_eeYKD+ETxcSCm6rv0J5ApJah>p)LEv4)#1K1JrB2C|BU%;pz>|^3)$r zvZWjNFylbmKen1}QUqQU%p3aBlG!y0z2b_?ee8KB8NH&DAK;xRz`u)_uA4l&ztR`v zQ?0plrf=zb&;1c)?YFqO$8O!}rimuh&}`dj|26XDG%mSWi9r?cu^&%9G^Wz}hg|Xo z%r{^FMVUpP84zC!9TUBhHhK7N5B{v`;WVSJYn+lenABEqMWO$0>PYqzq*vt~j~I|* z!LCu?A2l$0tkv5fHbeiFJEOI?ytQ9KzBEsI9ZQc+mk&}8*FsHx*lQ(?Z2+6NN`7Lh zbAk5$#pYiCt0A1IpZ)B*3zcxuxT{6bHIWA8jIAXv+N~aV(ngGwyfX=Dww->@!~afI`PV9cer^|+Y^jMmr{`|d8)n%lky2Ny`FL2d-unm1N-#k zuG8pa$+2GKwlq5SJTcyhn@I*0CPb2Io^xLSkEL0m;PiW|iKuQt;&pHUU~NR)Z%I{E zFc1;Wgdl4wTE&4S_|Wlj-mPn@sI6puDHb`cn~O;nfWzxVaoOVgK`$w{P9zP0ebWLh zS_sZR06P~gjT$wq&w?2?E1&zBEE}vS%1}~uK>B51BI4Zf`CwHL+Rk0#W(Aclfy+A7 z6`zBhe>l3Jrk+(C4J+xrYr%r_Y#v;a_5Fyv?c4EEp#-F%x+;}udqBG9@N^`OuJqxk zO|f9|5~w8x9-!FIn6aJ)=`45>54P;fIX&&I>>h+M`3g`c$hmwv3 z^9dvi1Sz+TgOyS&^``$u?Y8YP>E?SS#veY8mKNTrJ~p_qC;=o!B*-p#$4zV1m<-UW z2(DQ+GGor-oE)37>-}{7A*z_}9A!G)*-9?=vBo;5(?XeK%co#)arJXpzWCJ14$yy9 zyu99blMS#;jnYnPaR>6+&(;Wy7zGFR1rL|426Rid^=(pBuGfj(xD;ZOm(X+Ak^$LYi4YD_fjfB~a($jiXN)t>ns;;&{qw6rFM*;ybHwPR8&ebKT^FYz zjd*+7)p-#bMoENIG#t-j9@>ZPy}=C0D2v@x_FjaCfeWO;d}bdaBq)&=c#^K&pl-{! zh6jXZajtFeL<}3$O_%+ zf0@B!__X}9c0k?{UwGxUw=y*udQ}b-DC>T30s#eSGno9s>nBt;#Q zKCpg8T8diZjU$m~8>w=dA=aY(ci8_L;lG~n|MEDTL-b+FPA$f#QF$%QWE~3iiSNB79&G1o?@`_dFFNfp z{Wmx#eH+YnN9^wIxFrvkUhnbIREjvjRi)^n?o5!;52=aK)4yc_3MlBO9GdGN67N5)}m02dWg=5i|A=gRux_&Ua&2D*a26ee_Vs6jf|j}9?nv0(y)B$V=>+R=8GXySRH zmUUr#qWTrsE)-`eNx-6#DaOFP03hh%1?KVP)^y4VZ+bE$f~B{A?*LT{2=Th_-Byv5TTN<7r&i4mk;+}l!NHqF3*=YkNE#^xD zNCWvwfLfUU4P;g&8)Tz-u8xY2w^SgIp(4P&XG>EJ9km(ugCp`kBjUs0gcMW_-MKy3 z&?l2Zmly&*84{8@^Hw6P#0Y523r-M%#C2OtyB4I;y{Cq1!&$NUM~{d_JtS-J_cE6d zBRwN6?IOo{%mH{6x(#*F%j2jqdOO2711R=cz63GM^rqZ;;xyUE0hw4)h*^Lok1t!C zQIes>d6hsO}eq+}MP z!{gmOd?1s_Pb1`#M>vr+WtM@BQ`GC8Q*72u{ua>W)8lRv-pxgpJ8vL2)$ixCEh+R* z<}R$v#aMoNFyQqDsUHrEi&!d8TPkOkX^*~8E-!QQ66WYpp^yk=A7hVuaeT^w8v{B0 zsgJK6vXo!my^O|8$1l&lp9pxi0`0d};ZlLJh?2R7R%38j4{m=A@JcRJqE7ASl@!4o zWlewn9Q+R1&Kw6@VQwDH=dwzwbY0o^t-uV$THYqCpwRXMO39ra%7j>y=d<7Iy;`ZS zrM}(Q^e@ja4l?dhJ*j5$pTKZRlhuimAXbEEvGFIh>|JOYkgy0ChW3@bac55r2NQXb z88{HL(ZNetLwVBL*}LXLh?^3fGHaAjAz*0Nou2Vs-hD(P9RxA#y9TUM0H7+mFX#jr z6gX5qBQLsh9don+%A*Seje|0qd~lSX(rsoniHhGAf-b%};)Nf_Fvtb4ySap z*9=wOhj`1bRl-;-=jMAm^zbC0nm;P+dq!)A00EBTM3t#`+b!Qu^0|wiaB-A{?(!q( z%v{Z%fWe1h5Q4*q9wNP=Q{qqKW0R?y70ODllGC;Lv+2S7$_j)sl-*hM-6!j2KR-fr z-{s9bZw`S1l5@RKoB2R&inuJu3y#X92*`WNbjg0LNv7YqLW64F&C+mV>53QpD}{xL zxqm2(j5ZA-m+iT8HcZaJ3jw%J`#bzR9>tVmf3O{Giz8JU1S|qXLH-@$g`-+6o8p#^ z&ja1?i*f`P2geqZlO=$=1qGOLhc3hm+*bWDbXS=(;&@VA_t}yFu63D(iQxxDRhR}| z2MZi{oWLy7Z4+vQN9K+{*US(t^qkH>EU)B-QITm==5Z+T5x$`|_W;MAV`NmOI<6#= zM_vksqc;}|yMrw7BeY3;rG&INMQOU?hiR978^d-%Mk-udTF-^3#^1xe_wktOJG!|v z5#oeLBUAwzO?e&-R+rCon=X9uepurLXU(wl^_4EFI8em+gh<6Ca=$Pd_A+impKkQ1 zPV{I)T=wx}W+<2|8D5$MuHzMd*ZqnLy)uesnN{VuOs!YX~jIonZAB5ms3FueSYnC(X=z_wxw%IC{Koh6_4;+ zbRj|U(RkWl4OTu4C$8mzFza{adOa^HrRt(2rw_5R#uV)~nXw!2uzwi)wD8Vd{C(1o z$!JzIILifZj!vafLrv8Zi+L3WnkVn`CzDVlE+1`ceN8IGp*eo2m$?66_P-X_CC@`@ zJW%06l}bOH1u3(y`N4yGL3MZHYZFQs=l2`eXm4~NcJw!0v-&-hr7JS@QBkS3>4=dQ}zk;wv~tdSHC#>!6QbWqXLrF`H|0q@LdnjxdUlZUV!M(W56H3 zOb6D)*eiiGobkqY$2R(?qP=VOO>VC2m7CaCd1zk4S`PI%Z4>qiUY2I+!xpIS_4)=h zJldl3y9wWOa8$sI{mjNzS^K-9$Y}iN`>{K)#P~7DJA=og^K}e82Qu3N6YBtER3_Y@ zdhg@>ea-k{o-SuI+OUUU-g7PWe}0h(>1F|ys>WhUk0d~27yY>iPOVzKeXSp5kko&8 zIY>WyUR<xZLA{o`xjzgFIgpywz ze#=ge?yFT_4S%U04e~}7Q>1a<<1fCV77 znJaUbV9EnmXNkG1*fe4RnNNnTsUUtACX5S@d+ug%NlKJB-t44Dm%k?BHAQkytN3ef z-GSy{NV0oEgNW>7mqe?2=%CgTMT~$GRxvj6qxD$cv!6W!Z{Edvw_MUBsCZ?UDaWMi zG&aS*!W&q>^*A_Xru5Ej{3RJQm9&$!8(a-o`$^OGQKpPm9R;eHH`L!zMvAA7(Y?sv zoe0U6h|_H=B?%>E0$?Yhq?EPl_>qq`qwlHZUN(;Nx;h>+*tvgfgpkbp^lhdkIUp~p z`_rBU?o0^5oS^7Reug5v5ic2|H?yw?54~m0c!#wLp(DY|=$B96&9S+Y)yS|ujOSnL z;fBR#sLxVdn^1Mp#1D4h$KG3VKdhRfKLR&;d5Vpq1m;(hA>Eo@SvNO z-@to8RO_rqnBA9MG%@76TEhbLS$z%p+Ki!u;{iuuc#AksJi#G>QE3Mz#`y76$vSnr zHuJSBcZR|vARtxjmv%vy%-yX`;}O`L(t#&Uq${Yv@J{7Zf$M5cqD47t{E8i=A`d>e zCyettxz3=f;k5;$PX#9|rgWztAr6k@tn+GCS z(|Me(^Rf{_Rmt{4im*X;>*C7gyg-hd<@$CdyZWlJ;uu|KPTV$)kT;we8Zd7G!06xi z<9fuj?BtZIl+a^d9>)DKo^SXUD}dZ2#^)b*Gwc|H%6$($`x8FcClF`#69?%jes2%X zI}Uu~UZJ%yoHQAOEz7`&v08qM8Z_^~sk@EPx?e^^ zoXJxMv{TG%mpopLu?h<`Z7)-d%-UPa{qd_{;Oo!nLZMp5JOc##gkL`aoh)jAj zI=?TU+UhORne|Q`&CoWcO};nKZSC#L9;JY6XOH{CJ+Yb=`|7Bx`&L$inrv-vK3K56 zMfF;o^)?Yp$F!v%GOsMgT=dC#wsk*cH-whQ`?hp)v9VDkEI2cbP9-y(x88}nN`uPo z=rlJa%hZ0<&4r0Vr2eBlXRos~Ef?pF^q)~2qVQb0r#*U|f5!V@ZfQeD`mNtWv}Sg0 zgQ0&x3))T8I-5Vpqo66;lt%#yB+F+a*qGTaqyzV19tCH-og4xMg3}x8ey(3)Y2TYh ztR<2f@)G$DUJUJwPhB+U`jPeiy>bLW_<+mfX8Aq^eocVvbO+<0#m=qyZ5)SD8{NCh zW>7n!4K)8>J*MYbnB$=f#stTDp~~!`(m_L^>l=l&GhG6as`Lpmj=FFV*R&Cu2sHt2 znIb!~1-Duq!UJG-zEa#yema*x8c*ijXM#HC=3cm2fWrOZ&f4wI#=)v87S!hZ zx0a2uO=o3KucBp;d`qE1aHm@q@trNJY1Hk5WBE)w8uL|BuMD+I?P?&|?o3nfo1Hf= zw5)Jvyit#4^!IM7&KyAkE+8{cdTVMLuk^CKbQNkr_V*sVX=E@UQ5hHh!`ULmYSs7_ z+fc%_wc03SXhtS%4m3{jTaaj*aZ``VyhqX3WBuJIlDGhp->TWk7r86Kb3GT%7q3@? zIUSND&*wq7A`}Aj!TrPMnZRLz*POlkiS-F&mQPiLNg4)T_5_#9%F&qj=Fzj--q1a5 zwt^2ngRcVhKJl(_`#23sQk{O{iVsP2UWR2}+c)!RACJ)3wlpq)%%tc&e76D(@2kBJ zW8BGkMvIJt_0?y$Nx3DHaFC4vMShY_#U?v3ja$>munOa1#5!deyAg0vj7WIiFX$k_td6=H)C@tY$TmAW^fkPG^?aUoced!_jI;VgopdRGu zj?52s&W8d3{S|JZHaAiPs6NFUg?_j_O3DfbqWe>HyuVqM^Bxx;S&@6^QqAVLX3 zxQVJ9VoGmB9_KsgTx_4LmEv}7#2p0QKpbzhrgKkl6jtR}!ZnSYvA^qmou8(W1T=U# z(L#N*g+|$Bd#*;lGr0j3!xb&A4%-3RwYcQ6GVjLT4zC%-j^dO>X4nzFmZcTz^EDpS z(H3K=OejGanu*Pu_yX_eK(LI}m@1^TJ!P#0^PY${v8k{+L8fu^r zx?j!R`!^RLYxrlP11<0Kt#@OFvh`?EL66jaz|5zc<{0e|?#VUPw-z^XuUwkUEq%$P zUvW&1T0zfrP$c|WOWL)dMT6IR>-0&|Q)_D0ZXfsFQHi#~p=$0+jf>YH-2wBp!S9%k zLNotnQ?Q40%(yzRB|f%dZ~jai)tTyYW*i|Ro+&p{C3QGciRg3;^O_O8v%Ex2`={cC zqR5L~lpDf(lbNsI=wwNJ^p@{W2G_QUmN9>x6-&fcS5jA2USxDG`-ZB&aHy238*{gE znp3KnNwSJ>d4zi+*aXAp(T%oWC9hq*miVSdF$Qyfv=!VEZTkKTOSh^GbPleUm$37q z-d5;Y>?EpqP93zmoo4eO2F49BJ zq4{;z$7oZA9WJi=nKcJRpz?$Hcs!t1@70#!&q_Ogm3IFhK3?xapQnZU9*LLtHqk5G zcFQ9Vh7TSL&6I{v&RM7kQ{~*nQv@uT&iGgKE-?`D>(z!QPmEFP+p_nBgY!aKrnvM* zZv@=M-=wjHH&-lo@Gw6NbZN1*AIYPCDHP}Jkqds&Jd%6HZ*x);{h7F3Uhi%~vJX`e z=^OXwwdx2fl|DuzGbFW?=fqgR;PIQ4Oe~d;3ncqXhyvJw!=f?KLL-y5blF>!r@p^_ zlgzh#R)r{=2T;(8FAV#rU)a&)XfLa`ND;hKz*C`imR-MgM7B}_Gjp_AvD<)JAih7_ z(xjSq?Vn!BQ46)fmPx&Ap}|3TJvr7}AvMub)a{2YEcFty^BAR;bRMXkM}&8IQ62-; zM@he_-*?_U{!q_`8@{xE=zdsoHoT3IQJ}09wh0B*Uh184eDxJRG_t0jV?CO$d$?Js zfEvmbU_K1l8F!G!3H_y-Ul_^Izt5~qNn~v)--y}=O`OQ7pNw|=lnLEpCOsuBpfPLI zc+@f>#=y9`|8Z8#U+;q#KjZg}rl-`iiakcaA=&9NzVlMtNsI6ozVLxj-szXAyxxXO zb68lm69;3I9>M^x&zo9aK|;hYB$Khi30Kj0OMbVRPnjvK}2^2?78y2VQ?=oXkl zI*K)BI8n*-5%;T0blyqR*q%1p+pQg;hCHIrgD=8O@V0w?K_)DX%h%OX}-Quij&dbHu(idUifRTdozvw`54#s1a7bFS@o% zx7ZB+=WZgXHWm^B9q^RqR)_m1ikw2$_pJYMUwkmhQGP-ZB$JXva=bIoM|iP%Z|aj~ zDJ0ud4{7O1ry%W?XD5|916bJ_VtZEXNd$gLwas^C^{vQdu(CC4rt2YCK<7s_|E@*@ zAT8FipJSSH$Jy#8FsifoUFrLq9evxPQVrZv9)M9enek|w4j%;6YIf7XP9gWw+`K#aQSoFpVxJ9l-Ip~_D#%xqe+-j&Q(z+o`cd(5gKP* zeOSPkqs!N4I5+E3$kD`KuOFS%RHu=FS&vp@~zbg!A?`B&sm`+q)SUDz^TXSs$-4ArG|rIuyIdx&_< zOpi((GZjU=zCGuvgTG{qZ=f^|Gr6w@G=9A;WO>J`Tk%`+pyq8|V*-tWZ1N#Sl-dfh z+3QDrYoLXH%B6UX@>zGiu)xS=2*qbNQq1=#}d&qHnPcnjNY&EdjtOzC#YwvNilcx z*djC>Vd@dU=|ANCw><*i%CMfby@zrWEtEC<;@bbq-$0|COGlAN9fd@G-ldu9220cq z)Co&eef9-=h->F*3dkCOzcf(RS(edJK${IsMV(fL5LPjdTxqjwHO=}?T!#x?`A^69|B zZXuWPNYW(_ays;FZZO~1qql?#aD6bn`YGN5rlnQI&d&pi`!i!aomJSmd#G?P*)9am z+@*bsyLU6EFoD}?r_EzE=b%XKXKYT_C?<_@Z@;D8keHLL%|JRYV?vB(Poy;MV|G)b zd$e1)yo>}fw#)w%=7;7wd~S8h

    Hk{>+11N??*|0Yx@&mh(b2Qusr{DDZU&Z(CKtcBZU_7ft%;t-vY0 zn;pAjW9Z2WOXi~c9&73fdlmOKNwNj0|BMe&_h{n0xI_KZ3t?KF!Ekw)hYE#%;*J_l zuE-(C%9UIx{`lpnDb{}+o)8Tq`5SApB9CoxNF8lB{k}(vI(VUW1ta{@jG5 zJ))8&H&wQuEgbUu`KF(?kMLOKu8)Kz|E=~1&eozQe7EzTk&wZaNyu3`&Pb&8Y;h82_cDMz0mS^*&c5KDi3Vrt z>czq<>}(GPu{reXw4(ni3YGlE4=Xye>H zpw*O@hX4A}CXG5luZg_Mw-|tE<@*m}kBTvJ6z7UMD>`GOT)SB@cu7|e2hpAt(NG$!5 z$8Px^AIO)WUmR)S&>9OS9Rd?G<|HIE>;KjQ*xVawu`Eny7xZai;nXrLNBw1Qso)IjgPBo|Fk|~A(w#hCDT^;-$pa5ssc$6-cYyin^L7xp%=|TjBIR%>|~#& zO|U25?6{kazNSi+6$e%mw~;d!cuJ7>(XJ9{m6cgi>un$p?T3xmeYjf}*B}4T{P4+J$A*bkTKrfzt|AzRypzop4>0<2Vm}S_SyPkK?~a) z>*>-SZs+`LO4Dq%*&4szs}C8%$Pw*1uNd8&KzOhc{E|<YS`Arvb4tabj;MQq?}j8!53PH^hUw>`NN z{vGi9QNs|CaUAu@;LEszyHF2HO7HHJdVOjC$eQnfdAI^go(-^)S_xh`B%wSXw!_o= zJS-8_C=anXH<%@n_<2KBEx0PB-t7jBtyw$Vx6gnx2VBkLOiNaKVx{}QEk*)sU(YWC z$|q2x1lKcVGok;8rxBp=0VuZFN6dg8wyN z*eV}t{!dh9a|I`9cRK!+1@m(4XAi=Skf$nKbeDr-NET0UFOt^4=P`3zVId&M8@zLW zQTIe`N(>HHGx|e&=lOBTJI{erRK#Km1`@>yp&8->Lp(Hu zK=bZIP_+F_eeYKD+ETxcSCm6rv0J5ApJah>p)LEv4)#1K1JrB2C|BU%;pz>|^3)$r zvZWjNFylbmKen1}QUqQU%p3aBlG!y0z2b_?ee8KB8NH&DAK;xRz`u)_uA4l&ztR`v zQ?0plrf=zb&;1c)?YFqO$8O!}rimuh&}`dj|26XDG%mSWi9r?cu^&%9G^Wz}hg|Xo z%r{^FMVUpP84zC!9TUBhHhK7N5B{v`;WVSJYn+lenABEqMWO$0>PYqzq*vt~j~I|* z!LCu?A2l$0tkv5fHbeiFJEOI?ytQ9KzBEsI9ZQc+mk&}8*FsHx*lQ(?Z2+6NN`7Lh zbAk5$#pYiCt0A1IpZ)B*3zcxuxT{6bHIWA8jIAXv+N~aV(ngGwyfX=Dww->@!~afI`PV9cer^|+Y^jMmr{`|d8)n%lky2Ny`FL2d-unm1N-#k zuG8pa$+2GKwlq5SJTcyhn@I*0CPb2Io^xLSkEL0m;PiW|iKuQt;&pHUU~NR)Z%I{E zFc1;Wgdl4wTE&4S_|Wlj-mPn@sI6puDHb`cn~O;nfWzxVaoOVgK`$w{P9zP0ebWLh zS_sZR06P~gjT$wq&w?2?E1&zBEE}vS%1}~uK>B51BI4Zf`CwHL+Rk0#W(Aclfy+A7 z6`zBhe>l3Jrk+(C4J+xrYr%r_Y#v;a_5Fyv?c4EEp#-F%x+;}udqBG9@N^`OuJqxk zO|f9|5~w8x9-!FIn6aJ)=`45>54P;fIX&&I>>h+M`3g`c$hmwv3 z^9dvi1Sz+TgOyS&^``$u?Y8YP>E?SS#veY8mKNTrJ~p_qC;=o!B*-p#$4zV1m<-UW z2(DQ+GGor-oE)37>-}{7A*z_}9A!G)*-9?=vBo;5(?XeK%co#)arJXpzWCJ14$yy9 zyu99blMS#;jnYnPaR>6+&(;Wy7zGFR1rL|426Rid^=(pBuGfj(xD;ZOm(X+Ak^$LYi4YD_fjfB~a($jiXN)t>ns;;&{qw6rFM*;ybHwPR8&ebKT^FYz zjd*+7)p-#bMoENIG#t-j9@>ZPy}=C0D2v@x_FjaCfeWO;d}bdaBq)&=c#^K&pl-{! zh6jXZajtFeL<}3$O_%+ zf0@B!__X}9c0k?{UwGxUw=y*udQ}b-DC>T30s#eSGno9s>nBt;#Q zKCpg8T8diZjU$m~8>w=dA=aY(ci8_L;lG~n|MEDTL9f{cb71PGW0!u_jluu zIWx~Z&)MhQ`@Ff{Nh1%YruO0rVAeh8<9 z=mi9We}-!o&7z>;WwD4CBOBC1_q_wMGOw(|Nt5DIOX3g_Nx9NC@$gY>L}@V)2(@(4 zXk*K$%aFTzOQ@;K&=4;`QYZ+iCMi45-Te3VP63?`zCOP80q<^Rd;Imze_b4ZTlls1 zYj~cgCA5X8G8*MAQYGn7P2F2n7tk+xsTOva8V)sER*jOP=SJ7>d|XK@sqbGSg8Xu+ z4JBB6bQB1|D@$PFJwe&OI74y0)McgBJ8WO2Dyss^aTzAHa!rWhXn(Lo zd^*LQ$L+u)fbt&9kSu<8xPG-iDdK)KQ}Ns2v#I~@Y>SX3x3vy$IzgA^>&yMg{Eg)f z?~|C7Ru_|2o8k8@_>8KCsEYkE@+4!*g~L@UWX*E<%^X8sk7x{)hZZct7%P&5yO^X{ z4a!KdQVibV8YGb3xIwYNzs|2ipB~b)IZS-oU*CtgKd4X$d*#el>(z`-=JAs)e|6sp zedW9en*n2!7U;COuHpMG*=6g?$;sW%SLu8zO-v?{U*QakN#xC_!0~pBXnm93T9KSx zQI9ZlKzPj|e9Gw}6dZZi_rZmY(0$8=xbsJ|egvBx7KkZxB8O)OHZ6W%JHFiFgu3>w zA6v(`)%kWt{Qh)Sp$_`l4A0b zQSg#;_^B4b^430$_G0~=bQk}tQL*$*DT_oiQ9sz`H}NO<4(6VzZNuyRc1E?lRimDe zM?O2E#r}b7$l4D)v!5huBuF-RnM)+ZWHz?7-#u(%hKQKS4EDIo5c|W^fK#FDwjPW> zS!r{7R!tz{pmhCFA{8hkxFqs9B6bF|@Mj?pH__0*;)fvalsPbM{07l5NIOCbom5lQ zbAJL~zs}hEq;Z(?e%Czk_b-(xe&gZk0=?PTMsCI-Mw_mrMr9T9bz%|m??f1QgAOw7 zU*D92!^>U{u@wopEH_%unIym7jfCAjoC$OlPGaL{4S+Rq*wbm3!emw^qx+n( z%`(E1jA%G0eLA#k4cU}Ius+|Bu~UtvrHiRmf!6-$MeU&@)YN6;#icb5JV{~VJJvH` zvvlpRezW*CxTTN(!kYJLa*CC9p&+wXagKMfBY&d7UcqDwBvYR>KN(W1zzPqEkA_f% zY-Spm`*)h=nX}zQ9p^3gkT!x^2R<$mk*SnVTrQHYAX(Wtl&7CIJ8Or3@>~7t9@FBq zaAt2rePa9exyc&AIU%XB#VaK}m)QhCb`I%pI^kNC;WC$$kP45;~D88hm;jfK14R>`pbDQn^c}}FGqpSQ) z*C9ot&lZ{dDSrr&s#hhkShtaa!Zc(HNsHs&(n4eHQ82Q+&etEOlgI?mm@!_S&bPT) zc*3`0L{c~x!(zALh{cN9FUc;lZP(sI>Ue=$4#}g?inebyLVHYRKdRM3jbaUZLcSd> zx74&BeaxTu`+H@w)n&!B!}DOuzCRi}>NWi*KJh-mw4c=48zx(N{zp@a9q9 z7vttP?n0O*dM@0>e}G7^?!NhUo{L8(PyeeSi-wfXV^`60geHdIlm@$aGyiDzQ!!1% z>=n%e<5IQTFGtWg;xaQ)ITdSY_F2<7C#t?#;lr z@Xj>wcgub_CMTMhtWo~k72tgGfW75YiUrUk)ucoxCc`ohPpQU;>2ZDR$q-VElA31b zPzHf=bJBIQ9_Y)8PbmL(smX5NLE=7_y_wlEY%eNh$N;YD z#X+>$&x(>fS2u(D@eu0=&&}8O5}QyYzj$0q7b4_!za8wWweye#)k0x@?G5g*7Q6le zUc30)Dc^1zATbl^znT(FnBLV4>S8`Z)mqw=)yz$zu2dE3!79|8rs&x1Dz*6*@aH`Y zb3iN@h~r$oX;t?3eC5!RDVU@kylKih;O2~io%BRhyx+IXwgtxyIlNixC}|U6jtz+Y zHm)}_A4c8S%tWS9ghG#glt#4gWtmI>m9tP_o|imZ^|rC~GHChuS55ZqZ?{mg0Lsjn zcZs}k9IANbCwBU!F*jssI~5x($-=Uy$NSLxk_a4Hzr(I3m)*M6&hu`kUCx%yaBF)6 z=JJeJKf1L2#Ahz{y3=pBAfay#$LsNTym-V1vdic~2HN1nXf@kO7=+oZY*PJmEUAv2 zG7(_x5M9Q22aK3xO0ngUB)O}e=SQxp4=n=MtYgN}IqX^P)?44BK6;+?pxRbB8iG)dGS)XMDTG_b5(FUDVlZ2<4+&KpeX(y0ZH>{}RWB6IRpD%>7a~AZ zPPGk)V>bHu0Ju|L0%ylaoo(RcFmD{!MHTZ)ELy9I4Yb&6hOrMBdjsw8MVsVDZ=k_| zaN-Yg4XXVpettM`WrW|I)Td(@J0-OU+I($wf385)%g-$a^d*k z*NAoxd@3VAh)lj{u~mbYq-IECX4%W2CxOO@#DMHQ%nx)e1wYbwtkm;fjS6v|UJ9?N zhTn~pVob8>bO^vQo-FH zw~!{;qEKJe6BJ4NYx)VUzKcj*K?9p@4PwKIs1nRGi=tRDs2#`UsIiHP-+f1SQ2am% z;!{r%nE)JHz*R0sf&07Hm#oK;`{n{^69?41EU_bXT)6~NE^>S2< z*bfkTvTi)`tu*B9u?&{9@tM{?Ckqk+eN)fpfZY@P3#K+5UPspRpUudsQd+QRw4H%B zZjztFQ|4sP*eK9Kb)NX4$FUFbHm7j$;#!%}^qV&gZotZrGm^sfe#q z>L5HM0cA*}7B4Fem+*d$jXEbM=Q>-pB`4e>_)q51LVa=S(JvU5`l5LfB`ou8UYE4L za%Me&I1uK0EOoKx;}PB|eMlb=#&LS?*Ul%_d^cQ(*}8%dEXElgm1cUtDfDads$V0Y zaH;e3m1&@f;P{&rw;rl$ZmNtcl*I9fv!`m09M1W&fE@b1FRgDqocaN`tqTZ5PZ|qp zb6&FkI`=&37Gg7BYoxD3OHsa4<+Dg6CeR2pcL_cA2o5{MEcKoKa4%8OjL&YAEMV1&$r1! zcZcQJklPy31%l$8z@uzpgn zshEEHWm!O*fLGAy_PoBDYn|FkTZ_O_OmTxio|}t*ZcCM@5Ba(ZK2rzv-<2sj(tk_W zD5g{waC^}yzN*Xk4wG^RYE80^)aOHBg294xc;-VC`X_zmCCH-^ZM)%;VHM#W!T;P$AxjXehm|{wIU1k z*?HrBcKU8^HvL*nA9d#L><}_V2Vu-i9dTkw?RibKxuf~I6}&&kzwS9FOf7-8BL5ja z(dB=&+MHw~Ww$CWgclK~48`GFOQ%(lh3md|M?mg5gd*X*UftbH-h0S*>t1@;Ws*=b4>lyL zcGD(vs^MyD4I-Oo^qXgV)6_o`*)nhFq~f_3*RsXyRDL_3m2G5FG>pjVWGT4rXESwn zoINC&nwXKJS&@+ySci&G^6uxqkxH4>-rL4_U&?o0;xJZBT}m9y7FGgnhWr!j1EZbcWZyu3Q9Z_ZwKAqZ0+a z76DT(r`a|Km#?eK*FpNb{>je~5b<|0_srj_$GMWiHnB3Cvm}-5>BHtrrfv_4dk)Sz z&!0lSkB<$B9Ij4Ve>cMR{XbZMG2=T)Lxr&zR#qKO!|0Cxw&WL2T^y7%aX`mJg&c%C z2pJn;dk}_=urVb4wjF$3bMrG6!CLB$PCpi#dT9X6m&$ryAz7%SA@)aPaBwg%qtQv= z*H?F&o4awY(A)85Y?B0G$As6VEl1-y@h`}ieCAl&-WW24eHJ1r{FpP zKgF;yv?I;s?KC&zOtt+rH*?mLFH3sy+v!E4Y>-3BY+)?b8O_OF58S!a_w#MtcCO$4 z=wHEilF5Vy;FI|XAjy42sRBDymI?P8G z>(FCnFxIMBOc_V(8o!P-G!gSxOn-0Z67bEmG=<8k|4*a9&vnYcQ!De3TRTsn)JDxs z73k%XRy1yIOOKV8(E1aCWo%vPCeg3EIkU^D&K|oS|E|bqO|L1H_6*;$GE-H<_VV;| zwfBIs{_i5L>#sQ}gCGi|d2x$bE#5tu7WRxTM6wHF%nfGgEVdDL1$JD?0eR&%?qD#A zWZ~VP6Tu6VcEvBg7k8L#++}xPi2js)unTgU&Hgg4f3iAgY%-sl-88RXV^+_S-3(Z3 z@qA}+1#~H7?W0HV_6L?E6zf6d9t@?tT`bw5F^v}<>S@^rp}-`(normt0}EaC<2r-QS?vP%JvF^GG>6GQ7T$2KPv2d=KS?M3j5*mRxx`B(Y;i$8V`#a`E!ct zb7+EUH_hy)t-h=KvraBuLMJUj-Hh+e0>MH~E-h1LwJj`y%c^!pMUSB zXAOlDQb1FhIM|^n%VlL{0rcBYVejLwTxJallzy9G>I{EPUua4SV~r4KdBC;oHfzX9 zkv-%z<;9i37JHh#G$)0=>+aLReD;3sl8)?eVDxXQtV2LF?@}DUj2MqUCeK)3P;;2H zz9Pa+%N>620-=h%rkn3&frGUWU)rg1TGT5ek&m)KrmUCEco5nsUPJTy%BbCA$bz zX2gQ71y;_xJ7A3k+s(@Nr3lUTlX<@{+te@zlg5+^+qdJ{uzWxGuDG-j{9*M7AItox z`Mf`AAmldI}zQST#FQQFC5iO1_`ZizRpBYY6qjB z*VoriJ2}&6O{Iid+08b-fp=t+jo~*^H;_Gz?KJmp3B))1xb-sukmzE3fTNI;s0{JV za2AJ&HHGBc-ETMRE2=;f985zv%q$VFzstURv@AvWOW+}XH)Cto_xbTW6gweu7uaqi zE}>))Snw_Zg@=qseP_n^bg_}~t8q;qNDqG8PY2OUfk@kFT72}cq*Z?J%GCu6_umXd zeV}dBa9i)nHC)8|_{I>_9-c4YGImmv+Vzs~<2wQkPX0-a&^sMI|4UoXA5y3c33#TX zs*2Kk$};h<^)pOwmCdZq6>ftFivx{ZmYaDFj|r=|M{g+E*fRzZ&Dp;$rhLx$xQZEp zF6-*!3;+)daULVQGI#t2X5N|i>|DtmW9X*xVjhCUp;EoW996^uY`q4RsrTZ zcO<>>MHoWj1FRp?Is9r`NQ(>-pvnM77P4K62-QB7SBRUrNE zYD{D^Y2x>h04?kG_DsVji35Qpy;sJ*gIoCkCdN0k3IQt!_rZYdJZ?f8QZ| zKq*;y$zj}_F})9Fo3k}1;BzQ&kG?-k{ySJCPo;@+3z2yEQAiIV6JX!TK7Jh*48VpH zK*e?YIxO4SOaiuzSKafN{rN6V-Qp=O$WTOza_8Xo-Ma3UUSY}VLL5o_&7mJkfg1zL z_`EIUw^$TM&rawfC{5Kl1k@*m);hjCroc-Vgw981*d5d!sAq7eSv^QC05fM7bJ`>BMam=;YO_R%y-DEfhVmF9rHX73zn)WL2A7!R?| zzkk71?1d{X(Coc?AxJfwnULnrFViC`u0pbWg)oiEd#Q=ykJ1%Ec3x$s#mAT`eacG-AH!bn_=BDTQ+m-}U%bV1-P|}9Czp8KKXwDK|;17Ut z^{r_GtKBDeC)EA(7bX=^{Ba5*(~62KP|k66c)?G&{tpZ|W7; zelc6F01@=mZ#CB&-wHf(E1Fv%iT(O6j83#IYEqJ*WYcG4O_xce^oDyOxipC%inc>n0l9r}nbq>5)^IaGx zc_PngM`UU<1zUtZ{>eN}Bf-$jxp$~7g(>6Ssy1wd+_!sTaQ3%+vwQ^7Rr}3tE_!%V z{N;qlL(D+$<@!Hpo#b~jY&X-1e(ceZ#d1{#QwFbQJCARqyKQ80&p zRI&9g7ohSLl>UN!O}k-uUy_ z{DOxE+B+vR02Y#1E5+-sm$+qyIXA!l0h>ImZwG78dt8l_m`8mrzD zADj&;P=L*qc9TUDbu8TJ&W`j&W0S4=eloh+YDMUBhPDdLHHym?Ux#sGTuN0Y@?1R3 zGGv=-pH+=n7CIkX@QY`MbQ9qs4TKLxHH-m|sEYiqTXv~$be+d0IQOxdyZCxHT|=Pu z;nL#yNB>5IJGhG(R)8m{Z|BZlt(bYsyVuD?BZOYBm~6?E7-xs<`T=ZrJF?>x#2L(Y z4=jtwL&M&-h~-_W3sM@bw}a{|_R|;MB$1U*OFVbo-fujgsjJTlVdX+xx0}odI<(ZV zBXc7>8H+e!_p}tJGX9#q*7R+!h;c<%5!=`pt9+j-d^DNTq$Sv;c3eYn0@>qT zNqtFrt^#Ff@B55C%vu4&WORQr`OPe$N~%^?KlQY54fN?1g`9s*QlO7V`0;#9+1Oq} zvKvE#MaC1qAM6{IB(3sV8DeZNf-YEgI}5;zdzeDGUQ|_0?n(^nk+yN$-g%G7q9k9I zVi1v`mzB!IbaWhr?5?L+nZ;gFj5(4iZ{5OfYilJg2JroR#xDQNz5?*ird1vbKNDm) z`390T0-A_-0tPjQ979>kP%n{DW+Cf*}2y88q0 zYdj{d4QiV$=`hBtX_vK*mei`n#}#JsSosNLWq!4FRHi{uhyHeSDwsaWv`xRvkQgm| zIa=FK>WAPohX&BoJ}wNFh;sS|#c5pB9Yz-CvcuZ%EEcy+IzTg|s#Z|>xG4^NCUx@X zqff<`1+`gm6ni{6-Rpgx@&t0Ud$7I__F17~?oL zLMlb0NG6Z6sccMh3N=QIKHgfKoCh<^j%%xhFZTIp|)U#UjA zQUVQZn&a%pq)ahFN;_+8%Kd=7Oam-Pxo1`Kg(fkEBGVRwE*PbVnPGI42U70djqivQZuLns+pAQ&&sM`BFX{-I&fWhGqg3|Eq)qCAx>b1Mi~_EcEKZV5c@jdpOGeH zR}r!5g5!-(qjCTWU7}eE64CGDXV%->hn@XkT=_@!Q8ft$0nz*g0Wa$8~gk!I6V7D(Rcub4oY?*>^U!_x{CEW-=e zMw%b$Dm~nHci4g$y8~6O>7Wlws8pCDcVn2PwCNyPNe~6Dte5hEg;~(WAe{pcr15+K zE?;rql*=b!wb8-9BGto7`1mlXDZsW9rmM1h0%$IgnF(wVs>uSOE2SVt;cbatTd2kb zhd7w_v)?#9w3(mu6W`Q)x)i<2bux$P*LT7y+r|yJ%zWs{Q6s_PI=P=9Ed370l{#oU zSKb4H@He|7sr^yUnb6I?82F3gZ4)blknva0LlAD2m*Q^OfB{78`Uj%XBSp9EXj;W- zMWz7_C4;|2;mzkfey6N5TpKMI&fUZ96}FuY2BBm$&n8(=WWB5%Hg!-e*F}x=K;{ZB zHns6D^}~!2hHx|7KZiee1`Pm6nn#F>T4O035#jRb{ycx2t4Fj-kdNT&&K zL6*uuc9;eXTl@tFIwkZRM$>JpjjLsEQaBO+DT6WPFb9p%QuD9|V1aP5$zqa6$0k(E$YNFLKOy+sOH_8ve53Gn`YxysPt_6}f_VR5j+(8z7J zpy+>#Ak&UH*8nSEQXmpolG2xHowBum>3rJ@MSuW06Q^+TW2Go*Br3#%!SB+uCVvM1 z!a)|B_*?jra5Rf8KET`MbX)3#5k82OA*UuvGe@W8@4oQ;34o2liuxik=jXdXc82SXA62?9o4EXCAnH-0?H>-V&v!G~P5K|x;J_Bem4 zVVlorm6{0zm~)EY6>A&kq{#}cQ^;%92AiFK&HyE-TG!V>h$Lc0)=bNdeZzE2()+P5 z0(BY?lbnlr?6|*zG=6E2t1#BxKwNy0Z*Ah7SXZHUI&~TW0iIm-b2C+Zru${Is1B|q zNKT7*kOYLZ^xEfiG1-=;=A5m*i`NezcJqylr<)^|FRO@pqyP6J>c$l(Btad?;Rr)F`N%q+pl0h%N1@iYobWVJEIIb?JN#355wa?mIRlo2*3wNs)q*(*)_NbN&=G1Q32c$W2+?@k%8d?HL; zrzB2lznrDm_`0>veoGNcNSCfM>GUV+WduYd{}cr3fIT13`XV?QS^6T9&?!#~GyAiy zb61-vB)w!o2;hNUVrnG2A6OyZ2$p{UVvFIu%PXJuG-5WUsFl~v(8%p6o#WIZ`sn1obndZ2iRBD&dC06l zSYc9VAFu&o*zIiFs)x$-OLM=iuqe!zocksbrk`g<1QGs|{5V578sZYg9O;y7_?$oW z^}ip*srJdDUE1&kO!0#1MWX(T0PzDO zksti}s+ljmkw^ZYF6f_iyyh*~1pgE@!?nPfRT0!IjeC)*#+ahwcD%urB6$U-PFYM} zEa%3Nw-zwwQn_?11{6t;1396Cl}!emcE$%zB(GZep#MZoL&PL(Hd&3+Sr{H?T)_f13=TA>VWNxY%ETMl6ibGxD zf~a?#of%1M(XNNFpa1WJ7?n@_yeAexCYJb!sDLzydeBqiU z3|Bvlet#H0b;xPs7u^{9{t1poI#e4L!O?);+9&^(t5Ub_yS|LxHm;;FL1JmIB5{Hk z&Q27?{Gv=>fDxJhC!J5~G8#gA8I&G_9!ohqHUT|PcPBdsQ-z(e4tYyEMv*(F5k`_C zwT{Xw*HRYON*jkz&cn$6_Qw8rFSRp7+l7r79s}sd0A~XI#d8mFpdip3V1eo~B_gBI zLbteShipk5>IX)MsVw0w+9Vwz03CEbMq_2$>GL~a^j7v$$m5;a-_tMCe}e%~YiO!S z?4CkM%k1i6n2KylOuyF9>YacFY|GCcb4m?<9#i|EobO794I!~(R-rha0lWNUbeTmB z9v!>uIs6|XASu@I={1qKjkR-PY9p`x(0gnsfqPhli{db%I~FxoL@EI>#8Nde-kpax zkU5YQ2jO+NB;tn!4)ZR*J%F(lQ`2{)61ke-a}xuaZmw^z@0cr?^((P>bOEDgr>N$^ ze|~-1Yv3gr9uHrmJ$uswQ0gZy*$o@?5Uo+E|3Ab20OB4t7Zs|t!y1)r&i)U@j)&Ap z(p1;lDGCm~#Kf5Y$G#FDsItz*@;0gDTZY7sy*ZXOXgs__Lx;pvObw_=1>xoI(zIuA zzSvLRHHSVw&HkIRlRFQ~5-5cMiNmx1an&dDm>m;9f4K#8ZKC%L{W$kVHTreS&CW}g z^peJYpXkc5?5bqUmPIC5BKjbD(jIt5Uyn%yd1C+qj-1(uqi17b@LJqh;BgI zHCD1z$S0!f#AMNS5g#dT{@lIiy2mRt&)1Y#1n< z2$Vrpc)uEy(dluq7z>bJl`QTcyhnbmPeCcapco?+LOjhSlMnrSlwgSfxDfK|F!f%1 zI3NwO7%tcC;7Y9ffjH7uO=>~`LV1m{$xI%-15zKzeXSQ(j-YOUi)Z(Zv^TBwK0A$9`&yrQ5_P`JDzkvb?L^Q0s<}UZ^C-4tQNlsn%v$SRS{{oLF B(p>-m literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..c88f43c89f64a73ac8e0d92a80c2af2aa0dfec56 GIT binary patch literal 14358 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 ZL1IZ+Li*Ow;s$z<6lGOpDy2+A{y!DE-{k-R literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_modules_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..c88f43c89f64a73ac8e0d92a80c2af2aa0dfec56 GIT binary patch literal 14358 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 ZL1IZ+Li*Ow;s$z<6lGOpDy2+A{y!DE-{k-R literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..296b1f6586493f94473b185f5b1fb837ac7e055a GIT binary patch literal 11393 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 Hng#toOrYM8 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_settings_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca011b534a795666e41bd82f3de86e833eb23a3 GIT binary patch literal 14132 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_superuser_foreground.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxhdpi/ic_superuser_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cc6a648b9e31aa12e2f0387c41bae7603722f2 GIT binary patch literal 14969 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 z zwA;{g-!f^^q$3VL{BV+LtWjKvXQ*rj=wyA6_NaT)96p+az zusq^J-(GFC)e;%_iHhzfDj8y2l?1jRa=tGzxE~Cms%*y9$~s{R7$t_lW7IF!#99wN z_~1lsmkhJE)6fBMmU0P>?NWu(F@n-mp<-_)yhA>{9}NFM)tKB(;`Y1klE!F>>-_W2 zH^h(MK5K-CAL9P(XFqE^Et_nzi3wCyHSjw9{O3PUPCfP1Z@sngtSDK>Ko{y7M4XWZ%8xb@!H&G=i20uA z^3g{hov5u+U5}G{AK3#>D9AW&gAF$LRhKGMx;;=91GuV>A%0GOwdR>Dop*r^Bo|(IVe*GR{2}*QvYyrb z4*TVZBaSfk5O}0^7*bUqlB%|q%C>))VuDhFWX&=_Q1yA?g%`%?RGH8Yn+PTc5l?_ua>5d?%TbZT<^@y8njx041;fNkI! z^^Fq0eQux?!tEQopw-5)n)_WQH}Vl$+eax?C|#bt&}(ay0fMTJycFBX9e7qN3)QLt zoPjXl>sD!w?hVNz2z>Rs@4kDo(@r}XUwx+y+`2FU1Z%NM%`yPLM;e}R!U@JxMEsyt zLu+|oIH57ahYv^8Ste*&6>5e7tOV$WI(+9l-&si6UFXSw+Nf0<1tH++IrPv&6N%1T z;>Z83nwAFo(5aAOcdsE-o_~y8 z0%VOafP4B|;z#$NUB=2-1%Zxg)dq3$31*#Kam5u0QoxSTizZr&v8TSdZ5Ie?bPxah z=RX@Yj;M0hC@LK|{Z*RM>{p$x-}E!cxpKnNOD}zfM+&&rC8D>lQ3miCzH4^W|0$ld0}}wKlcaAM6G*B*FF5@{ zTW+}}uCJyI;-U;-=UbSwL3wie3qUr0vBefUv{l5!sgM6UPwl~≧VT;NK69SoD_B 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 VCHl)%}#SLG&^d0PBHROshcbgDU}gluCyQ1dO{^ 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 RQDebqit?&*l`_Vm{|7v=(ntUR literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..debca7a17eac48d540f89fd3afedfd023ee70a93 GIT binary patch literal 15421 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 RQDebqit?&*l`_Vm{|7v=(ntUR literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_modules.png b/KernelSU-Next/manager/app/src/main/res/mipmap-xxxhdpi/ic_modules.png new file mode 100644 index 0000000000000000000000000000000000000000..ff3a30f43a0884e4808353c6837424c8b117ae75 GIT binary patch literal 16951 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 VNXq$D0{jK*zLMIVd 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 + + هل لديك مشكلة؟ + هل واجهت خطأ أو لديك تعليقات؟ + بلغ في اسرع وقت ممكن! + بلغ في GitHub + تواصل عبر تيلي جرام + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + تأكيد + تأكيد + ليس مثبت + اضغط للتثبيت + يعمل + ألإصدار%1$s(%2$d) + تحديثات: %d + غير مدعوم | غير مدمج + نواة غير GKI غير مدعومة. قم بدمج تعريفات كيرنل-نيكست القديم في النواة الخاصة بك! + إصدار النواة + وضع الارتباط + تمكين + تعطيل + مفعل + معطل + إصدار أندرويد + إصدار التطبيق + قائمة ABI + حالة SELINUX + معطل + مفروض + متساهل + غير معروف + مستخدم خارق + خطأ في تمكين الوحدة%s + خطأ في تعطيل الوحدة%s + لا توجد وحدات مثبتة + وحدة + الوحدة التالية سوف تثبت%1$s + سيتم فلاش النواة: %1$s + ترتيب (أ ← ي) + ترتيب (ي ← أ) + ترتيب (الأصغر ← الأكبر) + ترتيب (الأكبر ← الأصغر) + إزالة + استرجاع + تثبيت + تثبيت + إعادة تثبيت + إعادة تشغيل + مثبت + مزال + الإعدادات + إعادة تشغيل سريعة + إعادة التشغيل إلى وضع ألإصلاح + إعادة التشغيل إلى وضع الإقلاع + إعادة التشغيل إلى وضع التحميل + إعادة تشغيل إلى وضع EDL + عن التطبيق + هل أنت متيقِّن أنك تريد إلغاء تثبيت الإضافة %s؟ + تم إلغاء تثبيت %s + فشل إلغاء تثبيت: %s + هل أنت متيقِّن من أنك تريد استعادة إضافة %s؟ + تمت استعادة %s + أخفق استعادة: %s + الإصدار + المطور + ID + رَقْم الإصدار + تحديث جيسون + فارغ + تفعيل خيارات المطور + إظهار الإعدادات المخفية و معلومات التصحيح الخاصة بالمطورين فقط. + تحديث + إظهار تطبيقات النظام + إخفاء تطبيقات النظام + تصدير السجلات + الوضع الآمن + أعد التشغيل لتطبيق التغييرات + الإضافات غير متاحة بسبب تعارضها مع مجسك! + تركيب النظام + غير متاح + استعادة الإضافة + استعادة الإضافات من النسخة الاحتياطية الأخيرة. + النسخ الاحتياطي & الاستعادة + نسخ احتياطي للإضافات + نسخ احتياطي للإضافات المثبتة حالياً. + استعادة قائمة السماح + استعادة قائمة السماح من النسخة الاحتياطية الأخيرة. + نسخ احتياطي لقائمة السماح + النسخ الاحتياطي لقائمة السماح المُعدة حاليا. + متابعة + إلغاء + عرض كود المصدر في %1$s + مِلَفّ تعريف التطبيق + الافتراضي + قالب + مخصص + اسم مِلَفّ التعريف + تركيب مساحة الاسم + تلقائي + عام + مخصص + مجموعات + قدرات + سياق SELinux + إلغاء تحميل الإضافات + فشل تحديث مِلَفّ تعريف التطبيق لـ %s + إلغاء تحميل الإضافات + القيمة الافتراضية العامة لـ\"إلغاء تركيب الإضافات\" في ملفات تعريف التطبيقات. إذا تم تمكينه، إزالة جميع تعديلات الإضافات على النظام للتطبيقات التي لا تحتوي على مجموعة مِلَفّ تعريف. + النطاق + القواعد + تحديث + تحديث + محدث + جاري تنزيل الإضافة: %s + بَدْء التنزيل: %s + النسخة الجديدة %1$s (%2$d) متوفرة، انقر للترقية! + البَدْء + إغلاق + إيقاف اجباري + إعادة تشغيل + وضع AMOLED + تمكين سمة سوداء نقية مفيدة لشاشات AMOLED لتقليل إجهاد العين وحفظ البطارية. + مطلوب إعادة التشغيل + يحتاج التطبيق إلى إعادة التشغيل لتطبيق هذا التغيير. + فشل تحديث قواعد SELinux لـ %s + تعذر منح أذونات الروت لـ%s + سِجل التغييرات + قالب مِلَفّ التعريف للتطبيق + إدارة قالب محلي وعلى الإنترنت لملف التعريف. + إنشاء قالب + تحرير القالب + ID + معرف القالب غير صالح + الاسم + الوصف + حفظ + حذف + عرض القالب + للقراءة فقط + معرف القالب موجود فعلًا! + إستيراد/تصدير + استيراد من الحافظة + تصدير إلى الحافظة + لا يمكن العثور على القالب المحلي للتصدير! + تم الاستيراد بنجاح + مزامنة القوالب عبر الإنترنت + أخفق حفظ القالب + الحافظة فارغة! + أخفق جلب سجل التغيير: %s + التحقق من وجود تحديثات + التحقق تلقائيًا من وجود تحديثات عند فتح التطبيق. + فشل منح صلاحيات الجذر! انقر لإعادة تشغيل عملية المدير. + إجراء سريع + واجهة الويب + فتح + تمكين تصحيح أخطاء عرض الويب + يمكن استخدامه لتصحيح أخطاء واجهة الويب، يرجى تمكينه فقط عند الحاجة. + تثبيت مباشر (موصى به) + تحديد مِلَفّ + تثبيت الإضافة + تثبيت AnyKernel (.zip) + تثبيت إلى خانة غير نشطة (بعد OTA) + سيتم **إجبار** جهازك على الإقلاع إلى الفُتْحَة الحالية الغير نشطة بعد إعادة التشغيل! +\nاستخدم هذا الخِيار فقط بعد انتهاء التحديث الهوائي (OTA). +\nإستمرار؟ + التالي + يوصى باستخدام صورة القسم %1$s! + تحديد KMI + إلغاء التثبيت + إلغاء التثبيت مؤقتًا + إلغاء التثبيت بشكل دائم + استعادة الصورة الأصلية + جارٍ التثبيت + تم التثبيت بنجاح + فشل التثبيت + تحديد LKM: %s + حفظ السجلات + تم حفظ السجلات + مشاركة السجلات + اللغة + الإعداد الافتراضي للنظام + تمكين اللافتات + إظهار خلفيات اللافتات للإضافات. + التخصيص + المطور + توافق الجذر معطّل (SUCOMPAT) + Zygisk مطلوب + حقن Zygisk + Zygisk + مستخدم خارق + المستخدمون الخارقون + الإضافة + الإضافات + فرز (المُمكّن أولاً) + فرز (الإجراءات أولاً) + فرز (واجهات الويب أولاً) + Meta + تبرع + Meta Module + أحدث إصدار + مستودع الإضافة + تحميل... + أعد المحاولة + خطأ في تحميل الإضافات + إنشاء اختصار + اسم الاختصار + اختر أيقونة مخصصة + إضافة اختصار + المشغل لا يدعم اختصارات سطح المكتب. + تم إنشاء الاختصار على سطح المكتب. + تم تحديث الاختصار. + اختصار الإضافة + إنشاء اختصار واجهة الويب + إنشاء اختصار الإجراء + تخصيص اختصار إضافتك + الأيقونة + تغيير الأيقونة + انقر للاستبدال + اختيار من المَعْرِض + اختر أيقونة + الوضع المسموح + تعيين SELinux لوضع Permissive. + الرئيسية + منتحل + حدد نوع البناء + تحديث! + مستودع غير مجاني + تتضمن أضافت مع تراخيص غير مجانية. + لا توجد مستودعات تم تكوينها. أضف مستودعات أدناه. + أضف مستودعًا + إعادة التعيين إلى الوضع الافتراضي + مدعوم + إصدار SuSFS + توافق الجذر + إيقاف مؤقت لقدرة أي تطبيق على الحصول على صلاحيات الجذر عبر أمر الجذر (لن تتأثر عمليات الجذر الحالية). + Kernel umount + جمع الإضافات على مستوى النواة.. + تزييف AVC + إصلاح تسرب SELinux context بسبب رفض AVC في سجل المراجعة. + إدارة المستودعات + KernelSU-Next + ! + . + + إلغاء تثبيت كير نل ني كست (الجذر وجميع الوحدات) بشكل كامل ودائم. + استعادة صورة المصنع الأصلية (إذا كانت هناك نسخة احتياطية)، تُستخدم عادةً قبل التحديث عبر الهواء (OTA)؛ إذا كنت بحاجة إلى إلغاء تثبيت كير نل ني كست، فيُرجى استخدام \"إلغاء التثبيت بشكل دائم\". + النسخ الاحتياطي اكتمل بنجاح + النسخ الاحتياطي فشل + استعادة اكتملت بنجاح + استعادة فشلت + diff --git a/KernelSU-Next/manager/app/src/main/res/values-bg-rBG/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-bg-rBG/strings.xml new file mode 100644 index 000000000000..3451a0fe4772 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-bg-rBG/strings.xml @@ -0,0 +1,250 @@ + + + Having trouble? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-bn-rBD/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-bn-rBD/strings.xml new file mode 100644 index 000000000000..b03021972b68 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-bn-rBD/strings.xml @@ -0,0 +1,250 @@ + + + কোন সমস্যা হচ্ছে? + কোনো ত্রুটির সম্মুখীন অথবা প্রতিক্রিয়া দিবেন? + + গিটহাবে রিপোর্ট করুন + টেলিগ্রামে যোগাযোগ করুন + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + নিশ্চিত করুন + হোম + ইন্সটল হয়নি + ইন্সটলের জন্য ক্লিক করুন + কার্যরত + ভার্সন: %1$s (%2$d) + আপডেটস: %d + অসমর্থিত | ইন্টিগ্রেটেড নয় + Non-GKI কার্নেলগুলি সমর্থিত নয়। আপনার কার্নেলে KernelSU-Next লিগ্যাসি ড্রাইভার ইন্টিগ্রেট করুন! + কার্নেল ভার্সন + হুক মোড + সক্রিয় + নিষ্ক্রিয় + সক্রিয় করা হয়েছে + নিষ্ক্রিয় করা হয়েছে + এন্ড্রয়েড ভার্সন + ম্যানেজার ভার্সন + ABI লিস্ট + SELinux এর অবস্থা + অকার্যকর + বলবৎ করা + অনুমতিমূলক + অজানা + সুপারইউজার + মডিউল সক্রিয় করতে ব্যর্থ: %s + মডিউল নিষ্ক্রিয় করতে ব্যর্থ: %s + কোনো মডিউল ইন্সটল করা নেই + মডিউল + নিম্নলিখিত মডিউলগুলি ইনস্টল করা হবে: %1$s + নিম্নলিখিত কার্নেলটি ফ্ল্যাশ করা হবে: %1$s + সাজান (A → Z) + সাজান (Z → A) + সাজান (নিম্ন → উচ্চ) + সাজান (উচ্চ → নিম্ন) + আনইন্সটল + পুনরুদ্ধার + ইন্সটল + ইন্সটল + পুনরায় ইনস্টল করুন + পুনরায় চালু + ইনস্টল করা হয়েছে + আনইনস্টল করা হয়েছে + সেটিংস + দ্রুত পুনরায় চালু + রিকোভারিতে বুট করুন + বুটলোডার মোডে বুট করুন + ডাউনলোড মোডে বুট করুন + ইমারজেন্সি ডাউনলোড মোডে বুট করুন + পরিচিতি + আপনি কি নিশ্চিত ভাবে মডিউলটি আনইনস্টল করতে চান %s? + %s আনইনস্টল হয়েছে + আনইনস্টল করা যায়নি: %s + আপনি কি নিশ্চিত ভাবে মডিউলটি পুনরুদ্ধার করতে চান %s? + %s পুনরুদ্ধার হয়েছে + পুনরুদ্ধার করা যায়নি: %s + সংস্করণ + উদ্ভাবক + আইডি + কোড + আপডেটJson + খালি + ডেভেলপার অপশন সক্রিয় করুন + শুধুমাত্র ডেভেলপারদের জন্য লুকানো সেটিংস এবং ডিবাগ তথ্য দেখান + রিফ্রেশ + সিস্টেম অ্যাপ্স প্রদর্শন করুন + সিস্টেম অ্যাপ্স লুকান + এক্সপোর্ট লগ + সেইফ মোড + কার্যকর করতে রিবুট করুন + ম্যাজিস্কের সাথে দ্বন্দ্বের কারণে মডিউলগুলি অপ্রাপ্য + মাউন্ট সিস্টেম + আন-আভেইলাবেল + মডিউল পুনরুদ্ধার করুন + সাম্প্রতিক ব্যাকআপ থেকে মডিউল পুনরুদ্ধার করুন + ব্যাকআপ & পুনরুদ্ধার + ব্যাকআপ মডিউল + বর্তমানে ইনস্টল মডিউলগুলির ব্যাকআপ নিন + এ্যালাও লিস্ট পুনরুদ্ধার করুন + সাম্প্রতিক ব্যাকআপ থেকে এ্যালাও লিস্ট পুনরুদ্ধার করুন + এ্যালাও লিস্ট ব্যাকআপ + সাম্প্রতিক ব্যাকআপ থেকে এ্যালাও লিস্ট ব্যাকআপ করুন + এগিয়ে যান + বাতিল করুন + সোর্স কোড দেখুন %1$s + অ্যাপ প্রোফাইল + ডিফল্ট + টেমপ্লেট + কাস্টম + প্রোফাইলের নাম + নেমস্পেস মাউন্ট করুন + উত্তরাধিকারসূত্রে + গ্লোবাল + আলাদাভাবে + গ্রুপস + সক্ষমতা + SELinux প্রসঙ্গ + মডিউল আনমাউন্ট করুন + %s এর জন্য অ্যাপ প্রোফাইল আপডেট করা যায়নি + মডিউল আনমাউন্ট করুন + অ্যাপ প্রোফাইলে \"আনমাউন্ট মডিউল\" এর জন্য ডিফল্ট মান যদি সক্ষম করা থাকে, তাহলে এটি এমন অ্যাপগুলির জন্য সিস্টেমে সমস্ত মডিউল পরিবর্তনগুলি সরিয়ে ফেলবে যাদের প্রোফাইল সেট নেই.. + ডোমেইন + নিয়ম + আপডেট + আপডেট + আপডেট করা হয়েছে + মডিউল ডাউনলোড করা হচ্ছে: %s + ডাউনলোড শুরু করুন: %s + নতুন সংস্করণ %1$s (%2$d) অ্যাভেইলেবল, আপগ্রেড করতে ক্লিক করুন! + অ্যাপ চালু করুন + বন্ধ করুন + জোর করে বন্ধ করুন + Restart + অ্যামোলেড মোড + চোখের চাপ কমাতে এবং ব্যাটারি বাঁচাতে অ্যামোলেড স্ক্রিনের জন্য উপযোগী একটি কালো থিম সক্ষম করুন + রিস্টার্ট প্রয়োজন + এই পরিবর্তন কার্যকর করার জন্য অ্যাপটি পুনরায় চালু করতে হবে + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-de-rDE/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-de-rDE/strings.xml new file mode 100644 index 000000000000..3451a0fe4772 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-de-rDE/strings.xml @@ -0,0 +1,250 @@ + + + Having trouble? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-es-rEM/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-es-rEM/strings.xml new file mode 100644 index 000000000000..23015833e02c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-es-rEM/strings.xml @@ -0,0 +1,250 @@ + + + ¿Tienes problemas? + ¿Encontraste un error o tienes comentarios? + ¡Repórtalo lo mas pronto posible! + Reportar en GitHub + Contactar por Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirmar + Inicio + No instalado + Pulsa para instalar + Funcionando + Versión %1$s (%2$d) + Actualizaciones: %d + No compatible | No integrado + Los kernels que no sean GKI no son compatibles. ¡Integre el controlador heredado KernelSU-Next en su kernel! + Versión del kernel + Método de intercepción + Activar + Desactivar + Activado + Desactivado + Versión de Android + Versión del gestor + Lista ABI + Estado de SELinux + Deshabilitado + Estricto + Permisivo + Desconocido + Superusuario + No se pudo activar el módulo: %s + No se pudo desactivar el módulo: %s + Ningún módulo instalado + Módulo + Los siguientes módulos serán instalados: %1$s + El siguiente kernel será flasheado: %1$s + Ordenar (A → Z) + Ordenar (Z → A) + Ordenar (Menor → Mayor) + Ordenar (Mayor → Menor) + Desinstalar + Restaurar + Instal + Instalar + Reinstalar + Reiniciar + Instalado + Desinstalado + Ajustes + Reinicio rápido + Reiniciar en modo Recovery + Reiniciar en modo Bootloader + Reiniciar en modo Download + Reiniciar en Modo EDL + Acerca de + ¿Estás seguro que quieres desinstalar el módulo %s? + %s desinstalado + No se pudo desinstalar: %s + ¿Estás seguro que quieres restaurar el módulo %s? + %s restaurado + No se pudo restaurar: %s + Versión + Autor + Identificador + Revisión + UpdateJson + Vacío + Habilitar opciones de desarrollador + Muestra ajustes ocultos e información de depuración relevantes solo para desarrolladores. + Actualizar + Mostrar aplicaciones del sistema + Ocultar aplicaciones del sistema + Exportar logs + Modo seguro + Reiniciar para aplicar cambios + ¡Los módulos no están disponibles debido a un conflicto con Magisk! + Mecanismo de montaje + No disponible + Restaurar módulo + Restaurar módulos desde una copia de seguridad reciente. + Copia de seguridad y Restauración + Respaldar módulo + Respaldar los módulos actualmente instalados. + Restaurar lista blanca + Restaurar la lista permitida desde una copia de seguridad reciente. + Respaldar lista permitida + Respaldar la lista permitida actualmente configurada. + Continuar + Cancelar + Ver el código fuente en %1$s + Perfil de Aplicación + Predeterminado + Plantilla + Personalizado + Nombre de perfil + Espacio de montaje aislado + Heredado + Global + Individual + Grupos + Privilegios + Contexto de SELinux + Desmontar módulos + Error al actualizar el perfil de aplicación para %s + Desmontar módulos + El valor global predeterminado para \"Desmontar módulos\" en el Perfil de App. Si se activa, eliminará todas las modificaciones de módulos en el sistema para las aplicaciones que no tengan un perfil establecido. + Dominio + Reglas + Actualizar + Actualización + Actualizado + Descargando módulo: %s + Iniciando descarga: %s + Nueva versión %1$s (%2$d) está disponible, ¡haz clic para actualizar! + Iniciar + Cerrar + Forzar detención + Reiniciar + Modo AMOLED + Activa un aspecto negro puro, útil para pantallas AMOLED, reducir la fatiga visual y ahorrar batería. + Reinicio requerido + La aplicación necesita reiniciarse para que este cambio tenga efecto. + Error al actualizar las reglas de SELinux para %s + No se pudo conceder acceso de Superusuario a %s + Registro de cambios + Plantilla del perfil de aplicación + Gestiona plantillas locales y en línea del Perfil de la Aplicación. + Crear plantilla + Editar plantilla + Identificador + ID de plantilla inválido + Nombre + Descripción + Guardar + Eliminar + Ver plantilla + Sólo lectura + ¡El ID de plantilla ya existe! + Importar/Exportar + Importar desde portapapeles + Exportar al portapapeles + ¡No se encontraron plantillas locales para exportar! + Importado con éxito + Sincronizar plantillas en línea + Error al guardar plantilla + ¡El portapapeles está vacío! + Error al obtener registro de cambios: %s + Verificar si hay actualizaciones + Buscar actualizaciones automáticamente al abrir la aplicación. + ¡Error al conceder root! Pulse para reiniciar el gestor. + Acción + WebUI + Abrir + Activar depuración de WebView + Puede usarse para depurar WebUI. Habilitar solo cuando sea necesario. + Instalación directa (Recomendado) + Seleccionar un archivo + Flashear módulo + Flashear AnyKernel (.zip) + Instalar al ranura inactiva (Después de OTA) + ¡Tu dispositivo será **FORZADO** a iniciar en la ranura inactiva actual después de reiniciar!\nUsa esta opción solo después de haber realizado una OTA.\n¿Continuar? + Siguiente + Se recomienda la imagen de partición %1$s! + Seleccionar KMI + Desinstalar + Desinstalar temporalmente + Desinstalar permanentemente + Restaurar imagen stock + Flasheando + Flasheado con éxito + Error en el flasheo + Seleccionado LKM: %s + Guardar logs + Logs guardados + Enviar logs + Idioma + Predeterminado del sistema + Activar banners + Mostrar banners de fondo para los módulos. + Personalización + Desarrollador + SUCOMPAT DESHABILITADO + Se requiere Zygisk + Inyección Zygisk + Zygisk + Superusuario + Superusuarios + Módulo + Módulos + Ordenar (Activados Primero) + Ordenar (Accionables primero) + Ordenar (WebUI primero) + Meta + Donar + Meta Módulo + Última versión + Repositorio de Módulos + Cargando... + Reintentar + Error cargando módulos + Crear acceso directo + Nombre de acceso directo + Elegir icono personalizado + Añadir acceso directo + El lanzador no soporta accesos directos. + Acceso directo creado en el escritorio. + Acceso directo actualizado. + Atajo del módulo + Crear acceso directo a la WebUI + Crear acceso directo a la acción + Personaliza el acceso directo del módulo + Ícono + Cambiar ícono + Toca para reemplazar + Seleccionar de la galería + Elegir un icono + SELinux Permisivo + Establece SELinux en modo permisivo. + Principal + Spoofeado + Seleccione el tipo de compilación + Actualización! + Repositorio no libre + Incluye módulos con licencias no libres. + No hay repositorios configurados. Añada uno abajo. + Añadir repositorio + Restablecer a por defecto + Soportado + Version de SuSFS + Compatibilidad de SU + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Desmontar Kernel + Desmontar modulos al nivel de kernel. + Suplantación de AVC + Se soluciona la fuga de contenido de Selinux causada por la denegación de Avc en el registro de auditoría. + Manage Repositories + KernelSU-Next + %2$d + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-fa-rIR/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-fa-rIR/strings.xml new file mode 100644 index 000000000000..3451a0fe4772 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-fa-rIR/strings.xml @@ -0,0 +1,250 @@ + + + Having trouble? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-fr-rFR/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-fr-rFR/strings.xml new file mode 100644 index 000000000000..3451a0fe4772 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-fr-rFR/strings.xml @@ -0,0 +1,250 @@ + + + Having trouble? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-hi-rIN/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-hi-rIN/strings.xml new file mode 100644 index 000000000000..9e6a4f029a6d --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-hi-rIN/strings.xml @@ -0,0 +1,250 @@ + + + समस्या आ रही है? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-hu-rHU/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-hu-rHU/strings.xml new file mode 100644 index 000000000000..3451a0fe4772 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-hu-rHU/strings.xml @@ -0,0 +1,250 @@ + + + Having trouble? + Encountered a bug or have feedback? + Report it as soon as possible! + Report on GitHub + Contact via Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + Home + Not installed + Click to install + Working + Version: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + Kernel version + Hook mode + Enable + Disable + Enabled + Disabled + Android version + Manager version + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + Module + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + Install + Reinstall + Reboot + Installed + Uninstalled + Settings + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + Version + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + Cancel + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-in-rID/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-in-rID/strings.xml new file mode 100644 index 000000000000..ea1e917abcc0 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-in-rID/strings.xml @@ -0,0 +1,250 @@ + + + Memiliki masalah? + Mengalami bug atau memiliki umpan balik? + Segera laporkan! + Laporkan di GitHub + Hubungi melalui Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Oke + Beranda + Tidak terpasang + Ketuk untuk memasang + Berfungsi + Versi: %1$s (%2$d) + Pembaruan: %d + Tidak didukung | Tidak terintegrasi + Kernel Non-GKI tidak didukung. Integrasikan driver KernelSU-Next legacy ke dalam kernel Anda! + Versi kernel + Mode hook + Aktifkan + Nonaktifkan + Diaktifkan + Dinonaktifkan + Versi Android + Versi manager + Daftar ABI + Status SELinux + Dinonaktifkan + Enforcing + Permisif + Tidak diketahui + Superuser + Gagal mengaktifkan modul: %s + Gagal menonaktifkan modul: %s + Tidak ada modul yang terpasang + Modul + Modul berikut akan dipasang: %1$s + Berkas zip kernel berikut akan dipasang: %1$s + Urutkan (A → Z) + Urutkan (Z → A) + Urutkan (Terkecil → Terbesar) + Urutkan (Terbesar → Terkecil) + Hapus + Pulihkan + Pasang + Pasang + Pasang ulang + Mulai ulang + Terpasang + Dihapus + Setelan + Mulai ulang cepat + Mulai ulang ke Recovery + Mulai ulang ke Bootloader + Mulai ulang ke Download + Mulai ulang ke EDL + Tentang + Apakah Anda yakin ingin menghapus modul %s? + %s dihapus + Gagal menghapus: %s + Apakah Anda yakin ingin memulihkan modul %s? + %s dipulihkan + Gagal memulihkan: %s + Versi + Pengembang + ID + Kode + Pembaruan Json + Kosong + Aktifkan opsi pengembang + Menampilkan setelan tersembunyi dan informasi debug relevan untuk pengembang. + Segarkan + Tampilkan apl sistem + Sembunyikan apl sistem + Ekspor log + Mode aman + Mulai ulang untuk menerapkan perubahan + Modul tidak tersedia karena konflik dengan Magisk! + Sistem mount + Tidak tersedia + Pulihkan modul + Pulihkan modul dari cadangan terkini. + Cadangkan & Pulihkan + Cadangkan modul + Cadangkan modul yang saat ini terpasang. + Pulihkan daftar izin + Pulihkan daftar izin dari cadangan terkini. + Cadangkan daftar izin + Cadangkan daftar izin yang saat ini dikonfigurasi. + Lanjutkan + Batal + Lihat kode sumber di %1$s + Profil Aplikasi + Default + Templat + Khusus + Nama profil + Ruang nama mount + Diwariskan + Global + Individual + Grup + Kemampuan + Konteks SELinux + Umount modul + Gagal memperbarui Profil Aplikasi untuk %s + Umount modul + Nilai bawaan global untuk \"Umount modul\" pada Profil Aplikasi. Jika diaktifkan, ini akan menghapus semua modifikasi modul ke sistem untuk aplikasi yang tidak memiliki profil yang ditetapkan. + Domain + Aturan + Perbarui + Pembaruan + Diperbarui + Mengunduh modul: %s + Mulai mengunduh: %s + Versi baru %1$s (%2$d) tersedia, ketuk untuk memperbarui! + Luncurkan + Tutup + Paksa berhenti + Mulai ulang apl + Mode AMOLED + Aktifkan tema hitam pekat yang berguna untuk layar AMOLED guna mengurangi kelelahan mata dan menghemat baterai. + Mulai ulang diperlukan + Aplikasi perlu dimulai ulang agar perubahan ini diterapkan. + Gagal memperbarui aturan SELinux untuk %s + Gagal memberikan akses SU untuk %s + Catatan perubahan + Templat Profil Aplikasi + Kelola templat lokal dan online dari Profil Aplikasi. + Buat templat + Edit templat + ID + ID templat tidak valid + Nama + Deskripsi + Simpan + Hapus + Lihat templat + Hanya Baca + ID templat sudah ada! + Impor/Ekspor + Impor dari papan klip + Ekspor ke papan klip + Tidak ditemukan templat lokal untuk diekspor! + Berhasil diimpor + Sinkronkan templat online + Gagal menyimpan templat + Papan klip kosong! + Gagal mengambil catatan perubahan: %s + Periksa pembaruan + Memeriksa pembaruan secara otomatis saat membuka aplikasi. + Gagal memberikan akses root! Ketuk untuk memulai ulang proses manajer. + Aksi + WebUI + Buka + Debugging WebView + Dapat digunakan untuk mendebug WebUI. Harap aktifkan hanya saat diperlukan. + Langsung pasang (Disarankan) + Pilih berkas + Pasang modul + Pasang AnyKernel (.zip) + Pasang ke slot nonaktif (setelah OTA) + Perangkat Anda akan **DIPAKSA** untuk boot ke slot nonaktif saat ini setelah mulai ulang!\nGunakan hanya setelah proses OTA selesai.\nLanjutkan? + Berikutnya + %1$s partisi image disarankan! + Pilih KMI + Hapus + Hapus sementara + Hapus permanen + Pulihkan image asli + Memasang + Pemasangan berhasil + Pemasangan gagal + LKM dipilih: %s + Simpan log + Log disimpan + Bagikan log + Bahasa + Bawaan sistem + Aktifkan banner + Tampilkan banner latar belakang pada modul. + Personalisasi + Pengembang + Kompatibilitas SU Dinonaktifkan + Zygisk diperlukan + Injeksi zygisk + Zygisk + Superuser + Superuser + Modul + Modul + Urutkan (Diaktifkan dahulu) + Urutkan (Aksi dahulu) + Urutkan (WebUI dahulu) + Meta + Donasi + Metamodul + Versi Terbaru + Repo Modul + Memuat... + Coba lagi + Kesalahan saat memuat modul + Buat pintasan + Nama pintasan + Pilih ikon khusus + Tambahkan pintasan + Peluncur tidak mendukung pintasan layar utama. + Pintasan dibuat di layar utama. + Pintasan diperbarui. + Pintasan Modul + Buat Pintasan WebUI + Buat Pintasan Aksi + Kustomisasi pintasan modul Anda + Ikon + Ubah Ikon + Ketuk untuk mengganti + Pilih dari galeri + Pilih Ikon + SELinux Permisif + Atur SELinux ke mode permisif. + Reguler + Spoofed + Pilih tipe build + Pembaruan! + Repositori Non-Bebas + Sertakan modul dengan lisensi non-bebas. + Belum ada repositori yang dikonfigurasi. Tambahkan satu di bawah ini. + Tambahkan Repositori + Atur ulang ke bawaan + Didukung + Versi SuSFS + Kompatibilitas SU + Izinkan aplikasi apa pun untuk mendapatkan hak akses root melalui perintah su (proses root yang sudah berjalan tidak akan terpengaruh). + Umount modul + Umount modul pada tingkat kernel. + Spoof AVC + Memperbaiki kebocoran konteks SELinux akibat penolakan AVC yang tercatat di log audit. + Kelola Repositori + KernelSU-Next + Versi KernelSU-Next saat ini %1$d terlalu rendah agar manajer dapat berfungsi dengan baik. Silakan perbarui ke versi %2$d atau lebih baru! + Mengaktifkan opsi ini akan memungkinkan KernelSU-Next untuk memulihkan berkas apa pun yang telah dimodifikasi oleh modul untuk aplikasi ini. + Hapus sementara KernelSU-Next, dipulihkan ke keadaan semula setelah mulai ulang berikutnya. + Menghapus KernelSU-Next (root dan semua modul) sepenuhnya dan secara permanen. + Pulihkan image asli (jika cadangan ada), biasanya digunakan sebelum OTA; Jika Anda perlu menghapus KernelSU-Next, silakan gunakan \"Hapus permanen\". + Pencadangan berhasil + Pencadangan gagal + Pemulihan berhasil + Pemulihan gagal + diff --git a/KernelSU-Next/manager/app/src/main/res/values-it-rIT/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-it-rIT/strings.xml new file mode 100644 index 000000000000..659e64943d8c --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-it-rIT/strings.xml @@ -0,0 +1,250 @@ + + + Stai riscontrando problemi? + Hai riscontrato un bug o vuoi fornirci feedback? + Segnalacelo il prima possibile! + Segnala su GitHub + Contatto tramite Telegram + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Conferma + Home + Non installato + Clicca per installare + In esecuzione + Versione: %1$s (%2$d) + Aggiornamenti: %d + Non supportato | Non integrato + I kernel non-GKI non sono supportati. Integra il driver legacy KernelSU-Next nel tuo kernel! + Versione kernel + Modalità hook + Abilita + Disabilita + Abilitato + Disabilitato + Versione Android + Versione manager + Lista ABI + Stato SELinux + Disabilitato + Enforcing + Permissive + Sconosciuto + Accesso root + Impossibile abilitare il modulo: %s + Impossibile disabilitare il modulo: %s + Nessun modulo installato + Modulo + Verranno installati i seguenti moduli: %1$s + Verrà flashato il seguente zip del kernel: %1$s + Ordina (A → Z) + Ordina (Z → A) + Ordina (Basso→ Alto) + Ordina (Alto → Basso) + Disinstalla + Ripristina + Installa + Installa + Reinstalla + Riavvia + Installato + Disinstallato + Impostazioni + Riavvio veloce + Riavvia in Recovery + Riavvia in Bootloader + Riavvia in Download + Riavvia in EDL + Info + Sei sicuro di voler disinstallare il modulo %s? + %s disinstallato + Impossibile disinstallare: %s + Sei sicuro di voler ripristinare il modulo %s? + %s ripristinato + Ripristino fallito: %s + Versione + Autore + ID + Codice + UpdateJson + Vuoto + Attiva Opzioni sviluppatore + Mostra impostazioni nascoste e informazioni di debug rilevanti solo per gli sviluppatori. + Ricarica + Mostra app di sistema + Nascondi app di sistema + Esporta log + Modalità provvisoria + Riavvia per applicare le modifiche + I moduli non sono disponibili a causa di un conflitto con Magisk! + Sistema di montaggio + Non disponibile + Ripristina moduli + Ripristina i moduli da un backup. + Backup & Ripristino + Backup moduli + Esegue il backup dei moduli attualmente esistenti. + Ripristina la lista consentita + Ripristina la lista consentita da un backup. + Backup lista consentita + Esegue il backup della lista consentita attualmente configurata. + Procedi + Annulla + Visualizza codice sorgente su %1$s + Profilo App + Default + Modello + Personalizzato + Nome profilo + Monta namespace + Ereditato + Globale + Individuale + Gruppi + Capacità + Contesto SELinux + Smonta moduli + Aggiornamento App Profile fallito per %s + Smonta moduli + Il valore predefinito globale per \"Smonta moduli\" nel Profilo App. Se abilitato, rimuoverà tutte le modifiche ai moduli nel sistema per le app che non hanno un profilo impostato. + Dominio + Regole + Aggiorna + Aggiornamento + Aggiornato + Download modulo: %s + Inizio download: %s + Nuova versione %1$s (%2$d) disponibile, tocca per aggiornare! + Avvia + Chiudi + Arresto forzato + Riavvia + Modalità AMOLED + Abilita un tema nero puro, utile per gli schermi AMOLED, per ridurre l\'affaticamento degli occhi e risparmiare batteria. + Riavvio richiesto + Affinché la modifica abbia effetto, è necessario riavviare l\'app. + Impossibile aggiornare le regole SELinux per %s + Impossibile concedere i permessi root a %s + Changelog + Modelli App Profile + Gestisci i modelli locali e online di App Profile. + Crea modello + Modifica modello + ID + ID modello non valido + Nome + Descrizione + Salva + Elimina + Visualizza modello + Sola lettura + ID modello già esistente! + Importa/Esporta + Importa dagli appunti + Esporta negli appunti + Impossibile trovare un modello locale da esportare! + Importato con successo + Sincronizza modelli online + Impossibile salvare il modello + Gli appunti sono vuoti! + Recupero changelog non riuscito: %s + Controlla aggiornamenti + Cerca automaticamente gli aggiornamenti all\'apertura dell\'applicazione. + Impossibile concedere il root! Tocca per riavviare il processo del manager. + Azione + WebUI + Apri + Attiva il debugging WebView + Può essere utlizzato per il debug di WebUI. Attiva quest\'opzione solo quando è necessario. + Installazione diretta (consigliato) + Seleziona un file + Flash Modulo + Flash AnyKernel (.zip) + Installa nello slot inattivo (dopo OTA) + Dopo il riavvio, il dispositivo sarà **FORZATO** ad avviarsi nello slot attualmente inattivo!\nUtilizza questa opzione solo dopo aver completato l\'aggiornamento OTA.\nProcedere? + Next + Immagine partizione %1$s consigliata! + Seleziona KMI + Disinstalla + Disinstalla temporaneamente + Disinstalla permanentemente + Ripristina l\'immagine originale + Installazione in corso + Installazione completata + Installazione fallita + LKM selezionato: %s + Salva i log + Log salvati + Condividi i log + Lingua + Predefinito di sistema + Attiva i banner + Mostra uno sfondo dietro ai moduli. + Personalizzazione + Sviluppatore + SUCOMPAT DISABILITATO + Zygisk richiesto + Iniezione Zygisk + Zygisk + Accesso root + Accessi root + Modulo + Moduli + Ordina (prima Abilitato) + Ordina (prima Azione) + Ordina (prima WebUI) + Meta + Donare + Meta Module + Ultima Versione + Modulo Repo + Caricamento... + Riprova + Errore caricamento moduli + Crea scorciatoia + Nome scorciatoia + Scegli icona personalizzata + Aggiungi scorciatoia + Launcher non supporta le scorciatoie desktop. + Scorciatoia creata sul desktop. + Scorciatoia aggiornata. + Scorciatoia Modulo + Crea Scorciatoia WebUI + Crea Scorciatoia Azione + Personalizza scorciatoia modulo + Icona + Cambia icona + Tocca per sostituire + Seleziona dalla galleria + Scegli un\'icona + SELinux Permissive + Imposta SELinux in modalità permissiva. + Principale + Spoofed + Seleziona tipo di build + Aggiornamento! + Repository Non-Free + Includi moduli con licenze non libere. + Nessun repository configurato. Aggiungine uno qui sotto. + Aggiungi Repository + Resetta a Predefinito + Supportato + Versione SuSFS + Compatibilità SU + Consenti a qualsiasi app di ottenere privilegi di root tramite il comando su (i processi di root esistenti non saranno interessati). + Kernel umount + Smonta moduli a livello-kernel. + Spoofing AVC + Correggi la perdita di contesto di selinux causata dal rifiuto di avc nel registro di controllo. + Gestisci Repository + KernelSU-Next + La versione attualmente installata di KernelSU-Next %1$d è troppo vecchia ed il manager non può funzionare correttamente. Si prega di aggiornare alla versione %2$d o successiva! + Abilitando questa opzione, KernelSU-Next potrà ripristinare tutti i file modificati dai moduli per questa app. + Disinstalla temporaneamente KernelSU-Next e recupera il suo stato originale dopo il prossimo riavvio. + Disinstallazione completa e permanente di KernelSU-Next (root e tutti i moduli). + Ripristina l\'immagine di fabbrica (se esiste un backup), solitamente utilizzata prima dell\'OTA; se vuoi disinstallare KernelSU-Next, utilizza \"Disinstalla definitivamente\". + Backup completato con successo + Backup fallito + Ripristino completato con successo + Ripristino fallito + diff --git a/KernelSU-Next/manager/app/src/main/res/values-ja-rJP/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-ja-rJP/strings.xml new file mode 100644 index 000000000000..6f9350951b6a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-ja-rJP/strings.xml @@ -0,0 +1,250 @@ + + + 問題が発生しましたか? + バグに遭遇しましたか?改善案を思い付きましたか? + できるだけ早急にご報告ください! + GitHub で報告 + Telegram で問い合わせる + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + 確認 + ホーム + 未インストール + タップでインストール + 動作中 + バージョン: %1$s (%2$d) + アップデート: %d + 未対応 | 統合されていません + GKI 以外のカーネルはサポートされていません。KernelSU-Next レガシードライバをカーネルに統合してください! + カーネルバージョン + フックモード + 有効化 + 無効化 + 有効 + 無効 + Android バージョン + マネージャーバージョン + ABIリスト + SELinux の状態 + 無効 + Enforcing + Permissive + 不明 + スーパーユーザー + モジュールの有効化に失敗: %s + モジュールの無効化に失敗: %s + モジュールがインストールされていません + モジュール + %1$s がインストールされます + 次のカーネルzipがフラッシュされます: %1$s + 並び替え (A→Z) + 並び替え (A→Z) + 並べ替え (サイズ小→大) + 並べ替え (サイズ大→小) + アンインストール + 復元 + インストール + インストール + 再インストール + 再起動 + インストール済み + アンインストール済み + 設定 + ソフト再起動 + Recovery へ再起動 + Bootloader へ再起動 + Download モードへ再起動 + EDL へ再起動 + このプロジェクトについて + モジュール %s をアンインストールしてもよろしいですか? + %s をアンインストールしました + アンインストールに失敗: %s + モジュール %s を復元してもよろしいですか? + %s を復元しました + 復元に失敗: %s + バージョン + 作者 + ID + コード + UpdateJson + + 開発者向けオプションを有効にする + 開発者のみに関連する非表示の設定とデバッグ情報を表示します。 + 更新 + システムアプリを表示 + システムアプリを非表示 + ログをエクスポート + セーフモード + 再起動後に適用されます + Magisk と競合しているため、モジュールは利用できません! + マウントシステム + 利用不可 + モジュールを復元 + 最近のバックアップからモジュールを復元します。 + バックアップ&復元 + モジュールをバックアップ + 現在インストールされているモジュールをバックアップします。 + 許可リストを復元 + 最近のバックアップから許可リストを復元します。 + 許可リストをバックアップ + バックアップは現在許可リストを設定しています。 + 続行 + キャンセル + %1$s でソースコードを見る + アプリプロファイル + デフォルト + テンプレート + カスタム + プロファイル名 + マウント名前空間 + 継承する + グローバル + 個別 + グループ + 機能 + SELinux コンテキスト + モジュールをアンマウント + %s のアプリプロファイルの更新に失敗しました + モジュールをアンマウント + アプリプロファイルの「モジュールをアンマウント」のデフォルト値を設定します。有効にすると、プロファイルが設定されていないアプリでの、全てのモジュールのシステムに対する変更が削除されます。 + ドメイン + ルール + 更新 + 更新 + 更新されました + モジュールをダウンロード中: %s + ダウンロードを開始: %s + 新しいバージョン %1$s (%2$d)が利用可能です。タップで更新します。 + 起動 + 閉じる + 強制停止 + 再起動 + AMOLED モード + AMOLED スクリーンに効果的である真っ黒なテーマを有効にすると、目の負担の軽減とバッテリーの節約に繋がります。 + 再起動が必要です + この変更を反映させるにはアプリを再起動する必要があります。 + SELinux ルールの更新に失敗しました: %s + %s へのスーパーユーザーアクセスを許可できませんでした + 更新履歴 + アプリプロファイルのテンプレート + アプリプロファイルのローカルまたはオンラインテンプレートを管理します. + テンプレートを作成 + テンプレートを編集 + ID + 無効なテンプレート ID + 名前 + 説明 + 保存 + 削除 + テンプレートの表示 + 読み取り専用 + そのテンプレート ID は既に存在します! + インポート/エクスポート + クリップボードからインポート + クリップボードにエクスポート + エクスポートするローカル テンプレートが見つかりません! + インポートに成功しました + オンラインテンプレートを同期 + テンプレートの保存に失敗しました + クリップボードは空です! + 更新履歴の取得に失敗: %s + アップデートの確認 + アプリの起動時に更新を自動で確認します. + root権限を付与できませんでした!タップしてマネージャーを再起動してください。 + 実行 + WebUI + 開く + WebView デバッグを有効化する + WebUI のデバッグが行えます。必要な時のみ有効化してください。 + 直接インストール (推奨) + ファイルを選択 + フラッシュ モジュール + フラッシュ AnyKernel (.zip) + 非アクティブなスロットにインストール (OTA 後) + 再起動後、デバイスは**強制的に**、現在非アクティブなスロットから起動します。\nこのオプションは、OTA が完了した後にのみ使用してください。\n続行しますか? + 次へ + %1$s パーティション イメージが推奨されます! + KMI を選択 + アンインストール + 一時的にアンインストール + 完全にアンインストール + ストックイメージを復元 + フラッシュ + フラッシュに成功 + フラッシュに失敗 + 選択した LKM: %s + ログを保存 + ログを保存しました + ログを共有 + 言語 + システムのデフォルト + バナーを有効化 + モジュールの背景バナーを表示します。 + カスタマイズ + 開発者 + SUCOMPAT 無効 + Zygisk 必須 + Zygisk インジェクション + Zygisk + スーパーユーザー + スーパーユーザー + モジュール + モジュール + 並べ替え (有効を優先) + 並べ替え (実行可能を優先) + 並べ替え (WebUIを優先) + メタ + 寄付 + Meta モジュール + 最新バージョン + モジュールのリポジトリ + 読み込み中... + 再試行 + モジュールの読み込みに失敗しました + ショートカットを作成 + ショートカット名 + カスタムアイコンを選択 + ショートカットを追加 + ランチャーはデスクトップショートカットに非対応です。 + デスクトップにショートカットを作成しました。 + ショートカットを更新しました。 + モジュールショートカット + WebUIショートカットを作成 + Action ショートカットを作成 + モジュールのショートカットをカスタマイズ + アイコン + アイコンを変更 + タップして交換する + ギャラリーから選択 + アイコンを選択 + SELinux Permissive + SELinux をPermissive モードに設定します。 + メイン + Spoofed + ビルドタイプを選択する + 更新されました! + フリーでないリポジトリ + 非フリーライセンスのモジュールを含めます。 + リポジトリが設定されていません。以下に追加してください。 + リポジトリを追加 + デフォルトに戻す + 対応済み + SuSFS バージョン + SUの互換性 + su コマンドを使用してアプリが Root 権限を取得する機能を一時的に無効にします(既存の Root プロセスは影響を受けません)。 + カーネル umount + カーネルレベルでのUmount モジュール + AVC spoofing + AVC 拒否によるSELinux コンテキストリークを監査ログで修正しました。 + リポジトリの管理 + KernelSU-Next + 現在のバージョン %1$d の KernelSU Next は、マネージャーの正常動作の保証ができません。バージョン %2$d またはそれ以降に更新してください! + このオプションを有効にすると、モジュールがこのアプリ対して行ったファイルの変更を KernelSU Next が復元できるようになります。 + KernelSU Next を一時的にアンインストールして、次回の再起動後に元の状態に戻します。 + KernelSU Next (Root およびすべてのモジュール) を完全に永続的にアンインストールします。 + (バックアップが存在する場合)工場出荷時のイメージを復元します。通常は OTA の前に使用します。KernelSU Next をアンインストールする必要がある場合は、「完全にアンインストール」を使用してください。 + バックアップに成功しました + バックアップに失敗しました + 復元が成功しました + 復元に失敗しました + diff --git a/KernelSU-Next/manager/app/src/main/res/values-ko-rKR/strings.xml b/KernelSU-Next/manager/app/src/main/res/values-ko-rKR/strings.xml new file mode 100644 index 000000000000..414ce8ddc644 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-ko-rKR/strings.xml @@ -0,0 +1,250 @@ + + + 문제가 있나요? + Encountered a bug or have feedback? + Report it as soon as possible! + GitHub에 보고 + 텔레그램으로 문의 + https://github.com/KernelSU-Next/KernelSU-Next/issues + https://t.me/ksunext + Confirm + + 설치되지 않음 + 클릭하여 설치 + 작동 중 + 버전: %1$s (%2$d) + Updates: %d + Unsupported | Not integrated + Non-GKI kernels are not supported. Integrate KernelSU-Next legacy driver in your kernel! + 커널 버전 + Hook 모드 + 활성화 + 비활성화 + Enabled + Disabled + Android 버전 + Manager 버전 + ABI list + SELinux status + Disabled + Enforcing + Permissive + Unknown + Superuser + Failed to enable module: %s + Failed to disable module: %s + No module installed + 모듈 + The following modules will be installed: %1$s + The following kernel zip will be flashed: %1$s + Sort (A → Z) + Sort (Z → A) + Sort (Low → High) + Sort (High → Low) + Uninstall + Restore + Install + 설치 + Reinstall + 재시작 + Installed + Uninstalled + 설정 + Soft reboot + Reboot to Recovery + Reboot to Bootloader + Reboot to Download + Reboot to EDL + About + Are you sure you want to uninstall module %s? + %s uninstalled + Failed to uninstall: %s + Are you sure you want to restore module %s? + %s restored + Failed to restore: %s + 버전 + Author + ID + Code + UpdateJson + Empty + Enable developer options + Show hidden settings and debug info relevant only for developers. + Refresh + Show system apps + Hide system apps + Export logs + Safe mode + Reboot to take effect + Modules are unavailable due to a conflict with Magisk! + Mount system + Unavailable + Restore module + Restore modules from recent backup. + Backup & Restore + Backup module + Backup currently installed modules. + Restore allowlist + Restore allowlist from recent backup. + Backup allowlist + Backup currently configured allowlist. + Proceed + 취소 + View source code at %1$s + App Profile + Default + Template + Custom + Profile name + Mount namespace + Inherited + Global + Individual + Groups + Capabilities + SELinux context + Umount modules + Failed to update App Profile for %s + Umount modules + The global default value for \"Umount modules\" in App Profile. If enabled, it will remove all module modifications to the system for apps that don\'t have a profile set. + Domain + Rules + Update + Update + Updated + Downloading module: %s + Start downloading: %s + New version %1$s (%2$d) is available, click to upgrade! + Launch + Close + Force stop + Restart + AMOLED mode + Enable a pure black theme useful for AMOLED screens to reduce eye strain and save battery. + Restart required + The app needs to restart for this change to take effect. + Failed to update SELinux rules for %s + Couldn\'t grant Superuser access to %s + Changelog + App Profile template + Manage local and online template of App Profile. + Create template + Edit template + ID + Invalid template ID + Name + Description + Save + Delete + View template + Read only + Template ID already exists! + Import/Export + Import from clipboard + Export to clipboard + Cannot find local template to export! + Imported successfully + Sync online templates + Failed to save template + Clipboard is empty! + Fetch changelog failed: %s + Check for updates + Automatically check for updates when opening the app. + Failed to grant root! Tap to restart manager process. + Action + WebUI + Open + Enable WebView debugging + Can be used to debug WebUI. Please enable only when needed. + Direct install (Recommended) + Select a file + Flash Module + Flash AnyKernel (.zip) + Install to inactive slot (After OTA) + Your device will be **FORCED** to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue? + Next + %1$s partition image is recommended! + Select KMI + Uninstall + Uninstall temporarily + Uninstall permanently + Restore stock image + Flashing + Flash success + Flash failed + Selected LKM: %s + Save logs + Logs saved + Share logs + Language + System default + Enable banners + Show background banners for modules. + Customization + Developer + SUCOMPAT DISABLED + Zygisk required + Zygisk injection + Zygisk + Superuser + Superusers + Module + Modules + Sort (Enabled first) + Sort (Action first) + Sort (WebUI first) + Meta + Donate + Meta Module + Latest Version + Module Repo + Loading... + Retry + Error loading modules + Create shortcut + Shortcut name + Choose custom icon + Add shortcut + Launcher does not support desktop shortcuts. + Shortcut created on desktop. + Shortcut updated. + Module Shortcut + Create WebUI Shortcut + Create Action Shortcut + Customize your module shortcut + Icon + Change Icon + Tap to replace + Select from gallery + Pick an Icon + SELinux Permissive + Set SELinux to permissive mode. + Main + Spoofed + Select build type + Update! + Non-Free Repository + Include modules with non-free licenses. + No repositories configured. Add one below. + Add Repository + Reset to Default + Supported + SuSFS version + SU compatibility + Allow the ability of any app to gain root privileges via the ⁠su command (existing root processes won\'t be affected). + Kernel umount + Umount modules at kernel-level. + AVC spoofing + Fix selinux context leak caused by avc denial in audit log. + Manage Repositories + KernelSU-Next + The current KernelSU-Next version %1$d is too low for the manager to work properly. Please upgrade to version %2$d or higher! + Enabling this option will allow KernelSU-Next to restore any modified files by the modules for this app. + Temporarily uninstall KernelSU-Next, restore to original state after next reboot. + Uninstalling KernelSU-Next (root and all modules) completely and permanently. + Restore the stock factory image (if a backup exists), usually used before OTA; if you need to uninstall KernelSU-Next, please use \"Uninstall permanently\". + Backup completed successfully + Backup failed + Restore completed successfully + Restore failed + diff --git a/KernelSU-Next/manager/app/src/main/res/values-night/themes.xml b/KernelSU-Next/manager/app/src/main/res/values-night/themes.xml new file mode 100644 index 000000000000..d76ba8e6852b --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/values-night/themes.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/xml/backup_rules.xml b/KernelSU-Next/manager/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 000000000000..fa0f996d2c2a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/xml/data_extraction_rules.xml b/KernelSU-Next/manager/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 000000000000..9ee9997b0b47 --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/xml/filepaths.xml b/KernelSU-Next/manager/app/src/main/res/xml/filepaths.xml new file mode 100644 index 000000000000..f8a9a5c545fb --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/xml/filepaths.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/KernelSU-Next/manager/app/src/main/res/xml/network_security_config.xml b/KernelSU-Next/manager/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 000000000000..6dd26ccf046a --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,8 @@ + + + + 127.0.0.1 + 0.0.0.0 + ::1 + + diff --git a/KernelSU-Next/manager/app/src/main/res/xml/shortcuts.xml b/KernelSU-Next/manager/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 000000000000..7945322163ae --- /dev/null +++ b/KernelSU-Next/manager/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/KernelSU-Next/manager/build.gradle.kts b/KernelSU-Next/manager/build.gradle.kts new file mode 100644 index 000000000000..27b415a920f6 --- /dev/null +++ b/KernelSU-Next/manager/build.gradle.kts @@ -0,0 +1,142 @@ +import com.android.build.api.dsl.ApplicationDefaultConfig +import com.android.build.api.dsl.CommonExtension +import com.android.build.gradle.api.AndroidBasePlugin +import java.io.ByteArrayOutputStream + +plugins { + alias(libs.plugins.agp.app) apply false + alias(libs.plugins.agp.lib) apply false + alias(libs.plugins.kotlin) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.lsplugin.cmaker) +} + +cmaker { + default { + arguments.addAll( + arrayOf( + "-DANDROID_STL=none", + ) + ) + abiFilters("arm64-v8a", "x86_64") + } + buildTypes { + if (it.name == "release") { + arguments += "-DDEBUG_SYMBOLS_PATH=${layout.buildDirectory.asFile.get().absolutePath}/symbols" + } + } +} + +val androidMinSdkVersion = 26 +val androidTargetSdkVersion = 36 +val androidCompileSdkVersion = 36 +val androidBuildToolsVersion = "36.1.0" +val androidCompileNdkVersion by extra(libs.versions.ndk.get()) +val androidSourceCompatibility = JavaVersion.VERSION_21 +val androidTargetCompatibility = JavaVersion.VERSION_21 +val managerVersionCode by extra(getVersionCode()) +val managerVersionName by extra(getVersionName()) + +// Helper for shell cmds. +fun runCommand(vararg command: String): String = + ProcessBuilder(*command) + .redirectErrorStream(true) + .start() + .inputStream.bufferedReader() + .use { it.readText().trim() } + +// Get cur. branch; strip suffixes (e.g. dev-susfs -> dev) +fun getCurrentBranch(): String { + val branchRaw = runCommand("git", "rev-parse", "--abbrev-ref", "HEAD") + return if (branchRaw.isEmpty() || branchRaw == "HEAD") "dev" else branchRaw.split("-")[0] +} + +// Get upstream: commit count, hash, describe number +fun getUpstreamDescribe(): Triple { + val branch = getCurrentBranch() + + // Find common ancestor with origin/$branch, or origin/main as fallback, to exclude local delta + var baseCommit = runCommand("git", "merge-base", "HEAD", "refs/remotes/origin/$branch") + if (baseCommit.contains("fatal") || baseCommit.isEmpty()) { + baseCommit = runCommand("git", "merge-base", "HEAD", "refs/remotes/origin/main") + } + if (baseCommit.contains("fatal") || baseCommit.isEmpty()) { + baseCommit = "HEAD" + } + + val describe = runCommand("git", "describe", "--tags", "--long", "--abbrev=8", baseCommit) + val parts = describe.split("-") + + // Fallback if no tags + if (parts.size < 3) { + val commitCount = runCommand("git", "rev-list", "--count", baseCommit).let { if (it.isEmpty()) 0 else it.toInt() } + val hash = runCommand("git", "rev-parse", "--short=8", baseCommit) + return Triple(commitCount, hash, 0) + } + + val num = parts[parts.size - 2].toInt() + val hash = parts.last().removePrefix("g") + + val commitCount = runCommand("git", "rev-list", "--count", baseCommit).let { if (it.isEmpty()) 0 else it.toInt() } + + return Triple(commitCount, hash, num) +} + +// Version code calc. +fun getVersionCode(): Int { + val (commitCount, _, _) = getUpstreamDescribe() + val major = 1 + return major * 30000 + commitCount +} + +// Version name (upstream tag, describe number, hash) +fun getVersionName(): String { + val (commitCount, hash, num) = getUpstreamDescribe() + val branch = getCurrentBranch() + + var baseCommit = runCommand("git", "merge-base", "HEAD", "refs/remotes/origin/$branch") + if (baseCommit.contains("fatal") || baseCommit.isEmpty()) { + baseCommit = runCommand("git", "merge-base", "HEAD", "refs/remotes/origin/main") + } + if (baseCommit.contains("fatal") || baseCommit.isEmpty()) { + baseCommit = "HEAD" + } + + val tag = runCommand("git", "describe", "--tags", "--abbrev=0", baseCommit).let { if (it.isEmpty() || it.contains("fatal")) "v0.0.0" else it } + return "$tag-$num-g$hash" +} + +// Root project version info. assignment (extras) +rootProject.extra.set("managerVersionCode", getVersionCode()) +rootProject.extra.set("managerVersionName", getVersionName()) + +subprojects { + plugins.withType(AndroidBasePlugin::class.java) { + extensions.configure(CommonExtension::class.java) { + compileSdk = androidCompileSdkVersion + ndkVersion = androidCompileNdkVersion + + defaultConfig { + minSdk = androidMinSdkVersion + if (this is ApplicationDefaultConfig) { + targetSdk = androidTargetSdkVersion + versionCode = managerVersionCode + versionName = managerVersionName + } + ndk { + abiFilters += listOf("arm64-v8a", "x86_64") + } + } + + lint { + abortOnError = true + checkReleaseBuilds = false + } + + compileOptions { + sourceCompatibility = androidSourceCompatibility + targetCompatibility = androidTargetCompatibility + } + } + } +} diff --git a/KernelSU-Next/manager/gradle.properties b/KernelSU-Next/manager/gradle.properties new file mode 100644 index 000000000000..457283bec21c --- /dev/null +++ b/KernelSU-Next/manager/gradle.properties @@ -0,0 +1,7 @@ +android.experimental.enableNewResourceShrinker.preciseShrinking=true +android.enableAppCompileTimeRClass=true +android.useAndroidX=true +org.gradle.jvmargs=-Xmx2048m +org.gradle.parallel=true +org.gradle.vfs.watch=true +android.r8.maxWorkers=4 diff --git a/KernelSU-Next/manager/gradle/libs.versions.toml b/KernelSU-Next/manager/gradle/libs.versions.toml new file mode 100644 index 000000000000..59735055370e --- /dev/null +++ b/KernelSU-Next/manager/gradle/libs.versions.toml @@ -0,0 +1,80 @@ +[versions] +agp = "8.13.1" +kotlin = "2.2.0" +ksp = "2.2.0-2.0.2" +compose-bom = "2025.07.00" +lifecycle = "2.9.2" +navigation = "2.9.1" +activity-compose = "1.10.1" +kotlinx-coroutines = "1.10.2" +coil-compose = "2.7.0" +compose-destination = "2.2.0" +sheets-compose-dialogs = "1.3.0" +markdown = "4.6.2" +webkit = "1.14.0" +appiconloader-coil = "1.5.0" +parcelablelist = "2.0.1" +ndk = "29.0.14206865" +libsu = "6.0.0" +apksign = "1.4" +cmaker = "1.2" +haze = "1.7.1" +capsule = "2.1.1" +mmrl = "v33953" + +[plugins] +agp-app = { id = "com.android.application", version.ref = "agp" } +agp-lib = { id = "com.android.library", version.ref = "agp" } + +kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } + +lsplugin-apksign = { id = "org.lsposed.lsplugin.apksign", version.ref = "apksign" } +lsplugin-cmaker = { id = "org.lsposed.lsplugin.cmaker", version.ref = "cmaker" } + +[libraries] +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" } + +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigation" } + +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +androidx-compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" } +androidx-compose-material = { group = "androidx.compose.material", name = "material" } +androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } + +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } + +androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } + +com-github-topjohnwu-libsu-core = { group = "com.github.topjohnwu.libsu", name = "core", version.ref = "libsu" } +com-github-topjohnwu-libsu-service = { group = "com.github.topjohnwu.libsu", name = "service", version.ref = "libsu" } +com-github-topjohnwu-libsu-io = { group = "com.github.topjohnwu.libsu", name = "io", version.ref = "libsu" } + +dev-rikka-rikkax-parcelablelist = { module = "dev.rikka.rikkax.parcelablelist:parcelablelist", version.ref = "parcelablelist" } + +io-coil-kt-coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil-compose" } + +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } + +me-zhanghai-android-appiconloader-coil = { group = "me.zhanghai.android.appiconloader", name = "appiconloader-coil", version.ref = "appiconloader-coil" } + +compose-destinations-core = { group = "io.github.raamcosta.compose-destinations", name = "core", version.ref = "compose-destination" } +compose-destinations-ksp = { group = "io.github.raamcosta.compose-destinations", name = "ksp", version.ref = "compose-destination" } + +sheet-compose-dialogs-core = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "core", version.ref = "sheets-compose-dialogs" } +sheet-compose-dialogs-list = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "list", version.ref = "sheets-compose-dialogs" } +sheet-compose-dialogs-input = { group = "com.maxkeppeler.sheets-compose-dialogs", name = "input", version.ref = "sheets-compose-dialogs" } + +markdown = { group = "io.noties.markwon", name = "core", version.ref = "markdown" } + +lsposed-cxx = { module = "org.lsposed.libcxx:libcxx", version = "28.1.13356709" } + +mmrl-ui = { group = "com.github.MMRLApp.MMRL", name = "ui", version.ref = "mmrl" } diff --git a/KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.jar b/KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.jar new file mode 100755 index 0000000000000000000000000000000000000000..f8e1ee3125fe0768e9a76ee977ac089eb657005e GIT binary patch literal 45633 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�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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.properties b/KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..bad7c2462f5a --- /dev/null +++ b/KernelSU-Next/manager/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/KernelSU-Next/manager/gradlew b/KernelSU-Next/manager/gradlew new file mode 100755 index 000000000000..1b05573b1539 --- /dev/null +++ b/KernelSU-Next/manager/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/KernelSU-Next/manager/gradlew.bat b/KernelSU-Next/manager/gradlew.bat new file mode 100644 index 000000000000..53e45d311269 --- /dev/null +++ b/KernelSU-Next/manager/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega \ No newline at end of file diff --git a/KernelSU-Next/manager/scripts/update_binary.sh b/KernelSU-Next/manager/scripts/update_binary.sh new file mode 100644 index 000000000000..14f425833a32 --- /dev/null +++ b/KernelSU-Next/manager/scripts/update_binary.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +TMPDIR=/dev/tmp +rm -rf $TMPDIR +mkdir -p $TMPDIR 2>/dev/null + +ARCH="$(getprop ro.product.cpu.abi)" +OUTFD=/proc/self/fd/$2 + +ui_print() { + echo -e "ui_print $1\nui_print" >> $OUTFD +} + +if [ ! "$ARCH" = "arm64-v8a" ]; then + ui_print "- Unsupported architecture: $ARCH" + exit 1 +fi + +# Extract ksud and magiskboot +unzip -o "$3" "lib/$ARCH/libksud.so" "lib/$ARCH/libmagiskboot.so" -d $TMPDIR >&2 + +KSUD="$TMPDIR/lib/$ARCH/libksud.so" +MAGISKBOOT="$TMPDIR/lib/$ARCH/libmagiskboot.so" + +chmod 755 "$KSUD" "$MAGISKBOOT" + +# use ksud to install or uninstall +case "$3" in + *uninstall*|*Uninstall*) + ui_print "- Uninstalling KernelSU-Next..." + "$KSUD" uninstall --magiskboot "$MAGISKBOOT" 2>&1 | while read -r line; do + ui_print "$line" + done + ;; + *) + ui_print "- Installing KernelSU-Next..." + "$KSUD" boot-patch --magiskboot "$MAGISKBOOT" --flash 2>&1 | while read -r line; do + ui_print "$line" + done + ;; +esac + +true diff --git a/KernelSU-Next/manager/scripts/updater_script.sh b/KernelSU-Next/manager/scripts/updater_script.sh new file mode 100644 index 000000000000..42dffe8873bf --- /dev/null +++ b/KernelSU-Next/manager/scripts/updater_script.sh @@ -0,0 +1 @@ +# KernelSU-Next installer/uninstaller script diff --git a/KernelSU-Next/manager/settings.gradle.kts b/KernelSU-Next/manager/settings.gradle.kts new file mode 100644 index 000000000000..e8f86c859b33 --- /dev/null +++ b/KernelSU-Next/manager/settings.gradle.kts @@ -0,0 +1,21 @@ +@file:Suppress("UnstableApiUsage") + +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +pluginManagement { + repositories { + google() + mavenCentral() + } +} + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + maven("https://jitpack.io") + } +} + +rootProject.name = "KernelSU-Next" +include(":app") diff --git a/KernelSU-Next/manager/setup.sh b/KernelSU-Next/manager/setup.sh new file mode 100755 index 000000000000..3ebbf4edb4b9 --- /dev/null +++ b/KernelSU-Next/manager/setup.sh @@ -0,0 +1,30 @@ + +> gradle.properties + +{ + echo 'android.experimental.enableNewResourceShrinker.preciseShrinking=true' + echo 'android.enableAppCompileTimeRClass=true' + echo 'android.useAndroidX=true' + echo KEYSTORE_PASSWORD=$MY_KEYSTORE_PASSWORD + echo KEY_ALIAS=$MY_KEY_ALIAS + echo KEY_PASSWORD=$MY_KEY_PASSWORD + echo KEYSTORE_FILE='key.jks' + echo 'org.gradle.parallel=true' + echo 'org.gradle.vfs.watch=true' + echo 'org.gradle.jvmargs=-Xmx2048m' + echo 'android.r8.maxWorkers=4' +} >> gradle.properties + +./gradlew clean assembleRelease + +> gradle.properties + +{ + echo 'android.experimental.enableNewResourceShrinker.preciseShrinking=true' + echo 'android.enableAppCompileTimeRClass=true' + echo 'android.useAndroidX=true' + echo 'org.gradle.jvmargs=-Xmx2048m' + echo 'org.gradle.parallel=true' + echo 'org.gradle.vfs.watch=true' + echo 'android.r8.maxWorkers=4' +} >> gradle.properties \ No newline at end of file diff --git a/KernelSU-Next/manager/sign.example.properties b/KernelSU-Next/manager/sign.example.properties new file mode 100644 index 000000000000..bc70a60cae89 --- /dev/null +++ b/KernelSU-Next/manager/sign.example.properties @@ -0,0 +1,4 @@ +KEYSTORE_FILE= +KEYSTORE_PASSWORD= +KEY_ALIAS= +KEY_PASSWORD= diff --git a/KernelSU-Next/manager/spoof b/KernelSU-Next/manager/spoof new file mode 100755 index 000000000000..958af2bbc0b4 --- /dev/null +++ b/KernelSU-Next/manager/spoof @@ -0,0 +1,39 @@ +#!/bin/bash + +# Generate 3 random lowercase words (6 letters each) +word1=$(tr -dc 'a-z' $word1" +echo "rifsxd -> $word2" +echo "ksunext -> $word3" +echo "" + +# Export variables for use in find -exec +export word1 word2 word3 + +# Rename directories +find . -depth -type d -name 'com' -execdir mv {} "$word1" \; +find . -depth -type d -name 'rifsxd' -execdir mv {} "$word2" \; +find . -depth -type d -name 'ksunext' -execdir mv {} "$word3" \; + +# Replace inside files +find . -type f -exec sed -i \ + -e "s/com\.rifsxd\.ksunext/$word1.$word2.$word3/g" \ + -e "s/com\/rifsxd\/ksunext/$word1\/$word2\/$word3/g" \ + -e "s/com_rifsxd_ksunext/${word1}_${word2}_${word3}/g" {} + + +# Append '-spoofed' to managerVersionName in build.gradle.kts +if [ -f "./build.gradle.kts" ]; then + sed -i 's/\(val managerVersionName by extra(getVersionName())\)/\1\nval managerVersionNameSpoofed = "${managerVersionName}-spoofed"/' ./build.gradle.kts + sed -i 's/\(versionName = managerVersionName\)/versionName = managerVersionNameSpoofed/' ./build.gradle.kts +fi + +if [ -f "./app/build.gradle.kts" ]; then + sed -i '/val managerVersionName:/a val managerVersionNameSpoofed = "${managerVersionName}-spoofed"' ./app/build.gradle.kts + sed -i 's/outputFileName = "KernelSU_Next_${managerVersionName}_${managerVersionCode}-\$name.apk"/outputFileName = "KernelSU_Next_${managerVersionNameSpoofed}_${managerVersionCode}-\$name.apk"/' ./app/build.gradle.kts +fi + +echo "Done." diff --git a/KernelSU-Next/scripts/add_device_handler.py b/KernelSU-Next/scripts/add_device_handler.py new file mode 100644 index 000000000000..f18ad3a215e0 --- /dev/null +++ b/KernelSU-Next/scripts/add_device_handler.py @@ -0,0 +1,50 @@ +import json +import sys +import os + + +def main(): + assert len(sys.argv) == 2 + file_name = sys.argv[1] + github = "https://github.com/" + issue_content = os.environ["ISSUE_CONTENT"] + lines = issue_content.split("\n\n") + assert len(lines) == 6 + url = lines[1] + print(url) + device = lines[3] + print(device) + code_of_conduct = lines[5] + print(code_of_conduct) + assert code_of_conduct.find("[X]") > 0 + tmp = url.removesuffix("/").replace(github, "").split("/") + print(tmp) + assert len(tmp) == 2 + maintainer = tmp[0] + print(maintainer) + maintainer_link = "%s%s" % (github, maintainer) + print(maintainer_link) + kernel_name = tmp[1] + print(kernel_name) + kernel_link = "%s%s/%s" % (github, maintainer, kernel_name) + print(kernel_link) + with open(file_name, "r") as f: + data = json.loads(f.read()) + data.append( + { + "maintainer": maintainer, + "maintainer_link": maintainer_link, + "kernel_name": kernel_name, + "kernel_link": kernel_link, + "devices": device, + } + ) + os.remove(file_name) + with open(file_name, "w") as f: + f.write(json.dumps(data, indent=4)) + os.system("echo success=true >> $GITHUB_OUTPUT") + os.system("echo device=%s >> $GITHUB_OUTPUT" % device) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/KernelSU-Next/scripts/allowlist.bt b/KernelSU-Next/scripts/allowlist.bt new file mode 100644 index 000000000000..d95bb5ac49a9 --- /dev/null +++ b/KernelSU-Next/scripts/allowlist.bt @@ -0,0 +1,89 @@ +// Define constants as per the provided structure. +#define KSU_MAX_PACKAGE_NAME 256 +#define KSU_MAX_GROUPS 32 +#define KSU_SELINUX_DOMAIN 64 + +// Define the root_profile structure with padding for 64-bit alignment. +struct root_profile { + uint32 uid; + uint32 gid; + + uint32 groups_count; + uint32 groups[KSU_MAX_GROUPS]; + char padding1[4]; // Padding for 64-bit alignment. + + struct { + uint64 effective; + uint64 permitted; + uint64 inheritable; + } capabilities; + + char selinux_domain[KSU_SELINUX_DOMAIN]; + + uint32 namespaces; + char padding2[4]; // Padding for 64-bit alignment. +}; + +// Define the non_root_profile structure with padding for 64-bit alignment. +struct non_root_profile { + byte umount_modules; + char padding[7]; // Padding to make the total size a multiple of 8. +}; + +// Define the rp_config structure with padding for 64-bit alignment. +struct rp_config_t { + byte use_default; + + char template_name[KSU_MAX_PACKAGE_NAME]; + char padding[7]; // Padding to make the total size a multiple of 8. + + struct root_profile profile; +}; + +// Define the nrp_config structure with padding for 64-bit alignment. +struct nrp_config_t { + byte use_default; + char padding1[7]; // Padding to make the total size a multiple of 8. + + struct non_root_profile profile; + char padding2[488]; // Padding to align the union +}; + +// Define the main app_profile structure +typedef struct { + uint32 version; + char key[KSU_MAX_PACKAGE_NAME]; + int32 current_uid; + int64 allow_su; + + // Based on allow_su, decide which profile to use + if (allow_su != 0) { + rp_config_t rp_config; + } else { + nrp_config_t nrp_config; + } + +} app_profile; + +// Define the file header with magic number and version +typedef struct { + uint32 magic; + uint32 version; +} file_header; + +// Main entry for parsing the file +file_header header; + +if (header.magic != 0x7f4b5355) { + Printf("Invalid file magic number.\n"); + return; +} + +FSeek(8); // Skip the header + + +// Continually read app_profile instances until end of file +while (!FEof()) { + app_profile profile; +} + diff --git a/KernelSU-Next/scripts/ksunextbot.py b/KernelSU-Next/scripts/ksunextbot.py new file mode 100644 index 000000000000..2149c09bb492 --- /dev/null +++ b/KernelSU-Next/scripts/ksunextbot.py @@ -0,0 +1,106 @@ +import asyncio +import os +import sys +from telethon import TelegramClient +from telethon.tl.functions.help import GetConfigRequest + +# Environment Variables +API_ID = os.environ.get("API_ID") +API_HASH = os.environ.get("API_HASH") +BOT_TOKEN = os.environ.get("BOT_TOKEN") +CHAT_ID = os.environ.get("CHAT_ID") +MESSAGE_THREAD_ID = os.environ.get("MESSAGE_THREAD_ID") +COMMIT_URL = os.environ.get("COMMIT_URL") +COMMIT_MESSAGE = os.environ.get("COMMIT_MESSAGE") +RUN_URL = os.environ.get("RUN_URL") +TITLE = os.environ.get("TITLE") +VERSION = os.environ.get("VERSION") +MSG_TEMPLATE = """ +**{title}** +#ci_{version} +``` +{commit_message} +``` +[Commit]({commit_url}) +[Workflow run]({run_url}) +""".strip() + + +def get_caption(): + msg = MSG_TEMPLATE.format( + title=TITLE, + version=VERSION, + commit_message=COMMIT_MESSAGE, + commit_url=COMMIT_URL, + run_url=RUN_URL, + ) + if len(msg) > 1024: + return COMMIT_URL + return msg + + +def check_environ(): + global CHAT_ID, MESSAGE_THREAD_ID + if BOT_TOKEN is None: + print("[-] Invalid BOT_TOKEN") + exit(1) + if CHAT_ID is None: + print("[-] Invalid CHAT_ID") + exit(1) + else: + CHAT_ID = int(CHAT_ID) + if COMMIT_URL is None: + print("[-] Invalid COMMIT_URL") + exit(1) + if COMMIT_MESSAGE is None: + print("[-] Invalid COMMIT_MESSAGE") + exit(1) + if RUN_URL is None: + print("[-] Invalid RUN_URL") + exit(1) + if TITLE is None: + print("[-] Invalid TITLE") + exit(1) + if VERSION is None: + print("[-] Invalid VERSION") + exit(1) + if MESSAGE_THREAD_ID is None: + print("[-] Invaild MESSAGE_THREAD_ID") + exit(1) + else: + MESSAGE_THREAD_ID = int(MESSAGE_THREAD_ID) + + +async def main(): + print("[+] Uploading to telegram") + check_environ() + files = sys.argv[1:] + print("[+] Files:", files) + if len(files) <= 0: + print("[-] No files to upload") + exit(1) + print("[+] Logging in Telegram with bot") + script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + session_dir = os.path.join(script_dir, "ksunextbot") + async with await TelegramClient(session=session_dir, api_id=API_ID, api_hash=API_HASH).start(bot_token=BOT_TOKEN) as bot: + caption = [""] * len(files) + caption[-1] = get_caption() + print("[+] Caption: ") + print("---") + print(caption) + print("---") + print("[+] Sending") + await bot.send_file( + entity=CHAT_ID, + file=files, + caption=caption, + reply_to=MESSAGE_THREAD_ID, + parse_mode="markdown" + ) + print("[+] Done!") + +if __name__ == "__main__": + try: + asyncio.run(main()) + except Exception as e: + print(f"[-] An error occurred: {e}") diff --git a/KernelSU-Next/uapi/app_profile.h b/KernelSU-Next/uapi/app_profile.h new file mode 100644 index 000000000000..9e645cb93952 --- /dev/null +++ b/KernelSU-Next/uapi/app_profile.h @@ -0,0 +1,63 @@ +#ifndef __KSU_UAPI_APP_PROFILE_H +#define __KSU_UAPI_APP_PROFILE_H + +#include + +#define KSU_APP_PROFILE_VER 3 +#define KSU_MAX_PACKAGE_NAME 256 +/* NGROUPS_MAX for Linux is 65535 generally, but we only supports 32 groups. */ +#define KSU_MAX_GROUPS 32 +#define KSU_SELINUX_DOMAIN 64 + +struct root_profile { + __s32 uid; + __s32 gid; + + __u32 groups_count; + __s32 groups[KSU_MAX_GROUPS]; + + /* kernel_cap_t is u32[2] for capabilities v3 */ + struct { + __u64 effective; + __u64 permitted; + __u64 inheritable; + } capabilities; + + char selinux_domain[KSU_SELINUX_DOMAIN]; + + __s32 namespaces; +}; + +struct non_root_profile { + bool umount_modules; +}; + +struct app_profile { + /* + * It may be utilized for backward compatibility, although we have never + * explicitly made any promises regarding this. + */ + __u32 version; + + /* this is usually the package of the app, but can be other value for special apps */ + char key[KSU_MAX_PACKAGE_NAME]; + __s32 curr_uid; + bool allow_su; + + union { + struct { + bool use_default; + char template_name[KSU_MAX_PACKAGE_NAME]; + + struct root_profile profile; + } rp_config; + + struct { + bool use_default; + + struct non_root_profile profile; + } nrp_config; + }; +}; + +#endif diff --git a/KernelSU-Next/uapi/feature.h b/KernelSU-Next/uapi/feature.h new file mode 100644 index 000000000000..c1f75c24de6f --- /dev/null +++ b/KernelSU-Next/uapi/feature.h @@ -0,0 +1,14 @@ +#ifndef __KSU_UAPI_FEATURE_H +#define __KSU_UAPI_FEATURE_H + +enum ksu_feature_id { + KSU_FEATURE_SU_COMPAT = 0, + KSU_FEATURE_KERNEL_UMOUNT = 1, + + // custom extensions + KSU_FEATURE_AVC_SPOOF = 10003, + + KSU_FEATURE_MAX +}; + +#endif diff --git a/KernelSU-Next/uapi/selinux.h b/KernelSU-Next/uapi/selinux.h new file mode 100644 index 000000000000..a33915ed712e --- /dev/null +++ b/KernelSU-Next/uapi/selinux.h @@ -0,0 +1,31 @@ +#ifndef __KSU_UAPI_SELINUX_H +#define __KSU_UAPI_SELINUX_H + +#include + +static const __u32 KSU_SEPOLICY_CMD_NORMAL_PERM = 1; +static const __u32 KSU_SEPOLICY_CMD_XPERM = 2; +static const __u32 KSU_SEPOLICY_CMD_TYPE_STATE = 3; +static const __u32 KSU_SEPOLICY_CMD_TYPE = 4; +static const __u32 KSU_SEPOLICY_CMD_TYPE_ATTR = 5; +static const __u32 KSU_SEPOLICY_CMD_ATTR = 6; +static const __u32 KSU_SEPOLICY_CMD_TYPE_TRANSITION = 7; +static const __u32 KSU_SEPOLICY_CMD_TYPE_CHANGE = 8; +static const __u32 KSU_SEPOLICY_CMD_GENFSCON = 9; + +static const __u32 KSU_SEPOLICY_SUBCMD_NORMAL_PERM_ALLOW = 1; +static const __u32 KSU_SEPOLICY_SUBCMD_NORMAL_PERM_DENY = 2; +static const __u32 KSU_SEPOLICY_SUBCMD_NORMAL_PERM_AUDITALLOW = 3; +static const __u32 KSU_SEPOLICY_SUBCMD_NORMAL_PERM_DONTAUDIT = 4; + +static const __u32 KSU_SEPOLICY_SUBCMD_XPERM_ALLOW = 1; +static const __u32 KSU_SEPOLICY_SUBCMD_XPERM_AUDITALLOW = 2; +static const __u32 KSU_SEPOLICY_SUBCMD_XPERM_DONTAUDIT = 3; + +static const __u32 KSU_SEPOLICY_SUBCMD_TYPE_STATE_PERMISSIVE = 1; +static const __u32 KSU_SEPOLICY_SUBCMD_TYPE_STATE_ENFORCE = 2; + +static const __u32 KSU_SEPOLICY_SUBCMD_TYPE_CHANGE_CHANGE = 1; +static const __u32 KSU_SEPOLICY_SUBCMD_TYPE_CHANGE_MEMBER = 2; + +#endif diff --git a/KernelSU-Next/uapi/supercall.h b/KernelSU-Next/uapi/supercall.h new file mode 100644 index 000000000000..4eb62a7b0234 --- /dev/null +++ b/KernelSU-Next/uapi/supercall.h @@ -0,0 +1,180 @@ +#ifndef __KSU_UAPI_SUPERCALL_H +#define __KSU_UAPI_SUPERCALL_H + +#include +#include + +#include "uapi/app_profile.h" + +/* Magic numbers for reboot hook to install fd */ +static const __u32 KSU_INSTALL_MAGIC1 = 0xDEADBEEF; +static const __u32 KSU_INSTALL_MAGIC2 = 0xCAFEBABE; + +// Toolkit extensions +static const __u32 CHANGE_MANAGER_UID = 10006; +static const __u8 KSU_UMOUNT_GETSIZE = 107; +static const __u8 KSU_UMOUNT_GETLIST = 108; +static const __u32 GET_SULOG_DUMP_V2 = 10010; +static const __u32 CHANGE_KSUVER = 10011; +static const __u32 CHANGE_SPOOF_UNAME = 10012; + +struct ksu_become_daemon_cmd { + __u8 token[65]; /* Input: daemon token (null-terminated) */ +}; + +static const __u32 EVENT_POST_FS_DATA = 1; +static const __u32 EVENT_BOOT_COMPLETED = 2; +static const __u32 EVENT_MODULE_MOUNTED = 3; + +static const __u32 KSU_GET_INFO_FLAG_LKM = (1U << 0); +static const __u32 KSU_GET_INFO_FLAG_MANAGER = (1U << 1); +static const __u32 KSU_GET_INFO_FLAG_LATE_LOAD = (1U << 2); +static const __u32 KSU_GET_INFO_FLAG_PR_BUILD = (1U << 3); + +struct ksu_get_info_cmd { + __u32 version; /* Output: KERNEL_SU_VERSION */ + __u32 flags; /* Output: KSU_GET_INFO_FLAG_* bits */ + __u32 features; /* Output: max feature ID supported */ +}; + +struct ksu_report_event_cmd { + __u32 event; /* Input: EVENT_POST_FS_DATA, EVENT_BOOT_COMPLETED, etc. */ +}; + +struct ksu_set_sepolicy_cmd { + __u64 data_len; /* Input: bytes of serialized command payload */ + __aligned_u64 data; /* Input: pointer to serialized payload */ +}; + +struct ksu_sepolicy_cmd_hdr { + __u32 cmd; /* Input: command type, CMD_* */ + __u32 subcmd; /* Input: command subtype */ +}; +/* + * After each ksu_sepolicy_cmd_hdr, command arguments are encoded sequentially as: + * [u32 len][len bytes][\0], where len excludes the trailing '\0'. + * len == 0 represents ALL. + * Argument count is derived from cmd: + * KSU_SEPOLICY_CMD_NORMAL_PERM=4, KSU_SEPOLICY_CMD_XPERM=5, + * KSU_SEPOLICY_CMD_TYPE_STATE=1, KSU_SEPOLICY_CMD_TYPE=2, + * KSU_SEPOLICY_CMD_TYPE_ATTR=2, KSU_SEPOLICY_CMD_ATTR=1, + * KSU_SEPOLICY_CMD_TYPE_TRANSITION=5, KSU_SEPOLICY_CMD_TYPE_CHANGE=4, + * KSU_SEPOLICY_CMD_GENFSCON=3. + */ + +struct ksu_check_safemode_cmd { + __u8 in_safe_mode; /* Output: true if in safe mode, false otherwise */ +}; + +/* deprecated */ +struct ksu_get_allow_list_cmd { + __u32 uids[128]; /* Output: array of allowed/denied UIDs */ + __u32 count; /* Output: number of UIDs in array */ + __u8 allow; /* Input: true for allow list, false for deny list */ +}; + +struct ksu_new_get_allow_list_cmd { + __u16 count; /* Input / Output: number of UIDs in array */ + __u16 total_count; /* Output: total number of UIDs in requested list */ + __u32 uids[0]; /* Output: array of allowed/denied UIDs */ +}; + +struct ksu_uid_granted_root_cmd { + __u32 uid; /* Input: target UID to check */ + __u8 granted; /* Output: true if granted, false otherwise */ +}; + +struct ksu_uid_should_umount_cmd { + __u32 uid; /* Input: target UID to check */ + __u8 should_umount; /* Output: true if should umount, false otherwise */ +}; + +struct ksu_get_manager_appid_cmd { + __u32 appid; /* Output: manager app id */ +}; + +struct ksu_get_app_profile_cmd { + struct app_profile profile; /* Input/Output: app profile structure */ +}; + +struct ksu_set_app_profile_cmd { + struct app_profile profile; /* Input: app profile structure */ +}; + +struct ksu_get_feature_cmd { + __u32 feature_id; /* Input: feature ID (enum ksu_feature_id) */ + __u64 value; /* Output: feature value/state */ + __u8 supported; /* Output: true if feature is supported, false otherwise */ +}; + +struct ksu_set_feature_cmd { + __u32 feature_id; /* Input: feature ID (enum ksu_feature_id) */ + __u64 value; /* Input: feature value/state to set */ +}; + +struct ksu_get_wrapper_fd_cmd { + __u32 fd; /* Input: userspace fd */ + __u32 flags; /* Input: flags of userspace fd */ +}; + +struct ksu_manage_mark_cmd { + __u32 operation; /* Input: KSU_MARK_* */ + __s32 pid; /* Input: target pid (0 for all processes) */ + __u32 result; /* Output: for get operation - mark status or reg_count */ +}; + +struct ksu_get_hook_mode_cmd { + char mode[16]; +}; + +struct ksu_get_version_tag_cmd { + char tag[32]; +}; + +static const __u32 KSU_MARK_GET = 1; +static const __u32 KSU_MARK_MARK = 2; +static const __u32 KSU_MARK_UNMARK = 3; +static const __u32 KSU_MARK_REFRESH = 4; + +struct ksu_nuke_ext4_sysfs_cmd { + __aligned_u64 arg; /* Input: mnt pointer */ +}; + +struct ksu_add_try_umount_cmd { + __aligned_u64 arg; /* char ptr, this is the mountpoint */ + __u32 flags; /* this is the flag we use for it */ + __u8 mode; /* denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry */ +}; + +static const __u8 KSU_UMOUNT_WIPE = 0; /* ignore everything and wipe list */ +static const __u8 KSU_UMOUNT_ADD = 1; /* add entry (path + flags) */ +static const __u8 KSU_UMOUNT_DEL = 2; /* delete entry, strcmp */ + +/* IOCTL command definitions */ +static const __u32 KSU_IOCTL_GRANT_ROOT = _IOC(_IOC_NONE, 'K', 1, 0); +static const __u32 KSU_IOCTL_GET_INFO = _IOC(_IOC_READ, 'K', 2, 0); +static const __u32 KSU_IOCTL_REPORT_EVENT = _IOC(_IOC_WRITE, 'K', 3, 0); +static const __u32 KSU_IOCTL_SET_SEPOLICY = _IOC(_IOC_READ | _IOC_WRITE, 'K', 4, 0); +static const __u32 KSU_IOCTL_CHECK_SAFEMODE = _IOC(_IOC_READ, 'K', 5, 0); +/* deprecated */ +static const __u32 KSU_IOCTL_GET_ALLOW_LIST = _IOC(_IOC_READ | _IOC_WRITE, 'K', 6, 0); +/* deprecated */ +static const __u32 KSU_IOCTL_GET_DENY_LIST = _IOC(_IOC_READ | _IOC_WRITE, 'K', 7, 0); +static const __u32 KSU_IOCTL_NEW_GET_ALLOW_LIST = _IOWR('K', 6, struct ksu_new_get_allow_list_cmd); +static const __u32 KSU_IOCTL_NEW_GET_DENY_LIST = _IOWR('K', 7, struct ksu_new_get_allow_list_cmd); +static const __u32 KSU_IOCTL_UID_GRANTED_ROOT = _IOC(_IOC_READ | _IOC_WRITE, 'K', 8, 0); +static const __u32 KSU_IOCTL_UID_SHOULD_UMOUNT = _IOC(_IOC_READ | _IOC_WRITE, 'K', 9, 0); +static const __u32 KSU_IOCTL_GET_MANAGER_APPID = _IOC(_IOC_READ, 'K', 10, 0); +static const __u32 KSU_IOCTL_GET_APP_PROFILE = _IOC(_IOC_READ | _IOC_WRITE, 'K', 11, 0); +static const __u32 KSU_IOCTL_SET_APP_PROFILE = _IOC(_IOC_WRITE, 'K', 12, 0); +static const __u32 KSU_IOCTL_GET_FEATURE = _IOC(_IOC_READ | _IOC_WRITE, 'K', 13, 0); +static const __u32 KSU_IOCTL_SET_FEATURE = _IOC(_IOC_WRITE, 'K', 14, 0); +static const __u32 KSU_IOCTL_GET_WRAPPER_FD = _IOC(_IOC_WRITE, 'K', 15, 0); +static const __u32 KSU_IOCTL_MANAGE_MARK = _IOC(_IOC_READ | _IOC_WRITE, 'K', 16, 0); +static const __u32 KSU_IOCTL_NUKE_EXT4_SYSFS = _IOC(_IOC_WRITE, 'K', 17, 0); +static const __u32 KSU_IOCTL_ADD_TRY_UMOUNT = _IOC(_IOC_WRITE, 'K', 18, 0); +static const __u32 KSU_IOCTL_SET_INIT_PGRP = _IO('K', 19); +static const __u32 KSU_IOCTL_GET_HOOK_MODE = _IOC(_IOC_READ, 'K', 98, 0); +static const __u32 KSU_IOCTL_GET_VERSION_TAG = _IOC(_IOC_READ, 'K', 99, 0); + +#endif diff --git a/KernelSU-Next/userspace/ksud/.gitignore b/KernelSU-Next/userspace/ksud/.gitignore new file mode 100644 index 000000000000..a6b95ba31072 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/.gitignore @@ -0,0 +1,2 @@ +/target +.cargo/config.toml diff --git a/KernelSU-Next/userspace/ksud/Cargo.lock b/KernelSU-Next/userspace/ksud/Cargo.lock new file mode 100644 index 000000000000..ac8dc759af63 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/Cargo.lock @@ -0,0 +1,2169 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter 0.1.4", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.11.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cc" +version = "1.2.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" + +[[package]] +name = "deflate64" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive-new" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +dependencies = [ + "env_filter 1.0.1", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "extattr" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b59f8a77817ff1b795adafc535941bdf664184f5f95e0b6d1d77dd6d12815dc" +dependencies = [ + "bitflags 1.3.2", + "errno 0.2.8", + "libc", +] + +[[package]] +name = "fastrand" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a043dc74da1e37d6afe657061213aa6f425f855399a11d3463c6ecccc4dfda1f" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "goblin" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983a6aafb3b12d4c41ea78d39e189af4298ce747353945ff5105b54a056e5cd9" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ignore" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "include-flate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a05fb00d9abc625268e0573a519506b264a7d6965de09bac13201bfb44e723d" +dependencies = [ + "include-flate-codegen", + "include-flate-compress", +] + +[[package]] +name = "include-flate-codegen" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c3c319a7527668538a8530c541e74e881e94c4f41e1425622d0a41c16468af" +dependencies = [ + "include-flate-compress", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "include-flate-compress" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0bd9ea81b94169d61c5a397e9faef02153d3711fc62d3270bcde3ac85380d9" +dependencies = [ + "libflate", + "zstd", +] + +[[package]] +name = "indexmap" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "is_executable" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "java-properties" +version = "2.0.0" +source = "git+https://github.com/Kernel-SU/java-properties.git?branch=master#42a4aa941b70ded2dd3be9e9f892471023e70229" +dependencies = [ + "encoding_rs", + "lazy_static", + "regex-lite", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2735847566356cd2179a2a38264839308f7079fa96e6bd5a42d740460e003c56" +dependencies = [ + "crossbeam", + "rayon", +] + +[[package]] +name = "kernlog" +version = "0.3.1" +source = "git+https://github.com/kstep/kernlog.rs#68caa7bf1e27baea35b00ebba786cafae0bca90f" +dependencies = [ + "libc", + "log", +] + +[[package]] +name = "ksud" +version = "0.1.0" +dependencies = [ + "android-properties", + "android_logger", + "anyhow", + "bindgen", + "chrono", + "clap", + "const_format", + "derive-new", + "encoding_rs", + "env_logger", + "extattr", + "getopts", + "humansize", + "is_executable", + "java-properties", + "jwalk", + "ksuinit", + "libc", + "log", + "nom 8.0.0", + "prop-rs-android", + "regex-lite", + "rust-embed", + "rustix 1.1.4", + "serde_json", + "sha1", + "sha256", + "tempfile", + "which", + "zip 8.5.0", + "zip-extensions", +] + +[[package]] +name = "ksuinit" +version = "2.0.0" +dependencies = [ + "anyhow", + "goblin", + "kernlog", + "log", + "rustix 0.38.34", + "scroll", + "syscalls", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "libflate" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3248b8d211bd23a104a42d81b4fa8bb8ac4a3b75e7a43d85d2c9ccb6179cd74" +dependencies = [ + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", +] + +[[package]] +name = "libflate_lz77" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a599cb10a9cd92b1300debcef28da8f70b935ec937f44fcd1b70a7c986a11c5c" +dependencies = [ + "core2", + "hashbrown 0.16.1", + "rle-decode-fast", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lzma-rust2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a" +dependencies = [ + "crc", + "sha2", +] + +[[package]] +name = "lzma-rust2" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47bb1e988e6fb779cf720ad431242d3f03167c1b3f2b1aae7f1a94b2495b36ae" +dependencies = [ + "sha2", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prop-rs" +version = "0.1.0" +source = "git+https://github.com/Kernel-SU/ksu_props#54c81eaa51a9c0e1770161d468310656a53ac5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "prop-rs-android" +version = "0.1.0" +source = "git+https://github.com/Kernel-SU/ksu_props#54c81eaa51a9c0e1770161d468310656a53ac5b0" +dependencies = [ + "libc", + "log", + "memmap2", + "prop-rs", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + +[[package]] +name = "rust-embed" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +dependencies = [ + "include-flate", + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "git+https://github.com/Kernel-SU/rustix.git?rev=4a53fbc#4a53fbc7cb7a07cabe87125cc21dbc27db316259" +dependencies = [ + "bitflags 2.11.0", + "errno 0.3.14", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno 0.3.14", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syscalls" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90db46b5b4962319605d435986c775ea45a0ad2561c09e1d5372b89afeb49cf4" + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "js-sys", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "tokio" +version = "1.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" +dependencies = [ + "bytes", + "pin-project-lite", +] + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "which" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zip" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b" +dependencies = [ + "arbitrary", + "crc32fast", + "flate2", + "indexmap", + "lzma-rust2 0.13.0", + "memchr", + "zopfli", +] + +[[package]] +name = "zip" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2726508a48f38dceb22b35ecbbd2430efe34ff05c62bd3285f965d7911b33464" +dependencies = [ + "crc32fast", + "deflate64", + "flate2", + "indexmap", + "lzma-rust2 0.16.2", + "memchr", + "time", + "typed-path", + "zopfli", +] + +[[package]] +name = "zip-extensions" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bb4da4a220bfb79c2b7bfa88466181778892ddaffaca9f06d5e9cc5de0b46f" +dependencies = [ + "ignore", + "zip 6.0.0", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/KernelSU-Next/userspace/ksud/Cargo.toml b/KernelSU-Next/userspace/ksud/Cargo.toml new file mode 100644 index 000000000000..1821f57191f2 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/Cargo.toml @@ -0,0 +1,76 @@ +[package] +name = "ksud" +version = "0.1.0" +edition = "2024" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1" +clap = { version = "4", features = ["derive"] } +const_format = "0.2" +log = "0.4" +env_logger = { version = "0.11", default-features = false } +rust-embed = { version = "8", features = [ + "debug-embed", + "compression", # must clean build after updating binaries +] } +which = "8" +sha1 = "0.10" +sha256 = "1" +tempfile = "3" +chrono = "0.4" +regex-lite = "0.1" + +[target.'cfg(target_os = "android")'.dependencies] +rustix = { version = "1", features = [ + "all-apis", +] } +android-properties = { version = "0.2", features = ["bionic-deprecated"] } +android_logger = { version = "0.15", default-features = false } +zip = { version = "8", features = [ + "deflate", + "deflate64", + "time", + "lzma", + "xz", +], default-features = false } +zip-extensions = { version = "0.13", features = [ + "deflate", + "lzma", + "xz", +], default-features = false } +java-properties = { git = "https://github.com/Kernel-SU/java-properties.git", branch = "master", default-features = false } +serde_json = "1" +encoding_rs = "0.8" +humansize = "2" +libc = "0.2" +extattr = "1" +jwalk = "0.8" +is_executable = "1" +nom = "8" +derive-new = "0.7" +getopts = "0.2" +ksuinit = { path = "../ksuinit" } +prop-rs-android = { git = "https://github.com/Kernel-SU/ksu_props" } + +[profile.release] +strip = true +opt-level = "z" +lto = true +codegen-units = 1 + +[build-dependencies] +bindgen = "0.71.0" + +[package.metadata.cross.target.aarch64-linux-android] +pre-build = ["apt-get update && apt-get install -y libclang-dev"] + +[package.metadata.cross.target.x86_64-linux-android] +pre-build = ["apt-get update && apt-get install -y libclang-dev"] + +[package.metadata.cross.env] +passthrough = [ + "BINDGEN_EXTRA_CLANG_ARGS_aarch64_linux_android", + "BINDGEN_EXTRA_CLANG_ARGS_x86_64_linux_android", +] diff --git a/KernelSU-Next/userspace/ksud/bin/.gitignore b/KernelSU-Next/userspace/ksud/bin/.gitignore new file mode 100644 index 000000000000..ef8808242c5a --- /dev/null +++ b/KernelSU-Next/userspace/ksud/bin/.gitignore @@ -0,0 +1,2 @@ +**/*.ko + diff --git a/KernelSU-Next/userspace/ksud/bin/aarch64/bootctl b/KernelSU-Next/userspace/ksud/bin/aarch64/bootctl new file mode 100644 index 0000000000000000000000000000000000000000..cf5c61368467dace2edde81e880868f076cb2f5c GIT binary patch literal 154248 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

    Nf7BS@ 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/userspace/ksud/bin/aarch64/busybox b/KernelSU-Next/userspace/ksud/bin/aarch64/busybox new file mode 100755 index 0000000000000000000000000000000000000000..2fd8bcfa56cfad233d19924f867d6999dad49051 GIT binary patch literal 1710600 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

    J1tqu;;_6{GDxUAb{iy-IR(;p#bM zd6$-#WN+j(w~jk=%!TJ>s}UN(P6&wgXh=4mzIU7W;RW9373*A2T*#QVb7RofCCfW5 zkw3YYyP=1_bEso~hh0Utw^!E~9UgV$$92KDRE@G)$4*A$x(!gfIq!wOV#WQFb6lSD zE#HhuaFEFT?{g$pYhR6g(ewSAx5ww->a%*}W!=fg_ZDARvv^0>=lLd228VE_?pk+v zU}bW^54St7mrT9*{@}r4@t5JV%M}^&%M%`3M?TxCP|3aY-Sog%!Oy#o2kH#mfAwhA zWpB$(-qww44vKwO`IHFP7VfXEoOWbK(*2#CCTxeiFZOeGcimK$JpM`jsk{Co?%p`l z;d9f7pW_?f#kZ53Kbyb%bJO82@3*=Kx$Iv!sMo3oyJuC-iPPdZj~&n5-gGuz=h6&k zafj96Z|C*Q|MqhKmsiEcHLfRKq#6v$?#WA-WrcD$jrVe7O1WmcGI}dX|xA_a~)IIpA{G zZfV5HQ}&!}FQZXDO(VzNW8a=R>&(>c0%=^g?xj`@A?Nw|0VtDE`E7Tp6z;~ z@w(A^_NAiP_3Sa1Ek_?)SUTF(ZTA>!GmisT<=qt9_>LbR7$nypz40_hCN3E*9eT2_ z<(i4f)hhb3Lu0qyS(y=cw8uPy{x3~>wN4nOzxG^T4}IxCZJy@tJ3&DjL4ognq`~?V zwHwFZ$i6r@yJ3fFY2vxLVQX$(bH24PrNUr#fttaoEIZx3-9|x>ts24WUsK2C z&zhF>Yu8tqYnSwAf~t9HADuVf#i|ocX&h9lMtOk z#RrM8OHx7)X~&IgBAv=K)Iz5j$0kp`8vi7it9E?4zREfeH!qz-(v&qeBMyaMkJ*sc zJY|^iqwS}Dc+Kuu(HuN)uw(Zfxnb`Mob7Kq#eB<2a5ns&b!5wr=FZQPA4-;8+3@^n z(P){9*Agw))%I^UXy;66=sfkps2&fiE_oZ@KBVYcDVZDi(Y&Qz5sj;kc0cH325>CqKUw&ylZ zt+%M_R~cd#aMoga2OUwKN;lKPmwGph^LSw7WV6riGwbQ{BYq?2_i%l>Ch-+_o4?ra z!`)y(pIAHBJ#+616OEs591xsxD7Fu`m;TTLFBh>lcG~xRu_d)*?&Vti7QdIh@UV)_ zJIf=HZsiMaJ$Yu+9%1@e$sT-yA*rb z*kZ2NkfafV8dmJqni9~z-$>6_Y$h10M^|)NK098W zzoIf@#n1fL(?sJAc2sxDn>flUQ*zI3zmWe;-6HGTueh!zFD}~`oaeeGjIi4BWNpOM zU)Ce^kDqz4+O5>weD~9qC6&zsO2%+PwW^;l?mo)bf?xf1zVudx)TeY$y7Otrt<9l+7e)lXEL7>pzA9ZR6u#mf)#^Vg>2yoqNz=Ku zxh7#&0@=i%H%^j4o3^;Sy*T4JC;qLD`DNQ9aWm%*rkqMYf7j|d`%~o=8{w&|wFAc{ z%`h;cn{DluJ`)j-iI!+ObX0G1*7*{qfVX(TQ7Ky}}HBEm5;|h^+TrGsU!D#emdz z*D2M9qsqL_7tF6|FR%2NToq8}eK}DWm3-DG>f$Z-i~55z9>ZIkJGDnBs^RqU`-2jq zb;cfkC=e{!kSa>>xcF%I@sr^}>3yo6?Y+D~?-jphOZoAu$=?;HECMZ_TdhCGtvVEE zY8h|9Ik3g^g~iR84Lz^?au~_ka!ue8Qy7g_4$joT`Q(OVqG}+ z*)jNXzrDr}Sa%-@meiE#YzeGPT2@n$GHS`wZNnbcDE0&f${W0kRWi0-HaPWal+Le1 zFGj4(+Ag*I5^+`5>&z3MA5(7x4IA_;Z~pfUi=?ZU*i1GM8av+j7W}kw%na*gwa;9d zt+O8tfrX07$+7-u>} zVV%{a{e~{VH_I1+qjRBJ+<-hzO-Vxw1qn;XW&Nf zwcDmO_qEacZ1B1weCC6Uos<0%hWPG25q@=!O-Xads?Etg9$Fr6&JEQZH9OHi{iDe! z=O_1j?d_z#F=Bnav%$cXD`&gCpRrm0l;raMg6FjrLlMs3Tk(+G7g8Wpr zE`R^fZ+^Y={E~_3r|)SjnIiuX^J?X=T~FF?%Vm3Izdx>eYFw-D9mQf7`LAiivr|+4 z4*(@V+P{d&KscH}%~$-T=jzbgsExjcQppoE$O#SQKvo_F{XC&)K(M76AF?~$3cGW{7hh4x||v^~%}yVqf_za6J|M;&Y=f!i9V3+h2iHjvL7 z7Ci$`YuZ!4y7g6`Ck-B6?-9um7$1QE9qt}_2uN)8AZq>mM5XBOg(-KnV&?R5GnJ%_hCx37eA38@QeM<*tLaJ!@aOlYL!M36b$JhBR z{7ztPCfB$%QjlV-g(9(?z7jzPbu!-^CPDqhNXx}hz( z;?A_{mF&_A@WP^?v_w~Ten0riwB9rBj8rCe0|ber7(_NW7*cf>1olUME4QsuiSc$! zhu5@-hsn};%)im+Z>@gcqGOGFI&ve9Txs19+gLM7-FzWiNX}v!iz$hL0dXi)LG;2{ zQ2`PRnUUn-wVpZg$Gf|?D&KN7(`^QJA%_dSzWM4eYH+a-p>QOyq!2fY7gq)ch^-0j zDT^rCxfbZMs{4_v4X$zEX6;46_~mN>BqJ))(tYWA*aure*tX1c@>0fF5z-nkYPBZ!ex1G9(i&Q4?{oEVUn zt9aehUKc6#65$+`6A2as##!62T+|KPm-8H8QhJ!7JM!kH(ah%v-#vr^fbULg^OrD%&LHs;O!c5G6%tbG{zY zeY$dK83-X1TV~nf8m06i-Oes{7$D)gG+yxI?*49E$7r0{TT9bVZbSEODBP7^HLP^V zd{4S5;10ls^%+cq?~*HELOERyIi*-z%jQ)q1CmS|XbT+GW-Hv>Jz{{))))zcgnQy0QeAAbL$R;cVQ`MsefaAD_Jh&UMj4)cKVT z=807nZ2UcvH57-%K)ZI8V(L+L(=m>!jYqrMFQ;5meYe8}5<96I<1N`%V*b_z{Nz?9 zSG%2^TtNexz`wcxd+N;URq00KSs~xVSyhLN4jNB_xN8&`*VIBt%`{l;jhJi%81fAQ zIdB@GNlK=cbnx125y%Y!)=pg|dlB0gvR-%gBLK#ZdczF=E^H(aHf0noV;?A??5XN< zBs8nS(DmZYZ-3frP%n7OGRGks0tTpbpp=%f?arAQ35>e$wIQ*lL+52X(5qEm`1QIg zm|Qr!$4UytP0J)xum^HD5d|Q!`540!ZQg2mO5yy40zuV(MN`HvD$+G!GX#`W*{BS$ z>4=5ffCjE+q;Ozn7V+JYO@GmkfX=mgn&lwxDe$`W0bWd&WyVlqQ5ho$ELw5~xu&bg)(mb}>h#BXy2Y99(#y$wF0wKi z#vli(5x1D}_0sluh_>z-i(Gi)sFBjmX7n4Cg+fQIU^t;}i@VRTdIGHqctuv*3A4N? zJh7(u{+}jv_GP~xlI>{t{iZof%5~PdiZfprG^Xcsn$(lr%#B1)UPrGokIS0plygj@ z4xIU8+ckLPMIH*bGTo)3c9oT_*9DG#4fe5b;2VZ zLVBl+(M1!Z(^Ru%F)0b<_Vn(c+SbJyCKC@6y}5T7P|VNHRfjO4kiGnkXQIYCYy)=+ z+bMx}f5&7cA_7vPe?WlW)zaC#s*7bH+DBpQD{(bcnBcHG#CNik;EH8I<=MSYl;Oc) zpjcKQ-@#X~_6QwAsJ_YtY!n2dXW2uuA}JiujV2j)DQgx|*%-}4ye3hXVqcKhIX+GY zc$fHAnj7iv z@_`?-k77~9feBwj z1(BhcYR-o7OBp662>QNXX89X!+v(YYI^1*3e3 zV!vbn(qe&2BARJJ!obCJxU;rFH40P&eCClX_t85U5VCq% zxLPg}gNWpaI52R*hM$3uuf_)B9{-T~M@RUj*lELE|5XL$d9dg#l4Qqn>Y^$KJac$r zg#vbU>3|l6wSgd$EkO-{sHN`@n0N^u#xI*^8?Blu((c8#TOTVu$L$@lv+;GM&X)&) zw=O?}Nvaz&-wm+ovNqu^r74t#4~h}%zDuahjICD<@SHNQfw%V$p+*!?j!Ox|4hT^_ z+>vEe)hj)lWZ+oskwboh#*?0MY{v51qpOTkq%K~{YGUI9$@dAOQsDOtvNwJMd@wDZ zvK8bLiN`mTu4P;e#QK(iE#|1wjK2ksh`MH1nq{+5U$qX}Rc=vJfmTx(`Z>UcRUjK4 z2UXx}?yN_Mu;L13W3}uVC%S`ohqRPMr#VhOR^`z2jm?gVosmule|+|dmo#r6@&`%w zC$eB~i$A?$g5i}#c{}_OT+g%&h4aom&&8z($|?7ov|E+0-!nV#3Ti|v;}cP&S7WBy zL6rjra4rj;OMgP?%h##%^u6ne8+nd7df&PSs=zqqk}w{*ez+ZHp)+J1+>HzIvjJnV z9Jf-|8gF9M>na`4wM&@oaA<<4dXX%(4RchwCCraXj`>t3Wgm)WuQ!e5%Et(LdMU|My0Xl`-5wBj?n z@Qe*A*g4E{I#W<;rE^Nlj_zpNNys)=18RSHA;F` zx@sTs4$egk6$=<`A0GQ?Pl*kz2HA9f9Q^Ea*3Qs7p;A0kG|Om|@xPX!T=|0l8g)y` zf&wW$BsuUrm`^$_2udLh$#1;%*KT83F81*RRAamtL5+PrlbeP;`KL_iD$A`n$Jb*Sc zjPJBEC9xh#9a7a>a6^}A&j4=(s$T@egK3U?q-G2m{s3!;{4I|lc@0z|7tS6_n);|{ z%)$HnSH_98jFFKDeOYE3Kwyu?OCZapIRR}D1`E;+3B>rqFDp1MOqhpKN|F%j8qtJq zDR6c${V*cV%7J`m#C2}>gCVWY0Va_wix$e`poE|$gPeXqv=XL!H%D(LIcMlNf^P|d z@a$7p;bgjO_#beUQVMM;iz0-qtOX$!BOwu3cYO*fCSX#%B%tB~LQuD7tGh*lcHc67 zIGr^X^M)pD;?p7wq-d&dbvzGO;v*hpECi&VSNc5u`%~!z{wELPfAUKD&vg&*)0!lV zQt6)Tp%cnT5-gPfT$>asg9h5hzmon77Ih`&8ib=At&YZgt-M9euZMat-mJ6N2v%D}+3g0W7{vy?o7f<~W3 z-{CL)j8Q-T^vXphWoLNNqtKIR*(h{Yb`arSr^gS%TbJh)pQ6Zh``8#vEdPH>nT*zM zZmL)|q!lMaGtDk-N&8<}x>nBGihPb=areJB;z#Btls3`($HT+F%v=5O2tlA}e~Nu! zS-Nc<<$nAA0|D+J)#mI>dg`O-?F;<8StV*B7O6^;mFX z@1^EEam>2dlF0s`L2fgz1-amwzLKObrfM=y*>JK;1(a%BMt;$nA*b+bM7p9hA$^gZ zldv}Pa)A#1)y&<(NbJoMLmg`+q-2mB17UVKK&;@uO4w{AvHCDE!H=hF`z|>Ve@++6 zw&>J}Nd4D$&h5l15yMY(%xfeB7PIA^Iy1IG^nCU!L-OeQkDk1fG*=g5wdCLJ{+r?Z zaNq<`1=G~TAGP#p_wYP~B2Fpg>DoYuhyoy=#uoP)t5W~};BnTbrf zloq;T%8^BF!6)*|G(NBIwVAy5_-uc_l;T6a^1&9Co~FYaX)1`KFh2aG=+j+HhxIU+ znzUQUxlAm;pNmyO+`|(H<%Ns=_OSFGG?M{{{Nfcq3aR_~_;Q;4zl9G++@$0t3&zC7fMDpe5BmNa zK$|AQq98DhNS;@osE4KG370!znkaE)kS(q6@y!I95+gyAnPo(Btv{PnmE<|<<@L#} zttVyy%`!4De3?-$WPA19ntnbxvw4_gk{cyeL{>ya5uA*tEfLJgv)3tvd7*aH0gfjb-H@>!QY;!La9H& zqkXU+`S7zFs{EIa+rYc)Gp=`O^!+`Wx>>Z1?Hz1GILD@zlB^Jc|4(qEBL$2f?4kat zCMT_c-~3!6$SbX|`KJlS<7z6A5cMXRCLa4$e=pY0@4xN;w`R|Y^E`p({%}87c~9;z zeTT9AJ-0*ahxPA_PTsGWC}EYnAEpsojZ`;w8dT z{^(MXtJl9e2BREIw=1=IG<`s_wd4@rWI9?UaMkq77rd1S!NP&!Kv+@Xd=b+YvX3y} zYGJK}X>!){m64h2W}P$*XwIuumd5a(#rALb#!9=BqvT$ae1{N62Yo(jYK#(^L14*V zaSyF%Pjwf^E6cykO~f-6vqKpGW&QQMm=)R2FDX9l5MVpm11U z!TOP*K>&iLD-qA)3qjf-v7ukgMcr6u*6n!lRVm(Jmt(J!^GR|(U(0p~s%5Y2Dc9AGZ`CE8UgdzpeB3bna{dop8*4Zzw~=ay~}x z<5SAl!7ovBDPmF|6ER~Wxm$FSbSkNZsIpo%8)`b1pB9h%JkqzjN8_l8B>wIG^Uj&-tI# zCu|p2*j<9}&&)(L2H^!x3$}-LICdm3o5_28d2dKQ)E`C+AwYk+Ad|mCUOEoc>^5&a zzssFZdh+~G`@v(^@|jybcz=~ERWtj1@_Zlt16yxN=IqfxhKsptB*@x`gVD z!Xd})l9v(lQsivX@G#lh|!e>2#PRzSXBgy#t10IiUR>y z#8Aimf3u<2xI5!sI;YP_FoM3Q3$L`CY_4`FF^g=^jF2;_i~6Qcz}2pYV@oSgle8D7tsqQv3>x_I z#`2YeB)*QJRzsTyyKa;!G*&fRwI)<>Fz@G}d;dS5oL$vPq%(7Yl1e5(Y(rz(hNB^Z zj94m)q6`>-qyUgjq2mMHd$v!9X*_v5C~Y2A2F@nAvbpN^j9bZ zMbIdU&^ViVOS6o4vvQozRlE9k4mP0kr)Lf%B)biUD917h)GZj>c!nmm zcKRUVbrcBYoIvO|pJrk6e0M9yt3<7F4q?FIIO{K@2&_R44XKcdH8V(+G3Jd#4NNG0 z9c$J-V0FQ)Hfb9ma0nZ)E}B0E5cDHj=#fctIXYoa!M;SOeOe{pNCsBk|^B7WPS0-4;U*TCfYp&r<}g@H4YC?Q#P}e2AR0;ZZKF>7 zAmy&!*F%B!rtB}G!*+1Vz<{JuOiR9Jy}f}VWrrNRvo*eWHgZOtdiPrEf~7Uh?chO^ zGd)?MD>Mp&;{8`e5(=~dd>ii0f+(01T9r?g3JJS1@ zHV+4Oa1^sb>E}GXB0xv{5Ycn{I19XB(=lm8G8xv$PV9s3sBT8yCy50SHct8!F#K&L ze_J2HiFmPjHQ0C%9b+57mD#$97ipjIhz^z;mIdQ3l??qor*xrilU8IV8E2GxgXaY| z77I-Mb;hiIMONvD1{adWJnao!_74}R^Y3or z9ZjJ*AhHT5pJf6;laxHq8{6ZF{yMx)`VEjfPNOwcPqiUjlHf6o21j`nrvk$Z8efql zl1N6^pq4BG;|Y;F_aA#Jf+!GP!_=^${&gx~Vll5?`Q)(}$smq_9O@^$Z+T#USA7jD z#DRgdqpL;4#`HnbJk%M~&<7}%?%zhBT@l`9xgWy}fV18-OA!c5zL%kIJQE&q{jw7z zFhOT6B4(z{%$NQyv6JHv%>Ex0jL@{g#Wn8xyPKK|nZ&#v*9WhzoTk6$N$W8VDDi7v ztLxLKk#!Lsms&%#CR&aNpJPE&%V&ea`^tfYU%f@v70jo-h9`17PdJXDRFrYS5*RN+ zgbx%HD-YztR(P@kgi!e~mBJyqAem+dX-HX!ddg^sj*%o?A|aedNG;1UfV2fI?9}%j z{sw8p!-2I9F?!@C#KWQ!b5%tyfv98V$XXA1I7m7(^?2ck&|-CzSkjX~b1U=g_FDTE z?I9Lb?>Kyt9hiK?0Ywyu#bUA|3nD+`7c2O5mu9!JjSv5n)FV)0$@F36S+Bn++vc*- zqmQ$t*ril@-oB>>&*QFZ6_e*Nf*L3t=bS|09sR8Ip8q-p5Lf~u5d@y^t`jFQmP{Zr zgTCoe4m&@7D|+8c*F2Fv%BQlbbPWfV&7rEO&sEE1@EAB8KB9f8O7CL#4QePGd!LJ5 ztULXg)6J3Si)unYT1wAaXztc!wTsN>{{zo_MgG>OHv~pSJ^~)2HJtyQo4fE`^(@4d z(n*bGqG)-4=W$FsmBMkpV&?%>8k6-}L*^%YIiopuOpx&DP7PLcVRP@e|1C?wO>H4{ zLp);Ng3=I2C_5QL%&FP2wl1i;be|B_lC!(qd4A@eJ#!+~G*Gm_92dtj)YL%@q~g_TjtHAnuE6Mw z;BtxM7NQ^h|1X;ROa$ea_|O#?d>(%K`HGQN-__{6*VK4Nq*BDGq~(~ncc^R#6HBVy z%?@>)l=l><8v%>!c2*lrHl{E>!i`OtW*lEy8RY_BV`Z+THdqq3QArX2k#)dIs4W8X zxm+2cZ)W~`1P0#-Wl57cN0+N|ek3{lC2`Y}hk{_3Dv%pzT>m!${AC>apd}DPB=U8| z)(2qqU30S%6m1eOHV0ABC0W$hq5d-5P3IzjHJs8&k^?=t8u*N?Dmr?jQ4$uW`P+7) z|8;Iw34oD<7`MV!ctg|}IOCp^GkgLx2x0`O+9()FGo7P&M}s6_Z{x>y=DrMb4T9b< z^9;OtVz_#cLl!~6Xz#e|Di&awv^ZB8h1kS4k3R@;OC207?3`2n2R(%C-2JYmW-)$< zzieb+LMf>EvDLwXE^Cu$ zF@Q~(FRq1s1m9wl)EfeiujfOjh;~TwvW)r`z;epR^d&OVDHx1Mu@w=5AS#iO7Ah$a zQVpyGP`&))3Y*LKErpkkMZy2uLZ)fvw3bNuqUa{QjY>8JJ2eCfy_UY+<2Z}Oq6M3~ z0cipe7Ov?bYsLv^DPbVxBGv^-vq~=nVU_5OhqtOiB`eSPRQ01!G+l}`FSe1#KnN@1 zkU%hW+r-dysj!4J5unzu;RI*Wkw*)B;FY+rA)uTV&OHtWA?t>?jSb*EcPY>jC^y&5 z#3UL6ti^GAD$eCE0yy2JZKxvY3nxJ(BK5U)H&j7nlLf$mMAqxOVJ9xwH4;<2hAJsh zHSH>Cy&O<8gIfuZbR~B^{t~39D4_PVKo$!aiV=(!ELcTFM6{}tr+xx zS$ncSHxm*v&~y#w&v1aFf};7^hQ6&@k?fvL9Sh-o1GlwD`B#GQ(*np`nr)5{`78Q= zeTIRHr4pvkF+0R(Vrd@$Jvd&w7~xtOiwmsoLyUGK+gr-!*2xSQ#ioosmsT34C+RruESEL2|Y_=B)6lp|?c^snC7{BLW|EWPJABA2O6KUc7%!3b9 zy17AcUW2=)eS#6Ht*bY(R{v31w+Q}I!KacU>W;4k0HV#6y`F+XnQ;-xK8lgI$r?abmFS z42!Qb*{Y)!&pZ({;dIyc;l)frX@_%mAeV)lEr8&f-kcnsMg@+8@sC$kDJMk~EF_4* zwvgJ+$GiPKcUc!RU~GQ2pcv-6`|^^51>VuIlGE|XDdN7diu4?B?PSb8NHY^aN?~S# zrlZh>-o$Bf%2JQ}w1>6>#mhmbpn)4q5%X9aUPY83us9l_3#u=^oK!?ZY7tqfY5|D~ z$x^Var}P>>LBc9^fGkM@hJMWaPpi&W=1R%bl3#_3i5UmYV+#)q5K45w%BTb4k_H3L z1<+0;61Rlr;#9uM&N~m2xX8^Sxu9y1VlGNw6ZIq>BmeES_Tn z5Oyg(4}?SJhToL}{H;y+DOj^DPaRwpR6l*EzDMqHQ9>gk@ofGB#CJnxO{2ZC*`qNg zG-vwdf*YlRx}}H=5(*#gL-i-d2_~5S4IdCukr14R>GpHS@uQEG|3^E-+jC>Rqg#M? zN5*eh+3)jsS9h7i>Pc6tdV)*&K2X5-htFXN;Nc3EX(Lg7vww%)nF@=q2amZ*2W6clKLx`i#tPJI23!`Hnzbg&`ia@=H!L#>} zwCchZ!L8(vFJ%#FVfj@mwNEUoDVy$xJ1231A`MTPD^!geH}Gok#(uo?J`Y?)7Lvh~ z@US2+lSX)!Hsc7qYUq}k$y2rLjqxnDTt7Waewifo%Y=)ZhHstxS8o@vR7eY1AxchZ z2?{mslqRLKJa-7Tj$zf%?rxl?uSC-XBg^r+a)WgiShcKhKBnjCo1D6$Z{_dW)Z)m2 z?7@s`>rTVf-@U+)@X$U6uK42^Rg#x5RXft`{d4v5yJ;@TZ7BrH$WusD5D#2Fleb!! z$IE|9Haat1bQ5-L-Ggn%lOZB+K%bk<_4T(~uN$=!#8r$3UGo9dO5##U3JpZDREydn zBUSl!^(EZeC)-568ihOYlbYI!Tf4bKBp6N;bWu;-)h}*Pi6w9oY|kKhmqtk>Z;NFJ z@KP*cq|$AKjun`^g;>c~_)Z-?k;0KLJDv5eF!{%d=*uT=15!vbh?A_0NlGGc$1W5H z@P#vq#FFw?2LCY-(Fgi%A;^L^q-Tixm@QEeR{!Cvi=V30!gLLzuZq`Gyt=$`_6xymqk5k?TCdbOq#R&vB4#4`OINRWYMyrBM z-s5uS1Oy8q#wwEX9v9;eGwh&!9h^Rmla{{k8C_SJkx`ZB0!9ovuY^p&N7mBf`o42J z-li+qyKL?!P{&w@Z(MV1yU=I;JAD4H_4yCMV(x=6#?!zSPi0jS?Zpg|8a0`7@dvQwe`0p7|GCx3k`dazl}I+J)88QQAr{_*h)mcZa} z5Lz&q8FO$fEJ1<36gt)y)Aad|$G7PHf1H*1r{6RFn3Fb^Y**P|TnU3w`=BtoIGD*4`FtGr~ zERZyQ|BWZ(2kR)@*9e25{wH1CdLc!Zy!G%)_-2ce&vZJ#cREDcox>PlFX~l~L1sIGIwHZXRdxSA?Xek1dQ^bTB6#SX= z>uZ>B`=Ko}Q2G-KUMGO(wRc8JfE1p2M3DXg!nht1F^LTyvaJz}RfHNK7JrQ?hS!0T z7V+Co`l&JgSz16$SeAqTC`cdRPxR%`ZQQBLd6DS(Xu$@jyU-s^aK0C@G$a1q5LJkj zu;8{#ciHXnfNY~p@~m9Ry3(w`Zk4ncEf0(Tr>ABA%)h=*Vi;WO8@8(FQzze&RxjZt z@Q3O@*rLWF2+zQH*gbx2$I*Irrjt0PW?xI_HIlb1JrB|cKbU~Pm+gkmi%pS*Ztw#F zGQc~;H8h5_W@8U1(yfw(H#7oB>wkKzd#Ha0P9LW8)3XDFLA(^*5Zwd9INN)JkI&F# zTm0U?s`og@ghXKq@~b_T0#0?_92l3Cym7YFF^eQ&j9o@a;E_nOf5u9SOhXwziUmR} z3>>n35Fk_ryH8!_9FIy2BJ@*MnjmtBUWl3TQP-m{!L2J7WLowR7>7C`qu z=ARS|F_1xGpRtl`n9aXMGscF>>}SNt4TtUTzXWwylFg*X*nsNYy)E5e>!PMyb0MSG zb<;su`>d91CtDryGM?__z0fwLZZJOxK0!68FrqFy^wJ$1nZo0P>=uNixsceN9N_hv zJ;_hq-3+*m{O)~~dQNSZl44Y>FlI0o)^tI2A+G<;iWHN)HS2S@yxddVjE+P1UTq$W z>mHae2HOvF8%h=?&BuqYvjUw(G>Pi;+R_3@7VhZ|5)g-EA7Pa#E`<6B0tQUbi5ecV zb&D5;1@-TRe2O5Oo*q_BrrUQ?T3)zfC=E))bO|fhk&vq?k(#@MxaO+5=$|fQ|A+_qu-Nyie$&EB_TSAF z?x%_2;(eg39!AMLu&AZN3LHr1-z@&P@cMTW(0RHy!^VjEotkg)g&)mqpO3o>AQ;f9FcSmBNKzL~ z0N5Uy*rTYrWBCuQo$EOFf5H&DDo;oi{2c|nB><0=sMM(f8*nfO# z5sV&eP2Vj8x(Il7SxInXqkrBMANB|_@)@ZY@A`LM?XR|rO@tl*;Ls?uqL zBy^9aLr6LMS=>{1C@@2T0>jKqIQn}6j8QrEY^7R-vZNPpQRVXf?>hvjh*fx-pLz5< zu-m7+X%>vFAxk2`fUQa^9@7Og5VfThh)`+(hFE0^CKUw0wkBpu2;tbD%j~nrH{i!@ zj(pdCT+3jrEV9(Av^xtGV4#A;k2ZiTG8@QWY%vzZpo$$VDZ;lUEXJI*Oi7Ixce@B+ zr!xG4=7Zb=5Pp3{_o@iEU=b+TnVYJsmSkKkw%|I3h3uQc^rNH_i`BB+Sl)6Nr9=f` zX+WbTg+}HcSZNrnSg=AGq$N{O23?8Gd%fyi-= zLsgs{&~4frZ^BQAJMb21AbQwT)D};@1{ZI@x*<4$PI+O(Ks^X_MIw-x(lJ|^2kptHRTAS{qJPW(z~L*e1>4?s{$uJjl%P)LFf&Os?3 zXV`64Hf)pcdYOLOz-xRe)fp@o!SyCXR${XXIkB7Z>=QIR2wb+=R1w=$na#OrwWtqc zw2=N@vL51?vWb@*$*Uz=D(=j{tt#H6=)*LZEWzukP}4P=R|6-wbmpqk+8kvaXx=Ev zl{Un<;wblBI#-pe0N7xbg{iGwgxiFm>wA=cP8?;?6p2}o3j|nqNWO{I#NmW!f*fx_ zcoP^uK3w`78*-d2U66>;5Ig0|annt@T_gW^c>^y`u zqQzOjntE%NH=CF>o8H{EQ)5WsX32@&Xw9kFGoSU|0w_;<2(*B~_xC~Fs_X|6wGgq{ zYtFkN_=c?Q_TM<2@JF*4#jYeh7K2)Hnt|H4!j{CzSCJ|S>;Bq)QQkuWNIBDy#?6Z% z?)6lVkQJY~IX)->p(4pM#P}#S#x083#+SQ!`@u3_VBH{9*VZk%C*%aTQa zMUYU3;3SnF)c(2`>-T#3+7L+s3IzaMYIy$66bbcPC(xTWD(0Z0s8v$I%-EjsRS;@Q z!zwQkn;!O47$e`GdBmz?BbcA*gMQhvaDhM^p;CVFAzf3>7v*KFy)tJo!}ad~|j&@6t_V zC9RxVGWWtVD+qsVE8dm)o(Eb&CZYR8bY6S)jK`2@?r1>JvU{%<{B}B5p$YkxfkZZ{ zMO3tfUE6lHS*$-V$innjybIMb@oR9=*PV3*^6S6PxeI1vS5)}!KTF}%uh^dK^c?F; z1c6L5?#nvXEMeWRzPaNfUTLWqF-h`QEX!j?^dgn+Y%59)H zz~S%AaUM+XU@73Mn0eWfwvch^9I&*28#~Y<(0kk*aUQuk8=E>>iyhp`dR)WO+@M(0q});t zK-$VIgn`X@u;H9E5h=GheFEuJ8&aewBY}|)upoz#mlw)NVSvgWwro(tEKuQx7Z6R} zZgsX}DB|Y&eeNG*S7oNniB^GzQGhHAX>TEF_p3|OXDG{S&Rt6oQ)U!Rs4)gc3z&PlVso?PqmD0(x=7AyQd$yWhL|unzQJr{)t?TPh0|LU zHm)(Iu7T-qzdEk6m1dF%_Es=m!EJzId~wd43ZfxH)k5AWkzAyOZBUmL#SHFPCUyeC zMPF&vNqQNm$ffG`QxMB6VT!Q}A+{5MnFwc*e5@%L;0FgXia9qcSRPr+0OaC}4mF7o zV2((kSCfqFG-Bc{m{r)KjyRG~Ia|{KHd0IEF`62(9qnOZo7g(osM(5wjX7z<2HwWeaXHxwTQn>IFkw z9Ij(wBNIb6LyJG9Rf(8E*gv57Z%Zr zg)0g*VQs2`ffuX7uCOacM296J?zKW+GNDL(1->twW++7r3lX;<{DBn&5kpM-mgFE! z2VB<~`2=03m}%QvFksEoaYu*Vv0z=Nbvk|o)NufAuq{ix{Qi(NPKina;CXGxjrSeY zHaBx1huk}b9XV)D(VO3+oU^uBo9^?RQ1IoP{SXf6*VcbjnJY!K$q9uRf})B)0<6=^wd@ykrQK61d=QjuwNUFu_W3KBf&|e-&A?A zd`@GY!1`Mz!d1D`Uy;Sa*3BS`i%RM3GRoC>1P} zZ2h5lO~SGn3VA48D0ElDJE>LX&LS9X=*i1%s{mDI{Zkr!1GS5`Ei@h~vsL6+42|D^ z-QxGJIvj;zs`wH4XJc}rGv@*uKF$$BoAPrXtRkzR*t_9u;rzrjW7Zn`#Ps_E=8{Dr z6;uV12#XV7+iYo#NVuM!SkVSxEeP)_N9bwJK&!Fxq6tY;9wFP4eI;qhUUiDvyukyA z+@0`MAqbX$Uv*YSJGxSir7v*qc|CW;$&w@?0wJar;s=CHp{*|0pnYkBX#-Hzgo4SO znJpKvhJb|0W4&Q)^sMaQ*FSPLC&`BMnj*-F1$v)h*q#XCC$W5A9P)F*kG=y)Mj1Cy zQxU2(BM}ze6;V{Ex6|%+nX)@$r38W4Y@3|QsA1G=I;9j8V4?2JEmoW2=vbx9>AbsY zU-4o7hp;p^EIn*vcc19GMO1--j`S%EfpURDUjm4bdtsaw+-OU{2ZtTJs`fT0d2&Toh`K%KA)^!_ zpld@$nQ%K?*0jzU4q!nycp4uZ(r>FkZ(&|w#p&fW5Hzz!wJR`BN%U-NZR4mf%bf^I zf=CgS#8V`STpK!qLc7vLB|?#O!Zh6Ho6yRLjAT9n5s6e((L_x;cQz5FK~kiuD>~ep zU64GC>sL%(R?`7vG#0C1(9@z7@u6gVlz0J(1?NHYLZCWVOSc~6Td<%;*VE6>AUm}M%G9p;sH~@H& zkt?@;XCDfi>zajeEM$*Nya8N-g}qs`11uvk7v5y;W)LB*h&(r!((o5(jSygiiEJf( zm4YLd#>EB`3oBKV<+Y-@GQJ**{{Ghe`cVc&w>)849u?>qXRE-`Bor`29Eu#ZxT;6ov_pOt$Jzuh^U)RqG zuwF=-40#6N)HDe@f*$*o4$l2YD0XqNCN8|)Xx4isg-s-giDz{r-(ctmKhz?MhSs^ECs6x_Hf~2Qncd1`5 z2?ovsMcd&3bafgl>wv)fYfYfL30tk7+Md>U`*TX9~-uZObTY;UuR`al9eXLS#v zGrD}lhmz0W*)S501|n3Ylm!L?N?utg$HCRx47x4_RH&g7ic}SJkgE_8B8-)wBu(Qg zhD&NKH%c%Z8Y2M{vjDLUHBI$rT;%T3hnuRHOar>~)iXoe6UoSpkZV%r)A%k|-!GX%Kp3zHthaQMpGjxt$OA3oSZp4{MG zx7v5;v0$R8(p4+HE|{n~YOp7*B=dGddRc0=P1%fD6cGiB3d)gU$V5@_vZyeKu$!>i z0ME=BP2h2!8avITR83@}#fqv7_u8r~w6j#8pq$k#KDK!GdQYbYx#^*%jZ2bxdTO)4bxV-ZLU=Qa3V928KJKx4T0p^^> zV2n=giP};hsf1(o+1TBJ}ci%3#?nXEk4&o2hD&(AXY%F zU!KdU@&KTOO$TSfS>c`&cblhSG>O$ z`FiaF(@@s~tre<^E3V=Jvm_A*R3|7?f7!R)+0~(BD|n{WFZnT;nB2^iJptM!uxVP@!#l#Ap=q-MDC8L2SgG@j8st(ig?n9 zC<_A8ixo*Q?W8y-8`uyqf=G!{aUGI2>#6uceTMH%Zki5eq^w?^q&-_Uqx3;p1m^^# zA(Roxgrk|~5lxJIkd6)YKPYK|R+z?|st#h^NBXZP}2IK;vC>8+@igqnE{SzL##y>(Pn z-}g6uiGg7lV1^t@hVJgJp*y7=IwYh^lx~nzkWN8D8kCThk_G`qK|oRg0a40leEa@< zzn|awt@Zr%oU`_N?Y+-Faqn=?IrnnT*@1M&z;4nzSh{X{V#Tu$PF`^{xOsZTFv!=r zluM1<3!gd6#+un;dk75Fh_3J*AqRl+*Hk+QWdrZ)r68iM_t1^tL* zVD|l|@Y+nudHC+`zVy(p;c(|!yru@BC9J45{`LU0wvB3v;{A#OBd#I57{?a39IY)Z z8anjg1p|X;&}Ujn`j`I3;$xfBVqz=CCU(&%5MT$>r+}lAlK?Yia3JlwZ_my{9|b-d zcM40cs^FVO4Y3WnAFE`Grqzr3t7BXu7rL87^4%7#(JwN#3~sSsjB_Xyp?YV3)W7#y z11>B6=*bh80;^8{>+4Ssm8)K}MEmQ~O@GmVMU$c&98?t${e%=v=U?y>6Nfo}#MhCc zHs$c`ZKeIa(1HXM>CqZ2)DrBgXYY3@RHEVN$f}m+w9oPJ8y9lVYDI}pXT8X#R)1}t zz_SUBy57^_E|&{1KA?e8`5TN4M&t5ti00|rO2xKwEisxZztW`roTw_y`gnq7jjhF% z1uYrkHQwm4B$ltYi)aW>){mQ@SL{{B{+=S@@wQA%f{38W!s%=Rc3anv!rktrfb5et z>~MRdXLm`IyJ7FIWPBZ$NpMG=uOOs^ZWR-y-clYray~ke9u(X5j$)Rz`sp;iWY=%? zy4zU2q@+rX#^(&2Y)d&Vb*b!Ij8eAVv2YHbTJWb81NLs@UY)(Kwf3t|1r zYPE(9xN7002tBiUWhm4#o82-o!Oa%XFrZS|*T!s~l_x>ScqCu%net%&(_1wMLZ!Rw z-_vJ=!b#Pi?rqXP;lN4OdICl&z zSUzYqLN1`1XX`V|+rFRFdM43XhIN0X#G28A+!DLdh`X%`y*oev^%b^&=E$w5zT_r*GdDb4vaB_D4x~sc03oW4&#% zup4hHdgYyju!U*MV)w_CpFC9Ro5R2Gtv;%LwQ|Y z!8Al3Uu0ok5HOQEIWiDsNnHZ6u1m%zI)V;YjId6TB5IC zJ2;G(N#?7N0gmUkXz`Ymcw{s+C3;hHClz`25DzM*w{rJ$blD4zZP_hVYH^Aq^l&|9 zl$EZOWq-z?A{8mzP+<=rJ!nmmQ`zY>ST>CR%;cmZW;G(QEUiUyKWMnP(qQ1QSZj#B z#-bh9Xyhmnx*zsdN0)5>i?W~E+J*z{J<$YXh23@cxbpMM$;GH|1?3fIGPfPPaVo1A zJD2QlI9#*ZLJ<|b8GG}Og@wj41$my5QYC`KYO(@^G>PcJ?owHn)UYgAK1>U{mWYM# zviwbw_JQz4H(MUNGMe8edSFMM-{fHD#r#A2hdB53M^10aRbUyMWqBmTsg{TZ7LBp` zp=m?WGQww+B8$}$_)$~y1JR7vi?JaCYhi@aA5v>W+ny0wsd-@F+a5Q?6;3ztcBiQb0No zZg6eMb$hcj{7oPJqR$b^q46rUFhyF%{+Ivot$yNC?MyL$jlSzdC}75l}Q9$qZ?^SdOA;dVU2rxRz})}7F4lx4&*c7@;pzE%F5 zzpHB(|6>2X+6{r)#QF_`bc^UZzj^UhNNntLZYIoG)7{a5!y6SJ11~qNQ@_bovo%y{ zr*gkSq)gUo?I0q}$G$)Bdq|_cvkqGnQs^w7elr}~;oem{I1n~TqeGkWk>0-y7oIhj z+wd7dP}#e|rz!JcDOpq)`;7xUmv!MIY~kKrO}1sIyytmr7PzI2WA{CnG$jgGA(6uv zig46-lLRRx2`cO&BJ078F1SMPB@_axXi{UWn+98rVYpOE`J`z{gk{=j#pYzAXJ$09 z225Zxt1$%>Sbn;FZ&lC}M+Q59_%As*^`-RzKINUZ;&^-Fau)EZBC}jI~d; z&B$jgN)!KZd-J}DF7d%Iw(!Ju{cz>*Ih1CLI~l=JAy@S1)Z_cd@Y2LvPRuQKB%r77 zrL0jYUhkSNgpUF-%M3NUQ&8e(l6wsSg@tUH_TQr-I%0@EIgWPMJhNx%i$zvP)*65! zn;}GE{joV_BTWW8up}yVlf>Q$9;n^ObY0bi=1@gRZZ5HVGrfqVgxqbT5Y8^4T&CW> z@HbdP;!Tkwue1=dycA50$vTY2_N#^-r}5Ly#Gg1n*cG}gqELHvM&4;|0t-MFzpNhO zdzEWPnPEwcKaRb6!&fDFx%8aa2}Ant%HGb^j4cjnf{8#0SV7GlwT9F(RFC1Zf|RaG z%8M5cDTm%x>Oq?sK95{ER%UHF7EVyLD5a$&QvxAs!1o36g`wz+w&FwAFcCF=l%M9SVb6$^zPRnxhaSp!T*(%4Kcm<)#LGDZ-hnk5q3CfA zBf}H7x&YzLnmLp9PvM?+1xtk=Y^G?>oa?J>>5pWcvV=W6hI1Lf(J6`^fr2ZdPUn>( zbqA~dk?n1stW>Q{#Wkrl+KA2K$lB*wO395bNlI;8g30#om7>Z#9AYiS?>Vw~nIRP* zR(nqOIz%#;*|@r~ieW4EQh%i~KAgm+a&l1oL)@5lZl7ibawIvAyi=X9S`?Z?&5G_F zb%Ht6##*S)7;h|Df0#5Tj8^EEv5(c(85ChKmMW1PT?(D6?#CNTm+DA6mADl{eIakH z$WC<^Lap{~jxdO9EBwWC6K`)Sx*Ef9il9wuJRy`$blmw%mfsyNkqTzb8M;yWtH0Iq zehJY^sfQip#Ht28ED({u{Tw^o>p4nCa&-pe&ATkgXh_t!_N$nZ}aZ%{Fh57a$3LyA(EXdZp7EA)Nh zgac1vc=DF~{ZyCp)Qddww7qNsAOy7#0LLzn(w9bKbqgpQdeg8&(?W&fOW{~XX<@72 z5OukP&yw#JKGLw4Os=c*Q27;p%8hkk80YduRfev<2qjU(InAk54Kdv){j!#j(d|v< zrH(TDmsa~p0V^(&lI1f&*7$j*7Cdi^PdvoPrC73wt7qpf}FH8 zfAqEJM?%=%^D5spY4&~8Dwf|gMgh*1zYim*khHii(28vpoQ`LwudsRs^&3A&5i4z0g6?>m9 zamwT3JjqCGfJadxxzY@gHLDjOqw4&Di`y3xJk!m*OC}=0S&&6d$mYxsXQNU(E6ZRZ zTIsIXVDRfn-&k?)H}My)lh-mBY<7vgsqq^ww4qFh4xjmaokpcW78VC)5Uwd4%`uV=5_&RD zczVH*nemR&qjG?Z?NO{_jISD&b(mI?^VDmbx;wW^ITpe;iQ=UN9$Km0)qiu*pSM@% zQi=O+eU@Ly3ATf$T$utIFPRLNuf82)atO$gVCojG{eDd2E1&R5;RMW)@H<*| zihc9bW6Jyeh>trcLX_GHk*~ueyr`8B@{kpxvwQT~FN>Fqzev01MH^d5u|-2 z5k!j#mMPnQ?PDq2v(_OVeqe4E?@q@jDC@A9v{ zj}-)Yn{ntD-f`+T=o?s>n~8?`l=@ z%_i}G9A0pr-1c9ES>tXkw7PKBH;$9gMPhbb5b=MSW1G|BxI}+}`d+yBxnZ>ojr$=# zh^pOW)b~aw>O5+zNgI;%B5$Fj#R_jFL1oQ0Br!b@<2emlCh5DR`8Iliwt&&1%MS)u z2CNy&$R>@N+XD_n^T6gEzq+JfiK%>hr<@i;Py@9geS8U6-u;OL7ibgB;ky!V*U5;U zorXA9lY{5unL4Z45saVvvAU~cTE6LV_jm$)1b9n+*ZYYCvbfk)z zimOZ2cUuz=j>J-M4V>I;$Pih6PB~;&iKGzi&N~c1Fg2K1XVkg$q14>0S|bpLE&aBn zJk%+;iYl>n+06kb>h{g$wJXRALL-A@Z+s2OEdKWK^ST$!NneQ3vx~18%N;V(HsoXR z-Jj=Jb&>Knp6Yj0Jr8_s#Nm{)e5YC_`G$&;CDTIYaVU764>ms^y`E{cJ~5=f{pEwk zG91D6szBi?-6_zLluHQ0B*er;Ytq15!P%IdoVe3&JgehU2KUZ>Vn#E=#UV_?_?X=F zWp386udpe4xJ_Uht!GYfbbVRXb2IgS#r+1iVU!BoP4C~`K=N%ia^pj-^5|Njn~1U#M{M6mpHc0twvu?-;M({;r*)i1@ZUodU;mq!RF`4r&d5eF_$TTAE9ri$gO22AK4ZSRz%Q_z4?ZZvK zs6obA{6m1~#5JXrT$u)&wMC5v+30Zlt`_=f^WwpdDvn`8Hl)|#Dj-@sPslw1J7U^-OiqHmhBEfxl?a%x2S(khynm0#u1H&VCwBQsc_w7bJGk=)9KM>$U@%~( z{O%}lrk*>y%~Tl~3ki4`6T^MS1;*SqEw?)NZR_s4@p`$g_H~u$RTkppo6*xzL`TGc zIUFZMf1~pG6Zy_(a(nJK2xa|2`%inP1_Yt>`8KpPPM@;U*08a7$hl)ZQB%O1?& z;B_d=mf*WAqO*149V$7KxIas5dAi35yiBzSrjLOef7UGKPbdQuLEciVL6!?@LS9E{iEWw5ehX}*d zk{UZD?H9tAzIcu>W}&OuTQ9#^nKz6@#lR(=ls0SIpFEJKD0UlW^J*e&7b`)g;hf)p zur49-gGf9jc;gA-N?g@Vjo6m%5}Qc>k!>GVSGRe`^XafQ+9pA!Y^y3J@@GaIj0^a_ zKA5O>XKdu@UH5_Zk1uf}l+U^<`)rb>E9Ahud2F=y$cV5k0oQ z-r!`vc3!@5D;CnDv|)Am&^XN@?xV{8*kxZS$Cq*&ryK7!1zShBiQ%ohD|KI#_8F9X z5OU;YclxkYdv8ptigk@5lr^1mfxicfVfei+xR_W^w7=SKwG>j2nDrpB zND-NG;WOo8yh9-=60k0)o_`Nu+#_Rsl{tlxuet zKeO>Cq<~PaWnw4JD)SNHLedf5-4P^jQU@h>0-@*n%Jou4%FjcCLa2JR(MJKyn9Hmz2|3F z!%md_TRFPd)+QkQ4Vqlv=I_JevdlzpUOHRQTZ-yiQb%D&Kh|udAh>Fs)GfU$ak(q= z>+r~e1`ApQz50yCd!6oXKis{ot85U%c{tW+W@juTG#0zE$R%(#b8$q6_pRgemn#p2 zLG(H~j5pR2QA~OAbPao7S#jGtn`H4b2V z$Y6z48AECkujy-HoTHb-*aM6={vb-7q@T7O^?Vm3keqsm9G)i14Ij)n9Wd1jRu4^ zKi?MoSfRa9$7g<42&aC(?wsbX%&?~Hy`ivXIpIHfu^QZXSDepOamShE2`sg+UUJ5p z|HvXTf#Gralj$qM-uLJOWVfWEqSv>E9OR%e`57|sf`?!u?oC#NY<|fb8>>h1o;Od{ z#`<7CD;y{Z@z)(5FHuB}@I;ZSM~2DzEGpTlyPMgZ>ch^op#`nSPb1324=4QNZC#)6 zhl#y)FMFa(Q9JJX^l7a_qZp3B7}6=dqR|!ezm~{YM?B`*v2cfCw-KTQO-bExS59mu zh69cF3<{eeVX}Btz4+5^6C{cF4j~)04kD3sBLoJxd~aVxUP1UYKfFYNDXKL*Zy=OA zgM12uEY1sUm-Qlp+}6uMcbh%>CvuC7Cz>Cno)FE@TgV8?7^mQ;7#7T<2<^##wr(=0 z+=p)kCSiYOD|tjcD0O7A@hrkr*8BTlKd*9yECnhFF)SiLHaOR?VPxqfkJ^`_=g_^d zmj28~Cr`X*twe3vQadQ$SidNCv+59M59HPN?PzBvC%EQKXCSmxP(;co{9n@8@vH|^ zwjH@Pl#XSQ{f~cn?`L*Dl?)`!>!hx*;&Cq(NP%ldr$*_>z;OyrWlY|>oH!m!s?B`p z>BtWAsC@EB3CLHjB({KrDsRDWhiNCIX*~IcOfFlW4X2S%^pAdkbDA zXo=jeDR$p&6g;wRhlexs3=-jL=~a>Zs?khRRFv$wYQheg%@kk2%2$%=TNqT{@gcyDJYlw8${MT?zDis23O@>)?h6X5Pr2ai$?)rh z*f&bc#gMlMz9MAcTQcWBMRtE07j@{^b&H-Aq{EWvW#N)C$f}w6hVj=5ABC&oX8^ZJr(=Ug zNKw?%)Jh!&rTi)lDZb$qV%Z&oNWp68EMp89xk(X0J!vol>S1QGvUl@CeV>hBVK>Dm zxK@2#B&PPoCnc`{aTPFV_{gyQF+b7Shcv?%ckh4Ey|DMDOGn*jD5)39Ga}o&m?QQ7 zM)8%$-~WTi$uEs2`S*=qPhG2qjDs_$N56{4fo)5WicyGOA!JU!W+K^u{Q`y9_m3kL z@k#{x$)v@vI_^`%qxlk38`U55gai-4NLv|Od}l>+HQkbDey-AbIE*&gX2-hI%(A{p zwA=wVv(u=aQGtghw70t)ZCwpMA^h&yQ_hsJa*HRD0 zAaaQiY=mGI39=qZ& z>zrqt!}*_c=m?mf$H^v|Lv=K3)DV=zGHE*zO#)F!ix}%=E=T z3aC7#RXFUo*Z!PMtee!lx7W`XGIrb&=^?F@yrh%HS6dY}DdkO|^S+a9#8Y9}1II)g z$=t*wmK0^SVQ8ZFcH8b(YO~R|65hmPQ=-yz-cywyf~+6|O^=ec7=)Mt0x%*qAh?HMT*$hzzYBUw9Hxki|gz&6DRD%hEs zYaKM=rWb%pG?e{y!L5!Q_hage@)a9InYyu73{^de`TRn;*nPYy7$UmYKz7%QO^MG` zMse;-95&-5qIvpl_?H9wNS{Ph&Vw%EA#C<)!CaJ&@`L`}tT33;+Z8qvDt}zOYLKH{ z4bz|wSG$~@$H%AAia+6`N#(1a`y?>w&yyiKAZC2T>xpP%5KM|RVZNrSROOYQn9In+ zeIb{cX+hMmxAjs;y(yuSf-R>F%@3UptOU5kwU^90Kd!`V9fdTkgD=Kyvx$qkR^`8* zsp^q@(p&r%7#7#e1}E~GdZ4)N1y+TMpzm8SiZHIz1++5oe5^X3ena9LaH4sY@aWsS z>L8Hnbn9vFa#cv$Yhr8Y?lY6qJ^zKtTlYL&a#_-5A;Pz#`S;9f2w-A7vORu}7Ghlj z<|1llQdXMGWmk{um^K&dd=iK|yUWgx_b)`wpw)o(Lif@>~haUz^-&58gC+cg|9@PL$j&&N4RPnq9?re;4R6;cF~;;IU_ z6}?#ZKeLv(U&Pz#oQ>Zp(C)#1O{7_9m`neS!=Sc&8ml~sLE_Z6^?Qs`xq8d3kDZ_# z4OhKV-q(-(7LjTS9Y|>h8WmHiR819Tc#(Vk@Ezq-Ke6cEb$Q1TI4rK+2!?pnE$#i3 z3%fgxO*?d5i$j28W?uB+_Fg)T1X|uM>K^wxM1<&7N}b&fjLcd30&h1t)GHPx!T5ixlDoBi^7d+BZG<+ya;Fw>x2EbFl0 zd8M{r*7?LsBXc#OIqYO;i{C-HkYc1_T(zu=)kiWa+sA~^fma-o)g$VW`>{~=H~y*| ze6#nwPJSj_1sArg5!X_}$*Ga?kmmd^uC@H=G!9Y4zUR_4p4N5&)!NLTuLa^)Ti?j% z@HdWwHE|a1N(YOeVV}L4KZRhc#EXaPmBuCz&1m-0-Zf`cRJKa~x%2K(&(AQ?xc77A zOy~79v|e8Vlos}q@MnjbOPi~GE#YG|yx}OKHEBuF5#}$0?xA0(c;7t^ylvK~I;sT^ zPsUQh*WXwh$O934co-<4ONmw_my<=?ytR9@+mvcasjJ|#=yI$R*GzIhSU_&~Xa7;J zGjaGL)w!D;qVFC7ZzRQnF|io<75;h4Dp^nl#>rh6zWhvs>e&wll8iyK%V{OVr!k!@ zh#*g){gvxW_?GHxJjFi9LQ@RNyA> zc6!sxwr&IveRauVU#;tEZIXJGWk=c0(I!sP_eOF2ZrMpzf^pe0n8lDU6pv?(k^BW^ zPL|2_VOCtaeY;BEE9jBcP$h+D(~eONF&-jg*=~1<$}Ls}x149aUa$q+SjWgrnYoE^ zHBxyS#%0U-%*uRKJ4^M%*hK-ejFj{Ppq)&*>$36D!O}be7i+erC}HpAKF}vrO^&0nsr*y}SA}uuDe>>|hh|j^W5h)j4)PVRdUkvNFVHw z3)IKytJjaI(L{ao$!?)qQu@Tp0YE+~-o9>$*eepB<+wa^{Q4Eq@G@BQTf{!YqZfH= z@oYk0KRv6X7`IiK9- z2V_H9T~Q>;5LDe#oPw%2cnY)2C^X=cAow+pzsq^O*4SAeR*U(P@mu9Xx-L13#Nwxj z@c%ef=3d>=1pxG&a0P*f&EFaBKC|JIKm0u@fEDU)p^S3Tls7Uu<=kzV&#l5y)&cNh z8Mp9CT_ar>i*e=wfCiwU!8TGaGn!v1ESnXPW!Aweo4-}2BUq*nc=sxdXt0qwWYG`y zla?N4C%mmb*(lF6O3Ymqk{LuCewS%zqAaL@rtgUR@KpIdKAKf%NOga1imm1%Ommh) zcB^BoJIiM>eTr(U%WBi%vO(Oo&GW9b8S+~1Glg;zn`B0vpwv@-1Ji3b3y8ZTl4(~! z#4@^?VE9FkN|e3Be%h<2R)qrFS1*AcMkco@;Hh{!J0G00T+k*eI3@yfTGb+thx^y+ zf(j1N)>^h`{%?aEj9Ovin+XKA6MkSHzJZ2&yXIa2NSmZrzk^1LED1hR*iHLJ*AUjI zN7}!HtG&TznC{uTi1*7SQCu3dYK){XMxe5|JDCA{43{G{6!(#zvztr7pWirMX7)F zlLLSAQ3d}+yTZSiC-fIh@c*L0zwI!c{ws6+TTaElc0-qc_0k4^(ehvWN6~-f{D0eB z@h<|1zwOY;_?u47_809}|Dx@`^%(t|&hT&h2&^ zP)JxrR7_k#62QX!CxHJ1dk0r9{~$9*6(?sk0I(7O@U3hCu$3JEwQ>R=R-OQnl@CB* z7!tyeFor|`PushIZ?Gq(JUhVN7K0ubTYo#i(bpbu!j$KX zAs-C+`vSfI0AOLr14A+xa={Rc7yukF7;f+<<$r_O0`eb$kmc|F*oOa=|JUOG&N+V} zaEqyT?({kFl#x2qt9WQgY>?~%%Bxw9VxWGzX8E7o;L)xV>1Sin+&{B!j>YKj%tU^v zV{n(_zT2&M8O(@r^jq%s&b0l_&ii{vmT!~YeJ@DvpK%SxsgbD)RAFVSUN7Z@yS_L_ zB{f?9{@wG=DuD@}b~n>I=Q>q6xRMdvqG88+>xV+KLa%{^4cqfKZM)Vm{zW5l6n4ay zlBJQ$xoyl*i;Ro-;sbF+3#VVnEmT0e8`VF{4zHH6y_^%Zxl)uQFMdb-@Q!1$E%1O! zY+a-FddjP(K5C)0I)B{jdfhYpAdlmMy<{&&;BX#9ACD_JJ-@t_`~J(%`=tzyrnQ48 zCeG6*zqyp3F=y3C7H3`!m|Hq#Oh6xnogV(4v5t<>dr;-I_J!w$Tp6pZ1P<1Xd|-5r zIoYzibM_rq`dsWj79Jr0f{@@65aWP}u<@ZFFd;D(E!rXO}l>v(ocISP;BY4zG{I7tTPfp(q4dilQ zLM^-=!-7@vjF&kh>^KdZ#D_g^9-6=Ie^e!VLbx`}`V5k(mi}zPD-vhTz%F+4sQ4mii!B|EQ6u>_R5w47+F(x3dCzL%ucFVJI*S7zY;24Q%( zNWGIW1FLp4VZqB?xK58=0Q%pzJHBHmXrH0K1Fd%H2=>q#dZv zUZtM5-rCh5Vs9}z)C{GQ98Xl-(0sn6>$_nes5h2xS=Q0Cc;dz9a@BNb{Vnp5ADW*^ z*~`8n$fxG0ggj^@`asfw28{hCnd6o{^TqF;wB7E=kNfWWEY_I5FBWiM#P^V>tcu(MZQR6ft0kMJsUMoNdm>>>3; zzj|RDA-YA6Dj0tu1j8Z^)3T3p3VEKd2^vZ2Ya^pSo zL)u&q9Ix^@ADSOrEK1dQjo+a%Q`1bQM!91Fk>QEqKzLF(77!6m5S|Fc0|em^ASpZv zNC?LX#|{q%AQ(9!JRD;I4#&d5gOE_rvG9sx6Vq}^fT_9VNZDn{c_8?Na8eu)3`~K* zC7~iCf?|^sQxf1|0a`k0#`-E2m}xT)lGOpps)S@U2UK)T0VPEv^*etUbv+#wKtt6C zFj801)&{guceFK>3>6K{@8~NUtN)Sp4OO)D6j6UzV?#w{l{Ejn*1>l2ep%5YhLMtmDFMm%5Us+av7J&FPOz|`SdqkPr za96guK-_6xDu>Qv($G6ylG|kv$7%T)^#?z=qc%tJN$cFxS}mqipV3O4>M*vt+#e<| z`dqYfkDyRY*{gyv#cF%J|_Yd4Fe zeh{E*Y2T$3DH`<*`EYE0?qcav3wcjz20D2mo0jU@64@6@^Ob$c>lZY;QdwWF_E?iY zxc{*kntpDRxLq_!Lymta!|bZ8eT_WCmMCd)p0MeGUK*lqL&p3K>qV@sZOi)x>7z=am?Jl2eg*Y&Q81Otx=mgi}B-2ByZ%{Atl7cL_-R}mJ#7$ zp(BUl%8Bu@-J&GMQ;-ngKq6pZNkL9VYB&Lwv@ka_Eg2z>tSB!lJp~a+UYwtufr1)D!sZlVVC5IT#UaegD8M7gF2N+q$0fuj(dTz&2T(F45vzQMkJjvoKa2z~#I`+ou!AcVOQS^y5D{H01JN%f(<5sVey#|n05gn4E78Pn{Ob3<-8(>Sq+lFkdv&20IM;;>cPkA z!25^)%V0F-eE+NbA0DH(`{zkF{_~`>n)9-H@cw!5F&Y1d|C9HB^hnl_{}M5|{##W4 zpCkZq^$f6ecXdEI*!npl*;#$r0TnY1W6X_FH_`ude>8Oe2!MgfKS~WuUxEpk4&zUv zqLSgCL?siWKT1`7l|P{M*T%%iP!J;-si>J^03!)uKwsk@8%1qH9gKuoQT7LnjI~s? zjR9qKZ4^dQ*88VIBV)ZkH5eNi{{zMvm=`m^*jUd5115%;X(oVKkgxwoGE+6Oz<{ao zKc(s$>ZxL++Zwvc>X`cU{%NoNZA?dmsmT1Fc49ajFPwBxHwcDDfv1IMgSUvci6?-s ziC>A|fWMD_g0D!RPS6J#f`|}H5vvjF61Nb)BpxAtOYBYZfFztGnk0?n2}v$V7YQ2v z8{SUUO*Kk2MEK($Z6yul1qRevsVVMiVzc7tJtb; zUEaC`Zb)vBH_SJ`G4a>$%ikoVjHFkTASyT&9Tg6um%4zqhE|3SMF(OzVi93gV@+Vi zWjkWSXBS~lU)CmFas=XED9`|ENGTI zmOYjlwmP=AY*TFOY&&ef*`Vy~?40ac?56BC?6&M#>^bZ&*c;h<*n8Q>*r(Zlvjd#k z-1^+++*>?*JimB;^8kFge0h8)nBQ@M|A_yR9}vJ501F@mdIdKG^@Z*TH442J>eczJ zlU6=lPE<)!>5GXEDj!w?&lsP@V`jxG}sj zzHz#7xw(6T^&9zH`nSSw%ioT_*M5Kbz4QCq?_a;Ke;;CzW7lE7$F{=xfU^aeA^J%K zC#EA_BH^IKK~N)D5dsKFgdc4=?R$n%_5=1o?jhkTiG3Ns!o$M-jszNTggc%-xOpJ< zFyLX^!?TCI5m?bA(Tvgh(H7BJ(fQHk(H+sd(cCdCvB`P(`Ly{W1@Z*~MZLYty{Emu zdOiBX`ws^EN4}2=kAHd_JasjNW@KV!VP#|I;N;@w;pOB1-#1YyX&G5Lc?Cr!Wt57l zn!1LjmbQ+rp1y&hk+F&CZ8LKVODk)eJ7`}&TTcgD9|xqDzu!H7KfuP$!Nb(v*4Oy1 zpA@&D6t{(xwiLIz6t|9)suaL0DCOV)*aS(LIXJrdO8H3HOL<6fxk!0Q=}7@Wyu4;o zX1u&XfQ_FMM&%m#C!>*+trVA301yx$rOwN1BxS_Qs}9(Bdr3J--IMZ@0%QdMeN11Z zuWzJksABL3jWsYcG*wk?Ob=@Wpj5O06I~;7U1i`;y1E{wFT~gwX{hNc{*y~n!x+y}OtFT_ole+1|y+ z%hNT)(E-!(`#SpgA>AEq?;(91?Y%r500&2RN6aYj->U!Ok*=P|dp=&yK90V=z<=vq zY<-bl_V)fhKA2+v*5v8s_y4W!KcCplrf?Ji$mX4JFw6|+_hSKc@_zDB1tLsdoT&@>Q&e!B7Q{{vu4s(9 zZ^Dt}iLjuY9*J5oj!)M|C!iU=OfYNf__t|5b4Uj@)H70epi6b?x`0?(_Q z5;Lrg4KuPqtOAG;%D7H}$PoxQU5`V_Ho_f(b|lyxU|p~r2U~E|fSA%@Nm#~assec| zI8youKP3|bq!DXV2KEqU0V$=5Dx^HsvwsMddzV+e*|?mX5@k2Ul&lrnM}C}Ab}O|x!UY5H&w;2|6K`0<bGHA-__gm|*KA&LgjW!+VdOzWjBa+A~(@*WAqT zfb@p5HLDaY$CPTE`~2%RWl+f6`tkl?CL4G@OBS0p^HD^OjoMJdw1&uU{;cRvY@6LT zT$E4smG$`b{O@^3+;7yDQLRxjzhli>(x2Y68xW1m6bLj3zMu(&{5fGUQY zBM;V<^5uO(*9Lv!yR3jPobe(AGtPcu>KskLoBW@5U-*mr4|XBN(QjQD@Bex$t=rpC@c)L-x<$c52O+$5td6s20p9Q`TbtA(riHV3z%L)E%o! z|CP+(+T#$>jn+zM-r{(@THPrbiZWe)MMa6x4%2+*GRf8G{HfLPUgl4oz6Kd5hrGkt zo@u^mg0XZ%UOJ54HdhP&r8OM0hpzn1QAAs~-^a%zeJaH*z!8rSz4cl^hOxxgfepE$ z&dWR*!$lvPrr;16b{@%r@S`J|3SV=QfrmYc$!dGI_ZGGlh}BeZg`rLj2w)bmm3)36pX*SrF$Y~ zI@Uk)Wb*sX(d>tJ1g^Q&JQBo4;HJ>*7e@8ZH^TSFkMH%q2kX)a*vD^kWqW3RNAc#0 zqKvuU@RJ^xOQ=WFK4ub2iO}GO@@a_Lve3fn3io-}CJBeDildknkvZy`cg=5P~0_CW-f7ORQv_f+bV!`ySOh}p3%kAMX z_2OhoW>B;VlOP=KU}A#ggs0mHQWH?BC*Yz-kPr@4K?MUQj&iu!NG&B7W<{wA=AO-?lJ`+mg*2;ban zXgSQyQ<39^y@J1%`Bv!1eOK`KDa~V5D*O+Rd7G~#BVV3op%=JmLH7e{+&O=}o=VuU zs*PB`+5$6z32A26*hbM*jmc_*RjQf}N@6}arS9R!+4p|tEAMm0dMkEB-+E_G-1Q=C zE1Fa`yT-$#3aaShM*2eRgFw7Tc9a-7%x~s_09%}Qz{UN5u#3-e36nJ0Trchu2QGYX z0>_cG`%B|l-l1xv-)x&E(=wL9Cjb@cw9hl+q>E%ZR$a_bXti@a&RR4as=dv_RBlia z9mWX$Hh5NkVo*+d+JQIAakBaxu6##;v}YPybCC`7qyCYwMR5%6!?_T$()JfcM(v2X zPpx^y`=c?FQ%;&w-RG`Z7HiGyxzPzb^=7Qqne0;16U~WrXJk>iHnwQtP)ULBm+}hI z;pZ8!nwJr6Xn$6oxyMCtV9-8`)MHqz_6#p`a=m$cPp*qUM6l8ck2>MjMW-BtO+e8L z_=A`>2PlQ@fF{)P-j@Z<^Fd+9W1n6VRXOJXQ?atw^f%sC@{xjjA8hJT5#2XQs;%1^pX3_XDuHm6yZ<6y zuhcdf9aEP5wN$TOfvBS4hHcw_l-+M8fQ#{nWiTFlGd@IduAs=){Lk__tVwd6WgKrg-;7u&7IHTrXb8JRDtq* zcVn>Au>%f;bs-t?+hS5PqPEA|FY09MDNh;VGu(=jKR;F9{zmv6g1s}X&o+pyY44Gh zyjW-eyGA3=XVr0W^` z?kP=++KAub!y=!;>Tz(_)-I-%m6Z)D!`;0lpz!%eY`^UiLe5+|OOI`2KBRku*qtAR zv-e{AVUb_#Jlnum8haxd-cSyxKgPoo%7)}|Rha9zTTQv|P@>Ls0i}vXC26 z&fz^*mJ=p!{C=RXi_S}36o*9mLva`8=!BQo2;capo)+F2l=qgmE{ zWC|u1d2CUAHZzq%X_|-p(bert*H7e;*y$0=axjF%!g}Uvou{8lVD; z2zBoL<&-{EU5=8anr_l);Q*bz^QD`t8M>s}v~ zGTt9u%QAEaoqK=%`pg5@h19R}jYvr8L;64p`UUyjG! znc`i0c;o1=`|lZ-I=`&Z$xf2;$c77yIHfu*c39G~?#W>%lzom0CQt5LXwBtd$%&X$ z0tLC)9YD`Yk~>ncI_X#6*PHvsa;0;0pFbY0&pSzcr`zpj{Vjf*huJnkwxBP8@Rp6Q zblJFx5X@UzSgs5t>+8a4NR-9jFpMMNEO8+o&KRd3; zT2>?J&`;og=>xJV)jy!0SY`Fie>ti3`73)YRVa_mB#GzqF8kJ4f}N#h!svj0X`Wg;>1(m= zXN%!vobFn}xmjl(<%)wn=qI$15&6khw;DVhTkdVQaEvTehSCYCu55hKhn3z;UbLN~gbNd*U$3?z2WNAO+^F@V!HztpM z;o(Q3Vn(jIFDx>6-;OJCM>kl@x@7hn^Ag*-&7P!`MlI{TbN{T@C+XIIfA93&*L7R_ zLf6}B!9^mvD)qL^7gp?gVT1FX`zH07)c^V$Uc3J3)m>cu;+j93-ZyAu=)(^t zfB0D0ls(zEhs-#_S%y{?Uf&Q<&HEh+= zMWuOP%&e;G)uZ>^wfUtiXHIe##lsYi`)=$C90w<=i{!md!)+>rVW-?DxM8 z+^Bb5KEJze>>pbPKKa{{iOl+RT=neV@v@YL|ykz~+lbV%X zW|iOkc1}7cYu`GxAx@ zo$G)8{+MU-t$%&_ewVk$Zg#9QEsfkaX`(TAYy8^v4?5mf@-!#AEtoyzgDv~x4iz$*>WZsXQP*Ibsl;i&OT`{gNy z{Wsp+cVu4Qn1tgG-Mnk+=gX_U2r&+eZ-`z$!q#ivORmu|pKQ^+FfOLo|Bk(OA}ZtP z{~n!NdgU#Z%KD`bcTLP$m6G?!#_%CCYgQioXvKmv+v21DXxw^(f9E?(nopS%-Z{KG z=!%WLJ0`w8=fUgs_b+GN`iF;a9jhqM?NuRLGqR5Um2<*)ABRJKD@5a zoMl`6eV#kebLj5Wmxq)*Kkt`&w%>o|f6uAE$4Pdp{|tdB(HdPW&*qi*ncgtijO>L*ETse9QRIAHH{Q-uJM3qBrY-_hvk| zXmm8iu~yFsuKL;q$Io-n{FN^}GD@pZeBuaO2$DpZ(Oc;p4aZylcGo z#cy)^?|)|XU1g~wLoZ4Btou*yWk+pk+22|Z&iHD5&w+=gy}#@4+$l9X2X|Sy^ya6w zr!9#!?~H$Th5z6a`l{+K`QHw_?Di)g+x6UlZI$ocH2>4z_H3Uva9MKXnoS8a`lQ`3 zH8r>Q%GB}^5g+WBTeA0mD{qfpymrj6HG0eA4_z~6%ZJLJtAG4#PlV~6l_#INW7E7v zx0kNEF55iNc-IHJ+gCJpTNM*A_3mL3i@qJ|9(#doFFo(>E9XbZ~ac zeTF6PHgsOoXWH$dYbO5u%eoiG#XflRC9jXP;d5 zckhfIn)r8E*Jb@aSvWuJ$boA%SN!}{uTJiV7ySC!_D$ybX`TOYPWgCKpGWQ-x@qe( zpF5m8F1f1YuM^j=xnul@yMD1%cB>y?zrp_3V>izJdGsC8SDd{2_zjLnKaO_3X;0X- zXYD&vx@_v47qzwTv-`Dwedb#JXlm-wk+Y|m-kn*La$?4@BaVeXWkp|_5IKC$Yh9k| zRa#n`H1+W?tFo~F3)jE?)El=Ai)wgTQ}x=+uPq0bZ(kjoa>vS?xw}5=b?ZCX`phey z)&ALO+r`trSheHr*xeu8I61Gju+Mwb|NO&n$>#m9m0x_zpfw@+YqQp0I<{o`i=8%q z{p7LQlb8K@)O7U04;x3`qDy~ihWqQ^ugc%BbjZ`aGlC|)etiD*lV2J#zxl(&sAp{_ zhyVQDWA1BqJF6pST=S;)XJyFlqQO6Z@MX=qkK?pG%LWa7uH=#Ql85xa^tt55As0Qd zO>elb^qbNxt2~d~^ZK^yUiw}!t-5IWLoX%wy>2yb1$oN-+Ptkd?3kIbeR|(94Svo3 zlx4>+-uvgh-~1T%_>?VA-m>YV`znqe2>vGMGTYxdYaR{1``a7ec;>y0S7|c(ZFzC` zx|M52RBRlX{@{0yfAc`!?_Ucau%sYr%+*WNY}QYvMf`o^@4Jrwdh5JR53f{yd49+PQ(~t^zP~B@zTmi{AEey)%-2f~EIcr9p!xR7qu1-2_s)CzgWr0- z75;AauX~RD_*l*C=c==w`K(L)NLJTpjZ>FuPKsE(=tTOr$(gr5Hu(5cxqX*)t9$u} zry}#`p2%9AmAz%dqcdys7r!@mNuK4asGXIynonb`1Ji1cWj!`&`Tb{Xqt}glYJg_S zpl7cu8j+s%-G}`{`#<$~!H}UlbX&9c-MGw}{$Tgq>Xo%Or_N_P?qAgJn*2>`wj2sB z`01W!wm-D@(A+gWUK?_4eV53tX}g9Vj(_0Z>#ubD^yZBxzxJf>`K{`@yKbKI(A-bI zN$NIl%kaDEw-0{0&*F7G2L18;6}2OeK3Fto|CeD!Id5gYwP?VHg~jhKi81WEe*fy8 zf0f%0#f<9QV|ZnW|472&p_hR*aMw5QO}3}zXYTAjdivu_Pxd+R=d-y7I43D+bw-2d`xPh2|V z59iBY?*4M^^CLIUSp37Qi!3ub4ZHk!@1fI&_BgiFS3mT4zvG9-So*Mi8;pl~FFhVp z@o?VE9~ay*G(Km@vTrv({z1s3@AfUfY1flatiAl=dmfF8R5nBozrAAPa~o%`zID>0 zI|@$B{&3Zp)MFRjwaEDTs{KPFEnl3j+gp2C==%A;eADB)!kssd?KLv;>*?43TGhMa znRySoPq01TeZ1nDU*|{l&sg)C?&ZlF7tIf{MXl%_x%!s5vyW^Dest2%b@$!4bzs@1 zzyEyW!<#-z8k+F(Ol8{iE}6!R5d$-Qi#9JmdiaanU!4ucRcv+mr@=!7{+W` z^rf-W@UU*T-(3Dn_OmxmHP<~@m^f+s=PQSO{P(s0`*O!4Gd$b7#{~5Z8$2-Q;lyoo zoCgy7nL8I=dX;9bck#9zeV$xAuIY=(fA3#AX z7ZW~>xOv>7*KT@l_f50*KK)~KkLN#J|MEjG-BtTwR-LPI)wJgq?T;D#)wV0wUpC|# zBR(`X{j={jroK{l|JlP&%pdr|fF%*VCOvcf?KR(=9yj}{-^Snk@y5f|rE?u+J>Gd_ z`6YK0zIolPeYa&rug&_l=JY+!9(;VxnJ)1qKMWW#G355EPJjDLrRTn)`nTTrWbNdW z&z5GJ2G%dpp8DVY>+3$7v-Gv9t<~>7ZnIWSUOnmKOFzAS#$sLnVF{5VuZ#L)x7joz zp)7OOp8OrX#>9NtYgcuCKhN3`Pjw6J*`?u7b>qI~<|BtczvzL;16%A-&lFCLx+SP^ z!h-UXS>5WAeh4dA^0RSdV%V5LqsxXiH?K*!?$y_46wWx6clAc4w9g%%rFShVv2Eyi z>#MU5Y_Gj}=8dN(o!K+~#5bR7-<_V9IyPeA>RplfGh4RaTYcuoi^smXwtD1S-2UwnBgEPpos z@18&Qj)T|j|7d;1pC@YkxBWJH^qD`qw%D|hahqF?HViLY5*~8Hk(5YQ2?+o_&BY|j zW^4pE8Cxg)5GnDH@1)=55eb4zM0!X;c))P!ZyiS+N zWp_c_k~z(O2byTMy6kpW17lXJ$KbFS{Z^|51C_@r?GUnl5hCHUGCw~m9%NZi` z3;(4uUif0z#`i^fo(RTVgVSm;It(6z+v6}a&GkFy`t49+@><+3lh5g@H(N~1>vuX_ zPM_b>U@`k@{8o?6Yw$5+O@kd;S*2Ce3UZ)#MXvnZf{FR%+*z2LCmf{hKyjtqoXE`y zte|LO6;DDAt`Jde_3QOcJ!Fa=J!Fy)OzLa(5IyQA=zZn30<#{1$Q*r%e!70LJ`1Be zO`qK~W8M`N`pfkVje5ONU#e$rn=65gL^6`dNG2nNj8rnx$Vg{iv%`=;Mj{zWWF(W3 zLPjbXX=J23U?h-{NJbJF$z-IEkxE7y8R>o)31lRakwiu^87X9>l95J6dXCLwG5K@` zlL;`TNN6jw)cGw=pUq(J5K-c>Iembq5|4}0;|-hUvH2`Im(yfXGiT@MN{fqF8B~Lv zNLuXn*-Qqz;;=Yeo+eggG28qO#Z+T(RwFjs<#70&NZNkMAUf8%ob04 z1NDP2ibkW+YJ=!6C`hPXhXjX&1c!!p!ap>;I)$4E?8q@-ihkF`atdwxCpn*OHtBz@Ra1-@Xnl;GiHI-!UVf zvq0R18jzBp!)WsP3JgMrO4^P=nrK~0VuEO0+l(FKlH1Noy2zNCoYV%QWQ`p&Cbb#5 zj&W^!m3|JWtHU}boqE-F3Od%Gz@R6AcONfgz|jgr9aE>Y?Mm7Ot4&L!YLi+^3=~~M zhy!XIJ{KurcwJWLU#LD(#wf}wQY=oB%M1*}YJgxAZ-dQes!@D4hea8uB&O2Y2)E6N z;}wd-g<@26rnrDEv9eojjmT^E*y=5)-{Gn^7?D)?%{FhX(uieU@sJwf*bF7L2UT!J(Pb)1b&utsP@?Bn^ zf;Gm6K}D0YfTI;Fs3C#keNf<;T9BQql;)P@mh&RYa!Yv#U!6RDw+{;dlxDmZsL=qe z^N>Q9t5#>A*$|7CVltR&EUY983Oy)AE)i|3DRDJmkc$jXL$$?$^{`zVN&~Y(OIrK( zm06&lWAimBMF4?zxyp*NO3T}YfHo_vD9cx}v$FGZmE7r~L#PyUfCW=&8;j9XSPrKM zm28*OYOD4G1OP8eF^EGuR>d~WS6Iquozdn~vdm`EB5EH8UD0x-C~GJ(PwdT zvQo`ZEM~q`zFJ})Cb&RnQ|7$ftnvy>fr7I?>gZv*{U9g^iU1Bar{Ap@te61B&4<$O zW_(O_6>g=#sg#kLn6X`>F>flci(y3?pWmxYarv;`3NoQ>M_87*K2G_^iOSB)YL|n+ zFJ8c0PEnR}c|~qTZVt;So;HPa@|B{3?9$@w;+$L#SSnG<*hCAc8N4MWevjJ)z$$cA zSKFM`?TY5qjX}vK^iX2Jke5RN%wJuD$r1!eyXg@f1lj_fr8xZ#BgTmd0P$MvR-Mm+ zw?GB}hJhsPvQCh{Znw*WcLRsH2s4-&(K)cJ9@jhzj$}2uX&UscvulEuzppi)9{33) z7?DWml@}X~d^8$xi@60l;|`2D5E;uimo37=f@@sBA&^h0%U9+$m%Hra;!;O2bD7Tw;9}*TTC(ySzKI5RsRiG{aXE_&)lLgY zM&@_cI$aG;mdG2E<2Tq#&}F7NviaMK`5B%zjL(t=rWU``EiEk|sgo5>XLEDBLMf1d z(oiBw$AX1oKKql=KXxiaU?(Wjk*GS7R0ow3!-%@(iO9hdk%K29hp38*-znR5p?YH& z5#YQia`2+afui`+FJ1JDP7u%`0;n3&KVu62XDpNdW5dk<(KO19ZVN|>>PS@`X{sX~ zC7{gfhmgg_rV9I0WToea)56|%l?cC({iuwuWEqJ#PiSdK@Hm>B=A0ttcQrDNHYhkG zv{P6_=Pq5lb&u@Pvsdqn`ta{E$=L6!6es8?j=35OYLDE)(HDHm!hF9(?Xqm*Wf;sqhqLC2-@}lux;7nj^ycT>*z`QnxVn&ga zUh$Zj(PJ|s+T}GfgV{#iRi6gC-wF7mJp!x578#uqPwDFlchoKswg_dca=KR^Yu3j? zrIiv_V*djDQ#;RTG%`&Kt8^oX^jpU#F@xRC8tgbNX|($-KH$(A=5H{v2Ajjs$Ql|D zQSJ6JD|NBf=GI~JZ>Ft2)J834o!RDL8tBLxCmQPKRo79GMx9}zexlA`)Ejihi6AD- zRZd!laoiKm8XLFjrR|k=gTdqG5hgzl19@?d)9NC0hS#db??wSYvQ4}JRfK$)!S8cb z**tZ~W4HMb=5g3upjkAK zF3&BV!m>)!Sw&ivOadUI)fqV6<|OTAP$%~A5xEh5pz`n${s;heI8K{X#@4$Hq>_y3 zV&UovV6@PpL3ALn^Ux95LnFc~kWWyCQC_YZ?2XndBPt@o%lHYJbEC>4!b>b36Hz2C ztAc|Wim%4zRpz>kO0~;}yd@Fgxpsrw3+x`%fca3ko^Z4*sYdT`=&?9qK_Qze%Z&)n z0tJCLNAZHVr3D=1fZ~PjvJzEmYyvb;vgxhK{7#urkcu4==CmfnV39I(hXn4{1U^up zAU-=Jm>dyaWN5TGz$*apVlz``i45(SuBf%3e@y42^5&w;QG!OHSty7vj#k{%X{*6+ z_j%F7JS4N>MWSRTyTRt5bRh1Cm)0?DX+-!`7qEuU05Xl(5q!uvp>LtG8Y03Aob~^d z!h|_)z&s)Gw21IL8%TTr4^B-9$fEFq_TfUIo+65om)3kAI4fQ+I^o6mIBE91=fcBZxTSWL}a(&z;^Iuac;x`yY{El2cyja}SoR#?X`S7p&(Y~Tz|l3X2A$dBw&3I?V>t}_d0O!58Rp*2u*b6D$UPv6 z!U_8^T9rT+ISg3K@PKsTGy%~AC3LW>1Waa}6Dz=hvC4{^tU9aFq>pXT7hsIBIO%h& z`m749cxIyqMcHA(ZL^Xarq_p60WIRT#Ro6|)C0@=tk~RId^HwebaG&+LL9l=249T{ zn>6mm@k(=)feHcB)akb{jS26S z5z86)__QoIfj*eV@5Y`0bc~s4IQh;rC75N0!3Ivg*;;3YWwincaCSZM>1*^Bu%4+R zo0Xq-!DPi-aO|?i=X0CmXiWs2$#%0iO@d~%=A`Bp%}UJ*&25?!n!7dm*yphP^74}S z#JEIavMI%ryGF1P262iRCmd%eBl7hliu5DOl!-;<1XuJN=|JaPE9oB*%h>n7Dyoy) zeeV?Sff{(~jEH}rLWIA*NBBb?7XG(o_!_GS|Ii`qL$chc`NDrHSJ)r-7q*)IxNM(l ze=XxxJI>eWi>rw<#hLK$#@ht69Pb7$ce1z|pM!pO5y)L}bKTYWS*jUGv1&^^cg9s? zq=lbcac%&F@RBReTd#WIifu%BaVC(cye4wQ&Gj;a8#I&Hu*T0d)Em4ej}3f@xCTQ# zUTIw75l^l-L%j_`AG5_3->7qVxr@cs`Qoq(mf_e@n`-%+5$AAQ=vOUcxHHaSGt=@po}SsA#W-Gk9p6Q;xJ_a{hD!g>R||i(^gk``=7G zuL-QwJea-e7V$##1HqDyn48RG#)@OY0dYt!LDK>S;zAjBgUujvp%Jou`KhUS8#hQI=I2i@#%N~FBP526Z`Jf(tc9f zGMZh#Q1nj@KieteKV2rm<+QT*CyH`nT%tW1SwKR*2p=Zf-K8;($EfyB+5XqJiuUi5 z_9hAMhozsrDB^twMESj?f4a0M$Z>nPL-;fa&o9dG(JzT|@@4whrTJt^{i`bv&-cL_i1WV%IXMLMs9>xnmr@^(o4(p#qAwMn#N?DOsWRU-W> zrG24sQ`^5&raLX|oL8oDlAf(>7R-AtdzEz??Sc;&mT<_;}?O162mMWx^bSf)nNc;0>8;NR%FAbl9fyL-D=t2!*X8F%JG`BUd(TvoM+YF z(Vj2+j~x*>2wq6U{5}ZXnBC?CE7A`o29S$>r=5BHAkCc?TQwFdJiUJqaQo~TVMkq* z%)?ci1q=TT@$Kz?QNr);ChSUw(dn-7V!KLw!oViaVf45RW*nOLVV8tZ>>IH4b7Iwk zY>+W`4c0Bbtzb1?>>0q^$8BpaG}h*{Fss2~gA!2+OT)&CX(M_d(8tI~6a8Y?Q+iD< z@L7pThiieb-^3P^wuMYA(6Fkp*9YN@MH%}|rP2ps6sJ>m5KK0)zr> z6>U>nj64pD&ja}u)cgp;@Uc1P{USjg?}dO)@XsN%AZWoDONNFIoOml(EIs0F9R-3}e7@Xp_U z!UKc?m;(ZCW^>!zFffD+_f^o3oL+G5F{o+euC+8V8yPM#ypZ(S$N;3*F_YKtU^Z^L zxQSN|qe&rKV-(WrfQYFQb(w2n$UJD1uJl zu!RFD^exJZ** zfEMyW?g6O?cv6OHCS)-t1M|@91;q<{Ei;hQ=5FKz$lPvsl^6~XZ3016rJyieeu%c)5zjDZ5ixSI%Fxs7z2sMucHAf<8IjF6A;F+icZOG_ZP1jwGAi=0ATPyO%^zi z_sMKGfhXc~$oCDelgI0+C%K;id>9Wg=V-uc8n}tnm=d>9j+n>LP(wjr{DTJyi5#=@ zLakt%G9%s>fV8^={nq#mwL>mfa$Dp8)pwOUBLE%B2gSrHD4eAyY8Pp@FXHc)8-a!`y z^$EfiSwa1S1_TWZ8Wc1*=;EMDI3=p?tG3^#FnX?jO4vUy7q;(!u-OHkLD!1--ICti z8!qTI(;8vhq%Gce!cXU4$y?Vxz(S1;@CzYf>#Ai00aIJ!!gAFJbm+2!=fD+CfxUdt z&H!s#K5Bm^OdZBUj#LQyZ)u0g@JMOLOM95K2S|I8w11cR#z=p#tS3a;T&54V%159* z2tA#JCFvl#TT49Z-Er7``nfg|-5;kw(T3k6$MlL!_}(Tlej1riwT#knTl)FqfzA2z zvD}Y$%#Rh5KfW%CbhWpzT>Ph}(&>g&!f&j{RZjL=8!mO4$HpfS2OX#jkILuWB>6m@ zZdZ7@bMi&IheXNtw}|llazD0Rrgt0>;or&q&1l)*zjlc5ehY;C*L}ja$#OeIh;mP+ zitx(1`YZ@hytq&bl9bqK`q%)IaPRFG@x;n@Lj3fzAB~Tiop|w~pxj|&J zplQ|pIL&(`exeo)TpTj!z2%{il0N7GRL12!J*yj7&uZZL29Q|2h{EXI0P+x^dy&oK z^RYg(7Lq{+1r(2EE@|-$!OF~rnsH6@Fb~8zB)>yLG{Xo#YKPJ00kq2nurJ4uoH<9W ztK&-#grTSy(g~s=+tMs@x4>x`m1YxL1R@gnI?d@XH^j;yCq-#cJ))bXd7+#nCK8+z zIRWw}KtD0J)n;{7S&6ze8S6lscJNomVw$osF^v$F*!8(aeQb@}hwH&~$$Fbk2Qf|! zpo>+Ka>itv8+!S9WtdRbkVnxC`Ua$7EoU?>XD(?urD-_@yjfZ8wnOq_gw{W+hWMpg zr*rGwI$gCM{7Dkif)-SuJAq|RYR=c&Tv*XbbrZu?t62R2W+N0ovBeT9daCAv0_mR9 zOWK?0I4=uALntLSDV9czm=|QG;`N(q6p|asB6zvIg9ya~bXr~=_Ufgt#=aVlE44G& zU6`W?ECazn?t^jtRu~Hn)&y&VgA%%ihQ}<;U;0N^sI({a3he~X?hGyAebD5Y%>&a+ z3mWDht99*2&{W5s{p8X5w->#2<=-`119cH{W{q=#wvQ`fNyK%kdB1?b7RT)vBDnuRnBE zhIw{>@0^9jUkr^|u`KV`&Aq>@?ELxHN&1L_(BZSTfB2a3mfOE;I=D04apOl*9#Oxf++e8p>2zis%+dkt8Jw5;6mcF5I^PY7mn(ii<$@NZx>66;QwXQAPL*ZpV~h1M zu10-~)owPH@H-N*M*`Be5+6qc-4;+hPPfg>13(Uz65%ef ze*`9%5=@Pk*x97_r78E&Ru&r)jnC(4GE~#HT9XBZ5GblLRwfJ3Nu730vC{>m2d--) z!@LY?0Z^i+y(k^;v+{MyPHZ@4r)`BAVKmuoSUz-Ihm6GLU}$(DzQ>lH3(kG>7`191 zF(-`J?o;oo{Lr)rc(DE$9L(KF1iFy2!%gY}YX2D1_r0uN=S#KG+8FI++OgU_+7F;j zkv$ccRQ}^YPcY(0m>g=+Oq*H9*(5Bx9xM-twfN$xnaZ20$@_ntkN-c$zulO((%WnT zHl)Ol(i%EUL~s}#mVHattyqtaSdpszQOjs#X;&~@Deyq644 zflsA>7<*9CaTbqwf7STmJQZV0&SKBv7jga=|l5SVy!8&gDydc{*R<=*wPXyYh>7-2vN(fcLdvyuv z+N(Q@)bNW?ptE_UmJeK%33^>*fr#f-^YGd<-V>>#zs%T2Ek7;aTni)jS>!4tSJ&>lNbp=(|Pdb+b zdSBBb^bx?qVw$r!LPLS<3>HqDRWjA;Ot?i@9E3r0PV=;)>Qkg!hCQ2(Ach^G4B~(U zIRnaQJlyUw;;4y8L;z0e<-FCjlJl%`uf~pGZ(CPZj4gVJeuln65E(cSO|q)9I^8KU z&gxH*s|BI?C``{tomrPf9o4f^I_0a!DPK?^SiQ?357DzMzpn;5dGq*oNl#~q8=G_; z0ztEwEsa7~i@ zwZRAt6l-;jZEmgI0oHS!$LsUgH#9cQYrXb5Ha?@$R)c+@P*k&gOY?~?WjX-B>(;zvolQQ9k|y;IszJ4L!2 zY1^f3@(TRE`4M4<-7M@cM+kFGKr}>X6B}ZlKaBAmF0)P-<^TATXji1@E;h14LJ@Sgh>!faeS9P! z!GZG5HN2EuWgk5nl9rt2%`t_Ji#Ne3iq33JZIC0 z_-ZPk+aS?Cw~PaGI6x-jRla60NeO+7&6M%wYJNF@!QjVZde~EP{O73gvVdVy z0(*}|j9-l!FBoMwT|@fjmHdTskBEU1y4~*o4+bl;ILhhF0XgzK77N*B{L}+0tHCt| zYy!VD!^`*)GczLxxO?{ zI<*FTa#ex3wG2AbMC~Is8+KlJ`~R^Bk`8lH0c#gY6KhyyJ#B4y_u1GCF|WRZqW`-U zVW;d8wn#;vFcQz;#lzGfZmZ!LSBdb(BdP7e6S<;)*+{`4bcyLfc5as8Qe2Ibq4Bi1u+Tb@Z|Ccx zJgZ6gAL|m&%lqW0@b`X0#7~rXO!dddi1Pc%_-F}_bKVr`ORp38zuqbQGo*j|Tf%?8 zgk#lznLIb~^)3;gCdXgR|C3x-%? ze{SjTCg=0XFGTwH<^KJK{lb5@T(|y|{w}h8c^8RxR?7O1%XxiYwr{R%hh5r_$a;@R zc>jE_$iMh5VSga=xn%l&vYwY^`#+NLePw$u{Z8cjQ`Y;Woag!S{hB1l?Z)*Y-2hqM zU}--l+jFga-}UmnIwQ-wQHE#emtC`P(c&LXs3S&tsCb}45K?x2vaE4r>5I?6g{Su?}4 zUyehjtp5(#-kW9p-^hO7C&TOH`1~#5e2IjgDYCy$$$qgF;=Nlh=dZK$E3*H#(;|Me zSK#H>rA_1jj!oK$MF-N$4MreNImItrMvc9aF&$&EjE!fIX|NIaAHk4+*f6GtrVjoE zQlqpiX8g=q%NBAcjNNh`ANWbY)s?!~@fpnNG5V~A`o>u*70)7~qDL;cjA_CnLc)Ss zXs6CfWIz5W{qTJwMZx{^;!%{ynQZ1vNOp++GnnTR8P|yYF6kH4z<`#9;D+H)hfRq6 z4Gs97Dh{zGCvgk=0P=A~6eDg&;AdBj&<(-)qFR!tL9v*eD4!oVA_<<+V*&@k=y%Su zxlzhIY+_)No74!%hqYZ8*!`Pu{>ljxM{i*gkqtFwXtmQPXRzylMFu|UYN{pu8WWv$ zVx$YgiDu;Wx^c=DUL2KYCXWdX2ls&VvtUAzh?zhg){tU{37lRW@&xMxx-0bA8am)> zLdiJ4M)jiYL^PS9BvoU=wwDyaaJCFyn>hDm22-P&xGG2sgCBU}BV%@XlOT(4WM)79 z9qwA%Bawq&-Qk5U1vIlkOc4{n&4gUj;;a{{Cb|YgEzWs2x=GgrmIr!gwDpEnYvJcb zAztH6rMAO`4Lp=(4B%8Vs}Y<8GNIiFoeis5YJAZV1n7w&fR3SCt7({sID)Pe8UW1} zlGr)T_{c4I6yBODesuzAm-33BEQfS3I;?aZ8BZ0AkZ- zb=&>bl!7##z)6Es=*W?SZ~VC68RG-FDD8D{c$~HbXp;>*C8#~x+<E^YtAUh`c@{oN&~$b}1p&KsafIKA3kGr138@~tkdzJ?QygSGT+h(y z$7_hDLeT95QUILcG$`%$!H~klfjJ7Ci5mg{n?R=+Q7%UygKoZaTcDpPzjEca)w_IE zLRo-MtDEqF8`^+aC}^zsB{BeY(t#v~QoV4XNH6{&C4=ds*USwD41PGPY_OT>{HzCe zJ3x~S?ST#@xVD&fsjy%m&ID(nA<)iQx!CUj4bc2SC4s;e3_!enFo^*S3%oyAD8|a0 z3DEW6m4?ExgYcmMSbQ9lBPi6Y!|RRgaM0jD!Q2l{724AXO;LU(P*@ltLY+9YkDtZt z0VfOBz+P|?3Tfi~zpe%vAo6yX<0!!OF?YTSTpFLYGof{JCij`ZXjldwp`!QU2G zg!IV5AjlgaU^mW#K`RX|-lC!Mi|O|JAr2rM?Z;)3+)*!=5<2thvh&ItIDX)!8A9U* z6KkNQuA#<;5pJk);UEK9xLlx-v-27o%?$N5avV%Y$hl*l3AHm%$zkfKtr-Lx!IBX<~ru?2*UM+5$w z78;6B?uSjXNPbkGYbTSN#1X+vLAcch1JV%1werklqVg^W}bGY>S}l)r8N<(drn!X2TGkB)>y? zhuoi(cL+Z&_dRnugik-F@NznqzriZPPs{X|?-c%oPlc`SlX+$s$K}4{PaMLb$0FPJ zsciodjR^lj?z^nAyg6DCeu+=?=T5o*dQpb&l5AlO+m)ibfxj)WYCCVEW+`gRqWjljI+lPN8`#VR5 zAC&$_B)_FuhU>w;fd1!TQ?DYT85{~_Tj1sQu23HcwqARO3urmF73x5>M2qF z92q`F&ey(IM0iK|sg~m%+)b48iQIobEXQZmG7)}Uw)-jxU$4vbVH(lj208!c?jrqS znJ!B59lJz|@Emm?&mzK<$cTPwf6ixjm4V%1j~$!AwvQW^!M?$Z-v!8E)Pe;pWaLN| zIwXU|AhH&5lQS|{#DWYqVPpmy8k50-;xpK=5g9ByHiIqFWw85oI+k3S!Hlu7tXE77 ziyy)g#?#&HifP8PU_Bci%~GP!n1Z~r z3?)2*6_?PyUOhP4U}@{?_0S;I zV}tCmC`1v;yN37%-5V|M#I#h);96re=r`Qx>&Mzytpw!k=gCRunJA4{+`EHqL8C(3 zLyK7fMMRf8;*OQJ|XzJuM|lT-5`56qhyA>f729 z5L9h$UW&$6->>i#forCCmBhkFCVtBr*3){3HgMNoyO!}jQH#ASI9wai6-<=QEDT?w z?gZ|9Hx?8@(xmW+2s+GV8(uxS1N0OVKjyDYOKvwC{JBu;NWw_9ZuHcR-%+}KdIFqI1A@d@ICsbQ?r^F*# zk)3@pRK#QDMvOwHzM;ad6r=S%-8iC5GYym^^ekEhG{EfOzFFWV^b zW`Yd3N9K=|{^7E}uS)-XiPuI;f3x%}(%*To7{4g#zvKZCqmIv0vc60ie_G9!_t`*Y%vTXlq>3>U(_d4lcFWdjH^sif`aMzR4A1(W{S^8B=9dB$2Ai~$1 zEqbdR7g!aMdN>e@7ni};gA1m&=yVp!^F)m3XZ#Fd|6ZZ+qB5laec3Jz4`r4ASsclbJmm++Ou>ndD5BlA-vmA66myV8Z1!)v9RjhIQs(J2^$eC%kUzEXHMwOiV)6i3dhSn5#j9ZHJ439IJYSnNw^6kJRI7C zU3=lS^@uQ<|JgmouM&0*e(s)O&2>G)GCi>8z)!Xbwh=!AepUEkqw3+8Pk9<}DvjJQ zv6q2qga8}SWKozfX%kOA*kIGb#s)Z`4U z4>&u~;czog5N3AaihBZlO}M!6i-Nm)$>dL0V$g}FGo8fZPK~)K;I!1M!5VA58my@X zml^7Hcr-QQ2rs#9)fN{WlWBsUnA_GUn3bBjb_>pP)1#^N;FvylYwS1(3x*YiI&dAO zbUJIWN##2sjjKN3r2Q-BHn2{?ra(9Assm1J;e5iQ@f!JoYbw|0sWysn)!<@Ha5{Kx z^|-@{V*;kZo>sP3t$^zQi{XU+$;yVEokk9gGrx z4Op%ql(9>s{hGu(uf8yZhwqj6>9oWXXC>ZUFY&eZErq934LX9$uOSCt-b4pea9Jgd zaPw!PJX^J}gC`4ns>Ek58GcaW*-s>X-YMI2;v-RyTjKGV1;XDX^Ia<2zeBd$E7!Xh zt`h0CP8Bwj&#NoMdX^~LZ+TR-r%1NzZMpswn?*i@Z08Rek?yFp_sVtV8CidwEa#9M zU$wqBWqs+ZMR_x1Jzq$AdS~MvC|xS$@ZM zZIkW0_5qQO$wwWB1+u<$IUa8e7U{C3f0xXEryTE(l;DXWZ4<+Dy+W0;0Bm9aD3?+FYjHqcReKSNHzE^M& zr;(V`7Vw^Q5TF26ML=7Lxa0hqQY#*4VLB4cv;OK)m_VCx<|5W*;vG@`smx_Ja=rr8h=RQsbKa) zu$KK99L|RG_N(zDWIY}Gr^bIYNv$7;v{_haD9dLxAiCA~gK~Vd>}r(%dU!Z1VF^82 ztH$vD$h`+v5cjWKdCjJ!} z&)5l+|9huyXkXj%kIDHDWg8LySl1pM>YoxA|Bc{QKGwCDjGyim{r>$bwg0Cue`kU+ znZkOa{o>wXqWiG!`-R$Dqm;LT(dlyX4Lek5p?>FWboxn6ti|T_2+Vkm8hhIq!e9Zf-WIVNl4TukJhIoDe9P6A%sWDEkNRjUpchJy}wkQ#Af;LhAyx+^yrbT-2S zyH?ujUAhi_mu@60qHxgH4r!}*>{j!5mN}7!vrI|WWvX<$N~f!Ixkv`iIS3z;2BFO^ zXLZ15S2f|etrNQL^!+iqhn3+V7zs*Px!+mm$4xtC+)iVl^T9Z)&y^AJ;S5LvG`RDe zr0n?jnPAY5LFwAnm~8<^#)+L%JsUbAAw4d=DyuPKsM@BR?-lTQQK7JJkni)#dg0$B z-yb7o01>2)l{zMBIiQSjvoOAgP_3tf!l06&HVS42no7b7hSLn#20`jgC*wRd&>;ZN zAK*ote^(8n8ps7rSRZ71Ok)KwLEEyyXGOC?^W)ZBIzbGralIElkB`W7#FLVypA@{z_bM)2RtKINd7fK5WNW2!6zu z2*(FKghr}$kThJ6wer*>iNK4b`oZp}kkjD1_k*dsqc z=O$6ZZh1$;PCcV#2Tq2tqXWa(A1k`B56k*7%e#YF)2V#6?e}TyFYWED_Sk1^;w#nK ztWQ>G_jmhA``VJHJ6%5M#%@RTA4eA4(zoyD&*bIa?%kfh>aNfIw+!6-US%QId@Y-n zRZ>=xm7SXefRFL%ajUP>TJNUx6D>JSicZ!DI>D$hJZJo)&r7kj_-|Ta>*GTv#ZyR*COLF;7$_zl4O#5{7%ZmZ&BiYPuol$q3=D#xU^)`3$`=$mV^K%30z#(-eNK=|Usl?}Q#tOYkh z;p`JsLNsR$4kJG`EWBqx5STbMfOWvEcjD@9ggE^8ibI9fb4E`qyPh3!=#TpK$87rJ zPW=hD{$z#TQ=vZtbsaH{NB9IE<&%AkPxEm;%_sO=Xiti{vqEzPTp*WEC#J~5bEApS zpwXUzg|80ag@=v<4tW6zgwht&>-nQ)d~z_Caw5azc-~mz z{e8-S+_x85PF|h=f@9$`-*g{y?A9J1uX=zbSh5d4#tJJYm%Z>ZyK8GYPw(3z>?3ao zd*?gC4wK>iJ{104&kH;AO<^y1LD(sqh28wNuvf@(=DaKXg*#;Yc3}^a^*+2)`ri`v zi?Wi|1lov%B?AS;%SGjUd1*Sl@om!5+Tt}>Eo$O6QED;#*hOpUc!BVhGbo7g zBavt}&SpX#60})s8otiOQv(fcLIeDn^HfH6jNwked4%BAg4M=)E!>3<@(?T3>5U^L zjW*>1=1?KXIsm(R|BnLK5raXAvtf9n7sBQhJ(m$n{%NgbP1fV zO>gl<+-h$f6sQ7FtO83Ml_-+q-R=%rF`Z4v{h*84z3hGV84h-K(L`$!HF{0H#-h1F zvxz;a*`fIm-wjx${YLwOwzu|-HdnhqJ4YK!%kw#po?XT-pBV>z?M$r1r(2G-{M~X8 z`0H%TuN;e=;pPdLM_Ybq`K{$o?myh}d&|#o{nRp(&0@2$rK)0cK+&E;*k3IJ`B|S| zc*^g%33dWI0#{d11w`{6YB|Zne}rj~_c{|zOeDqr2C-fVY#7FR_iXFevPBOmJY_gv z={2luhVb{`el6R)M5O1~GZXZ)BI0{eu4Zfqf<=5Mo<59Cwu*Qm3)iq|2Zg^gr!N@0 zYL-afg;VW}T`^Ym3(4U7>x4fNvQv62vOPgqpEd9wkn!ZFNl1HHqz{3Q_5zu^6qrQK z&~3Slt+a`F@>7ZZW&gwAr!l&1tOAqHQ&EYKuM{fe<$kJibTkHF4e*C_0_YK|kRbNRPi4^q76pHRSDD*xgpw+`$b_3*uyL>%{IGfpzAELa z72j-Z7i6^55RHqCRTaLH2({X(cF`iog<{pr7FvSa)!}R#B$J8qanC2N_rsxkuCZAK zx))aq@`~Gph_S$-g=QKP@THmsY+fquC>cIn+9R7eY$1IwnSL<0FKrg`ohTVUT*i-V z7IUF(rnzEls4S=DW_nM^FUGdzW?ZUVI+xy&j=&BndVfyJHjpMifN{Kr#KwX;BJvdxJ8;#%@iy88pqutO+p)Y5_dzx zwgy_$TnZz^G6p-oe2Af?gA}-`4;P}EaPuTC%d}NPSFRc#0f+W5sr%x>O(;u3ZIte@ z;U7_H6lqX3ZWIU-)x%Bq8RDuedLUdRKLz3)qE3*?KwGr|oTgca;7t68_HTww{e{Km zv~jPKZW{Nm@l(Wrz}5ObP?(xGQ-)Lgt8Lt0w{fE#f%FItxYxCDD{b6s;C=wV_4wU~ z-~ITl#qTcs?#AyP{O-kX9e)4%#Ne#WC^~XOPdfAq$Iv+&dU9AUAZDWQT+VQio0SWX zK-LD~nG1dk?z<44cBX($flt~+bnu*$4&y;%!VwWg5)k3no%L&u#IK``SU$s;rwsziMD;=$}Rij|60t$vr%*Z6Jlqq-vZ9 zI4AG|Wr|#ZLfU2P5T|-uD{3F|Pd?rcSva>kRul+q?U8h~Pf0%fxFv0>x83-(YY3%m z|8S%c#B)%D7QhFkrp_W!2tcxXWTd)!5k_hAwDARng4q@*Mbimuqb3N~veMJu$HHjM z)M$9UJpO#fKgYJ_;611ES(lM!eIwu*0Ncq^90frswP*p z6Iv2x1qaWd=#Ip=^ALx>8obIZCO%k;uLz3m7r&gEgiQ0Vgld`r+zQ;qjAJ6=v$pu) zrDC*IpBv9PeUM$DY;5$g9>YBwwcvx;fjY(QSr#1da6>1LE+wO{OG8Yi-iV4?JErER z*w1NO$5gEiRm?7nR}r^5QV$gay-3*4BiNhKAsINj2ItcIZRYz!+i!?G9wnfB1 z#3G-Xah(>;+3K7x< zgrIR|#enZGR}>cV7V$juaOOdg(v3i;DJ2*=ZtMkxBBBr@VBUREP@hyA6)nFA9W{O! zC8s{%kdSPk90>v!Gfs?P6rA9eL$ZJ?;{1@|D0I*d3XsGc1^`exgyOyeapyesNj>tX z;6@#{$`$ZCx$X!b@N>tcPQ39VRt9W2k5oV5ylS3G;zL8 zp+jI0(c%ySz7e4q0r}8M1#>M>FUCxOsS1cu0urOfXG5!%=qwu6_DNz@V3o%i6almx zTsi1=cpd1?#vwjSQWb8`F*ilwYoQRR`0ZxiWtRy|4IE}b&oHWd_R!gq?9$w%))%h^ zX9|@H9Jr#CSb0_np9gnfwE=49A0sC{Y4Ch}O%jQz3D0Sz3S5w;Vr1lpY?G7l)&eSVuF40D zNZ1Q(Z{Rq-6ts2}THR`vM0|xfAv!RNVp+rJw}Eq7L6{2yB)baeUZowZ%t}sArx_cq z11jdD)doO2;yyxqsD)57FgdLv^x+w?>*|b z(bzWbJa`P^Qi;a`$d@>D)EJ;Qto;HiXSpygfVOsPvX~~w1JHKB7dWZN#%6)^XuG_l zrAEx5C=U8Hxbp_978Q;U>XO0@fJ4Z%`Q*e)G6tbM8yFTCPZ7wX#+UN11&b?qRH{mW zl*Aq#kZcONNv-xgZ!UAu#d@e*zF|=v(PuOZyssF|HiQNm6@c7!a41MG35lS-+C|cf zr(*qch7s#At>!8j5LgQ7O%ssT3V#>~j!vW0PKha!*Z?Si?gF68y#act)XPy+TUf_R z(25E~n~54~gKg1s;%CUwMz(Pki4qQx&6#=Rs*N`vdXdx z3R=r#vugi8fzUZ)tYQ?Xv4X@Sw18IgRg5#e1ohyJie|H>s1*k&JW8t4g#>3rgNt*r zl$29NKs*?Ee2|zE5rK7;S0q-&sBsxeLZf*!J`6i@q%xL!tX69@KWHUGi@UIfif3GHSn^(@}76mQ*ykh%E&NKsqXhxKsbSp!?(S1kiM# z_nao=YXayaNe!z&fxI8Kfc?zzs5xr#fSK)P18S6?`^59 zHZ)i(@!AGzKn(H?t2!!(B5fs=BqHeK14&q)@N`FTz0iEAv(+B!o%6y%<5|3?f?7vU zMTRQ+JPf8*5HPvZ@%6hZ+~HU}t*We|w6u6)R(Wn!ZdrC#38)%0xeZ>U*MOGd#56%H zsuDF$WXQ9nkF|+6jQyj z4t0Tyis7u;s=&a5ENr*TNY1wc&UfJCbD$>KhEWPXwk;swp9%d|;s?8WpP!ESgJ_|v zOIm54wA9q()M&|PZ?lh5m#x4?vh99m*5vaHGM6HtbbM_c2j&P_S}bx<+s+q0XE-^l zw76nQPSu36$Fz+^Cp0D|VBxlMCKA21Qf<6_wQaMDWnTyDU$YVIM^LLIiDs+(xAuhxQYHVV zR4M-{l^o!IsZkE+`BT|IQ)AOi)C=AXj!Ox^2;69uXx|Aa%R~NW7ipss8m(Z-ct9c% zO(fB@eAm>M467}+G9FxDgGwY5wL?-B^R`RcF^$^Fa}#09DC_*co4@ntYqu@DAlT4C zhs#6^Vmqm>x*!FKVaQn^3N%JqiT2hvfOAXf{-bJ}Nu{FXSgFNe3FRz8Ghx#P+%;Cs zS17$QIzBNiJ{eF(>?jPW{PqpkrIszBhRJn{ufc(3jbEK(;`~ra9MJhBFw{s98x?^q zhzV4qR0@mN!k6?wLA=}4Fm=z%NwS>0ENr+q&w=qxJAIx9J22Yufe}em8ztc=ns%FX zC2U|Lj0z;dNYK=pi*%>erK)ueKc_4!Nj?7$d)EP&RgwJXm5&;F5fL#Ikq!bXDr&$0 zp$LemfS`#42qBQrixDHD22{j|3W|!xv&&&U?5J4JeyHf_oqC?VpXcf6o&VqLzI{7i zNlz&MOMZDXv$M0av-{rL*Y^uhw7pZf5bv^Vn7} zKU8quW@_XEpSr6Vywhbam2lOl&v{`mw-@fB;86fNBv7i$OHwzg&G|ASQ#Y{Hj?ZP} zjca{pS*#IsQg|T>ulzGwxPizoBIIHkFOE~6t>b&d*nopyIzeXzCx^kIU@_kR;?o5x z!GOo0U@Nt!t{g32(do0klTR9Y#@J!QP8vGljL{?b0X}cp3GU`4*ayNBC39(xEf%-b zgWDXuUK12z_o`24EnK8Gyo6?Yy{V4n$4S9wN&3DVwsS4;JIKhx?yv+C9^!$G?v`*H z)O!=(0uzDo8DMxz8$T<3#tDNb;#`cwQWI3ECsMql@^p52v1`JNxB7M^c5Hcr2-|Ar zqTsG>bR$)Bf>Zbt_%qxyMvOUS@aPe#XYjxg8+ZIJk2r^pA2WD#@=%=ek3R~1t8cs7 ztuy#4grCakzmNVtPzj#~+~~{V{Eh+t@yq)KS8gC)caHpTPY5G>SC#fr9PGhSo&Z&0}IdH&V9k}`|xvVJZV<%UY!r#H5qU5 zVB!39qz}Q;5zFaVxJNr->5S!UEc};_r6ilP*Z_a$VEL^s`{d;y_Kjc1`;FD=y_WaE zzs2$smS3^(dN+R@&riqcxIXPdbZZC5SPbX)_}Qjwy5^XYF9UA^W#)j)%sP|s5*H?2 z#ml64=bYafQuIvBsgEDF#*<>a=9@7$3(uHyXXfCl77x7e+rW5Cje;O-gj@M@VZ#C@ zX`Md@QZQdDUN+)cFx4{yJaxigg}lXhxAM%49K41Ef`h|!2y+%GG6xhl*_mW4&d7qW zFoWlNT?m3_eu}7)SsAl1-Rf-k$iiGHn8b}I)Kd%}K_PXfraFO-sG;JcHD+MfvMz(~ z(m4kY@f1T?NX@|flgzaxJ`mNZ`GFQ+UvMrWWjc#bpm22M1ZLt?90xH@=3$~%&2>qf zXF)q3$0*GMZI1S*Ls$Zqn+FZZ9QK0z`M*vuQOxnaA-*j_*=6%_t-_v`@tbn|ab55> zdDvlmwV-DM1xGF()lB0HA&5AN;;aK7Ze%Dj7hfWv@A0$7{5m-nyy3`ELYfVNy(44x zqWPGh7qfIK0;2_poe!jnhD&13&d z;b|$(OR+^Dy%24|i-kIamGe25GcX?rt~{8`srC`EZ z+$T~5C)&($k8O_b5R=e#hj|!ZW+R~*fNQepoX`Yu&YZ8a7iD80TR00-`DP=cMRT(= zI1XG(ATfW=qSdG5?*I8(})o67{B$1=yvl}xzc zbo{;y6HG?J<83%BX5ou9{H*nSY#nnU2hIp-5!dc5u7dT!oP$YLjmMWKpS}?%kp1qC>nRBo;filU(Taq9+9?Z^K zl$o&vLm%cS#>XhL@vR-rW)C@((*-|tf|_$Oa(Q8b9%TxGA0?lT54)J~i?g%lVESQ@ zMW9?{)?7}{#oXR10nX_K$cEoJgh4zfcRChakK@BF%zcabOQvB$6~3ZTnH| zSsD0*1>$^GViI*6;qcSOyn6K(jnnTenuAPyj)-ecyv>t|O@ieaAb2W@4?31%55W-~ zmyEo}&Ym?J;}YCs>}G;lkwJJTRhQ+Mc*UgUIRXY~81l%2A(%%M5Nyg!)cFL>VMq9I z3%}$x9hr;JDNIyDFwP-(nzIb+7SkbT@L2#i3nSE%-oA#wBa`4C!-0ckTVrQL2&HMAP6CA?oyCkp6QuenFoE&e3Z<^Yv*_a zkdGJ`ACTKWbl9y(;v^Ai?5z}tzpOkU(BrpXC>N+-*D1|HyfUykZ<7dO)NYF=8U=c zaG!e>A7)@me4I)yz+79oGZtpz7XvXK^Twfw@|ru7Gcgu1S%70WpByj9UB=pFxpU40 zS8ENg^kJne;GcYDlA#9Y1HM25!7;1~Lm&3)G>gPF35EYXJ>;cD2E`q7cF$*;8K=1*q z3efbS`to3rT9KF*nhVd&0m;fhc@PZ5V5n>su1?Uo;BbZ$7BmBM9?Y7r$s*jbSU8vK z%w3pEi?BZ`qRuPul{t={SmStUHZweknzxQHuQIk`P1R71+e(Cm33`XOO3W0F+f~?< z7Nai|nZ0Np@)r<3x96WxzzvuTMdr?&hAJ`9GAr$lv_!9&rHFqiAK96hLpx+lzif`z zcvUc$mSW>yijRkvE?BgbmSXQ)ijS9Gg1nmALUwWC%(MqI zYbb?_;G=~I?l+83bR6`G*-4fdEbO!-*?O%ASWnXUqz3a?CyK=bG-MXv>2 zf$uAr-T}IV?pE{x_^(S3EBX{PYw0CLUsu=RZ-YAYKB!9{gL?E8YVh&Dc!B;HqeRmsG?6Jw*$SP=$}9j zpk0do1>b_>s~5;U=%pBbatv(gB9?b!*Pv?O)ppBpn>G!Z1P4_AKDCj17PSKZ;8=+U>&80tqdh{mr zL+L$u?noah`WfgD`WiHu{s9}GeuNF~et2AC1hgJC0Ig4rK^stW(1z3+9}Xo`d(a`& z9n_`%iVj3>5*-8Dh)xAB-gKX$kHWqMJq6l~o=5H+%!S1CL(p^R6GguP-AF$u`YSA(ljAqSdan!G zj9P;>r_P`)=y1@Ml&0ty-^VO6Cn-7wn%0yK+KLt_d4-ZM@FVbWk)rECJJCi(Zvs7r zZUa4wPMpy@-8EBY)v>_NcSoFIOsvNL(x}3+tW_a1L$ou)$73~drDD?+D zhz2S-MagNf%%v0Rde|$+f!3juKK_H-Y#A=SmNK3zpE6m0`Kk2-^%OWhPb9CR5S4Z0kYg0MVJ$(f*M(X4u0 z`&{@*qIr-9&|=UQbe5v$!)7I|R&*`sJh~kEBWZ)8n?ak>t%}}NkH6jhJ#1FdgP_Iq zn4-@kH-%nS^c`rTKicSK(m}Y>UNO_>=Q2~4&Mr$CSMpuAtpv|BQ zXe;PqdI-74V=l1>di4dRc}2-PAzw!CDEe2>Q|Ti`zf|_$)#opi{{c+_{RVnI`3;yh z#!S)&Q!7O~fp($86g?Wb7f_0#BO7?=y%V56gieIqj3$6Kr&AknoKqmTpfeyJOqq)2 zpwuFo2l;SX4EYQ?OVJBp*^*X6K8w~uZbg?VpLasDknV=2HQlF5Jq6m4o`Ze@y#$-C z^e06>0PRMffp(`~kUO2+hAc-KvfQ8{k5o+{kEK?Mwr$AYUAKcgm%1q019SoP1nOu^q0^Sc}nfMy!? zQFH(_eQ6lv8)%fG6O`su$k)*6poKI|(YZ>q0J(?K3PsOvR0pH(YRLU)t)f?h_NVI= zy%qMS(Or%3fQ0UDgvT#*KQyP)Lyh>E&tr}1gFe|PLWAj9MPCMOL$4|NW+VRke;4ep zpidS33UmT}-^jxe?Vq6S=qJzv=@;mS;!za0k)Iiz1g|`8&^b6DaC!&$(^#Gf($9iF zhvoSo{Q~$OvAh_hzXSgs%RhqjP>*OMmItvsc98aYKm2b(`VlN#M=|)5Se^>fMd0^f zc{NCH0N;k?H7q{_x|_kD!SY6s-VDAS%bP*^YVe1!d>f>10Dl6@cR~6J@cXg+Ge|f0 ziTYtFz}$`;Q%lGLu$&vD+e1DU%gP|#0rFrh=LPAGkcVJdh4lG>t~=5rv0M7j)oN;esS=|hp{fy%%OO=<}l%cRy0J&)zc{T%wN4buB#X@})Nhi=0% z=^%$@Wy1!`q}dL=^_D{)VEF>eKe7CVWyA;Y`5~5%VDlOHFZiywj6eNE*itX}!!u$( zg1@0S8&Q94T&<)>u$_l;(|&dxB@YnoI$W#^$ZbtLki$3!LXRDZ|MHH) z8FyflHi(9{H1@}eK1rdW>e?FiZH8E%1L4#3;Xv3l3Cea&rJ<3ewm6AK9}W|-rP0t9 z!oRW4!>ADU`AC+tl2Me>Afw+N=gCIk$M)f9ma}yKC>dwLYy%m7)K(vq!C9C-9Wg)*LFIU%nQa*ys@RW^!(ejR-O^c&9i2ZgY8XklOxGNKcgvXUvNZS zsji6`?^2nV)3TKPN{#{R*B)oHl~0a=w^jDvC6KL6j?y12Y*K`b*O_!##H0S;pZz3r zLi_9}Mt!%tqU#BXPX}185_j;xsp{p^plcDQ%96F+gL}rjYX3BzhKKA@v4<^ zmkWQq-eIr%XAIZdWrwoC1h0{#qjg&lr#X)2EmpDptZel5tm7P{^kyt|5f6@xs=X{H zTlqL4A1~zLLLMdLu|l2@%81$Yxf@A3PRPd#dAN{A33;rLCkUCgs&^_kq;N+$&swby$$u3wN%xm=AFYn$aU%UJ{ott zlK7QL)t|${@nH%LGv~vo%gW1X7|Nm5(N=pQQ=2z@$5gncBmFQ6{wnyYXP zbul(r*Ih!Jbn0T-QaFXWnE0_Bb}{is$=O1mFUl4QpEIb7*#@xf%@y^|4eMQrdv#_X zOsBbF3~Pmc2F*1w6lM!KpSla5-9tY!sJpQD%&{JKR|F271Lv>7S7&q#e_Ts##uBf-Jh^?-O z&FV4ZDegDxnAhVn(X^$A>IQYqM_qMI|6_lwYp&@~Z(Xx~Sr+kFKQnL{VSKLS-)Ri{ zr=Ez@+N2BnBB~d}a4KS`C;ZnJKI;pg^@UGsla5P96GIWz4}4C5&-&7*Xk&xWekC;! z{u>DY)+QY`whyhoh^%}iH3;e@)Z0MxTLaOb4Mn{TMO_Vr|ArzSYhOeS1OF$&f5X7% ziC8ZUgSt+{erIH2S+qAv)SD#yCy5xWO*&b*h>}FRl0<(dnRcPBB+=eR!e=8047XBLx|BXcq)}{zgf$Vy0j3;<{zZg%AMf{CT zyU@3dMcbQ*x|)c(nuxlrO%XK_bv2QGMBCFu*)-ul4bK&IY#YexuNL=(QpuLxL}}sp zP$=xvDNWWTVzByb8X;mBAz~OIVzBxmVZVt+hQhG!=c=4CkNexKGa4FU@cc zxxFFFH;2cXF^IoexV~6X{ za<-83X;irG)(9E)rY#sxMx!mSUd8d_rvo7C>oUk_m%g4FMkknaSDX)@AmTZ}_(6M5 z2;<48G2#920W?O~j}hC?7_t3~6*lI0O=;OQwy|07<7t0kvwzqRE6K`5w12ogY@xQo zzOArt8`^9Q*ViRDA2>kRA0X`834J@EA1CxyzL>^^HkmXotZSXnuM~2+kc((s*oWD8 z>%_EutmrOiFmB5c=v)I!|f zZXsf5A^N067=NKC`+$&F(t*PMz|cSRqTj4OoenhH8`^bX*v5Q1P{hz)_?(nb-b9mx z{Up|o--zK|{KvxQBzC~M_ylpT&g>&WWUDO<#uE&YqW zwfcOT5MDb!6rK-L)=HWx>YXa$nJVJ6Ht94~98azN7Md#JnHt8EPgYJ9ayCsheTY6u z7cr!Z7}7-yR=-8q7g4&XcZslH68fA$ON39WUn%rkX-OD!DrE>i8KP`P=yN4m`4J(f zQ%2|~U&z^%A>uq!%A&3_!*w@>tb971DSYxhoO^I1jGyB`KK@=S4}ZkUqaL&JSSdeh z^%HhjdE&cP&UtDzkNLxhk7X%8a9txQJ&YkW+!~{8dTL18W1&rVVUs50O>7_Z zZTGazG&Jakp*XG?xx0|-2>C`K4}om%8>|pMJ@_>GA*>Jlw}L(2FH(QF=VR|7Pb4?& z|6A34et!-3!)PUc+}O$kg;gK?9T*Ad^J)W>Ljk6It2wSFWQMqAhhPl!S}Q^*BE z&J*$qA#4A*r&`aP1Dv9KvI%c9?7zN|5!(YQPQ(Cv{+%y=J_Varzx<759p~-F2KJkT zyiUjkLS7lj_SyOXn&1T26m51u#!C+T*X9}fyfy7PD;Gizk83Z4$3DtS5zlR36wg>8 zhvz3R3meGcb6Ch`AIW=_h901vwBflwo-elxWPa9cj*sImu<|+~FBNjSkT*jP&Yh;o z=hXb{*wo9 z&c!}xpXuXV2-}|e!!rdua}VTCMGT*dXZ>IDJ^b|IV863|7W4k7b}8N;A!j}GSG{kB zHUqy_`z&7~u#Fj)DD7L+8?3vu??nthsPX3`wasHJ!g+7gpe)PZ3cU)N$Hx85Ht?f} zndP8eyq$;lgnzPf-+zmKhCVzGhaA4=@T;)-udsn^{HGl*?8yo5ho`v?+q6~j`;Z$4 zavi1rShb~|W8-h2Y*f4Ql7!q?*a&?Z37e+Q#He^o+jmhXtZVa(pcB@$x#!PgY5h0# z`eL~)9x4Ruk@h!w*uU|H9=mu<-eqLif23r!-pMoe(0?HG9}4-2K<*fBZ-c0#i5cgy z9mDgDbm|!HgV3AvQrPe{=H_55oh;5JCWptMwKUn3#ktnx(C4=BISZc$+V@qkzlUQQ zWaB5VxnswHmZ5xj-r=-g7;|g29`*WaBjmQB{l+|7b|a5VL2Q?^A5&LaVYpv3No(iq z7hdbNbIdrfF%Pi?+ozI)v1?-<-nR+$kb~IRzZvr{=W#5szdR4)c3{u48AE#ESlm23 z*KO|%ZKn6B%kz>Q(=egE4tk-j|_$6Rf+IVttusQKLm)Q>4 zJ{TXGq%B3V;1ZE+7&+C(2spa$?rLY=Zbh=B9!q?MV=^|7jC!XDKFgb z(kajQM88=%U&z_vHZVC42R4i$zb?{ak=ZsVP3w0}4#p^q1A0uuF#`6F7(L{>g?zt| z9~bi1LVi=oUkI7syEWsX9y9e=_o%RWE{L+gFm6w^3(tZPi(917^FrkGHE} z8@pR=V|om~mF3`G$E|o)V)j9n4;J+vZ2B47m6h|=cLQpSN?S*n!ag&Mvk32}2j`O* z8#9d`+zZMS+mCrB#n(9IIn*fZ?}rGRLxlfBgikADe-Hd$i0h_9L|xNG+3BL}bkT2C z-a^yEvZ>Tn*mo87U4>6;lTOxV3w4!#LOEOL@w_b9*ZN`%>?+#ZRP2MZL|wB)JhMbR zvqafhVO^;HD%ohHwoK5qDfBufdY#Z}LUGu`S`7}@X zv^GWRJS{zVPloT2_RZpbbC~)zMf==L^F(`_*Hu?a*r)iuZiArS@s#QZ=PGIV&egNB z9ZTCe!_D~{&YA7=?yinGmUZCcU2u$JIXnkz)7>%lhv50UdG>t>_7QUoqOALb+%r6O z^YbjTty13d(7)1$=ZdfiudP-Ho8Dn;ln2@LC*Coza$lkEXXQL>Z{fAcb>Z=v@*o>O zJPsI{uNO=VedToot{p-f5kuYp9N&X}?u(d>O)`9%_0{!oOzLIc&l%{1<8ae$x1Hs1Ni(T@N+=dR60@EoM`;R&v>C9Z(_i9 zewff7CibtBh5lsI|G3Y8n$Vvn^}^>#ST9|9@4@xdNmv)Vf@`8vMA=iNY}P66>s}_x zUM9+(Bka$Xau`D@-GH)(1ohs4vTq0V9xCkZy`a-6+2{+$(|jo#pLkzlzUjllR61YS zoNv|_>xIoKVY5o;FB1BTg#HYnKSSzG4A>^KgiV&wqu%90zf8))&lI7bBG#{!XONY* z(G*!$)HNlP^J#(bxj@)22yIgFrD?GLqHoU=HvNUZzv#pMVQlHtU)qO0v#Ea|&%k;y zGNB)GgwGsfkA2F@*|bpDEEN713H>6WKV0Y!H$GAC;lgIIu(=r9UJ7q}g(K-=Y-tf;p~DCbi@;iq5dKb`u8HmTGz)UTwT zqOP8ztkrL!p5ncZo}r(7va<9!L-va-q^%czwurK+jiUnu-vDEwQwh^(AW7YhGY&KLS@ zA>Ts-M7;wLdI_Jah0oQ( z=jsM#y{yBx^7h)t+7#idWn;63R*U^{by!zEz85t%sWeE`HAwgzBysi+(IDL*inhHfcg(99pQSY@<7Td$MBA#nSJXXJjtiFh@72}xIr_;4z zocTgdrE5iODI$gxQE!T<*UCkd68cP~D@55VgncNdt)x)Km|*21xrJ74=>!;yGH_94&0DoK99QqN7D$9WCNHM))~K z_&-MYv~m$0Bg$SW%3dk#uM~c+4BMDbHwv2@MLahO`x}K%tKTZhZlfEe&rnXK8%1p9 zJy^mqx}mT+UHCs;T(6xT+GNuZVKXGur_vmupJSdmrVVlCgzdsSk)fPUYlQtuDT_E) zhW_*EdSP?DuvsDWD}?_QqHKY%DG)XV(k7I%$?8+7K#Y?G;eDjFWaUCC5b+dgo?sQ0Q+&L=CU(pe(@v%>gSV%`)x{#$(kofXD8g^EJCkS-VUex@#*GhY|_ zOmp@Necpt*f6Ttw&bdy=_Bq8Ax?Jdchw^ypE&8o@=zj)Tc_sBWG2ndO+)Js?-&u#_ z|47HYbHeX!T6wduY413~fB2j<4fmAHdg=NmT_WPSMA%;v#*j@`&KGhjbqeiQif0Ft z>1xs5t3#V~x;pIVwL&hWt4%y;%he*D&BD)S;pZBmzeehXpKHWBgvG+XSj12qmYqSx zqU^cG9@lZ_nr#x-Xy=CZ>2wsf;f{Pv$93yb*oOZST(=$-+FVIiUMXahH8B*frK3!} zg=^?2)90wm+?(PV0?l&)C7X6ZZ|;BcO!nrv73GZ<&yL67nYDQqKh8eKOdD@)(k2Lb z4CIE~Dx9mF;_u`F>6mh%+1pWsR5XC>TsYp=3MH5xrBN{ z?u(gMj#B7>dB+R}g_6<4^L{Zl$6y92gX2QUXySRl7@HK#2sESym*aUait;}!DwU}A z;bmGRDpg)xT9o$@nD1#+s2Q!K6X*oRhhhG+vG}%@J)eNt&c7hwJ~ zmJ1a%F$}{jt}L&?a*?8(x){mcI`;22znna5&v@#)Jkuiknr7FS@N ztt&%Zg&78W2jHAoY{0B*CO;9ker@hX%>H==N?loMNo{{M=K9;yxJE^=DM1|9#_6uZ z+?EgzExTVia+Tx+~sfw?l77XvrZ?-XvPTU45LH=?g@rQ7Isg<{O&TTFKXchMI5 zJ(exBRnfcY9=aFOeJZtu?xzP}`3IHSrs#u;K7?6+8F$em^eC1`=rKhfr|t9vq$gGC z5qgSt(9`scNz|L0O``**3im8oxc zmno)Ssu8@W{!0G|@n8O3FHGE4U2vS=$i**kaXr4{I}xXjQ@2diE5)L|Q!*MLuc69M z0&N7j5$cOZW2Z7OK1|t$PLmkF#-gcX(9CHLv~XGit(?}*eoh-;|Ac7k9N@GA4s_aA z5eFqKpX@}VgTvV0>F9KdiKnv@kCx8Cz<$be2SvLitfi{4@6Pgvpas$Eq8ZjsC($2W zovzA4Yq_5|zHSMiTsM}7~5o=!A+A>GUA?euZ_I)`GZJo-7MqrZ~~y-~NWv!?ra zfKz=q%t?d+XiLdB+=<5#PE|3`iN%r5k}80T0u798iK0D~)lAc!)?4jy zyw@2R%j)A@L*J&3PR{68c;_UC&-JxMqBuEcf^)KSN&=kfOf0o!lbp%UX+SYea-zZK0IV@Q zI=AFhtS3&h536T+3Or9$HBUwa4A$yMG(SD4TbI>zYT(I4rlT;W&v4?w7U@8Sz?n!- za;7<%%G-2jx-$dPOvl31$r_ezPT5kdwN6LVV#PR$S78Cb!*ewlpIx_8(J#gu>oOtA;p0fqmE*2}Cb5Q;qPy=nD zQ#QwHS*P_<$FeD7W#iLwU8a}{oO7KOSk4Vv#S+V!uT)yD$D$xAW%XJ*&xyw>hjG4h zL5K?>*^-6MYK1~)O$>@jYYdOgFDYHNJ=cB_YAaOG^{+-uI&JvHB1$g7xyCoA*Qk7s zLgy6IB~CnSOIcd$TpERS&Sg%Kb2+dcQZ$P3dq@n!qjO76CAODZj^qk>zTCM|)qRzs z#iUck#PJk48)Djjm2*{;#>Q3zYxcR(iHEND@~D!sPp)>ZcCG<7#i5wA&hU7P%4@E5 zu0?&^36K-7Hi46o5NP$qGNN48Hg13E|td6TS7}NcdHW**0c3(QI@PVxZSB) z+yVc0I(G=%6~?l~`F)7novqH@0(U^Z$GJBF?sM)7J(yNhp5O1>4{v&5*`$qJJ|64A zmU;jl|KL0zuuaKaV=+DG7!=b(&^+uIJm5Tn^rKEZxSa7{`F87)k2#MkY5pA z34zC<)pk!hPX>}sKjp+@hZB#-RXHyEr1P}%j9Q*`o^>9J0e;^oMpN0e>6zyoi{~Np zV(@~J{^Ka~#&$j^9alI^SNGqivD&S|TQ&yTjQT&lYLm*%gc?XkWp*S5-(vUS!>e^)N1V*Ii!<74L& z=Tj^ipF;jD4xc-TppTtp)&7MO4_#8zFP*&`UpW>W@z;(8r@wK&twn7Q{6Fl0@0{<; z(W-wqKU4z$bbbuZ)c)n{jrhr7{HzcgpB%l4>EBM-_{I6f`PKQ4I5#yu{_Xs?9Qe)o z4KEctfGKCW{WZOkCC~K|l+-?awV4wY9-5jRp|`8sZOpsriD3_tbUdTxEUK@{pk zBhf&m8oIGaf~Ju|W48&=$Zd++8mcxmbK_xqx0sr{@sRl~+!k(2x0Tx(bU(s5}>PFd2k)Jw5c(gcXMk7rWWhHyUXCTrZy*5 zGG&?faO2T4=(ApKFSmCU(Z{U_`nrAHLxH|3f_`p4xBqU#0QWGL7l~pz+&u!CBNUZ6 zY-_dyYV=~tvu3QMuwtix@Wr6+)Q`6JHwsnX1TN6 zYz~&c9#J26lH0t zyUbkwG3j&Mk|Qo~&kb@{mSUyL zpBH1XDomg6#^QoNV|Z+S;`D`XA#feOXi0n&xH|mWg>A})K58VUx`x#_-mDSFoU*># zs(gO*cU+bCQ~LLb7r7U^HRU_j?@)YA$GF5@tG0woL1S&IC%t?6j$>WtM&mL!8Zwv1 zCYj4=na{G!XSpKziTvM%8sx$e$fYd*MQ)LMd4ToqdiM(8O5iGh>)YT)W1}05=-dr4 zxf^3j$LDi=SG(6>DaN;8SF8Tn)z+y?>^xE!QJLQ2t1@p_pZ z+ubLid&GS>&=~t3_?G%f_t7{l=ilV^r>9(v9q!ZaGw!qQbMEs3htmaWJ@Yr%1~0gO zbYFB|a$m-nZFG{`{9;NxZnKtqwwSg!RmCfAX?WEw39q>tuY$jhh3(7{!j}0{5T}kd zp6+yax^H07(9)aGFx~`=WUSr_G^{tJb_G7(R{S0J&+fa*>b;=+Uyyp!{cC{tRXOAP zMXU)8UEc@p2grX>*?j1}G-?L;E_;Ee|L`}ZkOq)e%SgLAG@D~ z;Pj`ihL$YtMQmsCdMUeJq`_J#8y_WcQxAK$HEL`2Y zTKpMeh=s9DoEvK`(_GS~S(fSOl&!^K z=|$hVdkcESL~Y~zu7ub*dTV9YNcp+mKcn|q>#roKPt0C!?PSf-UU}^>`e6Q%KBT!_ zUs`MZRIl{CTTvvgzx-ZGJ~C7;N1g|iCY!hMD#HKaCdLmX=-K+8l|V&Wp1A*OwdL)B zM8{p;$GE&cQd{~7MsnlVXk&GzoVGJo(R;Y@VL0b%3u|9e2|aFn?0)S22=r59gdP+A zg|n0IqR@vp&9oQBk*`#q*0KJlFwNzSWi+?etk-$QTBkpOmKOsvdc|^+AIyv#z3ETMjh*fz_O2IGPqYuM<=Fonc#dwZtj+YO)|r&?%UT}0 zO?}akN|yfvG}_Kn`gb&l2ABaPK* zuQDAkYj4IUZ*O|hmfV79O|%Ew%X}4C(o&IeG1gY^0f|~?V~&o=M4m`%bYBJMc6^S; zXIa>lY`SF0)>M|n zKBSHIX^%KoD!I0jbNGs?e*dZ|3Q!Z*R5In=GH9u&Lw#cUXk=X-;+P@u2;{~&!`MFPe%DUWqq%{SJJ$3`O(O# z@oYU>ZtCq`*!o#&<~0`)Mdxv#9*>1Rh@Xqa z)^b~g@3kemtJc=5IEty_W%hK5_$^m!_H00X>%-jVwtj`EK71_4KkqvJ7NO`w>L^>zo2 ztC3oYDaA|i1_xj{7FF#t-Uq4!W`B<5Wo?~9yvpKu?|5uIrf(#V?W2mMQ@v>H#QO-P zp(@cI@4e*6xQ$$LyhE}6d8r6Wi~cCJeI@c{-YpsC)g)4C)O$@to~W-%*S!?Z9P*N5 zdexSYx%-;Tt+6esjI`4o?$u&X_JG+U_Y_a_%8L=@wk)s5TD!fu2lSc5NN;x{_UxsY zMtRkX(VoQ#-WYFeEfV&?IPXMnJWy8uoaDuW%fzqA#F|9E$1uS=*-NCasO}U`|DMH9 zbZXpPvWebA?^JJ6rR$mOO;$cn^Y$K0@!~Pno9dnJo#CY`oDsKPGQ4Q$U&SejUJ>{E zJZvfNy2r|VzdcsBJJaWf-z=Fs|EBgcqn;KR?G-f5o2GIy@#H}NP8H`(51u0!yVCd! zZ>E>!&GKfTOtv@M%kkzUtV{Zs>*acRp_ScN*rphL$cwSJx#g4eJN#T4zYhs;yA0-e z^St?37z+Y!HCkUbUFa=@m-(QJ0xSr&w8b7{iNaEEskh8q9<>dgkkKx~h# z@K$)|>;`Z>rJ=w(H!il7-b(Mh1dweQhneI{$0~2Eb3PW0Qys=wwT#8Q@fUdUxX`N{ z3O$3>9%GGnk#}*0aEX@)YrRY3`bPJ`I%DleezSLjf^AD;DY{R1#>#ipyq3E#hb5P|(W_Y$!+){DP2NobzY)?+ zO8-0WW{(%!ALWxc=3Bg5z1zIo6XFiGg02{?cGSc{wk{FHLcgTS?l)%Yx`a=9;R=Y z-{;+5Db$ur+;6r0Qrjz%44dOKXfVrQ?lmg z&^9$a;Qepo58nSawt2NEsR#JE;I?34DIT%;`blEE-Ja3#KE7vauGw16*i{|;5?7)m zk52e!EgIuDi_Px~Oa7oIQ_*rAQG#WimNeSFan!GIR^M-I?p{x$oU$N)VKkAvd*j_# zYJ14D*jHk%jnnqP!`>qv|HgP}u-1D<;=OTq)*QX}w{afzss@hzF)z9Wyw|jH9#?(8 z-75`Gcuy)k74RM2(~#^jp!E4|`5E(*-ZQ|Xn7@n5CR(2Lp7VG)2+;m@om}Qo_j&JT zdI2@wOn>xV1fKC;@?H*?SK$9u?*;cY?{(ls%-Zy-x5Z(tiSZ${T`#=@Zqk}Z_ssuN zinp}>I752T`;+%d&}%zY&pwGBecpS+d%=6tdn*C{h;_ofjRifuOWRw`^#8(Tllm0uJ@kz7w@Qq@1Y-^P+Qhp!R5>UtM^y0YVTd^tyI1r z&YJS2by=Q$?nU(CPM4)(a5JA8zfo6AJKR{j?=d)+N0tvtKrxk+Q<}cKrL#%p#;tQ{`(0%u%SJNnc9ew3}T`3r^-*{ESx1NUaXSw$KomUpV zkF)q*>{I{nst-SS1~$rndX+~p{pkIxnqVS|_4kwaa|mNoo&4Wk_2L(=dhx4Qv-po! zdGLDpuNM!wetz?+2gWD))dSNO4D6Vb^W@&ew(aVy&Y}d zEUPY_$ZKg4?cTh4zC|58kErMKQZvw=xfWdy)A|)a9jAfcFa}9}MbOA^LblVQ!++Db^eippK&@!;QWooV_3DGfX}0{e$9Q@-$EO zEjsuekc!Ul=vNk<{7!yn|KLiai_eITrsAnX{AhHINk`|Fmg?qr3!~}o8}#sd_&u>O zdWHEm&ffm+gRZrY-&f#Jzx?3x{rqV3_sav@-T{6z4)e=~EzQ#5zDBgxrjGC>tbXs5 z2Ksv&c5go&>F*Ad+@_=a-GS)(kM=DF`Bld;{xSZs0ivJZ_I8f*;~{OLBdbl-_CUpY zAjPi=>Ntb_>PH=Ch(E+XUL9@Oduc6_`@-&(J2{M0zp@zW$0Ieat;78CW4NCPX}-n? z-=HG>G}12{qkN6gzD8;5tD<=)_~peIU!uJAjP)ymc(3F96a8`i_}zvRQC~?o$)5n6 z9KzfQImIs@PW9t)l4=>(INmq@ET8C40w(*X)fgtj`(#y%u4%GA#h>b*4xHhq2bh!~ zvSK-(I_9FLSj_eFQ1d(>*Pjn802ca-6y~cEi~V@y!ipCz zQA|tx@*%cob$Y2^Hj1fin^=owK4ZCpmd^6?kvbb#q3AhCajE4A)=J`7YeHM#OB7Q9 zqA?mP8BH`#oPTaqdsg~2iSztb3g`J2=ld6k2rl&FA^Wk=U+u5)FG7in{b;ZiYYdOh zEjbnI$#}6Pis=%6Ej(X}nhUXLa6K#;zAmVl(*~C+oladA#%oFy`4Za7YK)I)e!0K9 zu-<1}5d+p;sdVf8tHM||_#6C<{?))W39u1)c=OcX6xc_%sA8#W{hGyf{`J6S0Zy@w zb69`9e}jLcilP`aHu{_Vc*NRNCH*_UCULWW3vg=yj+4_ycZ+|Uf4hH&e)7e<^xyE`^xs07mtFqb{ySLWVF^0dkOlkJiYRP|DnL&{J*Kx2Y&V9BmeJV zEg$=zgz~38<1;`@e~)X$=l&N0U;1ALsn7lD#aF(CtT9^t(*N53#{bs;4)`3L@jXy- zPk-x_j(_;O8_}`q`S7A?w8j7L)DM0viYZo8`Sd^iAESUbhDG|H{=ZQBPr%Rqzkx(O z{fi%uU;Xkxd;5?7U;no%fW1(p{3s?T##*N}P1M3Yt8*g~#l$I1rM@b%7qQT7^-u%r zH1+VBs2AbCI!dQ)46Pf9hsk4JFJhrn(K?%3eyM)MpqLs&8X!(iH^9;mwaMCxDJc?< zXp7oZP4+;eNO{mW(m2utXbMC}(=5^~(mc{4(y~MpQ^|Sd&uM`=xGoJHgVwc*w2tft zv`L8lBk_oC!QP!3CB9`z6lvQ?=~(5ga@t0Cxxk6Wg^otFHc={3y;^rbq+Km4+yf=| z=f0P7VC4TZim83XAo04{Tekni(d~KdL6LnO$&uukW1j5Q4v|{aWDj(Vl#WhO{ogrK z8svJbF8Sa{E%u%ssIIkIem{H9ub2FTJrWNS zKl2`u%7e@Ij2QGvcogg%saf=iNc4^LjT{>32lNjxATl6w7|<7K*={2r9*IXW9TAZz zrt-JJ_$_Z4YhNqXL=Oy%R1HT)s)nN?6~WPwL6KvCn&^o=|Ln0+1+J5(^j*p~9hDMUTVI^#n!z05>$kDN;MQZWC)B~|w=!i%y_LUxpU3b-y zj^FmH!)vXNy`=|6Ml_1aNHSeaM|uNlQQHHR?g2ehYUx}1fHIzel~!7BoosPrsb0*C zt+BpFMQTyo1Mxjzwv*A3|Bo=OE2ffLr)}c%ZCRG$^GB=ei4!7YB4Z=tA}0ojF17EZ zuBMs;_d>z zA#!qv{uGVaQHe`L>&jnmyruCJpR+qOJJr1RiPm)@U0HL1?~eRaB8-}zNjy>O_q;CE zD<4XVw0xygOT2dAt!3Xqd@l_4%0_e_Mf-TetvKFvqw#_JL5wCkpHmgD<&7Ah_$`Rt zQqP;Hr9AB^CTw$76KdT;1ky)8|Q)I26d{N0$CscTy2o)(!B zISrUv>N^9)WaF2z)mka~Y;*5R4WoEWNuZNft6YFFJl}smNmy`L@JM&<%m8jQZtwp(a4U(!}iwfaztpY_k@%asSM^s<_5@(#A8pi zqo(To$dM=}lhTq+8+|k{ro2ck_KqIlxoPJ`Vlh7=5kG%zRW%DDRmZ|e)v+kTSR7fR zury-YwJZ`3leavwJhU^qS{~g4y`8fndjk1Et!Ia|C!V!BI@;Zzs>%K_eNa;WC+?AG zZB6&ciik#U$4C|9x*SuEn`xr*R%>izD|K00-q^4wT~cd|K9*}MU0&C&OW8S@d9kr``fy5wqv$BorK|SD{+!6lNQlt>e`Q1?rsoLF6K4_+Ab{9#ME;knOes{U?x;>|fjb?SJJ;CD%w@_2t=IV%l zb%ep53|$jhqiVC>V|&-6twl+aj=TW=ICgDyQN*C6QoBdb@$7PK>vc~=)AC0WU9O~* z_Gj0&w&T8MMAydYSY5P5qEy98B=SZ)zFTMSn zJ&L`rF7ceq?$>O`CD(+uymdr-mnpq}@g63%EE`YJdTGZNG97D~DA$(ZlD4#!bluul ztk(4J-o)kpr)8$G+eme%tEUIb-s5HKWSz34UGKb&>NTuwIY&$8$ZmXSE4wx5ZGm&O zrC#%Pk22*Y@p0LhO)Hq&^%*T08?&BGI+n-Rqcz5^r2LxF zn|cjTRFBDHo+!U6I_bNr{<%D_wOF5fQ@W(S(&LgGo%Hr)N9OnuE#BIkRYjL7z*>th z&D!W~xcXCxBCP&eq{oXR8oDPel{SfG(?ijHCsT>bRZMF~mAzXkX`d-AYA#c9Z)lJ4 z`O!7S=U1P`MyJz5QH{nnKF{Q6F1MFNwUo5~*Xm^t;1^4F>sKPx_qM<#k$6b& z(Ob*^R_amjQE&J@4!JHXBkzg!%Q*K${nb?`x1+jz?aO}T`izzL<#z2GvB&m!#nRin z%A;a6)mrauJ+Sv4|7=g~8~b3%QQDU5ozf2Xd3Q$@ur{)9qbhCx|4??jSBwA8Jy6y* z`UmfS7kvC9a>yl*eEh^+9jZ(9s6I8IhLl8&s4+F6rqqm@QwwTIt*ABaM{Q_-YD))D zJ35fs(?OI>9jGI9qRwl*C&=_DWjiVE3Je@=n=wv#DPNj)7 zi6+x&G=-+p>2wCAQwE($(QuRW>GdUn{sFl&81w*qj@x+ z7SKXkM2l$&Ev03&oX(E~G+QO>5{Px|lAZ zwR9=1qsyp>E~oW$1zky3(FWS6=54!%Hqo_o9bHeG=?1zHSNk{7@91W_g>I$W=ytk; z?xeeD3;mw9(%p0q-3u@G(fyzg&>v_UJqYO`dYB%eN9i$ooVFwV1U*Sl(GEyY(=+re zJr{-N=>??!h}`nwMS3X)FPF1qN&a6UjaRGarzHOs)xSm>uhXAsC%q9y^(MVVyXb9t zr$+JTDDUqQ<30LI7)3=}Q{DD|rT6Ir`jGwxd{nNe{!Sm4%dR|;enOwpXY@IJL0{5W z^fi40&)?E_^gaE9exQHSkMuA4DZtP4@3?w@f#z5G5B*o={1)VsW9xPt*YOn&EBt7EVj2mDAeU&uQcA@3eIeaN0QsI_;f< zoMfj1tRy-*dv^4%t-ZDfO6q}5Ro*r`!^6Q<_EJ)OU24p8Ni|NVL&Vr%M~TuTKK3)Z zCM?;lTHDaQ%HDb;jIy-$)#laqKy43Hwg7t+Cp8 zYkQ#jdZ2dyufD#l^;Fvf`&tjw?*IGR8mo=Bwg;-O2Wt2K>g&r|PqjU;uk}Ff{=cuS zvD$cRd!YJypmzVSzP_yWRNDjlS`XCj|NGh+tBtp|2db|JYWM%@>&seCwLP$}^+4_Z zzpt&a+IVYwp!#~Co72s2yMpfGbeH}{h$I95nh0ZLPGz2q-=*0&wX^9|DE_IML3&ilRAe0Dm zfyDd;3a;D!6@+4<2C%MaXhE3MM90V~mhqRugk>dwx4~lmx*7p|yO3j3uC2Vlh};)J z9jfi7IO~a$6>X`gCMnDcnAlj@R|+eFMx+>rQ1NUn;UDV@f|ODRQD_!ui~-yA4UEB( zwaBJU7_ruI3v`wBj2Y%^v433ykt-;`(lm_ENfE9J*tc#sLDq4nBtuz%1%HE?6fohx zt(t*4KtYh&o(#bx2vg1ke<{peKj@(!0xhXHk(Z)t`+-AHe<}G!3T;x^X8Qn;0&>_; zZ3BMV4sK2gZ{QuTXa-78oC5-zP+q6yluppVhBH#8S$X?!=#$N>j$}RLWFsS~{*)s~ zsvNnhwJ8BlM(1+tlac9Q&W>bdhctMHK;Mjcpyzd=?4fX)3Oi(YbY5p(1F9VIxg6U+ z>lI{DK@vUf6{IuoP@whj11s1g4S|L?D#-LP6VT8`1?eGgnuHv*7x5DO=}|%3C!?JH zyFrytC0(v5?2;YM(e)%JYb#xzXh+~bxnMhTeA*Gjl^W<3N4+~v(Efb*CB(I(u8x04 zL!Hhn(D{nPzBAHn*STQ3;>iW*3i$u%66)ZCCnxJPDph(_j`**DD4G8Yk|`PSAdV#X z;r7%k(46~?2#p5ZsWp5iwI1$BS;fj*UPNauc1_G*8)L9b@`RbinX#W5>RGS`=a zIF+Z(0oS2n`$1LM{yo$Kj_sU$Wp{T_esjQY3(7sHc;^D+4?LL*6zJWM3brxPxpe z=*-^Go=n~^;9vDG+LOusq_#iUbuQrTg!^0n`N8&{Oeq}#{SD0Vr_w~5wITXZ|0OGy z%5mTy>p^kC+(o+BgDRgeI}!gSV=g28cdue-kD~;~_54Vky7lTeXqeQfag(Oanzv}# zs`Y+t_HTPYy93)Fl-!|Xr_Kj=Iizd1?mc?;>fNXBq5b*~IPCBv1|E6T(SwdT_PCUc zGpA)vpD{CQR`%?iIdgOK=FMNQaM9u=OP4J_ZOYWs&qyyh|E&D8SDaID?#lC4oqxfF zg{#+Gbnzu?FI{(8(dFx}xbmtE8?U}*)3w)Kzxjq6i*Nef&9~fo+wFJUdDoWTZ@v4T zd+)pdfj?|}@S%qvdGxWzw?FaZQ#+o1=Go_-f8mcWzVz}dufF#BpLV|S=3Beoe&^5c zzW0~EzW>38fBWd~AAj=cXP${`jw-e*X6_zy9aHzfn!MfAEmw zQ-=;4o;G6SsL>~k89VO8@h43<`IJ*9PMW-TwEx&(pboZ<#Oyb31u}R^{P&xeSZ}re z{q489HkDW^+2%J7c^8(H554*0vy-?#lL?+MA6vn%*cpDpvNX0Zmle7KAxDc2|3#}f z6{~6!{sp$pOZ;PlrqsH`zrewsWzGTK(F?l~^}^8Tk9Fu`$ob%Rg0BPL4t^*2PVh&- zKLsCfvO{gUW6T2Y3BD9O4LoU*L;2wCz}JCig5L*z>tvJzPd*LhdJx@|8oW)rhM<>RIE^0Ps~8 zq5r`rT;kCC;GeEVyaTX(U5b40WbicbiQrSf-v=)Me{mh!3qIj8tS9iUMJRU|(FX8| z;9J3Sz&Blv?E?J1^$vXrzWEBQufvH_uEhET-+UF?%jpfMAAH9~_&EacT@63rJFanP z1NbiRJHg)v-wyr*_)hS5uR}X=aklk(v;%xQ_&V@c!MB3{1ilkIXR|{|M@^RRM@7xZ*DOi6`px?pYebS+H@Xb%7e()c_?*mVM262Ed1^)^BOYqKviJp5F zae%jc4*d_l`FZpw_`(+u2l%EJ;dco7;U)Ad_=cCU{e$m#1^od2F8KT4Ij^Dp$K!P7 zb@&4>1kVTmXeaEzzkCyMrlSAe#&!ta?p?GS{M)}cL_^U(A2^f>Uhpy2KlnEAN5D6K z;?NJ^S)XFu8HRBMd?I+#XRrew_&K%@@X=pj{SU`>4&E6&`AgV=uL8dqd^`9y@b|%A z1mE-(>P7+ zd@K03|AOC<*#2;2Y6-snXN)`Gzk**3{>Z zzYpHEu1jskV7qJRQYQEY@SDK%l3aQO{HMk){Q&-AOP5l|V*3K02;R4qOF7`5f^P-S zYU|Rk;NP})Y4kYsLkIW&SbHD%cH8mp|N7=nztKBxohK;DomuB8ij3HTnjkDFGJ>Kb zrlz9^%Pc5jD=Rv($=pTndl^MhQJ=j65V{t%4KaCRoXYtbwPI4{!{uJ~U)i!GnikAKduakQFOZUylk| zMR4lTA*%uIvnz4{CLR~EhM!LU^C7DOu09dF;7|d(&p`iaqzkS+BV;wf_On9P5okRp zWaXbpIlx(P{CU(bI8ma0C+NS=r##@|FOnX3{DP3R3npI}vJS!4i$YfVS>QDF1!iAD zxxtB-AqOs(ssCrwUaue>aO_vG0~RV=2P3~qxt>FNy((lCz|^mi4{!;rgYhcu1SY|K za316_!qzI71e34EE;tX)fM;L>tiA?4a1T5Hv#$+Vkzb%5z)|o7%z`tsA!`~u0~=uV zb?AY|;2~J6QNHI={x{-Z;MhFZ!PHyu8*t#QTz?+*4CcX6a2ia5v)~lC0`7x*VD4@B zK}p6j(g(M|88Eeg9GC$&z%x)*Ux~L<|6mrZf*o)PoOlO*3GRb?;B=kx{UYrEroffo z4p}vD@OMI13$)%DvQEGfIPwDg0Gt5p4blah;D+$vE;#Tm>`hS*U>cmhk$i&Ni=+>p zyodS$SKmuJypVi=<6w4)dIG1wCD6JVIdBL(1*^Y@y*%e3!D={MjpxB||7EMy&ngC8fqFD6~E46cE5;Px8*3v7Ra_IwHL^oP_d zSOmwwd9VOZf0A;6`4;5>*FYYXY*qdQe*q((;yO43Zh%#A7d!#uFQr}nl(+<*fEBRx zXT&dX6>Nir4f^-Xh&Ny!9QZW-92^JB;2byyu7Hc+2Dl2g!AbTQ zaOJc3G1&PW?E#)`;qTzo7pT`V<@+-E0XM&bU2q3n1;=-h1M6+-;T6O$a2ia0oBjok zgDYSQ+yjrkL%Oddeu9Hw;k%R@>j_H3V!m}loveQ$IrpqEz}>_ z0gu4RTZz};3Ye(SAOD8-0Jp&@@bG}~28{eIa^N_a`c>-h@9DST)IZQ(VCo;a4laY4 zS6No}i1L7&;4--KPoxJHzK{N|(N5qrIC0E%uniu{=M%11`3#o9kq-3_p8NoRcr|h5 zlyZZ|U=2J28({1|s4s8_JOF3^lk&fY{QW=10dNzX10!dY2TX#8;0SmI=D~s2l0G;L z#{Qdn1&6?SaPo)LD>w@tgA?pR^Qdl~938gOU%!kaJ%js6Ux?K4I2s_#v1DD_{|v2dBYha2DJE>)KQD8yI>t0cmVYX z)*l$QQg0=HDe4Uz1Lwgi*aGLkZLkjRgS%ktZKV6)ur&eJA42_sxu3=_!1bRATLTN& z%aC7i5v+i_U=y5rC~{yKJOq;u3tP$GBAtihKVV}lY&F0ma0gudS^Vbh)XyVnFEEx3 zTU9Xg=&-d3T92Xr!3{9=4*V3H1dnsr0S_NXzQK*3qaN${Q69en*T6Y2|9ILFoCbHm z74Q^nf$`s_KRl6gf~!x$|G*7!13Y*#?FkM(h4%a%;yE}5PJ;z-3!DYpU>!UJm%$FW z4rU6JA6xhq}=aN>ou>y5M* zSORBWM7#oz!Ci2An)YABufZ%>_+{b&n0hhw2X4=Vts}4l#@n>8_sit#J@oTeP(NTBoCZs;#GkpMa~c!jHk$uTc+R zqDuajXm>CL&VxB{?$z{ba1m^PtKbTF_!`;?EWZ{%yh-M<Efp!7M zYxwic)CV{LF1?ZV2N!>X@_?grl;`)z@0*Ad;K`eb+hF=FVQUX8fu~>t9Bfiw;21dc zHsTLB2G+pECjJW6mXZ5?@(bp`EpP&?eSr1@kHK|t zeguC5D<7rZ!4|j+w!uU25IhAtVEp}D{}^!(oclQW0=K{hm|Ua&z&f}CE`bN&8rT7g zpCI4MGLIvDunbOuhhPoNf0F(p*THqL3hsbA;2AjHqWwOAJ+K5OKg~D-Zfs&7-1|KK z@IfXR5o>VWa0y|*p zju9*W2VB2P#A<*igAr>79Jwp!ykO>ToHuQdrNG5e@(0e|AN!x6eBdOw36{a)10vQcIP$=VbqtP!)*litQxPi*)*l>U&W_yA zM65Qr^l;8)KZ*Z80)22gOFH22qtI*79$*e!do3f-B&$ z;Je80pAt83q`ZQQln>ko55d8AQ~#j#o`^N}XMDaXVl9AEH{(CxMl)h1HmH~PN31Du z>H`sL4cz%4_QB4Fu>Wc5bLc1$V(Z*a4TpxgGoh zOnjC0|19+ej)J+bQJ-KHtb#3Y5sZADegUSzeQ*x6K8HPU6r9*a58MXlz{EGmA6Ni) z!3FR{u7kfgBz#(#i+eUbhJR>9N%h*$?;>_72Oa2rg0iTq!Q zTC?C#C~B>Pd*P^c3a&+>R%V;_PeiRXaO_S|>kynCidw0^px(h8IDe0*RRss`8MU^- zZEznvx*=)}ewq9xqt+-m_~TJ)5}dzR)LH}&?~Oh1WF%@Oze4}MPt;0-+51JUGPp1r zwdTN;2S!=5f~lx=23CHGeC^<$;5c~tpr};>OAn4(6>u#bwdTS6L(l`;nWz={D)sYF z^uUFOMXecdq8POfz|J#C_iOmsMAVuFThAhY;OKKG2e=HLfX9=RgL^-qy}`_Xp%0FOr{DrOypP;}Q$BDXTmmP47`1l6J*&^+r+TdTl|E|}+ybY- z@vD7S3*3$OS+QHG*B|R+Zv%O79&FvI&+34icj>dTe?xl@_E|M>^{#!^hJ3zzpA|o# zJ%{?N4447O!3tOf55QIM@Sc6vDVX^2K5OiIl=EKL0r!5Q&)Nj7;XdmaJO)Spmi+uA z`4GH!pH&AV|Fh3p23Ns#aB8H_+Lh1u>9dCaj{3hJzJv zlTUE?A>pS1w4yrIt; zIKrRaNIKxjJINooe8;t)O`d|`F zd>p?4(_kJff|FncEQ1Yj4s3yoU>jToJK!dmSfl;HG4*FmcO#BJ$52nF9SOh1*3Rngk;2hWj7r{2T3Ue*8i{L(30Z+gN82P{G zgM(lj90faI7EEl={$LuM28-YHfet_4IY6-@C>Yg1OJIWI1IMH4A=(8!46mg6Q8C1 z!8AAz7QrR30{LC49QRwI-h*ebw5M&yTrk?SbXTQa&*CxT}0g2p&v;sr*%I1S~)Psx>B`pK#SG$mb_s zwWj3rldf7-@CaN0hn{lPIsjLHo_e~H9#{d(VB%?4trc({+y>)C$^}|ar@ms` zdjyuisR`->+;}$S2e-j9uni8}4!h60YURKcunZo63t*!}dxB#x{Y7KE?*6&!v-$Wv25t_qWu$a6 z(A!*3$aP*~XPiIbL|+?--rRRnOc?deuPibv$mFCtFDZ-YsPZGb{y<;dmXv8_ zxIZ)=zo9gKJ+{7e>n*wKq)wN`c8a)gdr;b<8JfJH&icc#+sAJ}Mj3H$Vi#+S5t!&; zFa3xs)+XPOcQ=_sII&?&j-n8t4xv zL-8B9=A~~Nk$Nnn+kPZ{p7+W|Y2u=ygzD7Bgl9ppjVPg}Ml z^@rM~C1ptR6v0nMA4Pp!Xh*wbe|YwaY0A!&)NKJ<%|{a>c;B;b=ep}w`o=tZgOBmP zH7MK?TpTVgws?*4#}SAXf$In%zEJAf1fe`xG#fx{a-?9bqc88}B^aSkw|v|P99#bE ze{=t&2uV5vIj4&i;x`QBq(yGMg-cnvjO^-}lM?Ne(OeO-UTojCfMlk&0cY0V&)(e1x`r4YYI zO8Ir{=Kh(TIO2)u<*y&8UN3KW%ik*3#<(`D`=9uG!QcHPbl!Z&n-cw@3DZTLek`^m zKA%cD`Cjd7r!~mba)|4T{F)OZG;z-hs?M3Fa=$6#B%spC2Ai=zREpn_EjVWF42r)+7&f=iOX~I)pHgF8e<-Vc z$|;Zd0MkdS_2i%rFr~6q;Tn=QFOi#s8+{6Ph2SOqmnnmlfjiS_tp#If+>W4mDwHd3 z4XD(`C)UvK6ny&iE9W{vIDr+eyH@xzlNgdRpJHd_smw8Wuj2IfSV{mR+ z&*^W(zpi>xafFS^48Uj>zxkoHS64?jV<$@|-q?hJYp&u1QgNxFq| z(p^P==@)N%x`*gRUht!pSNhX1bCBUFZyqLG#^DIN>LnZlfHmlold-?#aNLS(*HzCs zx;MAZF!cAD@Z0O6z)JMUKrgTLys>l2 zKX!WWMbOr5qdSG}p%9X0Ij}}>VmVQ|?2Urjw+Cp*__S~RQa9FytY4s11k`K80?Fjj zn?r9|r|HEs9ow0bx+P`4%V_B@yJA9wo0M2k^WPc z$(jFgeefmhw@82IRphS>mz`lRDZ&TUHfE9D?abgeX&+yK{!(Y7i&Q?cjos-oY3aJU zq@Pu(uwMO4@|d_IzV}M@;dCCowsgj)yjL6FR{092!v+;%mZfV98R;W4*j;&*?B_aV zcYPX1(9=OKiR>b>O=QPKc7nR~^(}9Rv+ZsnyQyWRPJObBKkkf4`qc@t2gu@9cKw&! zHG=k2Hdk&a=`mipC8Cn2(f>i;sQUJ8-2C^Wq6?6_E`{s_vJ=Se^Io-caI6lky7^KQ zM-_t>(6L_ajnm@0O}GeLLhSI$^4D^>Ga;nBweB^5<3!9?xaf5Yi3Q%Y8xGa0=NSWSMrTm*k}iw*{yAg2Rj5I{YsDsBn@u*T?XB?P6S#Hr#Mzi(1y_ z_x(g$*YTZ6bQZZ2bWX6p5!7+x9zENetmdu@1r{{uNWRi{Cf2;(*ET`lq2qfdB%f2r zr{Cb)Ukk|hhuBf_6v(U8*&;fdHO@$QFRwBFR^hBSvY)N{uB`FAHHtfLlQo2YfhQ44 z^pDZ6{5t11+Aq)1ui%!ZzT|22F7z8FZ#qxHW#KY!^7gHyeu{AN-T4XLyZ+_uQOSzY z35${~6<6kvuOeU3@@|_;DDoOT%k?#6H<8`fvPK{5UhnybU3*`wgN=zdJN+0tQa3Rc z2X(lGi|aPj>8={(6M6Laf73Vr3bb*kKEdui0K9NRe6`jgkZ`<5N z(mF)%7`<^_w&oSJdExAKFR)6uV$Wz)lc@R_yen~+${5u;J?E35Gjlpga>{=v&_6++ zq}5Ae+6-I=uC8rfut#watY>@U1{=~=E$ocFotUQW?DpD23hl*j;DQ_b?Xro_cF-Sq zhqu=}4i~!{<%RR@?O(h{H$W#j>9t2^=Wzmi13bqerrWo7Uy}f9b~QETFQUKqJIt-L z{=p@Ch8;RRGH!9zgL~{UOZkqlx6Q@_U+uH|YXY96?Yjo1=?%l@v4J!==1Gkh44jmEBG zs<<>XM1GpiKFWA-UggDXdru>eYzNsRl67OAZwtLYwCo1Hwwg2A>!TWa%fHWA@VR<( zU3xN3uA`TJpELKCang<-s!NyLU}NX)5LtO9$5eM3&UioTOG9nNtM(YW2k{0yHwKi? zo2wu7n5)}su@W{W-|y?I!8oEOLZQPz6j7@{>8DHRrkA~WgT%5mxKTK_zH0XR%!y@7 z%=ettne7y!bBN9+I&S$3zVKJ21Nws>@>0KpoQs~IGsb(Xc>X*@@|i={`hd3wCuvT= z#o;!1ul&J?@62WbW4?@=3+Ob^nF;FHMVodNRKX;V8_4hKbOUoGW-;Edsn+2~$ZjE< z)-khgj{$n(6OIu-;OtIi*PW!1yn(v=ps(({v6)$+mx$EEII^e6;%@3CTnWzlkT(uw z_*j99!0qaO?v3Gk{uy2*T)4|8XAvTH*U(-3uwyS!W_xb7%k?_fOUU}_UDaWT)wNUU z%Eu%xR+91|zbWr^KeG3xnW@;)QXBmQYVQ+eMSLuY%11bh)aN?23u8@xc!okD;{`7F zIM-hPU{9WX1E`neubCvSz|HA)ll~JpN9zx5`MZzZbZQS}AKkH!`_3$UF`_@{PyTSG z;^^Ry6W`I@BoA)A=s8?ax4)vRMxEGC`99fkeF|Iq*c$WdsrSTnRn<>dV9%0;6>PNs z(6^^!^d~P%YCS1;5qSLzeeuO(Y*aq!?Quz;v+l*71l;fy-s|?)klfuE%Z)*1idr#QtQ50;iczW zcjT^PJPo9m9wxq{=hmmEN0iW_-T9nBZwb9+UB0e*A>;(y#6F8&Mlbd$#=!`R;-kIy zww$x*Dmzie&XyAsq-{^IwY}ks=fQpy=r*bZzFw3-KlPLJBlP#A44lu0cCJ@#kcVIW zG-p5|c*&z#w(y`oqN^N946UJe_8I1pdcL-M$-OaEEXe zxJlm2E6d+0+y>mb5WVsnVqy?z3;K!ga~`#^ds81@^zCI{9RI_aNYC)E#*%q#O?{dA z(`|gQt^RP6WL#_jYP#U#7`HobI9|{j)+x$UHjF^C4RL`;~>*(Y?hcdLPg~E@GG4k&%d2HiwqX7gQ!Wgl%s@R;xCEmTCaP} ztF|g-4(wkDvQeqVmL~cq=m*x3z0dX4T_^z?_BNoZk0b1?{Wa^qJ~Ac#ewlwQ_MPir z(x)=_p{@Vc+Y6F9ABU^M4TYUF>X*!iwh0Ny^r~~RYb{}K^6#B}q$%?3o4>HD09|iSoFTURULU8gghzUI73^gBD_|?} zkL*wBIuQR4wwH5cb4K9<&aYykA&tycID=hRQu^QT*=!TP-?~JAVk) zi+@S&s~UCGtLA~p`%$<5!alFgOYivX++-M*T@fQX+nd@_H#69hXZB?-=?nd#ldjGn zTe#w5YuGqCVP2~9bD57#obO{&*Rpvx@xK|*w7uT(O1Hf%O9G9i?#IN8@_%d{{vYNq zI)-1Cw-zz{9RHWREnzS6pPbQYU)sH}KZPeShltsotSq*Uq@4f7T1A)hytRB-CgI&@ zY!cf?@6SBM;u%dkKixL;kwkdkwBp1f8G|d>ISlcPH0=jnv9v$LoXa0f`Cf6_5l7OA!}2Y?Lt5353lzO0`~n8MQqJp z<=JTGmQSL+Kj-#5Zvnjmf&NtIJJ?s9bL%xDh~=&`2sLi(Ve1TA`R+V8XPC>rEJ)}H z)UUffmgnrA-HzvYX*s zWZHPnJV(amP3%>#$C%Ea=SxmGw~TVyYob&1vUk8obUu7zi(03GvtV`uKp^gDkU-Lrbx zgVzb)dW-mS8~N&8c!rvmzi|8r%WXd0!v}U`TuuHIYfx@LNN8I@pLE6#V+W7nL)vB% z-RfO=Mk4QxIkuiNEqHmi?*W!L(?G9-UQMTYL7YiR=6#D^eNZrhoqg<#-koRu>GV%} zp2I3%jXj7l7ugw+ zr^qDkaj`9tOFo!6EON8Fx9h-7^LP84RFhoFBiBN%#Cs)Ym(RVwFbO?_%n35*)q$i} zM<#vGp6R(|96)Xzxq0No&*UY#J8&zP=t{eGkUK-JE{f8wLBFt1=eeZHPXeVIdgjM1 zzsSk+yj#d!)HW*qNrscY_;=a5<_Xq@#c1FmPvlm zJwrG76FdV_uL&-U6aC>Mmfqcg!XEST523H$hv#ZySJkN(A00Od?fCk-+MAO3X$`&f zeR*!A*6We~l^*#Qaq)vq^xNpih2SN9u?@EaC)ZV8e0@>44%auh9+T_5#3y1u&71)) zC4~5dtHVk|Z|QJpl)p5xEo7@&*4IzviwC};L&eZ3W)O-9dKj8f3+9PLVAjtKyxMx9-L^+3Mz#9oy8+AMPi+&eK0byP+GC zJn_o%mxrssZ3!Xvy!Lm-;hL}c#R>C)&w11qu+hOrz?a?o8=RYF0NbCfxz7-y6GHTQ z#AC_J6mncaW#yi`u-FY)L=QyW5Zzg#wi_RoEM>@Yf^T1rwNRZHD&7vDi z`Nj;>XZ$mMCvHi5w$MwVSI}t&@`?9)xm5LdhG zd*T=J63oNx`?wU`B-|ccNyp|uKEqieyDz79Y^kFYc@WQ$7Q^CGj*dN$hBjOkJYVW? z6Ztjd-SOG0Lp{gBZ}j}oo?}TJo}$-5&&`|XXJMIBd7ef#kRN$CKA-0K(Rwc1y|3Y} z{gUVh7s+x^pqJw$m-mpJ zM^^RMS<-Q3McKA@hRilH(wBqweCFhm$d6Ii$Z~6eE!#aOb#6I4G$y2uhQpQdq z6LQaZq)z7GhTtZ(?H+ZaX6XTEwEblh-LZ%ATxRU}{6(F2PPxvah6t7Z3GxNxlOoSc z@)UUlz6v*}7@He}E5Rjv+^EAPeOwl9#?URomElyqA}g_M8mI=}24g^Cx6udJb4 ze}pfV_0(O)2ZOp2E95s!(m(4PUrX*>(HW!n=(zgMU)yiRKZYNP&py(NcUia$+yGqD zZO`-WO%EN*H-3FfG*una2D8|h$>NLJMsRPz-J4_>@a-A&-3!(hjZBuyrd2%;hJz&A#~p|)~1;9Pfk>PmpWWTcOTs~t;?5gq+`0z zXqaP>V#HU;_bz(HCw0vY?R%)0&$+8BQWAL?I4j7PbvnLss&5qPFVs8oDdbzokN1*i zrscOUbx=Zn7x`r^-@_L|=F}5ese>hSGfyVYXkBk^r{cA78-+-z{?SHn5j`~yI@}T5 zDxAb!c}bg{!L{KepYjrJ;IWKraKnnRxna22Q-X7WjKdB3=_-@4c>_~MTzPnWT4SHz`$HjwQgJFES?;Kn|CJX14SH}t7gL{EOZD)Us@ zQ0qyX*na8g$^AO+WJ~E4&>MXmG45%^OWi-unKSf`yJkh;j5t9GaT zkx4$s>)W`Em4O?Ct3~*r#vSG`!E;VGROL9A3RH)479@6R*eN`Zd7-v*!Mei2POo)^ z_{}zU#$V98-+L=U`}YvO}>Qnr>+~@KXe;)3M#r!3OW^XQDe!gqeqBmG>kq1`cL3*9MnUB3;a=X+=d=}B50O~1-z3wqzGwXG4^Lvoon1N4mB^Bx1@w}d9m`MUq8CnF%^a~1svJ=^Y6@w;F5);7{dKM%hz1TU%k1-Qao*V@tz?4}t9$XIV`LYQ-4I#rx9<7cjcVU9wBU1Hd7u%ZWBiRgjdjACd_LH_Z_D@kUC(#A zwkq#5`YrTzTMEv?t-(n>$xFDp!KL7q9d25LB;U3V>p9D;>&4D^Dt@?!&LOt5qBHHU z7xw$0PPra=^ZC~Yi})kgMK4?PUg#+)n|rIGFKsBlWn6fR zZ=PX4GtS%}s=**$>qwWh!S=!iWzcqNCBfq1(2RF=hc}YAtgFAw2 z3UN+6P~SxN^=Qeg)J^7@#N)Ry)@xmVPf zjcJWKve)8E6Ubgm86+Q4=kv&C$wx*A@dcmnQ4*i$+5Kl7c`3`PmTv~X&nsJyQ1-OP zi7;aO1icOP*0f%axg?>fYc46eqt79(z00@G?-37=d&EPj`)PC&H+udr+$`LHk4wR+ z-&2P>;JvDcwZO9~n1Dj~{6%!Ou(OU%N9$|`bQp;td^(c$DLU0f≤n#p#r@a7}He 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 z zpD5j;|Es6mdRcoO-L|rqwbgd4Ze``7;KqU3mbM%zk2zaHo&JQ{l}ViM_M!)JzgxTV zcag*W@p&lii?>JS;Tda+C*}F6smL-L8PhUpi}2ey)xoCJ559VG?gB??Zv4?fwKf-S)y%{Hr>H&Zjb~9wlEsva1{U zZ5#i7WXj|@TUKuU&D2!)eg2hp`_7dPp6gCE;@6{PV{hr9jW0ghvN2rRvTk$0kY~l`Z{hW0=GyS*=vrHsfxiylX=K`S)bk#C=GWK{ z%RIp!v*#RgQz&0S&Q>0J4Vo7}%`zthHivJNzftt^cKRsoY-2p#>J6;H+`M{0H$I?gF7g`UUL#}ZunPJDi zrbb(}r|I+)^u4pGaW`#A;QKQ8b~7@boo58O)&mdOdUQ7X`$_&VXX)4)?cRf&{C&nR zikpP+41S+Mwv=*3XW}PaGHcSC&opQ3t(cvQe!;Uf30(kX#Pg3Ck$(?$i%iZQFg1aE zl@&8`-K0JJN$+5u)wcU?Ufd`SzpX7X9 zXs(&xp`3y?;khDz$UIVzhc#qluUfmP(1yIv+An!RoC`>rLSi5|uNzZU@)ElJEaX0P z$E!*6^xVi!IrFr^%Vf^xA5^OBX|;`7YI8<@JHAdQ)Cy0>-Uzr_mr=qxUULO|FZepX zYCR>`?77{JOgG>2e`2XxDzYN$`%>PUS?{OAf7^&RXMc9nN;h-LttiNq=stV##VY>$ z*yC>@?P|&_=Uwz5c1;N^qg>zI#7rh$X$@;Z1LG#XRvzH})mXVhjRR z(N!;DZzAb(q>ZtD$v%h)UM4mu!au3A!v>z>Wx0S!S;RjL7|NTgR4rvKww+&{D{ED} zOe}zIvvIO9AeBqRNiFb^zhx>XR(9PaRRPftY<=tdcTG4V&%#BeW*NeDC1`?Phb@bsg+c)|F$6kK7i~sD$k~4Qtc);->Yhn9k4>)}LlQUP4-hEwiX5UK< zD;uikG~JF)(7i|*zl}T%Io4HM#`~*F95W7h-M&P9PC9ZflNdn6mfK&S zQIGyZ-sSgh@X^j#C*Yf0WRRoZ+MSY=x2I{gnpm=wweoCYqT}eF)*a$}rF1rVM2}qz z4fx2{Yfbj7g%0s+N!W1W-hxvHIL!g49?`j-#dfvY(bW5jjD@YT1l~}ApDnQml(Hr5 zYQ{y%pPOF-ynQsy^T-vj=YIn*l(9K!qy6i0yX(#cag2{8+o0i>KgWQrBJV$J} zzD+e1DR!mr95R*r6FE&uxj9YJw!`r97gQTD^OUkA@;*t-(qc8STU)fZsg8YN!gaNW zijh(4ugGcIMS7P8pT>Wr>>1;{h58Q^LPNs$p~;}wC19KR5ABhQQZ&CEy^x3fw?6M> zexQ#j+4N=Nzu+&oKsi1`b%b-Mvjmwg#GbZLU5z_`iT6zm80x9R=e(Q+NS)AfSl;V6 z*E;RF??h;<(x!nw&x;-XF7VeU@>$xS`lo&N{*_<#{`5ppd%b@#-@kU~rzd9IRowK+ zz4xDZtnfhpnEQ73Uw`Ts{r6@3TmO1&{r*<^ul-+7JKFy`M&z2zxL1K`{Psp z+W*A$r~0=HE!(kUX6^PTdEPLz)c+FCvqQ`L$=}zS9vE8g-*cVTH1`jUCyvj5y#M9L zw5GoB^Zlh4F7{Vdmo|mf1pk?qx|J_ocW9#zxz;!24fxb?f!QA{+p(Vg^`7cIO=pKn z{ZHQ9a3a~+(f{Bpo&AZHM1RB3hLg9?{Coeg>J?4xl+li_x+nRaif`(a4_2H^v7|co zzrtDO(25;Nzp!MU$FA`__Ka0CpV*juafSaF_Kf?mWjuS(k~ydP2Fgfs?5&>LWJ5MR z#vD63bo-7h>>JU=J8Tz={K_9UpEyR^_R9)VTQ>Z<->oM5pRAvdnq_~b-+g43|IO=DK@F1 zi#v0gtjhN z6T5%@!Qztx{9pLs+LM_z&o}*E@Aqd;Uby?WO-I$VoCAFS!`;s}9i8w%#!+Odhxq;{ z#^{ABu57vrJrMrgy7SQqeJQf|t<;4+NV59=k^fuPvo#7zO8}JZGeumq2VleT`PS|fsPBH z<2S0anxt*#p<`*^T4?z-`o9nQ-39$#cX9E_#TTzVSz3Lp>E4TLPD)#}>LX42?mE^~ zaMuy|ezN1*yDY37rQNB_r@73Td+u87@VBRCNqy5^EEq^|(COG!o z@xzr%=RLI%8wm%zBXu2gOj<`W@|8AsY^j|#H4OPq`rDH;#kc)FMbm}wD1Yhfz4_DU}rh@VPZd~0bjs3*3A=kXweVtvTpVVp~(_xw-x&H zK!*-!xDNVz5jqS*yFs_sBxM%cUfi)7ej{`zdphCmcIJrWmwb}Gm9(d!YdbVu3@uke z!&++B4jHpBbg9MGlch^`r<7N>Hf^bBg--3^O3IXVUG`4G%Z0c3;N?DexY!U?-pO7` z*QMFRTi}hdzSU$A^RGp9-^{o33#) zXOvB~*JRA_x)ZVr+@iOLd{OT3jB4+hUc2ZQ)(m3QOgZ!@dW`Gv$NXpPS7t&7iK+WH zE~{y8Y9IRQNwFuI#kaH8t2{}3Z?E2~e?M!T>A7ue?KpU5&MzvGGNr7?=PPC1Bg$A` zZ7w6{Bg=SfW>Th~avocfap?P3DrM`DZ_ZeA@B^xDTz2EZjSZ9|Wi{Y?y`BF(YQs%u zEw$rz%uIwH6LOy3oN?&+xk}lK)Ge}633*DYcOz@us<(d~-@;apXDQ!(%meuzru=nk z?Kt<59MPdwebb$g>E3@?fV(AS&W_Pl^~kawXww00HV9vZw$4FIr=ii^(AZLFw4G-% zw8cKFDhR#iKz9ky>r9?2ptmj1Z8vmy2D*Kj=bOkFw?l*5u#ru%ToJH=ThR&49j)wt z9-9c|rZo}=5r39SiSyT^bvgXFYV+rh@%GDEMb<2PlcII*a4HGmHfU7zRFe04V9T+U znY+N=G+IRD2X=~BkaMZ;f4Wa18}x}xd{fmSmql}kT(RXHeU9`! zez{UMS54CUbIQ~ona6YKPd~hNWIy`o$63Bf`+GU>eFNK_cpvt}#^ueA7?&i*#XKg< zKVnR7V?4x9YD$b3^iA8Hl2vVQ%7^!(%k;d4{zg?Cenm<2XKP1xC@Gyg^1=Tp+T~P| z!aY|!n31I@cJ>Tx1H9Wg^9_6F)HW)2?Q2rH=J~UTrJ!BwJ=Dcn%`)Vx=2=SBL!66A z*(LA}SxXu7{R-!X*Q4|K3;0{eS|jg2KRMt1%#zGQV=|*_PH)Ycr$Xp}bN;Z& z+?8>Y?-AbPu)};0S<_0!qX*4Y&Tp5v+%@Rg%OBs-Si`zo@kCRjd#GTCYjhoL8Xs;Y zmb38Ar+JEg$*H1G;r*Aq?|PIN*H#PmWmC~nk0pNnRCM2CgBPu1f}KkKA366p5ZWnv z+jL(xazbc_x8rZbA^SV=iauancB*O7?+>D1S10kle@OO>Bg@X0_4YS)H|5g@*_-Fn?rhTA=y#3P7VacASq1XO z``mkIqc4J64O_r?8QQ_Ro1~3azV}|O+a)@r9w~1Z^N(`2*I2M!Wp7`BUR}y~i?WD6 z89u|lUii;9o~>`Z`bbk_E41GGIq%@xta0yiPWKk^A6>{!+;1u?QwN?AotKC8zu96B z7xL{ivd9*6ovWb=;WWC^7tv)(8i^ldM{gu)WNq66UUVF&+HUl7gP-7C>;zA} zt_EJmE;2qok*j5$z`m6j9x^_)*bRqn1)q<~7=d5eV=qLPM%#8#FZQs3U93el*o9}I ze?m7k*fVx<`)iqKDww)Zwq@JJr*6~=;HjNh4d1GUFiO9WDXbc{DkkwnR73?P&q?MV^1q}q2Kh2 zEx`mmJ?kX%OxD%7?eY<1xwlt*jy3qRti?C7CYP}`uR0@!fv zcIxUo%Q(A``Fhbs%RQOUclKWKLz;CvGs#cAl8-~k2jy{=gM!sM9f?l zIWH{YTbEra6+O0%yjLUNRZN$>HlLjDOL@cg!$U#+4x@gSi(P~42VLBem44Quj~6^v zAg8^?96D`5H@i7H2ayTUS4|Bf%XPOR6VzJs|0sESuqVT&SszE_DZLyo=fA^agKZhH zJO_j>WnRh{%Gf>x&F-EN(+{S3J3RbDYd$#(v2nlG!+!{Qg);^{{;BL)W&SA48~H79 zphd4C@N9UZ&BnVHecwf&ZP~*nOFOmHEUKiSvySIbj-Efa>i4qX| z`*)F_{gIvD;%x8@>=UEDqUB6&ynZK) z*rE@ivp(QdCWJ+I?L_WUIGg;jB^t9`WLx0@g~US>y-^+CrM_O~vheI|=uzx`2hp>> z`?+hOuO-kGcPKYsx04B37H+ zJ=D)Wfptyg%&b?flK5I}A4F2Ne6Rctx6O|J!TCqYJHT2d>E(AzaIw1=-PGQx-i}>o zxvzAWcSi*}D#u;!rgiM^d_!N~fvudw!G3h>CP${=>rFMuaSB}u`o7W!(Q};_9TVxW z2XUO+@5nr_COV#+iSB2NvQhZMT=Z!vcc*5iE>25L*_f6(ZF$-%>u1KTn)c~YS6V-9 zx$=fVViO&CGdCTMtN@?2R|iG zc{(%?J+=97OUc6jc|Peq@L=apRQ(Lr`31E~UBY><6Wmv;Ro*X?{s=ME_~zuipnzu~ z?alsVa zLVUWQO|kcQ|JTI&-*a`e|GRk7|83I$ zH{9U}&aZaqLb3k*vqd(?ii!&Ynz75$Gy{f^p*L@0X}%OhR#(%hZ#?+eM*_nxG|0y zfvvH!q!9S+RcejQ2Yd>vtDz)l#nr z6v;U$^y7R+sfxU>$XQ#X^Evd~w9Q>LFW}+54V%hB>}?!Ju$kE;wm{r}c60vE9y83D z|DGTJc%__e5a9bF|>uK;>3|@ zBMR|^9l;skc`4_G&8ikYjZA$8+A8KOGC@t~Zs07Up_*83*rne}9o|HB`Bvid`R*f5 zC+7oiitRbDHR|C#N06H&&PFG+UP5_3x7S5(z`vBPhEMz!x6Cw z>l2-W*!vWaPGV>Xjb0!w>qr_^?uw23a+kC0`)n=`#y>B zbYtvY_8Ge@or@l^dxu(?qix)Y>XEsGKbhAum7z6Or9HGn>FCAIW=3CR=j+U&o*eEe za4%J!kH*W9a(_QIfZj{5N9JuW^G?QDcnWhMqnGhmEi@0_x1TVVl-dO*l>nR95iPx=j!3d7?;zulXH^pV#Z^2Y&;}ZqMNahIEiN% zOXUr9MFX%b#zW3&L_aCxQG~sV9hp$}`BLW3V&n11(~+_Y#={;P56{z)d8FwR-J*Fs zcErZRD{EcrTm%0RA2;6^itH4gBV$(=ODlNMaRMGnSiAqbcz7~~-(lXzn)gw>uZ+6? z5$~(mbBXt@jkQhIb6H!3Ckjs&n>%}aJfREZ@xj)K%7M4pmx$ey#QOaWa9NAxF0|b7 z`75;gH|~ec<{odn@9dw_L(Ex?Ig2lxwD|9F@P_#B(h&*4XCYa8-P z1@emU;2?UE)5t5k;f2M>D<~P~)x_kLV&s(~JhyAl6gsrAHgzeJu*hL{S_Km&l=po8a$E)YGd+{+|P{4Lmy28k9^12clUQbzVA<)`W_U!@_&-K za0~vON6v-b+ddu-Rc1V}*ZF6`!!-OnkHkaU*FGK(vq#_|_=zQM;fd_oODfT6c*NF8 zY?rVvwa0iSGGo;;=1Ek?;c(1A$FT(+N3V5jW6fms|33bCvk_NCH-9{?-gr;v8^>h- z8bmKBxWXTlfze+wH51#`M8hah> zPnQRDJU}-eiH9rDi=ij{zfS(Zr}Ic$6fOC9T%?(40)6a16E1GSzw=03^j`JxxHvwj z?^DieKTZ$yzOFu{^WD@ye`QTkQ?Z)qFB!USN99nle|PPJCwyOS??;c^RB}yse@;ek zzptjG2_EgAq3c+$JGq{xZ>SiZbAqFRb8&2099yx2b+;vCR$h^q8JBm>vTisg>%Pz4 z^uHtT$~j+L-j%$vClr}?kp25exwqIF)dRiF+1>wy?E4!2oTV*NzUYN+;oX4$Ss#!8 zD)28lA~|y!zQ+VU($a3YUaw-70O)C+=dLdn)#_3 zeizNH&(L*PX-e)UWJovtk}@oud+TLj*XS$+L0iSMn)h>&^cW@^ZeX z=bZ-rhx6X2=aqVg^SZg?XwED4kW%kra1qZd^}N8IZe&`~v57A_&dc?C0hjD_t!)>k zi!Zd8zu@P%L&up>1N6B5!FyJgb8ZxkYdpqdyUW$|mUT2|eO8Z)-_bLJukLU_&)U#e z^|J$XQV!3i1Z>X}GHtTfs&+>SHr&4I#LV^8NuzGK@);!WAkwtF!3WMdre7oD(e;gjM z|JWPT#}=ze-RJPRat>HrAA4BEK8Qa0Da%Lu%=^%0WxP%=<(5(UKD2%Wy~sZFUg%Qj zxi(;CtfqXLsK8KZ(QV{)ute1+B+5`#bEZ(knw z9VY&`Qt;_6{a94#r^HG8X$%4gd5?KzPbq z@FVoCx}V<*W0mvo@qdwjX&<*=JD!7w)uF4kaci(Q;_} zFDtF*TlqxFR;PTbj=HpavKIKz52F{`xQ4mJU9up~Rm6^QWySu>QWLl%h)w3km$)D3 zo@>uc;QJZw+IVdB<5#N*z6$cV!H3l6POTp=_jBZ4j@YO4V#8Mnudu6jyWE|Tew==- zEk*3l)<0F?Zs-07XAf2Drz#yKtWnL`QGbPUw?pnB$$5s{*HC%3TsCU?O!wZV2k=EG zd_eruJhBy^LfJ}R`zFpF?|o!>_PviTU(0;Xy0>Ndt7<}6IkbOyqVkEUa_=LVa*lED zqX9lLyWq*D6>75o&Fj2}8d#&`Zh)L8NINw3G9534cTQTc4w<-aRLa8J*mJI*td{!P zFH4=p-g85>b9~?bX6{|UqP(t!|NYK@zB7Ofh}S4Hh$hTnR9Y2nO&LHF1T~7bN%Nfs zkX*Qk5tE##5y49m6kGX#?iQMWYy#g5~o4 z);lwbMBCGT-}8U|KF=$&-*@k|*Is+=wf0_n?X}SzKP{Q`OtJW0m_pKvIUjJ2{dLan zhK!T*s+>`6W(}HPGG$C&dwWQ{H6!F)Sa?REW=qG;60%40o$D#QckrSj;OwF79`wXd zDDzgy{E$6iVdM>qFC48J?uEvMtas&iokb;v(3a9j)gbhAI(HKf-QBPSdLP3NLVUGl z4phkZc>H=eZ&Mh;`*h=dh^v72F8qJcSA`kO0}A`+$4^M|6Ju)0mj3x8eEE;jZ@c^F zALfV8`=kBykMhH(Puu(FAM1yY{c^|NKrreEPMp zUw-G!>}LeZ^TjQ17;eoKL#Sk4+IZ-{C@AsKsG1^GU|9HC)L_zD~I{Vwe#_RAPw zKD|op2K1`RSNrma1=7qOiHza6k2v3tt-%fLEHl-jq+u%IH1raGpM$(}az0RelblcU z?c4Z%+>g(8cb{$Iqxq`}EuqAjA^s)jDrL-M`~7?VI7pqBIp62z;ogz$DP3RU_tgyy zkqx7nL;m3Nl2aOfaB1dI6)GQDTF|#k=e_u-`{F4K^N!X=RiqUP{wUZ2%)i|D z1WLI!@(Y~)`306f)0cl7`I#$DCH6;E&DV+RM!h-s$_7EJGW^rV&>T8ED;A>*E zd4%`h80%90J%bLz@vj==oe3S}>@9R~2_3!x{%Pis71ACx*4?$AHp#oI+cdI5=bO;r z>_OVZ-2(2yRh?4CbFKV*lf0+NOAMu{BV$z+G>EW&=%c}UXz&L1dBN>VeA%R*1eULl zMtP+V)DPTU+kri504{OQ`0zLe>{=&rn`?Z1@dSAX_MQH$FK;7x-FK*IdDy@0oFP5) z9nQVP;aiaa?{c;nIcDH;%|3w-m(nNS_S1YVvf^r*NBe0$!ix?%Zinw@9`r1n>-X`I zbaO=YLbpFHXNq0$sI)zvm|w!vh46GKJe{|Y_;Ac8D_2jc`X*;zpZvJbwsm#ksy&t= z6}5hz&R^ggU*-6_Sy~wjPL*(IKI7zF{A$=k)j3NVCpt^k5B!#M$90Tb8RunIz6Z|c zlHW1}Uu=Irl;bO>1J4e;4Yc<@Kfc8OG^AT0pfDwaQd|s9U=K%Yyj!{0n|3%x?-|G41CeF)cUi=`XOTl{``98iHwpQW?iVTxD zCb~CXczdjxs_>B%-u+ba@q1vt81gl`)ij|8b83Un`uE+3N%Y;v|772>E{OXUe$0&D zpZa}r25;}(C1ZA^!cK`lF+QFR&AH+W8s$xarfr?XipT%8)@<*rG3o6N>QzadgsDBh z-L8nO1CP{U6Sr?h1_Qe`Rh^L7EhR1Nkps7hvi0nF=Y0cz>b{yxnd5Bp*WJH8x#HXP zFSMr)U#%AAW{>(|KF3-r2H&)m{`5iSsWJF^E%&E$@TG{s*RP;I4in%>av4yeum9bdGnepq5S$I7#W-Y%8UX;`joREs|lHkJnd=WA9z{fYYn&`(zV?4&- zzY^W#?@gW&ei%y}ayt-Jk2QYSmJwftolD$C`+NT!?)DCJAhF#Uiw(Jc*j!#<;4OSt_n!~==BXZc z*LMQnxvy$qyEaDp=3k;?B_2aSzs5oDuZ-zu!;6<)Z|wIQ({}P*ckD;@8~Y_ei<1so zijhA{wlMaEhh*I;Yg<`&rm^mnwXMiym%k0xuq$mW|GB@7&$+wC2I%{TzG+$gbduFC zKiz)$Y5D!&M2XQMbnsZeN)I!!9{yE6;(n4VGK_gFa~4CUia(Fk=VXrApZ?CVDl+Lk zb8#+f0-fKMX83WeO8Ag9l7;>dn&^Kv-W9h(8<`8mC6tezt3`i}@!YT(x_sn^J(oFr zf7l|oU!V`AU&W6$jo*f>rauILjYo@>PXX=^)89 z`+wBpKSzYEtt&?62EUnACG%rP(8%Sgtc-a3y7wY5m_rtqev5cm_-o~z)Ml10RWm;i zad!>8E2uA3Y;^(KobQeTe9pJ26=7BAeZyY(@-JEQQ@_D$hc?Z^e|C>?CnI+f)GA{7 zgP+9o=X+HN_5q>sdmr}glJWuD=RxQuW1#2J+dR~HndiT8nYVup@A&Ra5}uK|3}4>a zLD=<$PotP0(=J^l%ws$$@yGpW{N-;E{%<+V#SRZr$8&@>vjQ&4aN``R%BC_{dcPI575_$xC{`PfZo83Q{@ut(C7I3q2pQ7&!l#H)0!BO_3#Qq^R zOPTX%T5aah|L)yIoSp<}Z^Tnq?jlgEyOQ8(+T}V>`Yq!5**oQI9JF$oI4AhTpM7^2 z2>xcuDaCx=ri$hKowP^VF$~sMnO4s5#W#Ov_FL-c<( zchlAV{O%cX^7qi)^-_=cyK0ukyQY5NuM2tHvh_+`jRWfXmcK4z{@xf`rBkQiGM@3V zsarQ_D>yOVKOS@Vn{xN&`4oM)F~4LF#v2QrrQS0?>fQBq=-q$+?m2Y2e7ksiIpxS$%l(uP&7T@yLbp zXNfscdiWXk%R2POYN|(bCP2n-C-+7+F-Dug(}c{5%K^9;vEk8fxL{A|?gi#KX_ZTyR$htKvc zN$khN1INpg7khVoOkZfSu39mC0FMqg=(-wQz5@;;q62#N>U+IJ7G?K-P%ipjbI6^! zL%m-Q^U2s+`XHNo3*>IcX2!hc_I-~xz6TY@Fz!W%A`^-gaw`;EMP>}6@7=5?M7E8K z;4B>FKB5n~Z^=6ddM1rE+Lw@wz3pk*-voZ>W0#z#M0RD0p83L%=U4QMPiI_>yVNE5 z#r{!X;G`EHg#X%}^xY431rP3ev&mV~S0e*>d_sL={dhDQ^82fGJ`8RWQ+J@g5}FZ* zdnfu~-$1=1x-R=r^%QBl0*?=Pu2o)Lr#$-URi)oz$o}({y}RC_d=_)AKLoQs!aw=_ zO`$pU$Rp`T2Bbe9kUlpc{U~eS{^egDkp6r?`gUw_{qsLMAT2)4{l9-cAWcl6tG*Ww zNWV599n1cev{n8|`^;z7Zht;l?aNu==Gp*l!MIAt@yMOUdahfY$O(OY zmcUDWaolo&HG%nAPEg}5@@`X^>evWx1iro0+qaK0RZ{Ogz?1y5RnW0Oy*1RE-LGCn zOkSzqXvn|#pR_;A%{?2eCx}Di89&nP$+peDRI6^iltViPD-$+NQ$-fIdKiOQWu^`j z`w}T-KD&rHDw#6L9{fYvrHqUZfj5`G=BO0DrCk0dV_cQtzrjQKjyUAvhf$@Tpi!kp zo?P2w)thXOSLcQ{zQ2h_U^We|8Lh^b8RyQ0&H;R0S0ksJiD@>T=i@SBoUPC5JjYmi zUD@P)1MeF?Zp^A5bTF%4;zd8Nba}s;_p5D)E_BZIy7&YiviWAu*S>vk(Ec~zwKvX}Y=5Is zoiOL!*EyaiKpT-uLZ1L_{>AP$_; zr+Tu=vCUy7i`#>|bzrfsJ z;#9Y12z@OwAw~_MuZL9JI40Q>I#q#JipMoE)iZJGZ#*e(QwM93CHIZdJn}tnyvg`p zFwtz}SvGZ(FQ4EKpKqPD)+2czA5&uFEg!$mBYC$>EcGm#8sz!OtXZBPkGaKDH~w4T z=%cZ;Pw4&=@Y&?U<=Eq6N{#kQ`7IMmpi#HyCF7e9pC6A&qK;Anj^y!9yv4}(%G6&P zd4*2}pK+n7)RzSADMntQx#V?CbOV2u#}sOYb|!=7)``mK^K0>#$PXRfu@Flm_Uzj2 z;|9plPeSx#m*uGAjp~olX(B@%mN~}^IoeN#BJRENmaY|3R*F88A~+czjP zd}%W5(z!~jihU^LUFp|4=1XPjTbE%=zFfCDA#zH}W~&W*u9fdv{rW$BC-fT!{%&-q z_I<~K3Fysn=&#wxv`yoGTRj_Fg*)`%Ecq6Ae-Ave30*pevA2o-c~PHTagXMh{@5&a z!ofX$F?k=)5_)KPFY!01Lg*yf}c6BpwqO;-8oz7$8P1I+rJl(@V(SGnDHg`1-?sL0&Q>r z>v8b(wPTR?jjq1^CdQ=fDSZe|n|K0k{2h3?kw*h*{Ey_v_-n}z?#dh}KW1M?en@@& z$6U~LWJiF;A}@?N&j5KL-v`PHdH4U7e2}`XH-0o3|9<%!G55IdBenev72M`VCLi*(@0hY(k&!|-ff4i{gC8hW*uQO?s_$dnlDy)B zt8qtu3hYu~i=FE9e)YhdUyfVguW!55l}lZ@)FtHwj?8_e&NAIM?uABw@1M{wB~0R} zXh++TL3ZR%7;@+!<2?-em>I9*c~Tt20aPK!@)_gzsi328m({!NZy0sjK61x_~cAHUvesjF%U-G+}&_Y@QE9Lux?MxJJsig5ffUQ zk{C4M&FVPPLWfOC_udOFgboGJLum1ma&0-P1$&SFwa-U0@=G51{y1`4zGsEr-Y#_d zRNcI#jWS;DaglnmfEfgA$>;kX=KKDI4;FQvkoGgD`O11d!2btnZ(t4;7{jUXj_`ae z-*Opmx%5dkV>pSqtYcf5VS5OiOPI~L+=TsM0&ButX!0@khZM$a|2c`k1J-_-zr0kY zI%KZ0k-5=0<}vckKR&8toV$T%)bFoX#(4jF12(6?zQa4~vB_?`)$k#GaN0`S#ldPD zwob36$}?q;rF?_dF!ql=yIdKzh8DhU-jIy%D1K2ERh$A(=)s!d$7t!P(f_x=TX>go zhfV9(92VehjKL!04`A0dbyX$!-{suxfA>&))kOchgWr4B_B#72DV0;Jl8fS{J5_kZ2X3eviVK}-{UEHld2lY_a5Jc_R{yQ>|wKS(%x+F zt8c&9h&O1y5^wO9k$t<;{k-w0&| zo>N_~d!}mAIbZTsJH5^xRUp68l75fA+;`Eh&vMeAwQazro>D)us@CXt+1DEC&Gq%G z_YC<0boPXFc>0{HjXElcyyx`=$!|mLX zrqurNp576*VElwl_N)3J8{Sh6OV!_~_kH>xK>vVz7JBT{g&xGwr0oG5=yPZ>)cc61 zmwr(D$}iJF_TgW@ybrI32@PZq*l548wppKIjI(Viv)Dg1+CJ1f!QXE2!?<3*JRIcf zmsa}4NuN0B6ZXrX#V}|w4E(N5i}lQDB#+Q3D%rKg!rCCvFFD}9m^GpUUzBYA{=NPr zhO>7reHaIvKzV6bE$<|rwb1IhZ$4`?_P+0#bydHfeaslIUb(-`I6DW;oADcXmUgd& z?$XzBYhQonWA?c}g7=uCdi#h;qla(INFD2EJZm%dDK`Zhb^IRKi-95S-;D1n za=~lSR720B2QT--`nAE&NW6NFpT2#ExK|-W_4NEr^L$RM?Veoxf6(Q+J3HFi`_oKI zSN19K4Q$7bPD~DBv|9`5bIwcL_oJKXv#{QuuFN1$7J1H)hghF3;*u4b(KQZWY{G{l z58l$=ZM@}M?2Y3~F}Vrf1j^S5O1 zLa&9md%*Rw??Nc&Q}XZ)3G011Q|e>QzT|rOH!<#?EQww`k1{{k?2$#9)wQF<{`I#w zV{o&kyNcLrr5%|`z>#$UaYT%G(xMmZ(4pnvuQyDs+KivJHUGgG{bQlF5YH!H{2^{m z?uiMT-7}uLM30(@oh#+t@SL186_^M4E%_zy7S;J0ba_>?%;{lb7iIjOnc5RKBRl#a zeIsRw3vB4MxbM_0)S+AcU;DmNKYqw3b?yEi?W2s)>?(YU=Je=sInjHr_3faqt{?L) zU$bOb*VNK}&fq{t14rAkXlS%pOGxe!+#Gs#wBV|MX93?j)%gqdwI}Q42Pmf-XI#{% zoah7WU88Sze%{eHRp?NQ?3ek5*aUQUPBix?j1c&j;nH3WJb!;J97oOWIX)o2nvoN& zf&0;G<+sc>=vRELZ~4A&1$?`fTp0?_=MfL~;Y-=4EUTjyCk00oGuK^WfiDgai@BV3 zd>#Kc`HieyqT;fnAB7J4)9tz2fugte#?8I!#Lol>bcRm zarZ=zUq9Q(HzC58XSRNi@oiJwebKi*HoHg40eIXrBF`{I3&{+={KXz@QuU_*E{gX14ogct>3J(l@i~6Tz+1+q@7sIV`eOk zcEFP{ypz8gJnQ&ncJ#IMdSJ{-zE1c`WVdR}j+Xh2@!Nf`@mu(l%?>FVVx6ZuX z;%O$<`Xt8gnfO~hXD83`q;RE!7JXDyp|8JXvk&T5&4;(uz~BBve+1{mQ+)l{voc*Y53;@jZ?B^6edazIb!T z+q8R%7GB6XyQ7m$^Y@}Jm)Lu?;ymWjA^0Ag=t(}sS-^}Y?#Vb9bF8{lTXP}d#>VO< ze!o58cy)-1@OE^So@yGpzB=AkL9DSU+zAxoO&E8OysD#}JWa^|Nv0uQyJ^jZyH^Y6KBDmUGHt=77{)AoW$4Rd+B0P4!joIIA>K(LYJVPm=g~rs z>RR$iV!Crjg6fd9ljH}>TSSiv{pR&NcnUwg{aJiprfsP{3mq!KyK+=mND*zROi+tH zGf#9C#=Kdb&a-F2+toGnH*qmCKBLcwt>rD?PPBH;wVpwq4AqjiCvmoRx778Gg?syA z&7S7)##`o6R}y;v6?jQx$1-4Zt~bL1KN0Wu*jcmFwIJq5brP^EC%jc%#P7lhhpUg! z&-37=&xSr(?ICX6S#zB0h-UFt#=J#d_WsG!1~1tuSFVM4&kWsM9T!nvEoZ<&G^~%iY{$P_RAk&O3x7UL8|t0GTmm1(Vz=-%cAi>jS!Pz#K8PeH?k?`7GU>bb zPk*{v(xT_fP44YcT9ol_C~cVpt$zZomoo?43Vnw#rxcq01l$&U)VDv3JR&cCGupjI zR!_Vt^wHJ!H;(wcwD?A$kRNu@s^9X&-FOQJh$M>JJLM8oPR_PT%NONVG%2%<@C!h;kkDUuU0cLl&Ra zB96v!iHw~wQ%7ABk;P|`%VuP4GVig26>=`XxJUQI!QxYm2N#{Xhqt=<33 z#l)J?KQH@Q@z97vV2D@J@dGVQ_GZvIG?S7M(jZ3HR zsD48Y-u*WBD1Azv^-9~lr{vXVKH~R86}o%ePenCz&(((pPo{fRr+a%6wqd(6U&>{y$C(!GZAXX5I^*K) z3-BwRkDsgA*fUK>_XO(OjbD#GQ)JvAPZM{U49t7_wz-~!OYGADJIQ3e#9qOY7Ie^O z=%6Na(7^oRGZu1>e7N@=UG1NX4n4x%?LPRN)ncp<%WdBbG>!Nwu5y2NLhp)G2~B(zEe|0Ju3rlDJzw`ktCn6rGwdjB)d8;YE23a^>f7VGwelsyqC z^TJT%4(s-i(l6}AI%BD#4-K8vpM<@d?${`iD5 z580|M+$-hIX(1U4p>w6S6?#o(9KBP$h-b)+Z!-qgT-e4KILBB?pKy$EbgWv&!=%Wq z)d!G4t>~1qi~-BIBh@dCa$h>jIAM%>ODVUR`Aa)vMCj=9(e*-p$B`W}hY~vGf**5R zBhFEXLGzGynX|c|Ik6!sT+lXNn@3-$4w>`h1Mf=vucoi`uRi;m@9N+C&MD5Yo?vgH zqYhZIcG>*(*wFTj{K6=wY7WWX5a9xyjT7H3C!c11G4SCb><4@F3D?a z(<~JkpCs*#oBf#n9JVDaW z2F>Iy+RO7C!LRnV>J_q=P<);<8u%2vMPK8qem*8UtcrbxDmiOC;S2T$_$KqI0IawH zuwHT%T6O+4i5bH_$MISLq|4Nd>DKqSOH%vyz1H_sm&58vEVKSG zvDG>wv5j$-6}l3p>(-Ku!V`6q#c4A}L@kGavk%?tP;u4#NOi6Ty z=OxyLuSit3mc(pZQ{oZZwnS&dtBIQBNABNOLFIubpRafz0pQxfxss>H^j?nGx) zS>ooXyu{Wh_1fHF`fHwHs}e24-HG|b(-MyiUzq3|acAP@5#@=kBkB_8j_geIjI2+z zjA~5GA9XnK$f!GCbBw+-QShJWF3XIEf4CR0EmW=8K0kQXURgV(BSU1IhNx}KpO)_p zDXU$Xj(oGLkhX04FkLG!+8v_GPfkn-TRdO8cW=CEyujFNtI%?`OZgi4Uphcz zjr#$8biC;eLO5 zjgc<9@CSc7-$*+y*!}61M!KkD;IO^zBA^^SNEVbnv&0wDa6+zO==cKJwWJfByeve9!;Pk6*AaZTajb|M%}2 z-!T;U({~!_xn~po={t;c>zTp+bdixRJ9C>qz1m1S&phEzyN&db_CWjYGt&9(gMZ=c zmwSw~r9IrA&NkAXwo-rj`;GM6wgCJ*Bi-71yZ?KZk>1>Thd+I{k#@Fb`P1Js(nngJ z@~0OV>HLF*fnxu5>dpH4H<^;?Yond*~t!~2}+TKXoLYX$^O<7?p zF2tZilftquu&!LPnfLKwtYH|FrOZnmyo<+YB3)a$S8TdI_zR7?`@>w1pSFcEPVF{h z9QB9q;G0p7F)chUb#dm^coz)JbjD%^^Z%rm}u zJim4RHgRS%+my1`fOEU@5Eo-tFL(3y*GK)-pW#1rwf<|mqW`+Dt^fXh`Py=6+j;if z(Vyl0^k;cMfByaQO;^fy{|n{2uTy__#Q&`R?(5Y5KQDjS-+r&VJL@p*H|9IZ-4TcX zC+&BX)vgNA&jJ0XFz-0wpLYn|2F_O;W!YEqGhdm~{g3k3*7t*74*c?e0RKvU`V;v7 zAb-=9{Pf>H%�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

    ^gC3U@l{gpCtBa@6cz1KG$eM@;yxRHO5 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 M#ny1$&9 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

    Bn@&`w?kBl*|*m6ahKYGiCv*Y@m!LwzD5a;wH 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≫cy`n`zG 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%0Ak3jQQ+6XS^8=-Uyel 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

    WKv%4bSp$_CT_)==JDf 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

    2jCqVb{;q%Imi=ep>8Yk z3-?e4)`JTb;JfsTFQQBQa&>b4TKvf`WFKsWJ|KrQtikqI!FY1L;5z42T^SB7o>d;G_czM^$J%J`tAEoNw_qN8qT-b<#{M@JeR%=)zooMO(O1I$ zS0TF}_CK9nvj45%e--mgz(DX29A@%P%>~A^ATniJ67g~Hk9pz`T*RKB^N{VP8=ePkZ^Q3L(Ysg3c z8hYPhc@wri?0}zgAMWL}8IH#6Xo^R@3Hj=M@YTuK1LzEGQhhk9l4KkFgwk=waya4(MWeyuItOhpNqW)T!fH z3$#hLM?D)y`U{w{^AK#%3l&g)|w241m<8<&(v43{|)VqfM)wg2yzRPoT zqW0a#EyzDPpG3twHuSFZ2c6i@WIID2#nN^dm`fM7hraQ`v{vWAa}F^I zUZu~xL(u}if{JX*NK zku&`x;QSHm|0eQR_(b#Kw$s=K9S++zXgWqr2`}e9<)LN7gL-_j{~6%U)nf;mZjmjE zIX#gbUt8>Te})&mfI0~q;zIfc4;tt5o!EC8(*)`?@T~l!XaRoQjXC@mUj2!2RJe>z z8war&7Nfr#gw1dT`$F_Z@W|0#k&W^|bZG%?guxr#T~+yqfhPFiKxmu8x(xUn`ytP1 za|N+Pm$Pmmr>%DjE`>&ph2KU_P5lAy=Y^s=M;nX+pVh%Q+V)4M*?qyklBe z_AYS=LG)Is<9XIHH1Inc4O+!L4@*u>h9 zn_;wUav{b@?#k75qi8|K;=B2fU?klYRFCWVZ}pX!Ev@`mBY_P2=#2?~r|z{%yL%xcuPp zRs632hev@kH?!_K>szr^4c9upZ~I_jXDza>pf7vhg-q)b+I%@vldl$2ymGb+^3gYaQh0p*85{ocZwg zFsshktIjvdW#SILNnnvZ!mgb@MfnvtoDd`n8v_r$x~Ph*n7kU&$HgA2{6vKX=57Ka2MB zb>Lmpg}fEdt)_WM=G8p%IA09ld!{{Y6>~}0(+<$K>dT&{GuLo@ZBNU2J!Vg9!=^M9 zp9kBH#+hQ*kDQNO>#ugSmiCM8t3UaL+GW_>{?(o}9ldTsMt8y|`{9=*U-wRh2jJUu zwA`jP(82a&E61MY$X`kw!KF8+X7OOb2v|JsRcB7a8O6E6cd+ zv$TEYwX$!-?OiVE#@Q3};{}HJEHaVg zh7Iih@?F;44c6ANb54Y{>ye k!zxv?Jc4F%^2onj!~8Ht%s+iVvuRpOO!{&F|z+ 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 literal 0 HcmV?d00001 diff --git a/KernelSU-Next/userspace/ksud/bin/x86_64/busybox b/KernelSU-Next/userspace/ksud/bin/x86_64/busybox new file mode 100644 index 0000000000000000000000000000000000000000..3603e741b8e8c140ebb1a9713ef15af21907cda2 GIT binary patch literal 1767048 zcmbrn%Wq@Zmgcv++~q0}m2h{v0XLk0aWb-aLy8EJlH!q(%uwc~NJ?UbBr-`V9vK;z zMUh7muPBnqL+TMXue)KlhX(pjXf$BMKm#^ldtewn@Wk^TdSt)`Jh3N+J@KRr|Gu^N zAr+6jRn=C6C_WF**?aA^zV)rg{>Rn*oj>|Jf5)Xif8@S(dh}0r@7hzp4ln%a|Ml;O zd(QpZJ#`sw|AG7a?%(Fwzsv8h!>hk`k=;xGuK$sLA^rQO;eGlJeQx;^g}eUm>`(s0 z9;biPFVN@ynBRXAUQf?6{rmjC`FHJe>EGL*)4BfZ|K4B6zb<}b?@Rw)`^$CfkL~Hj z1?l_rxxf5h{pbGjU--|ZfB)M*^Y4H4zw4d+{Mv4v&R*B|OW(KZ-{$`7@b~Y9zs>(` z*8fAF`|v!&x4K67+&}wAI$P)d*+2T#dw>6xf9TS`>DYhI=lmz^?SJDNeO|wlFu#*O zitMxL-+yI~oJ;?v->3Qir~K-?OQZgDJm|YGxj)_f>X<+O#y=aIn_qvmzW(Ij^Z+`) zf5`8@#qaLnk^8^@#sByZ|A*=PfBr8Ip8YTX(|eX$j-N5A@2 zG#OvT)A7mXs(<=^w7#aNlk@m0dKTG}?uWsoH0_-YE@Ri7&Ekv6Ebd3Manu`*lQ=pV z4CAODC%x%lG8<2$Z2v(NUr*v*c-L_pjju+0;`k=YCeiwJc6j|D>h@;y?r?bX@oTO> zo*xh6oIm>bj zjk~jWHCjJ<5H;h|!Fbdfyo;lI(c%1}JnSY(oIHr`B)xfmT%1e?7v1SiXX+1eXKl^K z%C+O^#bCr?qVXu|Mzfnq99;~Oi|(v<77ci6I2`x7Gmf3>$IA!N$$Zq)vwTB*T8u92 zr9wX*atRNjQG8W6na1IsfA-B=-a6~$U2QbuD!RjHmE&IwhQmP;_r{}svKDn`(bd_2 zZ)O_8oJ3QO*=0f)viWG9Fya?>`FhXnERO1}d~_I}a*mgA#9`-g67>g3m%+BzPZ*^6 zG|n@q!z6Z-*%`yu?_A7h@pXp@o=wL$E{SKqy_iJ3v$%Jj%r6#0;HpQhYP02P34_xg zOqm`=-qnUfzHt~OaeVHku{)W?jFX$*cLx=Bc(lLoD&=Z~)RcBwyoouRy2dMHbTq$k z{lV#A=H3*a72m#flXyB9_g%ttow;Upx3gWUG#hQ#o%SA0yQBX2BI+XyF1zCnc<#)# z;)(0oXs>49%^yVEtVJhXq_tmUthm(CV00Rd=EEVYV4$()>f&>I598pzc&6ig>yEqq zNcSZF<@)~7!C`AF+y7?2c38DL2>Wm~(hJdj0uH@qSXge^tCc zc<1UP)(&E!_hyrfYf9#BqMzo28Atui`tkNo`)qVr`0nRF{l_l)E}zf4!H7v8^f@#W zrzLwi=*9Z9OKy_R#kfBo#*EnL?kt)F>E}g>lg`zxZ)`q%^!UkFPrr7EM|{4T9conj zYi=~2G3m+8#c(h>cbQy{6Dp4x(9tZ{W}WCezCmQVQ>16>){B)vG8rcWEsr7>!^h)q zY`KrR7xC7eY;tFL9OgJViKn^hs5kC2V8!SdVSn-{<0_?giGhnEE`je#f3p2dZX9v? zCwy!AbavQ}=1C@Z5=AV#pYq-QZ|8|#)eEan9zTBgB-)BLCX3MU&cd|f$HI2>9Aa_L@t9^ zWL$SX8|P;8Q5-dDbsHVGSErar%T# zIYQyE@Q3#C?A%4G)x*k~t4cDX@g%l2G#sDWwD}7e4vq^5NPjvy)q?6v{q|YNE$&Ow zv-9Y9FiRv`{uQ3gxWZ&Q?iG;4!g)L$#lwPM)CG-7g0^0s9hpqa4tz2tYE8n@} z>7aia7n0eeqgjj{>JBT(y?#f-?^ae;_~=!4+GpJiyEoBna1l>eP-&?i@q&zIoyHTU zG@G#O-#To1#6Z7@#^=%M&p-d1o&UV{S;jFZsfF}PPm6Mbk%+U2U(v2r`=RPy#>Y|1 zv|?16qr*qDfwwV^X*n63dJSP$BxPV%mae@0cyu~DE4pU&`=e^B-8pL3xPMS*hNY_c zf}MjZlU{cBwX}8y#c8oNE8d?M@Ar%MFN%|&hS$Y|5^8(WE4ZkUo8=ls=8QSz%lp{K z$YpyHb}jpYUb%PgUbHiuCucS@3QuLE=j$e9wf17tfMB zXRFm0b%Ov5ZB(MIExywYPPhpgPs&MRg`G(T$;@RM(=mp#8K0C#Gp?$8nuL`tl@{){ zBrM^66xDKvXdn*K=+4eE*owo$YFR7HJw{M2#=KQv$pm+hV3xReNXpdI?i)bfUXIVX^ zah$W6$&+qRR~gOy6nIg@V)nmt9tG+}{(EC9G&q={v}3HM>s}%Zf*f|8w#bH&jfe?v zHn*|CXCKX7Z!(Wu?t`Bw@=yHI-^^?b9$Z<8vR@5R67SulD#li>Epw!gpJ#SW)A?lf zZDiIk%0A9-oMf}nY8Ir0X~4W@H|KqZdhULg&EHFYFU5{l@S=kbm<~|F0%Fs_F>q;V zH2-|Beo!ss(QTS}2kyHpoJiOm*fG%{-~IhvH=4K>x)nR+w0fm((Ff!ClyM#oE>M=P z-e{MayS(LMJbBYP;B?<&&`-whqB}izf}X>#r1rD-P#|tLMf`Kp{<;&%Tytr|`O25? z;mC|@0mD2Hh|anRN}k0wJL`_3&EGuS^9nd zWpb&)=E9f<+s$uS-?~a(&bX_-Ln>CY^IR6>(2q~L^WhA0uvU!RU+oV@^Xq8Z*1yQ_x1+;emsiy8au7RVSA_LJ`c~l9E`qx9PO0a4>#REZ=a!yCg_f{ z!7*mU@VNUgD&6T7>hXwA{h#(dg+?idxhqG<sLo$5=+{s>?i1844awdIaiE;uLNcsdxFwPpB)bfxgS%OkrlCCvPoX!^T+Pv75@ z1+{x8iFqzj^yb8#I}We(CZ})FGp4^lE`m~9+4Zl+YiNj$klA^{@A`v8OqX}3(=KXT3N~Z#TUHcNy68^M5U=oxUkbCCETyeFz)0t?-Z`wk>@=FS z7cG|=jXStU9UQVty``UdPgR@SX*#2|(K>21fF&@D3?Xc4*wfEe9ZM)p5RJV_II|rrx{d&2>Vy@K>TP{3oH%sNJ`vE^3Ntln$8Ds;` zsFB-#W!?#I6DMT{>^#5tKN#g?zw_Pcr0e#^30ElaHyn@8u|YC3^4H4XoaXBz_=AfsYs21>I(Dx% zA3HGDENClxZFN2x2%%iC8e`m;!`cCp<0^aQTE*?v8t$lh7#();`cDmgVI~pR!&jC1 zL8*4=zClOhLnK)GZ@!6UQ~Z3Bbj&!EO2+L}I<*#3jWf%Y@$FXarIGn^;5LD0>`b5$1N3 zeeIVNa5>6xj*}tgI*5ymSGtU3VTLFcL68M5arxo9i>`}2ctm3y#Iv)pDUp_`kn+W3 zDn(KWz^4rk=3%*6&S5YjjaQ5Z_-QkpGxHs6xZdLLE}rma-L=uPV4~x(;I@GdX;rDD zj7z$VA>U)F3Il#R=x+tR;KfXDMMI*OE{Z=CodJRvVOfJcCo4+*gjFjfNV!wl}R z4X+6#Y`|9+0<6OMywy-Ix8~Xu4JoB_g&s$zMw^cxe-m|&aYB$o*YEaVreI}~*hmg} z?gBLC!lO;Ke((#NuFmkWzhhQCjuNdJ10vp_12|C3vlCF82r@p)c{%^UwXV98qI<(> z^v>VvDgf`;(Cr$Q+cO6?gnKFFQ74~vG}aAv((6JOxgbxJnHcDK=Py4;Ru@RFj#9n)Gz zOR#*WgLejmiXgV>vEe9JMLHo5+V~**rpjfiI<>={x~tT7N|j18tg3hf<;EN!tb!+r zUFhyXt=8Ck%>bQ`Aa@tum7Se<8@JsRSoBU;(Kz48{etRw!+0~fiyUv*K!RB&v^ z(NX&NlP&oLFRrunF0MDh}x>)aYaWXmIvBJ zUQ2MrjNXO_|*Q$56oApwqTxzvl(&-Hc z`dAL;4&e~jc*gqX)Fs%4jO2I7&+|84N4@XbL}5U>y~)6a2CD&a*gcKkxIk3di6S>F z;dIhavC>T%N>L;7CWI;N04W`V4swv_Ob&ik5f6d`K-TFFc+UQczSbSrdhxPUYa0Y& zDTC>~jB`|zQdQN(IC7`orPfsIGXpnC->`gds9_904a{o^aBX2pMQnTEXyhdT^eNviT>EOpj~jnn1J;uKG}~ z#)*na!Wy97?lO!ESI?RI$kbkHw&p2xHw*_1K>@`O7R+ZiV2?_@wM6X^G~ZC{KfF|H zK6()0?>va=tsQaV@~Px~;4jBRcfEo{oJZTO%I%Mj`RFM3-jnW+tJg?>UutVb%v*Gv zKwB*igo|i=23AzS9qQWuRIy(CY~xIxi|eTIuyw;i0uO^6U8`E!g&%aSqr>%wn_sz= z)NewM5ePyHNVet))Ta4Wx2zt6i|q9nB`(oo2YQ^G4`gSTfCS-x$C{LAx$F~$8V4lG zKEw{Z1Xr6-4a`L`F9gXM!z7-%JG?LdRi}F$-FaHrjP7vmQsvQ|JDEE!(?VfmQ$sAI z6`x8VqU7uXm=EI+f}S?5ER+r|hPgKr#uK^&Pq1`U zK`C;lwO4=1qgO9ngwF8#iCdgbT@thC=ci~BBo7p#bkrRdEG!8%4Y=%r)#Jj6xX2D9 z1ja1in@n7_{-WC4*{{FE?x7*Phhc0hKo}aG3zZ#H^il$lQlZ2@<^<~cu9TAF_&UUp zq#G9=t)jNf&1~Eo58aEwR8d78 z$gN`>CGW(qUiQ}Ht6dReIVDsU!@=mA2$h&ZaTCRAok_lU(2Lv&3)7w5;Gm5F2e_}Y zFP_Xk1`t{>GFts{4Uc)`>U=i)I+wl3fpHEn?u|;@wSPd!jv4kruOs)pGka%YO0ybF zZ{QyI#QInK+sLjzg|hgY|E`B0W-0qnq5*Xcb2`HeY$o<(ikh6Wrb_cp$g6 z<)l-cNx4G9Ct!GK6TW5Ya`&Sz*G)U+#Mw`o4aH$|T|>6HQ}d;WK>J*Q__{}QL2=k| zA9))=^t+u_`8mAGE3hj=z8YA?HJq~1AUR_kEM9>0AwHPG;8j67W}GypG%G5SOUw># zBNbv7m<`^}JERhI=4nv-{{8!WCc`S`5-fO2I9|vNJR>JR}wcFKHB^OJSVhmnC^Ys1G~evB)y4*Tb>*S>Hh^ zWn6TAu-k4_e|T;9hxupJHa5S?uk&xiedca(C4sXSkWOd(&8!?@t~3^r+uncPETPXG zk5*V#o4`Eclf+aV$k7MtQeA;J_8fTZ6`NRTB9ml`OqU+oZGkg+GIs&FHI;eM9p!`f z8qgy1gFP~P)hyMdO5643(V<(B&&kAfuDVj&OkR}x)@Eeso!Y{-&kAX1xXg>69}f;Y z2Mhg+c_-){1fLPGMP0LKYfpd1eg`Xc}m6s&qxr^H-sf0&M$QT0vv*E zLHDpGAMrw-ut5f=IgKcqzq^vnKe~38$)MOP&We*_-)(Me*!c>^1S@q-Z2pX}SWJTsf|m>VAHfYQcxxMFcbOh9^AcS=ML*p}dW z7QunuF$5TTC&@LGVxf?P-H95hO@YB8&I4C#_QADl2i1=G5z%VpsPV;`YYVi`x+I;X z5iofl{rP05Sg100pdl48j?7wc7Pce}SZA`iM~@P2))ODWgU*@`dK`%afG9%HqnZXK zg9@5MSa3Y_7Vh)$U?j?SFmlu0yf{SKXHm0Nl18kSE8OXc)0-sCq+6ceOrRJP5HCiP zWF`bqw1-Yg0{1{l4eiEgWm3k} zF(mer{VKl+r29j+8G=m~tBcBwBYh~FohM=jvsp}?#Tv3%hz}kQ##*QTJ%i~__MT*X z!ZW;MM&63ZVnwSyBk{Q-t8zz!X)Yjs1=K=b?(BwZG$4|d1_1xKxyexEkwd?DO@9N$7U^M< zEFbY>q6}5KFYaHS08B1e%v@n{k^jHQ~h2`Vuew;@+c(+GS#5S>GDe; zQRC5kjfnn*`)NhFLMCp=0My{6gwdNB__~$Z_*C4S4q`rq9aYfNwZ>C`Q;wI=tS1&8 zL&|hT*eE71D%D<@yBV49lH@bB69vhltFD{~LwylmaL&{}W9)-z3Nw0*-xd0ZlxKLO z_buJsjK8*%!4z3p1wcf1$9LEA5m7%>HVJalvdlN>8JxByG4YN53`0mI?}$Cxe^;)Q z71zaAB$obYuK$ni*5BFKm}mL5mosqEe8u8iqtx9pW)Tl7ohCsFuM1og2T5@|Ids@X zSWBT_j>37fjuoeol?0(6c6WWo-raQGNRUB~6Jo=ey_206Hn`1pCg#z;c}sBZceegL zF$j1RnXhp1DiLd+Mc8+EU0O!#Xnt<<8|%>Jx`#`h+t`Gk^?y)P+}nJT-+YufPVdG| z$Cf(eRI>Wr}*E%U`vZ(UePgT|eiK}fa~1HAHZ zF2^48h_?{?xHV2S{x8~O;ELyBi z41L7_gbW0EPnJ$WcoMb8A;}T4xZN!fvVZ}ItMsv@vD!X5G=|hweZo$y?i%uZEEdH4jx5=U036a?E7Zj`0so}2nyAy9`Q)9> zWj`51FCu;&d@*|xu1-#flP(>NWgO&~pn=WdB5XE{Y}RyT3No4bmIo)tK*zuBkTC(4 zS_7Fq=-mK_0Pk00vJw2-!!r1e1qVLTfB9Zg6N-R)Gl=I!n5?|tbgXQ5Na`+%yT@hu z_}FxCdN#`mhyzW*Pl+4GC$k)U#PB9}tkecn@_l9>G&G(g(K@;2Ei5aw zYcG2p1HMJaAcIo7oVO60_i@6C{;RLvz50P@)A_tyv?~B}*ipJL4=f#`ZLe>|f!?{X z>Bc26BW?icBsM0bc4oguY#%BrXUB00I&tVH9M~oElas-9oS?7Ix+EmxbpjRcTFn2h zxfPBe4Jl+WN5sXhqmBH-C;5&120}Oa?f7hTg;sBN`@_qLTU~qe_IJN`Z}tq~DLqY+ zDMQF=fqXF+B0JybI_72OP~IHr5+q_s1N*m0oI$xP=%s(c`292|w_{;_aO*e(m=Moa zOU7bQpcvd>pZR0oE6T#-a6`<7=0EmR?WD|86XT`@w+m#f)H zX`X4e%bjMWBM9k~m_UMV+Z`)Og=96zpnAjYRrl+5S<*i`Ldt%p3O&TE%oWV6><`Xk z7!hgg_tG!Ht1Fe}_ne#0+A|4TX_!EQv)(}kqig4c?-=?tFPpi`yUIaH%)>k;qnZqB zxA7#0t_LKZ#-xjo6(TolUaJTqXu^&=fq!^ULbush3leBMMc_Kb~SPVrb-4YvdUfQs76K>RKU#b)mv>! z464dsb`qOomMbHk?ZGb+$nsv;KC1hWQ2sI5(;r?w(Q}@{h9j$mhIge{bKv^&H2($1j${5v+idvH!^9AN19J=~dGIa8Q)= z?S9U2z^xAEsi>xU?-8@YX1-IVJG2gKgotT!k2hh$*> zT{ibnd7J>oP4c%!GaMNUq6LI6&C6IQ8lVL#9JA2xu1m($ArOfH7o>IBx#D#=b=axj zj*pcJS#36DKl?uMant9Wqq+-xl}@lkfKt=(?HOR2$&C!5c=0z*EB9)(R#?Z ziCcM;f3#1!AaZjFp^=6nl%XMq3Q;-tW<8!tUY3r5_fT}G>so0BnUy{>DQ8fD?@0<*3|deZf>_*EgQv#^K|^ zKA?5Lu}|}lPE>@jjPfY-bxdG`1h*~-?|6Wx1&8FcP=yH@Uly#UEQGFvr&$--$~Dl+4$mKSDHFh`E5+Em1%VHcp>fsgu+B~>|5_S- z1jtKsgi}P-+L?J3R4{TNttkLPBM_I^vyY=?zWhzj6b4hvMvj&%DSL~LS|X4?y+rp} zH3ib#3uCK%VnC&7h-vgX^N}u{kD!l_=O^yOGy4Z5fQ!UanVzd0l3iG~B*81h|QA)hbc1`^#3PR`mVyd3vx zUmW)i!x|<^`p*9#khzV=$&tW%DJ?UQ)E+Ei;*#1Tx#Eap1=@4drGZ$K3O+Q9gwGc- zXbR#~*clC%J`MYDY)8PD8P*{*%+Sg0M?!%0Oeygdw1dq;0%dU}D@gI%csRd6eR7{w zX=1@tFEVeGSRzsJ-+O@vD4!$BT|S6%lLyfjf8?p&cS21coRW>Ba5$&JS-^(s84JLe zSMLq4xubAnGIy4swYT4J_jQA>m|+otwITP@VKa6UpBO)88<%q%my@;M8&7V`C+8}O z3;PqX3^OIN&!}b_MH^p#{WQ0^zVSGp*@p-wL`KD(@dUe#{macf`CS+gv+Oc*zG4F4 zZ>LYzza@9ua*b&unm=Ss{FZ9v<)-xJiLWpBRaWqvFrtMV_==#Z@MdImnC=pDA^k z!5)H5_+WbZ5(}lTEvaU>lp8)pnHF!8oPp7!aMqa>I~+~`AP3Zb#n}@02IasNLsYV0 zl;jO($&8eJVhHv-1u^NUsQeI{0`H_Ht<)*=@R1>{o7=%uElA~9EIms+`Oj1|TaxzU zB2(f^*ui9*E5z#r6=qd3agK~3Jjj?aGs>lru2o5;5Fr(VGK)S7s8d!7QqfWVz(q6U zZ>ht%=Izxz&kJn#dPSgPFWQ4X;^$L$7teis=hpkfivjm)1jLtUGEnkj&cwEnh&mqS z=Mz!_V)uBR5(-`NLF&+Jeq`sZYE$6jfOP(H{RkqFaSS=eC!r*esUd-Hv4U}*)59>r z%9Z_YWBt+BXWaSv>#x7zmoUnck^8mxICuAIzka@dK&8O<%~t#9#miT(e|Yob+uwAY zFZdi$!9-=U2A#vn2evdW#iq=+`5=*Y^Hw75=CxaBQhP7Oz^4NXHxMv<&o5Xw0bUXM z*Tg8Jok?rP>{;;C$7;45(24MEl7~tOG30SykTTAvAt6PF4c$Jw1-H7dCaiWa? z|BK6DPE;Fmed8?c9Y^;b(210Wi__U8es{A#w{C+nj4!ubaI|T&psPhuv7qeuMm!Sk zu}oTrW=Jkg7jaLne2_yX7;R?m3aogFe5EEw7R=&+W~Vv#H^F?rRjhC8&m;FxZx_ev zHc25ka}R_6iqEPGlHv>Gb1;Z{L7!285<`3~*Ajo1g&aA8?aOQ6QrtP=EjPDnK-VRN zd&cY%$xd!ahPn>W?PTYcy73u{5{Fy0SJFQKCsi|HAVhI^7h0Tzf|^>`fia>8%+!^D z0gJ|Elw@jy5KOf%0?;SkbIDj=L)_f#=4PItr^^KX23MhS%h8s}liB&;OLi=@$LKO( zzEDtK-Cywp7eexWrYpvl#cMMncw$RIHo+iH#{JWJi+s>CUpZJVMpjMW{$(f!wAw!$ zOfVA>o7+K0vbmP0N-_=&B79enTka*nPDS?wc~avSIOH#2KXAu&W>HICLwTxbnV9DpnDqXFpEPojDPRUH zPxsNfRDqAMn#~MvL$93Lg--=YXfM*e9$cWz^+AO^U%7GWdgJhXOb+CFq%NPw*km=L z5XYZ_FgJ38V)v)yV%D3W@DRSSx`uz0y_Gw$-VUN^LIhdkL;%yy z*?Tf7c2iXyTKgUDOw+6C_PCxHVUAThNDDh9lSEr@VBBRYt*OqXNwrJ8t=>ffck25S z=zt(D^YJ}4WWdNIbY<^jaZ$Lue0}O(g>+C|7e@V%zA?7`MKt4UKNqwGr%vPF@|`xR ztPGMtP^@rQR8B2?>!o*!Dw;3~T(<9dqd<$4YkR-N5M2NYJl|}_#bvMa{3nIZmH3e# z{=E7+&7m7=zBE$v0P1?DD`b2 zQ_?11T}C>r2O>3!0ee7WM1}Bhj64CQn4OaD^0uq$O|%qG*)Wp~#P{205tadvic8LlN1KK6-aFzN_Qh{o<~1 z+(t-SvAk8f5uZlqZ>)2s_jihy#d{~kdvWpJ%c8j}CZ56GIZrq0DML;na3dDWJ3u&l zXd9Mtn(`T~(sbhsbCGCLq6K|5a;Y;Vfi?~7UU%{OvOWb>rn4_=IJLFRg}ur4-a6{b z-0t4~{oLtq&+jUUa6sxM*>em=$7~@DE7~L}bd+@HMA<3cWtR}voJZwATe3>OqoP(K z=+~^iEM?x(fK7_LR(&-cbkoW~urg^yfnuE(U0xsoh4hq#pCh?AKuLmy(9(j3$q*DS zw^^vcc}s4~lvF3q!YrYEyh0jemC6ED-ad$C9BJ!!sCiWWgR4TV-mJXl?(aGE&kT|7 zHtETua)s7zb8ExplQG3q@*PFM752-|^LeCDBI_ff2$FaZah!M^xN*srJ23yk&1VT9 z)iA6@F)=urSB0`Xi!bmc?MPnwtcR{4wlpQM$wL|qAb{a9)38(9?Wm$1DUY1WBN^tE zi*C=dFIQH;I@008?^dvV8Xfy6nuIhE9{Hu|`_M#p9JMUOm`4Ri@|^?8yG8CKRF$#* zMhLxmLvYmaen{^utVfrFZj_}eBPNwQtNBesrodC-OA;Sf{Z$dc){^0?X_+JUhNop$ z&8s08yR%=S(Gc$umiG(%>K`I|OI>?m8uP_AG-FPlrXR_}w!P zqOz(BJmi;(jW3Q&20$I8oIJo*r0zu;c2s1+=NdSxM@bgN>)E-(SGTwcNt$6L;j~5w z9->z}M_Bx1;%%811FEq$LAT9KaiJcK`bq7h6nVjqDxEl7<|S}# zK1p)Y(m5qrMl$mTCe>3;uwA&_?EM?u0ZvFJorLDp)gtQ_F(Ah8s?01-C~Z>oInb^H zVnHZ@)jc^weA8`8JGsr^vsAc7pAO3m062ZRr57Fqf`)Tij~q>5h0R5{-8EiTG<|eW zP*!nT?iZoDj!y{`R@NC^Yd=O9&!Y%dnU)g}!|?v}1Mr;fZDR=qqbIAB?)J@7=ozqK@8>usY)C`$&ichJJB5xC@=9Ibjl<$4-HgbQj z)W0MGl2PvnmT%GO{;Z3J%IYPs!TeE%_kJR!APa=)NTq|gI;}BX19-dC6VvG9IhNC- z@BkI16e*gvAeS*?KCZ2P(9+9gr<2vkwEO`7ED9UeA6Sy8E-m;S6oaoIWx-`y9LQa* zcpK(ppqL$$&AE|_f(fo-wcN6~;#t4rSImwUw5N9T>^i?a01iN6)zX2mE56z~ZTZM7 zTi+NAA$m6+B4`vRM)m4JwEpDDW@}@UL-?PE(Zh9DqtG+K2Rx;=0aPdpf|`s`x8h+1 z2*_h4iDq#boRIthduiDLCL?E+0|`VZuyc1gWOr|eBj6NSHoOsXXm+Cpk1@Fy#+5Pj z)Qp6Nh$3+;K^sM9Sq58a4kn`Vy?IB9!pk3`P%+h*27lnQe2w1{$+(1KeLd{Vv}y|& z_aS1b^-Kz-7eM9@Rdmp*)X~F7N41JI*h7WZlInDGM=m#w=j01}N`Qo^cJ-jqe%&cq z30-^5l~q7zYX6bj>5!hkQ*niH|KfJZTfvrYX}?x#Ra@>QOhw$lgY;mWG#k4MkraYM zT0?HNfgLjkMMeM@hEn&{bzB#4tbYYC)l6Br*6L|$l2OE^2wdx0m&fpCVYV+Oam@%A8R>`9zrV&6)UX! z3{&q5$(`|J62x8_e>B4&fDsV8kAf}_cxYCs z9dxY5kiL=MIU;{$!-3e4LjsNu-E+EmQ4ohm3FP!ec_0^GlShUpr`o|+o8A=B7c3e( zPnthT5}W}zhbaio&ikpHJMr-ppB7f{>Gdc6-`jZ7TRg2pDWXfxa=3tZ;FpUoWC;Al z(^o!Qg8Yb78>BtMeAAKa=F`NoC!~?H8}$89{&!YSvruehVGAW!>c54^NLcU-7RdpK ztsPl1ikG5Rm=D4K5*I`7vn$B>wETSGR`_m|tToicfCWlrjr4`mNm;LeElwWXQzk4i zGIK&_83xziWl@tLwET60E{nDprO9UQaEBqc{EN|heO`f(%KF`5>h*1CC%%b{dAf9X zfw=W7>gU(L79+8&E<+=F*j;^9JEWM^ybrG5!#MLnh$1NwMg@7foEXD}i(=LpbAOD_ z3zv+ZCF{|DGB9u1#Bhrpm8EP%ZDDpXapYd;pI1l4#n)LnsAkB&Rg`TAffNkXyFI_tF@3N3_1T^rfrO@09rBxG5!e8_vj zsD1usv*LWiBnKvfP|QB%S7juiLZ0b4U&kT~gVqRUGDUx(nJ?W!cc_lstr?EcTr6@v zxC+DC!sN$RH~;|@9Z!jvh?A$1U@g-OWk)jpDfCo{f!-My86FxwdjErfImo<1=&MOA zNctyD< zM1fMWLn(nHS|yiahfIj8%l^O@*qQ8V)urWiw7r52P&EZdC)@8BE3!jNWAX?%c{=#? z1M!4PR2}kY7}zjIA;`Gt&EOt+-peUDWRAE^D510C3?^`EENk33;i~D@tLANfU&d)D1Yfz`Rv8b)?U3dyQS zqg9}`xy7>Ca#N8^<-rogsvc70?*m5;^4#~%B7$hhQisbXq-YBQ@n_AkxJvuxugTS> z{fk^OzQsJUxsx?sRM}B>N0FV%RmZ2~Ow+5I;a~OvLxFv<$1gF`l`VXu$yV?XLL*c( zg2v*BLVft$f>JJ5xF41(KuK$rRl49hthUZ8q%6fY znp^Ntg~;6_jLyG8Z9!Mh#Dn^@{FBItd*H(Of`m z@+nKrL&yzf_v<^P1sAUpSWqsoUnQja`r=Nagm8J-8335b5=-Oy<0T4r|J5E;a3SLM zzIAkDyma+}7`W9bk?Ug(;ey)AmMZ`r(X1N>E$rXDm4_%erbd$S(lZPda4KmNDhS^o z%a5)R*o1D(d7^J|QJ5j=X^w@;Ct4%Nm-8S~$nzVpHC!ioH`k4Ee7B5B;-Hp zW5M(>#&=a9_CfQLW#^OBJe$2#t%etTc(w%0Vz_2Y->11PhyX0KEGI3GmT@gh$R}fL zM0XndMo@#^NfrYWjAN0)u4U?AkW&KBWDg$JBf&;tB;^y*(4#7DV6J{0s_OCuM)N*N z1))phFa1Sl5We<-Y5Jw9^^Owd#M#l=qpfa=Yfhw=em7m-o%BYt;p&dkHFqj_3=;2P z_UL@0dZT*v6{&N|S5>Sa5Wv}qA*7m6Ov}e0Leyt`Y_u{no33|3Y4;a^?dTU?n`h@8 zP7)`i(?xO9|0B?PmI|p+5ptIkAUI~~q)*vsDZr!`=AiuiGXzvXa^_xanoH3NJsq3% zHZ?76`2dy?i6OVPjVYo})yo3n(?7vNr20fx6^V;if-y(-coIVyC^i{=6png;#PQVC z)6BN0+=Zs53#G+dR4|_^((frM^???(w(p%wbTCxi5nbdj;LtS}DiTw@CJCC^Y_C8S zFu!k{+>TG>RHE{PYLwoR_E|B9Q^jeB^sE<*3eyA3QoA#qj{@(m+0Ef(E)uwdfl~PXhc4WekQK$`IR$Rt=D-q)iRueA7pg zo+{-Hem9*Js`*gP0SS|T0d?h~O;ql!23gksNUATyZL9-?@bQ+Bjo3aKc%!iwkd5;4 zupNfM$3*Q@(>}tM2F(zp*GIZ|n_V`<(b7avrbfwT*DjlTikm`yK1kBOCMWq^EM|Zt z8Yxzn^q#LqmD32K)_Iy85_Janlm~-G@Qw@SoRp4=`7}%_U%1Y#Zh_V2dGFCa- zK^BUHrbc%}^$?{&k>s8ZtY@SQJ&(Q`TELsT?Tk6K)u~cDvHneQ2shtxoet9-y*X6Y zE7$PWUHud+c5q=dFvX~$l;aN?eH`R&)dG1338;XKGMpU!76eFJJ{fmpyK?k>jhAdl z0aGltPc$B@QH?#^*>`k!NRMSITBi}Mj)FRnPnJf&!+CNDOb?f!xsxq1zfF{`%rriP zP75MjejM%e*q%eNn|s6ID@nUm;+bs*01gP-lqtT#)mMN9Qdo~foejH$8Vz$T1lLK6 zXiEXfts-s8YSVK^X^vX@q=8x7ZV@iIi_?pl8{pIpqwJR{V?@iqK!$S-I+R#0+hk*% zjJD@X0@~X@dXv$hkSU}qH0JaJhmMRIc-kxIQPJ>jWsfmPAuVEoy*p^rSJ>|>P--is z-s@T}MB8NqaI%>6aK-4&G+YgA_SwLI*fiw~!6Sz2T_nyd)T`~i6aYp=+T>Ustb4ZC zKG^^E*&dCuzJ1oNwfC#v8g_nG@DH99?4``J?Rw=k@7qXU=AM#yo)!EH1v`$4Pv~WD zB~nsr)h4}`F(Sm7xAxlYMuCb_XRSc!PzgG5=w0SLKruVdYI_f(Lnn)PW}Z**;uf)D z;i#04P(Wlnn}8L^6V-_mIt>grqo}eh+zT~74C$LFQCNH5d-c6eBiZ28W(!%qmW;Xc z_hM1%TGBm+Jj>c2^(is%8XdHc6wZkbtmy}LDU7J@)Lw062U17&Bf%gbB9Iz97e5Vz zJ$$PW4iFqQRFqsai*nnWnXXXor=f8D#Oh0Kh1Yx(Ubiyx0*F9+<(V7*=*Z9|hq2q+ zA|F6;rQ#cUZ?(md2F{cR*@|lwvgVr@vvL<57Jz0l*^S-pVQ4&}# z@U%NUhCg-k-a{Ub?;;BXM1jlid}@tFHb@PF?n?ixD;R^bXc6FyG0F0N42}hv-GA8NH$Re+#o?{f=r_xNr~7D~!|p{czQ$;vPCXiWUYBQeZ!Re|%; z6pPG5#eB(!`Ojq9`Lz4b0iGk>`R}-?MGAJnUTJTFFc4|=cHsPDrXy4FDRa@Pwh%yu z=|?3kq5NOk{flKYHiH$ZJq|t&{Y}np5<`rOvC(_*8L9u%hadrNhR{}8ZHla6Q|HAE zDP0Q=in8^=0zP#wdQ4o($QB}lHTHzqEzx5oc#grhV+I#r<;vR6#P@v$Wiw%`H-*uf z%HCC=%4pgdn*)(#ENfD2<1P=V%TIL5H2tDychQy2Xu25LWe=*gdmj!fL%DT(x zrM*ft<#J_(Hq3J4Zl=9R=$Uc{??%qMf++Ga`&hWyhp{YX($m+W!-%>Dc^c|dx0%$S zn&+Md2Gg{8%PYHdC0g9{&I%NG>QC7`ng}X2#<5-OGT2sFQJ>^JdT#`($q<$GpKK|UE~2Qb-c*BIe<)Vq zq5(d!7|Y2*HhP52*C4lk>H9?JQ+Qy_Bg=cW{R(w>27Rjs)ZRWbbSgQ6Qfy=u5aqIzPrZsloWh5rbs_fS z{wP`3L6(4nBzyY`x>k@5OakPKHcem;9gL$-b;QlMhG4W^{TkGx>u$A*%_0-+pgX0n zrn9E|wAZ%wnMz9>_q4I!Uz^a_J2_YKV%o+zctT#sB~HCzl^_Jz0MlMsq!eEFd1a@5 zsD!!Cd!Mgv(?x@pV^q*=K0cEIHWTUH3-PhO(UHs1!x5MH1KWyerSEa*rt(ILoStx0 zZZn8)UDbMA!Ma<=b92X~u2LH+xXy+)r-&?rd5V%?Zt=bO((s+&Ve5YjitKdzP>ZhH zwZr)382v8GWujD~GmzC;r{|{(Ap=8_Z#QMj- zFZ1PWMh@#aKy0&CZ9Z@h4szBl3y@qT9#`Rd)BeV{+x2TJ5?zw@wb5y^h6X+BoRHCX zc~=VGj70i`KtHq0Fy49r-544#I`2kC%ifXTol7*8w$!tDa_-czbt=A~TIhh@K)@cL zNpk}L$-rgLA0xh#Gm;h9+>MwSLw)(gryKhn0$2&=ICn(UP&c(fPJ%PFfVf$DX%bRY z*=SLotM75r&xhA6)di!c;K5P_%Q3N0RBNF}96@YxLAY4M;-lo25@i*sfl3A#Gt0p9 zg2k@g598v!ZV7f~*jDEqE|q2h{qY1r9n8+JxqLjYRLYP>#cTJNi(3aV|3;q!M}*;B3SE22 zfL7qi04EBS-N)IUP!t}#7nUA-s?l{)X?vE`r%KJ#o8Z-7F7~Nd(xgTd>%EN^X7r$? z!CQrsx<~q*WeFT=mrd5p?97;P<M%C$~wzm7^L97H>Q z_2%?}4=oZhQpNe;28;Oe%cYoEVF>^kwtoCEoBU{b+JNznL<7vyvCWXualscvg;AZF zxU&;_rchPUdRc1ZT8$E$YI!NwC3%+zW*;UTs{pr(j4LfIuv_|ijHFr{S?(nxa^ao@ zEBP()uuq|Hbw~R}{2i50u>IVAl2Zw$ zeCpuSszlyc;{XRG`c_<%k1SY3N;vZ%`VH+5{lQVpZwrRl4&^_Z|6prpg=t)s9)s2P ztM+#5HGkDXP2D@F&G_E-4QrKYOvwIWiks2TqgtsQ9axzF?@|D`%1!lEqt?V%pcnmf z*_)8U2I8}wphtK&zKc5~F8fXmj!l|%om_c0j}^z}SuZYTYZ-bc+fM(CyV4a>l1 zss*V~6O{gH|8x!4(vbC{t_Ty0M`J;(DkVVczLlY>4y47<=c1pGY9`&be&EQ<`+g!A zVn(;kc0>cZ3}2iK<7>D6&^~YN4Ao*&TQ_Ph%@xtWEGv7A?FVi`C7s5hj1RMpvW2X% zVko6KC=Z9fbnYe@B>X-d%L^aQ{}SRSpyNetPtdk93KnSB+HpQW)$#si)|(ceYUjBN zcZ_qUurUcbs`Gu2UH=*)&Vy8XzehjLO!N8%JRye;k3cL>8o+|KJz&E$vH~m$W7@*# zr+}z;504lPxKjf35|T&sOa==E6l2Ro+r#pT@nC7rnsu4A8W$wRH-WF(1>@}h zEc}E5p?xz=S-W_iXv>d4yeUN{*0K9?5ZRCxjmJCjt#eqrXfC%>HVllGL%i9P-0x;@ zjrwYJVkTjuT4`K~HyS7u_#e^qbC*4sVdZTLW+ZIUCJ=hVV1oQf%uTK#d(8S`!0r&lGfpC6Vt zQkJAtrBV%%F*|)YAkNyBjj39F3O0z2B1k;>&(4Q_c!%Gn0UdEG&Ov_&H0O{mZivjRey7 zAFw6_L_p8xbYLf4@I1x1=I{lcOjh&ZF{|&~ZT85Ev=TU4mMit-SMFE8a)0R((JU+z z@8wFuh{u9zB)b9&i>+;iv5eHD=K!5sT*{n<@}*q1$JyL!B_QqO?tS+r_ap6r`1>Or zvye-RtDT&>+>qeaY&NE`vgOk^UN*NQzZ1#Rb*7TZe5}#*H@I{Mt#ZRDZ>s`+__JE8 zp8NU#^YE?<*P!5&x zdkx0}=hHQ{X;FahJf9x9|JdVgpXlTMQ~zlH#ew^ixfl#FdTWAuYl{xp&(I+waWv^$=dc=5oYJumQ;rT{* zS5_J4vtUgt1ARD>Ig%#d1#byZ-o2nTaiT}~#d#cQ4T5hF3yH$}2q4qx2OT-#2oGJHCPnLA6vsiRXABF}VgA>$(ifXKn#4Z10El+@m^EH^)kvi&l+#B4T!#d@)cnj5o@}BiX zZ?{OXrz<*H5Vb?v)`5?!&^yA^+TwA)>VQFfQJQN8(DETrvYc>z)WJi&pFW5>SgJVD zT?BzxY3fjX_@;&Yal|W`u8(~S#SW0HzisfKH&*O-)Vt}(T>ER6%t&a7c&2U3MJRB3 zOb!XZQUaWS)Cjg5px_h>AkmG<^oevA$gG%Vgc_p4`yqGl-IeXaZrpYn#lfgwV3hf6 z&*M&)TGb1e+8>!_xkAD`O%^?3VwlSl zMdaE;r%H=0)S|{vmw6oDD51u)2wwT|3WXOT-0q^^XQF2Jiq1Rms%c;K_Virpj%V0$ zldoMosFus7{&*!rOT3elHfU>0;dI9Bfjtx6drlQGQS}27$aDmewsc&x5?47>xPD@C zv>+fr2|QAmD|ce;m@ROO_%K2U7;O^%Q{dtkdx=pH%jvd{7@3xku6JgO%yYNq-jkOZjUG+`Xh-;++hl;KRx@Xh!ke2C#Zg1VQ@EGeK ze@j?X6cu6{wv1U#L&*467B=(KiQi$|*B5SZ;s~r(8GbxaY}B_ubN<yp8-$rUk z&h={AmAb`iQcO~_K3_{ZF71<|^To!J0L2~kf71mzc4@vgX)%&l@eyOVEV7Z-y*nYP z;ge+s7lcp&2H60(Qr=f&?~rO>BCF+M5r9~>Akac`fBY!Fp;W3{p#oMQt1vaHs3~9j zAN&%$-^mInA9Ts*1U^HE!Dq|-9i>;zrssgmq5Dh^t}kgeXdK2Ls=8kuM?|CdebzG! z9NnNFMAcXA&CuB?(7246bvdx?uYA1U=ovGqf0w z&P7e@7Ji<%0~^%b_#|hLMN4>bR+_QJdr8$}(X?tmR8xvvM4GXh;1}&!r;ASa3Ry;Y zETc}YGKK>`kYV)C1b%6ek!uLg8_Oj6HhTCl|1{d&h7iz6-ezIUmuzUXJs(ZJ|yDKVAqbkxb5#4gff3n_Q@>h$0h4fG>!~9FnV3-9Bm& zS|JY8=Fk4-p6Y(&9q~-*g-TLTH9q1YB{(noTBOdj7<>n8Keds{%qfzQLmEA`Q3{1E z5-}}zxa1VUNgXx!{FRyOKq;xQwTEWn>QyHbHicprD)hju&4CS`h58#@K4PugrHYQM zL?AfHj9YV9CI27w3l3(L_Rh3x;v!liZ-BKy_bXXczO45-6up|XAxHb|-kjj-% z0l(PXL%>ey50IMEp10Bfw|TTK4luA;vUy=|;Px_QgiRY{C&(DH1sI%&G^8=5F!CCz zkwTo+v@hA4{`h+ImTpUQCNT88BqTuUZp)xQ^r$C~NIWt}KWAF+zRSng?C1OO=233- z@MwRZuo6fBJVFLsPW>QMFy7k$i3v zSsn_2fWa6MH;25nA|IyKZ@h+c#l^w^&J%lKMo=DSh%S!dg$&)-I0$*%dcuBgza7s% zKf6Sn>7uhZx@a9eOGI4Fb;5W0iSZhcXW=NwhQ#SP+HckOTJ2ZFIjiJs9DdK{I@{I# z?H0%+I^4&*i*|PCxf8YOQL7eJNPH}BP|Q^+KSXrcoeV@sxQ@g%n#~|GLs+=C`vhuo|Afd1tp4yZFWVM0j#_B@{aR{OG3nt_U$A^9(3u4XcS}r%kDFbt`RVt^(~oWhx);e&)`u0P{m| z6fAXMCHn4f+0qO*CN28#e^p9i!s^AbX^RxcLit)cd-rQ4S26)?c_>Xm_ziVKl`oM3 zTm`Wy)+Ep~Vp=u=6tnQTVHgpqUfUPAEo}G8)ZP0H!HiTiGxXNymjHgAA zCS(z1pFB+PeD(iTwr~HqYj@a-W_PbyIjEG%UySS=D%JgF+j%wULvre~7w5S)_F-`J zz0_=*=b*yRXtm2?^#jX#QVKoww=q4H*x7irEHDzp>r%;W;3Yht?-Ipj zNNaimcS@3URsJOHM$~h{oFMPOGK3*Q1Q&#F$p(yN3+O3y0(-y>~V5Q4>0K(5^a9$^k@T0+SVM zmMdGKz@aqGxdlg-z5zxJDq6lR{U4ZRO8fN9Jo3%~tNO1z>eU9_?(gsUR?9o3_Qt0B z55l9DUq5EcjrPWq5IgZ97x#Z`$AmdZ+xdU0+uKdioyx`$Zb;n?WxpV!@3|YZv}od1 zLH}J)kX5eJ5ufWLLso5cz6Pc)Zg_&;DYW#Lx&2#~hFFA5YYUqsS+jWC<3@k4GUg&9?sRb)B zO<}r1owerH*S~y0+cZ3zR3(A4W-xCy`MQtiBTtlj7CW@s=3A4H3V~%=_)q1j>xGI_ z835bzev!uB#Hgs&TYKJVF|&ejk79R!TpSgD`aUVP$xpSOsdUUSR4cA%}m55GbWlba94W zeDAqW`w$Qr3m*d7=K(q2{ogC>13hxvrD!#2<>CZun(2Es;lGerU z616>&-j(SEc(<&sX7vRbUQ~c6s&Lu`3m}u)kb%vXt?`WKWvwQMDe`U1Xu9s(m^IMm zN>Y|{pehYciZ>mK$%Qb2y}y7X;|=bGH9Qc31ux78WIJK!P-c+3dZWS+mKiL~YeDlS zp$^oRHo!G4=q%8PB=ZeTa(#xBB$-;VljTz(nU9Rs2@EEH_DQ}wopjw3D6D08PyrZ+ z3%=_&yDfz*X*tMh3h+&I$gX+Vd`co{MWHqyln)@K7Ut6qJfZQlC5Vv~mV3z_IxOD0 z_dOB?&*H`IwZ7-`2Tz($qSkw%UGQo$KVDl>M6gjObQAzE{1$uA#ck(8+58JXS;<8vE8xy>5EE&XY*-h zA;ByeO)oFFL~K|*Q_NYEm-Q3f;hI^fI)u5PeEf8d5ZT4*@QcWTSu!>Ju*M7GE%p!z z;g%iS5lRk3fnVs5KmW|}G{X)knUNfiU!!Cmo|Ang*%xW>u*NjWi+1N_sn#x)+cY0` z)*<0ukJ_)@UDDZ>9vY>=7smm1ESvCZ(vWrEOP=%r51ax|AOZ7NVt5As!wR%~!LIve z>yD`SKFk4IZNhf($I4WORN~y)yq1%MWm?hp18MUhfhw&%lBSsttAQ+PzjNN^*;EUr z@Ijiqo^SJPJ=p&c?EwNQlP7f3Bw|4I1{3g!nhv@?Tj2_BePU^Fc>8`YZUJ>`ZHIHL zUi`M|vk4@_QM1;5O|e_4RgFkOZIg|#_mVG^N}oy-NjRG?|S2oGqO!dNEK^UG@`&@o(g?L=41R zcXZflz~*GbRyDU$+eSS1@w23~?Rq~2Xep3De{?Oc;1AL2R9OZTEGgO|h^W&<_ z#>_~QPtLOpJ?$z?GMuK5>qNaFg(xzu{+lntDzMP2=PUiC`?N*!Y}hZH{-_0v5xre5 zd@4T}YZ0tb0=)Df>1)8(oNk`*i%fhcC(+FmQbCyjPgvE~IFLXY)PXvmHF0u*VX0>$ z1S~~pNk+Eq^^isqrLrb3JKw^k+C6GDH*jYtxue62BmjZ2?xGgfl>XpVI6aEqlk}H{ zF!@JhW6S;}R929?!d~s8@!7i$`Wi2W7y+=@k{c9LHx1ASJ{|8}a9ND-12Rvv!x7cT zQ;wo#ZUIC=*7xsVpTy>xi!(mA-DD7P*-`#f0@vVJzhNnmfd_60v!GQcF~#R1{;4NP@6{87QH2cL;Zsjj-5 zJHMYa7GB%7zI`oHX4yV1Ax5V_$pa~0pOC*2;F{8X|#~v zP0P;bn`k(C!;(`N!u>^+2AlgdFtiR|z6?^fUaJRGil_q+as`Ge~RuYOMr!i3*9xwp%={FwidcP2bdo~F7A?-+zvjDY+o zbwLBYw|2#ThzwjTr1#*@vWVLkA<`(<&o{|Qx>}-Viw$VB=@#l@Mhzm48&^av7dwCt z$M6V?TwmH40Uf57hMxI=hza};*#sof43~TAzIJR7>oD5NJQxUWaNq<;TE%?}pqcQ$ ze1D!~qtd~ttG(K3y64n;r~9;$L4k(o%!Ym6TUdFo(nyuv$oEcBf=gEgY3H=*07-;Il(MfdaYLRjjL6o3NQp1}NS;o%g7Wp*2 z6SwUC&%j{VSpdF3f;6b}fzoUj>f1tUcEE+!(aP-lgd;~LceYk z=mQc11NjA3<~hXReVAzl2LsHIujGE5{^5SY&a%K!vjPW1&kTwShFfr5?h+@L))`wC z1=p+d4UNXX1D(mBzxQ8WoCl@`aZG*RM$0~GA~()*$8xo14ihj}jo!zbVuH9mk)>o) zBiTY9;4OZ%aS7gpzTfJ46j7L{5Udzk%U--nvV+7-Sf7N?-xxZlrxQ@5tUyR_hEEMN z`nYzZWx=t?tHz>xwzaWN7KnvR6oLERt%Pm4#HOXCCZB-J46JBD^HzbABCdWrzmOPy z@JbnK0SArEAGsb!!I?Rb;fk%@mo3F5ZvCF(XVG}gI&ny?A|;ddG5m|fBSQiQ+Y+l_ z^o8e@nPJd6I^Qm!Z9jkW=t%`Zv=sjRDonh!%*xL9{FC;4qqIw^y=FchjpwIlNC-Gm zN2Uu_5T3NY#B%CZT4T2Quwa6*9efcg6BZJ#H~;9GxGd+rfU{f+>ije4_PAe`_50fciReo#m^Ik8N@Jdd1K zvH14Tu_|x`OSjAWTe>(18>ULWY3J0qVdlr<0t&@*)G_GC_YTtgpQ2dnUS z$l_JHn}Q)cm1aOK5IQiOzI5L4`h{jzE{bSe%MY@|=G}{(7a2E(z>=1@$G(uXr3!l- z>9jSxi%T;VoIaa2Wjfrh$OPK{)dx%N`Q|m^cI=9KqSGx0*nbV*vN-c3!D^B5SCn7NoRg-jQ5d3&}9zeL2)|mz< znis^SBI11RY)pM9SuXZK(FH(_GS~PThFPi~&?!faH@jN-pb>rLSX9u3c5Qxp8!IDV z)GP;H&%@=Z!wRTOel+?#IakUXPQ8;F(Mc%^eJe$dPuUP?1sY%PnKegV659_sBVy%q zEq(oye!+PkB;(E|F>w_Qve1hySiyIOOC53-`I{blAnU%P6VnarNx&6|DS*hDUX=^5 zNLOkY4oNdDsZDF`sU_-RrL?b}A8G9FAux^aH@mDhAge&sH7id-_LX^SB_r>V9pEmq zu^eeRZtsYrQh~#)QUcnj!y&LQ*}?d9&I_=ut08pbbGrTn)yVl1~TL0;^_Zqf03W#{(%{W zpWueNbWpUO0PfZJS6BtZ!y z9?$?NsavhakN_xgM1pL9;6XF9c5V{?7rxG4kc*^JW$#wX_wk*5l}hC@sY+E2UfYv= zzR&afy#UqfUAwZbiVh_30(kMhzr%C6w)Kw5`=k9 z*sG6NLr**QT6?RZnDm;V`sh?Z@Q!_MiBq}8%4uU~DqG^5GgLKTFDzV=>_zE9rc7Nt z#n~#-z>1@hUZ00nZlG4$BV#!N07YKu2Ou~$RnxI@*dWKR%6oX0UEl?TFILwFY8p0EwaRp6gyC z3pWz5DLgu&v{(gG>KY1r~*u>c!)(g!B7&V3Ii%ojM+-ws8Yeg@H90*=9PV2g1zslqxk#nS-{x%VU-m z8LSvjj>jx#TpYb9Qw94nY(Hnli=U2hjYq`?-bjRp9_-?QGFaAYC7Z3b*6Q^+=!G6V zS+xdtu^VXcz!-0(4@flM*qS4=-QdWNcn!`EmcvZMdDpQe<06WX9z~svFadkLvIf`f`SG#i|mc)SnO5XkQxY!go|nGNTDa-_vc}Bzqa|cg zybvu6IN?P-poK`{P(~s*tD0@N-*j?wU&y{Z+i5=0x{}REZiGO#g2VC?V(&z*>45Oi z8MW6Q*|&{^g&Nvx_$~EEX||~I-x9DyRO^_Vb`My!7~pIRS*tntA3enG?IJ}iVdBY7 z^;{2HanpvSswn1U2;!kJ9hX<7sslvd8p5TLt?ogw z>93n5T|NXsRX!QM3VfnkuQV!S44D1?(H&Oo9Xa85B+2g}2SoY;)c}_WN|NakJD`cH zpT2+w`WKp0zzje?&0Y`K5F&I<1=mruV`o}iTbj~8txztJWRLrqbHpmM?*eM6fg)np*)DKmn^(ZH8)!&h#yfVTr$*4Dc;U{!%x56^fqU=7m&?m)Qjqh=-hNtXU*kQ8?7)cWHdOdS?)j#`C4eJRkPB%E5Sj@|+FM4*p zyJ3Mt*Bd5!?uku~Rm>t6b&Fpz!t707#|s2cMJk*|nB1`EOm$J$8mTMCYR0NEt~+Wb zuGJ~=5y?_x#kvh5hhvOQ)T)Fg2lH1Vc`cW%h{w~(yg->Y1jEdsI;(aJR zylz_+++Mq#@?_C$HVH5l(}%3J5n4;FU2>h2=8Qbv>N@WbCzsC$lmh)HD$t;!b+8s%JDX3bPH43~ zC-K9M66QA9?yLKEVV|u9)~#*>AT8lcLj-pyT{SyJ*ejBgY!8C)qY5@Zv3lySqa|1+ zeS+z;v*i%bI}ED`k>6quOmqlONn1P@)7173wfp?4V$nb+zk}wjtt*p(9fPqWQDGKG z3|J$5qFZB87}OArk_Lwa4rO|vjzuRk$!|zeDDjNT-8%#g;5o;-QXIqa>6y(fqsaA8 z0|VvI*Gl0$&r`>-3yEZ23IN(SM&tul>PHA2V^`fm3$g%uR^SKxkUc7rG!V1bI_S-j zQ@oO^Wj-065$#4ARl#`Ms*w2Vd9x{35iSpW6;xJd;OHS93z4UwoCey6rl38b+QeFm zIN~MGVx+ymx5OqMo^-@O=ekJfTuq!@wsMh?QyjpJa}8v5K;;-1%Gx?GImN+XC1zoj zrE^695gwsvviX1&ApW2EeSR#>U%thZrR`z_E2Z29889l8l?CVCNv#t(uuQ!N%F$9x zz^L*8@`2xSYtWOn{nYOFxN>^_HI1w$awXlI#r2W8pHWC4$%={-uuS$iH>6o5g<^rA zA}_B0P)ia5%omg`-lD67r{r)~9Husz<)&A|vRq(7#YfDqyqEpj739FdvY14BEa!(LRPB|K5)XzW*ZprZ@rs1! zK$=oYP9MT|W?{~_>!iQ5R-{5$FqZTUX+{(QvCF$lj}$k`WHo4Vh#Ao+yt-fMZ&U`u z@po$#7Vcq>lQ5vv2gD~#0YOkzanr?h2Ki$niB;V3H%zg=Ar*v&fRhjlu_?Q)!bU&K z>XUYr;p~##Ge(FF(4s628Kk7yC2IIzW;PE?FRm z{ZFJ@k$y}jr79>0FhDY^ULbR8cE{*(sS1xu?5Q{zJ+ZbxXZq7|M#a1KgQ38+6lRN5 z;T{x=z`Z2-EayN34pj@8Wn7qOeL#+c;W0aN2xFL6n4Hs58=kC=Wo9R?mTvSTZ9C2e zN;g2XFuuqxoa^w#7w=+qiq^0Kc}2@P=t<3^B5q)2)HPJhQt+xOrckwX?ri5(56HEH zv+$xgCg-IEOrS-f1;!X}y03d=e)5PuvmFu3T1Xz>Cs!9+Q%E#n4~+@^zw^e3`sC&S zc5JL~Y_;1svTmFFo7ZWsKz5Y z!sg`=Q{}m48QDdrm^`}~U<49I*1iaY_3Asl|Cnw8`x@ypl+%EblJ}Iy{%I2*{@xCr zl6g%8FY@;~;}sqZ`CO;uVT7g5El^}!MvM0(Kd5rCU&xhbls9Jer`dzMi=Ql(mhawG z>A=F>rMpwtz*)3|#4(BeqMed11}Pvogeo@oQl&wPN<)MDo;=7p28IPOMz0Ph7ATz0nb8^Ye$%y=aT0?L8mIDW>T=%Nc4 zT)s`f%9Z85>h3H>%sx{UT<%6q{5aNbrq>NR)G|#WMj~ z%!;sTMu`N3r2)fd^dzdRKD(ki9KwY%Z$5cb=(4u#T@L49XJi{{a zrx*~@nt136@hLdKY9srDaV6=`8i*o;cMZVs`qgdThQB+!;;UnrtC7D^-SaFg3J}Z7rv%j#l-VTqp+KE(F zku!q%MuK9v0v3k|_aPIN=crbY9!bln4KpTwV{SD=6j@DpjLzOvw7rGk+u~;XZl$#}5FTnSCR2!fz4;-&1cUDsc5~mdiK8={dU6 zA=mQQJcR33o_GlBvt6`ezkm$$fQuWlfn-NjyZ1-H1Eubiqxki=ECtwigg0 z7A?axPo(~+a zE9ld+V>&{*-D#*@#m3_hb3wU0b%WrX4(`N3bWgS=+^rVVC<;(^1{W?>2acJyp+8Zk zq6o0a5A+gjLwS9|N=aL&KEhB$=ZE1Zeyky)Wz5U)QKA8)qv#zY;P*qfqb%mbIzRBr)g2 zyR4MBXrYo5`{}SL3-EKDit}?M$j3eH3U5`?L-$M5Bb~KWx_;hLBz$ELnR)J~EtQ;& zDzQ@eC*6uYJdiWNiTnfmDn6E52l6W`y-AlGPQmaQ>MO6Ocn>HHpUSkP%5O%xerUl) zZ#MsP zlM?jgN8X{V597l+c4X_1*BbPoe&RCe;Je;{hF}<+7qVWk*jW7vH7!0^g7^B z-3<%;=5NTI37cDRaWvWMW2||yiH|iPk04}M!go77xa#=2a)$K4Zl=~iRrK8n-a#Od zLtN|k*)w~Hkt=WW@^1_i9Pw?{k5K7y_(d%J4s+?3jYQ|(Q zeA{6?;3T)63du8-4TvEX)*PEN!r4?Q1PWf&!65bh9hO9sVlmHkN`b+V6);f`!WSRo zU-n*dkD(y$E#esRv0vdG8_I+8Q%FrAFWyAV*xkXykq6*&BgNv)5giXVrrH6A4L#&; zZxW53-4+;td%|jPPu3{4)Bq6S9^DXZ+Gb2X=DwooI!qTa=BcL6^nnqykGs@-5rGJ+ z$TX}p+=jd$R^FH7#ZN?^b%dG?GkP?%ht)=7Eo(IUjZB{;B*7nhs1`3?i>eYU@n(#$G)|M$>*jFF$Vb~ zvhgMknqy6PkJ+wRSy=kA^N=m15<|h_Qq0&m8zW=w0g*KCC2*yug>cCiMkDb<>lkmb zE(QP-0kJmi8En?K>g^8Xtc?{!Zu#zVwuImo(t8cur09f)K>%vEC9 zhuk@LA)^m05oJ+cPN{)D+0EA1qvGI={I0yjtVk(rn>!6qqylC-Kh!7`nC z1*S|=CYr#08K{cbj2RHJODbB%t{kgq!kKlgPb+>o)e-QYDBZ70U63$3o4MeehVkRy z`_CUFr?pEY^YGNjbzrWQm~lmf=7nofrBd*Kbf=WlymyK0n^1+xu@%72PGF3|*=-b6)NcXz_0=N)K;DJW zY!!y!?zp%#^{*S~OGpxyUgW!5+sx$gDL#v3L;&Rl)u`DX$-U3~+8BtR^9~7EOm4eN zo^GtxcN)y`79i9u(hhsrLxV9!AK`07@D*~9gCv7k(av6&eK;3xO=@$JJy1YQCElIn7-aI@%8c zx08SQ%JsWQHNT)2v90zTmIl6p7>XMjh#q|USdbLQA9S+nuut$AiscsnN1^=Y#A;UY zE3uUz8yuAp?|YqrrmBp4aQ5Ex^;X|$atz>Ds9ZX!5_~EE^YBk z*?PTIp1R8P4! zcNAV%zO=~`&Y1kni5V=Q1_1_>Z?-8dd0`b)d@}@A8ZClZJlLi_0M#sLo#K_*Ii-vt zK_Im~CA6X#vf}%Pz&mhq<KH)(+YTn^@AVu8O?Muc)qW6by1 zCC3@WB|q~zpG7*koysF5^lIShIpQvMa$8msY=%mh0yIvg0>P%8X-8)EUk+=P`y#td zYLB+>N=Zz?*^}_k0c+;kCsyHlqyB|+ixux4je7)?41kDyXKErGU8VY`d$N4vok_#U zRl!ZT)(tVCSOXjpF*eWYRmv^rugUEC%tEANilA`h(h=W zFcHs_!K){hgyfVZ$ec8poj~lF*BHOJBdgD`aFdwq-qQ>o=a!u9>GAiQ!oMf`WpDm| zN&R0}v-tH!joN?VosIpdLh5vM$mOjOOd_?<4L}&5)m4I}2b*JYOY%sa#(+o2tW+cx zV8uMfJZ1;U8w%+SSoJPh_>W3=^V9JXS#taG=-U zPZ0_nPiJN1?v!h&Jv4zpve^*Ewo@k#br7u4pc^EJozM-mk1@pb9P+5|#Inb9wDz~N z(b&ff>J_3GkcYwo^*7qdvTJWc*1VT*7-%74z<*+fk-_V}4iJ*cR|Ba+M@k8$Q^a=I zKND#faP@=HQW%`^So}>RCFC}8=wEbw@M-aRJYK_<3tEw?5UhMkbqLf$YRYq)61^7Wvj|kGIYRQp)-xT?0K#RAHtDEK zeP^{^r8Dg`i@~hTFZ=}y*~cGeYl1uEN9M$DJUR3sZ<@>W6J3XDd2dCQ!P5Pkff}-W z2!yi&=y&si0eXp-uqr2tFI-&E=|9{iv}4GeShVFQnD}W9PsIDfMN82)D`m)GlQ&mx zVj2&k-StDiiD<+3a{F0`uA<8}jUZ(PR#@WX@tD-0EiG!op0eM4I(QP*py3mqk1@fK zy99J;jfusrW_?1eW<41SO}2)mZ(YaxDwj|t94p>_w10#WPVbgjBOu|dY5}=oQY>Wc z(S~2r@M|x6&rC9LJT-tZq?WL)dBVYSrNzZd`DX*Aa}Uqhdn02-AvKNlO^p{#x1k?G zzMx1-&@GfK5y@iTCpEETwNwIhd)pYH9MfbJ~CoK?_aFyzwkDcPznrkslEYrC?FwJe10lsEsshxb*CWNNBW&!G}M~?l&<&_LDim z55bPIN^NV3i7yD&NP9g)gPV^GT*AB=MSEn(;t?fNcf5qBaMmYvd&FM)W=}s-@qj2O znEr_ejn>2iWwqGF;nn##kF?&TBl++K!EN{#i-Q|RcPoB7D#;GBZM<|6hfj;+oczu&9GY542KmX+K|C9gufBawm+5hxUcmCn; zcK*@7+WE78x%21$V&@F1ySxBOiGvwxT$P70rsNO#i(}y=8p$+tgIoxIajC@5}s#1Av>tu6>5K~?BWLvc@ z2ydPM;jAl_LXJdSi^_3DuYBSb?{05ZVJ?A9BP=hKa9y(tr0Sq6NOWK7RL+qga4PpG zCC;V*k0wiG#hh*V+GLd>wp(1d``}3VZF6$vCfU3x7NVLzCZCuCA7mN$a~=?ngl!6r zmz~b~4wnJ>K`q2vjwx5_E5Cx^iu^rNeY2av02;hDTK*Sx)7oyJ=xwH5}S0l46Hs7S(M=#D|;=2?~V{iL>ze=Wsy; zwen)3)089&$k~Cs+$B+@v0w4#LVvVJ*P0h>KD=B|GYqXYB*gt<8zF`*RLTW-`%?Om zSZA*moFjC5@+b8H4lrNJ@FWK@v@Ix_mvvY(nu&a|+90T_wnWHU z?uasNGQS)Os@W-oKeDPb-7T5E@nEM#c?l4)lbrSev33zZp%$Q%lR5Fj-V81S_Mb)f zEa;cNBdl+moA~MSy#;|iNoli17+wrO(iEgxwdNyPCy5Edz{*bKpI2Pi6#44zwhC${#gh&$%Y_|*!t^!ii_y3@uDOv!4&uVN%2?RO6(QKz_d5BoJUF?! z`0N2_<>KhpBOz@Vv&oJ3z=Gh64$h9QsO4%*&7b!rvAv@&rIo29I?nVSIEsFx%JE7& zIfvRp7EVuzSFBCkP--FxQ^;cE!%W9?BGd}xVt$k1<5fk7EQ)UH*2M;td%wA{cz=Eo z1Fds<_XQR}On?N-bu#%i+g zdD?xRH~J!M9S*jQesHrtcy;!gY|Yl*C6B3O-(BD7nB!U1nL2d-eAEHku|XGfqq9q} zQIiNPD|4_>pGrb2xj*e^TcSuqYye#&uR@m`=g`w1ItM64OXMOO<*s|aDf)vtnU;-8 zXsmCCy7R14_gvfDZlZ^3?K*y*7?sTT+f_M@h_-j0ZP%LXDy`WNas+`hfoPUIaD$soV|J*O1;VvS9|*1<*&}4U?kwb8Zch`GfI7NNg$B?CwBJ2tucxSCj;%K zA8xCH>r!{8xDe;n7bo#Z_gSgV>+B*`8^m-Y*PmD&JpO%voB`qqR?yt1@bjM|t5ua2 z@D;|F9eP%cU7(U7HD`gCr;X2u@SgI5_Qd>g?ZEKSiVR*OBeqv$N{Ee>zC321UNR;) z8aa(zVP=51n)Fw#z~T(vvm;ZD zcY)k7d$Yr3?iscKYz&Pg@B#HI!mIenk!(0F7Ib3I-)E&UDEm|uVy>1b9*pIXO+g>< zYPh$sY@}?>?TseN+xgfOU&QU-A}-P~Zi@5~wpdD_0LbPUa#Mm&3mw3(YP2|#-eQC` zd6|N?kV<1+b*mzaBGLwoMr7S?FJ3c^?R;)+p#ea9K+sUKvt{`o#tH75trn_ys9Y;5@%{UHVh>w!LEy=W5BbCZOxKV zqnFT#l7ZFu34t6!CE*jrcoZ-|5TP(*Q0Zs0vtbT~*T|VHXBtmx*ugT9|SGe;yrmk{-b=4ZK_u97&h#i zgfXa+4s;-`f`e)Rs4Pdhu&XjLssPajSXP@7fEk{Hwp+yBV{H+5)w?;Hn}x@irGv9_ zVOz8-yw1ucA}?I^UQYtLQdlfgw62~aW&)}bVt4}QFy@{{kPov*2EM+_g{5+~8cnfi zdB)4r4G=oj#s|1@ggqyY1=(iWUEG=j&W(+%tjN^t4p%e05a*TmTcW61Ev(FBgu|2t z6K@3b49!UL?|{JK@u5UmzgM0sEbCer67HDWGQ^e}go%M7ey8YBWji9rVnl_r+sSnu zH~?Oluzu#&0V%o$|qKDMS& zi3SvJYV);|>Z??v@6l9H?fyH$ggw@iyDpz8DmBqxXJVBmCu2hx-ut1nV4cKl|OogJYCgBjw?8s*O z@0nEZk_8ueq!?|e3Exs)(hAXX=6a-|zzkjf~?AS~#|Y*tq6pnHZdX zXbN1_Xm`kkNZxh9teqUIe9s_L3<=3HjC+g+{d!IG$yf;abI z=*YNkXZ4dLjHc8jm(4oBtPt+8-!tyD%$VQDa#Um($Oq84*BzGaR6uz|Bh3`?_KDZED*T6&A_huf% zQ_hFowFc;k?XT9Fn;UbX5IUXi!UqB?eln2fhjo-V6Sh5 zSbB&n$Q#Y*^N7kM24d!5o}J)b?;{t1QWB&TU!;Vwl{1CO_a`EYe_dLWyc~*gU|}3V z=X#;oNXn4>z%>vs%Lz`jSae4zd*Sd*ndh=()y72j=)Cf)d7hJOWXyH8zZNciwm~ec z^u;#Eb87Zg^;C398~5-eN?F;IF`inT8ZM@aZ<#;XGsIqG+lbOw=UPIJd88x}rFdf- zO*n?7^k(st`A6vSNO&=Am%PjiwW-Tq{Y|k48-)8nG2JNP#cS^*8YyDJ<=kDPZQi!+ zA=)UVcthCPSL-3&fK(Q>kFtZLZKhb<*?@*Oq1BbGX-ZOGnYj{~rY1bvbt5>T%L}}H zgqqX+0R4PK=>94vAu#TRzN=0cK zv2gb-IKIM6s&%xWx?`PHfS@rHS;qW%H}I|UjII80Z~&TU59HG8t5aGFmDv6SNfn01 z523~DYLkKucGo^LM!;5fU&m8~ozp#-!p-S0WV>vmQNM41C@_AK&_c>c>Hz_mlr(Cs znV%uU&<%k&wb&g}k|ly@pw`7ahG`V?pvVwAL3}APv5ya(3(dYiEpCZhPt76HgSem> z8`&y;4JHhXwL}0uLqupJNcM~IQ(wv`o=EI4SSso%gcSs+kUsmPi|f%|E)P&SU$ViM za{g`X8)f==C?Py!xjv+wp6zG#oy-pC`F*}-qp)sjhUe?AaiMx7gt#Ps`(Y-7^NoG@ z-s{ZYY4^qJXLpM2LeD=Zl~2@;rMK54_^QqdA#i ztd5XcS{5EC4Selkm>Sjmf{ zcO!X&u(&Qdl_N-^9bfY2KhH{`Fqk>}V5k7QCMyRbSt2sbdZZIZ6HB?m2!-@QYaHXX z_hKEU7L7#{EE8^O)UAt?L9~yibUBv^PZP8$iYRJ>CjedU={SyLJWr9#=woz zHYbZE%s8&aU~#hdhx2M;Y0H$T%;pI&G+R{R@+~?P`&;mDc~55nGmj;otP$ICo^N1) zcUS8jbM65T_`~Mb)1A%qgoiZnOuH#Mw7Im!gjgQW6w7K7`U5{;jRnth7qXSIa8jN~ zu}vKFezqPWCCz?-lO_MBYc|X!lJ)XRg_pJpDZ0#Ir$&uLV$Z81Sww@9`Q}!u=LUir zPAL)OYp4AjgICB!@nGWUS-izLF)g!5C`nNw0eNIr+Y@VT4UCx=u%(=q(mL+2GcXj6 z=?8|W%qBj&oIWXfsZlwxw$@;Yyqn~DUkpbcNPN0k-Nthj+DTl@QgPg__x!Vfm{VO2 z#SwK5gCo&?IOA~o#ut~vXQ$zXY`vEia=2WANl9BLVoK`{uLywnQR9SHSW<;@N>8v~ zW`#CD#>aX)w-69~40-|YB50Y4w0LcQXE<@PTNc)Wu1bKUZV|R*Q)MPiF=@JzHz+ zB60a?Q3nS@1P@1Z3M%TzFo;8odBlB~DulDp)YASd#w@>5an4A#91KoWrGobC5mdwH zAm_$~;8B_Vha!kdNSP86 zlSM9A+>Q9qToHznd3h86G8MB~&`Qw{_mLLv6f_Gwms9A+V0j= z@BE$Xoo<(xVyD~H7DZ$KJ;kZi!NcXD^1c7Hwo#YAAO1HznBAzhfgR41-C14&b}%E^ zXm2zVfNO?@gE9$*gPXa_|7%@si3}0T=e0t(`aTTv`F*p@0IwxUu(`wA%%iR^6l zi&PPT7oq_Z&&kwCDGFx^Fkbfy@2XnCNQF*esls#0biYmZC7fIshzPCAHaMS4#T)V4{S z-4YUNi=(ALB)_#&Meb7KpIp@;5d*^ULy*0vXG7BE)va1sZ%y0t*Qr{zXbHONSs_Ft zhzqLTIPqt$o+q#va8OyZnOqvI?WN~sa(Z#mZtnORG^`BM~89X68%`huobsruh#N*Y23ypqu*W2E-(13*+{?SZqq`b5Y9V z{Bvfsc!e7#{q4hrF-;RCDhP>dXynvkXyyzboR06-1~zG-&?2ka!!<(G#C}!K&Pvd@ zBBe3iA=(g$D7=KsRJRX}lhz~b3IeLVlhmTwLk(cK>k23LLy1OdM)ep!cEn26&9RDg zE%QX>=IOh!5NH`|?P66iW=9R37eB?j<=E;A+?6*XQnGZ|huET6YI*frR^4qsCUpZt zsO}CFcYQP4Alq26=2!=nqe_oDX87l8TjUjYc2=zg)sf&c3U8D4QE0=JF&RoOQ27?K z5d~nu11{*ZyW58NE6lV~O&}J`3^u+3;WIO!?q?!Cr!bSNYf$q7&d*pyfH3s-EPj_) zpr?ZZDzIE^3#W@n;WSEZ2V!s|OR64TBRWyWPOwh%o5VqCEJ4I**^# zH&o2Tts9(xIx^(Q(F*OU7P#Au3;Z6Qe5%~6c|6-EJf#C+AzL#WedX6&5?#P_(L^U` zf@(ctNwRnEEIfbRzr3?R^H4>D6@eTE7T9mJ%1Xn{OGV)e)egqeps z&CmA2B5tZapL%nfg=N5kQg4sw6yu^gD+F8VGP^jZJ`*~Y(+QiVA4*)BS!tgZynF;y zV-d}uPJ=^ntxWCBoT^vblZ{~Ed$Fc?uK(ad$eXPA(IvG`03arJZhhOPnKEfxhR=LQ zR4l@>Q8ou(wTfcI<0Mozf){_qSw`G-^Pror#xfx?$U^HIrepYYKlHXMp+o~3tRwi! ziO4*k{-2{C7qPmXUlKearO#X@IZ*sQOTy?ov^1Kns-nD>YNCIa#nxnZ7z>s)w9+j3 zVLqaXG8KYf<>mn@0p^HQQD@LaY(VAKF*w--Ot-@5wiE=rhYyEFN<8iaq!lQZI zoXdz4(|Fn+Q_f4d4S)a`>ej=WZkh~uTshLmI9GCkNk`Ig$hM8`P%_up6>hcIa9xYc zSrBphMIdwJ*D$OkZF%*+*XAyvIhe%}O?J&LK0SYmY8i%e*26y7;ead&a~TF#)6G-v z(`Lez!~&7SU;p;=FFyXw?A&J`{p`jsf1e>Sh%PhlF=M+(OwWE0hgbM;fSN|YHJ&v$ zlJ{&nU5n0>#XZ^sxU_1u?=9RHotCApCIHBsND7l}h}EbVDcdE_=mEpS$TRyJCxZ=U zi#oeSCT{9YQN}#(vjh;=*{p5mP02N@rO-i01v5M{QhNKNUijaY!sBYlE{VDDXvW^> z@rO!{@EZ=&a|FW#MB>N1(l@i!DaionX-Q+b6C(qAty)3ygx>Hcf)Lmd9ENrC7 zNn9ag5r3Xi%I|GdKvc0l(A~73KtH~Ycz{{#_()vFL|A1m*?sWz8_rtqwwD{-R(Fyl zyhW|txpOAX>0CoKb~CV4iF?S*gnW3==~Ck5+w zX3Y+Ig%j-{J$vMw$f7 zxM@>4L<&o^IQLmPS(>g-ST-st%EIB&v}TaxP*v6&{wSI_175A)rVy27+0wp0nzKr%{!i z8NzuyRoN?CPo=MLX=S5H)K9enz$wBdrY_1io1?`zXa#V@hE^(TOWnYp0h&>tMx*c7=BNK2ta?glQkJ(yTrAP>g%(m$Eq8T3U|!Z@*rzK_ zQyLRsMYL{?Z@^zk$01!O7R9E52K5KHQ5Z&ZMk$&*IDxWVwHx8U5R(U}1sZ8G2%%}c zgIEeRL(IYbOa{TmV=g>ax16wAU03=nW8z{_sC-59WXEbe&+uBIoz>Z~hv_*(drL+g zC48=6XAmkCWlJ9$5|r7iZkIDnqSG`m9uMUb!;-buYKM84xi6t%J}%?Ph}ysGDKA?O zXKz!D9JBCzuemy()@n^q*y}-793jEA&?GRnsp=Kwo(RgtLk<`m6 zPm0TAFdtpa8QfP;^@u`5di+5R@R$}gyYb1PCE|WA!?HwNRV`~6OuE0E^~=F307oUZ z9CwNQ8}#<_xr|pR_)0}_ii8kv!V~Rh+nlcVyj2>&+1g5$VCWN>JktvKstF4&hmtSS+@odvvo$AGqz9H{j(b6 zE6O!Ek6{IqZdgoN8&lS6)w)Ig7Q)iKdk`z;{{y1bGf8IBCDcS<$@3M~8bXzJTorVJ zzTWIwp6$Kqmv#mvrKTuu9fhUEWt<*Jgy1@O_dnS;nBJtq5=w#dCrq(2V6QJy+AG8^ zA~@G(#3|XOp$U0M03ykX;g#8R!5KxB$w0El5R8m2$RfI!Emj~$V>Fttl@13brPq*9 zQ-8Fem@T2hEpxYt#~lt1FZL_J6@_A#AbN#)*yAEj1hg=3ves_z!l=0!2IKRiH*aGh zTs}h3>@%lY=&UGO-zZ@En233IbVSDyUrd~IjHo<8vWRPwzyeb!!C{-z7O3r%sE#NS z;j{ATi0g3j=zU%?nTrqP7dMvf-LF`F4c5@>slAEQ847GQ%lD*Yopz*V@5))$gMU@J`5G>MS+FX($tRH~NaUMr~cu08lk4?ik}O#twE zg*p-zu?jGhoKOtSr;=N2+yIGni)Oe zew38$PeDIf6@~C$ZnrmD2?op(>l=Gnu^xY0f<;gXppJ_?^3lQ$DFBd!_)LTDk(Foa(=~(VBYq>|*Jz;Z$6g zv*(CYFXlfjK{olpal$v|Y93H^==j*|UU?ZrD`DWpPw!-l4<6j5MYY+SW-6)8Npi1c zI!*4w1715EgibIOv`u1v6Xs5OnxMor0cCJJ(sUGh5&t28_?o%jcc8RN`mV}(SX?m) zPbepC&t99##*AJc3%njvc&*sD4yS?b7?(JnZp^g0c1#}7)o4DV-{etA3@b3vAI?LC zL@{ftxv&J3#)9=Y1bM|GmMU6NJyL1U)2d0+w^oplBE(#;HQJ9?a65&kj8P1FgU!x* za zO!%_lyaD4ggD1IM8JG$Hl<)n*6yhW4&91_)q8X!YLeJUFRyUyJsI>`uQ^?<0e?&7f z0!sEIWC6x~WHrf=a4a~H~Sn4OOnaK)b9oeBgmywj%FiV{Eud4f4p@n27ixX&$9wR9Yq8pf)zWvUs(%Lkut&TN zEDLQ`=pOIEVgtpY!RPt^;^kb~1sy9{buu+^lWd0C^Nrn2eywioY*WqW9lSSKP3wYr zt+nbHeqzQ_SwPMNmLtC?3buM{+me%)8_C?U2uMnu{Gfk|kGe45CA8Z|Ow+aqW+07( zUv4L{b^`Y9bSB_VcS_ymf{QP3OP`SB-3wdI&}`5LVtqR|ch)zbN=5jaw+ZYqxk`M> zH8uB~Ub426T6Gdr5?ffx{KH1g@j=$kn|2FX>W^yrHD}#Gx z4{Po5YIqDcPT1bv3@IAH9s$om@EH$Z*4>1;le|B+5GVj;_ppJ5sk1PqA|9nr!?S)5 zsJwjMHi1l@g}wbQd;qUrAO7mi(J>D6ca)@!&o3^o-d0!F)@vJ&9@l^IWOHkKr}1U8 z)!u#j?DH`et~By|&w>Q`th%ks{(Vg>khi>*^Fw@J`Bn5M9>h z5G;q6EFP_oT9`@(uL+Av)*w%8j;MWYf*SLQV@LS}3J0||@-{Fm7MW-&ATfqJ9>lZ> zCN@!h+%_&(gZh5KD#IYw;Lk$*PeJ zWP^Dp!)4;lSS41pC1tf@My^{PT$JT>Nq?(S#}Rm@cpDxWQlY%`Z=a^lk|Ep(V_`{9 znabGuTs%uq?jE6vGn%3xuP}&gdQJvGo|L7WIjEA~Y_@Xop@a9Zjo^o5M0Lf?V?v~T zTm0F={%W5lA7|~?gYEf;zxnlVfAV*O9#Mrj#0Yn>KKVp%4+JxpiNk~mFDfMmkeY*O z5KVcGS_jdT$Om{twPRHV0N60jDePLs6!w0?J<(Xn+XmS`p zt!JgBpBtN1`d~g0qyNq>xe~Fb_re9M5|6n@Wb3F0VZIbGk==oKldq+)(GvTor(tI8 zaVrTbU+DxIa*?^_Q#YDVK5wNkQ;TFQt@N%+5ZysynyK#)ayZpOFhp2%oO>rHLklD3 zwYFQko9#6&yp8)z8E&b{P6MCOE8#`Yp{Ap)$o_m1GW8&ol69sH zTc2n9^jJ}7k@eQ;?K?jzl9#7K(_(SJ(k0i?2DwSw`1N&ogy~oNRcL>`V(i2hTBW^{ zS702L?v7egi7K^~Llu}=N0DPD8KZ0JA`KxmER_AJ_KIS}BR5U1*i41!$T_Lh-KE8> zEhNqO46iv`&v&>YII>2}&$iwny@SKiM&(>`Jmp%$4aCeP{Y8#0Z{VkHU{Gwq_7hr9 zYPCjnv;I^nBst!aI2OECD<%sv+uoh(LQ>z@=ukv!{4VHz7Fw5^b#-ET1eobQIIB~P zw|6tahDt0wc&G3E`ZhP2NmWK4WMpox9qEG*4_X z2D#0xM{@XBiaqt~(9BAX7_-?1t(RWQ>61uw!^L~X(YQvib7-kEIL-{1CD9osxoUv5 zCns;%L}=om{*9v9GrLET;bS`bjJgKoVAf@Df`B{{+(^;$D65dh?wWB^^8eyS*KC;g z&Fh94CtSmKs8nAXZj(g7QC9UD7Nv^%n85k-$q6amfMOWDL}+~ldqZvQX=qlTg$6VZ zx@P(H(Yn{y8wLxCpBLX2@VkMW5rkl)Szy_6e&o3X3edt!ts?>67{~0*P*YeP!C{rm z5)gX`YZLbzhH}8efo|T{Ce*FZ9uSXC(UA>2AB+Rwbc*o$2wj=kRdU_B!QUA65 zlS{1Dm@{QPS~P*nx27<Kh(J3{Jvu$7gLQ)6l|FRq%PpeO9 zD2Ec$SR9pa;tAp9e}b^Z@%~xh%z_D|Z*JWD<fBXl3_(wmPDg5!j^TD6|yMN=~`}hBYzxf~jt^eq6|HuEyPyfz;`k(#hVM|6* zqVrKcFmal3Xhsf`RPs*QkP!Ne>X1UYNZrp%kM*ov}uId}sHT5g!;RDw42l62} zAWY_Y!0KtanPSUSMyA%7_J!u>oJITwKMA=Sxyti47dSF_?v`k_PYRJENUPe zCe)}^LT{bTI#pxMuR1ba!gjso51g~+z05Zdktzxdh}C`Mt-aH#=TrrBkLguJ2p6m< ztK=j2+d0OItloPLtMHR_f~`w?C*}ijqPOEMaAVL_t4v>?<0ORBHNCOuC*F|T$hb9A(?ngsNN#Y8QAlFkn$ zfc9WAz_=vpYcwjnTVFMI{c7ynwWcjbOd}Gr?BnGz-E3&NA&%~{0)D&b?_U}+VRml* z`^R;K0E4Vf@%^vnH#9rP_@brvXuikkWc%%3DICNSlYgXty3tx+72j;K^~Gm1)kg%_@1$#1V4uNN)s~wPa0jWH54v_uJ7tSRWEhmc ztba&s8?s93q}Eys--#_(K3hp}K=kXFyuIo}*DU&B4;xiFkSUyCVTCHH=-U^A?U#JM zjnLt)iEzhCjJq_~BLQVUguxpN@a8{wUvOZ|HJ|q25ClOC^+{F})k@*?aC=mFQ}O*s zxRi}U84}!;=4_^nrio0xUy%?=*Hp9>tz<3T+%@f6uMW&R`eylD$q(eSljMQS&3Anl zEz(dFKNA>D^1%F(nU;T*haGu2eRnR;uiSXR>9&Q=9dJ3bEK`#)945D>0_YyCHb9Nb z*s}_Ql2qfhf3%7*!Z2NT)CX*G1X!;ueo`!F<$1A=*>)8AkshKYPOTMiPQV5kppA7W zr+_^+-AyxWA$UvC4ya`4R?%|GhA*|vq;U5cB|3k6c-d#`r*_CI+LU5(JR<6g^X9Q> zl^Z(xvRGaoQC0Z9C*8^MA9{!-z|ujucV!g#L#Ed)y?$(LCM(J|y28I&V5D`Fm(12A z)0~akSXa0oi(6clt&>Alog9=fR-#JQHKu2_i>sS*#MGUo$&BwHup?Hk;$cu6{>YRx zYfv7KS5&oj;G2NH-)G8Dg|B@i}={(S{JngX$}I z9_tC&F@G6$RcH#OsAmF+BrB1VAouLGWv;PC4u{|XY;>*E)PgibqS$H?cbg^bhKY9G zdw)R|o!BwhwfLTdT?EmRDKD}yc*v9p=7RCFBY{%f^QIe|70q)LTBv}Hk59w-UATW} z6JVbOl8lnx;OZg3w5@qSfWpFHlTlGHSurj|q}hDgs)mP3SA0Wn;3=vsRhCNrh$h^V z3+CEo!FG>6!3#i@+gqLO8ccZgM~^uhmFSZn;hdg4I)l7jQh=C4M(Urd#vn~&AqxX( zrWP_`_F`V}cHyFNE?evn^B*~t78R4K8Y+GQg5dc~LlO8H8D#yLmZ#_o;fZ|wqpaSL z2X3(lThwI1Cio-S^D_^?uikYI&!gjaaO`H{j#Ntl_N*9GCaKBXmoWs-e`##+4L!~YvP#S%E z=^V5wQAl;Pg$E} z*Fw{Nx@cRq(s*EPT-GRhl1Lx~8xX+8dFQhmH zbDjr+!ykHUY}VH&PlU`Yiuw?MFhDrglZs7&sPT|J>V+%i%<6k_--#qB3(c;0vlhbho@DcA`y*CDsut^tPqL(u1x1 z(35Zo5w&SiOLb!o;gAkz9ImH1$??8noGL`U0my91=&J|3L5t@mLHtJUL;7lZZ$`Wj z{#LAem3MnT{8#TL>z}1?#l$7`)0wQI<-qmclg8}%-r7?c!Z@5(k!rc7y4k)z#B57U zNZ^Lo6IZxkId80GOmJQy$Z6iN8Btglcor54yE$>$Z%%?O<|->k_Th>em*N_cP_mpE zzLHXPpexL$|0{or=8n900zRuh58sY}55o&|7nYHfrKViPViA1lFO=CxyW3B;p%q2x z0@FKrHIRC!P!!|b-_(T3^HG)Oa`!C75=( z)|Le4mjI&tRVie1Z=zX8#KIabG6_rU0`+(_*A;&mpcL20VA%WJvklcIpu64%0S19F zy685!tjFeJa@B^-^=n5tTUdg9BcMt$vvqGUAw*iEDWaqA(G*QH3B`VYv9xDnv-+q- zf}B%NU7K$0TBclGHZyCf!3agqoNs6Ng|miBh?@f|aCW397{s#AA+(eaO&r}^Y2dY? zMy9n{`-L}C-mzq;hD7R>Cy-`ge1z2@P%+9ZMD@{39yMw9o)R6|h4I>)bdgG)n!09I zg-y20QMQa_g0cwLzar1SSQJSZM6=wOdBXr})jWrg{W)?mg7|SS@)BS1o?J3LR3_N& zb}b>4Di${oHG_SnLDUNEcD(x}x5Sy{WGX+&LO7umNLH5FI(hox+Z=YTFai*`M9a9i z9J24AXL;VH)VHOec0dF7FzdeepORkZ!DWi%W$rYE_csqduDJ72M0(3`GSPi)Whq2J z?Kmd3Dhy@3s(Q*YG$P$RDq&iLN3DQr#gMtcmm=M6j;0e;;9wpe1#mtmpHkY8?hP=m^a zss}eFVJqytfnmllQf?S3-KSk|b|-49s0jZTkO)DYL&HjH^eLI76lms-fHJx}O!Zr%9caE~(4wWMW`>O*<5Roun+XhwD17!lTYlJ3sB z+I3fgSdLME70eb%y!s1y0yXb_`O_E2qUniuh1rz=T`F;tpyH<$FkBt)pBz;}wQ^c{ zTsfly^ImVTPEZ#?raE^zvXAEXhmtk($usDX!;Iic7{xqkv|8ULK&!z|6(o`-tS}>1 zHu%F_02kJ_t=&4xSHutX{02)?pm-SP(WUkdD=K5M(6=~Fiue+VQ36Yd#EIh(#a>|Hp3=TU zIX(>hBl%@~B>G7eK1j`T@53O=2$RQbI5ZLoMbk@Kd9++VR;a8WHk!3sD6!gEteDEO zWDz?6Ur)0@wgW%o>3zC-(qF8#y9G_Tu>=E{#YRnD%PDuN#U^Lo(2D-eR-am5pXAyw zBP_GVbukfc)^joLx0nlq^Fm~S@Pd1B;_gT!&t{GA^74K1b@|5BDEe77nBAj8>zEpV&lmRLlFAf2%7t>PTyCOaQE((p`>JI@|N^p{1*x^ zjl=2@Eho}p{Z;}`D3|FUJhPX0zZizSg$FD+cj0@~*O~$5)Z9d;v@dXduf+$+>IMb@ z*&ehnEO(qVqix`#XI)&9Bd{`rc8=MxAe_C8j9gID{A#toAO&wZL(F zSy9Sb31}q6jAXP_tZ&w`)>ky+*~%VQTiI%@woQ9N5pRM1F%X$4BmZoW*sys^@Dd_g z<+6bAYT@8vuVk_~P%C~=j1`S`N2KiZhfqezU-reDgtXf%>?0M32B+V^yI%R`o8ssj z1&8mr@R5Hb+0$&VVPkA*xy6em2^16G{Y#O@Dy#^K39_=2&gL$C7IX*iO*Wc6Xx^hX z5tv43oXo0cx$k#ro*@fA{_0TTDPzCf1?^;L;h?w_r=Cs}8nCvK)zFj#``6?avH);k zw)QUHIY>4y9=sAdh_|V7uj!zO_Q}quj?#sr?P$wZ2Hu-i0dj~8(yZu%SX!ozBx&w) zkjeK)lAFVrxN|hE7E6C9jg`#u;_16x8&R#^!x2+Oz7LuaA}(~RAs5}8F3YnaS5&28 zLBA_ih0KrAsGX8{GGgE|5!v8tAQHKU7oJ!|KL}8UbJ3@<^#L|5Ws;eCds9*?xq)e``9f^AW z6(CnouJIkJ;DLnl_>Db??vKA}WiBh``$Ya^P0pTp@94{@pR|`yEvVL<#J&Z8l=Q=F zmcc?-ITebV7t4k{=qain8au7}^G#ZF?=;E4w$TIh)}o^tcLW{Q5K{VsqyA+{h0-Wb zBsH+HU%POYK<5? z!tCH2$?KQh1H&xL;p_2d{BJ5_2d?IK7@q&Xt=)9qFZRI?k%?O9G}bQ$%Ndl;@QIe> z5*0pRR4g8e1y6?%GBt|lfbvH#r>ztIC?Si=BeH=eFTJcmGUknY7P!Ny*Z~_x-mx~G z;`3Y@OM`Ls&!7*d8hii{T3;^&rPM zqw_l`&mz8>;X5ghaC8(&wB`GBnh2K8R@wV>*s?u%1)?_Dzs>GX^nZb=seHLWqYCt zm&K4CfEp~15%5=3xek48bN#D;$dsNO&#c9UVk^{X0@-5PxM6)QXj;tiF5*z?+pftn zD-1gFH3fI`L+}!j4bpeKixo}e)b!1=uSVHo??FU{RcWzg%lFi_j<^4`zR_xqp1Z|} z31E7qcxbBpa8CAPLX&zJ+ip3|DoX=FVSKGt3-IgW=(m_QF@ws8*@8uSOuPte4ojA)TFao*MmK<@<~~3`=vj72 z39!|s@UqR&?H%mJ+!m3}0NnEw8aNc(^HOY7*bd*}D5-y4h0LgMk%Ob-k(MMe)}A?S zp1O)oTXsmx2o|R8u+cm|9oHl_ZH)?x8G}}jra+CSR`wS_ZfSq6ybEc}uv(=}%|rDJ zqhH72DRcy$4Mj#HiBk=oazYdZ+}Aa5C7WtXDB3s+ZBpN0V;`_1Tx*&WX)q|F5QmUo zv%~P-gIU4Sxsx%}gdyzJ5kb)8vBoRnUfpqI*J|C{M-MJ(* zY?z3pDmiO$7ZubY=2R3Y*G^w2teMu(WVOp()A%yELN1C^$IwuK4~b4Sl}*B0l+_AC zXjB>oU&s4psPpQcalv5-jx$A?2utG{**8DSLj0wrDr?)cOafm*l5xEf9`-o)of6Aa4wpJjO*vf5wn99@`(l)7f1As- zvA(g@UadU}e^P~J2X_(Y*Z%?J&0dDOmait;i!=G@aumxV_crJbJz`X^W zn47MZK$e!4%1cYwbJI*ZM!>VQ@QD_Jl5#^WP+MJ-Z+Ia3q=*`brt0j%ocA)BylZh$ zZZM5)H$-9*Qr+HZy_Jn5%&V!45@0ZqK&NfDa-GeEfLd)QH! zODSbWc$vrfPe>Ti(NTXfOnXD9Nump*SEiB;*=#Jo*bpJlon`#o_HBK)8(?Yo6#w&fXvc^n~jD(}n znA6PDeAS`!DwQNtu3qQ_Uiz1T;x-4)TOBBLK9%otxez*6&_xXz-}5Sa&tLH|pb+)i z^Xb>-FYOd3y<

    &6uw});rAWza{Xkx}bzjdO_CEs~w=S4GPtHeho020z>XTN|XX) zMB!^0OuLXZbxGWW6%{Zk*i!MW1v)CW`RCax8$K&|L%?(in@Up(w0gZDGI7JACaK8B zCPE1@$S`WFDXk(Fw@{(#m<+J)BDAq8Pk@Lb%F&T3>SPgHq=?VacuM+Zf_JnRB=lIP zd^?Cbb0XDo+7C2b~pat#c^s0Pri6iJe41+n5oKw-@%2nfHi5pqgj+bS|Jj0gIAe;wjD;I!P`pNw`+x&UtoGg1|qv&wmF?| z{8GOCx-e7iK@BalR&-u8svhqaBVBo>acb9+1_DG>J$RIptVG zZWb#oPwK8zll{x^R>I2dPO1EJbGH!#)|Z-T^*AYW!bXho0PIF{ZKQrorc$yTHdgC9 zvJ6Sdk~X3o59%_R0*%I&=f8FH3SC-S89Nuj=(rP1`XTrc#)`rpm9Fi{7K;bXrYI@i z$Tea)nJrQJQnWOs)vHso{Bz;qL!iNVUhzvHs`;}=wH>_UYWUo!BxovJ-EJw+WhBeUr>Tii&7W{^P@oo2V&bh1XYOHS>#+! zUKUPHEkLM3zsU>>nH(Os+l`LG*@|J~1h=1mxd~9+D;N(>kH)Wh^N0SsES4wq7s$CY z$f$xfY{p&?+ZtH{`$z=)@ewk^<({0K;o0{nda;oH^%#0b*-~g$ZXfi&BeoX{LAg-6 zSeVzHuY3U@Cry;vwcsFpVNN(V11#pmxk!oj2GP&M)U7Qb)VZ&T5? z5Cf`v&r9-Nfyb$@ZQcW^V< zLbl#mnMkxqn_#C^u`V+Owl{y2HK{zKcE$p=IFP3tklCmOfDEZNLAmN3{ESq-^2n_` zC5@hO`?56CEJ=f!NuSN?#`058ss!;hF-q-VZE}|>zO#mXrBNi_b-~=dqdmRgGXHMY zE`rO_^}N%f2sU7ap!}`QtZ)8_u?a1 zX-S(|n;i6t{k9y3JtF7{^g>f-(nybBAHaISuU=aDA`1)jPQ~+rLXj~LK-q3TGk)7e#l>hopDTaCJD&#IVgawJ(iN4gACSLODgavOk_ zob4J#^nX}Wq5SKt2AD-tsf3~dJT*p^!XyN(-+Z%{2EOLsoCaiOw4UE0D#5O{6GZA= zbcpgwrrHG}W1dwRh_=G9#^46rh)rg?)tyicgc7xca)nfQ?`tT;$@icQq^zuREuLZl zl3Z+HS20odxQpoov)~X|=!4$7+_2!`w!tHC1p{}bI5S?4iC3i#4`l5PGCHo%-wL4^ z!Oo=Cm9zDTaf0P60)|GP%cW!bJuMm-J8TSo#uQ#$ik2a)*E&1fLGT+!9QT}^Xjyma zdTc?3gC$B6cWJV);)E`gE5=eo&P#d~gEkqk3_!%O|M2H1d8Dgtq^w1NLiJrxU&n$3N;1t z+)mSVk&WHd@~~E`)-_lxCXQurTWCZwY!4g^c0vDDCEMAdurf_q{5G~8UySaSFQ@mN zbxC1X*8ys(R zDU`a&ot29Z-0kEb9N^PZbOqtmXca)<@QQ#VaSSZQmPgY3o^m^t6LSQ@UOp$tq*v`} zdP1x9n7u=!b!gDW&}@pA_N(XXJM@p(M!=D!@Qw@c)0WGKBL%Tz8Ww|3%I$t&QAR{b&v%& zXKyNpI$n1HDgix#U`_Z_a&klxrH;5B#$!H=hTY`7UK{{xl0Z#(4=#Ioc`<8Q$3P%a zcn*}UDDHo6VIkX%Ow`e51LQli0w&P6?~;_^M5$EK4 zN_>X{>Ed&Zfx+eddC|{JqtvqzM`U-6{Xf6n`S(Mw5aWF?%5ePO5ON1?%X$NY^!S;q zOumiB*sMqZtT2(t(C#8rSy?y-fM8iYQOZ=eY5^pJe*}|jy|!8XirE*^W378N5gmDJU7*T`g4Rg3qr-3sw6^<|iQvW9u;% z6b&S+N*gOjo$-8LicKVEBO+tnu?!f-cBX}A6mL?v&WNQMTUr7}Ic&jq}Z#Us+O zXr)hmyIm!f`nEOY@sq2I$&?i0o8UYH(sd!}07-sORD z3ab6pols0j3IlVY1(boLHOI-DFl(tmI34M?V@#|@nL;BZk-ppQj!|lu0z{N(I~QRA ziae3lQ`nG8WsWX^YO$t06PRIrOW}NC=1XAJNPHpbSWeb7m>Jl^hQI+J;(%VlaFuW~ z+0R_xoSVCes0CkuS>&xg6wHe2hBRLG0!8zZ)*3N|8Z8K|9R)T}qaTij0|3-#l`%b@ z$a5mF4!960!iYHX;K0FtS@%LDi@@4&c%{aZ=6fp^fLTNTEgV7>KTYycwwDllsg^_L zuToO3fkwUX`+7giD0CCus)Dz@6YVZ%BAWDK4B3;dN9{)K>#wf639^tU-P2RU!ui;f zLlZ+N2SyfnpEXkt=ddi)jN|_O2j4#t_hh(GVwQX023WnL&RZOdj`R32XnpK3j3Qea zj-Qy-h{N=`IF~&nMIe+kB^(tVwjV=dH1E74UV=5Ny?kf#!>}gwGS`tg09#rDrb+hD z<~S)FJDf0X z1`;r2VXSMz_Kv#vNm;hp0d}1PY$5CLx}hak+gBjPxfj)>Aw7?ejiyO{Ym7SbKn`AL zLg;IR2nT36Gg!l8OekVhkt)^_`z&9uf9f2_u$aKa3Z}TnaNR)v!2ESdf5421Vuv5e z>if)R{Y#QLlG_*(fY-r>gslx@#suZoXg7(vof$%$X~dLu!!-FDx`}vN5PaEotG;fA zqcSpt58QNQTY8nc_NN=w5emquXCc5WXIRm#g^YS6!j@|300YN)ca8@m0DK^=G`+L3 z%P95}<`>~|NyQ$eEcMo6uxPl)8Mz>*udtwfzY9ah#A&p(g6%>c8goEe2J%;u)#Mgq zMim3-QK!DS*{XespJhQ(qDLT+_OQkK`%!Or9g11?W>6x|EI_Qvp>ZhosH24~9#p<+ zor<5JG^;8#fqe4->dgvtsFhpim!npN8X-!927$ZNez*KNmt%o{#E#IHstie1bsiK9 zg%$qL6j0dQh(Tdc!ur_pAK1%)d@VF`GwS00_sWFWRE(Lbf!H0BtWgree7O;6LJ5q0 zqQW3l6+PmKL>PdDd@SkC4lN@w&%%$wgeSBdvYazC2yn&yiHAfUrKAk2U;?m{hS&H2+&i&lUL{(02oyg}^B7z6}(AWNw>>fAfp3u<3L zhBGH~~9rTk8Qp zTq0+jSt%|fnP>Aze`h-EPsSZ1Pc?ap(RVRusm%%*N*cOIs@-uF`FBSLT4*Q(4c$@4 zK1Io?Q?lxdPmcZfaa`QjTT1fA5pY7~=8fpY);R)Ngh<7)${fhKQoMlz#Z^nwN)U~k z&3jiqTc?IWka87Sh`8Nz2<94^h%|&18*{`9%q1BY{^41w4oITOlFw7Pvc2Ic#jcS_ zFQyhi3mgKqVaLtP%*1Sil2hIea3%m%B5C&Os^g{Qom9UDjpMy+S9O|gBRSdp6oVBb z*YZbl+azu{w2cX~MGgsF*$a;#^m$hO3ZCe8t+`QMtF6%0?*C=)J>a4`+P3kb!(u_P zYjiEx5d^WW9xT{mi@np9CT(SR5lbSmcd;aPCHAg~8lzb~*t=ryhFGFT1=QH1eAhka z9QJ_tnCJQ4@BQBY_xqn87c=+VGjnF=Ouc939xv?k%xxj~co88L#Toc@)+v*tllXiIVHc?xJcdC-RNEsvSKyZm#RS?Qya^R z7oVLiTad))}%j(MVd?o((9Fkov%<0 z&&MZJH6V|Z$^+Mbp~Y&GaS#?ENc=>PM|~{q6aWo=CC-hY<)_)T^qH|wSex(0c-m88 zNg{$;P4v1MG)d@P6fo7FYTvS8!W?J?93SFx-q2XD_Lqi8W zPMctKN?LMQyY5|kb%RL1NrS)=TPj4#xetsN;P63Tdf}wDnyJMU(k1V3+rE zVp3z>HAym5>x>O;7u7ag^o`*o&Te&(hk&$hL?gJ$8ke4^L^Pn_13G2zE4p!9@kBeG zFhIn}l8$a8T2myoRdqEk{1(D0UKr40uNz90WUWW4W2)3+eBWeDRCE}&V9@3+>oO4b zS{AH!gGxIZc5Kj)#{Zsm)cXeOH}tAcTk3q3eS>CB^H!k>qt;bg!D)suINcJDeS>sY zd?y;mLCHD>iqbfhPw+66j5lDw#TRMlnqN;kp_%6&sx4x|Ik(!fc(FD~ukqEOWEr)Q zN~bIs;Im{|sWsOyf(bq}a5QDSJ*PD)_$8gR(k3O!WVx)W^>?u-V|7#t;Q9;fA5p4cx%Hs*70ZO1U4Q4gFaLsUC!`qVbrCM5@wr1zxB#B^nQ6jeYV}Yg} zEo20=Y~32WU2)=!H0uPQB6sc51;S?9f`Y-Y^vTfcQ160~1}Q(nz80h(0wz+XA(zn3 z*uM=yjkVA2iOC-CrE}+2_)ch-s02W7H3l-Y@{`*I((sNS^`ja_eR}SEHJ`c-?APEI z7;5#<`H0%wy{#v0WzVxXRG+o(){A!s(y|)nHS(rNS@O+HP@LOcQHYVRvf(;8%C@FV z9tNNT=-j<)8-B6@;+>ClG0K}8F~{cml_e1i9sk9TpxrFB7z~x43&7?Fip<%{!>vJ&82Wm-I41IisYNPdXCCm0qB;@70$L z7|@h25jPz)s1BonG4cH+efrvg2`pw< zY-lHj9o8)&B2gv>!x@w_pa9ckj13RQHDAiFplZ!01rP~RK~VJgpu3SeHb`V}A~)U) z-CLhjI+1&+JjTFv5wdcXs?|KI*Qi;mcAdJO^}L!k(=~4)_zxI3XmDWA$WdQ^L+f1l zQK%lI;J<(aV|Xc@oux%cEI~KIDh;2cB2P*B$XBG9Z>$kFzPD=Gps^Oa0K%~ES{g~J z_6lH3PIE>~7WsUVWE`j#e8U$y87>fHq>GJOS9wIkza45135C!*!X4>!f#!Xr1NWsu zV;c01S*M1+KCQ6jR@(VW0|YJRiZr4LLvsab8d|Z|cpq+s#o!FnW-mTwIIo0os^hYO*{m#dw3Y_sHQkTS&vv=+ zh7Nhd^Okp@(g=(Xf^#RK*jI>dpa&L_qoJV$!rVY~YP7~6jaj>(6;f1kD649cwic>I z$W9Cp>r!X0Ffq))XaL*L4ySh}7Lb3BqA@qK3=dW?&? z5(|dO9d&f56zHW`msVT_P$1o)q*P>lK`k$DP<4uVE?xP|*FFS>?8KXR)X;*Db5>d{ zHmCE`LXgMdOpr8j;j=}O&0|&s$qET6=*%O80XQ^8S{5nQ(uOQ(!@{<18VB=LPdun*vKi6>SEt^cnJX>VB!!b6M3(4+HA1M= zkSEo7_J^?;lm&Pq%~jf(e$)ogO*6F^S584IaeT~%fkHcMe456sX`;y}6>=(!=pgb=pyY7@H6mOo99`s#9ntb>Cv+c>4&v)#VksR);x5w8 zHafMWY-EeU#j|?8MFUD!v89o=rC>&_nj&Gv+Nzj?_ZE^~IH;)O>s9}9eT(&ga0nMd z;`3ASl*T9c_|hZ>`$n*CC_1*v_j|~*JaT4TIzf((4QCiwB$!&!j*^zr$b|3n9)XrKAWmPPJ9q4X zbtEJQ3Kl3yh=eq9SU0bcB!jC+YKlf2YKb&Ni<2J@x%sL_3*^bquaJW=A?!j)4Pm|^0O1HY$=3u&m|!yr|e ze8tCMqgp`U4p3Vj(8(7ARA?~o-WeMv=%iKKHlWZ~^|UVUwLuR@P0VmUN#Td?X?TR5 zolkzy$WzZx@>-gZVd+R3mMez>Y3+k9t3sRELDuQYk3Sfxv!|17sOr+yztUC(iiB4S zc^^U#sFvK^k03OM^U}L`^i8b-iY@#}Iz4Cw7Nrg)NxiTL7kJ`hMv~Vt6g!#;FkIt+ zenk3^v>gNUGrS1X7OLrdau$F)FfiKc)){3%x^x3uaAWk+?pyj2kX1{!%1g2UI`u(u zP^NhpD@%1eH;B^8q4euLdGWx9L7PFoN%Rlz!CH?Htp~(jp$0?+zjI-Shdjyb=oZbC>jk>@s@jx z+%1V%7ULT}q`ewis5^wlRPBJ4-P`r*j8!hI5)WckJ?qr#ptY_vGEYfmxAIf@$OJ+~ z{3w+~!m9H4Q#QPte;0_Q)G|aaypjrsN^XTnw7l{w`x5!^j_*q3lPu{AP^m&+gZ;mJ znG`u270+$Zc@&15Vkpmisg+~c&lxKBKeW0^W5qmUQ#l8ZzZ8CtXRt9eDheloI&|vU6>2GQ$+2=vJ*iih-ow|~Saoc7!myA=s+gXV z5I*;#V73bN9jHb=F<6G?*Q4VeV+ikXnR<9Q-KNf!chHnlgDbESxptgxo%s~gBg(^r zIcuHyihzssO=xF^)YZy5UFez|$|=0mGlXV?o=FS~r%@Pd$9a;zL{fj&`AgDgFQ2@_ z)U|D3o334Ou(s95g-B;z=*5Wz|4z&m^C~Y*12_BAiMnm_$(MP92H)u%hu%U)u zu#VGDbhn#lTNDQx-I}li3JZW-j4mLpU-b&W%{M)uiw!xAeR!RF_TmP#Y=Gj*HzZAO z=x(T4!RZo7lP7~70_@D^XIN0%twU|OMIgC4|0FnWu1L|WO+A)W4Z*yi!V?`3g7`t+ z6pc@7fZi-9E^}dAr!G#^%D1RUX9M_gJqW+Bn+i+S37GI=IDpTsh2l%R6#JfAc52@h z-JtYwP>-;$gM_pOV|Qb4Ytr_m6l;Ug6bn_f^yV-ddTA3`M!Z<}eO~i^Z->^p|im$U#t6krEZvpl(bffEXd-i0# zd-R8R9vTu^P4rbbit334I^;Ljl=#foDkr0jJh^-IXc$AAn(KM-K{gJ@M95!@XMokC zTw-}9A{DfDgEdJ=HLz6OnKrzK(LDyCVYypl&{J?Z6&fDepT-wLA@ZfwBEGyOzlJ7< znn+7hdZX>WSxR8>Q7}PY4OF~2lx^TWJti0hm&To%eh` zi2|!={-pdR`7yuo2&=!=nHk@T2>l_!Az?9;P`XPmphueytT5jkgE-`{B+j?a2Q|5p zyWA4#9L6R*_@(ph3w_60rjyO)}OQz#L*}%4+AMuOLR~IO;^Wht2CCD>>yjKQY9}50VDX6d|wE4R`S?|mj-mfP`1g3T1~ZF)}i4uIxc&qn=opk zPQk3DQEp57n8ULLMN-<#!?Oy)e;g2_ETlDiy0;v~gAcx?c{~XPcvHli32YFiGjqH_ z{nPRwJZ2++EA#xRXW zY@YEL+QcNePyx$5!`8Mf)6h;mN&XIT1||wr`q9>51`iR5FVlA7_XY4w?t(!H*9d_g zL2hRhacb-Cw5*u-$&sGXiYaluTgzsE@F6GXJeW$T@-~dAad^D(WtVaR$H#=d7~Ot% z?6-9L_82G5;{QrcE;YIItu=@&x@so(Ga-k_Y+vNHc|K@-z3fHGgcFovnktlcS5XtEO}rr?#wleMZSwzoiVbaZuBF?Xp*A#&Sd}=Pur_vwk>?v#_0ZIhFe z4$!0c&Gn;Ll9iMp-}sX)@BsMd-wF)?9!e~wg}xuz6oiM(}nob71Y~{oliPbFJ@QuCf=DCdIG6%HI&!UoLfEf6w{9hm)#zUsc%)N|WOE z9{hPC?a4qt*(5u`Lq(JQYry`y&tsX&-yW6yH`x6Ue%be^-N>uMvPpKrL!#v;|6Ryh zc`e?*WvkXWchL@_o2eOmD`{+<%M{U; zw{vkXT+y+Vt9@Cj*joH^bMr4>J`O&c^sTS2K*wa#*)RYuoegB>C^-W1Asw(0q<@%anm2p}F928;$K0yBYmz%pPBum#u&h=Bij2iE+Y z1A7X*1x^8Wa4Q6q1S$fT;8p|XZ!jMK-mqT->H$-Mxj+Q41XvAh0e%4tz&>C&Fa|gd zjJ@K(j$LzL=YZ?LD&Q{g1b7ML0Gk2l>qsNaG@uyl!>>B9;t2a3_!~F_IKZt4P#Vwz zwE!RBI(YYiX0R7W_(+($fdjxY;3RMnxCPt?vVk|iTHr^(7Ge0ppX&Rnt+H-@wG+2f z`wC&gNABc6?IlLA1@fq!mqxcAvmbz&5Uhtl@Z;wpcp*@e2muhzaOZvg1dpE=j|%@;F*mD|Ax2V=@Vk}29T+D;KkA!M*-Zw!HdA2r-GjM z6pnuT$3KDP5YJ>NC>Zbbk(LBQ=*MhZ3<%=F3t+&j9e7Hf|X)FSP}4`lNi(BkBSQ`3LgLM&}^CiaRZOnTWNJG z54#u-haEYgMqEao_g56R^7MHEfp7A3x>5Lsj{h0hjU;FVMtw zqvZ8c0X+Qn#Hg@gfg^@PB&zxxUx1ew78wQ241vmaS0!{s@T5BSaVuIWmzRhgAbE-e z)8_K9a|L1^^-~!1UWCD% zd!{k>Ww3aICzk~}9|EzV^{G$caQxotVzv2z7jC5G1QU*%K@E+S#eBho)DnC6KJGjk zfJeKV=l}p-h!k53ji1B|Bw1SiroN%fLutv+VvXp1k{mxU(ww(6H3lycTEEN?)Q{lX zkE#CBiV0&)z{47mUX}D*Yg6#d!}7+ZFq?rVDKGk{8ZjMs&|Q?jxbvXRiH9{G$oW5d zT7WksG;kR0=gQwd3K9=Pap)8xRkNzcU*btSvrNM&+jF@s!87WkvF#rlZu16Xt%xU| z@u717fm|P#^yb#!84}_mP+*{KH*ad%fM>?Wi4amlhblQp zaq`1<&_kwv4uU6_`B>?!gOz&-Je*!hfI=ia$yL=);Tq@z=(@QAo+9AI#TO6=ev5)f zYZ7#{infufpAQfYJ%r?}BgAIMfDd`aXEe9vkGE|4%Vsy(43bS{gqI@ITV*p%HZx>X zOOqKqL9&@9o84?Bcdeadc0*aE#~@4dyh$L0$4w)d-m=up%}t`+ic4mCd6}*vnJJ#K z*+_Qxm(BLFNdjyPUu7Ia}{-=WceDTp! z@l#KwJWn3!<-bq#9Q7f`7@3pP<9JSv>)Q`G7bZHgc~k!1K#vLk{C8yGcbA^@ul={k z#~-Gmr^xS8zmx0%qZsR+g+>M_C7XZ3{0nf%c4S(Zk257+4bb(0+Hku9x065@(2AXC zHOQTCTQ(aY++g^R1jrw`6B0mEJPJ*`QJ`PK)F2Fjc;rV7N*lRPh5KWeEkKh=Xb<~r z*`4T9%%xCorJbHZwv6Dte^0KEV&I=zth<^(#U!gs|g!iQNS;V=4s7Oq5ooSrigAG=Yy zEpY!Q_*cL2SJnHfMmaH}732?hL!A!z&CkzIA6LcQ>=XX!UH!o`0p9`2yUF|m?^_Kw zTREPhFzW-`;ietp#F_#vWL{6$+rwT>{+=hpotX0eUT_~9=ESA|ZALh;C9+9&!UoV^ zBfPteb1;oq3?D~v#ad0WSA@GK+&>5M`zcV^)dj@yDgXbD`|om^|5cd()9+6o?!@i_ zgORs?0KR}dP!aWQCEUM;nJ~(U-Gkdp*qvZE!#)u_HL4cirsn@w+CTOFzB8OyB#;D5 z0_Fp2fuq0`-~sR&C^OTEH3s?uNx*#I7vLyx1$YgVNr4}rFOUSx2Yvyr0Iz{Ev%m-X z0!hGpKzX))@5Iu9Y`|@v6Y~bT0R|ui*b1ZrY(DA+;13vpR3IJ52HY0F9WVf?Ksvw{ zA}$~ZNCDD-Y(TpR@dL@gRv-v4$aISAmIgB&$OhPA#1D7_-2elS0&E4+foy;+LA-!J z5CkLxsX!W#0kEau1O7k|kPM^(X+Q?RmI3mUBJ;M&{B+q*w(QRhezkx%;16^If&c@M z45R=9*Eq2lU=%P7SPX0gEWk}*Fc63VrU8qAjlfCZF;Hk7 z`~sbT7+@N(5jY7v1`4eQHX%-+E}#QC0Rw>;U=%P7SPX0gEWkI}NCr}YG#~?DyTJ$ifgm6m*a~C-Zok4EFaW7QI*<&c$n;j2X#lxr0NDVuARM3t zya9ip8xRB-fMg&ANCnb>bRYv@dk_Zj2ZDfPAQeahG61$0e83+F0+c6P=DEpyZ`n^b z*`EPsGLQnK0$YJJARWj6vH^PLokaU_#)vkrqvi1Kke%imJeh2+t5N~^0`1EQ&V`jfXhB7=jEnW9i8*)@WeGO-wT3m9~^dK%JAj$<`5? zBoWS0y2!=KG3VnrLlc)Ltq8CZhzJBLNhTsLX|}P4skg%=9jp`_xoKvOrmz^2{FX*~ zjI=gf)?{N(icIWz@;yv8w3%I6#*>}QDkr-HZ0oOKwsFR?55HtaLnkHVRlnMZib#iH zk?~PRR>x%Hgu_nc;)unQVC-3_Z$biOD^A&CV=leg6ALRoro1FlDk)82eh8yj&B!gJ zxrqrMiAUq9H?o#_DTJiG?^rHxjgX2}aSdf{6jxZy%-%$~765icJlzk=+JdcE@w$W| zVXU*s#u0gzFvRGHvyxaFWnGbbqz{dCGuhbTnpK%Vbl5u|&HCV%;|r4A85fyAF;~2i z^)=bKD1@JVbV7(Z}7o}16vK?P`xD%}6%XWLJbNbO0Zkcc6{N4hqQ}__~k1kv=eV47r%ip#~fp zfq!UFu#bZlVm8cVi;^6y$FUZpJ?SO3BiE6rF5E<^fI>E^li#9LC{|QeEJ%17v4B1i zKOxM31X^A2E4YgWSqUXmM#|2~DBNn&%v=>x9}&x@pdraatN2D^9Gj}*bK1-tu%L{* zo{8^EHibl`C(_;+7i(ZYP!;DEGjkye^dq87EJsNpiU_qcDz)P592y&CK-G+6D@;s9 zpvrO%mL+ilb|rq5nnbFoHVCFx^B4eUp_$u=`{#??P)-ogy*Cwzb|VSRh{ z00B#qiCe5}a{+9-kO%|YhHu18#0C)!6s%x7hKST!3Dn-Ggiy90KDmhkYNXcx2ygnx zf-f0t@^Q!=VwHUJe&eL%Te3^ON1(+!E&1kFylp78RcG-w z$%4EX;oHQ|o1Mc~gMtsELgK3tX%}TkVizg3WXj*zm)$_l(MN?1DKG>Nqt@1@A5xHO zrp}i70YHQ%2pm4Wd%Dtf~h+B*kI*aO%V@DH4;dz zpp6k-MQeppyQ9Cbx|`{|Hcy3#s-Tskwo)H#uo;j1kt}dQ&ttIp9xjpvIcrQzKxMPp zfSgsV__fsb8f|{Xua#}|ZQ~3E8w-6~ZZWe$u~EW{%-JB*h|nE1W)c3TD?AyMJswv2j& z_*i4G$pMSxQE|35@QS|Q)`m(nu9tD(3*NT2=p;j9^)zULKU-TW#-xxxEWy?eJtZ_W z$K#NJJ+zfY+dAOu(!H?JwvMoIEpfKa81`^mf@J6&Xsn{QEsU;!Y*f6$5*%>zt|8vG z2#q?zhS3HXCmgMZ#-aq<;z$4rxd!_nWOd)R?x=$paG7X;Myl%MT~YCYCEE!Cevv5JED+nlt&4nM!VaTN8AEmH1aUo-GMLJ1~<~V zVYF`yH`#_lfLBFUK(*l2agC2w%?1mWEF~+Bz7Y=Cj@{ss7N-ygfXK;9dUz3Lh zpXMaeH9bbhSfmmcV0qHUPqQ&E3+Ys`jKQ8z9py=VlOsllt}=`EjJW3Ene*@*QLdoj z)DeAIt`+&j4-3-OW{%U*^{6N`Y%xCJj;qiF#Q0#$#|bo9L^w*RbSi~o7idm0^vYl{<{@w4)~pl(GZL>Zm? z;1^34#2K1sG)TYDC76DLibQ#bK2@{P?z>z|lA!5XL!$#p?LDY-aAp)2qy)D-;@Yzk$T zsMz7Cq=o)Oj>t9|PMA%FQCcJu?|_WL6dGE@8);Fj^t*zC4Mose$`*t(CdL&Rf_jIB z8zqeNb4pIAZ&oJi3#w#$n(HAS0Ye5JU zT^toJRuUl;D>c`Co>5S4lrX#)N}rlS>Y{>^ilI@HO!`iyxZ*wNJCP~XHtc5O?SMP_ zLaKdM8vYZ)!`!DRCXx~x8yf1qJJ$k^G0Nb65HWHS=g@H6*@rE8 zB`|UNW5kdez4DkF=669;$Nd-*qykqSGsXNail0QNq@;eSJm!s(AFGSvCmJ(A?q{Il z$LfN7+QQ)Akr7DIPc}TQ?GB;dbbp~2M6=mfa^;I!sR(M2F;f{?p`gk0m!Y$cQ3FAWa zwVR;CjzD{aaRe8@)M)jQgP9ePeUNkqopp`YrjMP_W<%RF?lh`_9L%-iEs@cNy3wfm z+(hFLVo1>Y%}3)PS&+66gFYnI55q{shAa;;48c`s7`Y{e`e7KEmqwUGj5qXtixEb) z@t8yPewTR6WI>7&;|)+o=XV(?QmpWY!&!#jv1qi>^Kv_Gcd#E87uT>4dKKA%>{KQe z4Qw;bwyp~08I@=ktq)amO&@WK=K7ZA*LGC7?cp*g2uja00`iLXxZWGwoa;%aAyd1GMo_7@YTruye)mMCO5XfF{payD66|VXWW{ZI#Q_5=$-yZU3iBa~utQI2wNu9*9ZfBjJqjj-4mc+lYO>!=gO*rR zXn2JE1w=k9$`GS>z<}Q#M=xR=D#M8^!yKy6U_rY0#o-ObD@p&I&ciD-1tw8OI^$Az zjOrm<3C}~I5#yKK;7e)Hy*hA0Qwt%X2U4%8O@pNUC~91&k95N@ z+AbV}uv3UVa(GNI+0VdEW6D^AZ?V^S6J1jm=iZAZNeKyh*Dy3eo}n~>(Yr(NCecQT z#-PRC5SpMbQ3(m>mytx2z&JM7itj*c6Bv${ctmeh>_|_70qWRFZbMav%s;FYvfMrn z%W$PI?6Z%>@sm=NQ^*u!RBS2ADd;DQ3oeDKb~P>7fpVaKdYatp%ef*` zMqvK!iJ^NX)FDR`ihk1YO0y_GW8-idD5MfvHmlvt+(KhQJ?S!gJ;V&q@)K9JBElun zK?!};Dfr3MWQh*G!#yo>~IrZwc|)Kz0%_tf}z8}khO*zUJ)%fw&;$m zcKS@b4UW<$)j%Z!1sh$XQX>>U(->>`KIxE3m0r0A!Ee~$m@ zkpC?lWH+Py*8_Bh-K_>=sS}`e0s2I^-j&~9Kq0`wX4O|Yvl2_3*;l(HkiDPmMs|f) zbG>BGgqvl9GiwiX*;1>$B;1Hc?iIF4adlhf%>MkrnRNt@;_tT6nRN%R(RS8k*&^|`taN5ib~>{f6c6Gx!=2*3vDKNqS}sBP4P=h`(fSUx`~Ors z<>mj>wEh3-`v2~?DZJO275WKv?uaw{HO-m50Ydhnt^zmqIJ1O<&g^S|>^~lIW^PBF zSzjO(P(Rl8wO~ys&8;5j^3<^K2wa~U9TOWDZx{-_a_0Oe*b9z@^r;jad|1-(5!P4W zOr)%vTfSlfTH~OZSM?~`pg+Zz-AU^=g#A$G4wa1w5x8;z_gQ=t8RC`w2T50P)*x-R z!LcDx5$1SFk3fFDq7M?oP2AO+be3$yjx#rJZbO4 zw`=!E;j%{`d^CT-f(6G!iFRYFU%TOS+_yX(jCE_0GnUP+)?vSpQu0LERGYUguoncX z$dzNUX|g}9zjp(lhV}h?f)LHO|RagbSHNX@o$+^G|i82E6 z*jM{X#q8@X$JfvQTxH+UqpsSfDf)+`_?dyRH1zks$@yME@h88xv68OQUw`bBXwT#Q|4+VX7cHqmIXm)ob~kUn+J`o)O*+U)GJvqg>tuuKXTbr%Ls{zjTY; zeqC_u_|P>I&r$l21vCBQ;}~`=Ax+v&hfW3T6viGs7V8~&SJ>2jadOvhX75FXq5BEA zcbtxu^PlOY_x+}nBmbeLs(v^;)FSS~#l#E8j%*U$*M-%{hpc>be*S+Y{i*j`CSRHN z)49bu-!*G5R(;u_N%J*-wRvB3mCurS)6O{W9^lbBextsoV`MQJOGDWf`&$0xxkhqE zqu~cywk{p#uw%zBbK1UmBRsV0+PJgN7v68$4;#~8CmKiJ?21Kn`T1w>JIaUnN*J^& z()VFX{p#n>dH7!3oOD1khrH${eSdOKFCNOxahKn#sS9rCu4|r$J(CcC<@G?7j`HS@T&zcl-X{+JD-Pq%XFV zY|}04_NBY!zHBr5VrR!Q*~x9L%ywb>Qu1QKyu5UN{(mL?srOU9P^F^pNv#=WG#%wG z0u%$>fs#NOfOJUGWUUfV8K??W2WkSf0Xo|41&|iC2EdRFE^G|25SRoIy$qNMTm$X^ zIY5<-F3c4mn%qmnzI?L_TLZiR+_t#j{DDN1y8~$3ou9^T@ctDj>^W8VMz9lm@oYaJ#Wz1+ywCsPyOekeGHvq3k)JLo3_I+?3IpW;g($bS!({TIBeLB6!+rwjTmRq@{Dz%JGM&%^#m zMHdvVS3Z6$XnLPrx|Cn#VG{l0F&E}^!iD*t{4_j~-=BjL-cyci&S&CO{QtjXzQJ#9 zaodG;1D<^X?cm-Ic=4wTTdzXnM=mTs=KkTr=H7Q<@8K^$Pod9%U+Ee8pr$6oifC9#8Dv+}U&!v~Wz$qt!#d(7iUlx}ifdToViMND zu65V2T0kpc0MM+2m9O|K$Xo}1M}gPC4Jd2zELm{4*Wd->eIrY2*gW`I36Pyor<8`7 zfMdX#G8*PqR>LO2>}kL;;5P6MxL(uBSNs)ZcEDZX zk-&Ul6yiGtvmk%-!OH<2)y0Uaj)oNm$WE9G`%S(*3}n=F`o=qm#cKGj`ng2@@wxo-%dX^cgc#X3d^6_q*@s z&0nx^(c&dbm!LMO`ErD{qd)5+jsoD^Os$_f3@t{E2iz+f8gMu z!$*!DJAUHisnciD&z?Jf;o_ysSFT>We&gn?-!gu`edq4IKkh$x_~)a?PcpNzpFVs3 z*Nd00UcY(!?(g>>a&~{OfoxpD6_uUb?yBg$-)Y!mnf@E*^Epx&=Xt2lb3YH|9R-7Ng9eP~D zR-DkV&9D=#Ab)&@!`Aegk6G>H&jxXj87P}%r+D+nk)KxHKN#=-N%d}WACC8t+ameB zYh?3PI(T^hZG_n`yE)-qCtz3JSqpil*e}C<{%I=`^4Wa{B)O(;|ckW5}=?~Oj;Jb$s4#Io^oCMwjKRLLv^T2iB4)6$g z4!i^G99@|!;0}}rsseQYU!WP#8u$|E0So{_foQ-8j0DC4Q-Sq}YYxmszzSdkunqVX zH~^dg&I8whI{^8A1oJuY4zP1VIskW|JkYcNRF&Q8!1M)hJumAFAzV*$80!N$ThB-{ z-FVM>K#ogKN62#9hJ~=s!3nITApz!a))8Sknqyc?a|G*w6J=eod``D9wt_U@I-Leal6`!NPnyE$+CLV6D^+{-Y|T8qz3KfV3sGbube{#$imA4% z-M+}@Pt8;8iuo+km9+~0pMj*$q~ooeR<%F1{XhL3j!~|xCeRKD1VWIGXqcm54uiQA zP{;j5rpaGxIZY*oxI)*DD|3WfJD3zUPNvtxOas($P`Z`0XM-1ocuGg3-T>VJ@=I}$ zJJ~P7?QdXwj4Mtnxw5(dxhwDY1Kko>2K)jXig#sa0jlYtN?^ofSJrL8e;?N2 zeXA$AvXawW*+3u?hy(0rxiY^g_$`1sJtM#)dLPV_GVd+yj?-OPXJGJD@DY~GexMV8 zouJimsO`%8-@%{P3|CeHApV2dQo6`K1#U`O{(^luy#wyb`L zDf3I@eP199AV1S(Gr#{^pKyO9yAQ|rpfD3)&H++^=Ri967l7)pllgxdWB$YU%q$?> zVz@0^j=HzPm92ug8>j}<0IdVQ0_eFN=2c~Moe?^xfhByaul`oI=S231Nlpfto~2`r z-+pLS?+?K{;>esn&+F0pAf5~{h_7?q6CEX5=+dhn*7+U^BUaV|=brd5p#7o&9iE8? zgz8i4DC-%iF9q(M{vF-*Y)sutVsh_BHLGoZtK;s;D!y}HanIR{qV`qB73WnI_HcfX zir+V&^svN>Vr;jcFRl!!D)IeQ{MVinHxg)Zh!^$#I?9dtGstes{(TYx>ttnBZ-HL2T+e=E?I`H>C8Zsrc=q zdUaZTUJRQ1)r7-8YNhb0Dt_|(g*V%s7iT9Qy3o0whr~}-@wLD2zWv~wc%{zH1rQeYL z6+gvzyV{C$v54JY-(*G?lK81Ae){&g9{%a#XwScv{?ag8`hK6|C#%By4~{Lf>x?*2 zw_roUAW(zlxt-JI<-bY0)i5=-Jh)w3I%ril5ds zy7ItNV)@A9zs}lSSqjfo{M3a=@iU%T^LOhHckWd`B+eY* zlrr^}Rtle{;wPVosnhwOs7vw--dCt}b6!6_$4^y-PpPQ=d*}hNY0ny+CnP zpIzy7_wV+L&IgB<_MTo%dVi3LALMnh_Rf9c_bZB(S(#k#pYi=w;ZxE_eRDZY{A<92 zN#93lr1XD|uT_Q5xL$wOV^MtOyJBEZvs`|diqGnxe(V)>EW38y2DPR5KgZ8_YR&(& z0W*6Jwup{<1N-(V^o8{M(p3D6j!k1{?-q})AMn7hiQGPZj-RRupIZM?z=2=H$lhL^ zYmJiI@6Yj*RpEo~O*xnSvv|$ud#uqsx%~=K@wJYEQ~4cYpTUQN2iVH(-{<)Ls_+@* zzrWmaoA{gio0HcD*OkA|XZTtbKY2xF!>}JkmlZP;2ahTt=f9d?EX`Z9MVvLG;n=19 zJpUO#L)mwL(w4w_ePAVAcg-NKTQ=r&F5ub(;6}Jhi47i{#|#ERDV9h zPgV0j?3%cAg}DAh^%pyBU&!s-XZXn~K1(XHXv{M4uFE&0swdZy-v2p%kScugMW^z+ z=7~*Kzn#-_dQB<3zlzWP-nuqzrnq?Z`InMU6heMD|wlU4lWIemL;Q-pJ`ZaWURp^UFo ze0Hp+M~C@BgF^j%cBjhy15@$+?@u1oGF9kt`RTy4Vm8gC@1Lo9f4vKv!&eG5-|sOS zOUdOUS;bFVR$~3!wZhlc`=@_5T+SbVHUH)*<=>)b?z%c|Qt^mKN?k$VcfPRs4*zYhLWxCS2}vebwNja{UZa@l)q@ z?*DLyQ1OdFI>#tE{r)O`+Mk;9Y^UJ!WXZbe6(39Gm#O&v{RR#8-6dRWx2NgAVpZk* zd8|s`rs+qA{3_gwd{rko#a&8&s*3M#vFSU>BAnmY|M1zi%J@*l*J{Q#IkH#C2>4@5 zWSXZG-e1MfxZY&e15tRd`JwBj21@&`=GPcAqx3%EnUm+~q^!zP`Z69_)0bWKn>y?F z2@MuBZZl(zoIj~5e)5Du!DsgiKWzW@M9dO9DSWbupHgz`-(d%Y$q8RpUF&sN${&9f zf2;4<=Cck8Nk6~uIee_#{%h6zAMW0(aY#7wb=18FzVh$S_|uv`w`qI3^f@df)zj6T zdPW&PsrUx-)Z*EPh2JYLzBj#?^8Ho(Zf(X-pL|4cXg$l|7Ou=cRD9Ot(U!eOg|l@Z zuJ760NzPw2|J9BD{f`OpIjMbXK68?OKU48Drs$r`IW9z1?%l0*g517jJhY}ieL$Zp z^-l=vf8W?;x}Q8gPE+wSnl+x7enR-Uc+Y+Zzm&gks*3NHefVAcN#R_b?++zBek!$3 zK`MUAg{{qhJSF&TE%~Z;j$D8JReZPmIYoM$7QFvz8C0YAe(C#YReW~y?xq)~g<>;) z4J%psxD-EA@waY^sj%RT;Qd>npQ_>q z1xI)uOcx&hsVgiw18&3?3J}Z1%YSpV#3zhMw ziXYiObb)wQ*tw_OS5H>UjkAKos{Gju{KP_=y_(fOw{D|A~_f1vt-S#F%M4uOq4tu)wR9rE+eyI4~zQelj zKQ9d2n!p8Rs5qv_fH>sK`>v6a5-JWYY%UK zwJN@M>7^ORE(j~HXv$C4)|2>5#ZPVQw7JSfq2Cexw}!p)yg%a)>+erL+T+#8i$a$F zpv)(m=jx3OB-5I@fm9?D;UJPFTB=5&lw#Mf-J0u8=4;ZMM|1@KvEb zd*0J=p5FvrPZBH~5@yvYeWq8hRYK|Xl@Zqc&PQ8iHId{I)eery*(077cKlW7vUBuC z;bgbA=QjK_Rv6c`%c6|Sy{zfvFU%I=#7X74He00g^L@9j`O7R}(2XmL-Ghc&f|G}} zSoklDro@%-E@@B2* z^eiFx=pVsdUIponE;5%1IFcnSIPW{)?ur!M*yo3jx7eE{#Eu+0X!XK*x}uZc#Pr>f zCH$TBes;MXGjy-oCDfU{5${{L!T^FEJPWC^ZuDU%!64Y8Cz|6xn`qAa1v z9krRuRps?%S!HMIaxm@ZO@b}q10a&cU3($%aY-_Zu7!1S;CfH z10UWwpRD_8#;T+9M`Q`@=dAj(Wcg&v$gjTE{gRL+H21mHE4$K6%b(MyHGVTBOAvdw z3)3b~)tOJkKN=94B~*V@EOGJG?=2Sw+K9{`FRuPwrCaALVfum9ZCb`p(OsGrGO1bHEa7YWyIUPbB^xK$`OEi~ zZ$n@F{#&&yq5cM!*xz4`(fxj_(u*Y(k^f?RxkZ(mTT-rGOCMb(OW3X{lrW~zRGq8c z-PPlZX9+V;oSrR;*f zx4|Y$==l2lpe8qG>T*iye{%jiQ?MT}qgnEb36`hJW(OX6nJGke`|{+Ij1}1pF0kBN>wduV zPNopssrH)o%f{=fG$`I_^{q@{N>t4eLB;1-DkN{T54e^o447QH{meCeEw$^ts;s$` zDU@H>A!1S8QI>gYyIp;8Hd83JaevU0(AGN7$-zO+r!$2ty<;<%@b7hf*cVS)9?ukp z+x>9u_mgqDbltuk%MWJ?-o=XwGjitWZk@lJUHd?$uyxCbUr(nb>T1+(c=4K;DGbZ# z`Do7$Dl__*sG3Um~TN5pir3Eh zBX#eO%)3y0Q>Nh3v%>A)LsN9MdbYpmv>{XY^KjX2E`J<7LO{u#x!1@Dd@|7lf2%okIuNR(}i9?WC}H_3>LGt&9R(n zHadK1YNjw|SA&V0iVv}f*IdoTL1(Uu{Us|R)Z$exO!w2WOyR3Z89kfdNVbfd`_-GT zL7!>S{~LX!B#SBV@dGpHtzS<~>zFygV)}Mf`-PyV{L!nTPuU5UV-c--KLUOJg3I6& zi&J#Mpj%y|5dRmeI`6vSGtx5A=8>@k(i5E)(ewS|xjLVH-ZoD__lmi+;rB;jx{xks z8a_w*Tb zE3Qw%m2Ma2TAs{qv*_wtjC-dP84$54MYkY)%GD$5GllJcX7BUbIbC->wRWp}8#9HR z`-c_>{TybQ)@Da3AAGMifzSJmeK}Isa9GI&oAEuzHm|s*lFJ;+;hb5n1Mt0TRg9VX z%eq09dxuVKZL~8}=(j6n)SId?mZIH{o@lc>Q&|7zuPUuu&$e{ya%Hd*QR8&t`{BK!QNOk?nKAFwZ(}SYo}U+^QU50To|rwX+%(;$^Zger zdypx-y?VCe%#kUU@SmsGa>~pUc5lAX`|5#SmUkt){<8derr`f_b@L)CQ!GvU-J729 z2Khf{Q{%rbMOxYoe)lXf2jz82-{{+!vn(AQfAHSwkR_bD8K}9OW73`5_hm{&v^N{) z&wl%E&n$~e#mfWsqdnSIXp8seIHPWH_whFul|_5_e%U~uJ2P}6(sKegXyLz~%h{P3 z<8)u1?Nje*jVvLeT$jdMPKD}r+;^NC>y;%$mYp3_H#$NWm6CNs+bByox8vm4GEf9=v)V=VK>9xHVx2=AZ0?_#(9Gj!v9uG{?)l_h)`ZL_go({Z|>?KaOV zoN%vBidcR&u zmM}D7$ybjLjn$3qbmZMv3$ujmS?6aKe>Kx`EoJ5MEi2Lfo2uTPzj?alX~YcA_FJ+9 zXYKlymIE_%HTnlV=kdhB2h9ra&y2q;rtWy_9P|w94;f#% z-*LYzem%{-((1FIlWH~|@XICf?Dj*h9eyM_Ii=U2OXBWAUcT*Sfo5eA(`_$_Ra;dl zvur5nl#~g_*IpE_R$R59Yj@Dy?0UEEdQm)BZRYykzM%c14>WptK`e1&N%Xc7#9#Y< z&5{dZr-6sN>t8~?zjkty*#Q^Cu61Yah`0j!m#t0ydU9U8l``OjWjAQU%r>XLKQAVg zyZS763Fy>4r7QZM7bo^^Tf8@|UnIB9y8ZB+cs~06>3N}`GrSv@pL+{`gmmYh#>1r+jB`lXg;^`JvCCnVFDByG`z0OM6m$*vU2Z z>P4czonHFe6JnixZfQY#K&PKSdF=La@t14nI@MNzPAOi`Kj64%o4)K+mFb|fzla>R z_Lx{<#JEEP%%Hv7N5vL8Cf;tisl(|(pwj|YYlj{c{V#N$KfEpROKhKc>4;eEM9%4f zUZ4#jx?glh#14gjFb^vOI;hd2g)0t=DNR~5I%)$tb!X4|u7|~zufO}X%Ol8dy{jdD zZ9F8NU02ptbCKx%Ge_PyDAsGSq$(Eck^dQRLgip{=Qv@H^J>hRaQp6?U)yqGz5Ne`mydK?Yf zCpL3Fwti;|(ArmhMxRa-fA(Kj$EG&%KXkaEOA~!sp8S4zNzln(TK4o2#YKOg`$B62 z+TZ_s=SF))*Y=$|{Ph^}P5(D7=9k_hMupAn{^APg)GJ*g-ux<#`le5@s)s-ad1;5= z*eyP+e!?{BN6^VN?;l9pCH`ElZXuhcpwkkzwO##-xX1AG$gNXAvyIzqrtcJgwq$us z8Af#DfTt$Ned~Afo35wu6Jv`E-XY!$tdX+oE6^D~+#1+^yV&WR&&nbK=+q&duljBi zuf1_gm|7Qf(4p7EwLgjVcRa4?T@JK1WPaNsKZ;u#jJx*E2{b!5BAJ&QG=HDK*CXHxY-@cR9 zh-Vuf9_zIQbn>N$!9!PxP25xGUtdCWScfSCSBSse@4jWjG|>Jf^>;e_Aik^F#cSC} z;y)UbmatSTJJWC4jv+*M@BXycLb2|f$Ez~?5&i9%kmlcuDRs}D>d*l+TR-hx&Dr9* zP1%PJHzxXxc4Yl&;yRz9 zAhF!r>aQwgkbE#@-1Dq>!SrYF{t7=3-Q2I`jfq0N1>bIU!#so~??1TW^c>;TrcB*S z58_WQv2WQT;lBGUyQ2?DzE|w@m90Mr8-6^Il)M>qnoatEDXWAu3ye~4e=HMHw>qg%v1gS;%LLYLMX zb_uq_*DR0SOLXC1k0kvn#5y;Mtv(gB_P&pM>pg;f-$8rk_9gzUq4hPQFm2hdzB{Ue z_McU!WJH=E+<%-o_66iyTW60M-)^6<@B8cK_Xk0HA3qgWeZNq%qxTn;zjOheeYR$kIfsOAvYw59 za2@ie>@w9(4LK|q z5045pzTA*fyDn(|*R~CRJtmxeHpe~H1~jW%;mOqFLV4ZwYRfJ|{*!Jq@T&nQgp?nT zICyLZon|>1QR}4Ob$Z^jdgDO{wZG{1@}yw?a%JZ3fy8gyV9&l&LgV)LmmF>Y`hSu4 z-T_fuT?6-7n%KeK1r-arir80lMZ}7tU@zdZ?7|9L*j<_p?7ha`dp8RSo< zv(ep7s;ex%ruDmy>me%&0i}(3ZA)ms58pfYTS4fcuJk{eYgU=ZmENMG@X>_GB9ZBrnasS za7!KB3tHaWIW8#e)Rer?{+4>n(lf)CXN(V8Yi@^su;-RK%&%j@y$_n8Z}VTpKYDUY z{V`v+uu22_XJzfz;vdtwrB+w3=H=JtU~{EBE`3$G6mx z%IhWEG6!a5P9L5Ryl$%_(sL&19sPm|+>QI-sBv3eVZ`=|*I{f>AMZg|9pSgtClyak zlUz($6X(R`2g_}>eNM-tNgv{}>ijhDonyjn^$@q0^LFnT6m)Bk&nL&a+iG3xkt#(8 zTC(70^+U(8+v-wd`gvM2GqX}kRJ`kWd|UnP+quTdyT%3GSvi>kQFl4qXpsp1xWP#-oC^^=n=b0`96)TxPUsmzfb{&hhA$BmAzq zdW_@zlYtYmP80~b;xOM;|4_f;v{i#GS$Ri?zHm&qtA4y9c2ddA5m}9^&$#SZcUN8S zo9?5pH5rkmf8Pp^U%Gy0@Amvf9n@jYQy+M8SDmZJ$V#i!qq98LhkAq8J$2^`U1zq$ z=Z1H$@Q*bG+*21bRvo>1$Jn6s($l@5{XKO+dfMefpGF3?tp2hzSnjDWu0Gc&C3r$s zM6GV6VB$S>fs{Q%U3QMoYSTE}AJ*SfN2?t{ZXXRVSK0bMd2|oza%j~jM~(aH(n00zWfbXImwuRf z-VuIZJ>P$Lyq6`^6$HY>De@JYw9`)c2N4IgcBBxYUBseR*kd|%x&clGJ6!Gp3QQ#SwR$p1iH zyw8>?vAf3v-RSb}siVdN^}_=J;~syC&8qPG&P$H)2kPV&53=IbL$h9Q>-f-NexQDE zE%M3YfkT5%Pne14|AG4H%D`e zb_^UJl(O&RJ;&n*>Q5u*uWhhnd{EUlvxR3Z7U`XNDeCfI)7dWc&NT`&|;Xl zdsNWA{OR``;Sbe$K6Tw+FJITJn?%DI>lnMRq zSwmbB&NCh zJNJI$(mrb+K8eE2ZUa@58eWj=ot20&rc?+xBeD zpwU57Y7c(tz~{!0gJ(|#t49YVgsuGGFh5o&r_Ct!!X+jvc;DOK924+4@pkHq69ZC% z2Hv=a=O5SU7Wbc3Tw%_d_j_t7z~{8@*8I}u(V(QDntQLkc07Kp?mohzsON6VGWFKI zaO8iYzL2X_tF;41XLap6{JEpX6ZN$XANCqDre_t+`{AP_{E529l*6?@?VKJoxb0C_ zusl&8?)>|%Auu@T&f#Zx{XJ2aNUpczs>7J2yO2i#>z}CaSG@IYhI&#~{a=?T;P?~u z>-jCy-wntN`uOp}JICWE>RkzEEbeZpS<^n^Ux4>|s*cHR9C|8qd{D0!H{UsGJXJrg z`!V+2&bdM7XPw6W_o@2Z_601dFe_+QCtvLUo~j>RxpDpN$8kXwJ68JOnDA6>vo^dG z0F#2c1vM%F>z}GeDqJ(uGiC;DnOEhFk{c_j@d#yEEgP zpe4h{c|>T*3kPD;p}ALJS`4Ez6Q>RLPJ-`|7lc0*rfIUM27)Yj_N2i{hs1fBP- z^3q{`rq<-iNcr(YMo^IIn?f-0nYwDQOVA+~YgR#Rr$Vs)ncAi7vs!~QCucQ`_;lZK z?3w!6rSSR#9V4@*t=*a%o;*|U4-RPG!7(gr-Sxij9r>TD=T?pynFNEfGNRYu{r_BD zc*_=bFUO>;&T-4~K>O$F?SsdZ8=NsU$oKVoZ?HU9A32?O-w%)(w5>)rZ2#x#4$C(v z=c=blXA^?3h1SFexwPH)VZ z5%gkRU}5ljp{_8jcyzrtaY0qaw7~xVg*v3eCF?E4kRa`*ska^BFVx*fZP;pXj0(Dz z?1tC>3w6h5duD&PYiic*-R8%R2`|)EfBe^oO=btVE#Gm|vF?RBbU@ynTO3oeu2k|W z3ddil8}+%A6uWC?*7e3u^23uC>Qa%za*xWG9(1D3r2^pfQeAh6K1t`+JE(6Z_aYGR zQk^rf{4c-koR$@4x%j{l{!)E*p}V`)WmMM6j?s@D=9lUMu|Ma#wR3h*0k2y{Vd6{m z#K-Ff?H@QYXmaD9U19x8^{zZSb9n~O&&n#^sx%ybsjkw(@4f$^8Cj$HZoTbz{8H^^ zc$m3m;1qs8hEG#(7eTXjCiqaLFr4U82`<-u2{9LULD0;p5Iiviv>iUdk5^X17R`Q8 znJU1^woRdx$2G`#uR4^Pd;;#5{sdLND+PBNFNc?P21BzStHYeTLt#@z3j`00hBK2I zK;)1HFy}=B7!y4dD!<(hZ^|}=D~{=qe}+5$o4d!5tNR!*mNmk$fpsD0;Y!dvd<)Fe zt3i1$8h)sh3^(r|ghu_I!s`Y(U~bvg}a8^40ZUd5no$_I#@>kpQ* zt3liU4fI{#1&S8F4ZB)(hK6U(!}6i^p+fn?aAtHWbnl42C8F#$c$%vu6#wNa%&+MH zeVINmvx^4Syl(*mGtNOd-4+PEGYW3)>aP0#{~FhLhzg zL*?Oj;Ck1#aNtlNc-|-i*9IJhqPyC|^U}+q*tH%|yLH?}*N z&u$0hGA+E=c^JkGdJGkJ$3dq

    XJYU8ua`B<#_Qg91ONf?LHxP@ws2*w<|z{ItIr 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

  • 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 @BCi~WUkN9^eX zwdP*~LGJU3^riB;9}+Nba@AVS;w=!KD?8bn;~Uw3eUZpjc6H)q{uY90wPJl#{!TT{ zxxC0SP6D}{{;({g91t0*{Mo;LN%wYkl$xEF%f60rvwo>;^j~`(=qC`f1ZVueH9o8R zs+Js_j`}5A0sqgPT&N=jvj_nhp6ikwPxsIsGK1n2jts>c^XX66WaeC$ml)2~n3kq5 zsdKj0aBdBFfyioaD`W%4YBjEeKFQ^TDs*AyA3P_D(@HhSsLdg$@N&`B)z63?8jl~3 z7uOl0WJ9vk$#b(zp5jsdgc8ZMFRd*uUu#YvN& zl^M5neuUYodCp(i4)}Q~eAN6WIyJ zp*>zoQ4->%G#`ce6~|}JpY(85ez>Y|VBeyV9MWS1V)k|Sy2Mx$r4~dW3}&p6ktU!$ zR?(1WO^)c1B1JBfsS~@xWOK0$JbPbe;8A0@w)7X0C4|)HljFAxJ`CZ*u3(yM?owJ(F=f_Dj4j!*PaqjfrRRd(??lP01{N)ym@S^3W!BcFVyZqD|yI zQ6Cu3r~4HNFjmF5_ENjc?C^sqyWVTXD$v z_V!Q6t&DFMJPsn`+bPTT!>D2gdH?ZP zZ0U5DvG=;P4HK-#m%YLWvHT-?=~FV@A7r+`%d&c%WAv!y#Pn5TwKi2Rvji+hAF`gF z5_l{kVsboj-@-xui0f66>^&p=;m!GKn@TJ=hSh*Z_M=s>db8}cd^w__O>QH4YNCLa zD3`}1)IV7o=fKavbL9Mw+S{Pc6PkT&TbDg*tX}nT)0U$V{?cmt{1va=!3`8Wt4%S? zVW{f!FWELg2JVHtBVbswsvU8l-*Ydo|2Jfz$n=J=k;x*1xM6cZS+v)$J*LW`HGPT7 zL=KCzevI(}Lu$7ivoP0AR1$sCKqU<(?EqTBpvZovh8H3& z|G8>^=6-9p<&PDi!HXr7+6aEPg!vm`dbZN$S7EMFOM>ig9dpNInf|?Ge#zx_aKKb; zTW(VNWMoX~T>2K<;m*PjnR_?Ee}AV17X9YVO=o+RuuRT;Ase<1; z)YGznq^c9WMyxWjiRMgfx(&n3-*9=MWwKK{D7s%|kW069vAK)Nv}{)T`eGtm>T%q_ z7-`C|b{*NuW!BE1H@wyxm2_kweGJBlq}7YHbjz#f3pHi0NbnM81I}IIEOs{BD%;?G zB2kkzvH9r4*7YEPaFG=w_*{Adr)N(f&8(JA!egZr{K5Y^3ClD}CSkWl`95w=tqI>; zSZ#FC17IOzav^E>Cl~sbV4aWMS3R&xi200fdV2g@%JG%!5{UPA?n{E1pZ$x{ifPBEEavhinCnmY z2y>+~_B6%V(+X4Ez=?C=hWLFGT{x5WIrIH-^slt}8#ec9qumlIe&dks=uD}36T%@O zQe1M+>06daq2rr>V~C>5U2TbunZ|nw(NQTo!x&?#EYVSc=x|x0V_wn{|DMkB zgji0=p!<`D+>V~1403}Lf z4g&JfwM?Z(JhO0k8Dn^ zwy5*gF5zi}Dmf#En_BQtkdo@x zcLzn&4@Hmnz&p`TdIs|UL{F|Rcgqz-`SYVS_nyh!l+Gx7ul2~cPzweJIL5NM7)o&K zM33a}TeQ#M$;?&~@F)wO5A3`y6?z!3ahu1utuSq`rc_y?ylCal;T-Q*i@Qs?UqhD%U;E`VcdVB(rX`kOu@Pse8+Vs5nVHjCT`^E= z>Viadg@3r#w9j&tYfU0X!Roc9J(g>}*7PhcJL7HcejU_T(H%UET&!RreaX@HSl-Z< zjzQp)%i^h&eL9Zs+~{;@51a#P%b0IT+x!(LKnFkm0W+k_2s=uO)-=|lP^Mlkwq801 zh|dUKy7!>P2r1(Ck|Ob+{U;M!Yx@B#+d3El78x__W{8ge7tBBS!_$TN+x*U_p)>Ev zbUHe8gew#~SbFdn3lfePG(E);p9Qu!qPv>R!2n66iTRqYN7m%CDMXZ!p^eHlw6R2h zp^YupW0CckYdxl058Zl{TaO|hdZa}{>XB9n5{NX4U%*f_b)!{i>PAZ`kM19%@n!I1 z+I{<3r+9K~E^^WS&oC)Fr^+!cQaK92E!X^9F(`*IPitaXQ_dX^_b)lVya0aPM_(IL zBT&jq1 ztzn)-IBd%DBLf}MbUb~k=W1aw+Ijqdcsth`eUSYkYg)n-_QO}qeq*8t#f%}{qlWafHIa66;utlgXXqbog8 zmfF<2UsCwy$vKMNM|WOI(m9#Lo;_8WJ^f3zw;~<7jf@zFwb1uTksNUR0G_NXJVw*X zcEi;Eq*`{TI1j3QLMO~W4iFAy1tav-aDB-qiaTHJ9u3h+;owDbbwy(G`{sNmzs%I~ zbp|`@@;14cNhIoh*Hs(6ZY56p&eE2WLB|G5q_S_wBtP84%O$^MWVTrb%Sud7o6N?}|mS}61u#fPMo6>`qscMF;zd2H7=rMC= zo+{!cK$~}4&;|>-80c0tkB^zZvY?B|hYUSEqscD%7cB--1@WG9L0k!>v;l;jJ3I0c zhzM*95C5zQ z^^f_QkgadaHvo#-&D+Z;H~W_s#REW_I`%UvJeH57R-?iadn|9k^IKe z4)xd~ehF>ldmd4Eljm(J&InGdxORB3y5idMU`@rf^}$IM*Uk@C+trSjWD0WFydDW9 zqWfy~YFT!V3idBlT{o#FRNcW}ccujO3^%1SekO&(rmYC3PX|sK&!u42c&=PS8zm;= zxfGE{ul0~xV9XYfF94wOY8bL+o#)VTpYvMkgme0>qK0k>2th0QcNck*|`-lL8+OsL2 zuf=`t$0u#PKGJ3zuis{kGc{hzcdt$wuZ1>^ei`GnI?ZFU^Ce~t*~jtYZgp$OUdAed zQrfH`yAc_d7=-_g5xDIl`fJ*J#pg-PSN>bGs;p5m5*ar=>2a^}XkguD+#N~q77Ij= z824ZjthYcP;BS)PcnciGJY^+$MN2s+UXmB08S|8NusC{VmT3q1{U1&@PB#~^!jLxI zux5b=G{tZMm3lh^)2d z8=sIEF6JADrG9M_-Ob$%l75!?#%ODTAVZgS|97k$%gCnP|FZQW1D|%ksIQbo#%Jw* zQAK&NMrp4QPRvu@icc=m%9EO>40?+tu-B}()_CqrpQ;=pE`+S{TrOJbemG7oHB~wH zC6)qJFZpy)HTbKiq)kkAuSuVn{E-~=++wSBlIVI&&4#`_j)_m@$=;pcR^GM0z#CJ4 zMw<~k%2g_;uluiM0U$Y-swOEou6rMreu=W=lb@joXiG0tl(+I1#*wcPsKmzB$3`9ZTTCG%Vigkg)44}9K zCP9wJQSPnVy|;_Kt*x!L+6@pC61D_f*c4H#0xq0k*i{0E%LD49#e`iPclotGXoOiQ$pVOR8A@XqV&UkSlHx zJ=7=e^8P;Iulr#><9252QpIDdB^=RL*V06bmr-giYEE8f5nJTLia{>=J`7F zPftnakck5&^QbF^AbeS+Ge5qcx5@Jk%8$LnJw<0mbmrZ+%9j^@)>|@nxrc;hNDjGC zXAZep_e5+bczc(Ad($4#t{rsO>9;@CZ@=6oZ;$GD9LXVn)NlWS)=V1xg)ZBo->y^2 zxLrA&PwIZM^Y(@$%@*VvG;7Zcs)ZTB8GSXsLGk)mM-8r3Gu28_EFWH zoQkUL*Fw@Wv02JKFh2^{VrlDv&H{@OVA0+4oRYZ{>81X@KmpeaHSg$}Sl2D=+)+Ry zl*nWoc~QR1weXnNLNHfhe5r!Euzg2CdRL8oembFMTF)N}?m4@kqJoYJ?uL>ldB^nw z!DR*9RO#OMGDvTwtV3BtNj+JzDbP)QHTdNTTgLtb4!if=T09<=h$`IRh2jmVIjRv3 zl=25Xf`nrn$#tkoEnSMsTM@Chh_kX5C-vg+BHz&Zdx|sNxkXK!Cq8k{o?gh1Gh+VP z$6fKPntrDg>$+37L2&Gg+7Bk^L1ZZLQ>rnwnX~FC((Q^6x1{|5mU2Moc`(=xU(Arg zP!f?>4BR?O9`t;;L+AuTeyw)(FbTnGM4`tY6`rw}wpARAB9-8zR4mdNPU9K(A{rMg zxtjTia79nCOjS{Oa63N4&L+z34pC=JsS@~uFJ4YT1CxEv!6H>|>6iqWneiL33FK4U zf}&NQ7zq(~i;A}tJu5dusQFg$vw-ST6GyL%b>*s&_(|znD>>7HCznDZau(m?{0VX2pp zQ6pob2RVrUedU$$S7@q8np%-%i|(;AiRIF1THnz8iv`Fs>!oa_ zS<1#gSc9_5?rgRU3#f6m4DsULhwJ31k@&MWx-`8K!XzbKoF9R?mjyJ{%o9|(C? zjCt1e9zsF#zQPR_Duj{^T;>s~g>evy>}R`GfXHY-%alVZyzD4X6%aHUwn!0i)0r!= zU_SR|A+LdyaT-o$@I6ty~`$4^eO}@fAlB@<@xj~ z^o{fio>=IW;xX7ru?u8jLsF+#Gs_#IdTPE>*X#@~iCu&tMj<3^aEU!A4+hyxM&pCh zpTw%kIdXBsN`YAEMyyp(KH;PxT46gBw34B6;X5#kt_N3Kz@jUulzQ%t*;3+or)hoW z_hw1W%>*6oLZ#Auu_c?`Bgf2}A#H@SoH@nTDMHbGH#6BrAxWe@9303G>;O`uA`%l^+c zfl>4oezL=Um}s6LsUfzfI&Lc#91G+ewgD~5aDCrac}O+wt` z>Xcx4_EBt%TFI;oD~IGQz(24=2)TA%=E(flYdT{fwd@p{WBI6NE~_O%ik}#-ic=#9@rh1o0&fV-zO=*{ zhV|s|N)vK2zVsV&x1%bFByTJBz`;t+3#m$=Leb=JBc!e5@Q_0K;;xZs zib%RBeQjO1MHTH`@Zv*Ek)ZdF1%QNpA(JR|M)ffkjXjwFdNl>fsmCxSuC5E)_7c&iiNn!Ai#c9Pf(Y4sT?l>EQ5?^iIYDCMt4ky#576W|I0IWwP-j zbJYZm2jp9+>P6w@gl{{E&twOv&ZRPqpsaCU(h&MUu?eQG5a$_GwRi2VahZ$|{} zaIo4LU?qrot`;@`^Akxb}}csy1WnTWhG%sZY7CoNt9Ep+WQ1O^PDE; zLEcX!{i>ISrq5~h(p1xG7OwK1ig9R>ehDCeI>W`x2Q$}2FSsQOzJ?yM;C0|ZaxT(< zIFTo-YL78j;-~X^c&AKj;&A7gh@blw<2hsA?4L_S*9@V!rw8r*iPk{kaQFDrh+_Oe z^D$ZBfN7^(F-d0Q8L80h}n5U)M+%{@4YTozD->8 zdUFsfX5EC*_+44?#9c)Swu7U|(p)U~L!?nEpj?`8KWW2!lh=Y)$71=OMLHGzp?G-Wz#v^ z4IHE;d_b@w-=FUbB_bwe-{3jeBACrf-TQXNT(S>7m5& z-mzc;!Ax)1^!Sx1zpB%h^EZ-acg;4H)!RC^A&F?oSlC5PYixj;()bxN7N43(BYlpD ze>tbGb0<ah@2Ci)H&jnx8pZ>Z2v{Dv*_=(-wEjW)b(jEFU*0jH9>B>UDLW~F& z6hpVG6z97wRwC1ffb=5j=y0|yR3j$#tM^LD;F0+~BlTR@JI$%fWI{zfkM*q1G|(tY?$#4QIAUu`C%_1>L6# zW9G{ABWNT~UkWn=GA^0c1q;IgHw4`xx?~rL>pMQIveSR*UkYE=)gisT( zvj0by{BEFQYDvA2o_TKa9ira6Kshs+jrFX-02WRRgB_F z2j>3SD@oX6?Re(yTYz_ArTgSZGW|pL&c)_M>V!vwuilh|rS3(K-Bw-fC%RaR6r-PB zv1g^&CzQ}#7JRitdIu*R+EsW$7cTO;(CK?C-D$ekGj**$=~(NvQtJXr)VkN<`>9O* zCZ?uv9?Z>*PSmp|aps|U8u6l+;1P-q5 z`p5nHEG6Yk9I@P9Xdqn|-Hdw)OEfX{GQMpcTIBQ7rEs$E3Zljn{wHVQ8 zFV~~V45c2XOoz{N{y|KWJM|HTsB|}%pT-C79s*2+i6Lt=w!(~YFmac@DyKGI{48}) zoyXhsDS79`u+tTuKi;=OFCFW4!Qa&}FZOZz=EPw_e8l+#z5MO#kHE778ap`;($c5D z6r_=f51=`J%%#Kw_*O5-+RWP0L18VZcj7pB|xNb@S^iL@P#9eta5SQ#b z=oSIIt(dW=`{m7#>D-4~^%|kXMnf}SgqH}hMUkF9Tl9rB_ABA~qeE(p>Q^jotgW%v zS#u5-;ENJlJ=|E>uWL=iyRnOE8aLJ0%{7L#E?oZwWoy=vH?FI%reRa;q?*RHcfD9c zh|2Ur)|Uz>ecyb`ZdK>^sDq=~p>}?a5Bpp(f|@I8D&L6*5PZ@?JQc1#IHV@<4)zAk zv2JvPyF@m`SJpHTU5yBdb6qK2;JBx}$ zh*FwGWO-(qWI<17mHTF#?G#@1qdo=C_+l5kT^9B@6hPfoV!>@L752$8hP@wFYA+;J@jh5Bgb$4< z_r<%1?dI^tR5-D{b2J$@ti&h#Egx7vMOdj)qmclC>~9ol>PBP{#*|Z;Sj7iHN5%u2 z$mb5cu<|0OvHsJpL_)DYn!Ix#EJ$c(H>-J%p9?S2=UT?gubGJh%vJN1*5*B257;H* zOM%<=95|BUkav5aNoo75;TQr@XC@a4eRAAN-sg9JHb)8Tx?3&75mbS!iZONp`kUh2 z-1527{%}}kqKqDLf7MSO*T@wBaw$#o$6cezl8dmM4Z#IfUlgk2qjO0{zSC)A3Tc9J z+}!29^DQmQ!yFEddl7<~WY6zd&baRcGOe)eXqOf>RXexL30l6#H!z!4+2dQ~$C>By zgT2Qc(k~efqvDoAf28v*fm);Ca_S?PCPw;g?r=td#IIUO36N!#8V!$;UBRgLh=)K> z=_{j1=z~ z-oY23guU()h+{Rg8wZ(udA4QmnYK;Dh1d}23I6zgHJiDqR5P7=mJ_e2_{R>rwps*& z{`2-{3z6t}R`%m(__%#()Ouj~UJqSXegP5GW94drFf}vnx2x^f+{fsV0O3i8 z*m%C!sTJ?0K9m~mRWJC$Ttm1g^&K8XWF_&NWZ-{gU~GMElLb-CxQTni6w6w%31{D~ zOo4|M^m$8#?+|_Qd*ld4cvGPy?K;FOjgpLcYe^njX&8+{U2@XzFqZ&1!&oWKHXG6>b;oS<4g((^|@o%e{Q|PN^BVY^ziB(v2)H~LXymO`lK-1nLu9aQ971rp+5 zog7j}b;R5^8vcuU@R2se?(S_(lj=81Ea)9V8HRxS5GyVCKQ=gATe zkrj?lcdK$;g|erSJq~&6#vGO0q6dg89KbDIiJz8!jdB`#Srq|bcQ{*J$)xo`fGQq+ zL6O2FHMz5Z@6=ePS{CoN+gLo|w`4{4-kt;eeE1J515-{?O3;JI{jfSx@lh7=C(w1k z(l4)SocZ?F^>sHg*PKL=c3XxHI-@)Q8+&C5{`5+M4$T zD~`+NxP*G_U2}G*&2dz3j&JiWEL-6udzan{xadiH$?3Eq)%TmTLr{*WaLcgv+-(s? zfxcqI!C$z%J*gv^(Vg$vaX4)62{-TQNtotKtg5$+xyqUeA`Wp&N6J2(b^*k)wW=@O z7rbLM2yB>DsH`bsB)%mbaSC+z!)0%Q8{q)k!p)!bBs!-dfzv47|FuZB&sCY#cC+mI zW=IxzJ!RS_36Tk;imAs+F4o&{O_VS@_N(rT$O8x>hYv=|2B|S%@Hf`OC*p7My}a

    3b(?@3YF@%#Jl`WFxsborp%9%FyG~eP9UGJbW85yA-S}gcW#kR3juO_>hud^NEdkT`P_YUf+`=X zB`pjr-_}d|A1Xb&+}*5S`q%NYMWP-IR&6OmXuUo&DH(we* zer3wOt9I2=Y0Z5Rbi(ygCTaO6vnH?qOTV5^N4?h#(q~7%Ze=XqYc;HxejQ-A-fK1T z8@#%i5%0B{oZ(*GzstQ=^Y3E)alLR4BRPm9|0-*j zUAB+q6hb#SaF!g-5>uzxBC~)V)Rc|K{_}6`#jEBqfsBXFC2G&btB(lJLHxUpG<6e zxwY3{!fkiSmr9Ccl+NG0-$zRXak{m4^K#BAnWa4TxFf(5=&d6@yNafW8}ej-BmWn=c<$`Q6q@_Mgd)?^8}8=l@<&+p~G&c4xxV&t_Xy z`UicUjU?|c7moBUa1-YF0}Emks-l(i!?Hf+4oPJjy>*%$0oM#{3)#O$;pL$Fvgx z@}u^hrj;3v^#t)E+5Dy>5$Y19s-~UpM{t;HhK2mJ(Il^u&xX#?ZCt0@kjHOo!z4ey zjhoxsn5=5r>DEgdiF&G+W(v+#&D39_oB6bp8j3uAQ#13)&u`|~wA@ghQ8n#!Pgl(} z(Wo>Nx>PmORIQs4VF5EHkKfcxEBX1&Jl5Wft7_Wm{)L0gnnVHBOEdK~s+ofEx|#EI zGxGRN%>>BLZ|0)*W=d5}JKa&LnGn^hwUM{1&5v|5A}3}v^7u{7nB?a-)AEztq)k>e zvHo4v+EBe(o5`w~dT5xyi*T1TBah$I%zX0mo0-(!%rmN{o$kG=nI;-lYXbpiG)=Z{ zW?3<{Q8$<1%%i>bM>NTdtFph9n087lX?_s|C&P{k zW_y>tUi&j}BiUPoN^5J}6#tAng5w|9`|-%I#|G?3qNlwjy}rZl_u>bA;jW&d#5!G7 z!#Au9{k>Qi#k1*~{Qgem#&?8{zZOT!{(&x)dWzSOm}4?o+20J$|C|5wR9UL09=`m- zy#!ezmzF;pI|XOIQ``pFOwP5?m%;-V^(|Oa;9KU`y~Pr0CetY9VD|tw?t@SZ_lK;% zTRsDSk6FQjSYUs`si(Bh{g!%lQbFuYCn0YZ*v*OUM-pp0fzVZv_}=tIZX2YjewI-X zJ6D&=n}4sozrDP>R+aAA-b}#7rjZJIwZ96wzvdMoM~U+2J}JqmeT4U*3+@sAv?Lya zDi@OiAQzC7hnB=|R7!w$>ESW*GaU-j=3XHjLrX$l$v-nOn_FPJa0oTiFwMh45yZPZ zfNl$F1w?0?W@Z?exXm5HY27W7_6wS~b&uS<-|eCL<>$$~xwUaEH+snR;rrw4fxj-` zYjeqK9tg?Vu5Aa0s?KK8zlqA{OSbJa@uPL$?pY!Xu-}Gl@K?0jol{d3Ycu3`-&0mz zeLE2+U=bZwx>Wa9*A;ZIH=ncHmBGk?yzqvBa@0c3xK_M2nW138%zlgI2Vg&tKE;j6 zUgyRioj2p7il(GLWZv3zc4PW#PM~O7hXt|+RCf^q3r^2+n~Pt84M+yC3DH|%s%te8 zL4Ufd)x57~O~vuW!dvA09jfgE&D(obR~)d{HSg+OvCiJuyuGkuqy124W&Jdyh!u*J zkh!Cm%1rgH*ci57=j2xyu6VuLzO=JhSWkuNg_g+Rg5YTp;3(IOGLa7@dzFqC!*;}X z1ZlAk%JHZLv@GyEoYG=>N-46J$oC?nGpEaNR#`};l6@~3(3dh-is?#2RLa}Go=?Gu z{pLX zn29fnjRuxbZg=5x8IcTTHe*GsYO2B1T_A%wM?{N1irQ0MG^SgF@(9iIy;C} z5g&3UVgnbR`3~HtGjOXOPOJi8(9WH>AsO>-5GjZpwIzIAY79^A1ykr;vTwSquS{xs zzI(d7=s8^3bgp;B3j59G zj|(f_Bw`_e%f`6|@h4kV%+-=5K9P=T6u_)`?1^B;zQsPQl_Q`fSDz&NUfdg1 za071z2s?4Yb$co4UfTuP-hr zraVmXer_9^wsCPUK2NV}ry9zhW1I>C$jM0jd7D4#IyyP{+e1+$d|OlwXAMK;aK2JG z$gx5MpIC6n#n zN19^Tp2oD6)E-k-Ypq2X`+T;-Xj?@!0 zJ+})pv9yxx0;6FwxWaTEG2#zlWf?)wW%F@N+Das$Zta{FKU z_Pif5{CNs~-*E4`Rdxv1DSZIlXx}Px-z3^x>Uq!*0nM!b+{3#&H30s@wJ4wZE-Bfe z9rkCD((@jVpwo{ee*}BJ)BVS1NLZck`|pP^D zA1Ssf*Y>IXX5tHf_$6UUg)UYbLq9ZIh!8850YtiQrw^7>Bid8s4QAC=^Y{YV9 zYt*RuvNQ4Yn596~>KCb{z!=(GwmO`7H8ugKo?Dwjy%}_JU>B^KLsoJyh_a>H&D<=I z7f1f0Dvke_`*S)dHwmVnuv%&q%59f+IA(cbyHB)@wppGw#jYBX7K~kJdDz)X-tTwc z{WO!O=E{C^M808Tqj88Q_j4a1$DOJNv)ydsxPx6X!0-pDj1l+v`rT^GF@mpgo0(-PqBvS04)FR8FYsuWC zYKip}ZEL{Y&trO|Di^L_zJOu{gc?v;Z<1B9Cw*alg;EzGk*KT2Shz@v>$1P6Y)!)< z?!h~8A|)JdKM>J~jiO$TZ9NRB9wzagn%p;Tr0v&vzJ%vxAu8kLa$dR*UXxFN+vgJo zFI=oRyon0+z7lb6EwvK&mV)0#@&+0eb?(K{Zqby%#v*Pgg-rA*i3RG26%;mxrmW

    9CmQjqJ;+h9P=HoCzD?{=z?hHY882tsY%0>7$3K-Wu1-{snZt>PVtp zDj4NdkSK^#sv)7YMCprlX)NA)379|lXQu{`x>56QYOy~+Uc;~m1Jr5ZwW}u3DeW3? z)qRQDb7!iZKq9;nq76B-yFr}VA?d(wve@FBan(nsy7C_lw&gf4jdnP@R?n*JL+3NsKqKkhAUE87_ zUiH+es{hXZIKApK{;TTTMAeI^npMrP2T1RR|J(r9cm2a^>i=*;(J6gEbPaN{yp}fcR86{v8&Wm`;9+z`? zKO6;7xhJ5B=r)8edE2<%jn-HY9g>={tX>bd^ zkP1CXd|G%NF#`<;bcUb>K0uUI_GveL;R(TzAGdXl$Z4J$23R zkOywmm%1+0Io7kRnz*n&^Se&Sf!s7>e(7qzCDkF`ahN3}%y_uHi)aP$(B#OZ-1=0G z9#z{-Flb4ZVB~w=ee!UiHl#NoURemLZshb`*w}a2T4bm#Kuq;iQ-LMPU2uj=qaSz2u96)1{?rmf>fw3 z{u8xzQ9Wr>>JcRxL6Mrz&~L=mYHtn*``QDP0|PwsY^Ne56=s391; zvw~NjBH-Btut%)-oVdnc!N{P}$jzw`p!=|@CgO&sbuK1xyp_BU18Q;HDdyEhTr5W+ zQErXEjGEIcwYek%5N|t02v%Th-0;hEw(&N0U)8Wg(^!+P!Rh^|BM)N*zVY$H+_tlh zIeV}j>U&oeUW6}lw3Z<;6jZ(5C1@@-a68pq-GtM>Q$MeHM&#L3Y*K&`bp-Kr{ztUP<2`G1^AQkWeoN*LTN)oQ~{hmD&!1n)N z>s#wvA8V1>XPr5gb@tgxiMa*GGxZ&|!|JQQR7#J)tf_ZY$0%1tynDV`!5YGrsm-euA7gy3qiMuAXriX(a=DK#^|fEv7^(;mE!V|~ z79n5!7X?S<)Q-tTOdHJ&j>+xVT01Hy+I>|FOaU?+F)D|uxO1?C9oouK*|Wk;Y1+!8 z!P|0HSK%%=axtfISH3DDuPR2~6%p1n!HkgvyGM+lti4DL!SQMG6z|>nCqJB)9_mG| zbUQdc@7xfG4tFlCt#}f0VN4N~<_2PeeOZCnK;n+!5$6w0(H`>qVpFu6{Kh*h?thIP z?Y4}cXIheQ9sr7p?o0*cNGh-+l{0n$5=&fm1@rRdx>t!dKFmA-aMQ;y@tU~jJdbAq zdL|64dz-aJ)q!mHjB&&R87LhX9Phv{5*_%TA9p~I%x_!old-7^1y*?nDQ+Gfa=`#d{xtCu{v?y3|2MHW0T~!UHvt-ZJ zT5UIz1NzrO@+W*K*>s+ij@xb|zuuO`-zNMT!^!AFQUa6=lPkU+lFpT363?02L(JX< zYlx$o=r_;-8In{OSkjmchFWZ zrQH*{|95t@V@7wH11_xMWvZweI-IgrY=QZK3c8%1s^VGx^gvswVe8J*>lS-Ae3G}? zGI)UUlp*w)YpW{$sUPM;X9Hi?G(AD`JCaGnj$XV1M+pu2+`3B6l4bE<2B$1vDW;2u z9y!F+C{#3a;m*kAp-?PvVVdfk%j>rR8|+AnRtBtt%i7IUMsJ?ull zLb52xa!X#~C1yu=zK7-))yK+e8IQaenrw6Z6(;GAd7HSNevkikxk^z)$3%(ojaEAZ8i^c zYl;(y@FNd;j2jv^WeVZkVFq81OOLUGX*CgZ$^H_6dLAiobaxjsQ4Va0mw0`L6v#d2 zQk%^!SAlq>qb{l%Bg7K9wE2g~r9th6+K|k%uXnqxB`Bl0PntgdKQu8Z{uMU|HTyn~ zy!mE-9M1d0?DiT%xA2X0Z-g`zoRF5Tg3yF7MWAOF8Q{P$Yq%1?gbKB9doOx?-Ma8kLYD^RCgV6F7qg%tdm*2gJbO#)|ka zJHG2h^(8I7^+DO7vI4E<8j4FVgM;_f6HKXneW|EKr)jkZs2ZmWuO;~}540s2IvV|u zH9<%4qO}w>|0hWZb4n7xxWL=+V47mF>IIy|9uXUf@JtSATzj@>s+gX&VjUB-`S@Bk zx3&~bFpK`4m4}{Mpo|BE6BtkLtxSCz&dCO!ZB)I}5o;)KF~UlGU5oeM{#7TBS6*Iq z;y`7t;3qm%T7(n3Za*&7LrSGroj9m1J+5X*`We)VfM~5|IXM{DL(Wf*Oay8XeR&Kq zIHt!?DVWI)xC-%#&3yJxux>f&a#PWOg3 zxLc}D9IqUVZ@$`*2Py{$e9U?lZRL8WO=9{yNTKXRp)^(K;M_Z4)kYT56KYda>bn9S z<#n)WfJ&4S6P-_xGEGrD8h4mIsk91@C_asYSBgl?YKgZ>|04H-DIFV}!v|buz&;}Ku$QmR%jHrz90@KFwv#@-GNeVu$U9bDJ~%9tBOwYqQ< z5{Vr53_MAVL~AkTzcsej*os2}Zlw|2*u-6GmZ{cl6@1Pu>8N?%Ix-7U|7{G)Uk zi!VG?l#C=N#vRypv$Qm0Bek|kt^WuPPAA719C`&m^gnCvLy2Km48PkHZ623#B*K{~ zziN6Sq6ZKti7W#-5rvTlsx^6{+d1AD$5lsmHLH$nBYT{YcQm%%FzLk#9@(DkW5yO) z&ZlZC35aU7|K!n$0Y`j4LO4T5Kmm9gW~T*b7hv00gdfl`^+QGwrD_EJ2EO(6gq34e zOC)_IR*}V3gMS8Sdw32MVEc}#8!|$-u0sRyN?=#E8cQt*BY;x-3JK?kk}dM4_SZZ_Z&kPf z35GNkc@g%Is|H!zdw?A#R*~iW3c$bykNmHs2QTB>D1NWd|6F@I#+0P^=Q^7Bwfd$+ z$1(2$MLtJW$y^FrxKsp(K1V8ara&p3etQ)j#w4IF9w{KBKIbtw_#Wz)?0#F~qP9JLQ{oc4CQ^bktD65=f^giJ8&_0Fy2BNj3!HVrJB6B{2gX{Pt!$zQ%&K zw?3SY$N^ACb8tHh}3g2IaRmr}*qrvHe`dFHo_Ok`G%%+^PsipKyADLXNaI zm-+^WR`!HN&~65)$FO}GAeKq1`R8xgi7_+!WIIZq>*IO9ATMZpn+NZV{Y3fW)O6;j zIE?`>k%cIMcsS6KXkW%evTLm8`#&ozH~1k6j0-H}$o1!78p6cYid3Y%neg8NukFp% zzUv!b@!DC0JD?G_`z`_EZ+Ig^IFOZu3UVU}X?&UY(Y-Z$78Hm(g(LLFY@mK9MtD&W z=ZDQ}Kct8Ecj&wQIzj9>OFz2Izo z=YKQ$ZeYNkrDU6;9}39P)~$5a#8)O@Ijhuohc7Nv=*Q{M0nzS}r(rPc>uf(&AYBH>Jfoz zk*h?9Lit4BeaDJjv{obYE6!SLrjU3i33VH-=1wW~w0Q^4<3)h5IOirZ`RN}|r1=BuM-#rx_%MNi z%aJ-W16Sg%1a(yGq4t?b01|`9W)S|3@t#C+8n8FsodiKGS7f27gIPPOn2(_C1AZ`V zw2Q0Vh9R3QaBYR+eH{)si0JpcB~A{1RZz}9$Tt);^4j98FtAc~yKN5HrM|3SNq_{~ zD~Tx$lvMMetR+h(lQN(91n_H){E?0ZZTFKSSEfvOkRxpJevx8%EdITHqXQg!0wssYu=p-z-!+ml=dlpbIL}UHNn^HFvhc8SP4y|Mbgqjz zdVwr=u&BDZijy!@`LW$%e8vKPh3LCtQFJUN=BpCJ%-;o>wqVu+AOYfI7AJAI2ig`# z2het5^(ndU`$tiHY`nryTOS1pzm5(c`?b}Mh%ZI|*_P3R3In9z4v4aN3So?Dt7 zd)|I3xw?N-=$R_5DsNJdfC6GpNfsgir;AdR&YL> zV=#!HgD^C;9fbY5DNE8Cy7@ah`*<(Cd5+D5UY1<3*C0sXt{keQB)o`4@v`w2GwB&O z4{gQH^tB-wh>~&Le*WV{e5`J`ZS>+o%1pEe2=ILMP5?9{vfMQ@b% zj_<Ih|CE0jpgSeS*^|y1S+1@4lQk-sg z!&sE37Nh|jrD^`-=(Vz7$x1gW^vdD>mc~1t5K;UTtHr$RHXMk`v0UPMikT1w3#?ch zYB2sD=3iO$su9#O#p>?}nAUkegx5Zdrwo@+6H#{_nl$k~* z75@84Dm?wA9N)>hVy*xR7fV>_jL_fhl-ticIU#oOE4R(9{F=jQ6V>)m=L1&~(vpQ+ z^F$Ka^KLzZeJeo+sUr*WkCD-**hl_jQ<}>Iv73EE0#Ac{@rm#1>X<`*`?`bO zs)kL0IVf>;fyo|?&xs1xC9kPNHfeHmi>>#{BE*^0#u>LUbQpbi8#~QEG9S{# zH+XGC6lBD5HZ`%Dbv6$ln!)`{fYKR0W;Wm59$USuPWZ7z?YzEmC61_MTr;~f&f2C` z_l|=2)SN8@-x)R-VM?n6#@b&blVEFoLK;+%2WWLwiSVRRzB1F}RY=H|4)Zy#L@ZLC z(j^veWnw%by;RT|GoM<7a3@&eqe^oj(;2$tZmO6|s$$7B^IqPbr~S*_!D-A4u7^Z; zAno0Qwyack{LgV@E2Lpr!{W5Y8HpE*m@kEL|H>O2O`^DH=04sYdp{1n01R{qYvu{2 zRxLms&0(0^%=)UM-=RhnZi=MjYjQP%H;x4W4oI~X+~7y9U-ckcBi3quv_B3M&HRRh zBWJEAbq)%F_1`NiciVB3b7Qs7vP=G${HGGM7;5=dnQKZmMZ~;gDT@k((GC zkZMsNA=M#`XE{ZY# zF{3?0KZPxAuG&Y%QiEZ-8Xis3F=hG_SyIhQ{GwQn7ao{R(dBBw{$t!v%Ga~^Txl`? zAjbuJ9Xc%&t?;T5*J-t4<10p2A6gzRkdspw_IZuZUJ*ZVzkgL=z~6%sxgQpV3M?Y$ zkHyEu*>))?!_B2euRb%2dVG&_kWqpE8an?UORgMx{2!KFP~p8GOSqaW0Y^aWQ+7DI z1t^jY>nR!mhs^y;Ww3|L=D%YJe-7)3v+AdRJl5v8(u6>8G%d7uqyVxUFl8JFvcS&` zj!%GLn>=4GOJ}23i)yoRxravt+S#g<13PoJ7rI!pmJ4cFFLvi~r2SI>E%ZNNkm#Qk zvN&aa00fCw?S1A?30^70@D+mLE)hv&#PQw8bl+FninhQByKhgX9qZ9gVN6t=c>?My zK>)E)n_tYZMBbFMEpB|ksXKJ+{fZ@Zy!3Hy%p2c19fJ*|9$*_-^ONgrS5e@ckF}}i zMcI&1%PlgW?ZzqA6Z&S*;SMD<5nOF%@<&Mo;sdhtPS>)#@qfIc69`+Jq!o_K7Qw$U z%3gJU<}#)IcrgWGz6!NLjN@)vA)a|!$D}QP@oI@AD-=eW`PIuEqQ5W=x`U|bNdljz z0Y2y;rJ((-G>OIQNpsv~qVc_;7_U3&VPV2v$C~%!WEXYQ3^^mRe7)dTda5yTga~>E z#czIrD!nD8n-^P#vttRObe0KASzp>(UZjc(pZQs#B zZmpO0!MRJ)mjYEsVTj9ookJ7}miR>Ez&Bg;4|b*Ii|gb=U1A7y6Rh`|CpQSeu%I70 z4-)Xte4wWc6J7ImA3+m4%u5iOvk{(1GNN4{%2mJh0^eESk;uz`>Ok(#MaAe`Z6*Uq z+dD8}_zLxl2iKO4f(lbXm)RA2&6W8wWqygtijO}fNkp%k>yn&mDZ%bsJ2nJP^sBH> z*2<7y4p>sDScOCofp_;|3L}*1d3di{js&q4xJc@JqPHFxncv4>C;^k(%}2^&Vf6ftSLBN87m2Aara#Sm~}MIB67lWr~q4kx74b_30R%3F(r#=C^TegQO|V zp{HQ7#dl%rI(4#}3x9R~?c-cH)fRn&m*wW?a*zcrcQu!rcP2{Nc$Pbr? za_E(8O5uVb?NQf-66TVN)D@tNKrx(gg&Gp`Gc~q9j*+H9QQhng-VpiQACP0WSESv& zdS@>OdV`mojITKNeG$>&A<%`w{)qb2hR3)qWVQLZUR9kvUU_kXx39HY`_mxwV0`8A zX(ixL@J0s{)m>YGTE850*;68v;#Fs9O}pv`wa{X9qyn|Q& zzv-YF7`bcx7B>abW&MI6c45i zv!S(HVoK07=$Zr5Dod?Se2}5w(H}R^H3-$t{r}OaCBZ!j{2t||mq z2F_mPy9BoXaZ_j@hWlB)u-1LM#MbPK&{OBYu{I0^!m^wVoE%Wu$Jpu)=B$@*LJLO7 zy(ZG1BPcW&Vvlqm(uw{AP^qjqqfZsvtBGLQr!SjxrA0!zi(30l?04E>|LhMYmlP$x zaEY&1Nq<|K-IrQ&Rd%Y~KL`t42{R$Ms9~P6G|EtjLpZQ1Ky-8HH#!Kx{S<^o)z3)1 zxmMk;uur`?I4{SXf_f9ffvaIN=gMvPDu3VLlx%Z!_UTx0v%mM0=HOE~X4~hmU!DSx zKP3_R2qi|d{Yj95gfj3sfo-Zt=6a85n$fB5Mm>h7(Ff(RHj28V!iu-Yx2m{7oH$RB zSaLRdNTSKHpqKcUj-PyeFr}wPJdT|+h;wXUo7G=jgBqQO17>)(Un8AcKM7kiSieot zZ*jcqZdf80k8pG+?#VBtqm|W(wEM5Qs^&4^UW6E8-0Q?fQz*Yua4_pDM_|WWams3R z)kt3St%cq@@C533kaTAK~eQ)Xi-z`d+1CUN7eRl@E6&p(p|L0BXgq^g?;i1z{sZN(TXbJ|-)$Xh0F7AL`F zUPOxJk)uK8CrNRFlN0XQm02M~%WMcp<5Mo>+(D2HCMB)1Ly@koT2&yuXp`gI9@{3f z$-z5O+>1~R!zI}JL}(aeom>E3l`MD~cxb3m@3q=MBC9~M_VeKPg)X|7Igk+vuWV%_ z8oirSlq?NC(t3(OysZ*?SpPt1Ua#iaA73~<_6g)K4HWF1| zDJ4Y~QzW!jd=az#Agx6(W%peanI)eFZF?V;odE0I$up9sp7WkS9pn%5U>x}#mEpZj zM`VSX-%;98CEnl%iM*Iu`ftg5Vr*!r8j0|e9+)r1W9IMwayq6WkSU#CMj44hSD;i=QO-Ic9v+h*Cau3#LS(4;>1i?-3^Otdt}km6#tOWzu1FO*Way}!Y#OuF7}w$ zM<#axW0A=epFrBP5+;pzz2^>eY>$o*ev{oicoQu$2Q|N@Na%JD68)f$-Vd4T8PXj! zbp_olmcIiq+Or$UqtPa!1q1bjrHW>1U!Xn(99oUIL}YrvU=2If z3e;s#2|T?2{!afunZ97RPtDn@bOzoSW_ICt(-EAe(6t-y79eUB3xOJ)iaLOUq*5P- zY$e^nSr*@fneJfbfO0_D-4I`hHAjYmY1_?552uQ`m{#)%D@jakwMwG3nn&#tzvpl5 zi2?_u02i5)_+Mwva^~T(C)Sw$d`c<)Md`#ZR<;WyBkuIsd4G|%^d-JPqJw18Oa{=< zQG;B69<}Lz@um6q#e!I$=oM-e2EL-Bru&$L_pppSVm{B?3szPpux0{7i=5(*m^ap~ zWD?>fY7llSAXN~c)u0e<2`$%Et&vfzN$3Txgps$nS^vlUE|+y#NAa5NgwP4vx;>1w zn+19}vB;wtfh_SMiu~x)u<#tik<7q}?%J})>C&1j)2Qo}jatCY3W)<3x4=n@dCRRz z!@f?K=wQ@HeH?O~cCLd)D{E@)*xGnAon%3;gq>Qwxrvf|YkpBKtBUtlxS%p&J^4iB zc6H08zy&zu1quo?4_qw*NUctI8?w-XWLV>;(MXcb`1ZX}iZF|F6?or9EvjzA91vq_ zc#(s`4B#UDN33WbmGZI^YRTe;01ua-i5RJ#H9wSVCD;=Ed(m^0tche%2uV8^VbNbO zcau}w#Jpv~FIgR<63rc^8B~vtnD4$4_jdHZ{6>G4(D4_tb;?{ON}xvUMg_5+yWQLi zT`K*`ovN%(wK`3PAhxI~pj>?WUOj^DOQ*l*rMj3azSP7C9o(%1;QlP@a#(5GAq2s- z=pmt6hVVX;gan^Oi3Z|DTr8EW{(5R6M{PUtQuNpDvR7MqW&DCWwSen^r`ltYy_5rd zBf?(|g+|*GP+k8xU@Nw4p&bM4c)4L0;<;C=C9sQHmQVMn9{WZzdkHSu&gF5S`IRby zgS?lOYJe5Q;>#b&{uC-EO0sTO8d7X2FIH%tDou%CFCT7M5dO5+j^2ZluiYRbJL zpWldeG)r-Q)DdxP*Cp5$XF;df^0_{I^OpQ(Hn-g1)q>Xj6*9ro_sRq>=-crrjEJcq zaXV_-&d^rXifoM-o?fHZi|-Ks#X8Z%{5?aJv(*TA`Q{3S*vn;Ht-y@#lc&)q@B*>7 z&&y5W+4K#H1HFr~XR2#yPU0`qU1$_T+__V=ctX@f@WS9H~F0^ z)f7;n|4M35MRCeuUYX1K74Kh^A`^iD#sV8p3$HA*9#R&nPccew;a93xTJ1eD=8HlN zgW!_cLPzccbo$2UaGKb3SFe*%Ux1Jx3wM~i!QRZDyJI(FMzOlh5AQ%uI~<-Az-$S9 zkw-lfSs%yt$SMlsL|$lLm?{||3rCE(U=!~)RCL}At-xmX-EM3SAIyb=>-?Vh_Ay^E ztc*U+hLjsz@HVQyUwL^rrMBHgsM08!L`U^)W<1{>SoK|LdyCZt&FM5YV~fyi6k#2i z0>%F)x6J~wn$qk*v>17kah997wxZ)U_kDzwYBoBJ?c&z&r0)t`Z0ZQp!e%bqyv&<) zM|jNjDF*ilr_mJs{DPA5zDbpFIl?HVkBS$Ieszu!B_uI8wOy~?EHZH9OZVupk9`B7 z_MArhnkq&M+|B2Z6jx^pzS0rE_ozrAq^H6yC9}~UF=fJ)Y^c0q_B3yx)(Nj4B+oGuIIV{!AfFGsd-37{x$0J8DGG~SGUWy~p0sCZ|w z_v8R`)0b$J;F3kM8Ji)AwZ_pC&$a!d>(VKa1Us54G~$2;FH<6jlQa;Vlgj~J`!z|L zO7RBg*d5=Y{LZuZMs-1I4e({NxoTu*lo{Vf-iZIgFLc%8x)Wb59icpKxMF6ub+J&DW5Th~W_LbdZ&N!K)IO1^bHkJJ2@)6KZM>p;^>*c?}8uD04!plrhP zlHh5^)|D9tBI1vTV?9Ot+ngM$896EN|08+Dg_t7nEtC+1wYWtqa3hOh(y$UkP=!*i zJNPiW7&GwRYy)rbVY|EG-n6&HP@B6tnvfFp56`xX=wr?8U?GXgvt%PXKQO|Am8|dq zQqUJVQZZnv8D5c)re8)u&eGt+EQYVItG<$XX=N(fL&7^i%x%tJ6rb6zqLXpV!dqwk zJem9U#N2;rPE3^8j}zT%{kX^2#fmfck1_XSn0xF8^R;C{niEZ@s|k6NF&8fAu4p&W zIhBAp)2!6+kndvVb#vgv41Zr3&uj$CsyVP&qLrLygc87+I}CkliWZ{w2O1>T{Q@Ywv~c{@nFWB5=D)tb7GCb+v^jZ7dS1A^FCbv{mnL3Zs!D z^IxCF)a1f>)*3eyZ}Ro5hZWI;zRJtR%FJ2`X%i*f;j!=&&pl4}+5Z!!Yul*~VjE|&?M5>N zos5+!7;TSSOl_{>e`__L@d1bZyiA2Mjc117%5JgD^9KF7@Hq#>wNfzUWGCMUZ}RHUPnO!DThKADj3X43Ze4Z(8vI8J zuCj~K=Qh2b(A2GQT|!hNi70y7>PHkDFPc`LW@P5K00*u#9C8Luq|Tod=)`5_HhMr1 z3aw@Un;3Uj7wPR>IIXFwBib8FU6Z~Yjo30qPaz&8z} z_6ItrYRmpfw#-pPF7Q$-pZYBgV|Y7_h{W3HqY+`a$Qu-BBht~J3#U72T8%+E(3zsu z9!h*laGbkcmgr*aK`bNtR)R>>+$U16&jIXh zn6pEK8OQzVtO%R&c7Lu{WY$a3Ldly4oXm(4=rH70_2BWuvf$i|P;?qa)w(0viLbjY zn3-RP)2A{t_(tP!7kC+M_gFVY$~dyXqA6I0M6M$(D3$dB%p=FayMk#!7$6*WjhuiH zj0a=p#p{@8Wl5*i4CkgAd09;?c!j;~#{1KU55r@t!h>VY{gjtoE)iVf`}=!(7rBMU z(zBb`_f~D$Bp%rD$&v9S2=+cqge4gcKrfmPP z*e~+pjvNYJ=Msacd`uA*K6sYGRTRXo#W$2o?C6CVmc}|P5QG*!yq^;pX%LQ|51F&> zQ%B~QiB@a$T}-s^V8aMp=`CaKfaF4Q@l)z9)0_uHczjmwitm8enR$CZ26Y2w=rG(> z{FY&E0yp>aSjX7ih3Es^pw&(TDMmREOPZfT#eBP&^NrwX|3Erz_avjS%#SgqRP0HW zR^JOWe8B)GUHlt z?o&~~4di_bJZmexbsIut9Wh_{Ip>i0LJ^{Z3$k$k+^WV_0$f^JOLNF4)<8;rgL`Wg zPKL)p)}iOSCPL&iYXJyAHO-Uig)=!eM{ni$S9wRw0W?WV z^_G#>;ZG|@lZVWnU3rOCMwH=k5koIm5*ai{h{3tvr{JB{mom~e?-BXrw4tibWo+nR z95FX@&5u{x-(RMxJs`NFKYkoy>p@dLL~q1#h_?{cj6>$HkcQw=g#!piT8lYm1~U>{ zUuK+%9Fn8v$5)h4uSz@Hct}2AD(dhGDn)o)Aky+{r<#wyk+@HYId9{`kn3`&KlRwD z7_KjIEqgt-NY{&1>ef4vQRAXaX>CZEtFJy8(+VNIVA3RjPHkwh{CH9Vhc-MFE3F$? zT0e*F7jraz4azg8K&{MjYmYR|((bn%2po;g((bVhR=*3$EAZxL|DfH~Mk-udHzyXo zN_{5H^}F!P|4n>(Y^l_+u!&I@Bzy>%t9HsP;Lu|g&@2Cz#E)OBVY6}fGHJss?b`6% z>wnO)vlecb&#!HpKY-xngPQnrP1_IJJz=_Fo4xI5{M=Trqzbfe*tN)Z&5x7BZN|D> zxI3NoTGfeZxCc)-*1e>%zg#$0K(S2o9p`lJ-EeD*m?6ep@77|BIB&0r`(Q4~c9ER` zMU*iFzXN*!d}2wV6(gXWTB|l&?=As>-LXe)R!w;^=rR&bcsPx_{-iRufoVzbri$VB zzAwJsL|IITIe5X#(5Q@?G5Tz}`1jP2mEtP-6t6iC%qPAQ);2m`t>(SVnt1WZ!UevZ z_mm#4^vdXDB9n>Ft?uTsrTCf)PAPuzhxMW+%OgGa>VAEzn-O}+}$PS z*Q;m?XGV)ib(2qG%{Yp~RispSYIVHA8O=&{OU`Jp@dh7U2P~FF4T7z8PMrOtW9>D% zrNqHx{tAER4+v6Go7Pul`vYa^Y;hu3OweTf2dYV4(%dayqNy_uJb^R0I7)*i&P1% zR``kMO66*`6+Fwf_*%MFK<8x>{FfWh^E1ZDcd8;~n)wR+D26Cna9p5Sd-~GY5Bky^ zA;?^AQy;1EA$4jcj{0dH;+%T({)YIPdf@vA6L?f~l3w*;h8%Rh%0#BmDW_xStvK6k zf}$+zg{I7ulA&>N|(ZClFwx?k7pD5FX6Xt8lyxJ)t6@e^L(i% zRVl4@6fYTlV-oc`;pTnPtcIosUDHP!DJx-@MEX($*1R6bU>L*87Dzzif51A?bcx z)rt+Dt(C!lF_J#f(Cq-Ksx!-OQiPZ_#}`?laS6o~qYL zbr-5Gpc@wRHmnqEEAYOroSkVjSD!jVhW4}f6WI%NksGGq$bsqqGnuQ-^2c4c3pepN z$JXTY>tbQ=j7XXFIP$>Y$b9oX`379GSU|C1GIB%2f+&l9WB#>PH6~kP-}MTZ3qov=ADrI|?$=n}ccuu<(8~!7^kIXpA98cg2tYgcB#@jAM_`y7`LpCA`?d^qRUC zbVmtCY$*#{qI(62Y0h1WH>h-p{=-oUC#^XD2S@*Pyy&~KiR7}Op%sIJQIL9_!V(qe1LygzpBJ(bSE)$g|vF{+Nk}pdn%U4em(fyI=hS*1PWw>8~r5swg z13HJ^LSeB}eD9_m$Y5_!gEtAt*@FmlPP!|PTW0UM4;cp>kGcAPT5ty2wHOjb~UeX%9 z`8@;S=hDNH(<{&vOmFjF!`+~_-Ph9Ct5_}tpgWP`ef>j++_y4|Bii^)Tw65PrsyAO z0eR4GWrH|(5t#);brJE%COJQDIdRc9GS@C=bKvrw9)oH_9X%5-Iti~= z-Jo^UDZcA`v5G4c5Mc;Xyh{v0uJfnC5`c>kJxm{_MBZZJ&rg#mZgOton1T)gj}3nl z6CybYS8|fWJ@P@bh$p$;LdrZs4YH@kikX_xJgV-^5mFpd5%qKb;v z6Xa`OoJ+LKyU!ConBi%dPf&F3VITh+?ZfYUSBdz| zhXM25isiuq|G>ONwTh&>mExfLJynyW`DnO2p}cdm#WJ5m6Im$^l0&Zv5ApZE6*32I zqxn23Aa@tYNbJq+9^U9BSHE!$DXs8>{3f2=#ur}WR;I5ef4_PZKkM0~iqw;pE~ZJUdY!c1{9^}w z)!$BrjB^`h5KhopocN1g^EUjc>Lh+43wWdOhWUI|T;1X{zS*IX^!kfE4P%K~T6f1k zt4>bEJd7jCZQQZSqq*SsFKW{3Gc`whUD?j66aBFEX>nW8=;P{p08RkTd=4Ik{w*tH zbDj2dAU}_p^PHWr(ctExaC`=f=>v{>2NL18q0*|OfQ#djCM>g8xvj$CrMGW$xT8i+ zUYq#k_%#E=acf^~*)x)=OUXCzT@~4}Uu1SEUQEU6$5=-W_un7Pz&&?CWe?#OCgXxE zoMvQ5&GPF7UhexRVS{&4!2=((#U~WE}U)B>kx3kj@;LeXIQ>jFn1)`5e7XtBe5%@bF8 zq)L!(^b353xWixC#4%6dPA?%!6!7+1g2qn=E}i^MxG#Jg9VXvEWx%n|e1Hl>xiiq5 zO#Jk-1oa{K>}XK(81BI>c2T9=>Tal&C1t+&ysQoS_-=P#xW%`~9e6U^;-A5VS6k78 z4cEPRT&`~-<12_BmKj|#rL_LZT$izx>C|`ZFRi=DX^cq;Jeg+k4b+3h?m(=d5%?q73a-xxSM9H9v-D{7aul=Ps9iv8&XYvAl)tk%z#_$~{az1crZ zZ+N^#4}>N7bGt_yg}%qA&CyiJaTy=GjLp$|D6utBBEzGNmJ(k?$9RYeS)c8yfqncS zED3$s558`mKvO|9;$lwhdf>!BLQDrv4EB}qcesBd{`-=K`&0FnQrJT&diTjGK(VOG z8nMVYmYvQ`!ae87;Xa$IcDp}c3MNJO{zrC}9(*iCPd~1wKb9E{>%+eHU+)E?UBL{G zKq=?)W>4~5_yFNFm%ynfI5*9Uvvd#!6MKWlcnmxOafMxK4A%N2)D;Z#RiCKu6EK{V>BeKeDxWAcp4P&pQp zVirie6djq6v9aG;$F`1bdcRGMt$57R9iQSvpgj-z2%K*KD-4n@HonOlNJx zpBhYa_KWzhhM8Cp{UWfa&Eo6k?Due+@1lX1zxH4T!P353m?26e{hYJ-f6>i0lQ|8tcWna3(x}BW9lmuqD#&Ry4V}nmo7{7q^VoFw#>b8>e53 zoPNt;eT9CB3cp$4?c$IHE6anECI%-=4vxJC?~%qa-Po=h8_*dEoGR67UrG%?rvoqP-H_e$Gd`*?u;j-@5!{MGTE3qG&bw||I?;~gO#J-u%3QN?m7mh;lLQq0jD?|e?Y^GF83UFSQ$oX&&)T#lWXtuwFG@&4QAIv=9* zcAmoPQ|LVJe)o>5Kjjb7;e67%o@fKqON`muGg){oW`_r-MZarOq!@$H#m(6lXYv8(-?bCf_HiW zS+2+|D09x@v2O9Z5IAtN+q%_ljCEI(-ir^NLKEhcZv4xsjoy#Gq1Ou04hQQ?^KUtw z-1ql8t)>K)>Q!bvh~^oXUyn^H1t&+L0Dg2q70zAUr~u-(H?xWeYfQP;Gr1yLEUFZT zE^%)~qm14J_TTJmc#J?*v6ht7D(THP&cYwihNBNu@w54g2*i$O*!(orW_$E=P^cT9 z5Xr)k3%j)qTyEMt#)M&s2DsD49w@zF_;MBK%=YyPW-ik<7~YyD{#S9?iJHf>N5_^2 z$4+-_SR< z0S$G=JL90Zw8?X!VB^?=0>M?TejP5yzQC!JxmSz{KJ;o;bePN7i49TI+&Z~#SN-qqK;KI??Vkel%yzeqExlu$!_v$dQYRA_ zpXnZ5Gp%O%+xX3Z*A~{H6sF!YH4A9p*ce``p*Gl(<=7dHWH`Q0envUi2|iyVXQHt) z+;WL-Y-Km~&>cs^-z4+Clow9NTI;s1C47q|oKP<7INc#jx10Z4rI|S2XO^~jo3wMO zv~v;B+Nmwov6K3koIcyF{Wf-Nlhn?new*cYTe5YV^?Ro^oD7I0XRiN*?MEG-89V8T zTJYU*82Buy>rmJcUVBBjrMGN)Rk5qzHkV^JyISh|EZMq|-HBuRJ-_7Njem=JS zIbQeQZi$GA11qtcm6%peVk?PB(>WVuK8b6>SPFcX2kXkgxcCOK2cKIYsq~F*BZuwN zl!AKW1+ad>R=!{8fd?42wTmlDsT7f(GD5B9yVxUec^#&&( zc8%{zIMl7>vWE@tx+b+J-D~6?DgWGoljT07K;g)2#V>2E$y15-k z-O0{R>fFI+K5;XR5T)*In>|LGC)_m5!^?0a)ty}Pi2#k)5mvHn=O?tXHu@^aOT1}5 zCz@Zd^!n&5QEJ+r$O)!rxy7L0o2l^Y%+X>pG9|2`nj(aTskT?4_$1 zuU1n}XT7*B4u^kIW_<4nhp+WGHpDY7_Bt5b4sX9>@}^^3S-&sb)?;408CyT{B)_y3 z_!^gd&!8r+!M*EK5BLmiGe@Vl-`28zCp?a@*VyU_ugz!FS9l#e-Qo3@xE;qm)`%Cb zrS)@Sm)O0@&iog=#@GUHvQI`@ zS>&eZYi?uGFmLiq8Sw+9ZeFc&8qO>3_Fy><&g6Mwhz#D(!8~YKwGCeu;M`6b$Ymi zse%1VybVjr@l)C2Of9ckQ^h0~exnX24u<)UosI?0JT@Om0`eKu5rE8p5!D9I{oDg{ z)>9ZmwvBG>)i7#$ziv~H8$8CdO{C--mwY2Yn1=0p(A$y?5PA&xm4iW!Ey56HkGJ#Z z&LaLyE!BEXDbjl0Zr6I=k}W4%Y1fG+Ow`2W2s;D8U2vH+s0V+I;;*G}t-E-Kv0EFx zkuW>oSh-u(-w1Cmo{8`|>{=F^B`5Zac$E>pN+r2v3#0uBNbcM42Q1r+`-;E)gq3*!q$Y{I^ylG&RCTAYAnZLHmE zO!)u8eNzsU7c1`DQCdN51MXWIDY;&GjBe(trV}y3)HzOzbVPQWcnoM=%7t$n%3AEe zv!O+A+vTn$$ItDkn)!x!FmNW4sstAx!V)gnTScc4@mtuvEduUzIW{=9dpeFPPg1L8 z{i8GA-*y9Pj0?_Z5wAok+RR089yZoie;Gr}G-rE8^;*#c3xAUV-p&Z=-1DM411DjO z?ZWtE11YCAY9qkq?+LHNCfT81z?X+-beGl$HwVA48|m$*+@%$Zy4Ae-13~z(s_#IF z9y^EF@}~*Hvy@9MCAN9ybP`n$%!@0gBN;mUyOP+FOS@Gb*4My0uo#_=?Rv)#P)`X* zG4kE>{>(((9mmv5SAAaZh`=4b=H-IXBpxU5V6jbKBTcCc>Bj2wjkyT-vPK#!17Fm2 z)8Ci&5(ST;*7Em^_8+tr>rjNTs%FbH*G65n+f`_mzDo3aX6YSAwUuk*1(QbFrJ(ft zNBPO_216Q)-aShyNxVO%t!!FzzDsr80@DGL#=pQYI` zi|XUWJAS+@NnOjbBQcxb$5(;;ByA;uXzJ92qY~OwU!^9h8&en`jZB}lYxc`t6x`fbZQu(uUQT0A)kpS*Ie#dv zI%BIWs%m~6c45<(DVEP%tX6y2s=s6PA+Tz#>l54HyAt&6*j{z>a6&)3t^bU^rnj%P z`m>))~y{|FTk>`-M|Ev#*~u?R4n&^paRV)aNLjDjuAbKouubd@jW*8)#n$^(~(|koB!1EWw z$Zy~exr4SX4pAn#kB%r+4N%@WacFQ(ikNo@SEyrqzi&87N~KgReW$Mdsx>qlZzpjb zZ(mOFqiOzQsLy9Q3Fi9^bCDH&m;(|tzt6POkf?URr|N#evkd8)pD-jsotf9a5JzY9 z=MoXOCL43ooOMs(Jn*S3khZyPpy2Pz|ISOrt(XO;FIA~VV(KLmc)r__pHNqv2nl>! zs=N=nab6N9N0cWa91bgIL!)j^$D369@4HdP}D@y5StRc zLNx8+{EoG2DE4Q&Gj*-!1o@L{-iD`F$mYPh(l~*_%xCyV$+R!gYKy?cfhB1ull4(4 z@i(2RQdCo$q*6JgI@ymhu1nRpB6I#ntzJ;w zv>14=1?&1ajGD5e>v1ugN{V=mkmC4qkg!s?{_&tRk3v>$yNX{SLFq-TIlV}&q}_ZF zX%GjKgoO4Q!=OV^K}}N{59h*aY0r-);_Fkmlsjm47V=#%>x+wpiM+v|8(Nhv%ve{A$2v%;GmE>H_-7-*+#7ZSKhYxy2srEaqD8~5mOMBSahH6xzBu6IXF z&B&F=|EhnG@j5o7uT|l9pz!6x=8Bu{g0yUai^r4Dc-r5%;B;mI6J+_lzw8o(ex*oCiO?DVpm?7CmX@6!)MS#c75SlnC-3b2q$~Un8@L z*mZh^^)7VHJ_6#w1(_&7JQUbZ;KU^V2*C?i%gP^+l@DH2Sf0WD6aBu{=D6ZOHjn1X z!GZ>wBR^x*Y{|$nepgvg(!ns$i&_yeZA9j1_h2cK^68aqk9J>18M=dd@R5{gy51<6 zsBoz85qf(!D>fG>{UWSGyU>?kB(|p#%W{`OSx&Ke`#^Qy%%IZ@F`J=?^NM}!RcQ%Y zcAxnOz3?B|#DbU`c#h5t&D2rdn(oVx#-^KJbeEZ2m|x1oWMxVh&|-AvKWH_Yt3|h} z6#WU1igQ;(AcX38p!3H0{TfE&b|b&?8scX@_F#X2rH4$vRy%@TMy}%zFLLMb;;Sq& z=5w|;AS#lNHSOtVsI+19;6P`(_Vj0@1E=2CY7VhI0;fK}?}SP$(Q5XQs6J(<16s{@ z6sta!uhOGcevwKSs5H2=)K@BcK#zl#(sg3Z)%*oXx8(Rm81xHPQ*vt!Nr+h&sIiW3 zBXty`uP;=HSzU(;!zweBD_`}XFn8Ddf`;-~F!SftCuA3B%WPy@mPBSdLKDyT^ zZEN146pg=!17w@a7@oZ=h=VIin?07;$ET9C0n=CTzs*toHIX9=RhIC zUP^wjD10z4e70}(K@Dm!I!|8YnorPf6*^j|E-UY}pk)Na=IH}b_H)2H z_#t|;nhmhMR#Qw-xDNSwg>cmQ@lYSIJY<=B26R_WEz@E#KR+XN&;wNwdI}4A(#lyN z!pvnHk$+3-eo1{JDK!fi&NyO`kLB}n>C;x;sEIO*DX5QN%Cx87Co?`zw@@Y;F<)jN zqI>w5d*DMjHwb^1gqlZ%OQu?fm4wFsVdC5+dEmGdxMzIsZW#G{XW=)owMgQV%o`Hj z%$1$#frC>(+~y=v2puMhMHkC!>qGf@=9RRfra*7-4z_gcZWx({ThAdJ?lhDWk@!ji zPhy97329l!i+L%(ugFZNsIkbzTgZ+++O^#yudwc24_&)YFp%h!+Hu7ew{=p}0QsZU ziV_lFvj%(?d4ROE@U+bB%RHC^aQYj0K~gO;x6eunYq4`JL>4AK`Imh1sJvb%pZru( z8h{y@LaM7DsXyw+!wjLJPIQE-PxR&Q{1UY(WRi1@l%FF+d|^G(L*n>8$8UttvZ^A@ z^vVPzOACj!IC?07D`b8w4S&mOd)R0N0#Uhv{JO*}3j~M$@v(x(e(R{NSrtslZ?|AS zw1Nj2_05Z@yNvqkfO5d;5 z98ig$$|82zTvht-Ha`RxNA~hgTKST>j<5X)dNudk=x}J`4D-#dY;aA1nu=IkFr~Ug zutVh+_|N}b>?2lRfE2>>HWDy5U8`9FQ%{|D5kIMh0ADnf*!eSepEQ(5JA)Q|f=-#* zU}ZCaWr;;!fKOF$7p0B7rK(4qF&87(#6V02~$bEgoJainmcS&_=q2-?w}9?0UvHp##v6k&&Ll?pQAn{KCkB|EY5 zNTi5z81ueC(EB%_%2S+$5wTg6eYN)lC%-J~C?oGRvo{|Z&E`I7qvKOzF}sp!2?`!b8ry767DOt5qA-y8 z6zRI6`+RG2GXH6JOPQHkA9yRY{x!G#@g%SD;_%kfI7_cqTA zluCmOTZ_yhYD!?(0wUJ66)Ak{9Pt=LE?viZASXp0 zUIgI;dz2zE(-spO^tbIk$Ddg+vQ?Z@m&Y$|-*ig{aLp1hXA z#iXE}jF!k-@z>PS0`l>o)tsaZJze!awUenv3^t&)=)r7%PiSSa>3M5DQEKSRirM1FU<73ecD?JN z{+46qb`p0Pwktck`L zQpa{tUCqNGVzRG-U{?9DQFYECd81mKLoOF6k}E{EI3FmS)De4K@TAT}G{euN8M zT;w%o<`-b%B&)MpAg~C%POYXt9g^vkfmBMO$UjJ5Q5n5iYR;3IQI@CL?NEeVkzF+i z16YQNn%izn;s~|D(-@N z+06XxXfN~m&?(TZRbRo1?zP}r0+Eli&X>=XlA1S{B!$iHOKYFy&*a&FW&`tb%}luS#{sJDrWDtgf{HyCTr(4&voEwQcA%ygQKN?^?J za{?Q%W1D>C=8X)QlvX2t?3Kmb&q>H?VLx{3Utx;M%SGfVyCqcpiQrZHFwdCRFZOV& zl7c7h^7&D0`1L&|JCE^Gl=r$Sci)bIbA_y%iT&p|qkLD}KDVzTmQ6}%9$2Q@=A5)TP*b=#l zkGQnaXP^v|VcaEzW_iatVou8lkJdOQ=7u7-*rVB1CEr~tqaj%2*CgapeW4;edp0K; zEjK$T&AQA@#r|qRF1loa1%$&&$4B$zi2s8Q{0YZrbE49XX5QSC6jO)dPUD0&s;w&) zoN-EGi5H^Xh=7+~XNp5t)@IZ$Jmu8xS$wgWLFf&cdBGtFB0J1dx*7W@dVmun6KG!Y< zh(ROy?%WaXJZ)(=vVSB`586ia+B;)Gu6M?C&b!$K6%(dZjJbDg(D$LGtoYEPfsMN= zQ57;eAj{XW^jz|LH|AnyCRyK@9V*LbL*f^eTa*I%bGrJGQ8U$&?6W17q$iP!rk_zDy3V*Nzu{C@bZK>QojArbZe$#O(a1vS; z1>U_9ACHgGAK0YsAL8u?;?5efKqQ)V5N@1R%D@?-LtP4jd3ACx0KyxE8)M#=P8phu zzcum{?3d&T^F|I$Ho_#Ji=LSsQj!r*#%i6DMEp&@0K6NhaErm)5i^yqXiLTV6cZ)W zYeYphTpXR3qcx6TfM!hL+)iuY^H>yr=~O0H%ZVb(tH3D7JpQV3>;?jqGbb&mPmHyB zgO5+fkjGQJZr-&Mf+G*!67(H}VHq0sO{bQs~x7*5r~uTpPM&x81V3+e|y_AuPVy6#}*}BhBdhs=IO#noQKn;K;Dqe}HtY z)qHLxJSqBZ=PVPa1rnG}MeS6~fq_E)Snn3yBDl0eUYe5^bR&lOzWC9 zW|N7O!?uu{k{tachuo@E;mmLGaIHY&RQz^G#`@)ZZzk zE;s`zskkXBsQdV^!MSW+MgMUpwMV8vdj4d&^!&(w%;HRPp$m*pjbp^X?tw_U2xmB~ z+(++mSzbicV)J^ORa7kN&U?r7a7 zH1tn;rc0-Q=PVGzEczFE2ANMiWt;K;v7JBQ3i;&tv7&l9nayYeqF z?~LbX^X16Im)L6f_r%+YO9{H#!U`@p^zlS%=R@;x1TdiSdBtt>`su-(Wt`-4R$HyMwQOP*0!hG)MG-}16M2SVN0I=-yr1uLCn4D1 z`=0+f|M#5NBbj@j`|Qj2`R?D~puYn7X0f%H$o}xI`w|qjtOUrz4tw08imWeV6t*XN zdLrA%f7?&;J3I1^vA!6J0~5>NUTK0#AdPWc74t;FV0Cv#jO$z0@9e138C9AvOK>Iu z&aeTLBl1NDwqc3ef)`)PC}dNpcllma+s;>E)q@jcMu7n7kHu!xDKmPJHKSjYou?j^ zDnD0q`LXgx*HPjknc9NK9OtrZnA@hZ&pK&KS&jl&&{s}(mHzjQHoJ4j^)Ui(Fdo@X zo)6kPqtabo`_Wi3Bk&fj)rI)*b@vbfXi2d|A0EE@Ry6EFV z7GrY9TGOG1ITD#-y zHkF;vu7VI6fKMWKF!f1`=RNNN_}%l;;dL`dAC+~b8&@7@VmION&_0dqmoqaRd$k*@ z%BI$PwX_>~6Ui&}Mm}%v%(=n3OX$ofI^zy353xXKdSrunlCJ(><}PnixCK>MkpN6xGd%RTue|{H5pSzqmdB zR4ZLZk=K#GeH7CzAC%rMGsDlaH?jT1eb~iir@8_YAA#pQnR{=&dLLR4RT(i7odoeU zAv55rIM?Qy;g6<};D|C!!C@6}sxr8`#M~>iD3yJcs)RplHWUUIVFr7;AZt$~S)RSl zX_)Q=XM-)AF3j2kwX;|PhfF0i&+{*>9n;@Q2s3);j*d$s_;2oBUoshTr8dke#-;vb zFz4WyeWI8b5cN3W<&#~3>gaBw4+ySh9z}_K?gK?ZPbQQ~fw{XNIOq>x143+d1v%3C zVNT!o0oNZeQ9$qDH0tKy2BBdU%JDP7;pdMs>u@P11qPy+CISl&Iva!jz-6AAd)Rl8 zXsvUT7F6G#00OcDdLH{!;SELNaUKe8*+_73zKCi;XIf0|og*jo3QQ4Pt$#58W;SSg zwAswR8RVo%O(>FJ)Q?Pw>`{607??FhmP1q{Pl>HK^-chdTaI$-O%{1U4nr0G*4)^Cpb0P zGY^fQnOGjS=jua+wFxg`RMYP+B9!B%M?3dO5^<~r1S|GyBqVrsFNP)rMgXQ}4&*k3 zlk586!nSPX^Dq{3Hwb}+Eng)p2UdE)JVB(oUvCzifcvmU>ajqa%v4ibSHyd*cFs-{ z{E3Ea)wlq@`K&$=a_LCL%aV|Yo0C&xE&}u%sr4u^vzX$!r8qu1+bqsMgT?aVBW#ti z#xh44VOxEPV7t8|7rH~Yu!`G}3adxBMaPyGm)XUtGO`5%gZvX`Ns-htqqaV9;!r0_Iu#)0JnL>9oTu=9XK*F z&@wvtj99l8CfEBi@Ji_Ko6|CT#LW}pBr%kpjrd5L3%||gGZiT1lj4^or^Oog9lm5* zfqZC;xQek*MG2P=(lU;*?!dJPs?lQDtsbN}c(f3$2$-=s7Jm?O)#hx{V^~eGe9=tr z8fbe&PbMt4_O^4RZ3I~nEG?(b4lJA;=k$bbvip8uLap8z#4$$S@)5KAz2Q^hKiXJ2InMl;Pj~sDsT(78=2~y`Hd>h= zIs-*^{|{CGZMV%f2i=NAmqP&?%a~P^8%NJeQopl;#Krm>?~OTv=hv!*slQT+Ub=RW(%&I>1ncwe;#34PP$XbJ;K&akuUJ{wqe;F zZ4i$iS+F?~y7>gbM#%%1B7gF*&ebvMfi$TW&pOSL@|yeMO*9@CP+@Da5go;HzBA}z zjL`A_fD^$fIIJWt-=FCbOe3K~u=qx*be%ti2qWB7L0)D3@gO8VA5c9!sEY5f_;=zz z6<4W|umrTL-y1Ka-!467et#H1<5W(*w!qD z(mco;jQNrEkxiN`6vqP0Mr?TS!(=8d>t<2LC@&mfk#83_ao7dl4BueG4+2GyBoiSD z_~pxkbCjKPz&r$JlvlJ&=onyI6id`a9!ZHWD8%QMD;p-+~TxK zSPr4kbmv72o|;`;8^-VIlj^IBUAS0^swwTc53?ZRTtrN<{e8qeNKa#_Cmo2gHE?1G zju__S8suX=Htl+3%y>OESjjXh>T$39K^!}ACYgZm)w}r4U_NLABJO+TJ|xcb{r47| z$0wTK%Q>#?D#YTN&>ZcW?3-UoU!|~ARR#{s%{C|I#{@Sfa1bwo0dCm1-oU!$1{=z) zncrB@ANbXeA-e2-+y|fvbx>Sb4yRr9!dN1p^oFpJmo1F1)Aw)`ATJZpn+YhO1S=}D zPqQAjU-)6U14JhT^E1@uf+N%MoK&cv<&sI8)5%18Btgn^$oyLW>nSEW!X$Ao>^<7gd%n%-Yy4K zUJ9#6CPuLS=&TkP(<%}tVM!7l7KF1@j!^lD#r^~I*g{igghOs&n_u1isO;cHQ{2H@ zZmw}8(Tm3x%H)qDWfI(gzRe*wjHhv!y<1jsxm*0$)6Z)3%mQ4c-!L2Np4nUy__1w@ ziyV;FsdYK(2r&0b>}u&>PDNp0ynMN(cZI$qoXp{B&>Y=J9{7V(^|M|)?M=vqI+q%t zl4aoMwF@1RYv051NOVIaML($ZeLA_hFv=g%qLzncx`O#0qTzMe_<7T2s)rt8N1IcU zxWYXqq8g05tpT0Q7ITSvT(bMfE}1CNo)NUPEv8Y41l7GN?=+uj2(t*q?)h@XHlW|T%uPXEuUI>Dr%v% zIRqS(-T&egN(gusT>}9Yp|@POQj5SNJjdXkN^(8@qV|zuRBm9?BF;-gblC%Fe!IlD z?C(Qya4+E+{VB82%IMLJruM28tZ)R2k*K~rg*DRbvG*y$ zU``PX8QndB5TeuyA8GRufrj&kn`>n)cbQE!3B|(uQP1C?!6e$4H**ODOLx=`0Jr7C zT)meY7-my1&XpEfYmh_W^vNZ<(nVA%F6ri93?6Hj`k*nDhZ?a~->#md9302E*w)eI zY7ZimsELD(OwQ4i7e_A_n+gjyP}37K{XQ5|N-NL(n{95NFn^mhJ4U8u5wZ&u5RM%7YYR?2pe+Sv{2XfAgY zo4lGdII7;fsS3R)3J60PwBa6k0@dJ-<)N=x>8d2Bv}L0$9WBDp4fzRo60LD`>OgC; z)q#~1U_PYW8xG%qK;4g>YUx~{F;>8gwa~FO-{ymO%sSq)g-9$i7>P=DiT^T@3o!k9 zSHE$veLBn|awY3rIR^r5iRg(S--pMX#u#PsWbWTZw)q3%89YtQWYa%S)mHGMW+u7Q zsTKw`1weJa)GMMw_iE@LS$_^jy_`Oqo3UKD7CY}DzC`{G1%q8I7;L318(T0*th$W~Ua?`6v8dqGf=jFr2)LG%4MTlC?@XZy7;v3)DQvt(7_1oES` z;QI~Rt})Oy)R$ba1P4?gn&H?3Y6U}m$HXxw`HafDIU*b&5GY5~cL#25w2(og#zC9= zgByE0ZGmP-pzVBV-2VVW@!dnmM5LUlKFrqcFm7c)c^!u$4_vKKdQ|nAta!B_OZEE+ zE7ijCAwB*5dotQ4q|NX1S+wjRahPRdvFsT`XN)REMx7gt;@X>#ov?!;2N~Ii!4OIF2HCHJs~hO$(h7FblEL@9!JoW73)#BV=zTmVm}XapvC$qbCwim7U`Lf-{&$B<$HvV~KgkO02nzl|rdwEK^{v z!wLXLF%!*=$nksI2Ui{S8HGzKZvQ3DGpY*=d!gC9@#MtNjrd+Z8Smd(Y{$Z}sQ@C= zZ60-R-i4*mYFiS4G6FjY2aMrbJbLwGm;Bm3lM1R0N$@}4n3rN}m>k7&66t_YhQq;` zX3M7TBTmW?M5x^*ymtCr()qI>G}+>{%@bUlq=sHAXz>U&9)HH5Eotf!o$yE>b-p}^ zOSV)VI!Uncat0}iIvEwAUI^qzOGqq@qiBoEo-kJK>Rr|qlo$tA4i~3=xp0Qea7Mkk zuYO-r#%i>;(?gDrC9lA;;S)pi(uzXjvl!^cLmzp_=0StHk|M&zpf)&My)#U7#(IN|$VSRkGoKfX>4;@GV?6PZv>CL!qvNy3mM_f4 zD_cC#H_(%_B7o^Ml(k+VTd}!Q>rZ`L6q+Ia;iy&MTej3&qPkEoQ@rR-urH#0YQS8a zn_UJ{g%;CZ*<^Kh$<(ZoPoQH?iEd*5w%EQ~5~wAc$rYRB7dL9xphf0>&YJ_DVnWe4 zwQC%_f8#uA<>m2Bhi6lN(9^U1F?B|yu)Mt0}xLOO^)Brt{@i=a6 z;VXDPbnYZ`(BZN%#Up&KJpXW=-m5HuRma0H&5Xy7CX}Ict864fSw8sB2+DPde29K5 z$14)Kl<&Qar%{>`1-fS-aE+x$it!0T4WFmCcfObS;x0=r#(5XL^(DdPPAv*ev}-@b zNY|+(tz*pJp0A6+$&pfI?V$^Gm5zFhUyTA*!AnRl$UQRm3e-iiYY)1eT%qC=@`3C1 zJf`b;Gy<=4A*uUj$k7(|E7Zl5PLQh8g@cnzOnC~HTn>%vY8#pDA1Ph{(+CojTCDdM^mvRo|U6*;mf#i=hU#K%b*E|lax~+B&N8WqVJ;h!A;~;->;gZ>! zi+F?!f=H=80L_7%x`N@aNH!l%e6gl!bNCNpUG<#UEPE2r!A~Zjk}d{V_iqeeB~VHN z)rMO)VoAh87c|SQMGFIcy`*AsTh~no7Zn}i%K-l|Wqn04r2cycsS90k>Nb)Kk`HT{+}!giJeGp}VfR-{91Ro~h zVdPNXU}Gt|Qt%o0f}$mgn~`tG3;6u0w2NzTALLAA58<&O?n=)KeCiC1e>u?fCb$>+ zVaC`d?NxUJZOa`1<_X;WziLb_{48xszC*VG^gC-y?lFZ2m+&fF_~39Zq7-!|Q|KIlYc&pV{KhgLiNotbS-&kMQhbeT~q&^i#Y~?l^4qu;1xEH37f1r986IaQd;_W`wD&VF|jkc8HtiuGBv1^Nc zb@3bcz}c=wB|(X{Yfj_doco;K;q3nB;*q4#5g@TT%4I1u@*_RsVGa%%h&*wQ#vm(h5JyjO#9FE}nSL zYZ}jD0YT@05@4ANgjV@~v#`NQ+~wtuIBmYHAau=ywAxpvqWmX;ea+vtM&s|(OqGAo zBk4lRV7N*3<&R{b^(e#ee+c>{IFav5RW=hA$0pON{Qxejv7!Ktv`Fxn1VB1;%seg7 zX!e`sm_^sVbdOB^w`$Onux<7%MnZL<;`ATcDgFfSBLor0k>$Kg0w3pjXUvprKYK#_ z*zu&JC zEAup}am`3M1BfM>i29D898LhIJ8P@i#T@T2#nlI%6*v@_J^e@4WO8w^cj1x?(V{Cq zH6Mf7P~Xp!=!Lm4P>&w@IsmfcJa;Hh!?5!U%*Mbc&d`G|n}-8+Z{ip8PGjuaqR_DO za<`Uc;LdLI9=ozM8!+}GE!RbJEH4-!(o3WU<8j}Y_87og>r3) zcNVVBWdFhCRlJLttNy^4jiq@h9`jnv)8D;4azecFY6rjQnQ+u#OkP9Wb&cHNbyef1 zNqI{$O@(a!c0XGMvnU2yjVJwR0|CkXpIN{f-BLX3nrBvyJTC_mNMRPlRE|-SH8-2b z-6B&@xcqC_s^Cb5*NK&p1~3UdNh=VqKs)gU3ski?a}6dH&&p=Ls#;b`P3RkL@#Jn4 zHO676N_~p47c#i|+(D!L$`f*orhp^jadWG~T7`vK6Xz5L!cmnAiGU)W3s1rclR_i2 zp_*{N_t1|>NH%->g2(_18rAVka&a7s?Vv+-4nc=>P)Z3?F>~duj7XcxoIUhFxHgB> z{HZqWJ#L;9#-;%Dnx|WYM3k6A!Dr=2aWny@jM=FCTfD}cwWvs&npbL;h>?}o#y`cs zt^8y3cVG^lmA9OKZ%hn5I=m=UnCF3?QAhneLq1fxnyqK2JPWZ&I`l=Q>s{+PO`hMd zp4p_8u2*>0T7zWt2({r9<|?2U=BlPT4ryt#__ivm2Fgi)n}OfL_?=brS0DzgO(pTW zq%iWdI*WarpvQ!$1U3$i?!zajv1ST%x?~sozmDt|%Uo-0QH$`)F| zDMC7ZGXKn7E4|dKFBM2fpCXaQiwC0FSX6(2U?BHnf(^CDz7U>7$YRWS9aGf;ROU6a zi!iO~X98juwmdd=I9$}Z5=H>vL2L9z>a*7WMn96>^+soT&X<8Ti#mR7n z@{oFu11svU;$)q7ygUqJq0}w6NLMTMTuNSs$wm*~Ek%(6T=y_n)&W@soQVG)R^jLX z?m#X!JU)U^$U*N!AeE@}h1SS%x6?Ew+=Z^>)ZKJT$2S1>PlnDMg?qo`#%MYDE-zp243%yuUoDqF3QBKWk}XF5QJgnAc-$i8 zaV~{h1B#k$<-<9=d3Jv*0XC0yW?{hAr?VQ3=brLkRhz~dsw~uBxWm+kU4*3`SK4Kx zI+LFk`C&+dH?>gPLn3(O**I2@PXS)Ytb(f(!BJ((pTH20|&<_i%5MeJV+!5}1ZX}^_Q z*#olnN$`o+U-l#X(Xu-Nr{l`{hi_*n1S|s-R(?vRb8@~C%c<#bSe$T0hPl+XUv_~3 zAbzdE#sf~PG=737XV;v@&%2zsG%gxI^Wmp({g7Vs+8boDQiV|did2|^61LmN3~O{> zm?EWpg|TQ<{U}G99d*CQ%%4*o!NIGvAUJ zoBsrL*m~=u#=C^ig$#4F^^mEqmIv_L!TjcI3-_Yc;?V253*M|5att<)5mw;+t`Z3t z#sTtX>g3x=_JrO?YQdb$v5Vo^HyMDAV4-b^C$2i!CLg#RrIeh(uJ94e{JZ4QrXPX- zhm?f4GxP74$9?jMi<_j1ol%2r8LXrRD871?+TTV>a=D))uvX6X~WC)i10Rksp=_Uf_+J zq2AYN5-4@A8qYJ$Op)gi@{HFl-jUbuRReinGNFfO^A1w-bm{Ih)T5nBC-ZCuQrYJP z=HJU1$?T?p+<#7|Mv5OH_(9L|_hsIu`cfM8r(4nHkswoP-jTO?Crvdx8>^p*mmIUJ z4lL;D3H@8H0roS}vUTd$sG_pN&o=^Zl1fOnc%Q%QoXw@~8^NN;UHv#YK>dqD_swr# zZUzy%(~qi`!PW&@PpetU6)3}-G>_quf<(MYjlGN;SfXn1f>@KY@C4X;#R-^vq&>@FlOO^0d<4vjelvqYJC_wpKGs zWb93mEWpZaPR)6k@=9lZyg{dXK+SegT#xOja(p0Ng{IMrdI6Z7pu0wg&0|{F^ZsX= zWWCs2yHe}}EM<@ZLHKZHBir($6UU zLQAr1YOOV3-hROv7tcD4zfrlNpn628{0!#WtmzZG>9kyyNoJkYtR*|lK@Sk~sF;W_ zqGsO#xB0QxIYW;8-$rN?Sb5C&qnr`Z)aPC_ms z*DSKHk?DG0iJ2)8xIU*VLZ0utOw0L8P=k)oTDxdYQT-mL4ym-=GYdiaw`v8pWh*Oj z{YI0>e_%*6q+xd8pGyfQnC68a>-< zi*)~K)#sKAfB3jo)jiC#defPJCiU)6S>^mR)!d&Gr33EGsk7q?F&?S6$K0cJrhkT; zA}F3raZGA%(f*1~tKU<=9h?YlQ0S1DD_x1hEFPS5kIjYkeM}s@!e#o2t9Y}p8OwPL zpZ%*>X7uL{{lmL>1z^urAQ?!rm3A+xKa^Bdzdy-SA4!UYy>TIyj(5LX z5TyCw)z9+P6MA&Dx_U9;c_udFQFvfsk~?=gaW?~P38k5c&r8YU?KT6`q1xqmq7O^& z-R4A;gQqi`gi?pwUYIJYF->r`TigRDrp_-Z%-U-<7vXgg##-yKtmYMq4_+g~%&%XO z)?L<8}^}OAV7y<#M3vs>{l*NofC)ivk;B7-RsCy68IaRlKV!);+#5f|+m+~@ zfwr!i1D)!C%b5~5;S$Z!y2xHZe=-vyJq~jZzolst{Dc*j6b0_~;3B9nZ+}4!vl>-d zdze$W53@FlYoKf{Lv3gDCy6Zv{$42FVMU>h6;M}`s&&mEK4M81E^mz@u)EskDuTNj z;PjmqV$Va{579Plj-$=l(&o5Wn}mIVOcz`oIJE0Es+@JRrY*z-F^_tsBT1^6FYFS@ zOum(p4}=0#hVdU%{pgA}4HDY?8t(I=zHpwwyNJ?Tj89k}l~8WuDHN0d{gP2z-m7;={Xq1zMLywy{|3Zk z%~y1>vF^-u>@{A$R-6_Gg+}Evz1h|<7qik1 z`8%^GhW-(#EvAVjQ8lkJlKa-2&QP;){*JB~8g9^5dGa+$y`sN1o``)-v*4svvQoZL ztt^Rr@I#qdl|~YQzJh<ZW#vCCc!dnt5JypS0s)g^J_T_WDwWope+Fsx+v-*<5v zQe;9RDIz5-3 zf;O;&8`X?$`fT;L!8F<<1UO8U?P~r`xkAwz6;(~%*TR*Ju{)Ab80~V+^5-Vy*jD87 z$Ag$kq`%JPn8zzQkUk%>ZgiDqi2lCZFKKHPWc%zC!1sg9yW zRlvSWmwlJVn8aRW;9aitxz?t(Y8L~Ku(?{7(>-m85)@>=Sni+#%_&-A_Y={H{>T}~ z)Eiy5W ziVj3;doG$&_J4E9+RqdsZ~7L>w9{Ah{lC}~XDiC)M2S@_{@Gz#h#Rsgct32<;3h~J z>N(y$M zrvMP#3G6_koP>+pF?G?;^Fxli3gCelAmZ}1H%l*G=V;SLZ0(OC07)L=4=U^7{f6+67oa{VT5yHvyNGE zOtIk3&BLbD?@Gdt;!-DJMPdpVj!JK_b)Y;zUTTqT{H4t1u88tt0RNWbe#|NKDbmb$$?)uEL zE;j(HSwimMk>8zhWPI?2?yf@ox}9NyGENi*-+gqU0}F$6WVq#K|f$Dn*G1!LWJlvJ9KO**s;|Z{Gc{zL|u(J&F72&HE5j zle7od{PKzb`zv>{Dlj+JhkIrmDKIzH?@P@%>JGlu%QcINy1v!jbthdlKVw`8GOn&~ z4RGDfm%y&YJU{FDg?wG>u0PPzopGF$A+CD`CvK>Zq-GqW{3WjYB!^5E<&Tl$64wJ# zeutEQ%=HixVBY^kojdqUFBeu4?yk%Rit+hf8LVIbKI@vNe}}jh=Uv(1RX5g} z@O|d$z%F|z_4u=<2T6Z95!qBifEkNw zNmUuAC_!2_B_tr5RP{0jHv$7*%IL)eD5*1V3 zJRE)&{|Ohn5wTnS!6f$z5JokYvCn@#nH`jB3OUU_Wdx))|_)_diA zNs*J6RG6`zlxJNRNHxu5f6R3;)dW}da`l()uX@6jp?{aUvZU*)9&-)W?=`L*{eFq- zYW@4HD_5sK<{HKE0S$^X57I-$R@ASF1;*>A(?FY1+R+Iq?)ts32hXU9B#4Vo(Q@Ab zdE8myCZ`Ut^zb5k13z~zObj%wHQVHQ>f!_ZbuUZ^G<_J^AG%>vpb6FN@)N0|Lm`d^ zgim3%)*m`g(Op}0ym_epP^w}mHl%*?lBjU}$4eYs5D-S5aJ-E%1MwI&)UVnN_3j&RbWA5vEh3+b*-1b?ePkQh=G}~Sr z96W7{@ZZNFDA1x7Jgo%)aK_S02A(@wW89e6bB^U|g`ujVE?-5RgWXbVWb(^)$Z{<`XzXn)?1tA>*aZ z=tV}A2$bBlueCUBq6=VDzR7B1F~t?1ML28#0jnLOIzYj<EnBB zSo*k9_pvB6sBfoEJ`GtCRtUV;MC>#4I(crG6dIQ4UL_xNvx4VOWsKlzcK^jt zhAFDY03w4*c= z*fsaEBJ*pQj`2kmAL&YS_Y;R4f)>NWkJ67$kK$ekN_#&*duBV z&S@l&cHFdv+MRu|lfNLtWJH#hn2L4%iz~4fle@?Z+s})e0WM&8MaPR>> za~^WYO|{RA9x62R7ap?&>sJYH_o>J9K%qA&u6s`Kn#`DV6pnAj{-;O-cGDVh85TQG z%&iMKs(_NVsxHf&4`kX_lrPVW(dCeIt*|?WCg~S!1JY#$2duV|&42US%Y4A}2T^tE7(CsG}twissx-_>G(cE%9lV($BFkkadYTTxL=BM(jou zxBr@>Zf$%^_6$@^QeXdD?~p5H*MlKl=EF}_#Ti>3ieJMKu{w;Z2CAz4;7Mm}vDbn< zg`XvjS-kaAJ&XQFpufqSyda`>j;7$$) zcBWzWZ-npSS`cZjQ6+vfq|6ru+D7DJszs92t!xMnwHvfni0rrd_rVgrur|5XX+x)A z0<2r9={3rc>*zm0HH)0mOihn&WhL zEIG%LmFuO-oql!!+09^nPwT}iG(2!^_Np5bQBYVdOShNO)(C58Mzn>69iz&R=?z!? zI}-IcjoQI4wh!iMFRTdjU|7^PnX>o#bWE91Ia!WjaMaer$*jWp>(+Gz)o!UVwTS0S zCaBBLF-_b-F4@il$Q%ySGfMo$D)IYRiMAYBRVnfLos{@Tti%E`hnMk3Pq8((g`bi3 zC##k_tXgiQmYT0Ss`#x`abK(ofkWX@{ONQz09pi-{Ly26p^ks7ou$e&?c))hurtOx zAA4r4!^{~wrd5)`GM!%F>E-=9v6;CCQ2%11>@m*5;(xpt?lx-*F zmZ{x5n!97*Hz%WN+!Cy=^dx=#gqF-ATz6WT2ks;@Vgx+nG@OSZB7cbrTV)P z9cY{Ja$QzKWJ~SJ5FHsz|8yY182pwsk;@qq>Yj*`qgb|XS7jUdcqh-bVNxYxeeTh(`0OM@?AU zm4Kd`!UF+fvO?x5&WId?=YIfF$+Y7;?~~*0AyH$Io|fvK#a7I?LV_Go0MwMEZfWm+)ICPi!9$ci_z^3yy``AKtYa|ETGfns;< zq#tZu#F@MI7+0n#juH55eA|Nl!3yU8kj4i%<$OXuJA5bnVxR2+l04e`SXUYbXs`#N7X??Zi8=+rDpjnfGUeDhx*Iy<>1=BAb} zhz`XSP4r(w{XgU_9U4i_tNtZw#r22^&BJ+1@EaAa6W2XYlN)5M{NzyMcdL_NCU5eD z96cHxJuIKE?BVh;L;WC_+ttlOI5IeWadNT!>l*7wTL|itSl9DK_R)D!A%(ZAflS$1 z3P0u_LE8_CmfN7>P+3yVHCF&>Dh>6ZHKzHa69N6Sx~oTooTK#|Q;TE9{)<(>ojgUmKe zYsguL|De#1K%(3>;27G3ffN1w5!^{h`Wey#CyX+CLw_M0@2zWQW!sM@V675|HeeZU zW7#|NeV1`U)mw}>cdIX1)S&%PUN}tcbOfxGUD5+*oEL^lYmKER(Mx2BFJ#7z{4c6| zh!WzC25;ibaK9g8$IU|i0^(*~Fl&fR%y)w0vb6||aF&S@3{ql28d*qkj4T9Rvx!X! zAGB8b#MNhU7BtB%ha2qvsM@j9x{nh8iN29Bk<++r7@m|gGO5JKq&g(n5@fQ+q_ksh zV=;`QPce>-vrUwcNcw(`yyksaV_A#)#8h#g6b1=?x7=B9ie}60->Uw_%_03|HQS>8 z0p%m|{4+eEN9;KAR@FDiy2`g;!s<1Gl-i7{X;dPxJ4yZiG2Kz4(j!ShPd09avl+HT z0AtuC(!0)G%sCM5Mot{PrQ@_-HsSH!ZPBc)fx0uuH;l)HX)`edKg_jO;g_N)bc;h` zly#}ugn|UwxqyDSS8F3aDadVj3x6ht9>g{OxYUWENl6naPz=E7QqyP^fDFdK5M7_i z?wiyKirzLA)e7U+FH+DQoyd*<o&x9qCde;)&@L#<0rrkD*s9D(NKZ? zE+Zckgf2+!uPn&jVLY~ny%wl@fu!(PJknF7(UWML9Z>UWM{mc`Bow&uA z_W#h`WqX}6KHc4&vF@gv?e0NJv&M@YEpJF&mTywOrI<{UW8uT@C@k>- zHj#e~@n02NvMYOurX;r1y1BpnU63?UftjkCBf6hH1@6G;k&AP2h3FWu_)30~dM_Tx zPinu#FxM8PbzOY1)N1qh(r3`qiQbmtIkh&w;2%Pj^iQ*hWD&KuRI%ZN=GRweN0vCU ztoZVeDA6#`vxXOe{b@xeo|?ai=>%`WbFu7OK>=3{7j4)5^0+Y|2Y|`vnmr0LO4Y3( z!7fI4XMKjp%tUs}roDtlJok3Z8*8xX^OI^s((d_#r}d0B-k?wec$FAWs4dsZZuQ4a zX{c5BA5xh;WGwW{a&f0X{-e~SE0CIWmFLvdIkz~g!6}b)t38tNDHXq3WBh`;2b8^Z z_}C@IBckQ?t>q_r`}UO+R08?@b~V#tJ&3;Jm!7QpB5c$(T`YW}BhNtgVV?t@e`;dx z8DD%ON@`*p&n?~#Pce#w(Z_xJ`2=`jSnjmB%eo6asIgpq-6LhJnPbRqh^m8MoQ!H; zzt0d-sc#V#yKB#5xge)d&v5$SQV6h9kCBi2a;dPU0!>{ayOzYewvR0GyO!kJdAPxU z(USZ)*rSynGvy@QEH2C9Va3+-uKK)q92T^)^8@uV5?KYN~G?wNk(DoIm=^Ir!vJioWLb-Ph9{n(M3` zqLIn3I5clh1B(qbU~<|R`AQx7BY3)eTqzTz5&2(}K{a)x%Opv9Y(2vd@Hw{iFeio0 zUej=ic7Ef#OG7k&3fy3Ey2)0o{Y7t?bvdgGQrnMTj4L8{vc^b-amfMW_~pSrcUSya z&KKW3H5aw&TgXHb3gA;egZf)3pSYQ1gFL=h;{%KO7gWFH5}p#fOD?7ldZ4LNof+Fk z+xN;b^CiF`j=T>1hHQ|AI{}qi@0aa;{2bOWxFd$#EVH){pg(JdH)pCiMYx@}c2AX7 zCq4|u3^f3Dc||5J4a?rcFpMxuSr*M97>(@Jq8g?|L`@t{GIP`>V?ab`$arB7&Itjz~9NQn+^Wpe*z0hcIen1lA$0I3v$xUGl20MK`;_ z8+V&|c$6&(`@n7(cb6sAD-f~z$bOvtQ$N-k0FvHdq3&|zq2O)stU znkU+ELjHB+eG$wA`?}CvweZ@`^1#l@uR!0;m^{)=QPoM+s*9f&1rFFtuVmZF1m`nd zI21??oWKv9=wNnpn>5wrkVFkDVHYQfF*gCPzoS76W}?%qR`s2sed>bn9@Zv@ICx($ z3ur-H54?}m7lhpQ{7`x_2tMI;^Td@6`kuSVaGOvM*I*`7vFi+7*u2l(x>b?}8B4pn zO`>n@s&iMIl*RO?)$d9S>>QK4o)+9_UTj6JllIKs4ORy2lwf1zknj;0z;t#z;HrWt zjU)JrZy zP4!%zl&6!3dv_qL=oAIH;EZ2=&9k{xY+%n&>xaA%BP=r-9c9aq&ntC8cAP-i;}Z1j zSAVw(qb*T-skyzP6&(PZH+gDJ9x*eNu<<_NAB`JT75sYR=;9r;R5~{l_~L8vD-~CI zUno$%ktRy!(!_7;Do%~b=HYks2=f~d*w-PjJA6d*Y-4V-QL+(F zq60%u+w4?z^3GDHv)=j0W{=HX_*h(75=+F&NA~bO^0B$Z8gE8UA0cEZv`qK< zFz26&rb|VslPn#XxWLZ%0((7`j%%-UL_sLE2kvI57gw)m#^D06dm(YcDbLo3FSM_B z=br3n>k~I*W_wGRTM5OCUS-WaGO2kiI2$WL`$WS(V$EBm3JiRJ4?>TvA(p8c0q)G8W=iyy>iMc{PQ*BgGu1iWR7Z{x1ea~V9sbxXvpF~h)h zv^#6<{41g&T64HUWr;%Fr1jHeFvyNwILSxBgX~*zEdiDMTnmH^daYFND8M`>a*aDQ zte<5(@g+DOklGy@AC=Dl>~7|l#0zP3bazIZBZr9m1gELM-Ui~qC5$~b*j|lQ$lNM! zB0&uc5Ro#+$z~t(9=u7-*Kj#-j+%lXoM4KCehq&PR#3HR(LBU6C&8l8Xo++yz)J^a z&!rAy>9{xq)^#uwy32BpTaubwP;FSRJ00u>^aMpO!%>*Lo{v2Ws&7EWY=?n1IQbLD zha45-hz4I!Jw6U41)i$MgGn|)1~kS8R-cYkiQ|drr)3h%X3HhUyYpa4%9nP?F!V_ z5~Vg!zd~GRpQzuRSdjc7r;0(w8&w$SfLd)ui6^a~+EzW^UOgoa_gsBS`yp6}55rYJ zJq_>Wgg*wP7R}n=v7`IneOd#VF7X7mit?Jw__@*J=6kq@a03$+g$3e59|emM8y08L ztOJ45H+oB^856&8{|D{2(>E-3azCl#69~J66@nSSNoA2P{Lv{ZcPF7Mfdg)*t*lSYH~$u_XfNoiYG~F3Z)Gn^&{-Vj+~rCu zJ)f_FgrupNY#Xkua3%AnNtm6CLt>;Lm|V}oXol2uTp8O7L!M9E<=n^@F~Ot!2@t09 zdbtD5PIsX0Ws)wK_pwZHostW#PK?Y8&AOuGHi9(n=;Hr}r~Z%=mjmV3jq=@sa+T3+ zj$`1B36bBLb)Kx%+L)pkE%+?RsJ&=CXkWkT=9wZCK)Cs9nW>4-t| zJEMB9-UF|1qJbUp?g1T4N43NM1zgsISNo{?rd}xO-d`@aPBh!wWVA%I+Q7MZ0ubGQlm|9U(Tk9AHoug}Dz&$Zf;T=;Nz z2uBX<@)um?lrgd_+j1l8E!Qjh{XK01Z)B}<)$y(+*|NBmt{wUnKIn4rXB#*M9}{6@ zKgngJ&On(@2v85r7IFErd z_IZPmzo=!e38$hlf{9KmnNo!Kv?Eq;RZ;R&qdfk=V@pGle~6k2J^{jApbkws1*$AX z3jcH*X^75uojh7ahVn=&@e9-4p$8?W8jNHdR)cuE{9fa#>aFu>A!(+Tdkcd<2DNk`#|Xx3S*jz7ZxYcFu#*#cd1TEYqR2h_JjK_&oB z=S!3Kll`3QU^&NF=A@*^Je{{>D2`oxw`z|5F)#*yuUgC*ZR+G6VH4tG8g|sJ+%C9; z8R{Pk-8~fbK>BY~=98+u7~&dFl)xg_GnnApU2RP^dSMG^@ST(eIt5m@Eo_idBelzH zFF=~AYhTT`m^Z}j>au^xns8sNa=lB&m698q7xl+xq^hGt_t|(Hu0Lj%IM0w5i2=iX zAhsC5P;u%h`l=+|F5Vpv7?lr^0h=E&u8|sPT0#;`vuPOt#Rf?#*WqDN2t&h!HzQCY zO~h#MZ$(J)J~q|GS;xmVRt}S9kg{XfT@>=e7ycP`YxsK=qib-RKJM~`eWOGD3HVBk zTv7xew_9%Wj6f5sPO3zCyKE@cuPJAcQkhYC6U#L_V7(4uYI&{stkKEPTg9B=?OM(8 znW?9P)3Zy88e%%dCO-gC#lD#HTDBq*bH?7KV3tNPPt^)CBsD(@Rc*)^ai` z1r^tk&5Hs*5(u!7SLl?&YF}S=fS#>TRIf@w^&C3`5a+j9Ux&rf2{0&~2-#J%vr^VW z_rSVLROY8#X6VcwFsg^~o%89g_@03+)|1GvZ8Cm-@N3(c4+SiHC{y}SdMT{=>Vl5u zyIalcL>Ee;(!4A{2_c(2&y}xo=vsXJqH8NoTNCmW)wVY?w6SuKWUw}q-dVhOWW%Jf z(O+HLK96Nt5L4;a9LM&b&P8r@k<7M<@z|O0U*yhV;7KU`j@=gy|tvudImB(VCp^ON<-0W&?jaiHG|q9MIa;`F z10{4OCf{(8g`fbeJhO?7P2aczb_4p0TKCMkZldwd!APP;w)+(mWId_$a*4Azk1`@a z?aXGYJ=5f5&kHa30pfSn4sX@3+8$KYEQQ5OI>dtZsT&qO+#+)W%qmnKgpDpwXgENC zgummJ_0fdIQJB8r%_MZZNsiSz$6>x%6^QpCV178ZWFXVldPO}eNRs~+>nR;fESmMN+#HsLL?xyBQJVcysUCq{w)q7gEf)(?zu%2Mn3kfN(b#bD_Rju8M;H+cu z8QCMp>0d`n9y|imnKD{EH&KQ%ozzZO5Uf+-i?HmeotAw|`?8Dl!&>%+*s{N`m%Yiv zE8gI&zv4kG=(maXQpdW#uuWLaYjEk|G^!qxilCK@ssK-7%$Fu%Q5Rq=58RG|_y-?y z06s2b^m4a6xj{BTlWc-LrgFD_HwR(!JNuEBMY?d;L3E8S7;%>?we$k{Nt%a~g&jZH z2%?$~voxuF2QWRi6M3wu&~_konfDC@(vCF*lmB>hijY*CO-mI?KAp z)>-3bSc8f9J+`*pWC<3t`Slum5M}4ABhU@L9_lOVLp zlXKPL1dT8i&Dvsy^%7g#`K4prKyebt~oFWxQPk0yK_0WhRx`k&b}y>TeXd3q;gc{{`MK@Cm9H^E^E>tI6BDEV(2R}?GvB1fTOMAM_UR=3Q;SOp0 zXmm5a0RyYy148__s+Z@BlM%riow`*H;xUy{F1n$j^fWs#BF^78_=rP&A3PbYUH_8P zR`UtsC0P4xlkN1lR$kSwQP>a_C_&BKmWG8Tge*aM(_9UtAM(1^N$@9CoD`OE=|!x% zpaKuh)X0plm$57_ZFYTKlCf+9?hoh?`t>s!YHvoh(3+p7BdlYLPx%uc86JF#xXsT* znUL%4?q*xfu4zu2>WQonG|e~CTRKyHh(QI%tjYEuGiTYcARABQ@FaTgpDGfp-+w7M z^p2l6&j6-O^B0)YHxz|t+P%}YF2t8D7FG<=DsBqxv~ep@ntV4QVyM022El#KFh4KQ zW2{-@d~b$NaAkR~(<&Z6#tQeOa4g9r37F+0(%u7~;p;lQgg(+F&OIar>220lbdlhN zg~qaaI}R5SfjkQ_3sP~d*7Y^|=a>#$=Sv}SGzj?hBBqTtvIZ0a0GKfK1v*VFV8(aFgc9Q=&Xw&Xc}qCYQi<2S{?)UyKB!6$3i>0$)KzLy;1m z+1EdCI>py3avcj|eKQy81B)QA(c9NObM^=DdYs+|<;iY~^g;?_N=#~MdB&;*rvWqF zp~VjMpDto&ID9s2Z=9-~t0oYGXK4bmIoFp8%jsf?tXB-MV*-t3^Bq7oY8_3j=Gq8K za<{{6gQ2Je^BjGk9Km;HyXzY{*ZBlQh?Dy~#h)PVj}qAw@1CTpP?;mxlb2$u5lra9 zt$;^?gb3(x*4f?<=HetOuz+9nF+dI*u>-z7-lQ4kcC?=-Q;|2rdLGZSz+Z>EDN#0< z`f`QP*yDH~r+1Av6(O=fpRc5z?dnlTChf=eY=de#2Y^8qhvqoW4)kY|AM8-Ioj`;_ zpQRGWJ92JUv%ZjSpY5`EQJP2L#j#oHqYG0CnQDvrEv4FXw|gR%n{io}*=5eycdDEtN`_91sf~nZ3CK}zsQWM=K@e6U=igF4_ z*Q)XQ&RKB4H@{Jv0b~K$Q~WI0Ld^57o1wZKwIJHXnh29x(rT|o4Iy%o&Z1sV00+mf z0Ti0`ahq2&RMP26N5>ji49&HW8}f3w8Nr|W$!5XHpHcf2Fu8oxp2wI5pIvh@8WXC>-x zp50XLWHs$J<>Sp0EYIUj^7C&}s?oz{^zfvrDUvgAM_-wo*i{pL{qs|BvVsY}ehv;S zlNA@mLE@-CH6+{Az38oo#px+;{0yMv6|aaki?MP?*V1%zU&VTn&*OD-h;B%=v#^Q%br=sI5?cXYKQyE+kx zv)Lvtla3YQYp5v#@Bi?$h7xbrsWqaeqW-|*Gzz1!Dmp)#@vkg&>qi{+2nqf}ZE6q-%I)S}L-jZ5L$SeO8Q3NVz zIEO$#oBYF)h3wI0HU%O0AdlxQ_JC zNVhQZn>D8qLJzD3Kk1R2W~;vu{w_W9GjASiGRZDu^a&$d z8FJ-YK(z#&XxB{h5FSRb^M{RAjl7y4TT{uE%TD=zz>E*jMU(n6Ip zEs9=ybVlo>Ma^ZG$=xArtM9r4lF;}TG_ZZS&CfwDnF-7azJWuICI`zyK`wy)>7wow z^&=M>Nt~O#u#g*M5@Hi6T!N@wbcc2Y>qIY3s`=g&d!Ha9fH&%CzuRp9%m2 zJ{ZdLPrXb0UDPkgB5q$xRHc=sS-CfoDqMRQblyvE6MYwnj=N4hHI`0j{Q;P-gW8)p ziC@uJuWHBqyd59k`LcC9ITg8;+JsJ2JPB9nec-^K%^QA6 zF2fkqvoo#d!^?OoQEO|Z4XvO#hKosE@QS2 zjzvNYp-Y-f5lZ2Vsy(1l#U$OX5F4IR8WCnT>8PE|C2A26A=Yd zp{@-?|M><-c?s#nFtiKISKFepji-fgeB(I1X*VkE>tVI5GR)@kJ7}!-(49=DQPifc zr@UphDj~3NK#ePZjoSkXt$7Lmi&{(6>Az}_CW@+yd(&_a3d)$YK9{;7FSdYZ2UXTZ z=#dsZroqg!o}RtW3j(k0S~k*sYkCap>oK*$)iHU`WwfvN`0wa`aMbh_$+nuk3of&T zH_{)pAx4e@{p})hg5cG8d<;j1@@z%!!+DC}50J$FV~C6EM97DHuUO=J&$!9~ha%^D zO8>s@dPV=f6_fA1=c?21tF-^}PC`9FRy;xiRBAur9&;=lxragKVK?G|UIky$W9_CT zvLGvpY8uoe5RMYLfQsLg&$6-9b);EZg@OHZxOu#zW~c+o+Wc3Dl1bLL2yY&mhv_oB zM2?>3uTMk$8{dP&L}wO?Ez(QK@g86n0?{g|l9He{f`{e({UqS3l?9yxScCaE^y5?3 zf>be?Nw0K)%m2hgPPxs0sAD7Av}eoA?@_s zZ*Z@v!IdVaIWDvk8*2}+kP@|>QnBq_`w_dT;f2@+NxVjX=&HqJ)55}yslB|z&U6p; zwm1BB6~YiLZ2`xVBh9cmKE25DQyBM8$ttMTIe_9ha%$#~<$Yhh|B$9;EandL-DCN@ zZ=JRk7m8^coIg_1mLHH!3nz$|l$!6wE*2?B?S3B2ecGHepGr$qU4F;#8fAFj>C}B^ zQ;*Bp{X|khkYHf~0|(JOofP>~t;5AEzr$yJXwGY}U;({9YjXS5^ZM&%^}{HuEs3+R zT|G=8PheE{-&@#jNp15zw6qDH67v=l>%#Pu==OQVa1=fNKV;s__V2&ebJjH`u$4Pg z_*zahd5KZWS+LFq&xpgF9Dr>8iFsf!;hEn`fE9HdFCo^R1>>zJ;(o2*XbkU+pnq z{;zdcZ4(TdOThjAwU-BfqkDP7IlWx_jlMQw!D=+Es9FC^$Ybp-01LLOZ$NZA?ibeb zLvq|j4hsZIj`ieVS*n>9SYzJBQ`PJLmetlY6LsuWueM2!HIl<3Nwtn%t$Vx%km~W3 z%vd=G47}`1?C8~9f0r==3(%ua^Yu{gk%;>4*lfpDqU#-odKJ~Uw@F65=!+%!iAyFV zxs24j>iop=ony+^l~+%YV>_L@d-D`ZRdrMD$&F(jmV5jAgy;qa$&BfKgf zqhK<00?9Y=0i*RT^^5#T#?l|v(@!0b;ysE__cc>o@E&67s8`_fQ$eEOp45NIRaCKx zDkLIiUTjZOb>M2!UngDIxru@>Vp1=&ed>ccTEg4Sgr_jfC6KfQ_{0WRLp@FHj(<}h zDt~5RZ63ZgF7<)3Z&x`4pRN5+4(3RyxLv2+J#)G~Lz_?@_Tb{1tg$PaFJa<;TE{Vv zX|WE0CQ@0;lo;^lY8U)|8>~IL2NXV|m}BXTfL=?tXFQ85cuqIZb49sLi#`)~zqqZV znirc+Q5MLh0dxoEsa~TB;n*eP&Y)FYOV=>u!0Ahr=-$VqV7WkWHp~>cD9rutzl!xV;WtLjBJh^rp?vt&)?B~r~< zRZocigRoI92(}=q%U}a zjTNnf$q%v{=ObkEJ>sbP%uvK+zWtGSg4&H;GH4)|`al~JcWH0jPKscXSSlT)-*<~2 z7Cq?$l%!$T=q?>7frxc%&WfN)rEDGQN&BDIDdf`Phj7u>IZnG0D4!Aj?AHX zOUS7`T!UJ)sK1~Q7D;0`k*?B;%gQ^pdeA`2sSc}hyIbq7$6^YD0TQ`xiWwF^@Tc&+ zUA56a+-+{DKY$W1jWmr74a+8~&O5lx+OGbDjD(pl;Fa)+{G6tTg1($o`&Y|uYF~Ld zi)W9zs;xgEKruTeBGvBS-%kXonbjskx{_*{pmxNy*gTN_v(JYrPX|K0Gaw{FQy@Q@o$3cR%~-{p&eBt(JGRZRgpb#!`(@mbV$OD5+o=}fFMD(prAw& zNkbYsk_aQ92m;CyF)AW-6I763Cz_^>I_}Q6FpfI7ji?ADXy1e-0aOGR#2q)Nwq+4D zgf0F2PTgkF|GZz`56?4<>3i$ea;oaosZ(dGsdC2abE0mMxsRuAsZ^p3tHqtSM0Bux(x^eL7&NYo1FR4lODeDRI4ej$e_gY=>fKOk!;+8A2I#X(Zj-_qGQ za8WTrb7Lt(CB+JwrcdEo5e2iYFRpW{uMY|q?NOid8yXlLU^8uq+f-*pTYV2IDBBdh zIpui^vF>V*tS?|E_*9A-{7+;Zd08q)eqqxYE|WTV6j`ZyOX@u#{3m&pQtKO8(5+v!K1HwB%pl#Cp@5bdsN*%Xf42O|hfar0^3x zkhkdFRSv3@`m7T879;?mLyfxb2%*=T#m9&>AqxEaWxV8s(WD+@PBDD_QccroCzi1# zU|YiGq8$ZTWs|~y{%7N=*CwK=W68z6EPegTm) z^fT}ceFZ}>QQwHQEXOJ?VL_IGmKtKVuPj%a7(3OkIT}@s>KAoOO}_S#8{m#|iNZOR zAX2T;tA({Md?F5|h}L%(LXI9L*n-s6R^pmJ$hbt>l-Q4z^lD{$hm0cKBuuU6(68JU zUL`#O(du3nV5nf9T6`gg)7u!6Q=K_S3{;%#T+-cBR5ZNdOo01q>Uy)L50m;TOGV~` zvwh!>gcbAl2$gUGV_4RuqHG8by4au0*o{aF4XMwRtM6@ObOeXDkSIBq5X5Hp?ZFY@ZTpR7ZD&qhC8!J#FEIt#0@Q@s43BQZKka( zXQ~P#&Zw=g#QQK{2c@6C8##8<@a!W(SpDm>#X6b>D691Yp-y_Q$9M0@fXzkv%(QF> zLp?pU3v*dg(`PFel%FMI1;OfY!%Lj{#cWWeB969pe_yIUefUAew}V@srMkqoP9 zhv=Xrn8kI1Kl=8nIqd%+<>r^*hgb3kAJEtMK~JS#;MaVGfIWeI#9R;H^`e?sae_o? zW)ABIPEAm|8_jX?N-=AY(TaKp>$twf!R{(Mmqqg+JPag_Ug!&h>nSoRRs^shEO59T z;VU9_X3vw%O)fb!x0!uv{!im!V0PAM1Z@_DRyqVghIi>Nr-m2#qk9Pxj>(=L-y&oX z2yQJu?VQjd#3L+D?u8@R>444RtnIpTtSY#a{-J4SrA~L$GNL6l12H@;@Fl|hJT1&m z@G^BZDp-OxKp;}kf@uD(54lwDuqIWLPpggU~FEWX;g0GK}N-it~$@CYT&i( zGOcUQ*=g+!_yF3iEX0vN=gs|EJ?3%!kHGp-b#0aAKw+Dq66zl8`AVoeL$*fOpFZ8h zC&9rSx++ZeHr~-)#NIx^ACw)ZNaoEP_Nefc;(PuBNXn*db^>X|@_iM(p@cgB9jLR$ zpw2vDeW=UzM3SK%CX2jgm?i9ns!~dDc5#{omx$P2WW}GrTB^~t7W!nWu(%t8M}%CL zx-VEIm?uy5YmY|PY=1zSF3ifP{POk=)SGU8j}r&5jRZFR!4=pqH%{YcXxx2`RK1)X z&HQYS1{r%9Rs_BSl<1&)gT=odpjM^GTzY7|t=@Z)d9}6!*sUIyTFH=Yt)Fv|j>!PX zXO;7$CglXg{6yxEt@OH2^!OlX`{f0e+>Z6+>eZhbAP<*g#aA)7A7tLgjkIn%p-ki) zkm~DPu_%ti%YNTk6^q0pe7`R>axOoFks`3CrKKD%LR`+9@76KA%NPs`&J?u}qU>*( z?sG?OQ}swqab0oFO*QXBxG1wKu7v{FbJ%JDcPR!GGaC!y%1M*?yOZsX-7rf=cN$eo z)`|Rbk#=}3tg$&q#8;DH*CS`f#jri=j>&nBOEwqPIfA;;B^v~8G( zbD+#(^a8QKhd92?42vFLgOvXSJuVKWrUO?|lgpwP{sswlW1In!8fOsT>+Cx;#SqD} z5DkW>y>xMU>O)`wS8Z-x9*6AfHytHQITU(=Nuv5eu7ut397R=9uq#a#9JH*U z1VE7Cl$!)XU67~h`zNWxsQg)@4hu|du>ZqeRLE0G_$iXr%kNOFAPx(DX<=5fIuFcd z<#D2Fc6jbcw#E5|if}#C6U>R-AAC^fYi17+@Csz<0+*jUOJ=vQ)HrQ`9rC5gh-7J;(v;`p`4= z#oI!MqM?zZC;H$K>A3e6NzeoNj+KC4UNm&RsB~V@2}ade8G>NGcNs|g`~Zu<5H6@m z?r-a=4NrY%(+eEL;$)ZzvpX*9I&}*kw$$HEI)!v(AJ`tLrJBA}Lqb{KiR#KGxJRMF zd(>3tp=h%s{dUGo2Dp#66YO#7RQ1_%>Bb>7{fB6@hdxwz#N3m+5{OMeaNoqfauots z0O)6LM_NSB!Ww+ zjqeLOyE98_+-xkj)R)wZhr#~E85(kjP;;7vnwLnl4EVpRT;tTx9AJR~gs#^;D|Ef{ zheg450rw}B^|zl16)6t->WhQ7Z1R<<2adL~NUYb$ByOl$qn@9u_rRsLJf9E$jm37= zj(*6Y!?iRqZ%!=j$agv|L(*;`ps=xOq#e&uf6L9@G=Iw+qv{_Cxc`@YA_N{u#2T9Q zEyLz7)0d4|+cE<8t7BgX*A4>omX2cK6;(+*4S;$=0wXs9O@*f^ab%RiX&UL=Q2|N> z-OD_Ik!gfV%&@7C_cQG);qBGvrFtMObA{(#g%4{|k^c}UE;_}`76NoH(BxwhYV&r? zm)ec06jEqP($tMSmqjOm#0CN>Ow^G{H73}Z zdTv!<(CR(GIcci)O5sSblCcsp)be?9P-nG@KyCs+6bF76Y_MRA$k1E?7>J~nLneH= zC3Hd_4At)})PPOufL-H?*j;XeSbKtLW}LE^87@K8XahxdFP99jtbo-qy6B~Bjpk8s zLnL-!-GKTg_e$Ec1>7rGq~b!Yfn1QOf*1(sl_jM5ULn=o+~QqmUIE!H4$j;p)DH)s z`yMzMVaS!V6-={p6F4QNQ^LGLPpr;2gM5-cO43VW>0I_(97}(QbdP`08k@I^YiUB3 zwz7YuAbr}zBa5>+Pq)4+7agY!}9A<4f?`Z~r5U><>SN`bD33uj6qNVo(G5Sqa zS9B2WZ;zU?PX>99dgk?`SVHVYf^lv5OymagP#o+nE<4Dr_bVi6VBLPznc?T=HD7_g z`gP4rHt*U?iS`b;7D|B?bs?+VTokv-5vqY9E@p|1KTi2^PS8kL14hbyQ- zu2hqb{Ystkb;+WYvcGueN8Kw0jG%9m>PofnPvHz0_F%~h*qKM_T@}CEUCs@@OSQ3U zw8<5CU%f^hVwub3phjgxPSvkbwFDRQK zm;<2fMoZ5kbYdQ&--^T6dL0!E57-{=eir63eSzfDwF&En}Ca^B}>kB3!<0#&MC{&Dwy>WwU~)a)=;6p(IU^2t$qW> zov;%_f^$H_^qcUlnb5L25t6W_wR;(+30X>pSm~koL1bAJ_%3uUJ2pLFlKz>^=C@HB zv7IYSOomdJBFTv+8);9by@DkWlE2!z4F-*Ki`p2=LO9W_adH&O)E000t5f|a_H_(j zGf#X?V|0Ruz?a58E^sZ`YAcX)jJB~A?&-O%Vo_jJOIN7RZd8es0LyjB0rSa*U5xYv zwh*BhQLhR~^9TcCwt<=m*P%vZxOdG&SE!8sSkc ze*Aa>i^{*T@{evUmu`KI7zI(Xzyo=Y=OFfXf>?*If+o|`Kl|a0F>koDyDhX55A(V~ zw^4Z0aBlko%`rM?Qa>UN67xN6h7tHJaJX&^fC*#3&SI}NcX*KkwQ^iK{P+=PPZ804m2YJ zQNp|knm_j+Nbol?Dz-l8xZ@@y=>C?)^V-*V?19vqcs+=;X5%ho?CZyv_LX3v%@j+F z6u1HTl%?YIQ(8)vDn!;eA-syZ$Esgos1ACJK9DSts0=-5TI9K*O46-t8JU7tA_Z{M<*dRV%1z7t7byDgN9g`&XW+wor30chJ~|tHBt*Ao-F|5NTZ6%AH}yXT$iw{Q1t+M;Le!CvZy8h=dD3%(C;i z$_O)ry7M^5SzE$bJDxIujUscsf|4^V?{uE#8kKKQl&71GO2IUqW=jzC+NGR~5nYA)kD?&5)2Go06msC0 zcCb}MS~?v&k$UypTN3*uYDX02ZGdfZaw=!92<(r%g`JB?pwjSnP6?;c0uam)2lpgqt3&mOB>Kezr_lR7IVuZLagZfkVB^FWd< zF0?G`LYvuU8GG==WqPNk<&4lKkY|jhEmgt?28@nra@j0;3e3cczCZ!r5g5i?zIQW+M zkGC=ImCz!Aa5U?Kg4x|TX^I?XjQ}Wyt`frTg-4pB;it(|B%7;yX@B;3SH{B*13#>Sx9#EEsIg#a z-&=VP&*WLe(>eYbXpQA2tZch&jgSgYFC`4rn5C&B$Or>gh(ZCE6a=Ck&~-xPX5=`O z7VbL>$YBW6)kTxUpwhTsM9?KQ?_^0uBIF>d-b7_SsP|;!eu)4kJTbl?)MDrnspX=rpzq9hY79>R3z zI!~`{g-fN=4C(}jUF7C&efFFVU??X1xaOI)A#-8cU?pHxGXt_ zvmpEdPbGn$Kww_sY`%)A(!F`2g9To#vHAz5gwS8PNI)2)6;n8f@6h6b8z5nD+f4E% zCYg`E9l?{$2 zk{z2Nhnijf2k`{)IpJH##gr@ORx%J|bpl;TgPZ0C>+q-ay3x^TTCy#^;O+QG+eSw! z&v6BB$LV2^@$royOb?F7&yuykSS6BQf{|>%dg=#6EG;%GQi})QB{_88MlQChG-UJM zU9x92I@Vs#{6tc?)1Ih6)=f%S3CK~W7x>#p3w;WFS>TMwDN3K$@*YlvJsy#hOCypz zZmg*fccW&O5_K}%I&xnhVcyUM`i3lhB3MFw@Pud5t9>G6UD0PJ3IU zksQ{#2+~+0eY8nAzM(zo1N!O6y_ByZT$F``Wph5@lK<-95QqcoCTGQSEPKSw>T`B5hV=M&efVwXW^-1c}_j zB^7}!k&4)TdMB+DwIJnmV-T%Z_}$d!)q7B2oTfN%O+|6wFBur+hJqZ=n*K9p&hI~e z`aE<33rk&1Rh7VUJ@mPRQ2su#-nYnE5Vj}q|HrRq*?$D%NC=SJiktpbVc!v*K zd@-e@X68Z<`#bVugH1sBcO}8Fc)KAmGFELu>6;=vOwB;MXGx=M1iCsUqIA3oD`@Ti z=E7ZEhP4NIw1mTuwcpk%cs+@VK!frn(|ev;+6J}+42?vwa2HN%!fB{cRO22jL=HuU zn@~h-Eujs4*nZ{S8ujH9i2W?5OjWyC`tMFBVATWy4Rc(pN1etBbc)~~eg7vcH%%@@ zhe!zPMd|L~qJgfUdoZcC1e*=D2@ztmEIIc$SFj|-6&yeC&=>Y~ z(RH~E1;(?DMsY*#I^)@f0_U$4hq(owm(hqdxWyw7MEpOk=MZC{-GQ+YeF zEqRE{9{C}A`CVs5et@%i%1}IUS|OG zjd%6-rD2r70Hh5WFwd#Zpjz2anp781N>vL+1l{ROZ=NtENQ49d^8(*6OHTFvmD+Cu zAxPAB0eC0-p+7glyC{4E#DOW#k~l&EHxZ8fhvOHP0vKn9sSIxCVrv5z9IDd`qSrdO z4fTaxyWfA3#<$&h0yE}7pSth%Mgoe<|h=W#RqmTn^1qw&Wq8yhshGqRW zzJzd)=W_L#+=D5%!4vsHP9SCJlYAF2Ae|$A-T56$+W z(2B0~JMhJcEK7&sonU2;5$17XbA$1Bt9oXD@Ing=FEPp_a?S}kxb}qkV-SeO6v(G81MCx$Z2W4zP_aOrH4ObQ$ukR`eUcy%I!%Y1KZsOi!kE(T?lr+DS z=+3>t>04MdePp)y00h3b48@w4O1IUcxBLOsHdZC)Zkjim+uDs)SC7rzKCgh-)xEDy za}BwA@Vw5%x$k{-3eN-Qp@TlF;z*bB4i#GpT-9eq9E5N=-xh7q@0sjj6(Ta|IxUG4)yrM%ys=Fakvc}HPb{kcN0^|cuopWhddl zU!LZfJ}lc4A6Gp6jy~LY0DrOBxI!3XXIbWCES!jJh1&>Q$PjiNZ~2g6gXhhay+ugs zm&U4Lnxc+Jf!2Fi%8+3L=ee347YexEGcm}_^rb}CNBW6z$M-ED28ZT(2P5L}|1q!r zh<)Dgf)7{IB?;2KSMOEOS}|{qJm-pTWJ#wmXnycJ)l-hiKAr(+Z|OLvBo!gZwl%aO3B@w8`Bnc4O7%hH#?i zV}(n9PGC#UI-~MAK2>dAkP>J-w4>|Rg676*ZyGGk2zSnqz`BYpe!^SVTDrbJ`Eh~PE56APBE%5ZeExvIVG>|FKSE>1GV zH?N!H?JSuF5=(*@)=Mj_OoiPd|x?N8LNh<8tGwl zMBWJk!Kl1Um=+`CDa<`=`D0g4C^XBF_^9t7veETMXzk%ynYKycD=B&!S}ge`TktP% zsL8RA8brL}X>tU3To2NP7Q?pH$?>pO@yE61fc(|xMabpMb}X9p62w)T8+Z|9i(zkf zTtJ6Q&=`CKg8AKe!h)pCGf}O6x*5i}a4}*B6~~^)*DSuOYgpiFN~+*(lj>hDzm9YG z5FE63T(ZsdB159JqnzNh<%IbN!WXsXdN$gvh$%u1bU@2m{!=KM-~xkM-oFw0);d)k zpc$z1Erhn@EK`;@LEG*lWC}=3=->Esr9{2tP9uU&9qRR&8h(#l{-^S+SeR-OjRNK( z;PBL}%u0inDO`MwJWJNdm&WI$^nSP|G_o)g1 zXxMyr81quXaB-CI4uwuzDW4J90!A|=6jOvs_wEBU5!nm(Ipy!#v{)V=fHjC{UqZ(Z z;=&dw?iDfr!JugAoSqOQh)w8KSZPDUBuk+$+A3L1`eAKf1XK3F*ASoMbzaY z`#>UU+%KYXiI^D6Cy%|hX>Qe%tBePJp`*n--2a6<07Y&ml!}4%u22g&fzdG(*Qi{> z$D-i;G;`+NvJ_Pku%Pcf+vfYaq~AY(05%ZP2a2wtToS}^k zt^Q%s6zkzY>YzuRY~H;P%LIydLa;NNuH7Os7Nas=GQg@L%ZUtVmNV>Ph`BphLJ;-^ zDTTQ(6%9t!$9kZ!V)D;SL(;YRE)$+8-DceXUp|B?_)|Bc9)pT2v=%wysd+VP85N6t zGgR0qIz}fwnjrzmB?K7H%Uuu!*&oUBH7ZsbCBn`1I#|eVb-7LWxdoS7hu+~5cr?@I z8v+NI?#YFp^yW}y_Q}ArK;SzM;L<^VgfOrM#etvk9aNh*4Z#+rMTpymzi%nx&7hmE z8I?yMPBI+!FxoJ-=g^2wu%QX|hHyRaRh!H5TvN*0PT-VqfU9}Ki(s5sT4(=_r3Fr$ zHzwp_v8vxV`c>6?BoqzNdE%xZ@_h1L2pHP!os3E>xI*UtkKhXb|3^?KB)x=BsLa|$ zD>|IQX%W=p2u&?f60wffLdZnnZl^}8|A`qvHtoGM_$AOU-POS1qC7> z%l3}iF?{a`;UWj^8V!+@7zE(JOn2af)Ek>(4AR$wOP-7DA+`kq{wU%7Ip zruhz*1WS=(-H^sXe{lxK5Z7eyU8)-9=>K3Q*SFy|unU}~^&Q-H%6q7R6H8qMt&n!+ zP{B$hTMI5I3XXQN95X`yLV;Zf*4C@a-C_a?{>nPJ_t+7#j!egBzRQi7Oak|5OZ=fC zIt9hSxLNz{C^z&ku#uc;+^N0bG6X#ROj#@;Su7NhD;3qP;E}dIM&{6{HZRvzsFh0* z{5ZvZuWS==1#g8u2#px+G?xNY;Acuc#D+<|=+;HnZejG-))SOMM|rh8;!k5t{aWCQMgM&5`IgXWk9VW`f(&;L}beFR0#F(8LZa= z1MA1hu{ip^QQ3~#YJV9nTgSH|I?t?YW52Aa#yGin((@SKipQ?2UqzzHkyjrT~C>ZWW37F6V-$1lG zamIa|g^-#zx!zq4H>3Tk7}3iuLHD@?jCCSsmH4irV~>1GnKs6Kv=fb7=?UKHROkf0WspAd_U~`&oEqE1=dy}5xsNbWrkKF*EQ25sUt}txsKh;;1wFK975Wb=69Tjsm*^gwNh#nzWder4pMH*77&;~iRFoSAOocV+WH37UC0p`bn~I>B213H~Urf=dI#vnW>hu zCfUZ@nzD&4=N_izmaB z@u(YDFJ-ZOf!18cMjbg%uVSttcGijUIKrp^RqqjH)_HudNbOBfS-bfS)>pbsIRR{X z5=tf^NAOSZ8IzQY*2V{z{TQQtOueXIB7f#_u~SXqidrGTSMjUuCp%#fa6Iz9=97J7ZBrCT$kImV7wN2rRBy?8Zwc)DsJvqw(x;m@XF@ zo?R}((^!liox^FQM4u#5Spw|S6$|?!vZxdTW{jylcDSIZ*qCQuubq6_AbgIGe9p!h zA5hvc{LrtlDhrJw)aH`~n7&-uR@J;_ix?pf=xIh0qce2eOa&k5bsSu?f$xg-EH%*f|vXUv;Lxxr>IPJB^W)Tenfhch2%?*5dt-m*zKJ=2_5 z|H2|KXJExL0)2RsU8Ek`?Ko7hM%I>?KrF%tkAqe5^d5(Ah8lGkrU?b-pB8<&+fBkG zagU6zoqFM?BjSi~`F2rHS{qgup5>VA-_zN}b$x|ZEk@NqN^mwaD$z#M9}Hrz!aW`{ zkp!c14wKFkI*`RY6$b}qDPtP<<0flXt68hT9>%?gLjo&3G>ob=tF30fE@IN)ytLrh zbYS?$J}kh4L-fh;{)@C=qzj$k-#+yVmx;*f?ZpWq%q7c5>c1a1;j!1gYwEG}4w>`O^ck zM12>;PTSq++n@{?y9{s2l_x8K8MHJHpM%m_T z<1!=jgg3q`Q;)RX2S1$zIeeFKmmATsYcC33Y|19C>KIXZk&RxxreC<-SvGU^EN`al z<8o+uNWavRDSteUZ6GXT(b2r+5GlP$;nfvdM*oRf`%Vc$b*ua-Aa>Cov&{JvJ1=h)9?Rjm%q_K9EH=9N8>8;Vw}#Vq0F@xzr;Bfv>$RdiLoX=^~e_O24s zfPrpXTAIzg9E?)Q3^qX?oKyaY77~L9mtS|+_gyt9opT$E#~VK0MW_jJ%Hp=yn)DK? zu@xQKUefh2e6qwPA#RpZDY9Bo-WipfG&K^~xeh7n?XNp@%Yx?UlA{%T^0L>ad9U;z z&Gb(9A1(0C@E?U#Jk6Kk)d@W#i>zF}j-!I8@tnV{3-D7_aV( z=ib=zo1CoYXJ+(mRjTo(pIpi3?SC4z(2UWQ3i&Fq}e3-D-~V*Ok~T$FmX z?GQ_s4Y|l-lx_$;`^5n6lO4`_kih0MvgXuIi__;_IIp_6xN$c12p_@tfkLnssEu&_ z68H#{dUKXO`QVtjO)S}r>I*seV1-%!P5|!h=6jrxw}e|dkMcS?h*5bC8Kj!Q!WRC9 zgjW<-R}HRx>^UqLnnJb_^z$|$Wi^lOWPoeOfP87cZE&Qsf%#xx!YoVAf6VNviAe8Kga{{Wk-d9}f3f$j^D)q}OUUGPG^&a7M1?~~qslPF?VINnduEMMiIqCdD z6m=+&=jWluTjeCJEN-G+87vEl&U^4@AssL|vN%N4?+V^8*<8WLbPdMqR}@q9Dvy1O z$G(l6(AceigZd-jglctyn@I8RvU}5nS8p>hl=f1lP2B@iB7y*}&XH4jrmrnm?68Gh zNd0Kv7SBGWr~6u7A*SykdWW32-VsHJ*wxLE%gOZcAeNP(3GJ-Tw-xr_6vjF-H6W+uE7)8)i9$LvVaHDl4fSU{Ml_EozP^pgH1Zt06=j#39L|d#>P! zY`IL>c>Nw3`l9$YuHZAV(Vvoqbq3~u+++EZ*v9sQ4O~R<`Bgr#@ERYd1Q}Q*2;m;& z$rZdu3W`OCu&p16&BSfUIeXq$HVPMOkd-FxI_B?8J5#Aho&vK;5mId4Hw&v*4*T3rGLCZj1A!_0B_apm zUNa>mzzwWyU~6+9#INXHnc~(6fiFWRsNxkP=np8U+&q}8k#CWECwlF`w&I}Ut6cW8 zV6_aD|8N{OUs&agT(V~uBf;wN@9vz`+MwD*2Dp}1%lLl0p9fiJAMfKqmKl1@rJf0{ zrDJA%yeF{zTFsI2CT*syk|&@PHC}i zb>jNcK;nA-U!7QegPrS(xuE&ac4Ek0`u3CZCC=dZlp0sGW@0pHr%}BPAV9#*qC?IU zv#&JN1Q2E?cR{5G7iDbUAM|zJz7H|L_Mg`Xj(2V9+SqlSg4fo}HugfnDkqf`+J7@% z--#4bN8507*;k4Er(l&pYrIZdVDDgEdmU@p?(RC%%L$s%}XOj(3iz$-02U55WOdk^O_+9-6vT7GnZwbfWQ zgDX)E{mKEbkU?|0?K{MByfARo|FNy`rad!UOE!E$ldRzsSKtp(?p(;Zj3U1!%-|~J z`ocg$7EPn9k?2x|fiMnSTE~t;-4*@N<=^mBWV41rpRoiAl%6cANSngIXSCzCAGH5Q zP3{c-lyv4HlPU`X9|b;F7}JTR<7p?U)9_#nvZDZzj01TXD~`h{FF?eStxE2BfirjY z+Q$+}xI? zrV_LwIB-2T#y~ze9u0YpL55d&J}ZObB7nylhLhbI+W`nzcSOwjwoEXm>On}quoOA9 zi~F;We;cxwWLAjq>VDJ>F6KRjtK41w57B4lWhH?8>2AY)T%Q$_%ABsr;jO@=zDK11 zfLT?Y;xqZ?^mXDbTi`tbw$3Y5P-Mv&(&CufY;k$`Hq^FclWwuIvWqEi}YX#QClaY?It$=xK6^v%sqH*}KIm?5+%QBp6jD zd4&X+&1e3-x<;prSe3Mp}r$i?M%2rnu((s zv7~=b_Ek>x-f8@GavvB?fH)tiO0-eh1|501YR^mL0`V7^K$B^Rb5aCc8M<+`ufv*B zV|+4`-`=mK4Kya;eUbsbwp9P<|F%$upnEX8RsWv9%Sjaq{ zw(*!#L{ynjzy|X913b;Tm!~^N%gBpDcxe@{8yOWfnh#?F+Z*<^Wjt@HpCPvhdJY{j zhoCYKY|*;Avw>qmxa$f1p^oo#@}TuCfG~MiU6gFASkUHX-yji2TBj?cavdMFp3taV z&7<0Rzvi`(3}z4qLGRikC5*HY;n09Dg){#A8OD(NMj%$!(rJn zbTX7&O_loXg*1CR&0Y#?k{(#sYl|oMrXRc;zKEyC0L5?`hL1eauad_ol zPA!93_S$R7Q$u8NfXqb5SC-_OQuik31yQzqquzU8E*~n*6pasNx()ba8mbu@pS4b`b5tWSmBMU))l#SZTHSflFi zpsP6nC_=KqE3ed_$7@8s4>KwUF_1i6Z&dClCr{Ij%2X@urju#67*(^`y)D(jw^GFq zfEb=2X|t$Iy(ejxNwtPKM-u8JVJJ`4_EMKIdt<3Fryj4+`HmN_7tgqx>PwC3{P(5f z#cBIxaPH7!eosy^nP#W{pnoHqN{zcxKjWDUO|ua#{nr8-4Omowl8r#d&KdzRns)1QVeNGT);(Y*3*@~kI8JVkb0u+ zYz+5XWM*RuPB`hGY`L))8HG{RLzdSQP}CJxu9-U5LhYrjGbEhI@VI2ab-}+8Z5~*f z7M=t^8XqQTe7KY*>vH*1>ygI4PSudPjLPpV$gVaj|7$%J81g+545oGW-^fe6X~^?Y$R+m)3~@-{rW7< zN1y+9Os)znK3+3_uuqS>XrPM zH$I^Es%8w-mO64ssiqT49sR7Q)TNF-)>FIM^h^y*HWkaBcRh8BxjH?r$j<^=o433o zzq5Y0%3O<3h~7R+wZTDWkhr8(Ce)W=p3P9G)c_pH!O3NDqWJ=ykDR-twTbWLZT*c; znOldElDwpGun>Y;K2y_pYVu6)(AbAAzBgKTv8QzLi)Un5UL)BW&!2d*#xwmg-LuY8 zFxcS(DR|x&x?q+R{Fg2`=VZbAP8NL6g8hg0bwRHb`~irVh^|s_mM%C*7wpNP4wr(j zETdQ7F$i@+Z)>lL==_sq;s)#dZFK%#@y=4@njV7MV|6&@aN~{vANT~gkj!~kY zlz2{;n0KhD8zAktJn+MSfRZ zM;>+b<;gqa|EMgFb}WOx9igOf7cV}!J~ zepg~br4+GnW~+s43L(W`>$pwV@lRdHrPT2bPu1hHQl%5GSf#&)D+EqgSq<+UGo@{*kA}%fq9g#gLyqehx>QU zERE?G@-k!~*k#$9F$s1Zr$@qqaUm>A)f zv5ocS*X5b87(%7?Y$lrV%TIzosTdpnbtp4U49${_C6`U6aKtFCf6DNwT64G8rsplH>knp z?QC8IR;xJ1SMYHcXUUNGMyhs{uE?*6W%?Sjq`n3u$+TNCJt>*OOaY#UI#YM~bkuxE znESW>2k&H@=;~kbWe&EBAT_ z%KY+KR<(TyETe7>AT9-7YL0Y#XOTdZFUXxzoUzcP4%<79=U{0z9 zHAW)f+xSLG^RF00$YV`H#ek1WYx9T({HwA0Bl9&2G>vJ%JppU7xrHa}@C)b3_I&~TC_LPyjcPiP%?KhaI6nX4HiN^EMBt$|aa zxfLWrfbHZyuwdTC2mg(V=}Vfd$UjS0*RytO?Ccq2`v#fWXLapUWo7;(i~I>$M@;s?Gcz3c}RhsN1R3?X<6LJ4W|fBJ?4n z_!;eRMgEQYo2DkL9C?GJrPdC&ChQ#Dv4bk4^WNQEM*C(aCe`XNEnI>T7~pE7L;&02 z>t!|%WBj^o1b0s^z|J0=ZthtO>a#kzZN!p{EfQNesu|)`A9|cGGp>lS?M{y@aG~sX`z3~z`aKXkz*y+}eMhK5u)~c!*De-~)wiL(G)r*YC|v9)lI8lb+BC`4#g|-FVWw)6?&?A zOlR(?6C^nIJ^H0$Vk@?3cv6S!c-1lfB>0IaQ=a1Yl(q7h#x{0j zvwM%V)y7?3Ze8^RKE~t$K?VUK9b9SQKc4CBg&_q}P}Edv?)BO<3~Sb?I{$oZ)BP=u z`Mo{Sjl?Z*M7E10L@r>Lp#3kcK<5%n&1T^j4(aOd^rI_jL&S+_`Gtyiy4u`<^Eqo7 zPsaa6ev82g+sGEjnS&JK^jEK{*6i>izI4EtJa=gGt5|>;KhQqCOz4IIKg|7vFgm4x!VGV zmh6$;$scVyw_VNLXA3G?9pzp8>s|`%Fjm($>`Jg7C><6^@Zv=u*?>V3BNchooGtUe zgXMD0T!CnhdW}^M;J;z{XZGbRfliIDb@k%5H!19v@t1px=vrC)RL#d)IW}Qm&vHAj zpt?67^d5NPs~)1s;r8gywa`lLS+0t%nFL`l+x6Gfp(R}1&@6s{y4{%&L95nbv@4|k zOCj}>!i|jWsp-d|l=wSbY*T)*r{?N@o|@6=W)NB&n-%- zZyr89&K0_~S65;T{`-kc+~VXfR2Eg^PU-;x4@ic4eT4S)P&F+ zCJBknq2*5gHk;F!P1^lC-+?5~d$zIqt$V;0WA($;{FvuJ;`x4?{yyFA%{-awZYx)% zCE0xPda7yVgoYjuF~XD3t_P`hU+q)zAIxkcA;58*3dHkpuxZ80vxVZ zkG;!E+-N0EAW^DuB1~jJ%a+F(kF2ZQ?#uJ!n)|%(H<&AJ+y`73=hC z&AfvI*}R8s$NxeP2vBj9&9}W)JoKPW@V$4bINEd=u-BY@x1Q&{Yn!8`u6OLVNTzGa z@ueW1QFV8mjV;4G*IInoIwl(iC75do51;7W)Suof@@(h_l zf`t4{moN|=@-NxMPv`u3_vyF$=F#N~&6#qXe_jvA@B|un*hP2FW^ z`o%_|14(s%vtB}iW>VHBiQQRY0dn3Bvq(oit&?%_ALk|qj44D5)W(d zVZa~w$rbn=%{q+)X#{2~oyrJC;Fho-t2Y$dkCwV~kGYKzdn5qJNO%K=xwJ61l~Fw8 z#+36Omr?gqJLB#NAfroe0rdaWB_v#w%!*N-W7g|;vaiUCW=i0j+ z2dl=&XL^>29Tc19!XPLi_TZUxgsyUK9=U-$tqyMri>%pq1qk9O_ZX{#LdgPKmV9rk zXLMcfw6QHYqDfK;1Zt=(xFxhszU8Ooi)Bgjf7jorx}NV+bwaG_u~eNmjoR5zN17#wPd4mGNp zXpL+_I!QTDZdARkQ%22*!JzY6fc%p$Y(oj&c2G)LhxGhjoja&`weR9fF;(%FOHbos zkaPi(xbjXhNKV!nZ*|T)O7bEe(*r()y!P@z?B*%HB-!s+jNV>A8;2N7hn`pcnNgik z3Mq@^nF~2;sAD&x+rjGi4-oTrT~ngj@g;VWWSQCd?aZFmrn7DpE7d71#?IBqK?ucr zoaT=?1hH5jjV#KjQK%pl>1GE6CaQsK-=5 zLld$nV{H`^XvtU|L%gjZS_Uz}L^Yl1&4z{Z@4C*YG?_D0|5%>uhfJetB@dxd(891J z6~d@MiQ`;LTF*Fk)Hb(cDTj(P%`N!=mJMJSj)mXVqkjOVu8doI1aoX_R5Thi@5n4Eb|%Crp}NZRI2F{dFNU=iI% z4yjLi;T?@h`CJ)`xN^o~I2_ri*~aUebOWz9K$jaDxLW5(uXTYPhrTg92LoGp+y-s& ztjpz^&yk1C3z!&-u3SXL=485SE!HevA%3#fde|W7rKnGRy^DkYW(TsFv!50n@NVEa zwvxW*wz`dx+}HPGiQzsbG2AjEgcH$;;xN~+FWJ1*;`}}!dr`xlq}qaE1~qVBAD8u+ z&p;!rsgnDTiYBgWZW=^BAz#$`<4?hHo-G9KGr2v(zID*zjpa-LB-&JMd$%Ji~q^rET4N zppC~Ew%x3N3z zx>y=&L#g=kbnvbZaMEGm1BkP&&K!3j{*_K87!NmOHXusQkce0rY~qiB68_y?qK)Ri zEHL)G315wgo6Xx_4+GbXkfqdr=XJI<0&X2!ASh^!iR?IMd)*_L5g^ zk@o#-@8_${C$#QCc`_<*XH}Xv06#F!r#yg29u4{v*6dHUlBIx7-txK5?IBsP=Q?T* zUr05v5l&t66_Vvp0Z76u95CNtPN=*S*>%U~_9NpA%?Q_@WQ5ONZnv1~4+M#Yss0eC z!(4Tv+c-vH^CLb{(Y7~$a@D*kQdwMidMUe_VLlELsomrXF9%HXLePb*FG$wa!{;;0 zPEH=r_9s&VnQ#PMb-?VLr88BK$pUQ73GUrx9(-T-afYtotyR<+IM72F_k6ucrWY8i zc9@kS!jq$UKG|U0|2|q5>L07H&D<`m{dZ*8>b>cKMlLrMc7KEgTN1g17i=Vq}K7)$P1J)$0rzAaGD0I{TrxgK{S^}-)D4RD? zY}(tai=FTjfktxOMK13-Co|j<%g})gg|-9a(HkKc?w5`5&zVu(>e>_%5G%90ve}mi zezq5dY7w)|Knw&NjeN!<;u@t2>1090ANB(0*P55|ok16-*=}!ZE9ZuH44*jMK7pBpXbdv=jMSKs=uoPImtuny|WGEl;Pq zzw5uc`|@4)Gidd5vz08Fb@E#l(Rh<&se6ltDYo;}(_;|VsFID;RQb?@I{p0>;gQ%u zUy;KlOdyn#eUyQT_BZYglIAv6A2MyvSPVh8Wvx-+tGh}(`Ob1^3*A&NGKQkx%__|& zND##wAb|5cv~9WJ%WyU9OF$a->O9#3N63R5iz5#EUN<~C?R4?UB3Vvi4_mzqa#SF7 zAxv^L?2&tax`+vP8FYYbnj_n#Hz8kV&R!Za6?_&xWf1I;wfU`hO_R+Gm<^a=9Z0~a z^stz~EE_+ZZ+Uu?2a6D{lqaL|d_I};pj_%%Yh-1t7}<1;23Yq{@_$(aKZg2&MXHh| zQto<3h_QtoZM=D$IF{Qjdm4l_$IN1cTEb2J^bAnSD9K)~-Ru&nXnO>Vz$Hr#8j(<} z+T}!W#l+X!d3o9z<1z^SBEZr_vDrE)e88noNU+|LP8h3RksdJOrAf*=y)0>}+DgU3 zGJ1Q!JT}_dZ^ZB+bPR~`gfbiHN1aSHljWx-rc?wB8_Brj_+Rt2P15-$kx$TSp4E9R z_7zb^{YeUbWni8Ed%HM^I8kc5H~GI~Cp?@GdIn}l^SN}Om6W*JN>X4KK7=Z#t~m@H z3$Xg8HL%0Isnqa@x1f+mi+w=p;c)|lTuilQmCA_NIp+S%c$DI`v+Javo*xHSB?QN*_QXxw#bx`Fa?REv*G^pfA zlGZ7D8dSPSRxn1-RmH|IwYI*ouTA}qua)-iXa+uq68mKfzOx1R9r|mNyVo9&+Lin5 zJcm1X-`r2h+Dp}0C9$7B^rhMb!m8z@MA!Qcy6t;hy_($iW_3Hsnx)0CU92zh*xMFL z>uE#raR^)NdNIJf5sXX9$LQHU;G-f;Ozm%LDje8?%Mw}W>57+{VVubO>coXk8 ze$R5_0P-iP)_OA}hpnz1xM2ZPD)QXTY}BS+ghcM!(Di3Z)9TnAxJK@J1ivrKEJOzb zyW=W7p2P-q{3k`iES{zB-x2GPN#S+rdIH3^F1(TnM{F*_cvg+f`!{OOrCQJqM`_r~ zQ!29J?H-5d6C%G%vaH?_;G>Sq8)@?n4!l=flQ+`b0LJ2BPyeG$_X3}~0?dNkKt)JBI83K^oLpJr>!j_N2bpiOuEjM# zg52~5NY1w1+Pm%eh5WK`|IHwZ1DY#bjIBY<0J9EpZ@{#)OVLN9(Wk>X5uOzW>B2sd(gC)Q=N zx`U=^CPD7=!xKVnpC_xron!VKt`}&(|1hpKzA^ZNp*ov6hZR5M?h|o%$GXHuQXP&5 zx1#Fy1c}@3D=5pDq!PST+vv92mpTgDi1yHTmKeY{OQ7qC7wd($)Nuh{Bom(*!XMA;M=&xVeWZ6B>P*EjC)>UUGefP@lXu^C-UNN;`W_mML~CF z(GYjGFIBAv4iU|LuD@>BCRNJ*Td_!Z0JqLsdw`E+#zdoVOE+hs{cyEYeMd1}QAs8d zH?oP_YE%xCy?T{h7xj(-R%iqcDHvg<3Ed5?bU8W|#dj0a-{`L1d&p9EB22l>h!k$~91qO@f%oH)o}JXYrWookm4G zWEfR)Lsob+%ZvWzcxvX@ivn0Z5;3X+anusjgHQ+Qx)@Cs1^E&sPKhrkd^5%95IWBn znJe>r2n{H45(Waj6x&ey2zUucKU`#%R_)(fFqw4d#x zSg|rr0C720Z}S+%nq|f1%#~BQnH*YUJ_~ua<)yT!Mp$zY$o03fg zUqw-Ob~u%O3MMQ!yxsNadZL@a=1lW5YrDDbd3tWhYI;zVUld_`(t9)O^ zu0TFe$DhgOPq6)SWYSWQu62rM&-d{R&4~! zBO_0)Vm~uC_={KboGEWI0EY< zCo;q;5Lo1Zro-{3n0qZzd)dDsU}y05|1kC@@J&@|xPg>QI=v_ZH#dn9Gw|QaT!G&Uv~u5+}1){bU?rbS2hJs2%CVV zY|ZccoSQ=R{rwj|lHPmHxo1DmcAiC#VJvUzfGlS4Xnd9bh3GZX-m6rq?@J3hU7L@P zE9I02lCUYLvJxq??yQ+Sk7?AggFrCFSF${K4-Fo{%y=YO9j4gnkOfwYy7>*lB!`CB z%0t5oaKnMEs!j)141GsTRfjMnlp^{OTiVL08jc!poqWh+ju&5}-V28phzc7t>%1-= zD@!>fCjr+R^$<*}>5EVL)5Q$7wC%VI*qf^de8)@TE7B*%UcWU&v68sxbt^`ArS{y0 zc!Rid{i0#Bjp&)#Uh8TiW^${Ofo;{7V!fIvE?0joY@AVu3NqkJv}#_ElN(&FJ#s9l z_k;(Q4&sK%R7SSY6o&HRNGvnnNE5L}y;p-x7xr_(J_K?0+62VFUA{Yve_nlgJ@A zR)pMW`na8CAuo}?n@g~>ZJrM-MIo8+^i7_F8%mji(p*+_t+m;c`>Gy6JH+N(qxru zOS>FLtZq745VC?*Tm-R^F{u$Ku#&SY$_(Orf`C2x4aFc2I#3lB^=KKMOF%vR>q+Ul zg_2M73d|gA?QY{|D1^#P9URE?V?0)javw0gMu?nD?&mNC787D3rnX<*VGf7H&R;Ch zIB0k<#FItd62V_(I9t+nIf76p1c-jlNiVdre;V}1eMWvF4!~C^v{xYg$BAl6(jWdaVvzv?5=7GAvBl-(gm@5Cao8jE4$V8T&@Rk zgvKpJCe!`c5vI`bQMpZGz&|f&V=uu}b}%QtUI4$N2-8*vws9Fy^vFBASc;;$OYjT7 zHY#2RejwnRfR8+hFrF$P*yk4;`~uIUQZmGBB4opB7A{FW;nK{&oD9oSS`db`MNBJ* ziZL6r_d^vZ0+gmy`_7>*8`nLKN9R*2-ol4A8EnW8zq9yoJcLbbc}AciGq*)XFlnX7 zx+=;P$E9Y&4biZq4?i%!ZJm0M)!+%2<3CZ>$MP=@S7^|U=i&ROgo74)SXin|&-}Pd z9bDFg0`Y{qHF`TRiI^ZcqOBBIUeyWbs1K_VF3ju=J#~ZqPjEd4dKu^4VjQo|yzK!5~2*k^M zrv&2H`LY7>A^t5~uVxz6v>Hnbu19qjh-OJU6zn#T?_S{$&PUl@&)9rBF+!f3qHiWRHolKvj zT_0+X2kP5t!x`ECWC!bz-5;Rdb3!EPsY@*CP_B?sbDZ&JPs8?Pm2s<{0FN4utgz}q zH%ROAH%s$@L$qA1TP~j+ICPS}B!(?@2WwVUlTR~{n>DMX-8f>Q^4Zayy0kgjU#i}j zH1;zzyzzIg=hO^o4Ax{ALubf{w;eT?@qvg4PRBD8kit>ZhXiC_h&~3~mF;*~0HT}{ zVoijyTC{gA(J@9}@iDCj^?h~k2V2uE^VGdEz4y|V-otD6C?`XTP80^BLE61&f;#J2 zVUZ@N=TaG4TdAYwaw-qB&2`lD)(^uSH3wzbZ6h2tDLUmYN6mhnQtqhjPD*wEEE-FS zN^W(xG@h$fn{2W+0!ei=d=J$}x07J(g{@I@I9#!F^iryO<)F1tBOGNcwe-UCg|l2r z`3_JLes~SJdhtc3@bE&aiQY(S3|jqMgXnY7oL*9zdoTgBu{6V<=EOC>d#uW$a+%7% ziz}4r(5jG#ZHc8R`>r4 zZ?@Rk)%|<%P^~_*naMqP%ZzoY?w`(sRV|kzc=)iccQZ@Co|uS&6lY@Qx&Qk-D9!y% zB<9rQ=n6hEU!%)99`SuM$A;)m0QuKrPXO{zsVmUdV`ge|au(A=8%~s9(7RZkfZn)Z z@u=tX@K}5TRNp+o1l5!VJo{fzS8G6^U!GF?8D;b;+AXOQW$@=2hLK(cv1|r!Um!ch zJyytIv8JX_(eB^!jvbr*D-o6|8?F)}BlM#pyq>F+0mA*^)9qgOMuhUU`3zfyPM8E?alWmqs|D$E3 z%F7or{K3*5UQ&1u$|mm1yLy->rmU*AejbiJ2=e22dpZ6nC*O#mxLMsS<%rkJMC(Id zV%@F=bDX35QE#vAc5okCh0W1>HxKjF&$8XWCr91IVO00cY>&gYs~IdJ#KFRgIr5>D zk0=^1%7OobeLCxP-k|X-L{U5^f7gIJvS*$~41>@>qV6;wRm(1Br>>9!z}B~T@dPGS z5T%CyJi+4Z0HM%B4@{Mhvrt_x7%zsoJeusjgieTk z;pFdH6uSCouzZc@*|MPjSxPK{zYdnRpq5uYsr8X$cU`H-EeCl*rSCvF?A25A!bReD zshrA6>q`dY;ZXe6C8fl3Dk-eWo<3k$XzXt|@@xu~t{G5#)c0`=)6wf&2u&B*(iZs4 zJ}}Kuy4DkK^fI}@>stm~|Ml#rwO9*vJme3HN^^hrHf(j8zQ&+)EW^SBb36@kr#d`F zCbOA(#qDAJoGbf>VNv^0oRuW?`7wdE(yA`q5WYm z+?>K*P4hKv?FrxdT_+MAuY)N=_OeKsp>D(YTeEW31xN+X^GqVf_%y1S{cT%W$o6e% zsOV_PfT2hIX`cA!wd?%b^4B4e$d4BuoH?o_RFqv(_}R?iWueiYvQR}u*`&|$r}ueD z=(?j49Wd+1c(XSSRrEQvuXY!%nZA;e71xA%enE2SfDuQ1zr+^fLYN&>fxxeASTL(0 z-duR_zSx+kk5hVFZuQ(AIEUc)4E4So%E0gpK>9h@O}BOPrHCciFD4g0zOkY;FI5gzUM8^4Gx- zUb8ls89S|06--EO8xSBY)zBSkc$-zgIAsVaC+;v10pJR~|K{E4P>y(a2|qj^KsQLB zo#Vk#oGaXraX>f>D=8v}L7Uo#-6@_)ZSF^&mjfs)y;Ci`Q2;p38tZK}KZ@rxT!P~e zhFHS!A=%!*luS!3*BcsAfpauG$@Xk16E1gyy5PS+UmgREM@2+b_m?9CmTcovVFKc{ zTL3TmsJZJ1!%{aE8OHe8AoNM;d{tjj#DRG2F>lJ&U}R!mY)y@v^01uKVE6m(PSZB zUOsRDVce7gX*`eGiiGretd;h0P8s|OX{0;&r5L5uH8O!;1QR#;rHE+TQu11gM~y9bUgYtg}p)iLdR)fNI~_X zbVto&q}8k>mso#2Oy7m>>WJ_m7T+u3d)Ht`lRiB=Jbgu= z{gRn(k0BXWiw&Op<%2Wws}J3UHo-$uJkdl{E(E;smc%RP$Q!(YMnDNca@}IwYcB~tT8UX9nMPkd^-jJ<9g<3aB&$}E^90!Ld994J!1}F(nLrZ(3dTbQnfsKM_ zR)6CO+Sansddj;el(9DGKFVOEZi_FK@Q1-6J>8-4+4GMGBQ)b)^&I#gBB2n+c0zF` zyb~6-%sx-rv#UCwm3;8W{NNAz=8IwjWFc9^xtGOZ(Z{nNWe0D#;rI^LBhvdfIu9Oz zS6uB&)iKspe_GXDzx#8g-*m7lc8=a->E7lc8kAv47VhK3tu2Evd$kX&>JB`ng$96v z&hqgJ)r~`{de8&87FD0>k5Y!kfPK?k@zut^#)~EgHcexqTSIaQdBcc&G54zFG=qnG zQ80g3sMuM!V&-*5u(!s5pHQ$hr8`;hslL%{7Io6p{uiV*A_P1 zm!_kmlrr%O14Mv-N|;Z8!bEX2QYxiG(F=9YJGuAH<^~v|_V3pVQi9V){4$EKBytk6 z!pz{$2fqQy3J0C(4)^SWG$jLBjvS5UAXik~x{24Dqx0~CDG@n%w2RB_xPKsz&e>l= z5kU%~wmt)A+K^GS?+#A@Rk4yo>Rgv|<(DK*bK3zQCaWLZ7<d zc?(O_?!x`+B-hu;Ry(^NH!cW-d~R5sl-PcT~>EC_4N3=Emr@zK4o zRvMy@sKBi7RK6t?Q--CAFuENf;2YH)a=b$`ry5Cg6PWfwP$VUzCI${CP0u8p(_~}F zD!pqSBBL~PxrC9+fYk}EXiZtIKvwS11SgR?t@|0uevzFt#=2T#c#P^<*yt$!&gdoT z0f=6yyO=7}E=|ABtil0$hB40EY=4oAjeN{JTx#5%rW-s(_hjfqM)k&{^cqQs}6Q-V@%hb^!rN$_6x z2?A^|XWXb3oCnTB?0tbq*^WUm^Vf_fa6dUxVmg1#lw@I<%?==dG`kB{dj?GHo%Fc$ z+B-=L2@Agr5(T!|Q}`tg89a__)`w?Wd6{!|dFWvoY-z~0q;x=+c|AM?X$gKLJ}vGVzN*(IpiHLG;|!)qFXT5Ze|3Q5001Lx~i8y7|DBVzSf;`JcM?=Mv zi4B$#x_Y9>%Wf=e@t=w<=RWRxjE9gcF+pu(qTDRUt!=gNk~bpw4qiQ3xD)kzFCkou zr-iPb9A61*)1oZb%JLRZ9TRQcCv5rn=x_8qaaV*v?6U|`*k+Gz)hDs4-SOZf4#z8xxyOoFQn0-Cd1$&ktVSPiE+kM{_yd;^Jj+m) zfg6KDSFPRY1vqR1Hnj+uwpM?VAtloN8F;pG&p#@-(l=1#S^&m*RdGC;H4m*~XG*9A z>0-x)5RT%e>VEzBwb?I65K(PBw#NO5)ImVcDj?J!zKL!+bRb^AjCN(;_D~nlZtN6b z{@;I1w*;KXIRyUm94t^z{0{M7M}g7Niw>}P0hK_wX=L*GZBXEv21u1#!BD@oq5F;& zw$JFV?+7#2dP3a`Z#wELbr%lFzOSng0{A3uu*bIJ+ne2Wk-C)16BWe1fOx50H#fU* zgD*=8hJ0(=AY-U8wpBueCV)X>YfAesCh;BPZ^-UHGgOfcq6*({&E02RO?c*Z$B?x% z2i2~tDr_XHaP57zU}licR6wA!12R4jRrL%NIYZu~)`svXD+Sh9=%h&Vh@*WJVdo-MfT z+~Ghe;g>CDe4ipGfAazpi@+f@`eW~;M|EWgDcwP{-eAwVcw?070P_SUZVp-0C0m%X zifmLha2YxDOCon>dO}4NL8isl0@D$%Z{%jRHRYd_tEPM%f8ol)9z^M%;q-q}=75Uq z`)u68Hj>DVop5nk-*RJllqE>MB)`5e-|@G4eQwM6Ht+z5ENKiidU;FrrH+Yq7rDoC z0EfT;i|;gri{f}>B0N9y(yj7}31gza283yyF_puPX61BZGfXzVy&r$rBv2Y8J# zX&~Nq<229~q{$Pc|B)-=&NI_8Wr-E{-7pp$=TA4YdZBqXSetA~>scOtTP``u!>`Te z4}*Q5121Gmp4b^7^%FZFxS%^-IU*+5p&qyi^hdA+WIFqSgX#G{;=(b{;&{Fh1e^h) zJc;_9&?NCD^&k4Dx?ID7!HucKUlRPTEbJmy>+(!^qjBzBLet?7cQ>_`en*Hzv1sFU?9>`7Da3%XsBj30u60Bh;B{Rk&5K#I~y|IfcP}OlBe$Z1Mcoc!e6q z#zV;R&?a`w{Wj11&*Um7zjbufcO!HCCvglHawq`b+QKYe&j+4h>6%cHOSqryFbW7} zHX)e7DJ)Flk#hN+Q;*u5Z(L+ISDk_)A3u6X-(B@4YEt#UWK_jb2E0(Ku_2$_q0Ygc ztlYY@EVv&rM*Z>6o;`MmdEkC)d*#L2#lfgEK*p4_#$x#YMhR|%s@cGvnP0j_pHjq( zDEe_05p=8(Jv1ve0OjwfbCBR6qj{$c(FWcmxW!DE)0F(?EnG9Vkloqeox27#g>vg5 z$Rsv|m=868v9yLi9 zWU~G!E$Nt3iB2KvHW?e4d2$%}nA7Lfb2kl++-u!vT<|qC z9W;s%b$9E=j~xGEJQI$I6`|-CXY~jip6AP$e^}I~{Py=Ah^4rs?u z_uE5NHgz%#=;-LbaMjW2xX$01&E7H`uOKe0W%>Y<|r{en6HaUkQ|eBIRFye4CzbN4y4YA~5Wy#cZc$6)94KJ9W!Gah zrFmt+&E&i;IeMCI6_$QV|R6%n05l$|7b{`-#2XuoZ5LFA9;#h}X-w0; zGe(w?<8ogofAY*f1I<5E-Pfs$Yw31ic^(wq8NlQ0u3#AcWp%Z=_+!Hc$6}d&j*h`( ztfCpMCh_t`LVs#s(a}QA5tc_q7GG9m&dK@u5~E0Mn<^8~9J8x`&6e;$%@mm?MW!c; zOjC`z2wq~;O}fZ(eP!*LROaf_WV3_VxWGoxU0u-E?O4zRXmTvZS3%hGJm_U+ckW*6 zXPj%PE_0<#jBa5*18vh-7G5)>U-9aQtTA3hAffxazYhogTSkI4w%s#-wWUbr{~!kE z>b##=dr_&`hFPiFyXpYaQ+jT$m80g<#77iS?~}>e1cwR_JxO*CG?W}J^?f%9P2{M% zMM~GW>PhPyUDr|TCF4XZkC+wJ2^yCkN#!@_wBrp2w*ZBVcb;%^0YfPnmot=sVePIZ zR8Ht}N6jYw##f^27i@`s%`-R#?0&jxC#vv?D!^l18tiWP?a1v%TSK>;%v{1mzY>5tZO<5JHAk5CT)q zKsQ$Q9k0&3$Rr;I$U9L})~SC`Cvll~`A_wRE;s(e>~eB8V9;wGKO!|xu!}Y$uA}_R zqTM+aa+L^mp1(^DIr_F`sAIxv>3u}6eD4!;3DQ+Lq%F1y0j%^F1-{;8X!YxfW*e(t zs7vRQE#ShJ+N2?sCr<6sKU6Xw=tCW}HjxW&ckWN7^`6!A@gB~qwWOR&%z1~ACBhi? zrn4lt*&F;WzkY;!r1D)AkKcHcpjxzafp$cyudEs{7Sa(ww3wNDz(9V?LFmfH8 zE#W7gvr-c0a2)dOu|A<5Xk(>>Btm!utY}ethG_|&Y}7qh(%VU0+j z6&N1DtwbN7|7GY_2TU#8ai#^57DwXG48Q)G`&qBPm<+{7$7nvT27QMotBmC8hJ)3I zPV=2qeaLoS8kK1BxRF>s0;K<$DJLcod-QgCA>tJVt)|^$sv4e~kTLFE4|VaZ`w?5} zz$@_nR8ueR*IS5RBJll>#M;Oa5>31{27nX&$Lrz5Ev)O-a+p=-P^f z8gq0#N)&F?Cz7zVZ??Ir?(fLI(ai5JskhvJ2~|Q{^PSsFKdaM6w;lh;r89jQ9E^mV zikLqVDJ1wq$Ghg?_1cRUx@Y--9UC~D?s)tkY(25e;v64A`mWylKobnL50c)R5?_l_ zkfZij`9Qq$DINs;+nG^0Dzn(i-uZL$`cT^OxQO=1;I8Fq+fgP#0_r(xgtCd015<=# z$eN^=4I+h9T;)kx-`s<2S;>}bcC`=70-3c()?OQvFZB06gItJEASH$CCPkW%PD<(RC z(f_UyL~+V0{*;Bft>%yMIFR2RY@vsfRebr_co?)jd zco?nU>sT4MA`1L8sG}bd31qhH6&96byel(BRp(*fuUxwi#3R2zQgi2_ZICD3CdS$a z)sbHh#A7GJJN)n!lBk02j+!K@$p6t)98X;c5cmh|P*ck5UvjG}tw)m5NPK00%zsrm zm9zU$^VJb5$9;Q%A24(DGTJ;ojmND5S-9WN(xl-9$J_D=A=9qJtJJdB`h#-x>u_DKf06J) zc=+q*(y}gzC&L_129HgV=ZvP5|E}gTFu$Ia8zYMPrmx$us)G<&(z6;ITbQ4 zCD4u!()Ly9mgwbzP*V2sXeCNQ$AYLIhKS!r^?px1o*KFMPGmEO>JxIKe$tGuAOty! z?4wd5Sywu4jGj-8axEfJiuXz2g~urjrWX>uFTx(P^c~-^Ta^a4MGl0f4+wkP~{1tQqPenkn@mN7Jk%K&Bu|AoQY*S`H{0-uO>c9 zINU55SwUpq@ze`Yp=MRH%O>@I>33o6QV#yttlZ}q7Ao5h;jz-k6}_f1Q28fTANB(C zuot)_f2H&x;^qY4D_4aII9H)=OZXhtaF%T{!7Z9Z|K}h`DU)=|jR(a&Mah%Or$hjZPpqBvWBJ+2fKrX78v? zJdIVj@irGS}`qnj`cEbeja}?a#Sw5!}Ko4 z9fxKha~y$9R72i6^$N!aT};>@;Ty&f!bGD-!KYwN(y;8BOGt+lPog`f6E)60Azo`P zV1!qP2NJebJ!?Cn!vO1gcF3fMQnEURaH%fu>jMQpacORLVvpGf6(zfJqACLiGKi6Y z3kEk$y}|cfc)No?mlw9nj5{9tH^(1Zu*?OsUy`e=-^sqZ(J`b!HX54c#VstSlT~m< zA!`KS zzFq_0S*3+r;q_6g{XJJawPxdJLN9}o1um`8p8Om&>k(fFEpOc!{jW$ed@P6hpeIk8 zd-C*#JdNV!UoDiUYlWHm8&9gLyuCxIKq%DK;4v6^_ki*C8G}VT!{%Drm*YUFCo@DC zKEgH9^Wly?<>i*dP){8@#6G6LgNXwEZpS5sI%2YJ{xq8J5M}F- zauvbrvFmLw3Eh@SAH3}PPWJ)v)ovsb@wEMMsG+!yc_fBoPb3{-@^`rlf1Z(ti5AFf zEE*t!2EXYiW=LNX%@S>;tVCixiKU?_nWfgPu`m84R!@-Brei4$TQ_4^ga!P>y>{rv zevRJHmBKSz%=YtN3V3QP52Y@h^9}=Vj+h>*8UH=NK9KjKpG1|c$sQv}LI>Fm);Or1 zunB+=?bm$jSh^Jq!{=F$6C98C0jl}+H+DuDA_xhM7e>)hGmkS@M(^>GhT*0Tdt7@5 zX_4U?gl$yo4lwz_W}uimau8{SkP#6{izL~(z~Zwm_+BKtZ{!9oPu{3rAe#(F&AC)0 z#N-+L&EFO4#-v6piLb7We56I!+toCRW1aWudu%T}we5^t$?g!YZ ztI|vA;JRTsx+T~CSe3@Hw#!SBKrwq!-QB4~%M)r~%OzUI{YR!zgfLD%=_#-ifaOD4 zXObX9@w-W_mw=|CwMnDD`ZTSQfgzC3Moa5U00wp*Qt;>DUm5v`L5o~0kC7m}WVK(s z3*&c@6v@~MKBp?Q4f9(W-O_jK1&eId5}za_J|S|M`BE`nbVjCe05ObL&iy9RiDU-M z1cy%W*9#)dQFHTzomd`w*L=N4zc$5QlICnwXxv$>mE(airr`gbTebh6lS~J_AB(GA z1RDE|*|bN0pER=_$Nl&2H_BK*a%Pev2yBl9%_Lae?feBj_AKFUFk4VvR&)h0NqM}q zD$Ay##BKfqMPFwF0a3+UR=vd|f+Ez_bXmZptkqbEtHFbym%zs`l9$L_jzyV`_X(yiLILN&hYo;t^N30FW!zFf9p{ij9*nfd*Hk?{HSz)>EEAFY0F_{ z(PCpgnS>8qQjws93026!3->x|&!**~4^IgfYo-b9s2O+5X3kG^XeH%2(~=}5rH_kA zS}NuaxI!rW(m%XJ6mtVdaJ+=#r)5bsIpF=a{2%3`sClHkg&TeOxJ9a}DyjRRrxZa9 zBV1bS2Zkw>P^N!M^mz&!lVPe<<*6XR3O>+Tjykajk`r=@n-I4mc6(ClO>1)0eMen% z-mw^VkbUATT2qoDK-3G4H|8Ke4gL_r-{(GeVJn9DjU`qHljzAp0M!0!^n=n^QdP`3X7W*> z=Tyadh{(@9J_<*J&m{6xcT@%$3m1Qp_u-<|Yw%0?KSHteMA19Jg@~&2Wel9HJp5kH z+n$>#Sh)&He??-iGp!S3CQiSvU5;t?!LJ%(=fsu@4pXzAL;A_l>OuiIIvZ5wZQ?wk ziCQO;Ck|R2i@R3FAqpEhkkcPd@)FjTlPugvCSl zRWI(0;H2R#7WdWsnC#w)O5|Hh-uymr&grW*5$)|0B4P`zICQEbGv(#i_Qu_g?n6C1 zzm|9&?QI@fbp0^77K8pYhkv!~Az(yaWtR!+N?t0R5=B8~M$CQ=3Wp1K>~R~fVGt*N zzLOj^a@AYA%l+xU7(Bkr_AH~1g6TwJxO1mT&ee%rN6TmSsPz{D^#n_cW|wrmKV27u zil9s=`I7VQ!~#Dt04foXc0a9$`~A!ZoUL8#@)F$I;6#XPgJp~9%94|+^ln;XyiPBe z__Y({#&;;4Y*oMg1^QvdmF&spNb+^|BF%BBY5APnj!8!P^$xv`uZY4T=_x3x?0S>Y zOl2yEF(ACStT#FHno4X%%oxNy`;xkMKoth+yAZ=_sSLZY#ZlaVbL~o}dqRn$xQ!Sj zr_!^C+jjNL{fFbw8fArTzPZr&vj!*D{d|9aV+7<1jpQ)^cn@05 z4tAN+JQNK=Q+ht;!{50Sw8Ckw-~^20{vMkL-8q}CdjNIk?~Rcu6QiN(q0nJpw_&pvI(k&nBT}=Qvap6 zW&z}sbz%XGB_M0{SLV{V@ZTbk75n&AExZo4xhzV-XBf9ZW=Ev?*e}9cWEut_CAMCF z5RrWm`=Zl94(t^BcM%_Cdz&q(lby$d9?QvgMyfxRW)PlAB(DQVJc28v<4Y|4FCy|G zKL9drAOHeOiuzq-aeq3I-!eE!h~lfa+A;g?*(8o3%0e?R&jAPVb&|iAs1qUC-mWGQ zG=uut4v^|ZGDe%m9seelZl=X?&;~(-UfBa}D$F<&SCeI-OQlle^!_(k-3%a9C+qM( z)5gL5k*feotRQ2^V+@{2-QNCH2=;+r08QM1)p*UAX9ppc?!{r3(^2~#)6QiI8*miZ zQt)Xhe?d{AzYTww4FtMFQd*lbG3c4>%3+eA1937@hMNmy{*IcF)Zu=lF9;0Og{$cW z%ge1tjd65Dz{9tRdYb@nVb9*cq12f@_!PRGPYr>31P+baWR&u`KP_sHV`a65c7;tsqSdV!GoM0ea7ZsPmr)VFbA4f#Ejca#@j-M`9 zaT8H~SmZlb#5m3p_N2==SI-Rh>YuUg2Hb?e@F(EL@%$2=`WbKP3)e)UQz`WEdrtHV z-lHUOh-#)wXGXf5lyw=8L!fiyv8h3JH-Nn@Irt@a)IpfkZ-SHz90 zz=fQJ*d9ZOb@k}S2VjhD7=gz??xi&At?I8A=n5X}CZ2<}eE%PfBq^>&5+Y*pKD0jg zd+-Phq{biF;&O4MOpU$@O8H&LBalgvfLY%unas=DUonvyXqcsv~#S z*~T%10u1AO){|lUSPVMqK{xm+(|0Dnc3&5eR_u!doY=%QrVijO1pkN2WLRQaK}TEh zkwgqDtQD#UTYTpM801Fny|o%}oGfr+3UNn7!!h2BWzqM+*dHW7*eB+cVs?xWUF$Gj zZd47>n{@9DkZR4za!wN7Ahl>n%oh=x3kuKkHm5$qY6!)aLU;&KhTD|AmvE}^f!19{WxXWD(quyCIvZY;G*%@Z~mWf`f$iJqus$rUq1=mJTCpvZrw zr@6FEOq+>3*0!X_?TIXH?d+X|PbMVVi)k%#u2n)jued zvg3nv3sI8@Jm=Tcx19}i|MkF+lr@r*H#XY^6 zj^qZY1P3{X>-rT~pmF6+z7U)s(#OeGS%o4g&@sf`VPq_%@ysQ_n?Q?J?pXG{%n?ME zC%D-Y>@GOi9@#5t8mW)Dt3AFb*_X8_Y3VT%m$keurAyX&f>|!^H$MBxPEaC$N@dcx z7^ZLFi@+vZ!=^4NZe(5nm(S0kBP)i5d+OZ-ykV2Hs!IeqS;vEBs+~-IXrK#jK-hAT zc;lMJvG~8?3Tt4~yw=a=!X+`16J|*o1pBrQrJUVSxaf>^SO5OKJ$|9?f!Pn5)YPF`x8-;33m3d#S1Wjd zmdfr-a=uu~GB~LPl1%w-`QIbtnu~8a?CPO42bjmurQzY$;9i-ShPl2>V>F;o-@jfy zg3Shl=cri-;>TJr`D#1XG)_-)apvv6DRBN$`SJYSa}aHs2J3I!pL2nXZ`;73bS8)^ zo8nC{J~m7k?`W7Dw7E2Ck3KWNk|~4QBA^0}NT@yXsz!cs_26o))eZ0DJ3}imgA`0? zx#&8e&!iOqpx6q?rrwU)pJ^R0I76*Kq(J?rfwumRhgXtTIdDSdWcN*wTx-DaW}~4z z{1>8+ zXqE2NjET_?&E6G6vjBCW8M1JhOU3uFUM}OCCs^dqq7ReF7>c61rSG8`1s*6k{og!s zM+~xS@F36%ES7Q&yVJdnw_Bs{njd9%4E)gzBt)c}j9x-_@EN23b6*pg@Fpj^yHZy* zqavDW_WS>-{Wm(d|8M=#`*n0Vy4tKD=g<9?PXAv%nlUx{oc`kKy#Mt@%ZzkSLsW*i zI!1)Kw^z#>osN#+3%%r=Ia`bip&6d&4WxxavX-JoI#%9nE?G}Q!4T@>(*|&lUU9r! zM9zwNJdlVmPnGF-`jBPar&ohb*(6`s`GPI@gp6*lxhhrB?L4@bOx!^Y=ElG^w7K@~ z;95yKQ5mz_!s3<$oA8SeyF*q?R*v;A;+9LssAP<&oy)Jhc|s%da11M1J0$B{orMDH zj&zT8ugAJ3Hu8UMYp2n%m*Tp);OClZwK0O2_y13uRyyrHc)%Dq$jP>8igoMwNT)Cv zONVnpai;YxIx@!VKnK$PODajw(2KrBvxJDi9Xj*msJT`?sYIY1#qXJ^S0&ot z0C#R!>=u7l$dOD~XSg-&_ZxwQ+t5iT&bF_|GI0VRkn=p5dh%jhp(7yFZN^<9;;2`> z=);K%pibyx{>~Qp=D1Rr5H?HqK5zlmVQryuvGox|ayRQMRx5E#goKxlt01>#OQc;~ zYT^o4xN~k85xaWBL-6te*bEn^3dH1AxtIh2otW_>#Fl3}s6}vOUU}g`M~zIt@Q~}E zo14ZS7dvX667L3 zXZ~_ot4?UM(>mfC6}7&|MraaQxq9^$1drH!`c5;xLN=%7H5`hoe}KTc`D(UDHs{4|>`H@(H**L;s-nYWx9?Fm zZ#x{1=CJDe5RLA%1`pti#=)E5V|(UJbCnchpN zBu#22%KzI;PphmLSDDSdNLR;4ce>I+oNRsoA|!o1?i-QZ7#EIW0eLIHscUd|plznl z9%!5Dhv*g^%8Tf`Cq(4kM!WGBO2)o6a`+>j;N?o-B(lZb+W8D#k1F#73uy8>^LL75 zkofDicp$^Y(zYUm%FtFQq+1YnH?Q8s+#@vMM(Y~?Ew>}%{KPaH79@jYYt}Dveo~TN zPlpC6!iDEFA40XAbn^~>so14tl_4H45E(gMYtg{dx_2Tebc!7d&OP2Z&k`$^tjvg$ zXEr8%Uvsl?u?<^ou|ZM^no0V5?jNLNKdB@`D$&L;&PZ;@hXj)yF+x4X*ASpiEoIEa zGYfzyGom;;>Jo0nQ2_BwI&1$LJIcqd4cvst$j+WfA_Q9GR{sW?YQ?~1f* znUAO}mR{S66dMuz54yx`*LCdl91-3`>VN>0m;_AMa_tDKW>q+E1t84cAk3qq=6&8^ z_fBYL;iya<z%vWgfYK`ToR}!yK3@f05JT@$%5TJi!aB@dBMy7QABV z4u)PT8*xv>a*e%66$9u>gTKl|uhfR3E3}AGY;dF|Xz49#@mKn4{;^L;3^s7V=5-8h z4zA#aLqqKy>Q1`i&D|4QPJc2SHUBY}!tOgws(l|xyzn9-RNcUH5Cj$6vh?S~8dzlw zyyh2~j+*<;C!3>Y3Qrv?LC-@rmn^|=Os;f3>7ImKjJ55P((2*;{DTQUUBLrG|8rBH3IEA;k!OM|PRx z?L&;rj%RjONjg%a_eWEWYat2A_2c)ep1mNsx3p%?C+XNzET6RYY8oNLj` zdVEdqVex@0^OyhWdSTWM>0<$l@txghLjc4)-9r#@qXluNdZdjfR{)e(ElpU4C@ zd@RRk12n5jN&Qyu?bcY9ng8S%q)2unLnCkrj;MHx z+v?yzm&%9=U;|_$jllwAMw`%gSA&55LPkk2T6X)PIzA~5mRyOO^79gFxLsX)gf*1Z ztSPTo$NgTk)2>7hT$>g2$F)0G-GVV<{}BlT=XVgDSlTrmY`~q}J(<^v#390ka0iWe zT))?-e#6PWky&-Z-K(`1F!r}UWFJSNm#*HFQWG~ZsjX@q zn&`pCNKQ4!wpmC@?vJ2dx%xCEAQQi#?9Wd~D}uFV7AMdVcP$BXPH7_>>?6>PY1$ka z+X2s2^BAFWgpkm>0N+ZV4Bf*G8NfLK;UTT8pW z!0F!;v5m4-t0AC`rFGEYB&3eA)yq6zLYncT&}82e23lk?TGdOa!F_6~2M6RERs13Z zDyqUP_A|v4PHgbrnqh{>;X*w!g|;Ypx&B~G)L5L5isC*Vt@ec|aiCEC5mP0U0I&cU|G)I8jnVXAZzAo&I{{SuiBs*aF^^) z!=6YChfr4s6_iCcbzjy4;) zP@5ldHLCMJ+YeO}Zegg%^}M+7tBf&s|ZDlGkYY zsfe|3d>hFeb*0bArHQi61F@bK`!1K#<~W(Nn0 ziO&Vz@Ps0dxS@be*{JUNr%cc&+*WcPVMpmqA)Sf+42u$5(wg${@kSn$MqUNkt94ZU z|J{h^L?iZ&M%Ev1_L@+{T0(z*+5$^IIYq8N2dlLeFaAN^FWPEBj@Dpgsj=+mnTt&I_ zz%Lab;b$bit>xjl+2!FWMW{P^aAx2EMS85tiy>*?Gj?TUR)xTrJ?h)O8Ugt7MT}M! zRF1{=z@dwLskJNpDKUGKWdbhgVmp>)J*$h$-Qrx@^*kH9IC7xatm3bUDp-&?sp@9> z0RbRAeB|%a**)qvV6Hf~MB~B7f=A8FN*0UXV5a?t5JKm?1GbF(HZji^yfufhwiBU~9MnyqI*tQW>uU8s*YN^ZIga zf`s4a1;;Q4aaE0{0Z;52sj@Z%es2_KDT8nGCYbMZQ(^MuZf zy{AoUOfRikOVsBUCxfgw$9*BUadciL=o+R{n<<>m$j&^OgZvg!5)i3*gIT->c-~>K zpeFa~j9I|~9^)FhADr=`fR;w%SAb~bL6()BFZz7O(@+Am_w8zPg$o4!q<*E%Q~Kb) zdb2g$Z)Koq=%OTo9aRn?hSK^)w#pGVI!eAY9_g!(eH&_gc+$&f9aPUNVg3N1PA-^w zxF=}aSrZ&Av)PI*%1t+zvRg#Ypun{GJ4pz^0}Da8XtKl+iSe}n$SigDcCp}vTs?dt z7pRV_z7hY8Ic0KNS{CFU^_Q{EL_l19kf+fPS$wq~7m>9ZEqgjG_=!^ntX~4)=wLgA z4vX9dYM`Uc%4;JD7WsPnJb(K9ZvKC!TaM17=%kcWmt%_&?xS^H{-O?CCui|F*M9_d zr?i17-UNUz6##15Yunj@k+ZdSX|wu)`*99oS@;!~==3BkinT3G=CUMlWstj2&&zFE zY|S9V)bopJ=8~*|7SfygI$1(gRko>jx(P^v{*Mm}%|52hA>R;+W1Si^Q+prcHU-4b zSE4B8rIW*&OO9zZ61ih-*0&UULFX&i<5CLdFoM z%!w%&XCrjh)&D?O?6_Q6sK;ziFjZMs0hmOd@f-EZG;lkHXkN>-K;`2&n~-T=ZQ|yb zFk6c#RQsKyMu=`L^O^Gc(Rn`muuz{}Q(2?PKbU6`GriP|@^cVFRR8s68nj8K+QwJ0 ziDLE*M+(_-)`jLAUJQp?T`A|`8UXE9@9~Z7!D-J^W7yRN8%h3` zI42?m$=%{f9%<^teEE@S(7aG!)DTXwa3c4AbJ)C`7LafkFPiuTw0BsLRuAs$i=Egb z@MWe~nQf^8iklPD#3uPdPm}KyJwn^=)$8E=Y=LD=TUM`==g(pk}Z zBmv=pKN)f=)RSG9s?bGF8U^^DqCUFjFiW@F8~*eerd~}a8~Q)fKY?GHuS-)(;b(SB zk~c6I5%1qp;R7S2k74$%0P;@(r=HQ)`XU7yuq=!d*JXzzJ0hT{!Osj1}$jOPH83!+(CkQ z{QTmGM4#R}5{(L_&~bvH@DN;0Ncw^}h8HlWf_pHoj*T6#IDfZ~Df}*khX*Tl7KRL??S! zVCzIV^}TUZAs(Jqa!PaQWSIa+-ON`ZPflxt-QT0N!HQu5!gZ;9J)KR1 zRNJlwtc9#+Z}^wTUMsEHHLHueb!d*=|4*q&yc?u7#vZ2wwLjtun2R2<%9Z2T2_TDy zG$D9B$%7&bu$w&Eg{jht9_?zAkQ%|pP*F~6%74h5=oCI*?s)7!w29z#OGbKTl1f& zj_gin?WbpDwlP$@=xk{x{Gs#~p?6@8M6h~`IXXcmw3`R&3}`|*#d0}T7IGn?-Yyt% z>Fs7$Bp8)UUdGkO>0EJlDhu)k2Y}%&vij0mQw z1ZaD?dHMxdx}57v0rkYT^22ehJa@dha|bX2Z)ycrZ{X*+`;k&h4NmK{pLr>nEFuw; z8|&ecQPM)a@9%8S>Vk`T^FIcrV-6VK$<$=#J8JwgOqm9uH3qQ@HLi}zd`NPps$C79 z3o#JWjZ~+}_@j;|`2R>~XilhG-c#tOV3ASTKCZPP$?qaSbjI*r7NY`k-XkHVLNjpo z-0DXcWrkea-~DTXsO?;JYlG8&7Pr{h5D(bEqAA_o6NE!*;ifspIE%B(!gBwfviM2U zYQ*kI5e%az7;-6p7s3aLPSHickM9LJ$YaCDPiw>@`?OiTc~lTHK6US>8c{lx^$7V< zG@4W34cuB_Q4SC?2j5%xvp-AAz3`F9T*Xy)y|bHJQwH;C5#HolOLMILTbW_ui5_B) znm2-_t57Z8(#j+oM-{L2^Q*z$mNPfCIu5!!md>D1q@*ll+HnQfJZdC3t)h7y}MCm9+9V(3w~#EPJE~zqCF_x=>X2(De`nv(M^n+R$^{~eGyw8(L6c0 zD7FO-S?}vonG}7AclOe$k;9q>YF5cGQ2MZHRk*XCb;Ic!5u6-PG2G$#0 zHmB^c>=RI|by>2Qjg90ZIrjZ%ql_ETNcB4=OS|n8&8l7T+7kpBgoX&*>>Ai~3>WG-?)Wv_*X>ac9l{P* zP+OA!rNGLhpog5HnX$i}=*KRW-t6T~l%-Zrs0y^RTkS+~(-SN$h<>3i8aIONyj~~bF<-u(UkrtuZ<}x|$st7Ge*b5cAlnvXba^eKF z07*L3xd)`NP(KaVx8yI(g6o(nWW zu=tdq!zL`d+48dfr`E~ic6Gy(MDAV@TdBni+JeaZjcW&m^wB`{i)RZ34P3G|Q4(IcU6k@fSg5%Og)CoM6JwH>CsTm(8W9tUXh-adP&0T|^;Um3ai#^=4`~1dg`T%ktij-vUd#3nbHv4T7Ur`tsQM=*2 zP!+ias*ACW+6|JWVm4teE5tGTOG0iP`#L{PDi@QaN>G-Q{O4&ogmlS-`<&|zBy;=I z@E6lgf(<$sjH$Z+?N5k6{67fFX-;Vh;+vQ?Ms)x#dYyXa5P&6lJn-Q>}LPE(mc{Yd781(CeKwS%>Nw@#iXv{!Z)Cm@(c`C%Jn=5QY-^h1 z!TF?esp^_2KhqrDYh1E=fmigsC<3kzTx)n|Wbuj|I$1YeKF+MssiL+}Q9bBkTD6Gn zPs-gqIX)`N6eEy{;_AZJTyzxW5v^?r!BuHPxHCr7FF9e@z|*$T6KR3ka5^?>ZCxA> zpG5WAW@h3{i4FLrH8#&!&24FHMqulaSaM)hCd~h|SY>(WR;+h^g|ANm8NPtvQQ*?^ zA8I^$7hU=BVPRpmcMKrW`yVLX(R6;8oI z_lU82uu&^+{=Y9k1=Dn*#^0Dv8G@wh1z?HAz{*k6SK300V`6K{+K1R7{%d6(c+&fF z1MSlD;8QGz@v0bo-|_?Aeej&0JO8$IDqTs7oz_wzR2sK0`*x$8qaoQAM3jn0*B zP{`a59M)EK4`tAQUYecmv_vilN;eOeqm@{%`T@$T2i-+Q7GE~DAFfTh>TYGE6uQyv zcr-B#Nq2NlM(#HO*Fc1WTaj6rI!;8XGQi_oMQCnwtGs_&Vypaul84?ZPPR&5l|6Qc zxl<;{PMN??iQRO3YCfWDVwW6LRqyLvay_&2A+cCGW=C)Dzf!Pcb~|m5SWaN;!H!*V z=J$dH+hV63-wmVrirp|%*S5*rE?U1WF{ib89_1=`Qtk62CYtFaOUrlJD!@?d6Yf)qTX)QQ$5THa^=g8k6txD3W}2n zM){?Hg@RN^&2zjP57Ve>gRLh>`j>DNs+IAGjFHY(Pyo22nF4XYbkRB7iMv0+QVH zW#I)bDJD*J7r2Dp#INqR7g1$kc_twU9ghm#T|MaB8VzI+_`_j!OW|#RI}`6pPzDYN z2BBUSzN_goIKuwB0(dilr9+pA4NC2;o@ zCON=>3m!rCDE+29K}M+mTz;2U)8}5R@qx>OKF{W1_8QIfwaW)Z!O z{Q?QKohyvm?|l8>NixP$|ovVIDZL`dRW# zVfpiXX4K2JpCn2X76J1&%G2B65Os|_ZF_>W^~eD_v5)~=x0tE`nBS(}|1et`a1Q%_ zfyI!x94g4U?hu0`+b)@(4*tD0kH|xL@yhPNHgP3->2Do0#%>^|9EYOFR3=`FWVQe~ z%e8;`{#UfeYwBk?g?YE%!dl7jSssUn;`xoIc@qJ-SG%Bmg%0L>)`59wNmQ%%cu-42i<`y z!ILXkC3i?yC!?UgdltY8g#C8HLEF1q?3hlDtIXRW=D%DE?m`dP)H#*^hp;z+Z?ei7|C5rGPzni~ zRs{`Ov{iONi%@N#Es3^J1r$*>3soxuLLz0@ifOeWMsdMmoY7%M#}}PZaYQHxd0LPb z#$|wU6h#F^<;JkNP|BMB_uMB1oO$2>kI#qZdG2%fd+s^sp6wnNGa{){3?cf0*a^qp zhEzG8WEc+%deWb|@JTG-9L167QkmoScY)%;!RfE#rIf-g8WM^>@wcOi=#6RD%3R#A zp5gsXp7*HUJgfFhS8?POQS134kFMZHi{*Tg!p`#G7EWdW^kzV3soy$Lw(m~$hc}KU z^nE%|JJFDA6LOO03w@?`_D{yeFf-03BN0!WHFCVpTQV*4W?Y9-=DeZBa~J}ze35EB zi%$bD7JnOgAYb4~Ks-Iuxi%lm#!Y4Qn;d0>cKExLEk4c#fYmb~8)dnvt(?_dQO=ZL z-&Pi^eV%$8&g$D*k}7LoAjRga&eJJG%5bh({0EY5@N{xk6Idbz`=zI)2 z^+afs*{Seq*9x6JlhPuelO2RfukFHcQHm{WKQ*6C1DSvv6zCFzX!mn1CK1&|WQa@O z4$88)Avrcxf(#8>WP?|zew%FZeB-;TL2?H<#mCUYP(N8EiW1xIBh{Vk`Jo>rK9Cft zBBp{l$gu1t2XP~+A0!C@VHWL*HU~rS^&fHWseJ+T3aQ&J+TTfKdREacdZLels%ysy z{pVz^`?TTS;{Xm2S>Rk#Eu-Z(@+W?Q(8!K)SKRq^6maDC~+xashmAVRB^Jjz%==L^pC^SCN zMPOqN6GZjSaUih)7Js%{ypbJxO~HVEJGI>#9z#L)lip4ZWQ=#v^MXOn#iVId( z0MR1@Kt7fpYRvu=Zq$~cG+8VyF)ykk9@%N`M@w;g^P1E z4sW(tiBINSC#aIY}!2EVg~RQ=vmyWod1t}iI2Kxc4_z{p^?5t%l?;R)L^Z;s3#kRBR-ipXhLRsW>Mk*C;t2;mc#JxicguDJ?*@5^qI6tEZ+ z;ZE|I_Ie+VWrmg$N-EGz-TE%@!e9q@;L`G%?58S3gMb2ahnxZ!ch4n))BNyUq6uKph3eSJK z*YwMJio&5SD8``j+!I8=H?kz6h*PoA{z+|snL>bxG9pW8^*8FFm*K7mm*A}SOA`r1 zT3cN456t^(`ZJB3>dUQY@d)_zAj>JZv=m}jS<$I?pp$crw=1Hk^jhTr1 zwAT(9uOp+UW_lY>W1)TKj9Grklp&d3rbp^lp7`3{TRYi*-^9`xv;AoBscVn=h5j2; zLAI(FdAzj`POg|Z`QE8!Q+w3E<@1vuJ#~##mVsVFb(hLE-2dQIoEgem`;7ahPMbDk zqW}Kl(2Y{#pQXrW2zXVqJRK9p{SZ&y+9?yKOr17)E_Ks(ZP|=jb0*K4GEom|k9t5d zr@c<*dU;w0%&4_I(T0O=-#hjG>Gw{g+q%~`N|vsY`B|Q5m|;5}oH`4Vu}5{6k4MC; zehyFGT7T(udiUT|%ECz&I?P-rnRDas9A4C|I@eU4XO?uXJw6E&G7m~{E8W_5$+}9m z+?8Zy9_i4%rDpzQhhCQ~l`oK`m9+i@PXe!9i232NpStf{T~%bP%suQ+v-AzLsm$Ha zgWRS*%~ZI}Gz&NvACkrk+muoIc;zAZRo#{Ssz4WC)lz(AviLSSM|=G!ZtRj%(H$3v z6ri#2R2fsUUpdN?P#pmYh$5e9n$nUsm$d&Er0ZZk@vYbbXJ{Foc>J(w;d(Z)eT_3< zAW<}Lvukx(O@hz$DkYi^U5q)UP2p%(@c?VTZbIj4$<3B+QWGy}CPb>N!e8jSNSgZ{ z^bs-6`N(&I7Q(G@mz{#|tq1ZE`WN(j&KdsP(afKb$3gzXPw;2tN&d_@McTyEp2|fD zp!22WC>SLCq68q(B)&suIcRxC!F`M#rY;1Pa-7jVTkbz<|#dJwVZSdI2uIvYi@lHqM9v$iau@!e|6s*8t&j;;=iW_`hmgS z8qrp1B-z+xOrU#$wL6+Ul!ZLZIYM`{DgN4dXm~EFT|Ah4q3@Ey7QYCMxP4qLnIr*A z3MBl~!xDTYks|SX7B{^Fz83c&!Pi8vh!vxnG(60kiHqtMa0X~>It@e6<*Hf8*Go3b zIatut$;}+Xg>0Cw2Y4k@N=qir^pbadH3$nZiGK*0$uO+!-}wJ%Iwu;g9PP03Ur2Q0 zMgI>Z+MhK*>@!^us2JxMqniPz+dHup{P3RVA=8c>1)0wF&zv~hKUq+TMh8>r^nP`K z33jfr-|-OqLvufW76Ekv*Hz{Y=iL(M)nLC#9?BZ+1NfajBYug9SN}qp%G^wyC9TnZ zArEt>&Q3bwMmckyw*wz7(>u^#&hEo`Qr2x>GHE!FruSbLAh@tItMYZQxi@T6rgqjIP|v8{5QyrczOT>BYWF3*J3 zlBiL4ad{;6F_MB1VZ(<)ME3}5d{^u>7xlM%R4=0=W)DlSfgdHF!1MY@`jvQ!-4$Cz z)^iY`6~6nTA9FyVGGVcx|3U$ml0=wc zNFN-2-MMnf{0(cWUg8PFzh$i^8#<3mpmdLtpqs{gpt_~Po6L4!D=^!Y>Rcv$yF{}7 zEY&?^R(Jg8142~v%$*U*-Cu;P3#++ND5obh!$qU-A21u0)^1brv|nZFqEEII zeJok@U6ZAC>7w^fpZMU6DZ=9nx6|p#_s^P1lJ4|=wT~lKW$uWU3JP@vX~xq`x=NE_ zNJy@88!C2?DwAH&C82+NL%{e+L1OF5&*KD}AvW54@|aq;OVDzI>835QzO>xWwj&kY)uZfVF?B%rR}`7l zts$>lZ_+RIhRxR15yGhp;TGE|3H+8<5E_YOZX34^`GW7I6SbrJ5BZ^O^)W~HSV3s3 zr(U@{-Ib?4mJyu{-K3}xM{uxIGLcG(L#JaI;2ux-;l9S?RvM)jAZ3VQl1(O}H_u@H zSg<-q!$Q7MtIcripSJtun$lmBXCyYayuQ8zT89P0IY>=zDR*h`jNw7 z*x}qNFrjaArSbZ^Y-Xm?}4jp5jGpo<>e*G2DU_D_*+NDtc?J>~gro{MFG z`@}oO75jzZhZ!RxxQCnqy*bp5mHdk3L^c8$t$UZa_LDS1v{-BXke&}&? z_kl%Mkj2aUR{5nP+xcbW6bBc`hh4nDsrzpr)Ii`KWZy*&ot4(Q$^$#5FUl1FY;<|o z_>JdaUo9*AB@z2rq<*#8#M^NnU2MEMb;u3zH3u9?CPv3g6|$XMHc9MeVs- zcNmdNj#Ty-l>uHcq4#3sUsh|Q%Fp86cXhpl*3U@KFrMh*tavK(5`MkD$~& zG-B%?tV_!k0lS7J4meU*EzMa#Uf^DTW`$gu%s%mk@a39948YKbAUElY>@g9aU4jD{ zp4bDB(Wd%B2Lx$^hM&j}?JcXXbBH_+<&s?8`!l|4P4-<=&0W1f_>3v*gnA&ZWrA&PS5yjpSJaN41yb!V5@A^bR;` zidtj+6i+!*?@erte|Nr>^Wp;nYB+A1zSfN?qAl#VTUI$E`X=ljC=*;%a%qxa5+UJf z87$L*y83QWjx!UYaPO&aot3~GgyR56qfh7~53;P!uxl$05nV-&pz42w5ebUAyw#$< zqROK&$!@tusK&9DylN5o;6fLq8@uILKdKg7b1~LRI|%~icjhheKkLq`@ptYhmW2lp zVxhKdC2Gt0A8RfHbz}F4Hs{h#N-1jOD5B5_DHXMS89`1m6Z~ns1{!-hhLWduLbCTyly@E*Z1#(VNRi|%vSotBQ}}huYQ;f(Vswt1oa_}K1G%d@ zfh2L=CKw`Eo21bRs#7t6Hl&}@>;=;7)go@~$itP`2oPjpgO1-2`dkQoN40q{bFtYU zZ&mKUOZw}-KscqsOU} zi|l9wJAi6J*VM?d(M$-{1wI@12$Wx=u`&{bIoq$3AJWg z5oNb;Q}4eVOz&V(iTFZ5&Wyi+kZIYvH8jjI=$7<{$t=>ZyZIv z_Adz1s6{pNId{}3Pl!?7J=#v%&zmqA^pne zdvMvpA?<+2;Bk+rJIkO|E2wYm8IZ+uL zv6(WsIE2!IT0dPxmOIHJF=z;xF|bcD#trCJt3LvYjJ!Mx5)ukYiC|qG=p=Xor1lga zvF;_f!H_YU%+-Hy_tx*X6BfAujxBgR&tD3=yCddY^LYCe4_(2b@gJVLZ)_esqY%My zsYAgIPvtj93i|CvIFB=Ep8x9nP;5smf62>E$)6wktnzD{XXgP=<+siP$H&8KARxpv zt=w#jZ})Na1D%Qg7G&nNTU<=NXl+G&(VXY+u%u?itSc;Mws~sOQ^l(f$~ACo5!)l& z>rQ^KQVz5;vKWGz&whuaEDi-M&+bszxc~DoGiHrh%^ge<5#5rZ3nno~IP~I>7(DLq zU(19%waSJ`Wc5$}?!&QLZ|@79xNJ_^(6&RC?PVnKbWd>8-omyv{l?(qoI`f_>c37a zw#Gc64R1+cfPzrfTbvQOEu+&r9bV zpJ|dFuzT?r{+vIa$`hA7oF*++O8bq4ZPS+>k*AH`(5I|(n<6p8etd1Fhtp1|YHjAN zvPW3@oqF|~X@x;8H(UAH-@eefrmNMr_@o@%0=PBR#Xskdr}E^5(n|UZvR=|k=NBwY zV|-(N=-IWIlcjFjct{T_Mznq=eUqq{fJFY+x7MM^F*5^=gY25!dLimIbl2LzTV*(yCCx5%Y9WS<=p=}3L%e2d6?DnF`s^6c+ctfjy zo4HuJvMFAR>!|c0{y#;bUa2>Oa=J`ZQ?|<1!dMNTXY|)GHLgl;8*RSn0|(qCz7bTky$ulm0NPwZ82zsW zcNwjve(VvT<9AkTv!Qw#mWykTsR1c+w}BxsPEcH)QHR*if?YV9alSiv8a3>|nn|c( zjsE=xV2tA#uiDbz-26L+0YGcPGDwGcE8*=CD{qTWjVvniIIH@@{_#>WCV!Z->M_Z; z_!Q2F1FbXfDJq3l%ste6BB}D~ZXH}Z{GJ2G+$XQirmMI>cUu=e1r%XZqNM24P zD;QNY0#BJ_1tUlDve*0~nAmhE)Q!r^Kay47Hj)=xO9chDIji0^Uv3*MFLHR1cEW+@)l(~JY|)9FEQOyt!kp3|Oxx8dm=^v(9y(kjExrWnZS?Qk->urwTtA6YWaU`0TRTf-iNuQ|^&X(?n-h=w-vF12rZ#b*BQ`>)!bv>!Yp=0@>Qkw+oz7k%+ z%T8>^i=0#8o*RUVoSo+ln{#0Nf<&6unn*W^tjg8HkbO90ne5}@&>3fq+y+M_vJj|A z$jO>_n=alZST()PRKSv4=T-thu{ZdmGTHLR3oty|rsTJ}`uD`t{5|GTR(H>{xCZ8P zurscF3V?fErgtE(>M}ts;Rje`{KZ7_0V7!6bAp<_ii3qr*Dx=0z(9^%6+vu~svKeVuE) zHuE$dXkY)GBfrgeW%XM)_uZEYh=A07V3J}Ff#%LGXcsmph#QHb{5??GsN8TD#A~-jRS#fA$^Z_dCzg`R$wpmL;Vj9 z7_ASD?TD7xN33QRJ1e<~DxLvh(^fHHB)|9Z9>c*?c5?nL#Q^eKCKAanzKxfO=1W0I z3FtDId?_l(cUB48M48(PM}U$(W}0{zIa*%i49m-yk%EQ(ZNA(lFV(B)dcQ<$7)6b( zS2BV|fe!*K2ZpYH2{W zLYC^)O<(dmq;?w9WZeWc$w}1bvnd9MK(lW?qLi$B#7I4($2ejBYNLyxmdZVIl=FnZ zVqfW2tvCXP=Xq7Z(?aj&<*7T(Lx49nT1dHUTbOe~hrKMz5=v&*xJWL_*4s*4A0FjJ zwL|u&k%3noeM)F%sh7Js0u$nwCxOF1O7&cHR9~s25t@IPdi^q7Y~P)+O# zX+>JbrUqry)zY%lY+10NzkO5`((0RBDe1q|oWc7Aiek-7XeDx3b(?_Y=kf|Nb*p@- z_kDRCFtDFn4IwjIJcc(V8TylQ1sPbM|8i+GhNn>5x|QfkfBzZ#4ax~2-alFbXG|#Z zgcg?2$?}WGp($0Xm^ulGkTT1Oz6E)J15tl$72QuhBcvd7QMg;(SnRm2QTIb!sO)(v z^9(L@%@ip4D}mzzD$VTpdS84!KYCY!7fV_{H@ zi#kQFEGK`tJF*a03lXxK5?0yMUTeL#{WHuw-Hq@yA!%*Z|#UhD=M?!GCQ^Wbg6}YFv0Tp|ml@EIpC8WWeCO z$}VwBV+c{6Qz?e@F!7L}T8XMCe3( zmv_0;ZY~3!m|Pmg*1}m)9_wBcFTp~9sE*(|NQ60}ghu2w$kKC%o7kt-?{#pMU-0Wa zZMMb_h)BnDa04N>y5kqE24%Wsu@6DsFs1wQHZ;t5fX!+{19!zX16b!@wV`!LTx@U} zsjjX5ARRiUp1(tSfzRDx!n4R@!_df(3c`V@r;&p51zaZv+e5Kiqf(wSbidy#2z}?t z{?Zc}V?|<7WaZ;mYQfb_iD8lS-idncof+Ed@4#bCPl=g>O)28Q_`3zxLn0LzR+E0c zr@_`5eEFZ=m!?Z9lF9UtgqvF54oaf9$CoBHbG3kwoSjO12)w0R6Lk%?wrOa$k`u8W zEesR!@vX^;(3AeI#=NozTzAD{5y36?zmo%xW4(o)B`S!kbTtB-DVYwm0D=W$e*y9| z9*8{)Q9P$eHltAn+NlTWf`I5?G9oidsa=8cVBLH+yjT1@5QMmV`EFnfNuRvAufyDy zrmt^lT7t!h$hfaX5J@+Q2b&?DtgozOt|MM6kfCd$0;KtD0JWSoQ5U^uYOLhA&9+Ea z7ohBy{h{uJUlbbv5x9*rieyjzNarLvSVe`$U+;f4^(pYN(K0%Ff@TFRsYZa6Nvr9)y?7GAvvJ0jZDCdI0a& zl1Tod;mAQCJuca*Xl1!4tJ_2*;!l~8cL)e?5mzcu8B zKJm1PCxRW4cb1LUeXS%sqf~shSSqfOsc~CbEs6<**WBXJ(j#xEd5NQHn?F4-=f^-w z4X)jF@k80ocy+WpIYOjWV}paNiwL7Sx39%--CSbC-vMnN6jHD2&@tmec=g*qAbU6m zBb)_<@2cplmcsmSVdv#oJnmE@`^mK*q6lV*N?%9%n`R8?KM?xQ`l*Y7uIhso?Tmf{ zflpRqD!V|t8$0eAk9|hC+YBm)l=fB6Ez#t)uO&Q~rsmsKbt#NP+e8cQ87(fuOQ}z; zK*E6cItmtZ0(biWetMn>T*^i|rklh)sVPS4c;xkheCjFYvI6g z1u+?NEtQBDCVB|EVw1yfx;Cp~ZazVq#DUjvb?+`G;DmaWIWdECtPBZHUXd3%%%ptw zLklnd)IFLPuP8A2@JWz&!fPh(qC0YEo<%9}3b0?yzTx8GcJyaFWjxFQx|GH5$poGC zoi{my%gGx5RLotHl<|J7*RT56o%A)w#%1asTeS8}vKcE~;_DGW=}JL0Um(27TXJ73 z9Gw5nqlgxH+{xqkp%{96h@^M@KK^J!98c|D3~tyZ#i1W@Sw6+fea-w)pSBgTZ&7KF zegOx!3JlpN_bzoA7wzozJLaTxsUSK;=gi4c)&h=2J85D z|gawnkO(3F#sGjiiI8oK@Ab+{j;4E7mpl z3*G|1!L2Wq@5YQ<=|r5Q-0%70zby9_@&xYT^Wj_g{OSvU(g!V{1EYI#F5ph}SS8hPZTEJaUu__Zpe+2)Xd{^GW|S6;5zbtzD>Dt7N4y~5+vM-Z>^389 zLUCI=y)!HR5Pt|`a6}87K4S^eL3mm7kJXltR1Nt+{d#^0yB5NRe)NDsR-Qu#i=_2TwxJYHKi8i4e^{3FIK;YT^R( zy#EU2#KVc0H9Hsf3g&Loxo$8gV$vkH^d$J>(S%N5HK$8s6Igx!1;HN6By+r7u*c)_ zfEIy^B#l@9W_BxIa!Sad1%nH!zV%-k%q^2#wSvE*S~f2cD~_ojR||XyxAh-*A?ByB zu1=99Vcb0p;2%5&*9_y*N9kCT`Wlpx`<;xulkxO}I_V=x+DB5LkM6SS)y@jzQqf)3 z-77Bo#JkZd?tmkyMok?Xn+ieDHK?0uY0RjS(9faMD)t>Fn)m_udqXo`9IuJ;Z~5uB zTkp?OY3dtk>SE*ayY)sZ5gdj?_g%?b;>K?V5RQ?k_lks8KJSW$=>704>n?a5QL6TL zyTK|G0p?jdlbbJ|Un~@X(B5_%-LA};B5va71x{o9(3-vq92#h_(f>j7V!-d2P2LpxpBvGN> z{Y{yOMDzEAb5x=~4i-8FD*(|^9TnS2NBje+KhTN4u0Yn!AWPxxI`(UdUyX43r_!Xbn!9)jSCp4-^Wuu$CRpf*0s=gv z(MVpD5P0O`2_lxK1ZFmEMsp&|D8?&97u%!O-^{2CQY@*G?0l2cV*;G?Ppf)M8wX*C z%@yIDi2E~)vsPqi!;qtM+@bC1Zd>(`?`K~SeHo@+ur~6*gP_0Va_`tbJvA2+c{<)G z>*i+Hg-2@0jN3d7a-un=y25DbRU_v5*;t=Vo858+pQs)*H$RxeiUbH>%3iM8?W}o} z9*UM7IQZEQIE8OAuWY{lW3h{FcOkeUI0!FmIWXpmiQJr26p{^bbbdFLmrPJ|K)S^A zY$H)ihQ1^58r=SYShl3=z~g>lsVA!AvE$;%gSUD4LKgK*30hh?M69OA0)?uc2V*#M z&A4*tQPu8>EDA>F7oz06i+(lO*G)(4UVyNEqrsT_BaM)HgoB7l|&X zl&CB=%lXP%flfkGKNby6=zX=1ak2RWS>b|@xx>KuWR@KxLaCs- zt{`+O@G)!0uk7z_YK?{fB!lB?f(t%Q(S!{8Rj>*`UgeE!+zS$gulF9?PQp@exS-B! zm+|nn+-F!I0PG&jM9xHIWa3y<_ob$`&Z<}B_!_DHni`65I!95vUcv(+-nDo&)nLZa z>b6B?b;X=iuk)pU%)(}4vz!`YHK38rOOPVeRr2vi=b9Zv3;cA}L2`XE`y0%yvrqb$ zNbJP^&$CYi(_KJoC^(noS*v(+$Xj9yE|M|;u07?7-aTB{>I?MthR4@wN!sFsY+%1# zJ+Y8jw?M*6kPd{4dC6hNt^~(0DVD(1p2{=c0O1-Bt3{G0Tnviy$RS@n4&G?VPr#i- zWQ4(RoR6)RQLdM<>hUr-XK)2?L#_^7N^SXiCe7(}R&z>CH00T=F(HoS8532C?g>Ge zCH~%nE4`5gE6e+gQ^z^nFxHwVb51Blu{Gq9%as!5m`k<-l_JpIv|Tn`aiwz&cR2Uv zGBNVvU|79`U%3VM$;CWy-AL%CQ2oDtAm!LjXZ|Oi&=^Z>kYthZPN0Vcfw7EB7EgUN zM=n2~QWOr4;%;yVLeI*+y zwv(*VhO^pDYqV41tiFIJ^2>6TE>AA!aGDWf7@28pfXVpxYi_a}Q<;=EgSFN{&AzG} zY{7L>XWdiYXM)OXDefSRas>AVP`9eTb2NkkOQ)jxu}}+G%w&lQx?pQV>ptqw<~K}w zS>W(uu?O;nQj0=w=>T%(YQDF(#`!&p0pN))D>q_OAA~jt1 zr(ml$GS&rFSwYFAo=B11676!4o5uFQ!WTuVrK8ZMpT7rLK<;|Z)1&Z&zRJHQutKna zWIUvT*uzo7R&Qu5*O5NBoKT*{ct%V3wJwAOaH*$>KS zm5K_aNr-sl1rwEhwBjJ19V#HmsAC9_F&BMY+ExTP({37@G{I*{b@eg1mvG|!F zHeYieL}q~ehIAeCa1`s%4|Cuq)lXJL6K-n%FY>mFG-#V)aYLAHhY}Oztr$(7FZ9?- zK4EBuo%Au)4hIZ;1JJTB*zO5Ck@6CHvCiMx8?yHyckp4Fd9mjtmv3Umq1BMggk@x0C!?p+C_3S7s(2ru|R9Yx+R z7E10Ci1&-rjwVzl)B>V*84J8Um?N!?3)0#cT63<+-CG8q{ahYWHa>g9wbFGFNp>O{ zfF=(s^e2!U{~XGx-&Ee#Ab-6p{iwy%+W5F(bi5AZZuR-7d0RD zsI>^6sK2;&CZo__%!fVd1@p_bwfDA^F(3A*p!ww@+(y{VN4%j^I48pF)QKc*T!0>j z$1}gExGv&;k>YG5=!n7VI%swUr|4|-?*~A$f`b|fxL$q}^Lto5{xtI&(nfLI#iMlw zY(rRzo3jKI}zBCIk*|sf=$|Dk~Hz1|5PGAt`Cbvyxm-vS&##6RL_s2P%*E z31EMNopT?5i8v$Qu%yIVd7^jVa$*Lg1W)uKIQ7oJ6~%)N_+N#YkZUCqeTos6Cjvje z)u(Ew{}N2JBwME?1Ob_!Y4y|;Wm=J8I&fzYPUOXN%Qypg6Qs{w3XdZ$?ZehfAzsLX zD`7O~zihRapVDyTCw8U;bB3jPt23@-32NzbIwSnNCC9ND+Hnd zR0rUlp?X71uyBsX#=A9kBGNw*DU(rt-r6pBhmi5qyGV%>vaE?;FlFi*Ht1UbZfN{g z**zj(kB{RxsXMuAsX14DgnF49Y6Y#r%uZ<8RGmTbfXi3v@iJ{wxIZ6?=M7i))dMXC zempaI9V@RPk3$YIs}iAt)!wlE&qFxC!J{Uz5DxL`8)QMkDXwD+d8`c{Ow=l2K!Xys zTsq(l>y6}Hyr53DLm(sSYRdwJ_LMuvsn1`$d6&Tb=`?Pa) zGF<}1L&9NuBsg;P3tT89N4s&#K@Pc>kT)2qi=Wi9>#VZN}W2j(7^cB3kgwuU>D~OE*z|>iV z$dng^+<_IsbQW#VOs6bJ1&g~vM29z$v0{*j51nQZmPFFz;7%eerTR9uoJO z6&>uUa7J#G+GRz8-U^HWc#A&F=3{88*UP;Oph@f z(xpPhOIa^Z_J`mZDe2QS?7_ze+_)4h38q;N*_Cha-*TMGn5mI%+NXnT)A1{1uv>^a z94&fX@Oz^wE7iNCv+)c|t%SlEFUZpq{0SGVCKgvaeZQC#Ji=zE5?uR~IP@s-1*$F~S{Db64h=;$Aaa8gT;g8WTcNC>j-EO=?H^W7cTxljbYkM z%!Lw1wpU)>5+Vh(M!t}&4mC(*Kmj$#RM)CoplBuR-H!&acO%@M6>cK|(Jv0)n%@1y z;9DJmL&3Q&4_CbF@zqkSvchHw92tu$Nk*&wLQ;!(uHSBs>s8cLK4iQn{HWyig!WX| zEo@U9eq|MJ@oZ?$K1?D!8^jY;yBV&x&}XK&%Vc<%kS;`t8xknr^@|Uwj@1`>LdxTq zoSqpx-p;=gCmTOeLLQY>9a@u~gZ1ZS%*wwk@kd)y8*DiiiSL~ZF)X80*QQwjUZBT2 zGoc>mn5f3_$LxQLq$>1p&aR=8FY|2R zvn78pOsT)4u$8mCsCvw{kO*^QLtUQpj}5_(QiP*)iA&_6XsPIaQzrQcM zR;I{T`djIw*yN0QP;w#NaxBDG!)JX`Pht2;J&5{vntX}3#aMW^C!`alstYXsYY1E{ z%hR$l^Cn6?3yF%R$M0)=Oe&Hb*_%UO%4A5vOWFQANG}erl|^A2R@{kaoG&uq()G=( zjg}ns)m1s4SW6C%b&Dr>+A-@^Z|x`?p98aRaQgHVaVig6FJ#DVOgA$v zYz=N{j$^aoHft27XZHk60+7_x=%VZ6_fV~ER<>vHjo#6tOZ=Cdt+2y5b@=;HMm2n*u2Kkcz3P>Iay0@E@=OLYC!!Qhtdk33^0jmqV!T#pN{gv80 zL4W-{BucPQRSk7y@8VJP??X7_c*A(Gg*^A6ERH++)k$EDXX{LP?zt1$Iq@6;4FT+~ z60wUhp_)}+p=%Ki6OWlm8nNOz1+PZLUe81^Y2b3~kGzpPVJijGs-N)tH;qgE*A^l8 zYp`X4j4*JJfD&WupaD|)a6JK|*kTO72rNgb0c=!X=y1HFPQk}Sj7`p{ZX_Gu){zHc zX^CpjE7yZ0`Y^@eVmv~&1v(gR;VDFktPVRsLYEpNFiMC@DtJ+R_|(fN!33RuT5ud? z*tbN>g0Eo$bGULz?1{z(@U1wbZpOLG*z$sOs6o9%UB=I}EMIUdCVwEyxPz*-HLCG% z@~KCu(765qp61KbxTp9!izl#i1~k>9jcd91yP4II6~2zSA>Dri6T}*qk0*7%s(VzY z1~T<^9LDn~y`<6ZG%6`KU^8R%hjHQj!d0v-pHujpPv^UeG1P@d!Ba9`nd3FG=!`a& zFC7Wohf34m+33l9sE>ea<0{lK>I3-*!s)C=$nx@(uJU^;9YCfbx+;5;9ABp)iLG|Xj2xK>jFpCYTOd1QXo?!mrFsegT zCfAw}SZzvXjz#!ZK(@O%eE$&9=tLqb$W#;_Bu3^}`yz`v2oCt_E)l*Q2V#g4H5|Cd z;ZZ6gV%3z)JnGy`)cyt|#f|6A$M?y2{E}gh>e3tg10)1;Unxn(i_5i%?VCABw)NrX zJ;V+T_Mh%xGGz$r>eXXq$$T3kb>_kw;@F0g~B zjf>|B%*ffa7jt3SP3gE&zHVZJAYd@#{u7Dd$pir|8w%`XHselZ>+kW)wCqA;7H8Ba zyTwdycwbz{XY$KVD{xfrp4%ySnz-FRLmtdQBrq{3j%*Z4;|q`B(uU%h(FG`KXp3%q z{jq2e7NFWr_}fXX?rp3+b2%|d1ee}TY(`T-wya8nqOK-}=xXVfYdcH#BZQNDfTVpX> zacF^;p37Vohi{TK&tT16vgSYBsS%r!1!vsea~H-jdjD_qbO&Y=MzaDzK?Rl6=q^{w z4y8 zSSw*95{n=+MT5TfIg39KWj~@kWu+gKtl-w~3khZ7&BhwgDOiIMYzpjDkJ65~uR1hl zA8ZZWLmj^GJ1a@oloPmr1?vQgEWD{W{El=z`I!K6Mb4rl+M7>p+JnW)pa!nE%f3Ef z#4ltL#29GkE~X*aJ`t0Ulz;%%19QU?a5ZIql~I=p?$~l2c!EkTVq^+DE!{(h!}j~H zMrx(yNI#U5tKC8^M_N7_InoHW;jcE2^a&;`F&28))_(({Zi^}Et{e1OATHFV{%c!N z_^nm1!-$7NwelnU7JDs)W{SfvZ)v8A_=O(Lf0G=~CZu4UUF1PhcDS8vn$Cyx#~O_ZuS{%>9X7PL$Hhk%x<1}W#TE%Z|;W2bVPCP~F@&2SeJ z1(1UaW@2e2%nZ^4SYw&CA%|J>^QTSb?A}c7>toj~J}EmTFz8(G7y;W<@5N{u4k@&L zGh&Y7aCId)i?1oDpd+|-6@%#L%6SDN5kYIF-*VGBaxquVfRNeI?KZ^%IXnaPfnXBrsizhVh78=(74oj$hg+2&=!FOq3tKUY)*26mrMn zhrHYc(xS}AbkCW;q>V?!OKG*B=|t@J^cZKnT8IAK>A_*s|6oDn&IbJLnr1r-kmIEx z9sJA_JlQ8O0}o73>FR`9_4X}G}cF0j7uS$tA-n6pRbFY#g7Qy>4Fe3huq zp5082^ot5Og0}I9fU%W0<5@rRVBTENW|s#W>WDPa-jlN<(4lfJ7CLAx>+>ZXpEI6v zY*&jNp+3wlJ|Od(ydT|J^*8vHqR4cINJ`uYNhSv_t|ZRAT)eeVXdkx-k^=#-%LmyG zE|5rj!{D4{1B7| zSNwa=h6=vFyP28uL@j>@5rsK>!M}Em--`5qg2U7O3wd)^eT$?41-Z-l$lVCq>f@=Q z?cH~+bQ9Ww4|x4DTHJNS)qp4^XvNn_!`|$zMUfRXZ_)+AQigW*5N%kAUj)Io63o1kSylTNifK~0 ztO3wsSJ8W2K}+REjjR~QBG)^o6GNa+Q!*=@Rr|?SEFxq9=FfRSFJB$gW!c={tM7h3 zt=a5PNMeyup6r#N6^__jwA4~{zdDTWI|E3r_@b6H35eimN!CNv<>C`sGH6hYeREzl zO`C~xdOHmT_vM*i<b4A|nW@vBI@7mt;Jf6}$$q8FhSLBZuV&)rR%^PE*z z@}dLW>ot=Q_Y!ymvxLvpDS(Q03)9$nw%KitZ7;)Y*c-Q(wdF^`N_f|0J)K~)TC8c9$Q>rezf)WO0&|x5(AWzonktghvpBQl{UC>nGx5Xc zaZ>~}#P-n;en?#c%4&)B5IqgYu-+w@M4tmL-YZg%22Z3g;i+zLR^JR5Xnl~VoMC53>M-@}_EF{hl2n_cqcZ(qp>mnH> zWSE@z;(TM)2sYzfzctUOun`y`FhT`%u(#`x+Z;&8VzC;H1;Y4is`{iifQa3GY$4eDm+b~1i! zNmbA2q>3$w38@&Vc%X|sIE_`cG$H4sN^)q~PV@`(I_d=}Al})2I7XVGURv*PwIIO* zOt9X@vfZnHL^c%@&L8GBp31DW@=I)tEgqQQSyJ>zek zn@3}pu`CIpV)p_G>LpB_%Q#J{`p8VW*y#3=o0Z^5a)Lf((udS>xFMTTH-!Jzy z5%HRV>d1+5>U@fb=|&+#GbdR6gVG$Y`kLqNo$8yviK?aDYu$*VFSlo{>n`UQB2yX} zB7)bQubjc~!}b^Tr-^}fY+dQ9>4kM(z7$5Kw`Pl3w$WWT{F53@c63RR*;$5pb;eJM zsYHU_=xK8pO-qR(_ay20{z+ZMm;5$KcPJfEGb#+Ox79!!y~J)>*AXMhBE}SAkShWD zLZ7IkC|V?tfN3^9UT5)QnREvKXzt(r3*mTmiIc(a&!~TEXk`7J#!g`09O^SyQG?Pv zBJlwA)$J#|p}nD*F5`0D!v<9YH$aB0^P?N-j6Z`1?&*pw#A%pOqnzu%Z#!!~LK14F|+8CP|08QDpaOYcNV)b3tSSYmz z%R0)R42yAr9_r@`$(8VEZKyAMF7;h5A>}hXgIDVigZ|58T%VeGI+3T)+%v#;(UrK- zJS$WNYetZOe=OB3kgW*z_(~NMUWImzrL-gC97rAg4hoJMFO$ocBYaUFUA42yOQImx z`vjnO$}}|)UB?o8o=55(?u)F>+{?3kemj|FT-jHqQ6y1bbOrH;bOqAkr_3DJ>m25) zztDpmBUv}|mNNAznlV-?H~tq{D~sQ!8??p-(~+~QD|JoPbvdgp*F7|QA?f1E;0c@4 zB=3Kx!Wbd}DV=QNYO`qd6%>vCF$rp1Rl?}8`EePUG6P*HXTq8Q`pMu&R&^=m1dagP zU#@J~pKyF^j-S5>I7U>ByqYjo)?y&f z<^c+A;74dA0#kWQ2aQAaU|M_vp%T)IYrZ%|@RqUTdN<4%j6V=Ado&Cw(B;GWbaT#+9>Zmw~*`mX;OUoJ!InET*1>-KsKxTAvDPwvRmn> znSRp*o&Jta$Kb0`UBc2vOZl3$)l-w7 z*^0|STqywz+b60gsG{Y}HMpjQvuI-S;X++K#Qc?!cJ_DDegp%N+aQym*B_HZ#K{?I zI!i4T+5#CkE~I3jk<1X!_Yp`mx8)pDC)klnoDHa+}``k_BYE9H0oeem?QH%Fw ztKP&{=lUs`u5{-!b(JUO8qKP$5`@bwmh3r!w&pD5At{1qI;K7{yIS3ut_XI_YZQ$u zA;z$NmAG}C>kqo1T;E zS+$0T2KzEHS;Cz-v~ni-Q#%xrcb#6E7Zi1s*{psj&0=Mc~{WlMb*o@?e zpjgHWK{vrA)TcdBGA(8EM@0@xLW3m8uvH_o5$|NIkGL(WM|W^J@zM5lrj5$n=1%H`JyLD%1}bzmoFNpPC#wg_gzA`QcF|2W<)Fy{TSHze``9GIF?tl12qzd8!OK%DVf#rQ{XXuN zv8&+}^*N)3n9era19_eeUXW1Ul3uPGxyA)Ae=Y;@-_T&U@M`fSI%nq9^g5dB0LTKj zpwb}Rt}DK~-);^ouF8KU;`b9^z?N7lb%Zucp0NE%+Tz}uo8GprbOi?E7L@Te#xauv zeT`fg4RztY%zdV)c_cW2t)OOMD{pvJ9u*ijL5=~R31#F+K_a#!HD|NGwWp>K6S+&z zGiCVI(Jsq}9yr{i9j*H0^el+p%>|7fm=QE$)YqQ+d;((l_-N$xB+sA7d6XerK);{IgH|T)#5s_p&*ABDEt#oI~g2xei zRFV`teVOx7Ibjkk(VZW8a4&Kwmk^8AVxBO65~85%@s6;~y1ih~(OI{072KkfR)Ikz zbtbl@$63@6tUEQB{?6wn$s*C^%ys!9b8G}KP$jo&%@>{sh-H=(Wwx&Irg(x4t?;-w zRgitO*m^Afd~i#v;CH8d*$2GVcq}K0WirBGZzAkT*hTaz+=9uTcPR^3EaB+R_@X%8v?S!**) zf)*mEdcOYu)T#rCGJI!tD`)mF*#k}OO~flK%t=fo*QcO)GrEM$#;~W8>W0aZTqz=| zbRg|=L~V}HKUP^6e!2k)hfqSSmpdWPLc&Q>Xtuk^?=pzl$Z0ujFQTVQ1kI+`#ZoK3wuZLGQ&tHx zPKCeP=|JR^%nT;$XIb46F4cSkq-3mk7r4CsayZS9-A!F;MgymI@J-%a%>;MWGhshU z*w7_;DZ+9N3Dmwg4+rjU^GyeC(I4hT)9Quzz;Vm158qKoQR%=b*EuXV2Z#I&C3%bT zL|%ezK}uCEzp{l&U@q^4(TB@xvPZ~b4Y+O&5BOP5a~bNQHtZIZ?pW@FbBN#LiwpffE8cuEkOL6~Ky4==ylX{bFAeO&on3fK0q5bnSTLl7IcihPs$0m#sWXJTM z5tH5Mk-AR#{>P4-u*5=7_bMFJ$|6o;=v4QvMB>$lriT9}Rj?1C87 z4=5ahwUIdPv?0t9ekL3izG|}HOAR)ECw&FW?fL{R7uPm%@uT!TJV*MznXnicGKX5H z=*9+GJOAyie5hn?`yOxu!%J{zEPET(OD?9@s=VAhGDyw3aEYU` z{#fPl3;p)W7~`yOVTVz0_DgdwHSs=-rXip zmVkc+Q7m&smqz&UdyFbfadC!JhCdKe2Js%yB#&&PQOz_7OO**)<274 zT9z`fSJwUO<*>{$LDAvw{>Hdi$s<>e16KaQz(3h}!H4eq$Glw1F9PA?jKq z$L+D_iAx2&{0SnWzK9?;z3CommnLZ5=$z!CQQ!`DM30BBwIoU$K+O1PpgmU_AJ7uj zJ!*)H9o+KrXa^P!@sWS9H$2P{{WJp31Jrc6EVEoU#1AqYxxX%2j--GWI)%Gc%u8u( zCC^IzObOw6&C4ZD+Tp&$wZW8(Cu`2;NfoDn20MJFS z;g+LxmaI`qokj%CD!F(Kv@7WL?g?t)mnMG5m90;<-G=$z3w&i%3>NeQs7lO|5dZ@A zF|zJ24wH4?qn_ipICM1rwkSNcZ?{W5luAV+*jpvIH?+Aj=L*8s2>N{>UoV2P3^bLj zVs{k%D=;Qi#Rr&)qu6uNF}=*3pCl7smz#i#axS{Th(r#>;;!n zCIyr2@G=-ucm0^!eClU2qa3*9f+&9s_alz_45&d}|2wMDG{v;AoDABNHeVmgeyYGkky|GF(bpP4++z+>o{)Zo9;mwJs?-0v1M&yf1pv3y_J$(xN@ECCNrCV zh_0Wm%N?KTQ5(yt3ONDzSWm&EDql*0NL;>BGQhETpseZMkZni&9ocz#Vn~$q5G@LI zFHaduNrzUqmS;^=htNo9*f`5nZqcAX;2OdO=*I?me3M7X2c}>dFVN&#CiI7)W_gLy z;HJ`#i|MmtiDx`U94R>BC!SHnQ}_2KKV1)i?nzbbM80m_0zVu0q~aqcYPkn z>>s?)H-{Dz)zdHWgRj0ykA~II?jfQV*Ygx@!8KRXt#X12*ZD7uwjhpv* z|8p$szA9HbrT9cX%y`|QP=!w@o{2Xf2O3`H;F3y*aB zO7F<<)_-GT?XmO(IjgMmz5p5K$NUZsPiRg?>=0la?O$l_w8dB@(!;x=uB+ViV~?7t z6P(pPfKwt(WeNPbqhfHY8h&HKUzRyt&*~vJs`aQA1QN3Z66u+3M`S3_2)T>na*_8j}LqeHuc- zd930PFy2>cQ{NWb*iViA@Zp*o3g*gQrbAf%MxMJpEsU2al)UE=A+xR^?Dc$(KEPre zV;KR!;3S8|xE(#JhAwbj$Px=cd|E!oI-t)1)S_0n>KTU&!{?6kFEBhpQ0V z4`UfjI{Z(`LN%&;FU8o&3?0aox@XjVr;$|cknFvl!p=|NRST|yE%6e?G72G{rYF1c zw++w3NTNx(pD`=9SLWp6fXj_Dd$}q@pXeNNQcT{w1-+3-OJW)i`jH(@ujvU$%b{Ac zka9Ix0#%E;1mIJHK9l*c$nocewrG&7xIo($+tdv6AzkgeT~750AK6YZ}~_ zM#pb9{!{?Fac?_qT%E3NkV0haZx(iNCaI?_YPN~t^*cP9p!L)$Ga#sRHGGrGzfpT{ z5dkW+`RvT~>PE!QdLm_7{B3mPMCP-eiSt_jsX9@BPKk`_S93rFkF#3MOV}#RoM_#O zfoU{fZz2gwrbrk>(Q8@{8!xfU$%xl@KuTUMem<6m0HchR+K&-{l_?Y`)tc2sV#*R=4MK7KoP>K zl=+38#79Fb=MTURr+O)$^sc%&T=Yv{Y$h$S1!nHMh`|v&(`FImh&HvgoiHw{pcO&9 zZ{evZQfk%wz*ll}#21pnB|_y0s^kmp$sMZu$N_IIIo6W{V;#v4}uW`e;{^b~W zSp9)$<9Z`=Y=XU0H|QRoj%|{86h21xJ5#DoY>xe1=*M!L(532cp3qeng}~4?WH%O9 zb+?qa#wQn2pu|Q>dh-wsij_rI)&1+A1+bi;r>@7gJGTb|Dg9-{0PzcN%}F(@-$4jH7q@PS zcbBoglXC(!HAw0|O_y43wtkij@jYi5cwguflYcJ?_mL127Yjqt*9yfd-Fr)9zyNNX zAZ7rG@wWWJqf3lLJW7zF!;<@~0Kk4QyJ*OJUnd+TQHGNyC+CTcN>Dg}))AF!_E~bz zWg(c3yP^jnI~uHhN~)^;!;3-#a3}vNKm0%j_fAwF%y*7ZI5!T8`-gJ%Fq`a4p}oHF zfSxk%;m(=r8fr5|8=v_iU3&_*7Kb=*M*4xGK>{kDwS(!$%^xNvkuIq!t`mYQYb|aM zmmb^If-;hO{uStBEM3ltCZ_XoMvI-|SeSed0ZFj~=iYy2FtIOq|1~Bo<+z{3a0VZL zjR{{TC5Z|DKy}G{za{nm#DtpOnY2zYVV%;Lu)ksb>)CehFxxqY8&!d%)LXfGifd$$ z7+AUa3y%AI6t{zZ#=1#=BpTG{vzWXBdYprHv9)&Do0IXAn;?OKbY$!IE-|C)^cf*kdKAs6QrFQ`8|Z;fQ8_<8H`&i`JV z<1qGQ%j(YCK1i%Nb7-c9vxHB)6}zo&ZUfo^84#6DtjOD{^#eHL3gBbhmb;A4Y9%SY zQsDw4L$>6wMbsaV@x!1YqxF-a+%aB+g^~ej;Se3@wKzPjceCdBMJSZ`|5$tT_^67k z;lGn~lZC)-AYi}%4Fm{_7&c9WXqqI@kpOW(3@FQpM$C+g&<#Nlf}LoZHag=rZllaN z&MUJl=nfLd3|M>lp^u2YfPF0<%I(6!7 z6%afxhriDlVJ7L_`=Hti#VidZ%Qf9X_F;h|TeR-W(or3Gk}-WEmM3T@e4W$!a1$G- zs?#6v7!u~M_0w%kd{t$Aisc?C;t(iwiV|^{1Y)tE+$_8$=}x@`=yOJ}`#+BhHr^qU zqE?e>Vf6V{F$_7jXSQ4at)vgE7FrBrRf>Baqz!2%=eO;*51$ge*)=)1vfzZwl%#>0 zKy;P_+`uie#dSs7^_AhT$tABtX{w%AVjS4*Nj=F_S8~Rf+rrlBWAT22ox;abZGoM~ znmTwp3)%iBA}nHIlgLb8pXeK*mb25SKfIwi)GY5{*_()bOM{S~ZbyV?yqKf~r*`OB zVyj??k>3E2vS6nN_}TJ7jYzEAfkwDAPM_+AACE+(=O1g^7cUImQ+ zwz07@rng1@lLg*OYffH33^L++HeCK>al?fDH79#PBX=4_yJ}9(^LB5z;w_1x&?&I1 zW|ymG>ytI7dMifX zD`YBM`Uluwhn-hec?y^3oF=<1bT^0|*|^0{jM2>!?^aOP^iOv81)U1Hg~bz0e@$FY zGd%u+*Q5Z>r%%EJsF9`8m`%c_ki_Lx`yU}!(9x4Z zqLoFfNt}S4G$8s@s$4@ULz#<)=rD?+s?Kxh1xqbB04KjLZkQsxbdRZ(@~Rzpc|EIc z;+2~(PQ3mgftUsctnyku^SOfy6w@?wkl(u zoe3eST|{rz`F{F2uV-pm#SuM7KpgW&Bcf!9XWFzr?eB z|A^pj>j_W(t|cASIsgS7Uy)YjoCPxiy+7i4I?y6Mj)abolU`s~X<(4;Hh zf>S_9I$8~V9-Ty=kOg~$_e`%@k)7cCO-*&O&3k>YC`Vdxh$6x1!vk+en*x)EL)*Oh zO~xI2NmUCmMjTd@>pxLo__ve5Z5l8-(_xm(7sLqcR58cSajKVKZJhdZvJUa>UoafY z6OzK;NfF(K3wa&cD3zmt1%ju3r!|YBGq$FLKajdkk70cj<+HKzV{VvJ;6`5`T)wbh(85pW_D@JjQz zEyzP0V6`rdNM8>1$g7(Ajf|awWGvFS2!$>cBI!XCQ=JwZEfE`L&!r8zLv#5M>1X~~ z4(2Ap2DRaKsDu7g#3#w@;g@E*`C+$&Gu;#Z2#%Yi{ zp{fZ4Xkf{HpaTniu68|bA?_KOOE9&3WS*<(Zy^ChZt?MOF%npjrxs`G8wPz7L1Lac zuL+gId4ED!GY7O-+SW@tr+YnxI{)t@ELLQQnRRSPc!2^t> z1-_m`GrPr8h*QII`t$^L2D{&IIF)8jb>g|vhpAJ@#?fE4;N)PT(;b+YA=1lEYZ%&L z`MZp|-OL8bB{_Ow4??ZtRizX|2PKt`rah>s<`;)p`Qse#@#8(em8AX;7=;l@GjFE9 z>dT*r9!20fx#MvT3MS+$jNdq(WX1Z#j1mezjCV}|%7VF~s_NkmURs=wu2B_tpx^%H za(u5M2Q;lCnxsk|8lOhz@g1bh_cSb7sO~$206w^6e%v>`+bKGgX8r{}M7;`1WcheA z^t55d=$S+1pY#y=Jx~3_mMa_~RvHP=FL!W6vtuxQv%Ms=2~n0XaozmmqQvlJH#?d} z%}mS4SMI%+3~<)It%#!q53q)Q9J5UJ2J$j;y3O)eb8KMqNvZeVOWcox+uJGWY!3 z%OfwUwV;EAu| zoFImY0~37x1nH70>f?rLe7U^@ZTanNbuVV~;aaAlZk%-$R{ctru>Ugn1Ppl##Ikis za;3Y8*wDkI9J|WCD*J3TgQB{WY=`$h6O(UDrL|l!zDUIU*?2V$j}1+TP?>wz0e!|j|`o9$|bT~KJ$b_9r9&Q#(W zqaW_&L8_`yZ{@((qrj@r7!u+TV!=-d`oPQ~^}l>Y$0eGLI!tS$;qm+v**9YZE`(Fh zH1DyN^jnA$Bj`}RQ8KjL73*TjzZ9t}|4Qapbwc`fqM!G?(qQ^_s@%cIWgrVG+aWd*kuRjm=crN|{1`MUe6en1 zYx`z#)_~;X(!Q{mpNj}+@8DC6*7$6^ZJZ>9llTXE8FsZ2P~cV^5E0&aQ?<|G9{^cN z{Im|?2A)^}jS*`}bW&3evkd$L|49PnzR}VwcSvS+X|Rv1$dZ~BgKfTx*r1U|cYw0) zW<2;wqoSG>%(GPJgHv_59=42WD3SZ*_ad4Yd07@P@{7px0{S&6$Wn3#`u^f15|a@? z8NOjTLK$K#{ysJEN^R(QgWI$gnhw11wL5>3i(6y;E#;B#7*2a&m;b6@4_;fO0a6o_dvJ-t zw(0FDQ!gl!*J#({jO*yJ5U9^A#*$0$1N35@oP8>_;pwxwCR?AK}=1(C`l`{(EwaJt?pS) zG$+l-s)E~(NBy1dpfZ7(vaO~-p5@LK&Hy|mRE?h(UcVg!8a#Cp=Z$=%b3F9Ql zLaYr#XhVMQs7kdh$qw{B&TpXiQTe|I@2BlNc>GN;#7#>&TphlL8GVjnmUVeKRPwR! zgfeob7uAeQjnJf!aDxR~fuLi|v)OLxl`x5Wfxg%NsI}vT#6X!)JGxkC5=`#`VqFTQ z!gFzZv&`*7YT5Ld?4SsD{WA%^Q9^NXC>{#zn}MzJi7rqUD7cpA$h{=al0VxJAmS;k{|%CamD#!K z5JXL^umVMyq4&jfA3^cl?m{)aoL7dUHvOu(Xduza4^>?>S513Gu6+@6Qe4`b?b$ZI zrG$f4D#OCUF*;3HE)#I3JQ5egN}(EFObxoA*_(5Sy!Wxs7p z>>~T1L%?5Dvtkfk`OXs@p6y*Kj<@T(hc$s zV-kGub*e46DA%lR(#s~CC)nPnMrty-Pu<%ejj`N6Ax@ow)k5{i6@u06U^S0+NjrB* zAY!%yCmW1Ri7nQ<@t@A{ z4&^qNFUy5DF;subATR%7p*a42&QZ;mE(q^v0bVGPWHPm(zUYgTt&pY@$;%#UD2a|wSaz>A@`y5v%yrD5st)dJN~5oP$CowSf>?4)HV!hX z4(SdR(#nX|2G_#EWaFg1I|TO+?0M5_nM1Q#4MQG|keB&tkM+XNi@%=#On-0J$-(glRTIgR1NMVN zY>m*pZPpZ!9;34^y}D-JcSjrD>ZeWP__y)J&H?ggDg{ z>mgGWTMv0^ob^zsMp+LPYKZkPU%7a|o~;zyYOlfIA6ck6k%U4a5{VN-p`a*4jnL|W z?CDFh5pxB$$yu|yBCw4WJ_k-4Zvu8+!h&!cfxo4Ls-GkHS{grl?o)q5Y($BR$;f%S zQ*i7*zhLFzt31nx>L(qxfQcymV-G)JCfQKApMeb9- zKEVMXmhDS~w$r)fsr8V^_m2!#0e%@>bgBr_wyICSUSuy6I)1eRcOnOlyHS?fazXBX z%?n~*IjJIOYw#e~I{M`9{oI$ph1P$xU$XEHMCTyj-H0vLI7^{Zs_sdMw+S*^XyT8@$)!$ydjT+jz6n3Q@ zZ66KD|6K*c?=Se>0d_=OIOGOU#GaMzmWiHDX|LpoAn0-`(N7#uZX_SJ3}r)<|Ac2H zsR*oOq9`iM`=+9~;G&^&%0 zlO7#VcT5GdkF?@77B;fNjfZV;;(x*B2c<)}&hV!=Hdop8wE>sUrprVNB3z8RLWFuE z#o5e~M6~|*&xK9=*qe%9$J0DVdaD8mzx^ft%jL=}gi|EThAA(l2iqe?bkz#FKD{eisi>#lf52Ywh=eP15h}rTL$1 zl3KXa465wNlA5^i07qDmUJ~qFb@^=W#g!pHp{6x5?h8YYJ40q zuB>R?0Lyr=?5?9$n(F^0Ve*5W+ZMOgsgFbFbV}np=B)569LlDeRsZlO5&PZ3HIrxR zK5Oz+{YgBH;cq(?lHzH&0z2aFV|i>SUtQmY!_nv4EVG-y&u-K8?*Sa_E*9}ccP=rJ zU1D)M@mbKluxEWGF<6cv#n715#VoDe&s8JmsTD}LMY;p^+_dlv6!=T7yT&}&>Fqs% zz#9WX-Kw7UHDW@JhmAxCe!HT0=dh^*J0BIC>qiH zv?PY>na9)l`jRA(KDfIZv1pFv)Ug%tE84T_wSU+wfAB6wkYZ5%#%kOMY*_@PeKE5Sr}Xl?K}%Et!(Tly!spC3;{FjpuP za)WA~b7Iencs?PYNnhw`*l^g&x-*tEpU+Z}e6HYmPwcszXBB()lr?N9m+m$^pQ3;6 z_voL;kn(_oZ#1*JRlDf9r*p?Ow;yqZ@>#>q*gEZF|MVZoFp4@90$E8J)=!d|5ZY zYyq*Q&Z>J$WPaD`q|Jk-;YP48)HNU|_)+aFLs3wxOL391cT-ucsMun&XE@zxLwjNd zGFTcCqye$a$nA0>2iQy|YT2k&pUP*zBPo(~+Ku1_oN)9%o3LzvhQ+;dG5?DT$)dk1 z(J&y@{U*{!PbZbbyFR$LsF!#QY-@`26*D(Zz}T}e(b{ph8|Py_IPsEAk9BYqjYaKRXGF1ad zttL9-uJ!vpFti9e<&+LWglE`$naBvDp;-J8h|@!ZEPdAh(082^k>W%rK70NBlaYhT z1S`tnFONSDe-->Kw9OVhhjU#oSovJ+a%&N-(xXd{N8a{7@;sct1Z+$%br zMDeqcTD$9#5}j&*E@{*~1>Tzd>-nD$uNacj9?Z~Kt>?9t{U%%EBsE^3;@ko!3#=~o zY%Q?y7X=ocTVQ9b!1=8O>V8q6n#QZf2nVI_Q8&KGyx33lrtt{ujTcvVl!phI#qbJg zFg^L!t6}~I{jnktyyg%1*inqzBucI5WpKG+C76%bi2(-q0x6#@m6O&)iJ9zO=4p6I z<`&AIj51jri70BrG0P*2PD}2oHDEh zua)Z+Z@{8sW?91n*>{uO{i`zc^tsm0c=>rigJDCvQl9@B%kx0?-&>!a(NC%u)=*Hb zax4^#T8VYnN|v42HqypAA52;3C^+^AYk}A<))pWaXU~?l5VA<>nUTHJYQb{rXQlgB zs^dxx-lZ8MYmYIy)aphvGGfI^^JE^WUpJqKR<>AKaF>m-Ibcye#WgZPq92+U+T%!` z!L^2F7N}&WAG{)~(xCt|{tH68sUr1<#=h<>Cxk0!2 z7~?|eG)hW{8hZV+XLkoPli1%HfC@wn=`hvx(_ zi{z$SoA1p?y157w5OQrIS8#exaLI80sRaK!HnZn%bxrF?m)W?98f#vXfj~>-U;?c9 z>J0pJyg|!lK!VQ;ui**aFHD9fsF|d)pg)(~WkJm!nY(_kpa8Kq| z)-suQ@+G(=n}}Adym{8jdx11_-V^%!dJXKQMrsSaiJ`fAmnTo~rJa(nI~^`|D^E2m zCP)xa{|Z)pra-InaSL8JRv{Nq&3qt9OLMFdTxjb_~a6 zIg9<*vq5R#2h;*cX*bPa0#%)^AOM&r@S!_!%8e5@{8`Cw-br&eeVgXtkC?2UHBr%l zxQ+X_p%nRWa>Mwm-Pl!?CY*>i`kKv`AWVb;tGe}Q6owY>%8S!Ln;cPkWy*CSl9U}! z%I_Ob!im|+bzoFH>1=8&={8S1$UnL_QhSlq8Kh2;Ob_DLXQM8UB*~YeI_XTlOSpsl=M?j|%9eQ@RD5R+x9C!eRm2JI;FZ$}<5ZP6Tix*+OG=GnCzc_3>bi6| z;owE)4c5YY_vZh&~nsB@?c8lwObtY;q-oT1~u^;k%`Fy6IUW9i&$^6)l4m{kr!U!cg;?mWR{cm9W~dXz0VP&pxxH6L3u zf16;U;d0!#rVi)hpdLlxf!=mX{%P-Pl@t8w)nb+$Ic&)h7R<}_aA8fX znyVw1BbgOnoQ9%=z@%J}b9)-be3}9%^(zf$B24D^J@6$tHg9jF&$u%#&Gj^Wouo!t z-;o+mb$J5mdn8Iss{wQTI$fDX5&_VZ2h~#-Y4)@fW*&cKw5_EuN8%RKXlCv;%onEQ z$YTf!#g~9*j)$-FB;h>|v4HB{g{OL$>aZ3`C~cU?S)YTt2x}ZduC(G0p6j8vL@o(~ zTjk^q5O(i8vE~rYDv{_WMj1f}Q09w!R4zLl*XkY;PS1r=9eKvsyf`PGENl2nw!nt#S9$8rIM1 zANZyP8cXvhx_okDOle@BsK<39joMjYV9Pb&g{}isB`~5W*Noai3pK(kzM~=_GCYEm zxM7x2>*CEa&T1hvUbqXdXf<5!;LW+k4Yw1}H*w{CaIku$E+3YD0%PACxp1H(6^Vgm zPg)n6~}%GZ0$AJei`@33ATht z*3maS!K9MF@d<{RUY#HI-6lq1o%SE$w4;x~oG%ZkSLULBUIFF@$5NSc2h?CvA$Z-Q zlgG4A{vFAfeU~n1uJor*iUx~@M|T$IANJK_Z`X99Z*jlFgsNJV?T+qd?yp=e(aZ?3 z5Q%g*?ztAcL|h!?^mzw&V0Qow3xd-FYWp=1AnsfQ%?f#XEOo@3 z#kq4_7DJA`T8r4X&m|b3YH*5mb*~?jZHaOn z{0NNjgyH||@t-JU_jyEPTy^VQHI=;_19gW47!=AWcVI*=tSX$R-WKU9=4lYZq^gWL zoM%&?I$;@jsPh>!h9VM4tI7~dz?)F~>21T=W>SaN1C3E1&w?bR5J~o`akD)`5CRnH| zcyOe6R6z%u)dbG!fgK|onHD093miloi!};zt$?a~wYnQnM_!V4C&2q_AC*%S{njM+X zWBn2tSr%MET=Qez>1G2N1y5gGrSnb_&M?A70cQh^Yiri>vEK3Z|FRk-`7ZfiQ}7<| zwyJ9?s?ug*2w&f+MZP1{vkdpc%7xm(j*rK- zAeCQ&xrkhtACOy(21(_gEDGl}J7k)_R! z4rEJ++$5PUj@LjD$ENKlC1-+zlvROQf^Ta%F-(I#(}&LG&WzUneX18g64eI^Omah}-* z)E-xB=hv|rI_(>#c90sH9m%|lfG+foRSi4;m%kE}9;6hb_9hrqd7L4TAvcPld58p> z`Z}NeXS;YW7Kh5=RXu2QROJB@HG8bdtnd%j9{^@-bo`O*EM<%ayWm1AqatJl{bbBK zcVSIIw`Um%UusRkBJy_OBJl>oK^^NLHT(9~6wH=X?_0s&WT9b;-IKIcLdvCQ_zssg zEKBiUnz{Hncm6F|zRwBiIXqS&{xs7vx#xGc+Rru>!Mze$q?|lu#-PpNtQ2tm09hGAQj1PRtrtl;w*6|8>r8(jnka75E?WF!B7+j)x`P@eu!g+a;;j zXh(xi3QE#*H3g6IE7y|x3uefZQ44h=B<@VusHrLbCdE**wOuk36u~aehorEr@>Ee% zFi#42rwEntXps-hCo|N=&BYTl3HRkRUeq1}ICY$s(?*6m^#~_;v-=PVhGe-|Du8>g z6{Hf{iY~Hc>~3P-FsllsnuP+r10>5H=>`{?r4Clem~u)fc$$1nk3mnI&@=o1dtC&+ z;QZ3S99wuNZwU6oFUtZ(ze?afyzW1>g)nQ-iOPBlUkd6DXOf zFHUTYT9`qAQo%KWQ9Fa^>M?{X%)mFyU+_+&j6~f%)<|TcVy^0_?HQjZVmbU4>ZC?* zX0XDJmE@MWE?eLYcI*>fF^cDM#W@V~+^%JEW|UZ4a$BqdV9p&jHM^-<|<>+lg~0{9HqpD z`kXP#P?vxbYs`Ky0rx$lw&-ygHQ%!}x+t?q%;{tn$&|Q`AoHjFH>Ar%a@J2eEkUyF z2I-^Yv6xp83`+st`gJyx?BG>Hy{e8XI)1SgJ2-DK4;gM+yZW zdVv)2WZ|>p$tntz6{NV6`V8xBkQ(Scg#XQsQT$H`o74b-SY_|-OE(km)Mw-6^AHaf zIQee#W^r)IfTu}kt(ny)8P-@(qZwpkaF#m#XVbjtxQY9^o9`l9Bdo{smP~6DIgm+q zMl!%m$mUJZIiErtT>abaGWj2!Cxg(U`ZA4$XpeLUC)wTOh=M*CF(>FHuP6@}laH5~ zUCgRhG50&d)pU_IbTQ4rTIObwB!lge!S1a~%PLi)DQ+%nE%|UPTh1@CrAxNI&2`DV zpvkwAO<;6WWy}@xYIZN{Lj@nW!NhC$zc_2&+EG_stkVi5%{13oGRRz=mLh4#&3^$G zpjkT2C29N2p|v_Kg|ym_t2>)Vw8TxFz@9A9Va*q-nKk;xoUS~>Y@4g;0xC{nHO%K?La#G)5na%i zQ9LDuGb#M5z<1oMmF(G6dCTJKmtMaZq)jqJdNtp?*pl~T(pr&n3Vy-`c(s?aT35Wx z$_bABEkD8Tck*9NyIfX5bw~ferM%K{LXz$Vi|Qus!$vMMD`pIVlyA*<u7!hvPYW9Uru`hp<{9-7z3fH;O}3@{BB)&fnQ98Mr2=o-v7$`0Rzsy+ z!*rK$Uxig}uFxWS_B6PP;L=R-W~hA>Ftm8{OBQ_@$lm=q&vKb8cMABrmo_Z5Yl71E zVQU-ML*tMo+q<+avJ9>R3NFdO`^Rp6G*_s<=t0k3E#p`$I}BFD!G(6%7BN$9fJ1;E zG*2@@tU34|Ir*@K50ckj9IVc8*L;%@$uVDT0!J?*-6#&63D2Qw^Nm$H-pFDm5U=8T6K=xIXEO3wV|e&6h?R!9{lSKE!d9%FrLUhC|jM2W`;sDddAM zr^F%(1;6HiD0N=2+OF<~YcfMjQ>*tM#PT%CNRX$uu@TTpjt+N~A@f@erLuB9L(ZCl z30q`*Z$#(K=?+T2@sXHG=MJcQ{00%ZJVf6j0-Gi@^&J=T+xI|b;84iY=$=xiI0qta z0Q2v@aYXyp>5D()P$M(q&CS+~ND(e#H|;bwUU1c4Q^i$hMOSy|GZP8@ z9qwy{Cibl?$$vTflcoVgnwQCz7m90kpp%J_PsF!7`8ItD=0-YDbn&mj@Ja}eh`VIo zG|v*8Vf-xXzYigWg#`GUPa7{z@9GJBuIi_NC+O^pgE*T(Ai41Gn0Fl0-MMKuS_!k$ zeb6?e_ynL<0E%txBAJcdyd1M3h1^SKV1GJTiGkN4y+S|F&O}K8xLYQLG%>thvhd@|303*lhF`Q z;o9u=JjE=ZInb+VKc0-X6rISF(Ry(Qfr+tjIP3Nw?~ePbiisM4o85SG$(vQnI-W>zN=hm2HFE2k4I*Q%WMPSP(N%heILrylRtTEk z6UHQ%EAGN|!{|NYZ)4*#*>6!eu9IXPCa@tR)a<;rHoJx|^|d+!hGl=rUK7jN$ZseU zBn3Y5G~AtC%WDaCxvLbih2m_t^t6#mbo;9uvqkk>Tnx%xk;%H^v+gR$E`AqIZH#5ycOJ&E61o4t;w@M1Q6c07)*$JOpDV-3j>Hvnp1 zrfdJ1A$~bF88}ojd*ssLBOH1~awCWw-X4)$*wh}8iMr>xg2;5`^GFT*n9bpn^j@F( ze`X;|?bEE<%P^RDBG$z$VZ_d-5#iTjxEk8pMA@V6*vws*4TUJQ+SiygTLNh=@&v-+ zdnvXCIi=VfhVRlam>k&bIMFA&z8cxb z>?+o+Y+V`HHCwF=G^q^}nRaLFUfkTQnS|HDV3`VQ>A{#p{G%?g84ql&`C)ZR6Cqtv z-m*2?&(aN_yt+-kweK!q-8;{=VBO< zng7<}DxopYk~z>N;D%j{4P1xWsD3J}!L!p$y%anRmJK62@ysGhU|-hT&aokWxxzZ(KYJ#f%2cF2RXV$8xggXk3P0?b$ zed-n#pqcn4+1C?{7c*vk?p76&EDM>li=OOI$*BKm7aS%|xcDNT6K50n3Ea%)w)u~oFY70!2pvfiJD81RN$4QgpJcJ6 zv9ZC^Hfn7i0;00uIK2da$Np`e)a^Q})=tn;$qGvT(VD= z?ETQRNcKTi_FNrK1N@}WS6ld1{(;Q&#e)#H(VVL+7(^@-EIWfdNAl&P#0-&=bd8T0x+FVBBuk#;Tpa1Dw-UZbQuGsbXqj<$vNby*k0J@B zu_KQOqsRhi$0!a~gfwGQDi*yJ!fv=R%$eCpzBFn@gee=Ar>aZrlGw)HqWO`<^enB@ z8_hxWBEmT9-q?L1xeZDbj7c09;#SifBT~TY4NjZ8MPgphM=VM-ib?jW3?i=}u{m2z zi7f&;{xbCv?c}u*uPNB?TT+lb%IqDvAxrVyR-E8VYQwr&3*FS>6?8J>(p$n_we3jpBAhCLFUOh^>_P^`it7v|M)no{(;mF`{P{{Z+L82?(ZVw&&R+veN`@lA2TRd zd(gvjz28J<5aWI>N^dHz3wwtY2g1kS?zgkJ-@(*onVGWQDg%q1`o3JoRc_}~f21gb zdL^!0*rpBEh}oys!K>&^1Y44A7=XW=T|;5P?yVPFzwf(cg|pPpLjEO#KzCbrapY=! zQdFaP?`o!I zrpnNlX^vahnV?5Z*Q@@(^a#HynQoQ4N zO!5+yHk#=3u;&Nf#ytZJ*#qg>2=hGtT?vtC{@sa^ex@xw*S{+jsW7Ji7I z)2L#85)MNQXXIG53-Ibr);jF}cAg{GdxCgbiEL@0x|wtttM>EG(Qe-LmFCi)k;3Vh zSGmv;eXHKqw4xfShIpvF4M?*ZJcm90lZTBvKc)rPdB#g7 zS?j7S@Pm|lj&ky;hD>s*5X>Jkfnl)s+BCIP-4Wz z0U$KyfVC!zpvD{>c0VoZ;p1uyucok4oDnPrtXY*%Os^TS+j8cK&tMBN^hvY;A5#~} z8V!y%FXwy^G1O_yVl3_6#T+3ZGruBeNoXHJ{m5eyE@=MWk3`KsEtkdrwU()m;=6ed z-&H>W+x1fyH%iHqoBdjK;wh9FqZRj05Hni*x+4%3Kp!W3Z+YCur=?cJoy)tlGBq1@ zLUrP-Z3yyoM74_WhoWG#%rvY+hqsscbc{`Y?jkLq@*1oNJ!>^<6~Q%e8`3bX2JA^| zATWL_rUt}`aQ_GLP)0O;> z)*XWlP3Nv4|D{lz*{tGCm%#~EnUUm8a(G73XoNcb_&ao5oqAIs;ONVLM0CV2B*5sD z;2_Q7y)OuSPIv5UwP&oR3AHsOO2nQlO=9FtnqFEgEp0{$5`HL_bdi-*_pvY8KQQ!E zD$_PNsMWGz?%N2{!;q>z<}0xpmRdE`KLmvhG#VT06J8!*t9x~mu(rf!N$qqSK#BvA z$i-6Qhs-lwqbt~b79UK75szrfx-h=}f)c3^2b+zKGM)mCi})|n({Nu9At!l+G{@EL zxmNQ(XDNzSO`Ae&*3wbRwZ<;AekMwZYqsP3Ent z4>{VC+b#pV;J&a_JF$OO_ZUF(=mPKg2OtWOk*l2z4bZdLj$^#+w9 zD#Iz0G+ixqPNh!5@;r*}Tzvsd*1Sx%Hr}7K%o+I8?^hYbpjTdLy18+fa&^=`tb-^Th-}I$X{|6qx z+o>$AME{>Zfexc?7KuT}a$aOtgVUes%zw+Mo1l{`t>iROfE#rqblObPI2Fvytb2<9 z>c=MbO7WdnNyNM4fijISZLL|wJ+O5NWX4P)OY@clArdAcW2{Wk)fi1hz0{oz|P% zcdiqgnD3?}d>7cIO@5B4JQ_NorT7ASZ?J*#yFyCFl;0BqWf!EBBn>JaHgF`##espN z_>mT;L>=ezD0p#cRk3KCMT+R4huY`H(jZk8q6#Z`^GQ1DLmj>gB zKobQXqku38DBfZkIqw)<)g1!Kc=6`UXIgl06HJRIyR76M>~iEja%rr}LMwTDR;#=ELlyfj2Z3_7G;p9K?RE%~W>rCOYW8 zPcU1N7xEMAp2mOm+AvLK&_SOcwtLC_a>@K!{jx*Ds^&+sl z^+MS{(~Y|nf`)*Y?A0S;GIAW9-u^xszKUhbbHBHEp3JlCs&UzcKy2$scrWG2`hgU4 zS;cOX=Zsh}Ycq~Cljm0g?lfzO=N{xShS;+U|D6y%M3NlUu7h&Kk)E238c7FLuMvWz4$Jy!1RVxJHFszG$dwQgGZ*y|CmQPv zqIDp@<%=c&S_AR}+gn@%QjTa_zG{K_6(!8`?sP6B;TvP?afYhCP%B}6Mb?|h8or(l zR4SQiRicHJ_U!P~Sn_4@~IJB$if)YQN+;L zA7vVKAM@G2jXm=d9t3JNP=%=}XU`W_W3QS-Gw`0s(@LJNX+GDNCnj=XXyg7Q`+mk! za2npr2PVDyb!*ad%B9mX-H}_zrh1f_{p37N}Ajy?Mb(Gn&h2!HlYnaz_@ zh(D5kmVce29OE(zYrpq(6|uO8c9U$NUR|>};L( z17j=I{5m%6uNV9$;OVKKv)mG#?~=ofHs}52q%%3+XrC68Jg)Y$y&sY!YoaHI zX8}(pg})Vy3~=gbYyU0)NwLz4$taVI`F>?=zE88taNd^#xzDM0=dN!58=PG+@oxPZ zI;eYbNVULbSSP;3NRi~})S5>ijJ6Hy3hCZLxtp%_PNgr&sT*w9FX3AS|Cnv;U7#l4wpi+E`3kTF~RZYUN14KV0Ro zX)F?j(e7g{s9Q2=)-NaGZQ%Kr=%Rf87+JNjrYUgiXjn)8Y;|mihMySzT;FT5PkjvP zE!r1;Rg!3;OFcJ$M8vm9A3pXDvC>kZ0@B_uF5ov#&)R5}55NZ3x|YL=I}n^?E-t_k z%8Rk|HINd0S{3Pgv(A>J$udScjczX5ZiR-vSty^nf=tAuvH7ys-mNjhJp%`hKYO<3 zRH8Sn;fgcQo~b#Nw4{{o$|Cx|Qb=n@51Se6)- zZkb@0eOn_^DE0>f^(?KwMHYT+=T=WZfJc5G7V~cWyFw|ipa&f#8v`#<)~Xs9dpRjD znY@^_*p{h@%m#CloW3S0#38}4_dH<90FH7nGkePkY6Kt51)^^F3?}aik@Q^wAE26N3UfwVD}{-u@f?{v3R9K$V9_~ksfRPd^$E21H>HHzTesC$#) z@DH3r_L$$ubbj_@Gp_%#3mj!FE-YPDE?x;TdL z6B*2MDhxPI{+{Ra1&TWkCD*I~icpU=fFM$5N*IX%3K?!rjOWSGd15uq);0CjH94%B z60MrP5$Lb@2QKE<7I}dQC9`l8Bu%<#r;AoArc1sDQDgfHCP`L|+IEyAd|y&~ti&ie zDC`lDN{_2RAHni*^*x-R1U*dM59Leo4ie_ilK=1_;J5$~!t0Urje1Ha^&ts)?M#2c zH;B#<>mOubutH(}e#sLA)BKYxbGaWuL^#bP26l*kWBXtiDm|5dG2y{PZg%fq_+&nR z1=*n`M=jDQLBymH>h4O zdkTd9aCEc?hKKj1=0yxw#?zQ@jzn)wWY_t){dfYsf4G;^-zEy#V!lC&1f*YKeyVz1 z4R&ces>`Ll#VII6s({y!`3CSe=~hj_)AGTau4baYWD4(e2M!ezm+3!5QK6s5xai^` zwTHQ`Em0yrSYoG3IhR5l$9yiKKyOEdkBnFSFS#rs)a`8b=aNd+q_~81)}9<&{Ra?2 zor0l$gr4|MWNOJ%H))kow_TD%E_JUyK1@ec)XHD0aDO3W6Rn*D<73Q^HvT4~crABi z5c&6PA|c+6@Abdxa=%gon4n|RJuu2OXVVBS9rg{RuU7>pXI2**TRu-+JhwmyvG=lq zC_ldPnic0Idh;UeQL9GfD_8k|m$mFbKJyOT$QsWa@HV z3AWQ?wBtsqt8?7Ie{TltH3+5OZD-?c#cKv2k*j{GF>` zFJ3!vuKxa|w^vEt*S?pG7ah|`s6>vKDw!(tcP{>G;o7lfBo@|UR_4w-=6et*1s0U9 zK)G|R!_6C>M9H;{7-e1J%}zGzZephd+K?DD1hkX80?oK%1|JY{yF|pT4Fkm*%qjoy zO2I4|9LC$_DT+z)99fDuFua{3oWndD91DFI9H`Px%<1vcg zR^y5MelC#0wE_X)6@U{+9zrpIGa~%taw$IX{5B+In7113M-8U-_6MZIg@YMZW!rq)ujKF>#NA zOEDU(0Yyv~NInVvYCGG&M?8fefDxCWHOJl;Z^UdVo^FmO0bpgkNo!JQ*NU#^HtA&; zq>}tIzQJZXte@3|EGaz%NsTw#{IFP>bQUNbB(GQ5oo zI^6j?yjiWCo=pwrX2g0{2~(Gd$u_m$z>I!mXcN;uK?e4^!E4TF>eSa?a0Jnn&DR4m zJaQmeJGM%6myq>XQO`sl?j0+7(B9tuf^W$z!r$=&$lB%)b-)clA@hw=CxgNJ7^ZkxG>F^LMN$&gU4hBKgr?I3&l2%w^<6Tyg zv1NbCl63O`I3?e|Nvv7nO!F;~(S4TDErSFw!evJBVcjhbRE^#%{nhCz{Ue=x6KhuBm+KgxBMrRj7z-E7I#o7Q;J zg!t&Ahs$5^QoZ0;kHt>*UUQl@N0ZWB$tg11p>#aVr9#m*x4}z3LN)UShvf3m;U>6= z+}zV*a~uwcMu0mc#Wx{g>1@$Ddb^s>Eu=lOKNg5rheN=?FTvQ@X{9&S zR{N?^(qx48$d)=@c(J1yeD06+$Z_BncBf4rho&Wt5k3uW;ZL+Tyb=hl7MpTFDb@li zxIqp%jZI>%*{?G2o6~qDh?uIfr3iz~wT@0yha*CBQKuvkdZt%m&^IBW1Hn?KCy2pj zp2(oMd4a<(U(zWFgLO@IhD0~ve#J{QS$r7+XI@ITMd|ToCbXz=Jnm0x$jk+M5{r_{ zl#JT%$;L_7e=5mPiRp5;Q9w3U2bXrderUu8kG9`Loe<#10JEuZAI$MfbI8)syf z$;qjh>4cP^2fOGLEh6aNT3C#2KDTtCuW?q^m9!P?*j8}rFA647Fs%MWwOS#19vkoY z6r)!2peK{PBjx;6_d~4xi&{ZTbBF+@DSkhCO0zO(*0jiGX}c$$5BvUoRTs`x1)nm# zg-%|`9zt}6X8vPGe4QX+JM2?yKhi|z6v^asv?bI8g%SbmpWEkfh7*AywH%;Vx}%w} z2pPc8RlV~GdMDA2!~5$hO*J3f9K11 zPM`wUf07gEE*=DMpE%&W&}u=(i{P}ibmwrG*`={0_$EGH+c%A-aYCcsV0mBPKG zdl}NbyI`oLdyj%BF$>HnNhJnwtVta?N}N>nlx&;qdXk5^l`C40h03!Da6jqc?|79a zuE>s|IWP2}G%=%nGdhJQlC9y2BZ8_?lD#aRUB+Jhr9S4}5U*Yw8}?fD-Kk6dASEx9 zl3n8^^VH7v3&SCE;zO3btkbkGValT8yLi+5C%gK(g=KW5@cWd|765rvD=YKH*cktd z46)fcJuIsgeyNOjG5{+}L_ow<9i1S&>Dc~DS~-EFWX03=o18LbAWFPIc)sWcF>h~j zFQl*?9}QXk;0`(YL{)){lEJYpyb7QZyvlUna2rIhA1~HaBjq=OP$TxaJDaFVjJ?dC z$IDUrpn4^9TN-w%tL!eL?k%RAKE#Og<_Vij2o5kDO{&M^dzppHn4T*yCBwz;640_evWpg=o7My+V00A|#7*AD>f z#Y0E{hP&}(UN4{><_F9H=*@V!1_IBQW2z!mNV8?IAs2B7%^t6?Ew%}AW`d+}h;`U5 z4E>Yu#+c;g^?tzqcTX6joQV(%ZRgS=N=;=V={c>C$8@GsSE1wK-{$)GpK zD*(y|PB`k3_hV_JNkihuh8ep3S(kh+)9$mI2D7t@DQQ>95Zw`~qLaw*MCZ6i*K)UZ zcZl0LFg$Fi;G(TZ^UaO>0h)~8LaPdi(m1gKS_E#KkRG$u4(RexIL z@k<=s&gfcTUo^hG_`rc#*$5IgSmMvq9L%`ZjU-PXQXKfItl=-&Cx9j*y*^*UnI_KT zQ1y=Lz`P}{+U92*kg%4}U_Aj2sEZ+P+(}E6FJ;_^v%&FCq{+6PjmC?2XG_4<)SV6W za*L?{WSVhT6Q8yuIA95%+GY5k=S__DkYBiBk_>w`Oo~MBL!tFGG0tULxVd;L@M&4# zNPLWqx=A#ewOq!WNy`@zNF6cWTDwR@Y}ubwpMO|g;7dDQ=K63g8Q`*2{5|(E<}8w z-dcO7)P6<;v_Jeif~`p?c_9(!ZoG3=SPGNvnXTKS|GR|}R3166M-CD~40cdGCSOFl zORr?-AB9Zg2^kr@7zs*Ba898QPE8+vNBSmBAJR8jYk5;_EvM7(W5|#WulZRM4x{9- z*o_rRhdxB~80(Pk&P(4)cf<^@(8}%Yym={mD$J0kSLvIdc|yMlBy|#wODOTZc#!zF zFN_gK^IP@@H3BS~7mGkMo2PbSOuFd_yek%-=zO$6=meM1WrEXxZ7zcOL@lRuH+Qf# zPjHn~woDjQ$hoO%1P=5_NcC|>!abN@X(D@8z0py$96gM?&M;JgCUhS z%khJt^5ONAsq`-xWD7qLD}7cDCZbJhD?Kz``Zk>>svgs&bHi1!GP|rYHIp-3lmos{ zx0l|ss9T*Z`Ovq;Lb;;K1D9m%4ELlY*`49RJaAY9OW~{-w3QaLH9)gbs1;yU3}Edp zP$jT3$QXW|mzv2voZ(M-piGUe#uk2C=Rj0qfkIaUO;!Iu-WJ{%`_#kw)V`k+(qt^o zGit?aF0?+!YVkvyhYM_^82%S%VSQ0fSX8Kj>35j?;EL+o^?Ms}{4}M%MCT%y9=XEf zd7*Vqyl}#!d8SNFc&L8Js0sJuA<%?9zyD;W??wT=%mUrMc~7ODi9VM=1HC=IQlwpb@ouTd`EI^s_V3HRvT|z4&g&1%7#qta2ZFoVG$&3t_i!*Sxz^NohF@?c^7_ zS4d1uBS$D{4yFP|4$;?*F4I{ulbuGFq{xtv*RT$q7a)Z&h@hFpMTL>Bp-*6AWR!cv zlSPXa-5q`bNuR&*XW19;nn4w^4y^7CAqo}=bZTkXQ&kl(oxEOL_r028t`l2DniZVD3{0+1n zE9$}1A9-TuE4O(k$eJgrrNqEvniYN8wzUmIZwz_8=YEJzORERo8YIAAJwM26Qp5bXBd4FrS7XW_M=G<|n=V`EF6baPe~VGSjPn@QrTGb4hZ;)(D@$LH z#eQ>T3;n_BziK(2WTNKLr>fVOc@lh)(EA+Gk6_U+SRg*uaW&x+2?#m2_2!O2U(wxd zn?GkjK|-8StoTMy1HMPCWtUMjJ{JNU=S^n_;6m6^ZXeRDBtA74`kZb(f{~u?&~don zNSEAdKcqv1(kZSa^Ct>`Tj)<0YF{{CxN@bD0*7G5VKmB;Mo772G0}jkwW_9ib5>c&XaFN7$ zNOnJ+hh%qwWz73X>=U-fh}_3+l~0w{S#Xv0sYk5T-{jNl7H$^AKE+DiEuRw8bpt$n zVxAQWD-(+V!vtoIiCf1c$WgNY2A8eMIgjYk@J2VoEs2xl5<5GT-D#^zpCgxTOR#BS zq=MtD=Yr^I!l2oyG+(^DKBr-JXf=I?zPuQeSYK#I&2h z6^A;*XX;On=or$2B@m5s<(0(O^Ph4qo|3Ujo`iQJd(r&-4f#2_ z^EzrtMWny~)PQB_=1~L@YVZyYk)2024l8mJzF-v@0|`~pS$Ku5*)A1cy^W^H$wK;v z2P3+{(txeBr7*=wVrih<8Q8`DOpVjR6r)RFCV$+yQ^r^THjUo^W0Mjk{^E#I6Xi_VsdP;(JT=SlOVwYprP zha}PE%FzNF%nojUC63cX-j!*dON$0Sj5{HbyuUZ<*Gjh9_xaB;9+x;wd;Dk9u?Zo? zf5y3TRxpXtTKubgwQMS^agNP*NpNzydt6y|iZ7SQ(emW-VWB_S?mwC2tr9W!D)ws5 z&7L5=b4Nd9ldYFs2uM0O-;f=igl&;OA7e;dzM*2eJciR*_#U!|c*5z=vm3SjNHXta zfvGoFzz%hl*PUzvYQ#2P<%)1|4@gmuZxCaN?bYqre*cL9%X;Zq!a@6Ch^soamC4fE z?91|sjEv10xR5}C`S?jb-$V@-w5dQdN3g-F4=7^(Z4CRNh>uP-{(`rzE)Be28u+P{ zQyNmi3huiOqGc{hv4(N)-qv9RJB&t-9w6+da%F7tWNhF@kOyO}!9a+?hMtJ9A=*Hr zB)BZg9c?ZNEXyi^g%<;FUk7(hS#}5f5-yWrbTN#ssrrV4`Xu1#J8{JmwSrl4%VKMm zu(-8BGnOk-?|hj_QXX5ecU1p}euC8Rz}m3-HlsEf7$V5ggTFvtI4)w%;aquJaqxQ7 zj^7#gZlKvvRDaW9qy9;r;Z{BkUdd#*D#iC+alS9b_eQ1vc6*{xyMwP{WG9|0@@($d z08W=QvGMq~C%OG!o-P^kRawGUkw;|2iDS)(&u$&@PnR>qlX+!|l)HT0Xref5qJ6lC zL>+L!nhX5_sK11JOW{jp;MP%CqSHnC=+Z{5Og-~KMp7MN6y=jHg4|op`};}G0CLAy z`}t$dnPxIaHu_I?Th`B-ON}x`AU1+b9Ts0XOXOCOXygShvO2y;q=lJ*1ayXaQf1PP z$nW`V6+^~YAH0&mKB)EBjiX2;MNc@4VwiDvg`nKY#Q!18KJhH` z53kO&R!?PMMsi|hi#<8T7AQ-$7YCBJU8!S12QPCs*z^32$>b;dXm`UxqMJ8z`=kGx z)1HKV62h!9a24^l8tug2nsnL|ctfr#yqxAF4fB6>Ixq}Gq+C5mE`@CHbo76I+R|Sv z8xXJA+gkICWTc09Y8ygmR+#P61=>%WB^PRcb;n5 zwUDV4;AOUvknqN<2sz$}DzMm?dZMb3(DM@bq%{AKccS>>rf=E%&wjS5Ggnt7Mbfr> zB+qBB#!GrGLLg5PWNFHRFaHl?X9C_-l|KBWP1>}y+=4|bvIGrU6tzWADpVUtA(a-Z zAfU*iK*fq1B!Z$)Osl=by6ZSI`X9$_a9qYwhox%LQfR>yaoiVh0Zt4E2$r&$@AsaY zviSd=@A;kwnsd)R=iIZr=RNOvSB=VyTa}rquqMpNP%>k+*;N=<#O* z$AUGDgzP5fjLKcDuWJEKsyWaW<4{+2W*5S5Vf0nd7#V!$v$qAt_KnnbnzFOY( zxVPTX7i1L3#p`~B`Ahr-8Hd+QuXap{JIrqrYc+*@%v4&zOOxh2IUJpZUyH;7epNe= z!P$q9Vt?K|ZK(E>WXEI)5eYB|+zaAoKd0d}@OCV?Y6?$p{Cz<<0-*bO(tP|54+Dj{1 z;0o@+BRxc$#1Ebz#Mq*g$t}^(!Oe0cphD0{7+2onzkxmb9Z|X>yL%4iC1S40v66kn zmCy#wR``};HD11z2wo7)akC632}9a+Zj{_mQ%-gEm66TOq6E-Jh>_?k9K=F9A_QOw zi(jS`^MUIUqMcfsIrcoSEDn}+t8AQo(ddXANujt}Ee zZ+K!sw7(W4$#g7Tbr?ZsLhZXjBb;OD@lKReX?|e&j}}URla)n8eH4A_NA<;htf)sX zIV4{U^tm)VXB(cHcLWURBPmp46>>{--Y?mDIzG(%za0{Ga*|$ys?I8=Ng z1#AI(3*q2p(XRbiFIsizFePY_)TAZe^Oy z_BZZ1(F5FZC&fmLCs|*7^O*|Mxn-b9~7pMEvvrQt}Z>(&zhmbxfaM-Jtt? zJGs(dxl>Euqjz$}o)iOyC6v1raAdRuqIIfl}In3(^(e`I2gnZYyvcftFP7Nj?> z<9p+_db8&;t2ZB?&pb(QOlE0PY#_ZkW>(&@W~G(Fs3=++pcDLG_(RA0>7C+yhO&R? z_@VcXbe#UwP~e!^c@RcB+wcbIPjW@i7j}}hqT2JCwW7ngktbKwalmbhzQ7in6k7=2 z>X;5cX?3_at^IMkvX>ILx|-Jo3M%Ya``YT$Y%P^)dS~BcSjmXjq3u=xl7mq{h145> zxah_NvMjxrpsPAF-mN+%j-KbbP&2CiDf3RKPQ{&D;d(A~p*0fT!#k}7cG_^)JPJXI zIo9T2Wgh=Vu!C@Oxa_mPfB!2qZTKWEg5^cO23l$^v;`x6tulMt>yT;Asg+vE(GCuz zPtp0XQ`DlB%okXqSWqh0J{SWW6_H}if@=c}thdWqm=eqt24l$x!xqexQ_pnf(3)`K zhW@%21Y^mj0dbI+x`l&&A01Ncv9M%7$w3!Hs?w@2%48#s3%=AYT@Z;rWx z_=4yhH^UP#B;X(}DSj2N6k=je*RDb4k|eym=I0i^)E5aj1Ua^dEGw1ONe^mlbXC%? z!akK|Wt2sP_ar5Ldq9^M3V|SxFW`Gp=H$}WR8#<_;LIg6;1ta$ypW7@APW-owPbup z;@>cy7I%;L^wkfOLe)8wsvTG2hM|6py(%;&#qwusp?8UgB5m!1PnSppx3#9G5JRc3 ziGYi!LoYqCc4OdzhPfL`YJSg{-?PM6{@D%dGwmN+t}N%TsxMDjNJ(kXs6B(*klglu|HI76(!Zmbutx3YtWDCcVv|~y%oJ)x&#;ty zB$@dNnP@&qR>?~I65|huiFSAid1tLNY?}eP`<)JfF3Mb4BbD4Tv3MsNn<7RCH=vW^ zATaCAc1{z0xIMg6pB!@kn~5qe`YV~@6e@*i&$mqw4j(kgFSO1EmC3mduCOB|I9y;E zes=S|kImKlzN-5;D2EnZI@z08V{eN8=B+;mP&|&LOSU@SQ&nnK>D~}rKK3q!!mYml83;+d}}y`JF^a;{6W?LvN|s;tgM8YhSqWjoyI=$ zHYc2+1MazfMl?9yVde>kw1M>!m~S8ett=NLcE8Y;zJb1FGupi2+w$c3C!>QJKkoGUf^ z1Xisu>0)P&=}4^Hy2pJS^JvL-Ven|DQ-G4;(%KsZj#TW0y@{Ia+v@R#Nt~xm_oPFQ4Q>(o_MGyD!7WTe4xBr}1$X%CHX5}L zLZ}L~Ht<^(7C+Wd7VW`J@k@k&$|wG+oHwW+z)nSetBEjcwk#rSC-0duO+|Bkh9@L6 z)y1?H|3upTGw->MY5e^xq>7NCuX|zCzDg16Ad~QQsdvIC#Vk^G_5heK@&^-|nZlZZ z8^Sz*R6kdFYZxNzwX6N1>28ZtgABDK2cF6#+M^qyRYS*1;0|OV#2uws?c!Se<$vx; zG&V_>WtXbrKj9I()>BIc^c@wgw61$xy#V#du#^m>p&4Wt%jbAzGsjja8l!d@O_YTf zyOU(+R&~x&0ngwjGEvFVwCFGDWGnMs?lT4A)Xssy$UBtClM)yi1Uw_E)2>pl&(n1Y zgLX6H-XxrgO{Ru+e2XE+mW&84$}0#%wrao6ZDaMbEdPVD0A=O|diepAl0;PtU+NM? zslKo<#eUu$@1=jN^)kO=1!9D`2W}i5!GL-hbvDQlWl;Uf?~36W-BJn?Xg_jWn$n{B zY(De{Y+Yvl*YXmJR9}sn&iMu3(g=;9V)f8z>W)^u$prN7At@7%+mlf_FlegN5Jibm zs!{ukUZ`!V{t4k!jV(yj3?=sqSt;%dY|w{z!OfBE0QT$-57*~4kw&41VJBU-oy!=Y z-oqbSi(U6l)k}YLlw0#QBlc-lu``p!h*7mRU5fn%FPpyP$EzdtTEMeYr5#fS^tMwe zs1!sy1@Tb;l3G9wKkUSuax=~~J`zp#;G;M^{`E44k2SMs4M5#5M99$wzpAiI7=EKz z_NIW(n`n!ra}JB;z*+uqYMGfP`5Y0qKu(?a2aF$m4mJ!VRy;Rq7v#>~aKWxB$&wKX zyXuRVjypYJy)*Buhu1vhjik+V+ulK<4Ca-2$GN8b3`Mo$OY^Ieh|hB|Hv^a*v`BEe#>wJfs0ZrcWNUSLOViiuLQ6z^9SF6ZO{$WJN@U)=^y{5sHGn!pJcJgEFY zcXj)>hY~A)YnC~J1?)H96Th#1I3zr}^$AA;<@>XvSA(7Pq!b7Xw}kCSC)6BzfWnc5 zX7?;Vi~wqv^ehtw7^?JUTXmXvY*vSPMPPQ>$+N3-u2MfNWxy-Pj__4@N0*KCqaHNd zsQX0FI3K;mzY3?kDNF9@KF*ItRjpY3mz!J4%y0Z}mHE9BN-wP(?-#$O&rl)RY9CH# zbsw!p9H`ThiEWkoSdbzxI7xGs#dQP11HWMOb%em+K!d38d1fY?z#{7^^*>a>*i*7N z>mTH)@gDY8vd988Ksrtz7x;;DyHOabZvVdBGzDKRVrLor=DV!KBy0^OC!HLcBWF}H z$6+ni1@ahv(^I1x-&NJz}{(&%{O3`v;0 zCGp!E<%rRpd(&fMnv`iu|7!Ka|GSI-dG3#0d^VYr?Bb(5(vpj2n^i_=vz@upy~rX* zdO8KcwZ4wXexR^OQBLNa=BfvJNs$bh5f0Q!iukM|b(zWPHa$0TaGaTZvz5W9-Zx82 zfyMB~3+%xh!Y#C`0fRb{K2dOFzcZ3*P0^lbwU4{gF#8@7=*=vs!W;CM)Bt{=9l?xs z;~>}KeWaGts`U=Fo_7Hi#3O6I%|l=aLdx)hYD#AW7HO1R>GuAh1I{R32S&xtH_Ci2iu}qHDsqg2w{S?uFYLzQ|%AH z3u?FlyZ82_hE(A4vW6QwBFjKua;m&>w>~Qiy)_q~9qeDxaGgD}Q>%t-Qw!#zFIRJC zx_wqKi(dzRJ8SP?LPS#}{_nETES52}7UJm_?Bo6lW2~ZKv;*Q8u_f2haxKFlg-{X$ z-*W!sN8D?Ku?9(s^rW!KdpXSaaq9kTz!Rdme8$-scco)xH<`AuW6GGVf7^=)1oga3t6aEw`L@pG>;Fw?S4Si!<<`6aU ztK}ZQ2c|N28aI(sAz+%s^%rXBr)m@k{c)Ssj@wwV0Lh1h489d{VEh{Vr<+&>|Ddj? z035c`vT%j1s(CHj{xY<)QvwC>|0~Sjg6CG5*Qdn?aCAE$B7@MQrTou6UD#iy7dGxJ z6raSaiIk%PdZAh-TAhkaoes1`8UIf84<<0|JOm>M=VGE0;HplYrv6N>{I)|RuuUD% zX7k+=^?s4V9_Sj@aq{GScls=07TA93o9oz2{a>f0gYi?_oiCDbpg6_!=S94%hq?|y z5bkElCU-wI(oUqB5Ba7=G zL!^$biiUp)Axb3C2Z7A!DB6vw z(LOOJ^1)^LW_BpHHxVm>Fu{|MgOM?ZqxEtFye#+K%>sV{9mWd3BeWhc$_%E7(!w3r zvo3#wJIT+zRpM(KN+aYxrd!|dBett}D-+$s$C|_sw+j$EPh1ZZEJjplMsax_1P47d z^ya_`#5a#e--Q`!iA45H7IZK<_At;PlNRj98U~9CzixN#f%U_T+{&BSJpM?rAis?9 zr}^nbpU;g)nl%OWJ&5aMh8S;AlRrHqC{B%_&#)i)^3yaE8k#bfyK{o{E!ah`&Q$dZsE!DD=acEx z4n6ARBG&FK&?BfT7p&A!TB*sUiiW$;NBq8`Vb)+mo;}tiWDUgQdT2{`bA7p|i#L3i zLoJ63EZ~}>cJ~(yXw+pvA>pRImjx3rDMB*~ggXdpd zBm~n-jTOQ3|tCA9MDT3#l>sa3*deDJWrMB}w0_|9xL|=gDmhJSHzYD&?N-ex!rqnxgPa<|6 zps0QZ5IOO>fVV%EQQ^y;pvE6B+M7`CV_q*ub3ev~b1vReGhJ$a2LO26N(*Ej%EH)5 zu;blKZh?`LX5@@TjmOV_+flS|&Z}T$nbH}2uB_p%O7%C7HKUDsS*8rG2v@khVS8Dq znd`;(roFJqTrCTmawV>3%FHj+pB}YrA)cp#8Z6C(?m}hbV&>Z&&Y`H#U9GQxG6zz( zm4T=(j6$&6CN{3{&db7Axcv=t9c-i5QuYHZ2(k361t){-ajHqv95Vjn5R6rY_SK!# zLHo|F5y~?h0K(Y_7k?W_w?!Ueo(r2q1?|MG`gm90nfnv5MGz69pp)fov*lYrBewgT zb8e`UI1M6z90Hw_Rkty4c3Hzy%iMGUV%IIiW>1!}RY0)#cKOCe_N$Q6U#Zu(2roF< zlRSC?lY$eMm`o^=S{-Y54y}*?u$k87{M6T_yKOXejx=?!IoVXXxxd2PrLLht`QiXN zEnw1*-*#tvIV~7zsO?;?r*LCa{$^I7qOfO1rVaeyVICk&ScrI*VqWQ{ed^?qAy(5 zyyjP^i)uEHYNaB8id(Bi1KXXRF>(m!5Y11&756j}8bxCG+BsBw1NM{>+7IU5*U~A$ zDK1`a4h#eE7%*JPLN7u;J~JQdC>RYW&D5=5)U9S{Cj6E}69I^JF@X3OD#g>zq5%H5 zXKaw|DHm%s^k{GL+ntYJV)f=C>#g+WUZytL8&~Ooz4Ru>0*7FCn#}kj(9@gv2xo3A zXS|OZa3`A$3|$Z-q7Dix0D|?{&c@@YvT$N%^dn9v_0dxtup&=Bc7w~tK5rVN{MYdx z3%|Bj>?_Wq^jkTLvUJp-X+nHQJ2=^zJKJk)AgkL1izeDTb&q^2{;bHB#ENUk>tzDO ziySHdq?I)+s#LG_)g(0Wh@7vmFWYQ4@kS(|J?QRJ5>P4^p5_+mPZx|Wrik)t=%6t_5BG|vF4}>=*lwfU@<#}?bg%hM zq(p>t6t|l{Lpt2QYcJQU%^)Pfe@Lu;#fI(t=3g8oOP8-<1C`W#=q{-*l+4gpINU#K4mlZvd6@aw?JFPU zf*8GkyCK(_4)yh4ICz&5AXfC+0~sCzxn+GH^NVG-1g1teS#;@}+xD_L%hQ&n?Ax$v zH+Rm)UUjWzY)cj@p-=`K#z?7` zLjRUR?{nT-kIz_z&^5j>dJmnYqd#&4|Nji=Ey|UJm+O&Cgx^QiWn@KXb61aSly8;N zc)SN~T@>2pC~R+UaY#%_wHnJ6L5P+EdrR7aPVP`JX=t$nV(IV9HW%@wqtYB3hG!V} zKE^XjR_3^<^;QivW)m9bL>Q)Mh3T`7M`-`KW|h@BHZS z|JO$+ANx@_TGmIu)HWgJ(KjC_c@=W7Hm&@FW*W4~gdIB`Gh&+F)C_i@UAWlb` zD4ZL}X8g`-HV%$5rAhpSjK`%pl;6U)M zF3?i3e*x|&ZE>h986m#6T;{rc8((o=&Ks2_!|Z5&rpaY^_}ZrhEFr@YoH*te<5Rox4#Kv* zeL6caKG^&A2gn%W1HEtm86*(*c;9{;1Q73~Kfh8S!29+N215JLG~TzRZ6wsEqABn5 zxF=(HhNRAGG;Yb6cakP4)ia}hOR!1Z-jO5Stv*C4^0wPN+=@bQs#@O49(GTZm-K^| z-8)}i*ZFd+^-`4K-9p!o?R+ssGe#%L>_<-mE3zqYXM)8{g~=5hXGxXn2V&}6c~!gf zeD4vKi(g#|4vJ2fgF*Wvh)CR>8LSi<>w*=o-gqcsM210kL&vcuLk?e;Zc|e(@KI zES*X4KxjKs#a$YlE_IYQOoSmg4M4*6NW)_Ig4gNs2~6<<%0Ds)l?J3#8fkjRYnU8| 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%0DAVX7WVlsT2&RaH1cclv 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⪼W=FJbYH>K+9 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

    (HtccMT~l|H<=F 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 Result<(u32, String), std::io::Error> { + let output = Command::new("git") + .args(["rev-list", "--count", "HEAD"]) + .output()?; + + let output = output.stdout; + let version_code = String::from_utf8(output).expect("Failed to read git count stdout"); + let version_code: u32 = version_code + .trim() + .parse() + .map_err(|_| std::io::Error::other("Failed to parse git count"))?; + let version_code = 30000 + version_code; + + let version_name = String::from_utf8( + Command::new("git") + .args(["describe", "--tags", "--always"]) + .output()? + .stdout, + ) + .map_err(|_| std::io::Error::other("Failed to read git describe stdout"))?; + let version_name = version_name.trim_start_matches('v').to_string(); + Ok((version_code, version_name)) +} + +fn configure_bindgen() { + // The bindgen::Builder is the main entry point + // to bindgen, and lets you build up options for + // the resulting bindings. + let bindings = bindgen::Builder::default() + // The input header we would like to generate + // bindings for. + .header("src/ksu_uapi.h") + .clang_args(["-x", "c++", "-I../../", "-I/usr/include"]) + // Tell cargo to invalidate the built crate whenever any of the + // included header files changed. + .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) + // Finish the builder and generate the bindings. + .generate() + // Unwrap the Result and panic on failure. + .expect("Unable to generate bindings"); + + // Write the bindings to the $OUT_DIR/bindings.rs file. + let out_path = std::path::PathBuf::from(env::var("OUT_DIR").unwrap()); + // for debug, uncomment below + // let out_path = std::path::PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); + bindings + .write_to_file(out_path.join("bindings.rs")) + .expect("Couldn't write bindings!"); +} + +fn main() { + let (code, name) = match get_git_version() { + Ok((code, name)) => (code, name), + Err(_) => { + // show warning if git is not installed + println!("cargo:warning=Failed to get git version, using 0.0.0"); + (0, "0.0.0".to_string()) + } + }; + let out_dir = env::var("OUT_DIR").expect("Failed to get $OUT_DIR"); + let out_dir = Path::new(&out_dir); + File::create(Path::new(out_dir).join("VERSION_CODE")) + .expect("Failed to create VERSION_CODE") + .write_all(code.to_string().as_bytes()) + .expect("Failed to write VERSION_CODE"); + + File::create(Path::new(out_dir).join("VERSION_NAME")) + .expect("Failed to create VERSION_NAME") + .write_all(name.trim().as_bytes()) + .expect("Failed to write VERSION_NAME"); + + let target_os = env::var("CARGO_CFG_TARGET_OS").expect("CARGO_CFG_TARGET_OS not set"); + if target_os == "android" { + configure_bindgen(); + } +} diff --git a/KernelSU-Next/userspace/ksud/src/apk_sign.rs b/KernelSU-Next/userspace/ksud/src/apk_sign.rs new file mode 100644 index 000000000000..27d5c50e2cb8 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/src/apk_sign.rs @@ -0,0 +1,115 @@ +use anyhow::{Result, ensure}; +use std::io::{Read, Seek, SeekFrom}; + +pub fn get_apk_signature(apk: &str) -> Result<(u32, String)> { + let mut buffer = [0u8; 0x10]; + let mut size4 = [0u8; 4]; + let mut size8 = [0u8; 8]; + let mut size_of_block = [0u8; 8]; + + let mut f = std::fs::File::open(apk)?; + + let mut i = 0; + loop { + let mut n = [0u8; 2]; + f.seek(SeekFrom::End(-i - 2))?; + f.read_exact(&mut n)?; + + let n = u16::from_le_bytes(n); + if i64::from(n) == i { + f.seek(SeekFrom::Current(-22))?; + f.read_exact(&mut size4)?; + + if u32::from_le_bytes(size4) ^ 0xcafe_babe_u32 == 0xccfb_f1ee_u32 { + if i > 0 { + println!("warning: comment length is {i}"); + } + break; + } + } + + ensure!(n != 0xffff, "not a zip file"); + + i += 1; + } + + f.seek(SeekFrom::Current(12))?; + // offset + f.read_exact(&mut size4)?; + f.seek(SeekFrom::Start(u64::from(u32::from_le_bytes(size4)) - 0x18))?; + + f.read_exact(&mut size8)?; + f.read_exact(&mut buffer)?; + + ensure!(&buffer == b"APK Sig Block 42", "Can not found sig block"); + + let pos = u64::from(u32::from_le_bytes(size4)) - (u64::from_le_bytes(size8) + 0x8); + f.seek(SeekFrom::Start(pos))?; + f.read_exact(&mut size_of_block)?; + + ensure!(size_of_block == size8, "not a signed apk"); + + let mut v2_signing: Option<(u32, String)> = None; + let mut v3_signing_exist = false; + let mut v3_1_signing_exist = false; + + loop { + let mut id = [0u8; 4]; + let mut offset = 4u32; + + f.read_exact(&mut size8)?; // sequence length + if size8 == size_of_block { + break; + } + + f.read_exact(&mut id)?; // id + + let id = u32::from_le_bytes(id); + if id == 0x7109_871a_u32 { + v2_signing = Some(calc_cert_sha256(&mut f, &mut size4, &mut offset)?); + } else if id == 0xf053_68c0_u32 { + // v3 signature scheme + v3_signing_exist = true; + } else if id == 0x1b93_ad61_u32 { + // v3.1 signature scheme: credits to vvb2060 + v3_1_signing_exist = true; + } + + f.seek(SeekFrom::Current( + i64::from_le_bytes(size8) - i64::from(offset), + ))?; + } + + if v3_signing_exist || v3_1_signing_exist { + return Err(anyhow::anyhow!("Unexpected v3 signature found!",)); + } + + v2_signing.ok_or_else(|| anyhow::anyhow!("No signature found!")) +} + +fn calc_cert_sha256( + f: &mut std::fs::File, + size4: &mut [u8; 4], + offset: &mut u32, +) -> Result<(u32, String)> { + f.read_exact(size4)?; // signer-sequence length + f.read_exact(size4)?; // signer length + f.read_exact(size4)?; // signed data length + *offset += 0x4 * 3; + + f.read_exact(size4)?; // digests-sequence length + let pos = u32::from_le_bytes(*size4); // skip digests + f.seek(SeekFrom::Current(i64::from(pos)))?; + *offset += 0x4 + pos; + + f.read_exact(size4)?; // certificates length + f.read_exact(size4)?; // certificate length + *offset += 0x4 * 2; + + let cert_len = u32::from_le_bytes(*size4); + let mut cert: Vec = vec![0; cert_len as usize]; + f.read_exact(&mut cert)?; + *offset += cert_len; + + Ok((cert_len, sha256::digest(&cert))) +} diff --git a/KernelSU-Next/userspace/ksud/src/assets.rs b/KernelSU-Next/userspace/ksud/src/assets.rs new file mode 100644 index 000000000000..8218409ce42d --- /dev/null +++ b/KernelSU-Next/userspace/ksud/src/assets.rs @@ -0,0 +1,70 @@ +use anyhow::Result; +use rust_embed::RustEmbed; +use std::path::Path; + +#[cfg(target_os = "android")] +mod android { + use crate::assets::Asset; + use crate::defs::BINARY_DIR; + use crate::utils::ensure_binary; + use const_format::concatcp; + + pub const RESETPROP_PATH: &str = concatcp!(BINARY_DIR, "resetprop"); + pub const BUSYBOX_PATH: &str = concatcp!(BINARY_DIR, "busybox"); + pub const BOOTCTL_PATH: &str = concatcp!(BINARY_DIR, "bootctl"); + + pub fn ensure_binaries(ignore_if_exist: bool) -> anyhow::Result<()> { + for file in Asset::iter() { + if file == "ksuinit" || file.ends_with(".ko") { + // don't extract ksuinit and kernel modules + continue; + } + let asset = + Asset::get(&file).ok_or_else(|| anyhow::anyhow!("asset not found: {file}"))?; + ensure_binary(format!("{BINARY_DIR}{file}"), &asset.data, ignore_if_exist)?; + } + + // Create resetprop -> ksud symlink (resetprop is now built into ksud) + let resetprop_link = RESETPROP_PATH; + let _ = std::fs::remove_file(resetprop_link); + std::os::unix::fs::symlink("/data/adb/ksud", resetprop_link)?; + + Ok(()) + } +} + +#[cfg(target_os = "android")] +pub use android::*; + +#[cfg(all(target_arch = "x86_64", target_os = "android"))] +#[derive(RustEmbed)] +#[folder = "bin/x86_64"] +struct Asset; + +// IF NOT x86_64 ANDROID, ie. macos, linux, windows, always use aarch64 +#[cfg(not(all(target_arch = "x86_64", target_os = "android")))] +#[derive(RustEmbed)] +#[folder = "bin/aarch64"] +struct Asset; + +pub fn get_asset_data(name: &str) -> Result> { + let asset = Asset::get(name).ok_or_else(|| anyhow::anyhow!("asset not found: {name}"))?; + Ok(asset.data) +} + +pub fn copy_assets_to_file(name: &str, dst: impl AsRef) -> Result<()> { + let data = get_asset_data(name)?; + std::fs::write(dst, &*data)?; + Ok(()) +} + +pub fn list_supported_kmi() -> std::vec::Vec { + let mut list = Vec::new(); + for file in Asset::iter() { + // kmi_name = "xxx_kernelsu.ko" + if let Some(kmi) = file.strip_suffix("_kernelsu.ko") { + list.push(kmi.to_string()); + } + } + list +} diff --git a/KernelSU-Next/userspace/ksud/src/boot_patch.rs b/KernelSU-Next/userspace/ksud/src/boot_patch.rs new file mode 100644 index 000000000000..a370ba8f2435 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/src/boot_patch.rs @@ -0,0 +1,925 @@ +#![allow(clippy::ref_option, clippy::needless_pass_by_value)] +#[cfg(unix)] +use std::os::unix::fs::PermissionsExt; +use std::path::Path; +use std::path::PathBuf; +use std::process::Command; +use std::process::Stdio; + +use anyhow::Context; +use anyhow::Result; +use anyhow::bail; +use anyhow::ensure; +use regex_lite::Regex; +use which::which; + +use crate::assets; + +#[cfg(target_os = "android")] +mod android { + use super::{PermissionsExt, Result, do_cpio_cmd}; + pub(super) use crate::defs::{BACKUP_FILENAME, KSU_BACKUP_DIR, KSU_BACKUP_FILE_PREFIX}; + use anyhow::{Context, anyhow, bail, ensure}; + use regex_lite::Regex; + use std::path::{Path, PathBuf}; + use std::process::{Command, Stdio}; + + use crate::utils; + + pub(super) fn ensure_gki_kernel() -> Result<()> { + let version = get_kernel_version()?; + let is_gki = version.0 == 5 && version.1 >= 10 || version.2 > 5; + ensure!(is_gki, "only support GKI kernel"); + Ok(()) + } + + pub fn get_kernel_version() -> Result<(i32, i32, i32)> { + let uname = rustix::system::uname(); + let version = uname.release().to_string_lossy(); + let re = Regex::new(r"(\d+)\.(\d+)\.(\d+)")?; + if let Some(captures) = re.captures(&version) { + let major = captures + .get(1) + .and_then(|m| m.as_str().parse::().ok()) + .ok_or_else(|| anyhow!("Major version parse error"))?; + let minor = captures + .get(2) + .and_then(|m| m.as_str().parse::().ok()) + .ok_or_else(|| anyhow!("Minor version parse error"))?; + let patch = captures + .get(3) + .and_then(|m| m.as_str().parse::().ok()) + .ok_or_else(|| anyhow!("Patch version parse error"))?; + Ok((major, minor, patch)) + } else { + Err(anyhow!("Invalid kernel version string")) + } + } + + fn parse_kmi(version: &str) -> Result { + let re = Regex::new(r"(.* )?(\d+\.\d+)(\S+)?(android\d+)(.*)")?; + let cap = re + .captures(version) + .ok_or_else(|| anyhow::anyhow!("Failed to get KMI from boot/modules"))?; + let android_version = cap.get(4).map_or("", |m| m.as_str()); + let kernel_version = cap.get(2).map_or("", |m| m.as_str()); + Ok(format!("{android_version}-{kernel_version}")) + } + + fn parse_kmi_from_uname() -> Result { + let uname = rustix::system::uname(); + let version = uname.release().to_string_lossy(); + parse_kmi(&version) + } + + fn parse_kmi_from_modules() -> Result { + use std::io::BufRead; + // find a *.ko in /vendor/lib/modules + let modfile = std::fs::read_dir("/vendor/lib/modules")? + .filter_map(Result::ok) + .find(|entry| entry.path().extension().is_some_and(|ext| ext == "ko")) + .map(|entry| entry.path()) + .ok_or_else(|| anyhow!("No kernel module found"))?; + let output = Command::new("modinfo").arg(modfile).output()?; + for line in output.stdout.lines().map_while(Result::ok) { + if line.starts_with("vermagic") { + return parse_kmi(&line); + } + } + bail!("Parse KMI from modules failed") + } + + pub fn get_current_kmi() -> Result { + parse_kmi_from_uname().or_else(|_| parse_kmi_from_modules()) + } + + fn calculate_sha1(file_path: impl AsRef) -> Result { + use sha1::Digest; + use std::io::Read; + let mut file = std::fs::File::open(file_path.as_ref())?; + let mut hasher = sha1::Sha1::new(); + let mut buffer = [0; 1024]; + + loop { + let n = file.read(&mut buffer)?; + if n == 0 { + break; + } + hasher.update(&buffer[..n]); + } + + let result = hasher.finalize(); + Ok(format!("{result:x}")) + } + + pub(super) fn do_backup( + magiskboot: &Path, + workdir: &Path, + cpio_path: &Path, + image: &Path, + ) -> Result<()> { + let sha1 = calculate_sha1(image)?; + let filename = format!("{KSU_BACKUP_FILE_PREFIX}{sha1}"); + + println!("- Backup stock boot image"); + // magiskboot cpio ramdisk.cpio 'add 0755 $BACKUP_FILENAME' + let target = format!("{KSU_BACKUP_DIR}{filename}"); + std::fs::copy(image, &target).with_context(|| format!("backup to {target}"))?; + std::fs::write(workdir.join(BACKUP_FILENAME), sha1.as_bytes()).context("write sha1")?; + do_cpio_cmd( + magiskboot, + workdir, + cpio_path, + &format!("add 0755 {BACKUP_FILENAME} {BACKUP_FILENAME}"), + )?; + println!("- Stock image has been backup to"); + println!("- {target}"); + Ok(()) + } + + pub(super) fn clean_backup(sha1: &str) -> Result<()> { + println!("- Clean up backup"); + let backup_name = format!("{KSU_BACKUP_FILE_PREFIX}{sha1}"); + let dir = std::fs::read_dir(KSU_BACKUP_DIR)?; + for entry in dir.flatten() { + let path = entry.path(); + if !path.is_file() { + continue; + } + if let Some(name) = path.file_name() { + let name = name.to_string_lossy().to_string(); + if name != backup_name + && name.starts_with(KSU_BACKUP_FILE_PREFIX) + && std::fs::remove_file(path).is_ok() + { + println!("- removed {name}"); + } + } + } + Ok(()) + } + + pub(super) fn flash_boot(bootdevice: &Option, new_boot: &PathBuf) -> Result<()> { + let Some(bootdevice) = bootdevice else { + bail!("boot device not found") + }; + let status = Command::new("blockdev") + .arg("--setrw") + .arg(bootdevice) + .status()?; + ensure!(status.success(), "set boot device rw failed"); + dd(new_boot, bootdevice).context("flash boot failed")?; + Ok(()) + } + + pub fn choose_boot_partition( + kmi: &str, + is_replace_kernel: bool, + partition: &Option, + ) -> String { + let slot_suffix = get_slot_suffix(false); + let skip_init_boot = kmi.starts_with("android12-"); + let init_boot_exist = + Path::new(&format!("/dev/block/by-name/init_boot{slot_suffix}")).exists(); + + // if specific partition is specified, use it + if let Some(part) = partition { + return match part.as_str() { + "boot" | "init_boot" | "vendor_boot" => part.clone(), + _ => "boot".to_string(), + }; + } + + // if init_boot exists and not skipping it, use it + if !is_replace_kernel && init_boot_exist && !skip_init_boot { + return "init_boot".to_string(); + } + + "boot".to_string() + } + + pub fn get_slot_suffix(ota: bool) -> String { + let mut slot_suffix = utils::getprop("ro.boot.slot_suffix").unwrap_or_default(); + if !slot_suffix.is_empty() && ota { + if slot_suffix == "_a" { + slot_suffix = "_b".to_string(); + } else { + slot_suffix = "_a".to_string(); + } + } + slot_suffix + } + + #[cfg(target_os = "android")] + pub fn list_available_partitions() -> Vec { + let slot_suffix = get_slot_suffix(false); + let candidates = vec!["boot", "init_boot", "vendor_boot"]; + candidates + .into_iter() + .filter(|name| Path::new(&format!("/dev/block/by-name/{name}{slot_suffix}")).exists()) + .map(ToString::to_string) + .collect() + } + + #[cfg(target_os = "android")] + pub(super) fn post_ota() -> Result<()> { + use crate::assets::BOOTCTL_PATH; + use crate::defs::ADB_DIR; + let status = Command::new(BOOTCTL_PATH).arg("hal-info").status()?; + if !status.success() { + return Ok(()); + } + + let current_slot = Command::new(BOOTCTL_PATH) + .arg("get-current-slot") + .output()? + .stdout; + let current_slot = String::from_utf8(current_slot)?; + let current_slot = current_slot.trim(); + let target_slot = i32::from(current_slot == "0"); + + Command::new(BOOTCTL_PATH) + .arg(format!("set-active-boot-slot {target_slot}")) + .status()?; + + let post_fs_data = Path::new(ADB_DIR).join("post-fs-data.d"); + utils::ensure_dir_exists(&post_fs_data)?; + let post_ota_sh = post_fs_data.join("post_ota.sh"); + + let sh_content = format!( + r" +{BOOTCTL_PATH} mark-boot-successful +rm -f {BOOTCTL_PATH} +rm -f /data/adb/post-fs-data.d/post_ota.sh +" + ); + + std::fs::write(&post_ota_sh, sh_content)?; + #[cfg(unix)] + std::fs::set_permissions(post_ota_sh, std::fs::Permissions::from_mode(0o755))?; + + Ok(()) + } + + pub(super) fn dd, Q: AsRef>(ifile: P, ofile: Q) -> Result<()> { + let status = Command::new("dd") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg(format!("if={}", ifile.as_ref().display())) + .arg(format!("of={}", ofile.as_ref().display())) + .status()?; + ensure!( + status.success(), + "dd if={} of={} failed", + ifile.as_ref().display(), + ofile.as_ref().display() + ); + Ok(()) + } +} + +#[cfg(target_os = "android")] +pub use android::*; + +fn parse_kmi_from_kernel(kernel: &PathBuf, workdir: &Path) -> Result { + use std::fs::{File, copy}; + use std::io::{BufReader, Read}; + let kernel_path = workdir.join("kernel"); + copy(kernel, &kernel_path).context("Failed to copy kernel")?; + + let file = File::open(&kernel_path).context("Failed to open kernel file")?; + let mut reader = BufReader::new(file); + let mut buffer = Vec::new(); + reader + .read_to_end(&mut buffer) + .context("Failed to read kernel file")?; + + let printable_strings: Vec<&str> = buffer + .split(|&b| b == 0) + .filter_map(|slice| std::str::from_utf8(slice).ok()) + .filter(|s| s.chars().all(|c| c.is_ascii_graphic() || c == ' ')) + .collect(); + + let re = + Regex::new(r"(?:.* )?(\d+\.\d+)(?:\S+)?(android\d+)").context("Failed to compile regex")?; + for s in printable_strings { + if let Some(caps) = re.captures(s) + && let (Some(kernel_version), Some(android_version)) = (caps.get(1), caps.get(2)) + { + let kmi = format!("{}-{}", android_version.as_str(), kernel_version.as_str()); + return Ok(kmi); + } + } + println!("- Failed to get KMI version"); + bail!("Try to choose LKM manually") +} + +fn parse_kmi_from_boot(magiskboot: &Path, image: &PathBuf, workdir: &Path) -> Result { + let image_path = workdir.join("image"); + + std::fs::copy(image, &image_path).context("Failed to copy image")?; + + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("unpack") + .arg(&image_path) + .status() + .context("Failed to execute magiskboot command")?; + + if !status.success() { + bail!("magiskboot unpack failed with status: {status:?}"); + } + + parse_kmi_from_kernel(&image_path, workdir) +} + +fn do_cpio_cmd(magiskboot: &Path, workdir: &Path, cpio_path: &Path, cmd: &str) -> Result<()> { + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(cpio_path) + .arg(cmd) + .status()?; + ensure!(status.success(), "magiskboot cpio {cmd} failed"); + Ok(()) +} + +fn is_magisk_patched(magiskboot: &Path, workdir: &Path, cpio_path: &Path) -> Result { + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(cpio_path) + .arg("test") + .status()?; + // 0: stock, 1: magisk + Ok(status.code() == Some(1)) +} + +fn is_kernelsu_patched(magiskboot: &Path, workdir: &Path, cpio_path: &Path) -> Result { + let status = Command::new(magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("cpio") + .arg(cpio_path) + .arg("exists kernelsu.ko") + .status()?; + + Ok(status.success()) +} + +fn find_magiskboot(magiskboot_path: Option, workdir: &Path) -> Result { + let magiskboot = { + if which("magiskboot").is_ok() { + #[cfg(target_os = "android")] + let _ = assets::ensure_binaries(true); + "magiskboot".into() + } else { + // magiskboot is not in $PATH, use builtin or specified one + let magiskboot = if let Some(magiskboot_path) = magiskboot_path { + std::fs::canonicalize(magiskboot_path)? + } else { + let magiskboot_path = workdir.join("magiskboot"); + assets::copy_assets_to_file("magiskboot", &magiskboot_path) + .context("copy magiskboot failed")?; + magiskboot_path + }; + ensure!(magiskboot.exists(), "{} is not exist", magiskboot.display()); + #[cfg(unix)] + let _ = std::fs::set_permissions(&magiskboot, std::fs::Permissions::from_mode(0o755)); + magiskboot + } + }; + Ok(magiskboot) +} + +fn find_boot_image( + image: &Option, + kmi: &str, + ota: bool, + is_replace_kernel: bool, + workdir: &Path, + partition: &Option, +) -> Result<(PathBuf, Option)> { + let bootimage; + let mut bootdevice = None; + if let Some(ref image) = *image { + ensure!(image.exists(), "boot image not found"); + bootimage = std::fs::canonicalize(image)?; + } else { + #[cfg(not(target_os = "android"))] + { + println!("- Current OS is not android, refusing auto bootimage/bootdevice detection"); + bail!("Please specify a boot image"); + } + + #[cfg(target_os = "android")] + { + let slot_suffix = get_slot_suffix(ota); + let boot_partition_name = choose_boot_partition(kmi, is_replace_kernel, partition); + let boot_partition = format!("/dev/block/by-name/{boot_partition_name}{slot_suffix}"); + + println!("- Bootdevice: {boot_partition}"); + let tmp_boot_path = workdir.join("boot.img"); + + dd(&boot_partition, &tmp_boot_path)?; + + ensure!(tmp_boot_path.exists(), "boot image not found"); + + bootimage = tmp_boot_path; + bootdevice = Some(boot_partition); + } + } + Ok((bootimage, bootdevice)) +} + +#[derive(clap::Args, Debug)] +pub struct BootPatchArgs { + /// boot image path, if not specified, will try to find the boot image automatically + #[arg(short, long)] + pub boot: Option, + + /// kernel image path to replace + #[arg(short, long)] + pub kernel: Option, + + /// LKM module path to replace, if not specified, will use the builtin one + #[arg(short, long)] + pub module: Option, + + /// init to be replaced + #[arg(short, long, requires("module"))] + pub init: Option, + + /// will use another slot when boot image is not specified + #[cfg(target_os = "android")] + #[arg(short = 'u', long, default_value = "false")] + pub ota: bool, + + /// Flash it to boot partition after patch + #[cfg(target_os = "android")] + #[arg(short, long, default_value = "false")] + pub flash: bool, + + /// Output path. If not specified, will use current directory. + /// If specified, the boot image will be written to the directory + /// even if --flash is specified. + #[cfg(target_os = "android")] + #[arg(short, long, default_value = None)] + pub out: Option, + + /// Output path. If not specified, will use current directory. + #[cfg(not(target_os = "android"))] + #[arg(short, long, default_value = None)] + pub out: Option, + + /// magiskboot path, if not specified, will search from $PATH + #[arg(long, default_value = None)] + pub magiskboot: Option, + + /// KMI version, if specified, will use the specified KMI + #[arg(long, default_value = None)] + pub kmi: Option, + + /// target partition override (init_boot | boot | vendor_boot) + #[cfg(target_os = "android")] + #[arg(long, default_value = None)] + pub partition: Option, + + /// File name of the output. If specified, the boot image will be + /// written to the output directory even if --flash is specified. + #[cfg(target_os = "android")] + #[arg(long, default_value = None)] + pub out_name: Option, + + /// File name of the output. + #[cfg(not(target_os = "android"))] + #[arg(long, default_value = None)] + pub out_name: Option, + + /// Extra cmdline to append to boot image header + #[arg(long, default_value = None)] + pub cmdline: Option, +} + +pub fn patch(args: BootPatchArgs) -> Result<()> { + let inner = move || { + let BootPatchArgs { + boot: image, + init, + kernel, + module: kmod, + out, + magiskboot: magiskboot_path, + kmi, + out_name, + cmdline, + #[cfg(target_os = "android")] + ota, + #[cfg(target_os = "android")] + flash, + #[cfg(target_os = "android")] + partition, + } = args; + + let patch_file = image.is_some(); + + #[cfg(target_os = "android")] + if !patch_file { + ensure_gki_kernel()?; + } + + let is_replace_kernel = kernel.is_some(); + + if is_replace_kernel { + ensure!( + init.is_none() && kmod.is_none(), + "init and module must not be specified." + ); + } + + let tmpdir = tempfile::Builder::new() + .prefix("KernelSU") + .tempdir() + .context("create temp dir failed")?; + let workdir = tmpdir.path(); + + // extract magiskboot + let magiskboot = find_magiskboot(magiskboot_path, workdir)?; + + let kmi = kmi.map_or_else( + || -> Result<_> { + #[cfg(target_os = "android")] + match get_current_kmi() { + Ok(value) => { + return Ok(value); + } + Err(e) => { + println!("- {e}"); + } + } + Ok(if let Some(image_path) = &image { + println!( + "- Trying to auto detect KMI version for {}", + image_path.display() + ); + parse_kmi_from_boot(&magiskboot, image_path, tmpdir.path())? + } else if let Some(kernel_path) = &kernel { + println!( + "- Trying to auto detect KMI version for {}", + kernel_path.display() + ); + parse_kmi_from_kernel(kernel_path, tmpdir.path())? + } else { + String::new() + }) + }, + Ok, + )?; + + #[cfg(target_os = "android")] + let (bootimage, bootdevice) = + find_boot_image(&image, &kmi, ota, is_replace_kernel, workdir, &partition)?; + + #[cfg(not(target_os = "android"))] + let (bootimage, _) = + find_boot_image(&image, &kmi, false, is_replace_kernel, workdir, &None)?; + + let bootimage = bootimage.as_path(); + + // try extract magiskboot/bootctl + #[cfg(target_os = "android")] + let _ = assets::ensure_binaries(false); + + if let Some(kernel) = kernel { + std::fs::copy(kernel, workdir.join("kernel")).context("copy kernel from failed")?; + } + + println!("- Preparing assets"); + + let kmod_file = workdir.join("kernelsu.ko"); + if let Some(kmod) = kmod { + std::fs::copy(kmod, kmod_file).context("copy kernel module failed")?; + } else { + // If kmod is not specified, extract from assets + println!("- KMI: {kmi}"); + let name = format!("{kmi}_kernelsu.ko"); + assets::copy_assets_to_file(&name, kmod_file) + .with_context(|| format!("Failed to copy {name}"))?; + } + + let init_file = workdir.join("init"); + if let Some(init) = init { + std::fs::copy(init, init_file).context("copy init failed")?; + } else { + assets::copy_assets_to_file("ksuinit", init_file).context("copy ksuinit failed")?; + } + + println!("- Unpacking boot image"); + let status = Command::new(&magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("unpack") + .arg(bootimage) + .status()?; + ensure!(status.success(), "magiskboot unpack failed"); + + if let Some(ref cmdline_value) = cmdline { + let header_path = workdir.join("header"); + std::fs::write(&header_path, format!("cmdline={cmdline_value}\n")) + .context("write header file failed")?; + println!("- Set cmdline to: {cmdline_value}"); + } + + let mut ramdisk = workdir.join("ramdisk.cpio"); + if !ramdisk.exists() { + ramdisk = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + } + if !ramdisk.exists() { + ramdisk = workdir.join("vendor_ramdisk").join("ramdisk.cpio"); + } + if !ramdisk.exists() { + println!("- No ramdisk, create by default"); + ramdisk = "ramdisk.cpio".into(); + } + let ramdisk = ramdisk.as_path(); + let is_magisk_patched = is_magisk_patched(&magiskboot, workdir, ramdisk)?; + ensure!(!is_magisk_patched, "Cannot work with Magisk patched image"); + + println!("- Adding KernelSU LKM"); + let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir, ramdisk)?; + + if !is_kernelsu_patched { + // kernelsu.ko is not exist, backup init if necessary + let status = do_cpio_cmd(&magiskboot, workdir, ramdisk, "exists init"); + if status.is_ok() { + do_cpio_cmd(&magiskboot, workdir, ramdisk, "mv init init.real")?; + } + } + + do_cpio_cmd(&magiskboot, workdir, ramdisk, "add 0755 init init")?; + do_cpio_cmd( + &magiskboot, + workdir, + ramdisk, + "add 0755 kernelsu.ko kernelsu.ko", + )?; + + #[cfg(target_os = "android")] + if !is_kernelsu_patched + && flash + && let Err(e) = do_backup(&magiskboot, workdir, ramdisk, bootimage) + { + println!("- Backup stock image failed: {e}"); + } + + println!("- Repacking boot image"); + // magiskboot repack boot.img + let status = Command::new(&magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("repack") + .arg(bootimage) + .status()?; + ensure!(status.success(), "magiskboot repack failed"); + let new_boot = workdir.join("new-boot.img"); + + // flash first, since the new_boot may be moved + #[cfg(target_os = "android")] + if flash { + println!("- Flashing new boot image"); + flash_boot(&bootdevice, &new_boot)?; + + if ota { + post_ota()?; + } + } + + #[cfg(target_os = "android")] + let should_write_output = patch_file || !flash || out_name.is_some() || out.is_some(); + #[cfg(not(target_os = "android"))] + let should_write_output = patch_file; + + if should_write_output { + // write patched image to output file when output is requested + let output_dir = out.unwrap_or(std::env::current_dir()?); + let name = out_name.unwrap_or_else(|| { + let now = chrono::Utc::now(); + format!("kernelsu_next_patched_{}.img", now.format("%Y%m%d_%H%M%S")) + }); + let output_image = output_dir.join(name); + if std::fs::rename(&new_boot, &output_image).is_err() { + std::fs::copy(&new_boot, &output_image).context("copy out new boot failed")?; + } + println!("- Output file is written to"); + println!("- {}", output_image.display().to_string().trim_matches('"')); + } + + println!("- Done!"); + Ok(()) + }; + + let result = inner(); + if let Err(ref e) = result { + println!("- Patch Error: {e}"); + } + result +} + +#[derive(clap::Args, Debug)] +pub struct BootRestoreArgs { + /// boot image path, if not specified, will try to find the boot image automatically + #[arg(short, long)] + pub boot: Option, + + /// Flash it to boot partition after restore + #[cfg(target_os = "android")] + #[arg(short, long, default_value = "false")] + pub flash: bool, + + /// magiskboot path, if not specified, will search from $PATH + #[arg(long, default_value = None)] + pub magiskboot: Option, + + /// Output path. If not specified, will use current directory. + /// If specified, the boot image will be written to the directory + /// even if --flash is specified. + #[cfg(target_os = "android")] + #[arg(short, long, default_value = None)] + pub out: Option, + + /// Output path. If not specified, will use current directory. + #[cfg(not(target_os = "android"))] + #[arg(short, long, default_value = None)] + pub out: Option, + + /// File name of the output. If specified, the boot image will be + /// written to the output directory even if --flash is specified. + #[cfg(target_os = "android")] + #[arg(long, default_value = None)] + pub out_name: Option, + + /// File name of the output. + #[cfg(not(target_os = "android"))] + #[arg(long, default_value = None)] + pub out_name: Option, +} + +pub fn restore(args: BootRestoreArgs) -> Result<()> { + let BootRestoreArgs { + boot: image, + magiskboot: magiskboot_path, + out_name, + out, + #[cfg(target_os = "android")] + flash, + } = args; + + let tmpdir = tempfile::Builder::new() + .prefix("KernelSU") + .tempdir() + .context("create temp dir failed")?; + let workdir = tmpdir.path(); + let magiskboot = find_magiskboot(magiskboot_path, workdir)?; + + #[cfg(target_os = "android")] + let kmi = get_current_kmi().unwrap_or_default(); + + #[cfg(target_os = "android")] + let (bootimage, bootdevice) = find_boot_image(&image, &kmi, false, false, workdir, &None)?; + #[cfg(not(target_os = "android"))] + let (bootimage, _) = find_boot_image(&image, "", false, false, workdir, &None)?; + + println!("- Unpacking boot image"); + let status = Command::new(&magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("unpack") + .arg(bootimage.display().to_string()) + .status()?; + ensure!(status.success(), "magiskboot unpack failed"); + + let mut ramdisk = workdir.join("ramdisk.cpio"); + if !ramdisk.exists() { + ramdisk = workdir.join("vendor_ramdisk").join("init_boot.cpio"); + } + if !ramdisk.exists() { + ramdisk = workdir.join("vendor_ramdisk").join("ramdisk.cpio"); + } + if !ramdisk.exists() { + bail!("No compatible ramdisk found.") + } + let ramdisk = ramdisk.as_path(); + let is_kernelsu_patched = is_kernelsu_patched(&magiskboot, workdir, ramdisk)?; + ensure!(is_kernelsu_patched, "boot image is not patched by KernelSU"); + + #[cfg(target_os = "android")] + let mut new_boot = None; + #[cfg(target_os = "android")] + let mut from_backup = false; + #[cfg(not(target_os = "android"))] + let from_backup = false; + + #[cfg(target_os = "android")] + if do_cpio_cmd( + &magiskboot, + workdir, + ramdisk, + &format!("exists {BACKUP_FILENAME}"), + ) + .is_ok() + { + do_cpio_cmd( + &magiskboot, + workdir, + ramdisk, + &format!("extract {BACKUP_FILENAME} {BACKUP_FILENAME}"), + )?; + let sha = std::fs::read(workdir.join(BACKUP_FILENAME))?; + let sha = String::from_utf8(sha)?; + let sha = sha.trim(); + let backup_path = + PathBuf::from(KSU_BACKUP_DIR).join(format!("{KSU_BACKUP_FILE_PREFIX}{sha}")); + if backup_path.is_file() { + new_boot = Some(backup_path); + from_backup = true; + } else { + println!("- Warning: no backup {} found!", backup_path.display()); + } + + if let Err(e) = clean_backup(sha) { + println!("- Warning: Cleanup backup image failed: {e}"); + } + } else { + println!("- Backup info is absent!"); + } + + let remove_ksu = || -> Result<_> { + // remove kernelsu.ko + do_cpio_cmd(&magiskboot, workdir, ramdisk, "rm kernelsu.ko")?; + + // if init.real exists, restore it + let status = do_cpio_cmd(&magiskboot, workdir, ramdisk, "exists init.real").is_ok(); + if status { + do_cpio_cmd(&magiskboot, workdir, ramdisk, "mv init.real init")?; + } + + println!("- Repacking boot image"); + let status = Command::new(&magiskboot) + .current_dir(workdir) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .arg("repack") + .arg(&bootimage) + .status()?; + ensure!(status.success(), "magiskboot repack failed"); + Ok(workdir.join("new-boot.img")) + }; + #[cfg(target_os = "android")] + let new_boot = new_boot.map_or_else(remove_ksu, Ok)?; + #[cfg(not(target_os = "android"))] + let new_boot = remove_ksu()?; + + // flash first, since the new_boot may be moved + #[cfg(target_os = "android")] + if flash { + if from_backup { + println!("- Flashing new boot image from {}", new_boot.display()); + } else { + println!("- Flashing new boot image"); + } + flash_boot(&bootdevice, &new_boot)?; + } + + #[cfg(target_os = "android")] + let should_write_output = image.is_some() || !flash || out_name.is_some() || out.is_some(); + #[cfg(not(target_os = "android"))] + let should_write_output = image.is_some(); + + if should_write_output { + // write restored image to output file when output is requested + let output_dir = out.unwrap_or(std::env::current_dir()?); + let name = out_name.unwrap_or_else(|| { + let now = chrono::Utc::now(); + format!("kernelsu_next_restore_{}.img", now.format("%Y%m%d_%H%M%S")) + }); + let output_image = output_dir.join(name); + + if from_backup || std::fs::rename(&new_boot, &output_image).is_err() { + std::fs::copy(&new_boot, &output_image).context("copy out new boot failed")?; + } + println!("- Output file is written to"); + println!("- {}", output_image.display().to_string().trim_matches('"')); + } + println!("- Done!"); + Ok(()) +} diff --git a/KernelSU-Next/userspace/ksud/src/cli.rs b/KernelSU-Next/userspace/ksud/src/cli.rs new file mode 100644 index 000000000000..36e313e5adb3 --- /dev/null +++ b/KernelSU-Next/userspace/ksud/src/cli.rs @@ -0,0 +1,725 @@ +use anyhow::{Context, Ok, Result}; +use clap::Parser; +use std::path::PathBuf; + +use android_logger::Config; +use log::{LevelFilter, info}; + +use crate::boot_patch::{BootPatchArgs, BootRestoreArgs}; +use crate::{apk_sign, assets, debug, defs, init_event, ksucalls, module, module_config, susfsd, utils}; + +/// KernelSU Next userspace cli +#[derive(Parser, Debug)] +#[command(author, version = defs::VERSION_NAME, about, long_about = None)] +struct Args { + #[command(subcommand)] + command: Commands, +} + +#[derive(clap::Subcommand, Debug)] +enum Commands { + /// Manage KernelSU Next modules + Module { + #[command(subcommand)] + command: Module, + }, + + /// Trigger `post-fs-data` event + PostFsData, + + /// Trigger `service` event + Services, + + /// Trigger `boot-complete` event + BootCompleted, + + /// Load kernelsu.ko and execute late-load stage scripts + LateLoad, + + /// Install KernelSU Next userspace component to system + Install { + #[arg(long, default_value = None)] + magiskboot: Option, + }, + + /// Unload KernelSU Next kernel module (LKM Only) + Unload, + + /// Uninstall KernelSU Next modules and itself(LKM Only) + Uninstall { + /// magiskboot path, if not specified, will search from $PATH + #[arg(long, default_value = None)] + magiskboot: Option, + }, + + /// SELinux policy Patch tool + Sepolicy { + #[command(subcommand)] + command: Sepolicy, + }, + + /// Manage App Profiles + Profile { + #[command(subcommand)] + command: Profile, + }, + + /// Manage kernel features + Feature { + #[command(subcommand)] + command: Feature, + }, + + /// Patch boot or init_boot images to apply KernelSU Next + BootPatch(BootPatchArgs), + + /// Restore boot or init_boot images patched by KernelSU + BootRestore(BootRestoreArgs), + + /// Show boot information + BootInfo { + #[command(subcommand)] + command: BootInfo, + }, + /// For developers + Debug { + #[command(subcommand)] + command: Debug, + }, + /// Kernel interface + Kernel { + #[command(subcommand)] + command: Kernel, + }, + + /// Resetprop - Magisk-compatible system property tool + #[command(disable_help_flag = true)] + Resetprop { + /// Arguments passed to resetprop + #[arg(trailing_var_arg = true, allow_hyphen_values = true, num_args = 0..)] + args: Vec, + }, + + /// Emulate soft reboot (ksud; zygote) + #[command(name = "soft-reboot")] + SoftReboot, + + /// Susfs management + Susfs { + #[command(subcommand)] + command: SusfsAction, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum BootInfo { + /// show current kmi version + CurrentKmi, + + /// show supported kmi versions + SupportedKmis, + + /// check if device is A/B capable + IsAbDevice, + + /// show auto-selected boot partition name + DefaultPartition, + + /// list available partitions for current or OTA toggled slot + AvailablePartitions, + + /// show slot suffix for current or OTA toggled slot + SlotSuffix { + /// toggle to another slot + #[arg(short = 'u', long, default_value = "false")] + ota: bool, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum Debug { + /// Set the manager app, kernel CONFIG_KSU_DEBUG should be enabled. + SetManager { + /// manager package name + #[arg(default_value_t = String::from("com.rifsxd.ksunext"))] + apk: String, + }, + + /// Get apk size and hash + GetSign { + /// apk path + apk: String, + }, + + /// Root Shell + Su { + /// switch to gloabl mount namespace + #[arg(short, long, default_value = "false")] + global_mnt: bool, + }, + + /// Get kernel version + Version, + + /// For testing + Test, + + /// Extract an embedded binary to a specified path + ExtractBinary { + /// binary name (e.g. busybox, resetprop, bootctl) + name: String, + /// destination file path + path: PathBuf, + }, + + /// Load a kernel module from disk + Insmod { + /// kernel module path + module: PathBuf, + }, + + /// Process mark management + Mark { + #[command(subcommand)] + command: MarkCommand, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum MarkCommand { + /// Get mark status for a process (or all) + Get { + /// target pid (0 for total count) + #[arg(default_value = "0")] + pid: i32, + }, + + /// Mark a process + Mark { + /// target pid (0 for all processes) + #[arg(default_value = "0")] + pid: i32, + }, + + /// Unmark a process + Unmark { + /// target pid (0 for all processes) + #[arg(default_value = "0")] + pid: i32, + }, + + /// Refresh mark for all running processes + Refresh, +} + +#[derive(clap::Subcommand, Debug)] +enum Sepolicy { + /// Patch sepolicy + Patch { + /// sepolicy statements + sepolicy: String, + }, + + /// Apply sepolicy from file + Apply { + /// sepolicy file path + file: String, + }, + + /// Check if sepolicy statement is supported/valid + Check { + /// sepolicy statements + sepolicy: String, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum Module { + /// Install module + Install { + /// module zip file path + zip: String, + }, + + /// Undo module uninstall mark + Restore { + /// module id + id: String, + }, + + /// Uninstall module + Uninstall { + /// module id + id: String, + }, + + /// enable module + Enable { + /// module id + id: String, + }, + + /// disable module + Disable { + // module id + id: String, + }, + + /// run action for module + Action { + // module id + id: String, + }, + + /// check metemodule status + Metamodule, + + /// list all modules + List, + + /// manage module configuration + Config { + #[command(subcommand)] + command: ModuleConfigCmd, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum ModuleConfigCmd { + /// Get a config value + Get { + /// config key + key: String, + }, + + /// Set a config value + Set { + /// config key + key: String, + /// config value (omit to read from stdin) + value: Option, + /// read value from stdin (default if value not provided) + #[arg(long)] + stdin: bool, + /// use temporary config (cleared on reboot) + #[arg(short, long)] + temp: bool, + }, + + /// List all config entries + List, + + /// Delete a config entry + Delete { + /// config key + key: String, + /// delete from temporary config + #[arg(short, long)] + temp: bool, + }, + + /// Clear all config entries + Clear { + /// clear temporary config + #[arg(short, long)] + temp: bool, + }, +} + +#[derive(clap::Subcommand, Debug)] +enum Profile { + /// get root profile's selinux policy of + GetSepolicy { + /// package name + package: String, + }, + + /// set root profile's selinux policy of to + SetSepolicy { + /// package name + package: String, + /// policy statements + policy: String, + }, + + /// get template of + GetTemplate { + /// template id + id: String, + }, + + /// set template of to

    rxjUG`v&1ui|#l5xAv@O{IY3$#uq-^SD4xWWe3E@aX^8!3=`9HN=1R5r z`9grN@Dp18D{8hr!c>HCc7|(4Ij5EiCt83H{ujG2Xu5ki-6gExBF8};f`babBn%Yj zXszn z+77{`rUQbx4~0=RRUNA_h90Xk_BGWR_cy4x^eRz6_f%p(y;X^A*~EryqA8nrA)9zA zn^=%d)awKep;UrbwEA0HV;_TWk~J!geH)wwGr|DiW#Ihrq$;R2eMjJ<{L_oEUb5Gv znk5^t%OtK%5ZB$tztg?c*`Nw>z1TLGL2^#pV*1wAnZ}*Xb;i`K)peF}=NeM2)pf>{ z^A^5{EuJxDW1aEY8~mo~jOlL{^RS!5=Om^d4%8WMZ07$r`F|xZ4s?>b-lv9lt1H&F z((QD=PdA-^uaX{pK2pEvx*n%(n_vfCem@onbK8}#Fijb>GA{MAU+Hl*@p2UWZb zTa*TVJJL{#t9rzD5HsjFRvRCW*<)`*35?s7`22;e1=;!OUu`o6N*Yf3#|M{NwcP?4jmuooLJ~Lz#FF@@4{s zV9zToQ@Ohx(8m~s))nF{6>h3XvWoR_3}`d49dXM-OcEku`--afH&!Lo}p3s)z>F~c?> zI*|@M1NH&as(lVUI*wF;9HBEIm)r8Vhenw8$~3+dW8P)k zr~sFH6>u%KR8V$vh^_uv)VD~^I1%6UNwP*~T@QJ3zp6tSnY{EjAp2Txg3H#()(pU| zCGRB+)Chb6Qc(@5)BW0Ws2+uoK_s*w<4$bpuCY;BuN-wL^^F!4#}7}k!19k{e$ z*vEmT=U=TvbC6^82&d1S;dY+~EH+2gn)v>RkHhZK&eO(+H|~yB9g7OO%GWoAlYIVNmgP-XYa9}Y*E=E)U5@}a!3`?Xd@%=< zr9mSYSz1iYp}z)=-jTl+D-+kM1MzK~Fk?$nXXWO+ou3dJDRuwDdSxo91sjp%rEq3z zLduxtKbaX3Qn4w5#KuyLv&@#gl_w=ZsMy5S(H;6zZMTH&OP7lbfR<;#lvO`+Jj^Bx zJC{CUw+Rt~L9aTD$3jg_k0>7-33h z03>SZ$o{6@o|wmgwa-^=*j^7W>>D1!swU#paoqnX{)2F4{V?_chxuAi4N3~kNhG{^ zbwHwN1Qg#S2`xS$QKaw}iDJ51fJaRr*o#x@eVov-zNrJ(4KJ0LWTauXh8IJLjE1ZD z$Vwn#Du~~9LW@$vV2SJ5XPHXk6frIUSGU6)Fo7=Z@~gL<wJx_~fBnN|dT5(M&?r2A4!ZPr_8z42CuO;Q|Z9Q4R+P8^C*2JOe*~j3TpEl` zrM|kd=J;Q1H|+GBXF7dKOy?Sgvz-|p*qb5sX3Sy7KTjnYb9L{49+lDfF95sru2RVd zIpA478Fr$BiUt631q-#WugH5aO%!P7{I~F>l6rbs4Ugvgmyj6El$*)B!247MP*3f| z{bj+5CJr?n;TKvTC0Lt8NisNDMXTb0X=$V3b{0@b8HTF25EMhqWJR`Bs)mYei+X@i z4neTbHisEuquv!Z+TN!ME4S}KZjTkKQmRLJ|ld}$j z=cs+J>I8EV4f1CMN2s;9an_W5R$a9netSEL1nE+dnY{Et0Gc!W15k&+Q13M5CdMgn z9x=GC+P4jOrX}BJLdvRk8;K)u#Hwlm>ZcV0jObDz0M=;?>ksW?@bq^FYw_JtC`amOUbiZaNR>HQ&ja&tkft=3Az41oN#AhmEJJ{cvw(Do8@^ zADwp@JcfeCu(H}zjE(>%PPA|U;!u~1#~CL4J)Be3dq%@qe8rY~E__M#bH|22%nPP% zm(x1(4F7W?jl+lVu>4jk1agjmJlFz*NHGlpmchTJR@s`U^Fu)>)g^*armF4J-kx3$ z4wv>1J1hvLzaF!&5Dl^rS+w%SHEJCwuki{A53v}DN9aXv8D3BEry$A`t2x7cGiA5;pGZulibE|N!T7@50 zrp_SIK3+9LmahgzRwgiuS(t`Eq-ww7$Yciug-Z-gKXn1l1zG%Zu~%qXTF_HauO%O; zl{6Y^;JSo=6l|kF?aDOkOF@<2A*Yxk0)>cDU{@J_7fv#2|8s_s&n*pvVFiUCACa*u zD6}*bT3IN}VjemCd=2JN{W$N$)}G{KA+7BKVsicJ(4;5U@7UxcGUx4h<~hFp|Ac4M z?D{nFD3fKt_R%aCYCM@JJE3Adv8m4yPf9Krpx=`mT8`=Wi)oh4gp4??X>~C#tYp8R zd7Gg)3;t%=O3S%}LrIOoL6f!qU*O#Yv03&V?eH#TfOa{DcECT$OPxGgYWnu&uumb9 za`{RjA84t@J)EDX-@|N26*2u|7NrQl_shpSr|p&nh~1GbkdJd@vA-7O;2;8qpIjTe zyso9D9nJ>;-VCNPbq)yyzn1R?p}zSNXB3X9DgKvG@Nw6bW~PO+ zX1P^$Ja&WSn8=3K#?lr>%W!Qr=6mUA{|}=GN(VrSB4rz5wq&(^fQfx8(=G9r&PM z1TdO}rfA7S?pWlWd5%=kP*Owz(^1ADoJ42z#o8q#GpcSZg9^FVoJ+yPD$wLkR;;vL zpOku%zJ0YbD|nmVnTvI22sF^&NSwmnlDk(l2VzObB4{0&Kjb#!fde3m_k0Wd7Wq~u zuxcGd>?EYx>*J@0h(vBWJ?Q=of(@ptq0f52d}xiw49l z;2g2nlR{rhtxaJ&)`%Dyw{$)cu6nEd>Y=%>jD)OI54xuW%>c|%oJ*Mp4?q;!Dr<=9 zVG#M?&hz052bgo#H1XO@r0a!~5Dpe)Cg$)`GNpq`=FikhOhA=+vV;{ldcrKS4(Ke0 zy!F0P?T@PDD&WQadAAJKi~0_@{jUIZw!=U6phPr4fQpRwx(%lDV>gm~z8qZ~i|?*} zo0SJJHsF|7g1c-}jEFKg>2pd`t}&)v3(RbaVg1})y%fY{+MTSbUxuh6b_)qn2gYu* zGLMKt(DFS$kspjltpU~CMC^M&^nl^a12M@gdtNIbC8z8Gtp(iY)>~>KIIN4nERla6 zOZDl;XZ91)nAcSNF)mDzHq#F=4ST<@rr}3N(Uyq3$Kn#oVlv6vth4_7GqU8=Dp`eO zDJ;=GKSWjtuo4*eD47N-EqEgtvq;^aUW6ZsbBmI?zZ848Ff6s#6C;J|H;5+dm_b32#YRwt&DP<}QS^rZ zE(SFUB@$vd>4UgU>_GM98XyQ^gd`f~NKfu8I&@`m!m%{sM7q=}%NwOD+m4#deV1>9 zv!*fRf2Lqt=*|t)pt{~rvY*x@e)l%-cZ2ualiK@rZXt7p4tyKc6c`OX=n&Iln$B3TevDcdK2$QFEOYZG-W-<;7Zs9oi7AJ0 zHPA`oNK)>e+KYmKud;1Gdop{f=^Hjn-c(}8R!=qVPe)J$n>MLZ!jxvG*4-75Z?C6h zwl^{K?cRK_HbIln5>zcW@P?FN7FXO(ajr1OtUGKJ_ ze_*&CPEd}Co3~lrMu2lO?!%N6htD~y1oYZbB$1%vFM?D=6`gjc<#Z8zaH@Fqohx=z1oobBMr6?J$9p6)5@Z^ejXZX6hu1zRaV6Pyhir* zni*W}+HvErBx1@Q1ZwWh3OO9~YMHqt{ql+X7x|3DK?wFxHtl45|e&0dM@((CFy?3KOfe$7@izi z#XhlW6OK;S)pBl-*P{M}%3K>Xjpsq7HRW<(8%+H32myDD=Tl}`diu+pZy`XP)wkzL z%W6(rjd@SeG~?rpi0Oy`6~Mb8Qnrn2+@%**)f*U%(Hmp<3Mvz5Z+1JGOIChfdi^6S zJ}=eAn`q5;%{UFGFBpjurWz9@2IDVD4HtgfGqvoYhNVm`RV3l@0TfW1B2Lc|t7>D! z7`85AOLEP0^e~%^xjp#Qv;UK^%N$@`5IYIM2y`i0HMu-qls?&VYSFozY}x!^u8gY# zNe(RpWo==3`4@4FDEunS@dN~|7g(8Qx%GBRK>N;<;;kX(Il0Mg{59-c`d^f;O%QUi z?0oN-$_fSC2-}*4?$t>wta#xahNTd=vsjcWrP&F7;FnaEx{|@;|vMjMFfL z98V=o9b`0E5HV^n@~NF{BDv^zL{TxPQ0@>r_SLBUp1YE*9L1N=-mWw{yxwZrD^d?) zuhOyTo9>gUD01fZqF(zm>(h@Zu+IHy-`~g|OF4f;?KPH-NFK#7k>CgnhT5MFTO8ZX z01PL5EYBic^KCW3v5cV#Gtgm85$77F_f50y&4}+ylTd`V8|ikKhKmW;FXoF@8=c;q z?k?$YTN@5RmhWwL4B|mxP5ng>Ksp$;2bUPrm$< zwCr=H9xkkRLx~U($m;lloEh-ssP7ev?OPP7I$|UqCLbJRc9Tt696O&hIxY+>p~vS* z)8*{uf-u%_l?5t3N@_RHFn`Jl6X<(a6;l0^LOvA%C)J{=h3JYoT2TaP7WQJmW(54t z1j;+66d-HP@6Ft4bQ?`XwA*1zdNTxEp{C1}d%bbm&BU%$oz=4m0#coAlg?g+rUl6) zL`ruyJwm=^dhNH=m+>`XCUI7Kjcd|p=wZm`D0nh!(%rJ3u=3f8e9^LvR@>%??@iP9 zTEzFBps%*AW`7p}vqTaQjd@o!Wof_6iE!4%pPI%?Ypu;llOx1S=MS;_UMi_)Qe?J5 zGFwv4G>w$kJ?k$Lznt+`Nmx&N8^k77H^~{>;LJ zbl-9OtsV^0D@b2G^}r}(#fHHBWZ1Jk@j)qrj%W49W-?w{(Ih_ck2Xb}=p-N7W4X_jb)j@I!Vp^(U=fr_Un3i?@~X3gE&)J`iBZBqp{Z1i2Tyc`dS}^^gl% zF`i#vzti#|X#1TeAn!RZ`JxkQXg?wNkoCHT*OZ+seYC>T885GumL*x5W;zg4$@4OZm z6hzJ_y9rpb{4A7Q`2tBo&S(yb2I3P4mAar=)`Q*7BIKun891kGd=%cFQXhri*2 z~cPZO&C$hZz)xkrW8_QH-29{6YMBtztpO# zDK{EVQ~Upp^3+L^!1&gV!)bB{yxF2HpQ6bdA^qLx#Q4Fn85RMeW8(>PPxZ7C=VvCZ z#A#(_X*yyhu2dQh1bV_TXyINdDvn}xWdKfq@XNJmY<))W0;6{~vn8zNASG5Urt_1a zWlxt}5NYSUY>~|uSJ&7C+G95iH~(;dYBse`h8H142}o zZsDA0b}+l;_LAbV*1D<Ihw}^;G4+c10vCu_hC+cJD#QrEtJKNwWUjMse^dgN$NE}juUnkv!-?ijc2l(-YbfVa%Q1+| zld_=AddSj6nFaUdb@Ga%`K6p!-~bgn;hwgGw~WPo|4QK@*Ls}B;1YI4dak8zOfh9y zV`nSriq>5DB+X)>K!Tq@hF>f^l6o~19a2yX;Cgq`1eW|PsH4D+osUo}YOi-MlJ2N} zsQWvW{l|9M-EHnzx*{j{QT)Q1Ow2nxt`o2}s{e zmW^G+gGr)X*hXXF6cjXte>~g=&=Yx?7V9-gXb8dQJVRdL_(hb0W`k&UbO%8Vd+h*Q zU!69^XMt-tYmjF)3HS{xNuQqOCo`)!Iu3{ox}~JZXgFQIwpVg5msDGtJ_G+PYx8y` zL+g1o)Nm+vBNjnK6o|DDymQPX!UkBIUH0?jNPkz})XL$?d7>V;w4D2=!qpy&_*x>4 z|0wn=Qr9kSN}3q$zb;y}F7~`twJY`uYK@=|5h?|HUF*TKHXXm@%dB;h$osWf@nVv&JVU#oAAeDN!=s zX#Ui=zlI4MNR(=7VAByI`(ltuPCEdjjmyaND};{oWx(vVUvWNXD$c-cJCr^x;!D$4 zqwyLLX6iBi2wTvGtOStCPWgSjR#PrfDw=4 zm^vn!$)OPS=bPnWl31?!fp4{9=>d842UUA!1#5N*Qg}K2nS&JDbUk-nG(4}@PkLi2 z7oi*NB#8!5vj8$Q;UaV@Edq!bsJ}dS()v3goCYRo?cK z5J@})(kFM6x5E^&Srx1aW20ehe>1?UGg1a%0`C?L zZ~jn>)~J@|X9pvlzgNWn06MG@_xlZE=NnTx(~DleSm43?>pt3TrQIIjqFH&k$bGg- z0FhNmy~f2g9q|!7=&R~*B(-lq6d6~oJ@UL)vg|Dml}HkI{BEe_FyNMu~g zo&mo)dZH9+<#xGA@TqJJh+PoYRI#ZCVN(f*HrcYrPi3DFZf3kNsUtrFH6jZNxZ5~x ziJl^Wv6Y-Z!JfSl9`$Ar%T#|kDBK+_`;rT;thTo-AI>Q2)wx0M3C<(x+yJn@#p*<> z_Dwr8^&XJy9cyy0wKEIu8%2a(vQQ-SKOC)UiN&ZCHBiKNIO1dX=8gd;>5bL{l=BF+ z$#w#KN3#Wm@wNtx7x*4M$+9;xBa*BQpF4gs<7a;hHXSXaeI?>sYx?}_>3h_A|kPwsteZUebT;_dDYsy8wr?Iw#v$^lJ>E4MKH1r8@?Hl z6WbTz{N`O@ny&7DSam~9+w5JevHS6tpw* zQI44$=)f(#J%6l$|t2?IfzUeEzkJ24X_Yla`qr|C`Nj zM=-1|HX1%*Y^p%Y)qfS@ol?9gLz%G%nH@ip`qGcN}UZt~ud@CT| z97VmiINP3l2-~#|PD&5ZnE=qQ16zcb(uD#+A|G0M;fSs+14c-(DdOw55pf??#b1_g zrfz`o7qunuiqVaz-2x5V6QM;(m9UJ}6==-Ns3iy_s?U^CAk17|>(M~^`BNq&n(&Y$?&Dl;Q>`?CV6c^DD=I+iC_l^st zhL*5%XHU5khY7kAp#u!AaL)lNDMEMHVop5ZjGlS}bYhh}s3=ZqIVgreyFBT1a$4 zj9un$k*8ZfZ+dw@93%!IZSFzdq?YrC%V;@rpcq7n0&oEi*1>oq?n9 zWgqE0dTu2z+&lR*vZdkNiTuhxH86=VuERvJ@%yhIE~sI5Cuu+`L!qWeZ#M)#Y~2AJ?K-S!ZvPLR^-e0RC0^G zrFn0#Vhhq?0&%@A?@hZR>^xdh&sQyBvEl==?s1X4ieL0lTt_iJ_ zjfALCse1AxQ6j7oAuIYj5{#E~?vIcLPpK8EwCUSCSM8orY9;Rvx#M^OXP?P!8Ya2g zr75>#QhoV2_mt1#wvQ*Vn+?}KCZUmKobR$?F-fRCxTi1TAfKFq4wasXK={^;vI3%( z9%|mYw*FJDFS@Pi7Pi3*)bYq{_PJ|lUM@%ru_e{0Sr+8eIH4$HZj&Z$v_yeP~36a#Pm|h)ps!@(?MUZ1Qt1bDnc2jx1ue= zkW@QzSJuejh-4pMc+OGTb2I-T62^;0C;K#W7AQi*laG%_JCS#a#@IdIu`*ohHZmBk zdSzNV-5Eh=jjy$uo3|p)Q0z>sfN+j;nu6Oz8W|3>3}uhep_ZWmwHq9?0+`cH2*&-U z4gJj+L<&Y+E}RCV`fdT<4|2}3sjmy{CV>U*@d3@FkYb-;j&%(yGQKD^P*}w#vus2W zfRjh>iC=5l$e)m0vj}3OU^Gmn0c&XnQ(P616$w``eR2NyxRQ?}hb!WQgo;3lpYLjgMZvX_Scter^uT{Xv)4UM)me)Q8=>>hFrW$TjJOQ*Ay8=;I5it{Zp!c%JomB z{t4+HQ~%WR6BhBLXlsw<*Rtb|0lDb{^7txCYhDGU{pfAn)`i1B0R6%r|$c2ph zF~O5#l09djOzuML-0ro}vSU{BZeq(%ps`3H z;e%D{jK-(wKl1Nf^lVni^Y%}yl8Pez-&P-;5K`R&La?Ml*>=4D^cm7Ic#Y2`cs*cX z`u0L+sxQPAe^B*>+$y$L1Y)Ag!XXo91ouAfG7)|NtrGL4EDGA82LJKY%QD172YXbs za_%R++4Y3+07Jhuhp+xnm_;ir_gyfGtOP z@S6kvLny1c1jAX0ii`~Q9dR*BP8E-SRf{sGd~}{7&>bB6HQD>V96a3L0fD)A;TKS2 zJHItnaS|;dcWi%|*x9B#QYDtk0NwBEv=~#l7wdGBq|evsR!N_s)Aaz5dy-Dimvkqc z4l!Nsp<=0gsVV7QI*n(0f&0Er2PC~or<)|bMyFdPy+o($3rYV;r{_!hzjQhTC+9w{ z)25^!)ain*r0>(|fTXACbd#j(bh=g2*XeXU8`>SM)AJ=gRHsATNMEkgrlc>>>4NU0 z&(i6Dq)*oACP{bE=~hV}6hyd`@6hQG%k6H_X;aecbh-c&Ja?H+2PFL$ zoojSf}Spdah1~fE#y)PMebcu};gW*!{jv2PA!sPB%$pDGO(kpa21gqmN)M-=Ff6(cIQ%V0qrvsAyH=S;h^gNwzmGs>@U4I(sJ9T=#q;Jw` ziA?5>m-L*KCTaG|_fo@o_VC99Fo>LblQ)JU$>ma-pj=YW-Tp^GZW;G&ez^lx8X!Ke zs(X!>wM=J8pU6_(dDhGNwa$`Zkflbjz{{Givt;CCsX@oRtUGj;OqR4I^K_k;b&bxF z`IWY0YOnILuFzSsB+`~-m3UeGbe625v?UAJ&CBxXELnJIOV)hvb9%_1@GIB80w2lK|P;3aKI)?zQ~1)U`jDQyWb{@lxYOlJuYOIr$ly{x-+mcYHVB_RJJFY88~ zC0j+>lB|fARjspRcS&2au`0Z*GMyzGQreQec&e9mlFpJnEN#j5{el}xWR*YVmm$lx zm$oEpo0qj!X9=c|wggG6_Of2qS%O@oEx{{)@Us3(X9+%%wgeSD;$=Ocvjl}nTap#? zvToN|g7u^=L3sb-WnHba1W`&`f+N4{WnHeb1h-0Cf>zJc^&P7dAnN*PFuExQ(ni6r6LCD8gpaG85uX;Wz3$EWHyQMZ;=o(D}tv z^6ZSC6?J}5FG>5YXxRrSzmy$2(M8LeQJK6z4mY#l4~qQ;v0pgOMU0^bg?p@Dyn#%J zRAIq;ZHPMiE@*_iGO9P2&1r53N_Ce)VjSf>)g-kv@9ysP|M$c})Uomiyo*I7++aBK z_xTi(bTFKW*M`T7=Ds*QE}U7on2fP9WhTeeu?+JUz%RqBmBDRd+VpT+Noi+4RxtG{ zAGOQ3M3R3%t+JFY8dm?(`3ry}I^Xx52H^<{2mgaHNavG|bhoC%&ifybOLn+Va&*C{lFp=m?=*1O(xLtIlg2d(F;fz(G`lxyzguIn7!qZ04+zv$Htx+|`r8 zH(|9I-y9`=SEY3uw@ZpipoGpXjtvsqKZG(XFc`JU4#&<mZD!KL z)h{N}QYzk8!pL1BW`UoDbD!e3yFb#cDQlv;UuxcubQ%*~(uB+;1d<08kExja#J}XG zc7}XSc$|As`iuMkkBVA)#-?!UWhw=%e>fuhO+Aww?A`87j);;-Li2#n7yl~B# zM+lpDNZoptz7lMgCl6M;#GN6mL}rbk8l-d8+&jbeEC%#KLfos?7>SQ)C3@>|c^=hL zJ=o+CNF6+wzEw-#irj<0QAmiM{p0ttWe9HRz7OIbVJvDGTrZyk1LXwV9BdZKBj#;p zCzj#G5DzjT_FnGZX>$L-H=>Ga;59>9>lC*T zWS1w8zMzItBIu*P=8{kqoGe!C3>&CKVN0az_w&EmxFOb8;Us~hlYznT@>_VH9w?hg z;OVwax7e*4T`|waK0qK^kgpgJuS#Q3EQMA%!%Cd7erHtA2wMp<@uEj22sL}zU8iRO z>nE%>9dX7E8Uy#7h+4~1 zQ)k0T=Fw(JDy`Ulqq%V9#y$jg?>w!O(IXG$(J9f_!YcPD0xJi$;&?NLAXHsgRHB}_w(;J%ex=ATqI+af-FN~-Dx78y+X8K zwPM^m$tc4d%qaU=Nj()CWxpv|pnjh#c}o5Mtwad0QT9?vll*$ZSd>o1Ld=5Z;vlbC z6m|+i+GO@FVE7Z$-r+tD5s>lc2w>TCsLGC^|Is6Ab%}uwy-<%f9 zRf}M=`K*a#=S{5`^z_^S^h&LB&+zJycX{265aAQ^#8y#-T%{dMMqCn z8$`8MD;8RWFB%q z`$?f%f_}Qn51SNmpr-H13)bdSer3Ghu>Mq`)*ne21KqMMfBjW|Sbtqh`xIW=Vfu)g zgMVOlbp@!d_bP3mQugeH0>R14etE99Hn>X3A}=IYnjU>(^{iSCs?*M^)vQ4>|$#IB?y>IS#Fs&%@g)dvxc!p383!o_>BO5%Em)A%BGvRrt7p?IYR1C05{1?}Z82q$*?jDKrt+UD}T^P)jLA-4&Fh_E}uU+@O4=F7-8SEA(Gc zWA8K;;!7VZ>5(p4P|!R-;#GafeS}Z2Xvj=IWvH>R`dIKqA((@^-}8>0N^ki(r{5uF z@!^bHB+{P`5zC-Bxb&C2=qfKZ=@+FZ^Wu;QftvM;z0dLDV|np{ezEBPVeU=9qpHpa z?wMo)0|ahRkf@+R0|r4QDw+V1j7i{*CK|;m?o^a&-C@RHMM<1QxE-f;t!t~TZPm6a zR?Dg(A&>w?MQxRq%Hjfd91)iiHpzUy_nbRhKx@CJ-}n4^G;{Ag`#JA<&wJiAZ%^F* zn|yeR4;i~lpD#Yp1&`ym%$0bI5Q|`&+aQP1;pTlU5VE{&znP?G@Md zo0F74&f}{FaP2HnRzZ(aR8i9ClI_~$A1cVPb~pE0Ygv{_4g1df2wlFwrL!wdA!FA8|Ge*lNA#u{E@-Q_ikl;OlZI(cGV zEE_9lGh*VQ2eps|eSGtBJrKz{TCLG(@7Uu8Tww$Be+*i%Ke>Ip})9Z+GCrWxLV%4cBSmx#Y!0irN=F@%o8e zVJvU~Wc{d2kU_u1{lUJ26BHW;_GuOL=CHs~BDO4*E4e`O=dq2M_aXFaG4xsR1Ghg? zl~ugDe(wqJ3U(8p7>KGK;f~z8jtif)s=U6dSKTq_%NYw=+=NQ0uXMF|*5O%Xk{gw_ zs))JHSHGwCj4hf}_toz{F?e$Q9QX0TQB`5$Qtv6M%d5e_F?$m7%vNueWyEq(BK6iV z7_>aOfOKS4g~jb%Pj0dl{|S-Dm;2p&x>!`mr|z5934qPuw?@8xIlT z5`V*8K5HLtd%5*-{p|z=)8F1clPFSL9EGS$h(+$kP5 zocAA?vM;=SPyF0z1AbA1l3)BoUl>e_aI*}+2<5Hr3o+Cf9h0})x@ztZ;aynW?r!&6v`)p6f%e76hL=Z)X(Nh?6=y3 zn+Z5Q95-jj6mQr10)Fdrbk0wb+~<)S-)cH@a4Wb+ftg{w4priFe+FvXwI1mCnGiv* zGY7895uXSiGScps;4q^=fmWxDd*^uk4LrQnMWeS%9W0*Fw1~y%P7)kGWsE3 z5^MN~ZrqrwtTEHqFe*4jLwc>OY+mjKzOeE&f;j?2Gb3?X1-4 z(O)OJI4Hdz>!>cXA8QhAyHyow@Dtr9ZL8Til{A^1@fovI9qwnUJ2m<01@uba4vvde z_`<4F0y=3O63|IaVl@s_x)lvz1doZqM!#Wx39qPr&uDg63+{xe9q?QQH*f;8yaXP; z%N|Jt4)8~GDfCS`NQxIK#X%^Z#(6MMh$HoSti1N%)u~UuTAwfBQsi39u|k+^M(B#6 zi_8K?a0FmoIO?tgDks#&lK6s^?QQ4sPx6CeA^n2h1e?Ugu7+mM}!OMS^-^C zbC$6wW2NcSkZJ&^N)45o)G%W&rT3?L+5yvTG`<5OjkfUzD9q)k3>4;4+J?6T(?mS- z<<-x2$6bM(_DXMDIAQ8UaI~s8S^sh&6Y~NHz@7!1@L}H%g$proO*K)h<}*AU#cBhN zgGk({6Yrcr;={?rW}WzpVVt;ENmZgeLhduppzibJgG5_OKY|nVtptkV)DeLIS}Yfc z9S~P^xvba9Wqk@K&sZVorpjfVd-_9#^|UJY_50NCZwsGRzkhP>>8}>HsQ1?j1<=(g zE!T8NB1j~;wJ#FB+-UyS_jhjWVnQ!3`PGrv3WdFE^1GWHOXO(fm>Yey9CNP~+ENM& z{xA5Ie1cP8+q|k11mVbC={EqTa$CX+E^F)ucFRKO(smWtxVluo=m?+UR?7^(TBv^? zD)jPh-z5C?h7~e7I^vi`kk^REBk!TTx%usY*vR6#)MB1*E4c+_y=Re6%CsC*?}XFgv)H0;aBv} zgNht!mos0~wPz}F#ONQAR16FhltFb|-e&)qnuZnOjPNBL8iA64O!2A)*=$=c4Kwka7` zUZJWI%VKR+N*wm8U(=iGKxbI9c75Os@WD14uI_fW z)Cu_63NB!i0IBBFjHH21lEtXdFE{Cga|AX{1+gaXaeC9ja;9uE+Z@N$n|40X{PHtvwr-sy#p_tSwH*Oc<(@e`R(c*c#LND2S1ASxDRFU*w5i1 z?91L0SM`e#|_!KnT~6-m=2?9dCxf9m<;}s5J%~3)^o2E1b6B|0xR2%IdIWS z>=Q0#k|Sf@>5w!~hfL$G7tbf1>J&+YbPr_UpuYXBg9`s9`h>QM?k( z?9q(9wNdGw$a0p`QTVg=C7j-1%%w}P<3NX#-I8@N+^w>22p-4r_^Zxc@n!@N&hhvf zF4Se8B>pM>kmx7FGZ%jl650ore5JJ|v?U7+My$fffO1&ZVCsi))#-7!hFXsiiJ!I6 zr#vbOC2`@~9!_lb$w@d_5?4cmmicNfoGdaUVom%5DFQS5_9}vn;75B%jdh~mx&jla z*Z_NNHUoC~I#;*@{X@HRgSo{mDFxc%IG?yb?Xy3DR#jcr>mgiGWd}cET~PaH?-|Rh zE?cI{vsI@Nmv+ppx2ST_r&OJKB)=gUx5cQZjCpXlN?v?;Y9vgB zv-Z*3$(UMy#om4tio)#3xo?3W2K885;PM zH$#2DqQdP_QM4JfT3C; z@q&Kb-QR(!6Tr{Qg6e)*q2S+RUX;D_p9vbul=@t80vBR?XaEy4x3* zF*|l4f1uT~rpQtB?|lq#`A0Iqvc13Oc>&KFB-8l)P@>$VJlb;4+7((>PeW)U$Q6hE z9)3#RS&4l3FZl`j28Iit3dEs(=q)nVgm1D%xckshVc4utk~V@4Ew|e)bIURCRv7Js ziW1LpL1F1l+#TADIRCE{Y-$m14Q$opfcl#7X`~)qzYneWBY6k-vWV*@JQSckZr`RV zGa4bMC2jSSyW&gOWh(6wC+#ENAt~$k6$efwPv=RL2e4J1(^MXbB{yd3WWEE<>ibc; zY|}>Gee+I?6^8qUUja@-dkEh3Bp>mXW97_}PsH8+Gj}L!{3_*PIpeaNu)(o!g7AWs z+CfR_s0caGjzZ+?Fei?Jy!K(|75t%D2Kg~(&c)(J&s9JBJY{!dEa*kkW9ur+B?8h- zfV62mvu5TgconeRv3oFPX)NAON29YS&Ei%q$bQ?~G2$4i zR3a{`$`mD`xz)8G>Jo^PB&>V)0N?L1U_GSpT!C6>qX9FIM_(=n1J$1T8%p;2!v#IP z^QwDtm96ZVZ!MJUZM96#p1-KM%sok>vI)*<{sVuI_1L>NCTd^17FEO+bM8LlH~axj zUe^$xbj?k{;J}8x*WGlDKiIcn&rN}AZU~Go?&M%?i2H(pYbEiTn*!HK;xu1PW#DL) zSlrnVH*f#Z&B0*}dvB6ThBWL6Qb};&B6fhwocpyj^0oD5>*oVPTiwn%4IJ*7&v`)( z@(^JbKu8y=Cgh!dalOZ7Eay_h3|dGbH?+xeAA=QpwwwqZ7%D&mA3i_JB^s3RRq%tw zoRQ$UX1uqN>$aUy6D4$ z303y<5r$XQ87YqkKJ}qMm*;ZLF0#k(>56x_1be+MorzuSt3Tr;x_xX6V2zCV)8UNl(J*AVc#U(#vMFlW&V}vr zbb@E{)u!W6d}$GPPcwT8+()`5`({1|Z1HMbIvM`IG8c*uU?PgMx|TgjUzf-quKH1P zMT#W>XETw$SkCikpR`0kG?g4JmK1!0G;EC<@p$AH(yXeOGr4$m^kh{Kd$qJ8M`cz< zeaY^d;aby-{JE%zzBeqdIRJEG`G{Ri5yz*Y;YxneX$y1@ESUB_MxghyP7S zU-Oe+2k5W)@-=FTB~EScB-1zsgt-*_6F&?Z5n1 zb=j-7emZ=n&TFN=7QPa(Vz4A}O5kc;j+{-n5k-c&$XR+VC$*;s709FBHg(L6Y z)GSM5hX|=;My99>>v48{=$e_PeYE$>Nmo=EfCf%fsq2mj#M6R#G+?aYmB%|IJx+mGDiHVu%2SZh*t~m zQ@^hjKFzO!a}A-5iiHcGrvBVRMFP@OTzQKS)HxjAh6cfBX5{u}e zxJTPL;}9;!v-)`|oE<4P8>hiewE1QUmT7DVrl@r>e4D z(ch56eiwKGAF1^ho+~~TMa?E{-M}ox8x%JUkF;KVxY!fE>Vo4C4_s%hboiBd37h5u zx{NLgVq?Xhv^tveELlVQ$f?{bC{qAmQi)nL;iL9|3JYRC_B?yQYO}XcyYLIcCD5m* z9tWi;(*xMMnDv-AjFW=<0=qWbYYT)|rKZeE!X?{li=W%DvX zzm&|YaPyY0-;SSGk;U6!{Wf@Bh2$*IZ~f*~cz7#RZ+9JCydgCZ7P1Jh6lx(y>s#Wy zik#R++lMnC&f8`m6drq=zW}JlPZtQATsD*6dPg0vqAib<0960K#8azip>uh8Fwa^y z3-MNJTO@NJTwgN*R&C7^VwJ^{nluPS#4Ocj@KmZq%!gWG;4Z8w-0d5T0tll6HMD!`1DD9j`W>E zy}jMRKiOCAP&+WpS*sJ>A|{(JrTJ$)sU9Kr#;+9Vlg5S8A>?e5DZVaI&gHXCj9v^% zwr{vL0oi(!Cf5`92-a7rQLsVtJC~OmO>3nkJ^gC(jYg3!CulTo6Q3?lpOc6D$vHVT zRU0stZ#0Rzk^-}W@0bmu_hin-S=7jE{MkMa>uK;&#%w^3P^k;6COBj{r>>BBV6Ui2 z;C9??2CioYK)%zS*d-y*i(&NHm;LD5=Ofksi8B>4 zE|>$(%5Ss#OC=hf9Qqi)IGGr;01n&{3uLC)GpG8(Cx-UN19{bvVV6&m2}9GH?>@XE zc_iUb_E@D#kUeHJ{gSCp^$nORFq%B`&FqNZhB{y0Wkv!L)eko9IN8~M0n`p|8%d`3K`gzLAi3S1~JeRXDv$Q z@b_0G_G|b1sl$d60`kBfsGI2sfJS9g#pxQvVC4xW@ zZSNxJ>gEDI+6zw;LTg*|P(c{xU2K5$-+m6vtSi(FmpHs^(d9Q$?W1tu8&y`7ii zR}-aU#=7%{iNK(_n_tlympU-hFkg^0@(XaS`4-)WaBp=Z9 zpwrp7UG2a6KFa-`r2aO{<7)2rnD->3idwK${mdO$<||L^}#u1N2H>U@A7 zf_pE*uzX|h`WSr&3x7;S#oH^do~hMxMOh|BC` z7*J+-$g4{SxMKZM@*FdKDIShC5CX=riv2vkF7|0kC1|p&djFhOs^I4j{B-2B@K^p( z^~35zSU!}45I*OZMkYxkUd@jQADO5=A0i>JgX&`xyo@53Mn4~v!7Kt|F}EJ#mEye| zeom@g>}8|rtzA4JM>u$aA2OBI*0nImrxsKbU6MeP zMf7ORam>;QG62VwW;kcA(t)U8f?5LEriE*^vg`Te3idRuAy=uyA=Bh1Qg*MDKAP?z z!^l}A_sb;S$k>tk{6TFeQg*Qvc@0sf87>mem`XF3B`}i~P8@h`6_Y7x>dZFPKj=D7S%UYZ`m}xgp{}LRa{cjVAElX2foX_IM)oj= zwuy!7MkR_`EN6@_DdWHIB}c|TT_20|=>_Vsr;N=JuzgPRZT@hn;@gBt(R>?A@_bC5 z*gcfEL*9n#5)oZu7A5>R2#b_mA&HAgjNS~=;KSB;lyJ6vV^`dEf7lh*`WTMbCo=3r z^3#1!A*TceB4vm1UK2h&@#zABON=}n&j>Qo>Y<>(qy?!=W6N`lCsGz2N23p+vdK<*qM2(??6g`HOlBYn%@E9c)%G*`C#FM(jtCa9_5Jbuzm&BbU#u`{72mc;`e4AY@ zz?PQyb(`i9FFMnF9ruoA*@vdp0r%-vx+_=VA1BG>YMf2y=nQgRLrvtn>d6j);f3;d z{oVuF@Csjmj|<2U7Jfk_XY`G`(dHdVuP+u^ z^sZ+)K&^|@5T3$!O24!Fkh$1QnnG7xI7u#E{TvkGr@UBa*V1jpzj@9RG{V=Hge%5# zI^|-R9XkoEe&k;`=2r?8Q;v?EuXV>!EYo3fUAaQ(2$N+BS!7}^@2tqr4SGX&lmHYD zcc8hCNmt-HT;2;;J{L0KMW}Id27gc~*9dq*KRil!LIYd*S(YQ+fn9Is|D!7&JD$`E zoq8qOVlh$OI7Pp|GsekH-p|$pna6GFidTk5XUtY!Fu#)JQ3Qw5^;;~$-DoawZC^Ac zIb+?=2Qgi-2eo&_Yur0$oG;As?B{AdF4v5SSj)>&&nSa!d|D~!8%DQql1~tROQi3S zd?KXnIT5_0#@8ki{Uiz_+3g>?Lc$^_7Fz!bJgZh9FA-HH z`*o!1ZU3g^8*v)==y5W!xnEaFZ`jvR*0iEh{Flk%^QE}vH$N-|ztEYYVj|?AYo(v1 z;6$cfT!eBM^g_>MDOy3Xq5jCPR`J~zJ_nE;_~)mIa9Y4Sc#9eM@@?);;a@D`18&+{ z_;EI|()-Q>2v~`DiT2Y2l}M_1wO%@*CQd6|Ci2*Vux+2dHXWPhaRQ zx7}-lbLTA(ZZzYaM_#3YU1{xAE0EB?{xS5!+teOfkq4GC8oy%qcII3~c9c-g;w5dp zD)@@KT|S1&df*5l9y|s3Tu(X7MZLsFMLpHZ*?!ca3gHbRt>#CGv^tgcHffBY>t#KH zulW6z5ls4Lw-L0H_uEFWcU{^D=nL>PW;#s~_?aO!%F3oBf;H$%i0BU><+kmId5PH)jLd3$o3( zq6A`}K@A+rP#P=vT>MUb*)o1zs9Cjs*fX@IR~43vtg)IJ#8DZl`ah1_o8C%JO<;gi z{~fCS;49H48mO{{$F}jOGv`J=b42z5bwq1HT2Ag7mD_0a^4*@#*`s@N8lR;%#r%Hn z-kf)k-fVwKMoVv=MQ0_^o9I|+?KgxZNRyX!<65TSv{|OFe%Y^~xPZ^!GKs$Sx$@>t z1KxXR#%TIIiQyCa@yy2C_oCkGXV|^YlD+;l?`p4q=p+n_on^I=aSiYGPQQSWpqe&b ztsyIQCU*KrReCY+YN!8J5+Va1RzG8Y1$whrQ?~SkNBCkiip~^u-X+N(no|2-636A- z#(S_A3D@utJ4&^CK9BaD$#&1?)f!U6UkcLhE2^N6ch&AFNr(&_qJG8u5R85K8_He*<2wMpGp8r{KrNljLfY!sFUacLuTaY$k4T`FJ5iI> zsHJ3^pq2+nk$oko<*Ta_X@gbTZKTolXQ)WJ{s_MZ>-vtrAK3Nl$$QYQ{|3p3!ivZ| zUEv{zO7r{Tfih!Z&cbrS7C|)j6N7+$8TyDyB~NMC*ylZ=i5Jm-reVPZTO8QTWOL&- zAW!f?igt5$-&=puxL^{S!#-Jeo(tY0KFjWVh2PZf3y)+y*tu~B8+2x11N&W+3K>ok z56o0`2Ny;^1rJywV|Jx=N@vb=zJdm>?1ly=s?0{?WwJ4!|C^dcI&u=9r6b4l`@K7I zR=19P`bUKV7DnTY(&T+f5jc z=~par610!}iZYkGO?h>B8N-D3YskFDAEXpCqLpg2+hhpuolB0(vasNfaJS2!=a1cT%_>eh@Um7+- zTfXkqY8k1_^jPIJ@!wkxDG%$gE-xb){i-_T)2S(wnPQ07&`oYKbH9vE2l}8j z&`(PMrPwK4`-j{nNs+SCCHD+reOT)=r*|#BpCWxPQZ>Ld-0Z22c<`O>fw?0mv&;3I zJBZ|*C~`H%%iiFZF|96~;x9=Ime4ALI&4YT0PU}LKb|n%ymP&fz&xCHh^s6bIjIlX!8%e z`+3G5_6&N?9l-2)uZjL-@#-&3eBIjWSkifMILjIbNJ&W-nL}7)OtFVo}6B3->;sN{^T0e6VQhxJ?BfgXTY9OP-)sbi`Op&!9HtuP(H;D!v2b<6 zY5}NNFa20AV*G+&?sUuOm?R+SioGH=wipX~6dLm;dH8LyJ%#RhlX7B@seP3AV=U~6 zOXsrq1RTpBHq2GPm3Vn*4Kq0%lf^;7Y9_HvSQo)@>67IR-;yUD7|B!T4QwzY7kP%U zG!shOgFTG}S7I#@wSlGtynBhx&}q?S>YodcbU z{vj5%JM0#$wv7cd#s9QE>#`-Z`oIZhl2f3EE%q&% znQw3Tizx66zB6gLBzOWJlu4t-mMvZJ%=z(I!e2-Yo-;EKKY0^SNA)#)EUS%27j#dj z4|BByON@nYgjTy@qgb}AexKmYsgfcbF`9<3UP&%Tl2J{rTw&M%?0#=00dB)*dwivD z8cl!Tn>Y+_mia4l)dK`C_;$VTYnB1~c6EGnG+&;W{zWL;L#wg-MQnDIuUWRd+3*vu z2pNpIN|l`0tj4^D_zq7vG1qTb3x{ELpvKjZERm8m;kGFcJg9*}; zF{09%Dcy`BKSHgxQx|NfpspzTmYkV4Omw3R0--vfke-BAWijPmdW&IZ)n!GY3|FHsTJ9U((-m1qp_sSXok4fs6N z-!Mx}R$YxCRf31iLciM?yRi`OoD4rIf#vKn2vY_h7z`AQi#0eylA-jo&!bP#-V8#I zCl=K!5!;f!0X2M~pQNpp75Z4E@CHI5K_b^$t<&fBF&3^1t-%{(=X5+PV9-Wrm^2c0 z+h64((@_~Na7b7(Dyj)abax8&iRIGcc;FfhcX>(GmWDkFFTvDr<2V#XZ!#_V3s!~x z2-dk4=p5ic=lS07OpgzumJ7j*yx6gK1{RDUL5M$v*SrQ+vSA5NM>mu}e z+X%MAT+5`%mH7I#5JJ^>aWeK578Rwutp+fqx zA&VI#szQRKz3Nl2_w+?%nk#ew$X^bMyRYM**a@yw1|-sG+Hg|(a=>HvLG`rnTHS3> zILu6qOQ`~gTh|tQOp6{=-*hl)s~mYOBV%{Q?8F*o;MXGSUFA_Sg(lhUNja-*&Et@9 zH?9^7dy$y=#wGz@;$w{U*sj*2m)*8X_Q(pYIOE(b z*ho(AyR1*ejP?uN`?_Vi_eU#CTqMwiqIW^CfYHF$Pa^87k)sN=K8*+LWXIOoulu^4 zH<{x@2xtAB1F`!dQV{NYEaZ;Ft&Gqb9DMCs_Fe01SX<9K(f}L+ zZ4r`d1U-~^;)0Zi%>l=W3g}>o7j~Lb&rrOjPWvu`bH|3V7_niTk8$#ePdHW&4Gt&E z6PsoAx@7fcona5@P?#)Sltg5Dg+OGSIO1R1S)#wat~wgbs~UNd&pJtFKS!;7w0(|d(AFDYyl@CIrzlR zTGBuX+1hgwj86OSuW1OyeoWBx6_>Yh)BKt`!#$f?W*t#Krx&rsp34dhh#jRa5XpE* zq~=CU4}CX+f2U`Ph7?Fh_9tP$%!ve*{Vv#3O(|KxvFCXg3+*xP%)DTK+}vf_J*a@i z)sZ>5)sY_!_NiI&g?m7)ozshE2eNPb)205gA!+`YNaz=-^>EYh8806e_+xCHh{yBI zhC3W`<$k730*D#&5p`{Ky^5=a}tP6+R5zjV{}gK@!_pr^S5neRfw~id7=YPx-1Fc@BzA zbR&~_bC~V|SAW?Qs%m(qKAP4wprvVfV;`ncjYbsT*q_VwQ1cGfaGq*dNFe&0;2LG} zknLYC*83*2;fT|49?MrC4J#!sUQV^V(GgB!0q;e;bFRnLeK@)gvP8{a^h=)f1`7AY zX>whm)yj>MJGRrNd$Y?qd;D}e`hqGlTWigIE!JPu9;fey;N5+B*w$a?Pzik&?(E8u)A`fCY z1(d(1-QpI3NY9Kx-1gG<3)tWOE1WUCUldeJZw;eqH`5qDJ3r|8B6RHj@9tZky$Iu% z|7OEnyU^*|5%g_Qa>JV^dpt&yIJe`5 z7p#o-6=<$VKehZ`UBx&bcka(wD(6NL&c2U*0*w-%qX7J?=dz8)Lei@vGjmf6{j+n8 zrZs#G-I4DKOpPNBk4!5_2Qs5cgv#CI3grPkf z_Rt+7SoysGbOo%$X@fIciXGUJP1LpT)zVY1s+NqV7pX*Ai~f!W`#D`+pv9ZScxYf|{uDfa%!#ik=RCrFCqq z((d!$bWT<>Nh7_iD+)~DrVspaw@Olh&Q^t%FdF5+1J6K@?y`?!JSuH&MJ|N19qmP; z&$`?dTj~I*!q37&%DnIOvZuY~3{jSwex#2NfP`!(=!IO3j&Qnl@cSO;Li%=a?w1Gh z<|HcZm0BY*q5p&7oT%wEkG{ZDPdgtL!3jH@mKn(Lj=oOcX+KkPU&o*nt3xs(R&%|6 z41X$1znFcb{rJ+ZxK(7uVtLpjCRKZdhop`%eH#J|1p6jbd)1ZIUXE)>{FiAfP(RAK z)|dZF+bX2u|CMd#X7VR&jH)Br0#o_isj=4CoinmzGzp^+ZD@%Ot>dEK?mQ)N576r^ zv~X(lpw`hc|2H%LnAutT?c11ZZl^y$HgF3e4ds60ZI+o@B7eB);7OdB-UKx9!exe; zPq;bz>CIZe9vFn-eDDPOh$S-VvL1`%Pi&~|gj z0IS4dB-o>pBhg@WAS5NgM*~ms1)g$x`n%yulRGg%oHPlmnGJ}7(jZj$sn$N_#gAfV z%omPg`!XSac|D0&6bh_%OEFI9Q}l+}8R|7_qp^P3>Gegg@0;;1@mrO}o-%0jJBGSF zZc0e8^tOr)j5yV1&`)N@nw3lNa{GF6s>5IT)51_-*!_nltx33egwfOv%__>9fd(*9 zlfttK&^HZ^Pt^qHw%lmy!FeF3p|AwZG|VEd&BWE|;SvMl3Ccbyr&Y>e28jTd3<7RTl& zuwL~?(#?cf-byVRQM6gTV>Z-$h%#LHgS~R0CJFMxUM@Mg>Kt!Zxs>scK&do>-fvF+ zXTo#?#8q2Ba#4I;T7G3fq%W#HtCf|k(fGCWw!>ZrDGp1A zIW`(M^Ql@z6JrHflG+H$Vq3ydy8vksaFhjlHFRjsU;0a5AcNaI81l zPrV@C@^QGLc25^h?2i@8577`;$;Z5Ean*RVP>PD%R(h@o84nA zv(Ur$x|}PpI)J%!HdNYnT#JXI%q^od?@~F06pMRj%p#gpwi%fehZVjh8?elt*+ZiH z#3q;wMV=gZ{JPp$>%0pTl2f`&_^tQu!k}w@Wr61BbSBnWbiVuxDr+Mozm`sV4~~L6NPv zF0qG75s~LFn5--%-);pmqvd~kr+2VGKM_8d>Hz#&Qnbt9dJSh^xw z|5P@E%z2D7Gm?v7U{C*<*DVv0!p>n}W_He9B&jlpg#KyIM?Ph`hg>K5brs^I;Cx=~ zU>~I({tMn?525QK0s%V@0UUexp`4Mbg|Z^axsRMtF??10escugYRkSnOy)-1N$!7% zF_k11n?XT%c1G*!lItw%#{l0=EePvpIxNf4!nZ7tquVs6^^i?mWQsM8@O^k-+Y%s% z2dr{9NQG5e@H`#$1dlX@F^X73N*$s`H zG%&N|PUN-vm|>!-i?t80V)lcpD2`PgMCzJ4XiWt?wE)kpBLN;!jyf_jaam~hvfB@P>i{2w3{ z7c&9D0ZMOes40^^$HgD>*q$(#T=izJRskOrRUrZakhsPe@7~?b>Mu!AS<+78Uw8Y+ zB>f4LK>K4hMj8}EVM?NP<0;e~?zDx^5jx<;hZj6wR*^)CouzjGZWbCC+X|~*5MO+B`L~G>+sY7Nc>g2o@Jm$Vj(zgwssrC?9X>qO{I}aD2jNYt`A;MM z@sai7tR$j$mZ>4$1VG&;0vZ-R(sy>~5ILAz6DUxxpP0Xie>7{qz4T8qMf9+sVZRiu z>mAxZB9If>KQ=fFEvN^@6Q~ejUCNZ@^F_BCT5OuBnk&tm%1$Ti-o#bz z=T~L9V(T&hNblcTYrpQOv^G{+8xfqMAc-Ehmd+o=-oz7`eN>`zB?ok_gwA#1YO@(3 zypV~idq=76osl#@Q5!^c@VEC!2M4#tK2om_tJhOompG*pJ^tW_^!W9(9y|B<|5KOu zoS8Tj$hgDXW2Sxg1%3=%JTvE*{ReDn zB4hgEHMP{9Gsu3P_fmUyKj@pT_=uGx{d?vvG*%!o^-?(86u8qqwJKcw;>vLi0ebgI z9AA!P2YKO7P{nhI3IQY?6nZSQx3I37ctU|mkagYk{VI*-(fHa!`M)6WwJ&ncSD`(7 z>pu0>ca046LNxSdXwM13$4M%iUFx+IFAPARzY4&bn)>tmVGYhnomSvzQNi z>Mq(P;r8OeQ>B)Zj0N7%>VnXotAYbmXqT6(=?fnw?^p zn6>h8P}RIuXGR88$&rft@K8%uB|ZhMH9m~8u!0?Kkcv7YK~ar zGwyGl7#UE*NaC^I$*lDz8x$P3w;rZ4XD4M2{$b;Rq0IRSfm2Bj;IFWP*bB>p!|fZN zlL=OQn&a%LyqJ-*-I7y(q^f^l`DVRq?%E(vkH!yEQ?<*i$Bh9?VWyKmC@YW zA7`@nsP*=J722)Vdyii4*3j+~f<-=~Ig3orf)~cFNG|vX&n6eVo(SU-=4Z3B-ffcPNI%1U?sHs zs^Fojc*I9(wbr|L){Rirv#cZZS|3xqnwDAW7QPLvoY%^1tCjBMN0HT9RS8_75gT6v zYxJF1-|6>J<(Y2AR%!h+GG(1C@8LeH&FK%zyKn1^3#Iv%=du50b^SiIO!%n4p035* zwFOem4cSdQSnhXUH9rZ^MB8Slqv}BV zu^}#gVT`#Cu^rWsRn|WlH8H-~sW;jy8~)#QdD*ULoVit0e{`oj6;L=DlP4EAB)UbO zrpdSWd9t@-<7++|{i{l6qNA#B9h~aNFTX$zgCHm4L@$V4b&Qn?+M9U?n)oF`(G_`8w2V`2-U)~`dqd!11 zmM*$o(fOH$MfJg6c&#+)DU3cyqW#!!6MHCn6PR52hK=4%$|7kgif>2PqSxqn^ctQN z{V(`qP891!n4ZydC7llwqE+%Fh(0<_o?PWT74u{t*PDWmMu*AsNd0^`&nePU4?)C@ zs`rD)(>-xN^{T{wl4$Rgw{T8pXaGz$p6!qIhwbtKRT-E4uKw_`eE5@mSgt>8kPlDD z2ON4z9q-78pUQ`)^@r7bh|RVi&~I(>c9Y$x-(HuusrGI9ZK1rKZ(pn5UY55?`x5>3 zM|nHVuGVkAleZ%K4E^?$yd7Z+W)gmbyye=*=(h)XW9+F5a*|j-525Q?RP=IYkp(t} z_Jw^tFLsZ8%6#^7TdwUe5H957l<3oZ&7kKs38sLCYf-JhRR5em-;MmOf6h|6XJ$L$9<37|l)}Iq zhD!JGSZ$Tv&(D3t_S)~M!3a-E7>(xuXWY9m;nfm^8+lJ&ZB#;+y%+(G;(-p8L~N~K zK1RlrVEig9eU#+wg;z?#CVN6HwS{je^r}F8VjW2pP_yUG$7isTP>Afbd;J&d`th=z zsQX_8VNBG0sZ;ky=TcHG(|FTJ)9(>ZENpbu%&=97W<hrnf+%uy60v)fuY0do9Y32}`k@3JAH5$*Rgea`vCH~BtE|T)8R_{)>DqGKK>{uET<}`fjYcB@V z<6>i*-F%MA)%sC>!#?u)1LvyWN?_#dndsa#xu_P%@Yg3HVPp~o{4i**v1u~BW7NQue`T1&lcZcrG(zw!bx%nA!4GTKvPzwJ z3yG=mi(_U1(+mE$J|oxBmO9K1;&V2iG=&t?e9ms>TSBh6OftYu7N4`~G28Ju+uM1Om|dw%S{ zzP2CvvGxmeXdW%c#Isyg6ATSblrW<8I`)DfaOD*Spte7S8xa)`{1;Lf7Te5Wdf zLK&{3MK2`~@GX;hlp{7@yUN#+wb-EP_l+M_WmN7UMy!c1VktrX5~F!lsI@(`r*p<; z&Ji7Vvf>M2C0CA!5+|Fu*OhDCZ%CW@J|dW|Qo66P!&N5`TX7b-?BDE!$mIB1!oiRl zCzM_Rs< zkIuMN2ww!ImEl0)wJ?K+{QD3TdW4!fle_XpzGU;o3^T9m&0eb{uC<6q*JB2`>&sXV zdD!)3#!}xB91B@G3x0L0)_dZhROYvYyKdODb6;8R;pssz-WOwfk!Z3;mFDm~`sD z80@Uzgv9O>=Cq7>!&i*vo-fphf3HWpzP}prVp8;o7fPN(n3Y(g9VRht#A1g#3(NR1 zukaTJL6RSb8n1{I5C;P>|3km(-*)!M1{V&b6=Owi=;|@4? z|9~xcYJdrTEaS@KYLp?-Xe{*dDV#HV!y&HFCq0d4Y$GJs7Om!lBeX~Apl+Hr1ikjk zUm}{6P)8rD5P#5C_-ne4S#OqGu@jJQn-B)OYj6zLH9FhL}y5gNV$Ix~`V3IHXrmvx^i)(1zkyudG zkM|JrF6Unl34=1{$udZNqp~H|lb4_K0tUPJbybye9j;}Vd$8Vme5OTS^2+u*jBIwZ%C6cVg{gxe^jhJg zWN`lkt}Euo5{~ovHiSL(#s2#BBiq@k^thifAtWKsH~#b<#?zfn0ZrQ zdLUH1?c%KPa)vcv?Ec0B<0(;q$T|=k<^^alRYLaNu-3pO!NeiG-!g2*Xv%= zud8(Gk}3Li9j_8|cD;ONb~p1Y|Ck+sg_`?_W>2K=iqD0GjVGkpM0gU%qty|oYQX&+ zrLW+#JcVjxC#x=-YYp7=&gJF7BWs#I4)l%{ z_^gdQ1@os@VS;{0af{Vzt@mN^)n;F4L5kL2$0IqcFXr;v!#@FPA zz@b8Z>|@DI;z2`30SCCx{KD7S?hPKa;rKKm57>~%xI{Jrs_T2{XL3aL7d50X#DfMidj2M*<9UpDTa!KVzz2>tnlN&OZQ~0R6KB&CT zcRrzUBXK+nf`{=p4;~2-nnUegO3jij#)=#oo{@_pmVCm5GlXI=>esE>(YCVjs^`!^i26WZ1PrSj9%;Y+e*bZWfHGqhua` zp`v}RR;uZv$^z)s>^poQR>ea2D{Bi=oe@d4v)r5^-}IIpN*?x%y5 zk$ya|4W}7=6}+y3&U*MBdnaR8n7Gmjt*A{Npc*dsp*>;`_a-okz?-=E#G0V48gMT8 z20S~>(_p$+!F&(jksqE}5T0B}%gcWWfnSlUX0e`T!!z>;cy%K)xaxO0^2d#sO6P{h zT^jAc+#`HPuH@JitkGRZh0eZ`Jt3RDl0+26QoWz36M{#_Mo63XX_u+x3L3G)$!b5V zUjw=9mP>VG!GG)FjAA$`YKr)@kev731X&arGwE?6qsfXG3tHl<96U+#tt3aq#7D|; zf9BH_@=5IJpm7Ft$}3XNJ%^qQYkHw$8gWYPSoEM`%PUYyX+cFt3WkK z+kN%T65GucF#O@>dY;(H@!HX`Dp81bB9qOjK!#8zlRa~SKhi86WUo0cknQ4$S=d;B zs3G-+k%vo4A7A@DQmdOlfS3!Uh5WJ)rDeLL`XiToArHEHZ)j8@hpHnBr6mQg3GzoS zQ6v82?Oz4jv@d37$SPm5$i<;{EEHIotDM8_ET(ij(dx9a+p#|rWw(G_J?^^^6dEz1 z=le*b{b3OFC%n4#giMPtG{u}$-K1flL>uThh5AULPz!~`>!hY#bO|}Sc5Z<4428WF?-fSCIu>fq`aNMV(Y@Um&dB?C=y%x|5yB ziL59!e4U}wO zKQHfG=?)%kecJkIetfxdSS5=v@60T<2rF5Hm9g~)EJ9c2BD9ETf_(z@h7wPFfarQ9 zxWaTiI9>B6lH>P<`z2;Hcv!c*V?`f7HVErsu>ct0@Rl#2mIBdHR&B6Tl^{oPJrcFX zH`_0}*#w$@VZECG>r2#JqWhiN2MV%>0ofv>$c4t0eQ~m~6M=LGq}8s9p1fbk>oGgp z)#A=xll1QTB`f>8hAw=8abT*vX(%~*{gw=sDMfEt@7pW5mN*E5i*SnI693m}#qozd z#~Xc?PC4+Q>9si^8iJ66Q2uni2pmS+ubw0Ho5oA2+Pd-gN{BwK337+u3_}Ao+cCc5 zJF9C4?zad%%V24hSr%hl0d|BHB}AJQtZFbu|>-!J3I=rufgUlj4yo_*O`t zvJ<^Jp__ix_vxQk^^dSs(!aQEwaDa&P%=q)^icf+ zx7Pq0^ibf%x<;*az8z)m6_AL*2lwg>V2b`#wxz&?-AX<%g8h$^1za|;tw0$LpdUO= zvI+-P6Z~_7!HZ@ow{t ze$F}Q=fDg{KPhtFSE0Ro>tckbhSUH=azcBK4US5~p_&_LG+hB|r%h~xu3f>MLPR5BcZLv+==JUBtM&pH48fw`U+MQ$E zeHPC+)k)%q3ZuDlI3-s|M)6UiGJ5K^MYDL(f{dt`pxb96RCeS&Sf_%1E*mNL0o+Tx z;%;mS-Uu~%?ZgB%`Y@D$(5w<6`+U9%4S60}h4GJ`!u*qVVRc2?32vP>MyCxYt>g`{ z^Kz)#8mAuov#}0cc3<+L&b>kOWrZQ`@GtRi)$rMUOqe*p>E=RBa|})Eq5^vYL&6NY+UI**CY&Z#Ezf9TKO<93-07!Y8!ITl9Ck`YK2gb= zR%7catej2p+L8=2(0dgZR`HZ&){|Fad&nN`@<8V;w!xV@EP{Lf5_p# z%RXhjVEvii*azL_V{SggHnfUvvjCe*0z9$#^1eJ8pRhmlrS(T!a zGzAkhu6GN#U%e?dwgTW^MU>}SS&w?_6eo$9QU^(Pt)2J{5; z`8Ohq=H;&5t|h2z%Z@tdUg5DB^SJ1sF(db=3(}~Fsi(;G2L0d2mL<@(ZiVm}jZoo3nW;t0W9C zX(s2N`mG+mBLZ$!BoS{!(2dVpj}o!{8dZpxIdHbQxc2;WYyY_Jrf($djJo-hBlIsv z-d{eN|I7Kmmj9>n|1C6g3zcAq5Ie*!nhi28=^Hpo41s&|hpq)M-jnbo3P_x|VCCe~ z_lbtjo~Cq$C(1@80CA4fdQ#=4^*!*8Xf8aW=3!QEZnuN`z+Mg&=-NX|}J9)|?q5_a%tT=UkGHoKLR;=U^fFv8Q#$i#X$Z9nA=@hAD2Mwvn7 zO2V1Opy^Dbh3iF`$6)`4S-CQqL74gNDx8f!44K+tpLM3k6}^m;!mj-{%fNnSZF;-x z55t-blW(<=>u(&16l5lk$1;jegNR!6Y+jMEzkrFGQ$$y-im>K@W_9Ex84Iz=fUe_w z%nmZ3zRRx|;5sWZpa{d%QnzVTa1)?@qQL*deo2mGvU$iq+y_yJC?@9t@|&e4Gjmaf zc_-RW0eV}t8&ju^xCN8!A`4K}=TZH%Z?9hb*h_v~Qy7h{^sEYQ1BRq0oJ5)V?&{KO zTr&;Ykn4BCA8|#va+q|#s3P2W+&mJ@Qi5VfDszyO%9~N~MXLWhm^3LM{U1;fo;?hk z-aB10CMSC$GgVYz>HLmBp;6ux>`u5{4|UCTI% z-WD8jX(5RJ%-^4%C-6=*{nlOxO@QjovlKb zaEEl+4Lo|6&M z;8XjF_tgP9aMoL7WF-Tq$*&Z6H8xWC2-T5U5~ST|I!P_}L|KeOh-l*RyVnB3rG5NH z#flU(Cm0S6P&@qG$ijL$8a;~3iJr&AUp=3S9($S`py31QG1=^Db1F}gcvrd_pfy9d zFbZ6Qw-=nX&FurjRr&7}#0??dEo8@qbqOOYN4luo#{lu&BX-!iH#sh8Hqa=RR#6f7 z|94odI()WQs3#F=<|Sye6}z#)sh7GUgXp4iJ7{v8t4uB%9cRpip)FV=Gqh<})rYjG?rop?E?DJ{5m?Y1XqW)Z5 zBpZ!zuj96%+9Y;W{T;~YQ$aG0V^#qU?P7*5WI9({e1qyhATL>6@bzdJ^@%gq7(vma z;@QnUge_uk4`zxJprt6af1}R@xLLSo%Kmk&ckuyrODcJ zgq{{jww(pcz`Yj6ouVMm2X?u)c-kxS@xdzovobE!4v8z;Z;Hfivwfda%iwMU`hg5c zb-vqx>S^=88N<22*rb9q>i??F#27A4j^PXzjO{uM+AohCBIF;=5OU^D(d6IH$0_nJ zkEUJh;O*t}t{3BPPf}%7I)zGZ!wTu~rI)waH33NVYqzJ^1P=cVl2`NJMmbfVnpSl> z$(x|JgpClME8PCDnOhky^qv**z?tGakBqOEU{zfQi&(d@TsS-JT8|EGSaRnq83AqO ztGRHpl2KG!d!Vi^ED@sl6_FxTThEBvMzyt6ZgE1wOP#ja;dEtUMl^m z3{T4Sg<3#wyQ{*UdHf*4&$40gWqm<8S9@jFZcy&2S$x>+eE1md1a>_wMgG#Y!9V%A zgaRCiV`#9EkS>j<|=y;^}+c>0HB-_ypJS4D!~0CsE1{ z`fcPj7S>Y&>52Nu6LPD6#VrO8(0CP7Y_mSIP5A$GLA4o@d2*T!ZFZh%Ike7sKCtm8S|q9e zgY(r-_-XYMQWFqSt0Ix#`q|Cgw%CJ*MLD!MW@qNvuc;0 zcVkPXQMuh8@9?AfP(4mnGUF{DA_HX&5Ih0;|H9uY=7b>l2bj7TcUJUAcM5vv)*LEf z(*DE6Sw;{XoRnuJk5_y7Eo{Zt<tAwv{2Hc9YA;)?IEp5s`@=LW6F67? zmAEnd1jc|6amrV-S-L7v;xD~NCgir0{NbOe%@Og`qp;Yj?vZ27$Y4Od4cc>3r&W z9BtL%Q(_!=W464g?mLG*A_l3QO4_4kU=Ll_m8t5V7wn_&6Nr9@5<9>dgBe<;7vp+` zDO8|gbt&g+#>%iFvB4SqfcQ$8{+e+wNwJxu{NZKJdfBb46Swsb{NcIs>8$YVg2b(T zI`}@eBFXkkBfyjGkJUFDYainP6cY4n5*~Kh#qgHY>bECXe@luH;4Da@7PFy4Cfy#@ zLl!{6l%UL-B=C*W?WEQJ>x0yvC>nl6u$lel7(w7lTB=uesX&xejNVz!)8}h6|D4Vx zN%AkFk7V0&ZbFjV)9GdOo}2_kDf}MEdHsMq_EqFz$6XqItRqdL15%fEk~5ly@9IN5@;mO1pxGJ}*>0_hu4Y~`@nvaKv&q7N2mfyWe zHYGK{_26b0J58wPH2#p8O{La5>h5PRTPw7!_%$gKAzeY>WM6z`Rq1DeSvAvkHm$A* zk6IYMV5FyXdEGYC{XzInHFK{^esAgR-kGn!(0!G=LT?;La-|OTjt$jM0XoDOEQyuE zBTl-MuXnQcfs^ZAe`eS-Kjz`@E8)s)(bxzO1r}Xd3Mf}-$xWPopFnN;T8AF~O_xdB ziYX$_B8`oJGZ|5u()W{{AIj{rIOvpxtFyggVeFxz%am{`F$xbkrodPdv4{$B3^T*F z4~LW!4WfLO3LP<{5p_8pxt&&`MTCN?F>kM0N2<40jvU2|k;aq}l}6euXJ5xgI{uyN z$B#@@(?B6#{EbR$OO^Gxc>N~i#JzGrOp1&@waVJ>Yu$cym3zPM?fw2~I2)@jEDz^4 zggyPjgL}YflW8ak^$hs+Px}|%(VsdqJpM!hWtIpZagX5e6*BHRUwlPn=_jgt z@bi!=o1$9D!m=zP^U=AjZ=^|qc>uBpZC@sUDnQ}9PqEUqCZG<2R{)pSCeh*LgsBlg zYGNBnF`16Qp(qia8Lm80?F5giHA^b|iymFMk{ZjBhCPqQ@M!X@aAgkx{on(r(VzBF z0-tb39EBosR7h+=kq$lR5JQ=;uk|@V4w|8I|4&eWQUP{GIF!za@5@nw0aJ0h@Yd3J zN+Y2be)UVy%(xm9Q{F2sNE+G~qOdYxG-m zbVIW|?z+K>OXDx?2p&RnC(&GuHN3{U%L}(*9;`%>QS=%O1L8TtLba> z4B-nQ>KtcpI7zEV_s>>j^&%q=9iNnp+*~w(V*{Xz<4vjIN4c-g!D9F=-pLbMH5wW1 z^o~h~x!ef^y{r9;9XM$?tkypH+6*%qpBIE<7I_bKWzX!}(4M6~y~(Fqdl4>#(|iSGXw)8Pubw1h zfdAZPLseuqQIX(T0nFUA^#n^N97XVuT`en)w+{wXjs?zVy?BRLhi))HzB9FZ}K{NUMw zl0z#BE{$(iS71S>GGN&hvZ{or`UBEq zA6) zPfgW@h~FUVjfLgo)jR5etiyRlrh5&s)q02n!g5^OpX}+wfI{u%Chk?gh!&_^fs+f& zC4c;b{wG=~yFN5SUHQh{Zjz0KKAAS7@!xW=wtniV4xfj*&l>akFG{Fr6|O7t@H^MS zVRBzpxNLx@*pam5RMQpJk>i^F0f&R=a{lvh1aN@HfgcEaU5AIPMeY z$sEao)3E(7NA`^R(~ghz?DiHgidvHLqu6a-Tz zcA21{qfnK0f_zv_1pj;LaVwT|lzTgIymSSZbbIW$#SLm-XaTeXu-8Cr5zKQ(U-RvY z48S3$xImhVX?k#iBZiD)HI6uS!jNjo&+}o^<%g07lb%_b)cHUC*Yx=du|Ql59~GEw zP;`twK_9EnSz&|9Og|P@{$orQGkyTW#cVV(PaCsnjd2mg{io~@(&Z$BKU$Fo`Xr6e+wR^&G9`1ypzF5&mNNs;0 zu8xcsZ;szpa>D7EeN;40oIl_ZI1Cm+%b`?186mC+rVYn8AhhvTt~F(P-@(N#9CDQH zF*e31{ooYvUw*n3|IFU-bN#h`{GZBkN<;fq&rHd*Ey!Vp;dUC!!Ow9uXt-ReJLuMS0UPUM->fR#pxCmx1v^d&6HhQ`AkOBk>k z&&E-mAbedXrcv%T<88pgZjST3%4!kuoSSW*82!OW}0sl}n+VYW1 z;q8#i15H6L$JQ+-v!B`m-${aOZ4+(uv7+hGI&%5YZ0Jo>k;s;wT2O_TBC$_NQB%Ci5hZ4CxT8H z*)D@d89XI}H8NO@0C@8`*TEmE7Lovkw_Tx^L8lCGur$%rR|r8q0-z{Hz`s@z!K#gw zaGXELWNT&cs0`|4Fi!^4Wq<{3ri5XfK_LQuG6MdgYBdTj@#->|E`xchFd5Xz;86rX zu@(XUT5A}=sy!v)4hR>N8}vqJ{$GH65qyj4iTKU6JGrdD_xCHi(5 zbjYAn23U7znGOU%kxyZYzg7{!sufE3T8VI%47SK%y$l|eL7fbi%3z)hrXv8}5CZ<8 zYEMak!aG)?*JUtW2J>XFR0eejfZ|aE{A;aYgq?%L_4jkyo^{%9uyN8T_86D;#}i$a z+9o(48K9<)?{^hOsqZ}~cdib}fSo?CZ9*aOv`rXBEdVh~p{HOJ02z7=8!*8;XX$Ou zh0MWZZO*YaCn@Ii;D213bEXMtboRT) z2G0clsRG<#`H}ZZ7oAlDhnD}X0;-xLx;b*1&_~@X+BjN7U&R@)ckOfqCviFdzM5@reCAzGm`X=ir{5%vyqGDxxb(sDf{H9W4L$SBf@Qe-!zt(snF9 z2I6~er~(~IcCXF$P6b`z4M*2D?={$*P*(JHg>hxc?&sMUC@~WY@!02C$Nl(m`prD zEZBx+EQB(e)%j0QMtAC^d0sfqXMK)0K0_1D`m1_2HPOF@meo)b#c_Pxb#-l)Dhi*Gxl&sH#MJFrMJ9c&Oo?$owljB;*j;|A1 z={G{><3uHKpL}FQ=yW`zuE9c-8M*_Cura!1H|Cz1%4CG;3GS5^6qPsMh4l9L4Aj(L z%{2^Huo|8hUDz7%({rf`zO3}%XQs*$_jnTZVDmmcw1=2fpQt%(i)C~0OgH$A&~IxK z1{}~9jWL@}U2F^-pu;<$_ho=rGjS=Pcck%}|C5Z;&%KV&MW}_e#Dv+VPukGlzKe}* zEB5ipd)^=h5-~YJ?0g(xB7PAu#Cf>MX3Iw6_@>GI_Z*MnBJtCb_Dr@TI&=?KF{xo! z(>rQ9*`v= z(4@%@&&fx!!?Djr>{z&1k{xcMdDhV9MR)^ja-+)iDb=Wp!Nf6nBbKH72b1sf2<+5q zCv(tOt$j=_=*zuD+#*s88rg!^;4_E6^Lsii(nW+49HI`5^kAM?qOQ=&_Q%a!uusvM z^BZ@vb-h0l_MqTB(`%|{*>Kp7zin(Nw-&1c6DT=vg3Oo?H&FiBj>_3 z>fuKE9wD;4^h-u!c{m4;TyYUdx+XYky#4W#7kcW?rs>o&atgT+gnb3)(&MmHuU`7P zw|^*rqyo~0??r=Bc(h5~RXpSSv^J+`O~i{K7)2}v7A?TT6|pE+BXWXxsAS#8cmZW_ z%BM3sBZWS0oT#*0`}LS7@BkA#FAl<7A9 z>Mg|(8S}rk$jcpPDS6q~<-aP^`!Ui+27yKR-Ei#z(|{yaHeC})I_}NsE0ujrw^%nq z{r?2KZ4;IfPZ(D#U`{^%T%0+CrGsytA#Rd*ZVm*;zHRJ~g5tSIi7y%d^-UtxHMpJu zo#`KtO6mtRN?IIS(1RRw9r9Mw9vG~absQ?X()JpZhiZ#8)V4{gg{27)U998~I@nyZ zgWVMGV28{R+0x6d6#MlP``0;^{&iMpQx)YcbXVJp>{8)Z@Wfsv-oR*J%SIggDmqf2 zQCMs>J!E0&5B{L|RC4ghI0v_w5R-!ycLq=dSr}_j3&D}gFEa%VWl_#*402E(XiW<3 z_@>+ho)gMNH8~vai*TcS4znvQQY*|lih~`|pV-~4jr|vYQe!)?k&?$salM~vN9Y{Z z&}`@1@%bTbYkc5TYTk`7&!B6TTU$yBy>C=Q=>2FI4g&EF4EZLTgiNZ&g{X!oHhTt^ zwd%*eH$$*UI8QLrkH4Q_%tDzrurw%aalXKn(GaoEESG#yGu!cNN?x8ELBNdgw)+H! zu8@cg1mL~lCSrl_3JX4OR&a(R0_zWu-eMvJLc}U*em4*{MY8-K+PM)Kbv|FB{^WLn zdIKz4ia2I{)8UWat16v=2Vq z+#w3*t|l*A$D15Wf9P*v{RCdRZAGjRlU;I6{oi;C8#gSq^j?Pvh3|W)Av)}0*j|MS z{lnmBXwV+x3hRIf)%p6Q@eum691brv)#v?@i$s(CaT#>lukGH)4{!b&EUVQ%g#Hxj z^2GEeH>AHB7^hTrwhdlr_kAg*E+hIGJPYu znzFr@=)r+pVI2+Yy*_$EUL;SSjq6&9w&=lYr|bSw8^*ZV*Dhp)$p0n~ViPb%V_po2 zlO{2G-?1PAcTbWAE|Ug0aqQgkqGL%!fV;)=vtshro8~g28VZYc+^qGBKc9#L<{1l%O)j5f2#1P#bj7srJB&VMOT9*OHEB;zJ^t z>6qbr==YX`72;h%Jc;pOKbnT)!J%n_v76k2u~*!Tjw9gac=4))-x%p)pS_iEp>Oj9 ztItpg3qL8Y{}a}rB|Xbco*ze^g7-y&k_DbBQ2vF2-%WlJ)3Mhu9osKIFg;CU93rS% z2JM*TX8MMsEywFv7s1GIDVp0edU0OlLVY%N3l+5rbpEk6czMpAun-a0&GEf!Oq#mo zu@*@ZasY%7Mqx;0At0ZhDrk1>5g{Nepdcqu7z_2g1ZAfDPd)$beqV-lm9)nRqQ7sp z4l@7qzvuUNo%nm+YqEZi;NKMo+yB$rXbUm3gZv{Nq|6nwoD|2!QWK;C#Z$$eVpv~W z(5c?nGc;8%IiO#+gafHO#SgNJ)4M;f%)m@GiDAEcPl9GqTfi#$aM%i*HrnxMa`LA) z2u_}mBYMC8d(avG+-Rj08C#8S>PSD!urKTM;$5hdd8$I_>{Qj+Mz<6yHnfWMw5Le@ z1%6j?jY6XSK2QfIWMi8%F5$w=OJk?zZZe$0vaS$Y0U*AA{Nq&LA1_e!*naXmx7;Cm z?61C?&||62oQ*RSSj=P;qdj;!aN@iZS(Jt&C&k5W&DRTJ-8NPbYibOMl!rUL6M5a! zmoN$G!Jk;wyvKZ$9*1$L2uvDRf%;tCO4J0OygNa_OqV5{d8;Vt;Piy*DtjL1*Hy-s zm@qwv-U^(!kPq~`8ftl?caVQ+vCY>H(=QCbnBwn=Vk7i2k!;Uu?sf?@a(m|CkOOia zqwh}`R}nnFG^9<~?3o?HTyzu7uO94v`QSbf18L4KFZywIh5aH-!?Asvkj3M;Y5UW% zqC>tvM9zVi7q;S56n)HeZliBJ-L*2EtF<5ae3!X|skRQeOZWIbhWFXW7>q_?lcKne z@(2t{F_{X#9^4g;+HkxYf1PNAoF56&>|i>f|H6Lx7bL+NtMRoSTrTME&Bin!+czYF zg?Ffu!@SWbBcKzA(f=&6&&3cOAlT5*)G|{&7WziyN-qG-~8DDixIvpoh?!92Dq+Ow@fF;^gwGIG(Z=e5 zxU<81rt6A{h0Al@IGhbV%xw&=!%@1>-{p>1A#2o2_zKh76i*ACNSJ34gXFJdt6BDs)Dup`S z`Jf!}KnQpWq;4tfl4JvKx%_S7#L`l4QUMfjER-*mj z+k*DnVI{L-gj1$>5H{7xTbpjaHA4uFOqr+O)1oSmTJq?|Q49g7#nvm~^rV%w!|1tM zT)tIWb2(UT(B0p~S7>Eh@Fk&_n4PD@#Eay90#oJtimtEH4~O2hU|aZ9{}&wnn~hF! zLOr5B>)8O08^smDQaGx97yWU(#UV*3m}V}AU}{N9*KcuBi&Kpd_le63xX~|KLW`iX zi1u`&EF3WuzV#^R1j?4G_YxS+)c7@p7N=slfRZWK351kT=gM91B@ST54Gi_?eO)^g z$LowMa0e$%uUR^aW?Xp5YOmhSS6bO*;2&{xG4nuQN6IfO|a?W%{dk3w0> zr2ew=&IF=C2>LWJ3P6mA4dO8IT=^Wu+4vt^BYMiE6@opFz?u|eX<;83*Hb$xyF(~m zVuMK`Z1%LfnEfRZ|E0=;&DZ!bE{yJG!_%!tC+_h^d1OD-cXEoheZNI=b|<))w%BBbyr@ zgC1PbhCOB#@LR8cKtw~Z9npr=7K}v_hJ`B3Qz6G&#&-h)!;lI&#pOFCKSRz|G5d7g=Jdl8lglte1#09uQ+aYTpi!9S14D3^4UsJT~HyjzYX1 z<03G@#CGLi z|Nj5uo~=u5KNVZI9+|}xc6PuXa$N;Rv}I5{W1STb;0F>B%aLHXF-o*OQ;^R%%r5G( z@PM!SHR{I2RLo|uTk~zgIQwHX+N4`}x5-Vs+K@6_Zh@b9{DJ2}8Lmgh&shEx@+Xf! z*(A3O$QgD54Z{u$@~b5Rmd;oJL$=g^kdiwJPbQj z*sj7xhG>U&repi4@F^9pQQ>M8)~IkH!o+So{GC3YG{Cbw-T62PLWI!$QqQ)aJ-DM$Zf?O~VCJ+b}h zAK`Z#@8L0f2u|1p^JdLlMr9|@9D0>v_4p6O=!}&j?rhD*1g(b_{THn0q%ey}d%c+7 z3$=#kb756T&@CncKc;bxwRu|Yk3f3*!f3U3;;ACIoR)m8mS;em*da!H(1|oj{yj3yidUEa7(9wzzU%j{U^!RoKcrKUtp=?1u9**O z1)R>8&mjTI9hlL<-uwHCpiivm|Hc)(1LunPup%Ed7aZXNRFMx0w9BY~7m)TKtV7ZG zdM)sBy@mcjH)4HXd$1B2XMCd6`PPFKg3H-Gc7uKQ8ux}Km6S=G6&fJju5`N&dY>%4B4ku~h2#+4)OY8c0#q0&yp3+0OY4;G$2NGX+ zAaubuX-m4eya=$OL*DOI*blm|SdhPD6x96??t-Fuqcu`a|1G1@ZGTxW+U&hlUx8JO zX!QpE=-Sn9LH$Nc;uOJYPMBxj!Nv`otKHO*VTCUEeN5!W`ISBjI8q2x zp*U739@vuv?FUq|Z5l1uEgI6FFxl06k-Xc$4tEl)`(ZO^HcXehuv{uu1aSZfh&>8N z_>5oL-W7$}4{Q9{*iD&j3!PT35^YwAHZ4-<-9Rt&wXDtKpbOTIcYFy?C1`Cp*|6rS zMew-M9%*sbZFU)lt}dPb$86sPB|DAwO?|<~a9{Zf#v-l*-T*;&b#U1qvqPou!CcnfWNI%dW)qYW8p{wgzOEyOG}QV@FZ zV&#hmugdID$80#bz-b}$4j$l@2Tvd)1mYyNj6AlD}=t`Pm`F6=&oTDaFG;jr&urcJ3FzVc?7 zus|k!6dTu&a6J>MKhEbY>ER+pL-OA*7l_ZsX$(kTXGzcfq^g6%#}w;{d21cM%Fv}3 znL?jkExeyR5nso>HSSh2-$+=;4Nh2ytyO3>T9oJMyjEjI3r4IWS|^L&;!q=OwHOWH zFo6|Jf5+jr2{}LyXR<;D{wL^EZ>W+>)*0U7K^z+itsg%JNkb34Ay!{GYDTMp z`&!50_O<=xN_WefU>`WX=?2!#?<);hH@U0YX<6IZm_pASb4*ov?p90xE!{V;LK$U@3uM+8d+puyFx znT56}$`a>Gmj&k+WXJp~Onei8PmgXMm#@`^F+}6y>-q_}Tl_1{{~libU!A7~u45&4 zqZ|kpp4JOA%*|Xs(N^7sSZy85mcz&Y63jk3=YHM3Bf1yY1l)mf{p-2D;Yf^4gq!_VV3H!sf79YN{AI9J?IZ^r- z)aU#P_l(z%(s3qBdw4fyHY<>je!Ah;@Z!fyA8|WhNn_2uwt0}=^*LyE?B)hUw{H&P zl6aA&265qE;YB2zkA$KE!cRpj+tGiDOn$dn0;(RKuS#%);qN31M(c$!1c-v2Va#;J ziOn(pLHMg@N6w7vr#uuHQPHhfuE`dwY<jgIQOGn$o-2d&HdEuJoVQ>?U;(*(Px=McA>}_CY&89TOs`g zkV;fwYxbpPf$iv$4Vai_YO5;HA-D~p_SK|YLt`L2!m$c{Nt2PQ-z_X>LUtfKMPkzaN=&PbfoR!Du5+(&CC~pfN5iwZQFYwD7+WY4jC+ z#aB2r*S4NNIAL^`9&Hgqat$hi>G>>v5_}jjf{DQ@G9oUY+|j;3pw(W04;8fIpi_U{ zTmGXJ+Nz<5gdX_*!=%=*pX>I|qx<0QE!O66HrN4N#p>|p_?z0xO2btG+nuAn+QT@>V+bvAbG-)ji@hut#JtZKr4U{8az#>NWJQLFtG5$%os z8WMM_%?S+&u*jbTyMSM`TKHQ;wGAj~FweEPRcxd$MKN077C=N5qPQbg3L`8{M{(Lq z=HX`8LXr7OAlEkRLsk#7?tr&Bs;ULfXQBIev3UK0^h;G{V+U#iy@kH+<=Zw; zKJfdw6C@J{2%@t1W>zzt!5ZN8EBX3&j1PLfAJvKK<7t*#PmafQcb8s2Y!ogJo5ghx z>^GVfYJhk%+gPjZ%Qx)G0Us(3=|Bb7_7M#zlpW?my*Vt9Q@K+$bmd~+++xbRC(vP& z<=t-(2R@VRTzd;}rr_dh>c`Q#V+$=`E^e9-T-*u{4UYlW2_0xI4n)FkgSu6S(AF)D zf))B`0Xm1)Pu}D|a@msebd0P{klcyS{oS_3!*RcXM;{!|oo;?wclbf}b z+ye&Fi`x$0p2MNHu;l15BKTTfp{NDc0vetM-Y{C#H?SlvFgpvMrfPf-NRd$EyAT2E z((jQs^e|*^ob!H&Y{{HA2XUc$(TePiUCsHv%G#Yvujy)b_{zJQojxZzC|cJywyW9h zyQHfb1N|7tP2%io#^`@FUc@NQ&APg=&7FY?nxpvlMap3q=Z_XH83OkKcLpZM{$`Bv z!wMpU-DsU`NF#VQO~C`M?KJGv-vtX&5X>st;>6*@gMybltb{Pw(eeA!?*m=o4l`<9_CUGRPc?gIn?|N_Y4U zRN&affG8gox|0=(w&EC;WuJw4R|vP2ZD&V3dJ_)1#6$RM#CkBV%4bvj5NzhQzh8vA zJ;BTNv&!xJ!}pPYIiSUP?y?j-$6eWQt3%uC@awn+O;3e|VyF;DJ0oz)>lfnvrH1Fc zdEugf)5gGz;pN~-tNl}sk-T-J_E$jeZ^WeTsJ7}M79{d$wSGK@KBAy3ZGj*MBXRNw z-wjHpI?t$CQUXy4_tekk`kaUIBsNi{0Q8740q5E2WFm z+YfTtV`Tn=9&Pp*A)H;qA>4`c_OU0pSTB9gSEkpG`G7U%9cdevDj|3-rGtGpJv6Yr zq)E^iE``uF_!pZWd5jMugG3+OuSc<&xMa7`4&`|C5OzC4EFBJA_BWv>*8Z3>4_Eut z;!rSK_yrO`0N^dp-tPg zY!q~uuFw}{U^stEbkQL(Q^h?|)LjNq-I4djJZ(qq^32Hsc1YrULmWi>u|50>#@%>7 zeiJ!RpM+W3Ym7^-6+3a4q+A|`JvwjY2fAF^!!MJjyy6t?A-=a66%AdFF~VKC8J?K< zddUV?*Lg0S1zjQDA>*A8y`)fe!UM7sUdMq4ozQzdMtz8g6@e~z|OcL@4eV0 z8wb4vl5x;W;tJhxuu0CNiUQ9CKelJu!XEHtVoIrDVo8vkEv;X9;%s0Tec=S{!S(Kk zKVr9p=EI?%$0wp%U98NhjKC!raXAQww;oKcf?(n0w#e|rnu%!mTHq@%x4@{)twE)` zw7?=%gQ%!E-2-ewnt*Oz*y~~{S1(-dF>r#_`~qjZgK7aD4n~s686btY7RUyE=-aiQ zqlrW_Ufq_tmhBuqfS6c&U_)PGdtBY)TgvLjhF`Vj!BJI-c?x^vnOkOz4L^!Zi4gZ} z+y;Uc%MLFS2vs{=kgN$6@H#Hk1Vq89ZAyEhpK+3YG}o|)cVl|Sl#ndfn381x;#*S1 z*V)5=5b;So$LfX;z~;6)a+X*{h0+-r1|g6G&W=XT6>%I{VAtLg`t;6BD3qv74s`O7 zjs2S-F?iZxraFp1+M%)Qjk?>4muV!lY^;?mQM%=>S9MG^Y09nQ%!I;esx!kDStrVg z{2bQy`^JlfgULl)=NLbFgm`n|Ej0fj$SW8ru|$3=yiGCtT{sMZR@RAx9Xq;UK-h;R zhv7_{KjL`QVn4@y=v?WquSD7GsikmLf=JT*Zq$>XOfJFgA)8lrL(2q7r0l}6zh6d1 zn)VFL$8po4=Zg85eE4UYk_!FxA_%s|`l@#S(E%=4W{g(R{I4XzRK2CK}E0`yY<;K{|O^^ zB>LeCV0WhV?Fzq+Cm}yM=Gw~YXFUfK%6UsJfUWm(RKId|!EfF6H(k+>An$UZFTH@# zAM?uH-p9jF1B<`A*!NiY7kE;DMsI!i5xjy7u%;oJXq`3D=~@6Tj@aa|odhBza?1;- zmMsE%1gtJe>2{8zq?8ByA)1&$&&lY6mU zyW8%|;03SIM*8qNxW^w08{5ku)U#c6xR52fIng4a)%%s|@xsSa^xlQ{@NVD~BBTro zG0c7n~tL@np;I0t(JyG*GtGN$>u-$rM5~mTkG=`#zFt_qne*1LYO-# z!2qqTqICfhALc*arTNby{9|AMO04GB;^0gZB@|H-A^a7->;;SgaI`oW4&$ZV*yh4q zq38>l=aFV-_SowpM@i%OyYbxBiR&_{U4W zk7O>RecUbHbHk6YL}4OEYJ6~|SBv;uJWq?Ik1O=ufo2hHTt+n!^RzJ5L8JboU5loh zy~IKUR?-c)EFsc@kR1ja2Dd|S;pcMxT*@CfByW$5=Fj>3Ifp-^_>;?@q5K(y54{(P zYgcH(INVAZeYK+W;G&4DwG8*F;L<-XnCHtAN(wEKC3M+Pb43yZ&v4qaH=T{2&_(#c zT8rgGSAR4g{nX!f*dNV8H_gT*tSNTbAJ#O*{sQ9-7hG1p*4AZ}cb&!?*9vej(zo%5 z%_UGRa7;p1v|ZbT_1@?k7-n%_tlGRd0%=0Oyj@)Q4%h7Qn=ZtagQYiOBr>u-{}RWd z){p-JLFjxqT}1xCB~+}s7se$hIzzs2m_w&{cUi$;?Kw}u;HGf@n!SBDd<)<5#sQq0 zLOJRPT`~uzwnC(f=e`2D#c8vJEupge-3n1Vk#&cYe)uM^iGs+0hcwq`T_oY{;XA;$3GhVu8?P(B zv;r2>`te8qewwX9EAPf34mR&uq0tVme@#J+)!nUX*JzklN4N1ATzSBSqr@j+V}UUS z&XO1ewc6u|;z=NwtkTTof|~(8H2|NFX?TS*1t*rET=IOw9vrjQf4q9hc@yf!j1eLh zzP*8;BXhVfGK%E!`H|arwW8=txBu(RMPshTIp8>0GQ@F?24yImo*)m47e)*e<+~wF z9n(6$;^Yx-H%CJgm`P3)SxoZA)IBRoeVk_UzT3^Qh+dJt)wKJMerC~_M`@un4Q2v?R)xcVgY(x+Cj z1z}~}p{}qG{}p!E1a`6RzvGOz{>%?QC+n5JTXRo_&3i#8XE51g1U|ft!w_cWjrex> zkjbMv)xI~VyI@z0^@Fa@p>|OInxF&X+L3{hl7!k8yabdv%k?}l9d3n=YV%#?5|;9z z%l~1AYsFWMK6p$+dw(X%i(a==n{TfrD~8I$bNeI}n4#G5j(qjjFBF2C$L#B2_l2y`|-_M4%<4m1l$;FcLJ*exkz1YgW(p#aEo z)_o`P>5Ai||Kc1mAU@wn(w>hvd>7)#D9?8=ZYbmOZHp_#5r)r`0>v|lR#P`+ zY}EL?=>QId?(XBgz>Ms7oRK-WdEV`B{MxI@_^a!N^=tauP~-Fd+v;*>w1h5<)i^vE zwA=16Dmyuifq86Vx9a1!`FwjdH4o9^QrBI`_SjVQabN=Ft5Ujz|9< z8`4(CMVFj!w>6Tpv@F%_#LO|w{v`Ql6P_UWV(-&ez5S)cNa7^4Nh~l&Ll770eAX_h)1h1;w90;+Pz90`F{NdXo7r znS|w-M_E9y+Br=>+$KI{nBLYVbRS4uUB^wW_kTAU{jTocdwjZ^^W~ClJWWf8bUwlj zl5>ZWZEpF955nWyjKw$M@f|+mvyk>pKH|#|D=>fWVn}7RI z4IWj{5}J&tL~*zsha=M`4^x$GX!#0bi-&VTwETEGPEcCZUo`!yt!R3g@s>Go{5p?h ztiTcMQ zTRC4oL#3RI$m%J% z%s4Z*BV5f)D~{HnVoPRN^G(gi+s(!JnKPmhzw<}5sMU@n495n89`#T!-qT^qU@`0G|z#bg?w6Cj1KLD3rw!=|FF?h+H%(nd=#aF=Km8UhP4OUTw2}( z#r$BFkSR*_$Wo`sQfC$yvj`+C(pf|mirV2LX@bI385QS35i zI*x@OL8Loaf^#c}bh`~q1ZFzA!(1Y9Y0r6w9LMj-xh})&IF8@E@NEEeHRt&%vCQNf zE52=ti0ZT2H%wbMa|DK~%j#z4Mj^4oxT+l|)XyAoTzl@axyH=g<8zJggwI1{@T{PB z#4+P+!<&07JPZ+f@GKa^MxaNXjhTOLcUY{)8}I2wMVdvyxMX1qjbh?YWznFk7W$$D#-`>H%Yj0<;%+AhJ zmfMM6kLWy8L`RyL+emi2wG&);dk22*Y{$>tjTQCoM!o(Pr)2q8H2*Ugmt$-%6lXEs zOwjT?_8OK@h7u5XWO-9$=`-z}MDJ<@Qa3SQ$1=X#N%Wr5R~9vfX96#IVGNfX&$jul zrsn4EYVPC1^^}4W29p!&w8$961%nkAXpwIOXO1`)^o-~RTO2byxfnnXWJjI`V|WB( zcyf=;Xt8!rr(o;!-EzMTwcW2f_*<3F-+0g5to^w=d^3EZtO#wreEEJC$-Cd(&fn`g z_#6ND7Gj*4s3PmeXBeBV!t^a)TiJ(9?f(Rd_FkCN>Ga95&Uujm|aUN^ayYP!B_%CeN5y&0Zv=?)DxF2`M-LUhTC5-a~kXb zQ6Skr*NfiK3P)&#`?SIzJG8=^^R>b+w8G`ZbG7&0!v7xpzlW;qLRH?tH{u=;e;YWu z)d>pR)`+a2$v!+UXeR>ZA`(O_=>R5#)tw4mGAi%0sx3eT@2mV&{BIR>9Dr}(v@~!I z9sq5{|LX}U#xjMraR&;xfTgoRpgH+lA@bXbJ@sdPx~Mzqo}KeEcYV&l=w7xw+7r#W zU@9u9D2vbe5nh^+7vvUA@4KFiLWT)vp;t+L(Ehq^$K++>PT>7T0$v3-fj>zC)`Dlq zeyyN(n?qr^F)0zhVXxsME#1ia zqP!U0kO^dK!=+efZcLM@4%cz_v&ewC!4Y$fT)lph9U5jC8Yl>HqSY?h09i4e*@F=nGYyaOR4fDxwtN&OQrVoU=1E-C;xYcL`OT+|)%@fwOwT1px>r16wwT^ABRmGVyGN<7Vo?4hb@hoBdyeA>G7(ZdYr*OCcA9t1dID7aKEN4PK#>P*OfPHj< z1F0@nsfL6HA(gd6FdW?@J%wm2kFLW;l~jp?MHaOPz(Ru z`d*-gS6bgkY2mx9?>Sm{ZtNXH^)G*DC7iW(We^Csxl51hETzqhUPYEqkmcIhIew)O z#Z&@}pRzqn{R8R$3F+4*q&F2H0BcnFab%*AN}IL&u(b`F5zo9QA?s?}Wwk!S;k@xm$4eCY4HDz_ zk!pA$p9vRI%kVUJbzI*;A}Bf4@DlEZBMn9m%7sMz2T7o|RA*>`w`3CNJ4zn{2>MPn zyh1k+6dPYG`Vo>q!KlvC0>4m6(4NWq5)whnsO}4=5hhxls4oEuO`^J=7MLO{0R6<& zp8$h?R1H_uu@WZg5B(*sPa#QvBNiRH6%q|Vq5*PGjfGgUKPKs0NIej# z2Wo+4n2o8=K_9c|TY%>Po}&eRYr>QCEu_GhTs;WBo=g#MIRtixvQB! zS${*Kp-41T3;bCmigm}BzGl_ukQ%N6)u-Y6lT(8~h(A%kLwYE2)x+@py{1?C9w}q=$Z2ou>sJ z>@~g87m)>r8CQ?g0y7e`kUrE8Q|XV$bUHGfj`5P21V5SSd+L)&eFjpWf&LHY53~Qr z)5p|PrC%aF?!j|=```b7N`>CZy?v$VkcH0cxd zQKUZ`>Ce^zhyohax|dV|rMpW`~e(3G>CiJ@Q-Ui~TI~#cWwV4m)M1pGnDEt2bV$C703 zYGYb7@!bkWdLtKI)sn)rqwC`GXy$-YOUR0~GSbJa*b_t=@ zm=56^?wcduIPc->jq-JgsEl^sMEP1>jDF?>QEhq&E$G5_EwDX!22u#6{M+z?2WT^m zsYFlPwZOTu8xWBsid`>qS}Kw(fTnJydDBeuicHg{(7>)+zf6PLMXNQfu$*cf=I)vL zGaa~eCQcqS5#?>t_~bT@=p~KVinjMEHl6=S@scyqM`9LsP7$~RkITAnHi=+~UOb?h zaMZxuA*vTOx!%~v>Xe;>#AhHeG2tJS_;e@!cO$VAjr>kKu?-LjygC~EogIwmFC(go z5wVjIJOm9{raKYw1|#~(2xk>e7G&qWv0m ze@NBMcMa=<wn++Rs?54 z$4zIHMrc}S6#w4!t)C^}mGU%Zue&P=sK)2S^{wlY67^i)x;P<)u+Kr1k4%WQ@@LQW ztwYljzTPr>ruJ~v;pcrVtp&FU&Pk87zO;CuUK+mej?VlV)}-4zQXY` zZlA#$>nH3nas1HlrTs;H*xq_NEJEybh#n4j>t{+}8i*Z)() z1p&~I(-J8FJ?1l^!I&-(*nrvVXrcEQEoi?-Et5wJ^56fB7ytXliz}uiNX-AR@!~_= zY!e@clE#bHBw#JY4R|rZAL2JjiF%F~)d?xg@#6M`*b|Qzk^{)ePL9tKBgv2Fi%|q*l$R6DPHs zlP9AuCr?IOk|(2TKAnh%8yyqsvn(0UJ;`{~d^!=&rO9~4B;&ax84u^vYX18ZR6*cV z6Hu%lQdG(*?oF(pImH!|qP!D zzcUlQClaRjpZSTI@Hh03Na@fj&3f0F36~0r{73rFh||OVqy1-|#`mCs|6Tqw-(sij z;d%-^Jjr$D5#g|rVqOmam?7HApMqkjijRFe=79>(Ioiq}DbQsx*O_0!btYziHhnSb z&;0zFMCGd%ybP>LzhV;!dujcdTN4smy1wXt!iHt>KmAogYN2n@nhRrZ+;`?VcuAP{ zE-NvRDDFD*QzV)j%MTpNPZx>et}=HpQCt{tenfwn%NVWZoAj4C-}(-JnGx1^_{;RQ zzQbRp3+@XtKWqzIalLF@OSP6(md;;h1c+dY5lWrigrjF(vV z9dMR%mU$|Lzl5}(AdT{sc_1+j{ArZGFp?-=ncJDf93N<30Z94ER3_%e_b7V{k|4 z;`Spzm2b-&OZjno65z_0r7R^J_9Y}yzANW23Cp+ImjG72Dt%(*TkT7LE8moT^mGvQ z13YG50$ll`G^d2azJw&o_vF`!&Jw0QjrJtaB<3K(`2#X3-xHoSm}o!hX@5d$<$IFK ze?z8^p_kZ|?@3N#mBjafMi%=Na4X-Fj!f1hChU~_O}1Adz4ASI>ICWI_A8`Uz9%&& zNG}Ku;XjRQhRXM(Dnb{U z8))h$+PZ$)y1_+T%!d1~I8R;8aMk17gIM9-l97PW9H0C^i75Crp z1@l&IRW4_*D-KXlCVkG;s!#_D#g8cTJQbPnIoT?**!nqP%(r@c$Tk&;Z-{@$A5`Ql zM&d^l^ni+7$VmK%$lDO9uV`gu^%ZR*!1)Q9e*rgAlXPQ}zG1n-;vg3M2rRb}i{C;x zlYa){+NT799UzU8P>xQ8aT&$iJw_Dn{Z*L_Vw{ zL6JCFd@6DwBk?0r(y1K<{elER{Lf`5K<6pYY6X&^03C(;&s=L1NQMIRx&l3=Kr$4d z-zZR{0?AN-7AsJ@0?AN-$`zM0~<847P-hPZ9+&hD|YtsBLQLwPrir#y`x%g@9 zyNUPVrMMN!QZ1IcTFYD22$E=dD;WUmzrA!yKtbR3hOIq9jIw5^*{Bx{4%KVm;(3Q76hlrU&wPKMAVzRgA=sC~m$;Z|Tm- za&S!ISFDZ+!b_}zko)75AWZt6QdO#hrQ%1FI!Z+*d`}d!6IQy|`aPUN_4tw|6^W0C zf5~rET&$X}_*Dn{Z*L@ra2 zvlxjV5qXn}T*yfLh{&-rGL>8$q(G~c)RCdcwGV?N>YPe0KBquWsa!G?xeNtrR3I4& z&& zRycfV0xQsd(VIMsm$zUWo-OhaZx(rox1RFwU-7vokcaaUtCK<={yR!vd}%_-PbA2~ zzl}*CM7&R|re`)XIuzIOk|k?Yi{_7tkBX;yS@R#XM1}Y8#T?;8yN0*RD7HE}I)gB8 zk435u5wtQ0KQ5lz+GP}j@Xusaql{t@t`W~|Pl=$FL1ZBitxBD3(mTD~)gRN=iw zzB7n8@kI;qkqaYGy4z;qX;$PyJXPVTD)J3HAw{b*l7}Zjj2>ZdQYVZ6oqB1L78p;} zH8`mo5jZ&u5f>r?2b3v&KRD^{fc#xRh5{0-JQkdEjOiRIon`vwq+FZ)5`Lz>)bJ9z zzp2x|D0Q;QuM_lo1I`PHfqtt%dkEUou*U*g1rVzCDJt-(sK7tSh{K3DEFx+Up{<*Q z^OUAWi`vC`6O+CG^a}yywH*nc#v|7GX|XD=4o>{Oul2zsvp2NcCX&neIWf(|qsuz4X{AP>eH-1Zxi%(!`l|n6AJVRL7y~yVgWq>5b6_`j6X+&DH+3S@FK@2 z=6n`E)1GbMkyR!WR4B}w3E$iRqgf2}Z3TLZptl-ukX8(ot3V$U^l`(-7SJ*3WWh;s zN!1r=;~h2=Z)h#yzg+nY>+?**GnVYUD~_=*6Z6Xr*q;?E^tTH1CP8mDylDZgQlO6r z`l#U}3rHMiX&syC5*)7&x0A%`^B0!nx*z2K&W4Q zY4VABnO`_7IPxcCD?ArRu(Os3zmI8JbXC$p^hM;)0fGhMgu#@xJzdnc2{V-5Qg%A{T}_V2@8g|D){Q0} z)|2#De3Y9d!AITgtmw9QMW01}q&u5=RE1s7gUfB6`e}AIE~A7w-3|MJNT&S%=ucM- zf5&*;7N8qluDxMTNBwJ5Es^Jak$c>!L;l|Alaq!%H!^QBeV{gxKAERVpUiahIY76_-uNeN?mt>` zC-P6{iRlB3i+5*+XCi-Z^ck3jK9@3YGJT*{lRjCeN}sHB^x4Mc!rthUHunRT+==w* zI5B;Iaq;e~@Hph}jXnd?&}TUFCesJgF4Cv(snVx!I{N&c_MP77lQ#E!OYTJaG@h6~ zz_@sK-|#5p?~OkF)6nNjSY&$82Xl1Nr{Ag4r(Zhy+)pD>Z}dr<+hfU{NS~S$(+3zA z@9q~q2CGYN^nvn|a{PLWd6W4EaimZ7snUmqq|{e_2#mebCvENvEx8lvBQ7XOKfVLw z;@#Qd_tD4Pz!^vO9@`cTPANuLAIIL$9iOP{p4|7gjbM4!$R(gzq9 z@6HL&ME>6BL*+CTeJ*9*Wcom7Bz*>*Dt)M=r=$<}JM~JRw7DO!< z3Xenn-sr>0O)B~fXWnG`U^YPd3_ex*sM&B&>%i}6=;>{IPn&zbC3g~i8c#?cU|hU= zaCj8*_eLLk8v1+*QuLq?W|O3kcB=HDksu}i+z*7k(kD%BAC?^D%r>%8+KEs~3*8S7 zH`{7XM4#QjxOkU_`MUQN)1Gs9C;WTr%ldcf_2aPhW6WS&ROTHFi%pz>V!x8ME@uQT z1j~g1Dajz_gvoj^TnvS2Nn9vI*U8!|a`}lzajWilJmEH@WUCXlb`>uvJ2k7*PFyZSv)#I@|?RX+jM1F4aLr;55I(yX*keB=(|G4`QBR=kKJ{aJX-Yr>) z_GOM3+Cx8=Jt_9(z1g(h#*I_5ZEfm%P%mk{skBnCH#`r<@T|v^*;m5c4;Hf*n*BxC zyKt=ASA*|5-D>qJqtz?+QL6Nq{c9BPTA-(7|H7r0N%S5HY=YkX`H)0!NNY--WXo8r zYQj!@LVBmQa?M3eB)wPT$)uAQ?NiY^EuOPtcytS%)btkiGtzs|Nzq%`)BZTLcY3F@ zrv;cdfxmx?7(wq}@*#=d&>l$dWJ}vA&^xWwtP3`1N$-3V+$+7);`wt7&#t&t`~B4P z7WO#OJLjb6jWTJU8wb3-@pn4=+;HYip!c^CBj{bkha`GKnXpCK;&~0)sKnE4u~Mg|x3CwI-UCjG-pYPB z6L@>$?{xOVOPM!;zpqD(ptqY3N%T%*Sv&=Lr?nD3j#-VQQ#+n|rFU99H^=bQS@5K$ zx3E8w-u+LC-YApy$b%2X|1ADfm_m>4xYWzJ1rh=1(JApr-q3q4ZUe^CB6He z6up)G^)YZ=Z}g_POEq3{|4^d*{wZPvy$wDj@i*Fn@+8?ZdkXYUYi0cevP#m)fr3ps zrPWW;;`x6uJXkg)H(|W|24V!gNAe+w-ViaQ zce17T6zEMwDW%QjE{w&J-fNPrZde^iFF9?u+6iy^HbGD}SfO!%N{Mo)Df) zJZb3Nspy??QuJ2#W)JZ8#^0QdrK0zF%$va9S0hHyyOa+}^oE8-dM8_=Pl4WPt;%%P zlyqvulS!wv@+2*u${3!d7CdR_-J$5+=cMSZ?AP!AJM7obD*JVuzjq==(0eN%lIRVU zob*n%Y@Y(XVN*^mPtHeilHOH#>XqJU@%$CmYKezu;G1~T(7RF5+kR5?MwzsS)1KZN zf2XsDmoskye}5k_g5KZdLlV6)^CP{JE#;>`?=)6#EwB!#C7n9(WYQ@uf2YCYTO@G^ z-%n*n5A!UjIDu#%Z?V|Z^D6?oy=Pd>gXPKTg?)GNzsJ7rE_&mxfk{U8`2PJQ`+8e5 zDi96-{Ytxy26rAs8Ql{90Bw_Q*Q1Srt=`Pi&wQV?xTfAvr5j(kjpHRtqx~4a zVgSy!b7_upTy^iLaNy_0eEi&0?9zs0UhEE*SGkR{i>sKziKw!R`8)Gsf~Q=JltVlh zJ1UGZ7o$Boe*^*}aW+29V|)^t_0PwnT481ZjzvU;hh!}U9kd~XRv_TVvwplW!xnny zNl6xsB=^5Oc7|)F>n1kOO)Vhb_wVS6mNbSM{9i{yhgN$G-)(`aTU^4vcL) z%mLonGg|bZvwMc%T!~jVj=$6gwz}}S*JiMT_@ml-3MTF9Hobn(S;r4Y_1T##bUS^a z`KJe>-pgbs`6@CL`<=kMWA}o)j4vtzUEX1O@SZ$RaB(5ieHc0mkjVSi{zA5JpnvGb z5pZqhd4(uTH_8gK!3$_pywoo%$fO=)+aPEgypCJ;yY0U0pr;^H+iDEtoAz)cvggR` zS9l7teSJ}iV@6Bp4>;aIR#n#5f3VPPY)L39UvOe(!Foyt7VaP?=84jcy`dsJBp}cC zWdV6%OK5T;ZWdtS_Z0_2tiSP!rLfw94#bJ_Y6}|qSX5i^lnU3VuttPs1q<713;4`G zrdy40J^LMqr5oOYY`yhTy^EcTeT%(!p;q*;sGU~yKtT=i1*a5v(L77RiMI#K3YKAA^j0ox{v&Z7 z?c?q5KZ^Sv>wwCCq>ryZ&#(;K4&wWd*nOI;o4*@(QofG#S|JN4l!&!Lv!E#jv$P^l zK^4n)hJykzD$8?n*UQSbYkuy_KbibEI@1%mI$oC#(6FqFq7&-kn{+aGz&1QtMKJ9` zJ%}cfO#AbZptG?VWLT^RA1l~`B;^=S0=s>a%Zw1VCKQbI7$p`adqDC@;2F&G^c63Y zkt{-FZhX9Af7^oHOdjK_3UsljWq-Rz^|wC*5_z9BcT#9oX@!DpCJhx$MGKw;l|A+U zT(AZ;!N~FD>>)OuIb(~QGnaocC8feR<_b>CcjHVMTti*=ZOUb1|H;$<#A$|L_m;MK z2L+yVt?+ecN8f^h=z(Uvc zWpe;Gz=2qj$IDKW>mxzoWoAIe-j6}(CWjcIANLGj08~V{*BNe z7_kODj7{(G6zy%z%vMZ;?1E7~Z4qwsL;8 zZBrjxwyk7mXkhi%(Lm$U{zhA9)-zv6BZEUn5aS<<+cc|KlO!ts5o_?IBKsj)!V3xF z+DLpLTn(7Uqm}LTcY};s|0v%&DgqyAwOL5+G3G<^8Z!&>-LscLxcS?PyU_LRzH=&q z^9%AKIQ37pSe{88x6v7H0CFa9ggV~Kkd&PWuG5W{)ID}cRlYVv$M}sTZ7f7LmZC(E z8|ucZyE1Gp)H~al;BW;q3ycYwdhpu(xrUu}%F#3K5lJ&W#@|A&yV$&YL^lVa8nE)t zFMpFWKcK*;pq}`e$Y@b8>s;C6;qeP1Ah-9l@vtV^d~j27^)F}~SL0n186cjuaecfG>llc30nWeB z(R-n67%gq$P1HiKe@1{eP#}bU|JL!S{|b-*)zkuyqkrhZ2Lv4YhgSOtB5F!)T0nSm z8BN@Yr3I=*GSnpe9Sj4W;4?x-mNY_#&;sut#i!#_^6&xYBBAR=4ua$jTz~vW0Ly|I ztO&@>LD9hXLZF6LAgR9_HwFJQl0eOM-J)bxdC4J9y|-XtzvoJI+k#Y0tCNGOa8u7^_Sx4}o_L zMZO!Wh*o=%$QV~~_k^xsWp;(e;7Gb8eb9d}uiR*J8?U*kt$pb>j$y!$YrIf8!G54< z{iPTGwksO?_BzfqTQFqkZLOeLG}M6$@t!Ba^wJhBfGHfPf5`hyWH|ntF3{-H&~cb} zkOz-uok@#S4mJQR}6a%m7xv#7TtHVT4-S+SXQTZ9n^c zw%UG{yD$kP0Te{7cPkea&M+c)3*nae-?h(~WPm1!B_*^w_k*)LE-U>zsT`R^=M$ zq`p%9T_t~2Ldg6Y79a6;-N@Pt#YT9wMY5SzFp$rz zH%GvLb)>ZhA4xK@7puT%(7lXzxGdpb83H6(Nvo@6VhuBC-HUnwc>uZ~5{}AH(QebF zfvMGLcmNGX7CYVrjgV60+53n{+ea3dSROGSC!vQ8pyB zhEY;qoRg}gz3rrV?X*Hk+u)=Xk@jyJySb~eB%Nh_7nqw=b4Bn+rQ_;I)D~{zZ!k9B zW40=0RXX{du5y3lJ;WDW~PTT1_JTR)>z$V{o`8t!L_r_TDe`6pM3**aj&_?*7+`!cGN z>e!{Sp`M(&V5#)$iPxoHJA`x<2T{rdW4Ac`@&dl3J_xqSqPLe?_Yxh$-WwUBv^^zR zytuS+2W?brPQ77Wda#GEd7?bH(j!>PM%7)biTFpVqYJ4NX{KEMcw&8x=;5;3?-;RJ za1!X45(Q?C5gT!mlKi5FJ#&T{x#Npa!=Bzf1 z_z-ip(EpK_ogxHeN62iq_6-rhwS-t)o>2TbC7p^qJXK%9jWfO>x!XS6ik04#-W%KOmxiagtZEg9g(Z`H0-b z9vkVK`lIdtm)@x3o9m5s^a+0%?eK&@1BHJA+fl9gzmg>zANjmgbh}egzaS($-9|;J z+yJzSO#^h>WBH%YLC`s-MzZ$Z_H^Xe&~~p@gq#eoSp?51fDk#k&LyA;A>ET8bjtym zlJ13U8sNk-(uH4mmS6eDkdPPSNN+}bu@bdIai+wIAF#dhbaIV^7GtH1J6rl0@)}A^ zGt2_`4H%Wjn^+OWj`rqpwIU*?E!q^%t4t>le`VcdEjjD$PrH^`4}FUST18XaV|BSm zb0EAEu!tUIyYriHewR7FG6Mp1A?)(68-XRYPLlW+%Yg=!)s8S?mlwtFFEB4c+3M!1 zjaniR$Wm<*^}5+N6uYN)LA0Y}PMMK=c~LY`V&s=nUs-~@Ks|r8BTCh`|cT#R)ru0}K4`D5Q zH_}=7A=zsGN=d_f()$FzjDHzFZvKbNXB1jy0OeupZx6WHypX}PM!`KkJ;Tpn{wI4= zM#SE8Xv^AmrrXu#5+qMf70re%@!3rnE2VZRlY+u1Q84?1e9WwjZ|Oo(R7KLxnpcFt zq^+UzT<;oP&uo(f;_s;C%y1D7$ zy7qW0jC4dx4TO-U`tyg^a4$$<>SCcCYyTI46cXwYq0k;^o6z|NAOljFHH;)Vo;68# z^c8MxdE+w1Psj_Xp;r)t?vK!YE!xBXBg1m0WVIVY$-E5T3<^Wt9ftVTbAb;$SFbbz zv@z~Df9DLe?&1tfn~QdUj_3_;kP>uqWZk@B>EXOYh8gLttE9?I{f7CWbn+?cYi+nd zkf8fhW*kzNWLk|~l#wiX1mv=gpW$}JT=dx+Xh?_8U=SWD+#V>Z<5_X3k<#Rg3^DU5 z(11ky8xqT@k?W+)|S)VtdSpT4HZmL zj12%qYj}{T))1&m!ULm+^CD#^Iy@-|A}R2BY#24MKI<5~cGl|S7GdFZxTl6+hyFaD(3S&ZmfwW`6@FyzBa z(+#TWDc(Dor7+!-_K<;vaD~|vs!9dQ=e7xy4_QO_6`Cb|P?Sw{2*PEm1ZpUP;-ac8 zjonogv{!jWI$OUioeid2mEMj%AGA_x0z@w+Y~iQ$wK_i2UGct*y-4_uTARH2-U$ z^Yf-;js$K@4>g*0<-nQ&sv;u> zhx6ld!(706oK?>Abmw`x5nFAOcs@lFc}DE->NU1Hp&DvdKT?j6ODpyE*4*$VM!c|+ z%E>EJ=H5i3(OtPJC0-b;AZF7DTAWv8w-;?LH+-)}_DzcC%{H2LQVI-#v3476m8Gn?SLr-^_hbL+C+zw>w+cFNv?4b+T?2ZwA8 z#L`43D%s0ik>N6q0vO-07gcCvs4$JFK_jQ2Xdk!=ymXC|a8Pq@o7t2oNa+e|+H(sc zSI4RfDmH^R=`-T!T%c zv4niWCQYrL@%5zmi0@%J;_9r$svGPUB7?J2@6%VhJk0qo7buos(e6Bgt4;wtUd1cYBGlY&KP>}IWnbkQP}HQ zgq1=zA%TVxp=G`|!|$XMa?0Chz&1~9Gpsjehvfzt?DPFGj$}q2f<*ac5EwBWE zg~*P$363HQ2kVP2y=(%Dg{Vy+Q|)aS)}<+ z&<(5G5h}BgwEAd|#z+*E&U7GYZV1Nb=UCV9sGF@k7g#}_A>4hd%MNHOwg-K0Ym2X^ z1p5XQ8D6}FPBMn*;a+$NoDFctx@Gs8syZ&)M2*&{wjtG31zwLd__@APctmT}JiE&u zLV-med&oM^>Fq0|tdl&FI3A9PX%Mv2mi%4vzH7{Qhn+-Q{EWP95?FiCut?*;N)(|S zeifeAdJCRNh^;5&{!&eqq7MSt3hdB1^Uq4&N)_E5R^XOAeAE^P_!e}(8T5UvMMYnl z-rUF*UJJoXp3kd|Mv+3{vrda19vm)Ct@kA(_sC-(61B$1rE(^&(qQZL2&)IK>{X4x zk63s9E=M@thGh(G{ki->Df0LShnU#i%qpDV+b?&fE7DzkRwI#~#U%n-@=qXUT;DS@ z+HqW4IGz-xK2=Qx%~z}&;?npA=6C60#vwZBy;dWSnWoBO&^CYr^YU)Bc~H7l5;U7= z_ZHQzYL0#;_b6Qj!(dP?x6PzS*n z?K-4p>~p^rV?|YowGw8@-Y-M3XY5A)Y<>A2>tfrjC%8vt``55%>*iM7e5>ca14O~% zLT$xm74JvWIfxc%HtrAUx?zs+>T3tfAo|+RMLheFp9++iOI!#^-v zVC_VZ4S5UESc1i_)r`rdEB4B|jc^(4*Q51#fc%}cgUkbd^Rv}zJ@+1_zMVO9sd)gc zx8K}tT|6RJ*v*L7S|tsP$_sxC%J=^{CiQ^zCz9yxs9Uw4Z#eXR3YlYs*PwCkLxftB z?;5*w_#~d+ef)TOjr1l(x2%`tO&ZOb2-(R8nD1a($<|a`%icX<{~qNLpcH$R{}l{q zcNOg3cY>QJrgIMx~$ndWfwnb+^7A%ya2$6#zadbOYE?esd>v zcC(>Ur`A|U=Rpu@J&O&U+0@Kdvqf;XfXkDZL)a9Sx>@CwW{lVwO1CK_#Xq!muI-fr`y{x@c4sF{5gJ;Q9gb z`+K}bH+tB$p>U64_Q1xfD$a|H(6tp42L9Po2_FILJJ##Rg3o-EuaZi1^Brp_SfxN< zm+nnzS`((PoGC|vB$-xYdJ&pK6(@l&C5M_^03ia2*kUy8W8=m9LR4Z+NrleQPc&6! zSKA5*TEj8cXJ*Vz7l*vX?M)bbh2%vy<>{vCbF!0HS-k}ertx7Z5f2#e~>2l%bthd=XLVuO5O+L3x_9Cp!pEq9@mOr$Ul~gU&w?45M$kWEGgrb-NR~k}T_v z)P?WSS5v!d?E2X^rKXd&NZVvK*Y74N&HhaXeVdeSR2OBISj4w;rI*X~kUXU>4A9IV zJ-S;=mNcwzDYHDmkp4cf9di_q)dUkrf z^jY(F==B{uJj7F~lxF%w_iD(@3kqG4;^+cAA5T(M*DoM61fA_=7h6$PC<^YYbwxpy zO!r@W_iM{A*EAJd4*(tue}1o$g|~*X#Bs^fh*W({*H6BORvi>t|0- z-A*}>XOrZs-%EO0^&R7*ZxD~vNFGxcNYg<3BQ14S^g)09(`$r}T{ zm-%T4jQTV@up+@5JbJ}uJ|-(^OIL<{eU0oavLF_)6e6{O*i2^V1;qcG9#JQL&1&vU^{8X>|xYNJrc5lAER{B#n&zpZNd@<#KiCo15Oql#* zszayfYo$XhOX&^>sx`3=r{LQ z)_u}hx#%8m{!86msIa^62N|xme1H9My9X~h9q6AbQkbPR%%TS`Ne2SHH$WKO_o*O} zf0PwI3*QporwWPGx27^o=Qb&JJn&bZBhXkaf1y`eLsUKVjm(VQS3vjg(9M+Il!9mh z#X^1cnUcHiXioTMdrBQJ*621Eb-8ak~zI@ZrFPBFjI z@6605dC^ykDod^B1qzh6>VT52OwaC0zm;7*nYvPd>2ze0(-C$zryoAM9}V=QQd{0) zd-e@gS}>;*r>d7OX#Ryxtdu_Z%W$aO3U}Zydo|)mJvCycVEb?cX=eDmV0=L_aia>X ziByf*CH^3{Ww)W<>a<3ZQf6t5ONHl%O(-2!Rhn$z+3ZNpS4sB`7Fr>)(h3ys;`I1u zeghTnXLb{<;df5Lp$Q(?p-vrMctU*eGyzxgVZO!gE6UXIwNuAlRpfPt#-p&a-w#bF zc4}yz5HG$))zB<8R1F?yccKb=wD3qH`9+9v$gI{djQ5Jfp(@n_WHNu;8&Jgu@&RYR zBBy+VQ+|%*->*Bg4M9+q*AGop9iW2v1$Oz#eDKF^E`rq9Jtzb$0hBI{$N8eKzDQ=& z-m0{QgCu3futp(=LK^7o8_9q2EfBk|Ls?ag_SaqZ1Hk;?XFcX-{(d^$=%wUu@J5^zl(WeVjNELFd< zR^(misQk)$l3y&v^4s0Lp7JK940vl!bOg!XVQxOEHx|-Q!Wv?KCqQt9uJHAcnhK4l_NDTD&86qPmf(H z;s~mw&#ZHA&k>6%lD*d0%pjyH+C9l8yJI*?@ncp5ysFI$FaL|kaE?j`uQiz9eEtjf zTXY@n(ckVOtvKQT`JW6Y9I!dz0Gx1jHz$mZWyZC6A_Em!LxaK#BLVM$eSge?9JFAw znXb3z=Y&rdB|w2SFD@=90r5ZyBdS>$V-(u4VHNw68$nXr1#@-gDdoww2Z>&A({sYv z|4WI7KO-B49(=l{q3uYAcUb?;R~$0`utlL=7RMbjUq*Rtn1$Z1>9mHxm?^-Ze?mxU zX|EjM36DX~GGdG9yVC1K6^<3y_RJ5(3cWRxttTWcy0Iu|_LgBN_q>l6BGD&OXli;L z-fR~YaOk-O4Sf<2udep52 zHk`1*Wnu3L=aHs@bs@&9h8+@_S=9E1c{~(b>wSWc-Drw@Rzre#i&i|YyhXor@N4lF zz45SZ;Gd2ci5|NwJ*cmIR<5F<@wTfd+Nq~+k}>Z!n**kWqVC#!A-8jfR*<;I>gcPS zJHue^UhDnS6eVu>z3SUu>kMSr_Awh3vr20=Q9sSlT6N-<*i zcQw93CVUC?wM9In`m0BwD)Kex+o**1*=LGLYAM~ZeP1l@@8SraD58=_zzP{&LD1Z4 zqPH+-pw2k3ZaCkpniiya7R+E-<~6HiJj(X)nRV@BY7!t2mbSbaA*(4~(;7X}u08w* zY1{m)0Z)7J#4%sxC7Zq?C~>~EwGwZI2%^~V@MrJ{>1f;bXu8kr-KjfH=xKk|(_5vd za#CAqg_Y^!3)DL3W$a;Dr@*11!|g^Nq;o+Z&Xw4uEI;~-z z-!LbE)7!b5MeQJ3gRmfYRH19B!YDDzGTL;RCs%dZ9_`^f_z3wh;#Z+g-VdBa=Tv09 zceB!VKYF!lqYBf8*c?riQ9QR*Dl4B9b9_)H<%(NHOEBG1jsAV%K&ey|{MGI~q6;!V z6Q%4aD3(Iz#no=!KxMr3AuFguMaPxPFrb#`Yj;?~#igPPSEQ%O_xV$Ic=X>!M*@H$ zb*6ahWS#fva?;TncG0x9{I&S3)@bL~bM}~TMfdE8wyuhH9-i|qHH7~eJu*D}s+_G5 zRMguM@5F(a8_-ku}FY-VYXE*EkzC_anD9`A3?RObgG zDiIZ;at-0U@731R!x#%xkv$1f&~~X!F+o6l;^oQZrx4re$^1-CZ-|sT4wX=MqK8rlk}id+aND~f#cvsG$6Zok&{F}+@Vju^)x3dTmI2Nl@$t{Z*`UXpoc*7y09@=sT0 zim5q@`kl*1`P^SYtalgVqn2dgMs@l6caE^eI)jZK~}lN3E(6uF%cZIN3z;8!=_ z)fpM8Ef2WKrz?f@*!9}N!*oN=>}U-Kc#6(f1Sv8;IzP`985;`}D3+Bob&1IELxDo( zyfb{R5p5~74`C>MMyfoDgmZ?z?pCScD9QvOf-7aMtWn0_UW!%H*KxYb<@Z?;96fGV zmUx9NtPux+JYoYZ)!U%=;Fj(8Zw^-obJP6_VXpYTsP}sLNyPC$6wItX+=!bm|ARojLw|ll>uqq>$*eW<93xj|) zn~$Oztmp!vU3HAcx&fvSy`WNSOj@f$2(vS z!GYuJYoz|mpK*AtdFnHk&D(7kJdf>!d4A^m!|MCSka+<>RW_tHW#bj6v+sjKiX2`> zCV_Sd4i_*Q0`~ZjNq=cir_NOV%uwjALgkr4eJP~ZjrE=r-YFCuE#=RV4ux0Q-f9zd zPG>B_%Xxv5yb6lO7hSPC>jeV@bnHU-mt3FYS|x}9&Mt}atF&xgpP%G2UmguJJ=UvV z(^h+Ld6&VEXud2erl{%p>fts7D8iDPR1*y5$S#G^&LFrWlX- zd-n-{CL{#1wt1nPPB~yb7*&wb8Y)?T>}kq%!-!qr6{Nw}=mh$U(~!12S1S5isyry8 zRlYyi3ygT)+lH^DHeWWDQgNQU2ZLIC#G8T_hDiqVO)K`agC64N$FjsSb&t?t$vO;7 zaJLxHH^ZDJACW!8wS5SEwO$8b#CxkTAw3f)m1>PQ0`}yi0zkzmTGbPT(~wo0x*Rzd z5g~P!a9uzDJ+0D3Yq5HO*x7!fDKEJsLzr{{$36U7`KlJ-SL|v}TyGfA7tniq%}vc( za~Zhl=9R?(b54=$jGVUXESfb>aYjM&mJ)m-4$9^`Yy<$CP!KF@opp;5-2gXzOM$s1 z=zD7xx^WmJ!%gr6oX%vQY#l3H{zNwWlHiPqa7-)+3aX@UZqd&oawAugL3TAy?Mc!$ zeYwD!900tGCIpdOBUc%bb|6hD|Hx+RR%yiiSJ1>DI@oLY{uREt+RcTEvgRO7Msz#y zr{N0jhaH>BY?NbYO#Jnjne+w&%ZXw*_9A zkyUh`d6da)%i9F7)k0@t*VD^yP95tc74;6DdWr- z%crx2hP@HDO|aJ&DdvR29>lXqMK>tfVEstyv*VYj7!60evnjgMmgkk8S$)2sd+`_Q z&X%8*qgcPzo`V8}oyt%~kHzW1Jc7;Mn$M{vBbJ8+yUQxbc)6VqM!^nXVjWqVO@i(H ze#&HGpyOZEX+8P5YQ=7BnQH6-8sl=j$JQQ7V?OclVjeO-Gv5oDhw)X_udcD$QSfp#S}l>LO!R$+5D9U=)(S!uJH=aPPq{Xh1+>Hhy%-BZgP|I<31KsBI__bvFI3H*PUQ}u=a%k6p*Lqv7d4y zI=%q9-+lHchWAoG6R9?kN5w8pRKm%d&|gW|$CJFN_^>S(iR6x%%I zTQYaTiu{IrC~B<0r@%=P#EcA)P{tGZC@8a1Rr+mOsmQ1GPC~f5xpPCYep(TcsbV5k zgWCj9f*s#$vW0$FUG zNa}Q{qw@)LbxJMt6;D#zlhmg2D{bjFDeO1*JB*GwocU**(T9pT2>ffF3>B-SNS-j@ zb7L&*vxGxfAStnvvgB#=)#zUQ?Y9TZHtDOxV5yfK#)3Pq2A6=c!$$mpJj1-yh>hyn zRWE~5v8(E$^l`Q6Xvx7|lFSEahr^nHkJvj+&{uxuN|cYvg2=B@`G&o(XAx4Eu*}xm z{*MgG_1Hf;&{Hd|WsCSd9qKM?a)OC(!ORKrUX4?PSr#P57Y-Mwk zgL7BY1UP3OR^l*1IRcgeNJ>MT%rFh);4aMpru58TjMma$qjD#YKnJ#w28Fhxik zMe%^yc{yIVq4*uhJSZmcJhaZ9tgv*rF6W_eSVO+3i=b6rs~Su{uEvBA(BF2tZNurd zbAE{p6mfA>Xcqqktkg>gILZ;%?;UEp;qi(?dH@>_ zD+bdAX@bd+!*6y3-5aH;QK7P(Y)gH$#c}o;S>8`wt!fCeFXdQ|sh1XcDXSpIxvNCAK=Y#>>WB5!YMe+2oOmg zRJ7@z0$;&m-S*~9)!3sMbmC}EH9&32m^Gk-%%eS^(3sn$&JAkE5aeNhp3AX>PsM?F zdeGN4>$_m+ekup%d#!&w?kom_eMg*=Wi`yLF54S)aheY%s}+LCjr zA=tFnQ|&$wY)a$gtLD2oRJI#tPg~qiVJyd;UsN#2I3|yymXLW)wVU(8Yn}cbmeo^} z>_abP@QmUW1$IB1cA;=bY?e97AVL}-hxlL^Zc1%JK7%-PcsBE7C zL=L${RyzR@Bd8S6od|`H`JA_o8WjL+1QsZWU0WQWAAX*Wv0fFlwdkLC)6<))%_Cy@ zZHUwLT zv-C~Rqh*7IzdtF+g!`Z4cfE->#VA<&Zjp-G*jqj7X``RVK|E%vST)V|x4z#Nplny` zuYTJJv-iFlq8hB4dK(jR)$)GMyG-?~K^;Pq&1I>)$Hs`w0=k7e-PhI-)#dQznYRA& zSFsZv!KQ+hXsO*scg-h2m0U?8D#EhaSeN{XFo%$3F~IpI7jxA)kibP-Ix;xK)+0U8 z8t)@jDe4-OQz14^x7dGP;3IkDr{7}x1YLZ5U*Nlvly$O?R~$08_35;2ep;Zl&#PLa zAhfJG=|WO8udS~wde>1dLTHOQ%I=wR#!&h z(f&!U9#p6Lus9FQ^ZEm#W_+10NUP8gA`rpMZkI(jokLc$F7DDUk-NycaH&Iuz9Z`+ z$`*jtO0o_U5ysurMTyEeCY2FkrVEM*@(4d**c+j0Jb42R|J%t?$RTS#mr22q-0uos zq|jb{z@m`4SHVYB)xA;_y->t3S?g5KzN&D>*;@B0|5pZh`6Zasowd`X3wMUhQ4(iE?TTP+$lO+K zz7jOwwyr(j*?w*2DCF)Crb&P#E8StHo4##)$={MG=zdMDC7Vum4?g)eo)roM40DY5 zsyahHWI2R?!BACacL^Jt5U&)-QkVW4K(Ht5%4`c=JruY6E(}$~S}osz8^3ktOLX89 z>5l>+>(wvk8sBJ_4hqNMa3%sK=b2qt(e23jl4EM!%4LAFXx89pXU;senI>dzz|pBz zD_>N-29d!c4@x)g&kVLNgU#NkzE6|?hFse_q*Uq2>{}O+n+;bWM2+@onnin^)=t>D zgy~aVRaSijz84)l-vMK0{ryX4>|zX;sbyGm8*M!UmQSs5UJ(&MOW{Xu^s`_aSUYwh~j~H=>5o1hu8fDE! z)9xW5_ZLRfks(HOcSoq~xEM)%Z`NMr=w(0PFqAc?Jfo7a?I1#zQ7f=RU>fO`3Q*06 zR1mqywy25pkfoNPiwXn@20~Y@S?6(1dWD+N)X%N(pOJj8q@6Cw*M3m)h@6+4+T9NP zOvVtBvCc!CG7)_*6-a?gkBVMLTmBQl5_40+%F~u7#^%74@!79cC2%@S=;r5viq|U= zLGx&8fD@mkIT+ngQ0?0izHW`wRCl;&*7?EM8L?p%?-Q@YAA9k=XQ@Iz>odRa#rK}! zG2Bm1^7`J1eB?Jb%p7kHo`UIXMKuA_{;tQzr?vHYe%}V6@i-ZVnp3|Ok~@z#-@*BF z;|38@5|_t|{a3{E+EN3SrW0ubdNk(*p$oo);p;eW{V7(x3EGOn5M9-Y;oZX?tH*Eb z)K*+@(@ei_>w@N)ezWijE!9yGRN+?(j2i=Prpp~?M@vJjyW%pJo`v{nhlSkPBOJ zpXsz7_%E4GlvB_-rL0+nl7Vx#maUDplF!)^jfe){rm_*c9c2%gtxmz6)}II)1kDu% zOAOo~IF{BRyb==#O_+=A<#=e=-KZ}588d>#A$QUkGl`2sh0n5%;3H`}uViU&wC-o6 zt?9-`h>+kT`e6#A#NpfzuRZ9{0joEiNTEeKU>$oz^ges7XKv$Q)Qj@;Yo7kERY{K; zCTDu-y<`3XpNttbScaG^F}Xi}wrpg%(YZxAkqVvIkvL$KA($0~#@x-OKrU_JSxTnv zv{vpRZh{j0zG0^FUy%DNCKRJjJR`8ju^;yGKSR{sTIbKv_iElG&*>ioy%p)Lswu?IIlGzpY~Vt%$)<_Ap2QP^zgl_@1=+~9*%_h@67C(Q+8q^{0{ZzL_D@@ zfz+Nu)?m|~JTyj=|A2YL7w%m!`+^>mtGe0vJgO%AzQu2&=j@6s&IBks^;)GeU+tn+ zh|+CQ&>t#QlS#OW1nfBb2uwL?#=KJs8I0EOfsD`mScS#h&a+IY2eJQ$IqY~#Y3td7 z$W_lm(0YAxv-lT`Jbss)g!dm5sb)!mT2NuwTjkp_D#LU9Vh1162|K!D$hT8l$o8xl z9r*Y1R4AiVAqv`as?+PF)2gE&DTJhjSCu9>YkZ@&_mEPAy-+3su_JVy^!@Zhp<#o1 zN%T#yjx$Fq@}YC#8XP@^7cTLO*dkNkxSrvPAEz9H(Fl}aAK+nN+oIcYbanW}&3UeE zoGRqp&Ng*|XQwOVSd}4u8N%g1}R7gZ_qFUTSZcqP4Yxo0XtT7=xRe{zhp5V5N zedE*em~nUxkAW;TE|H|nF^;lioxEzxuj|9nBMu!!dh5~6IVsR@OLR-lSn1OiRV_HE zLXx*27)S)zmqdr+=A2yz1RUywYC z5Uzr%(;u|OZ}5>A_-cXautll!)kg@1hp+$OE7U~3YK^9PVH(AYOQz0x2#5%v!~mas zi;9Kx*3eAxD#0IX$wju;#RCfO75-TLzO|RCZ*zh|_G^+;sY%U>YKoxba;`>ecm^aB zkSBk`0~(9&ew=5wqcvVFgF_vQ(Akm|e|892(q%z7{~0RB#IWC}20;f=QA9QK9%+ z@-yAl?CXtZHE`JS=;mWcDdsd!s3Ny*@f)s3%xJZ+zHos;H8uJTJ7VIdlh&f zP6SW@(bXvn_>l~y-N!B;V3#Nf$X0&}-yPkA;N|~IeyZZbRw;i@;Ky06P+}FMAUxDQ z7;=S5>!X4`m!v9f{CHSUM)LL{T0#y2p1H?wwpmNcZQoy9^tv?PlNe58;(@bMSE)g9 zb;mjx^J@76p?s3XuG*VZ!5Q00@x1RKVdr3dn{yVd+r>s2btp2@ZtKg_)9LZ8c^98c z01AGGxlS-L%X~$O)fOYun#Dj^o1X06fV=0v2DUg9dw%NKObXlLNsK4pYDh#*N-9_5 z_;>&I+S@anbB-AhPH0XXd<@!*zI?>h2nWRL6zpu zA+5&kJ^~oni`uTx*7;rTV7$`p-X4q>kD|F~>#@l5?A$}M>{HZskr7|uMgxJEm~KvQ zj(lpw*4)V`jTr~6aiFhaA%z(ve5~6rqw)<_H)O7v&J%iQbRwUq%ToR@mjorIeqq(( zhi$~7k_GUWyQ;Jm{*i7odOrzOb@N8%hS_85uaiBt|F3RSd+a8|jHw#pW4{Z{7P%I@ z&TB|4m;k-0*sl$(bX9BXzDKpvhmh&Dh`;29nZkf*<Q^wFL~79OKwM@K43RW+f@Im5@l#sIgu-;FNctcxgt6R^J{zB?w7Z zT;*r?s?;swg7|UB{2!^;dEVKDp&8as3D7ovPMJ*i%;VO!ZFcW&Q@vaEExo(I=^eqD z+cNj7l&JoxlgvYO-w%r-`=nQcB$TbNy4TyCdQ76>Yj6_$dqP8Mn{8RFtVh$z=ofPh1JP*}o3v7zka0$`zz`bYvxigMNGF? zQHvr(DE*j#%#tZyiHTZhsyNu2sa&!ypa+TYzF>^t z7VTjawMUJnkMg)eU(ycOmAq4OaY@ z-J~-MKh=Fr^`AbGBk=F+F`G+C`xc*vvHy>J9#FG>!{>qN5ZuNWf zi4G?PMk%Slj&31*<_KWJmL;i`%280(8;oDR3K!(j8eSJni}i-p8*CayJhfF8OBuln zt|JM?t|+RGO;9TR0&Bw?imYf2?@K9ScgE0bCb$ll~E=9v4HP_4uKsdy%YY%LO~@vB@Q4I0QWzc0Qnt+o;> zFI4um_V8V*>v+!K`G|dVhY;ZUlOc2N4++8z`#K7k(2prb^yoQ2k?fh8exPcS=*gk7 zPqc@Js+y$8hjn_ z7$+pV7CeBWhtEdC<<=f!@j+-$ zxwJdgAjeIDF}4<5V8LI;Hp09d%|uvEhKL9BES$6o|0SG>QMMJ!qC6;;UquV%9O~k}_q-wWt!77>uVIt^$Zr zR=)@e?LVEC(J2LEH)$KQ4PN4Azv!;Vg_2`*DIvo>B|86qO{-1?+QWB zc}z&L?Qe@)nH~Q9tRCUtLxg`9eeLPpk>9!7EjxyEdG>2YU90LUor5#dCc7Z+^eHU$ z-36VT>^|e>mMGFXd?loH$9kLJ4>4>f9=j2{*oaML?kC{_Q3bz|w%*;QC|wvn&j2BO zqIVNM3w!?I4`tTAX3o5OO8n|Gr~I05`7*Pw`&wh7Li0;=NY(;kT<$#-Dk551l#YDaKN6Gs}d54#M?ngK{slymgFA@Ce=J$|~zE*0Mi5&QySjqo# z{^R5a$(-XcuPY7BXucxu?Tu4D^4d<^0IIc#uV~9>=S26o>)VG;E9@0aH&y#~NpkHO z4u0IV?PqS6D8eiFSh0=Ivp%hkU!SuI6eonpN3;8J?WwNbh#sx2=!2@QN&J^KW9Gp{ z>mzFWpgKM|r`orBcHe6Ay+GsUhei{sKwHsoCOOF{DWxKr?L`g@x~*U|aXcxfC#uce zf%x_4L=L+H=DQ0%Q1XXwckSfr_zlvf)BW+ycb!Y>i zM;CQhr!#DjEm@Tc~%Q~@27r$v7ABY)W&)#e+~ zkMhG@iPm)=n*Xl$9`&^w>6at>f`?wOcJB^GkK}6)PXI98`R(kO6i(JFzR>UbLJIRX z+1>Lsr{`;K&)2-3uf2M{_U1Kk*XvHVYT24M6!J7896-J*?XOZZO&ecz4bEGk>(G@T~#!qd*zww6_o;CqF!B>0KW>{g&bt z9|nQur(jg@&>Pk6kGL!xfG(m~*L-%t^K`x9OZ~1d9e9EdJzjxl_E+GU{R%v@Ux8=# zEAad>aM$}zzh(i?X5jfDFpAWJlKjr{rD_z^cGV6|;!2RVU$lqMl)3LAZ!l5;?pfXV zm_1;-+FARg+V~BC>LYF8G-gbTPT?=BXdug}S(el50l9Bcg8Btm6=h&4>vX~^M0LvV zp-qNVCSrdy5QGOulQWQ>vIQwlYn3LEAY#H1%BDDz%Tn1_+`HW zzt01AZFb<7!AD33_{cz$^ALB5@wNH29j}f2d z7R8Y$1B%C9HfNC>Lo)vbYR~#OIhW}R#qZ6n_I;u)l#7s603gL)w_A@*l?=|7e9%kA{RS?Rx&^ovxw*7zlJO!s@yZ*AcoUQ|Zp zR@sC5JDIkTuE(#m_h9_-&{w{yEs@ht$$#*vYkSPvAJ7NLN~$)u`8iYq(Ke5F?_nrV z>-gwwn&<^^5pi?{nLSi=+~wBd!wL#h*a}}e#9kR6`2$FZb#9RDGd}JYBw4}B)KNiUFvk*iMRbtV$ zH`{-RY8{D;`+~`D#E|Oo$P>jqvYIn2^iLlvJ1~;yKjj``*hB=Bs!A;$BO|-5PQ-^9 zlSldXX-jSemc%850TXfJT#k|05txEwZb5Y9S|Ywy!Ox2?y|77{XT2yGp9sr;rAIjc zbMGJr-*~>hD0vcvg0UsbXiH*6UrqBk(Y@+(YYk%Ip$vQg`oGjzB3>{C@oc}+sXp^8 zrwFK?3#P2!--Q=I`pP^zbW`#L=3UqeUSMq%6#k}BG#CdZBCj_T}x-TVA zeY^PSm*DoZNY3B-Fu-YzJ9(mE@#ZK;Nmop`erE23{m*w;i>@Feb!ySS@&MyDVD!ma z<0r*AZ;0hwg;}tgDrEoyO%S}4Q8a3*oZd%OlA~TG@dEHAK$j{njf@hS=ur~4 z%!bFBqiRAKpi}^I?__tKYbY6vU)4{E2rAGGZrO7*_IIVFkwN3x+hA-e8pZd+9C?%( zKt?POFI1H3;hRFS|6RtC6m!BKm}HOc>mBLOI=C}c;_&YrRIZNA9wj;IRYO>Tx7;-`6@iA8pr?2d7P$3i@C>|bVO#2jW8XqPl>q<{T)ch*)57nW0Vu;?#9schPUJX0lyP z7Z5i{S%9cD3iV>J&Iq@ouM*Qo!ufr{`4wjeNf%!a*)!*^F5w9nTs~cPD7@$8gNbi$ zr*$5%WW6mCRv+sAoL3GKa4tyB?6Qq=I6gc}peRL@W0H!j!R^=TOeN;?N3du&Ch*93 z(OX9z`>4S*XpmfPIX6>OLc$L;$_$`*SMI^}ort47wrgF5l_EJzZH zKci-!;V9^!i~~Srw+MhZt3y^5NTPx*Wta6dXwDeLz8QINCZ_-{BB6KWenFv1S%1K7 zEWaW5ew;?VqvTP}BPAs((%k~@58qd;L)zoytteVPkVZ(^4vz}C1O-Pmih;_FoWZqSj zuF6Y(1c^|XB~v1RPvNK}mSpEu;f2;fU@s`#75+xv>z)mDmTR+ih;bSfU(UGarIDxNA8`>0r1Br|~cZg;n}1_6yx-zJ`9s)f%wRPRHy(Ca0* zW|w()NhtomPw*6suUJ~-_?5`MvVp8%?DSxL+frD2qke;!JeCG$h`Vt*e6mOzA@}EU z09TH5_}-a?EI01lB$KQ324V$Ic8-ur9t_D4hzi22+(WfVBnN;9+>_wRx5)=$zbAmh zmpVtA;^Vekphpznm{9E8JQ{e3LL7nqI6P+N(tvNQH(V$i6BzPwb;RJnwIR}%5IO-(1K~UkTPX5{_VsYlAslb zbWV@N$4!tDhc8rY!;g8E89;lSrO)&GJYmAoIRX|%P9|HX_T*<5ccS$4&7B_k1Wyrn|m%=nm);oZgpGNrjN-M?B|@e9i(La7Aht1 zk-1O!%7+4knwH3;R{wS`tB3T%oj*t#eRGmr5l0RcMj_537i$*Vf`Aqp~o&kY0i9eEr6Mn8`2t( zFw7P*U7<1shI50;=IHUqR^CUwTA(R2B^y*i>R^WJ#4E>px-sKbBC!4b=ZDhg zeM{aOmIJR$e~lTfI5MHiA00A(T!7MR!ObcpK8F+Xg^iwRa(8fN?ra0bdP0t!QZ+Ez z*=zPCq+Ee^tcg66ildzcvxt#tM%Gp&iI``8rJR8}t;RvJdCy%fPWc;y+>n&s%JHIy zcHy@%=a1E8U#TjI`91g9kXh?Ny@NedTTyjN3Y%J$hc;cP{lY)eR#@4!UZ`r-7ENc) z8+e+mA2QYeCJBOvd>lf*c=wAceA#X zgAeXj)q1J4uC2Jc1ShlmvRnTf&H=);?S^YRp>?hz|G(8bI+Px*t9P@uyu0;sr}fiM zZ2e-V_1nMM`c?loTQ57Ib@gu6j_PiGl(a5kOH>qNLs{tn7$Q~`hTtkgK64qK#4~mf z*v3!gU&8$@>c%`p-PJ`d5{vYx`MGaSWu!kwmvq>}4J;3MQxBMTSGHC8r8XFsml0a3 z4EY|}>5tWND6)O-b*zg?#k#MxwmMej=Xd^~Zz;p7H^0JsY3OAfuE27wJu2S(%43M5 z$)VVTNC?H=1@m;A9by-FQ=_dy{Da$ECzDHGFC*hzCZr-e4ng-*z%=rQ*KpJHG- zt>*?R#J*4vy9Lf9k9m4O7!UMDW}b5zYol5%H4$Ikn_vM`>+m3*-QRlrNM<#q9tjP* zfLm6ib>WN`J)pX=&&ZvOXTW66>(}~~@QoqOAYXx0G$$CV z%#o`b8VkB}LE=;mYMDvxh3XsqkB_HzCR1C%`F>jD;ukDz#+b0{!%)de5Sn?$DW+-p=evrXmIVThMo}w+kjDV^{{}x5xnzQJO zuAE?l>syLk<9P)D2Z^@I(Nm;hmw6a{p}}b~v^YDpXbnlNuHkYXL86`pL6!KuZgUeZ zxs}}Cw>&W}K^3@tkxyH`Idxw4eqMK2*BVb!UjnYUk>8ZeO*b`ClmBINQ^=iAEqn&! zX?93`TH_h;T6Bd{5~yCemWZmZNLxP5)%d<{?jXu|ryie}+hpZnDCoNiHpmry7prRe z_SJCbF0E>dyGi`(Li~uCPW&(AgoC&;mEq>xDgeb8|JTunfUETbcxb`DyU50sZK2!| zI5o9M-37C1{N~Y~>xYU$WnW-X6cH%n%|vD1GgW0noXQ5vh*(ms(G4BASzz~@LnMiN z)6t{7G!;x%*Vai5QrX`MO5fF2igTR)#!mgLM2~u38FDC{^Z*k_zacJ&I6S%13^5_+ z3$^9f$T6=idi;S8qv_Fez8lp3kgh$CQ&R4bZ?6`8jIyn+oBWGvI6WD!rTgym?E!PU zUfKaVbljc3qv=3jZTZ-tm5b))=yx67O6N$4?(K|^U9XpNiN^9H&gWd&&5}O``fAoY z$mw5H1YRX)N}8ESiqnwTIYcI)UR^H$81W1~se-lW5jJC^6E@SD)Og=>}EKWIU z0&E!ffa%&C0->56l(k9_qpWtroJ)9xe_Gu-2`@wV~Rb)*;1DVB*oIta! zk?OPXaH$(T?F-LvN4(r1}{3Y;rrD=(cwmCO2x;9lKF$_zrp0 zT_7;&mn;T9kbE!wZy?{8!1vB;$E^j;XXnU4ZRdvYOo3h$u!`*5_|ei8waHbR$E8GW zV|xfcmKb-RH=NEl6vnEc=Z4~u#WHIzWsa+xA{*YHDr<#zIhnUW8vr(2RrieE(pZHY>~Ye%$c zRrD}XsfA?WB@*+kgU1v%_I+*v!N&ZE-_+p5_(+)iY z8^ur@{RK6c%`%vW3DS?q%R9XqE2@6@Yc%9^%f5VERGg*u4Yu1RifD=VW}R=E)_A$} z0+|(cErmpWlMD0u`OT)puDnHZ3R_<%@_-Sq25jsU=TU$rW$|m#)1}44g5hx^H@fSX z-$#INiKk&U`O7xfH5CXMQsIUJ4d8pBH(Zdk`0O_~wYqhE5u_`Aw;K`$)op=?_)x8@ zA3-3H1In#yK9}XM*7rn-B;=r2gt%{=wdXJDO{SAT(%PXRGX)yS9nzvH617-Su&gD> zMI&@?-i217s;En5j1npmsLK};G6 z4MP{`)T~;Y|9j>BCpO%zsXyAIP4%{6X8r8oF_wIJYLS(^D~k!~L7%u-87w`Ao)TNd zz>*i0AUiUJID^iDI$?z?_G-&>03nG5DCpGp4Tc*7);@JOR<>;XOFcHDh+DhaZkVs8 za6qX8+^$eAW;{YuK)QO1GqKs;!1{WHFJ@ESu0;4UIFkCq3EsoEM-Rha{G7+Ja2IiY zwdJS8FLzjy*H@ni%GZQ(c#yOPQi;Agja3SmJrb| zZRrOxTY|oh_jGEwJ!a%Ry%jZqntaii^a~BU9Sbfpfa&p5BlQKeAhNrdf=aWdo1LS_ zd`u0oa7rbR$BbstVsf>o-~%b!Lh-9uCO));;lbJC4@MUhaAW!Gg2>mYJ_Hm{BqeRQ z*;iHxz}Q}eVs`msG2*_EfrP*^dQ8X=_Ft}1^P8`75m{yAOuXNKeluUlI^M0v=jJyZ z$W6D&X*2&}cSqMv!4kJQ-G&0oO*Ep-kv~cBuS$VIDQrZCvfDvD<#Yx6!$H~UJYbnv z8#p1+)gSO8&#UyITgfT7(ZcT{zqg+XEH3q7Q9KCABv~poj2OIT-}sNxm3ZRKzC>~u zv{*o{Ssy0TWXm3}973x>#Zlxo+|8VK!ZtVdvf3@!`a)%$Mtx`cGA_g(~~#xh-Z83v^?Qgtp0*BU=# z1BHV+C3yj0QvL>Ogfv+*KRuQQOVILut4K;~LKGlUX>dOwLRFH)hJVzVi_E3t--q@C4X%4(0C746VLImzyh zPt9*i<)$|@CRUzBDY@G&kNZzI7&A6VtTGP0(W9c;%OKmfa$jO?9!EJ6bblIj?}sgI zd>%bP>Qsd|Np;BO(Nq^1KU3m;70td-R#3ik8;W(G`Ys^QmC{v?phqQgMi)i)Lv%f< zy-3_{yZ!a%LGDN^Ovo0ZFN(NT1|3?FY8FQD8vWYISaOSiuZq;Wt=q0@HgGX11Cyi4 z4c-GXMl4@DonK+&#x zx!5^HQ&}R;SR9~(O222__qj^c{1*ChnVjz4;twUgjhv*8Ov-prZ*t=2H#4$!6X(3# z6dAJQwucPE8#KS_u8M&xZtwrYf$v$J22Kq7p0Dg-pP~lMDO6&GeIDdm)hO^t^-_Ad ztW9~b>S;v7>@DMQl#m;&Ki=kyy2gm*BRkYSRPnl^uSnZH*1H_QWO?G+vzeRo+M5!Q z{vlD!Bq%g%cZ!Sr@I>XR&FGQJ$S|qsG$FW=k*srsy_)={eYxpoMQdNvP54?>?$`J) z*B?nRqDWy-j=!qvW)HOfYGt-0HIVCZE#%;1SFi~1(NWiSIk3m_wI26V&1`Bz2YYGP zckR`z7s^k@EvI@$!t%1T;I<0t#te_-!tUJYlrUzzo|Hhog8TAMLi-ec7r;Ky5h68ivoI+bGym< zXy@s()})4Jzdq;Wc_w<~mhe;2Bi{}Gy4!xBEzjp%V_Wwo_HiKLGn!PKw_r$kR4S{JuFkHq{zxwDRuS(YhOYY-)|76{4LaR zmSM@0ixm}IInW$ zv)7XY(BN(0fuZ2+8H_#p1l<+(W-vDzvyDW!aUo)J zJX+)bkTEHL%p~GT{>w!it@Lh*b_|@;cU4-;cWHlUniUGgzdL`27+d?-KiQsMCuiwa z%OAD}VqTy=c)mZ#a*4I*lVj=FD67IJ#=4P%YdN5TGosl{j^j^au6rFDGxw{<`@j89 z`}jvFb|+y~N1oqbVlf?x6LDsO>+3b4A)3wnvF9-1I%N^ljB&D*n!YTCuv6!+Q0TuDZ`X zFVpEQgp2r(I=vpnfXk}wuKT)=33Q|Ya^HVkx9D=MQ@iWFF`j|R!2h^z(8Oh}Ay^2r zE%08kJX81bU;n2tA@-Wfx~04Br{2oI;hKAz$U=sx|Vvk z+Sb;3YqeT0+(gI%xuA%EiXh5GD?H0`^TJIo`}>}Gp3QDTqQ0Ns`^U>iv(Gcn%$YN1 z&YU@O=FFKpf4a!{R=W?GAsV3h+?S11dFY7*Rh|L5H#El@=Pa0w2qQscR8<3iRaN6E zJX-A$hx|1;L{qyijXw?PgyiMq)u?q0`|yRURBgg}u* z#?EDEmE;BpyxMER79|vZ3nEFOfPqA8Ej8w!kxj95J=B99EGtsDs{59X@@?M}U@X-% z+GBw4^!HDJkKrrJf}h<4KDIBmO`ru}u2fY>RI+gYxsR(VIOFG0K}tg@Rd_JZOy?Tj zX7FG9RN?u6A^&{ z2AdDBw8C@M{q1DBV79o@PJfnPn}u|3 zChKH0t;XsPF=mn)2&!xixdWZh>Kb@RQSZ$)W139YYp!=2M}qNA(>g4YX~v^HTXPo# z=+XNgdL$XUOnRN}rE7r+dUc&_P*jj4>(Zxs7*o2bQbpA&=p(4v(5 z9l3_DI#H41IQZg@+Hm^5@L~>a15r;`+c9re_CGo=XR}inZ7b%@^ z1sps;>{6cm37V^f1A3wnaQ54!yEGSm@W^V@8-h)_mQ0FBuU;jr> z#swTPRupjjWu{XDk|J3{WQVFDWYvJFd4^UkG-vy9I-_H(Bk+5vuaf!>Rf;2)(?3oU zq)CnPz*98tNR#oJWCzrdeH%N`!N{PT{SOml(AX~Hk#=A#6On^rESP^kR&9sOdIZOg z;PG^>G^Pfz`B#hMTcy>9NIpA^Za8x|kpPi^N0f)-zl2RdOUPX@-%~VUkyf>uay+fW zdSX491XEW}J+!K&JRrdGL_m%UtW6@!#y~L$gRNU(D>rS<0D3Y9(s!V05`n#Qj;U=K z$#f%`qGH^xm@h7Qf>D81?UV||OY%+LLGU$xc&~|=7;M&Q3m?dTnG}lzt~rVXGr4Zn z%RcIqUQs!CA@=2P@$5Hb>f35Y5M;6=FxgwMmmR<3WK7rQoIyT`buPXFZ2M;9b6Cxv zZ|^Nf>afc!+*c7ilCD+%9ReZgCU%vJxfH}Zfk-@jwmT#Wf$V4?pVXHd_=4%IV*XHV z!RUT$w@N=9n5vN6{18ZDx-2>v*a3R;FBVz2)jZ!S;$ALG68gS@+==qxA+v%<{_fU> z5Li#9A1g}PWSt@>`Ec}X+kOjX3 z7g_ktMnqGz5x*WkjNi9^YHa0}=v0UdsNPOd6tpz00wyE$)Xs?*K5|r z2-#m_`atce_%LL>Bi+sDou~B70-0W z5AT-G@;j0f5P>|B`&ij>qc2$5@~n3~`Z({&K>#7n_)ra#v**j8mJuL#f+uru@~Kc^BpC0CuZu+ib5uXX^DJWb$FW*YJ6}jQ4sS+>8YMiN z*OEcRI%KP^7eDoI|9j(VCI*Ee+?5^`E4lgNCJXfGfpN&PfRbf1?`ST|e%VOrO^mwO z$mHB3^CNZ2bx{4gCE&|kNn&!YjIRG9XYBWIB{sT_^6i~yJeM~Pc-W{~i+GE<7RD8;^8G-i?CS2Sjw|GJ_vrvK+0&lr-F)nCAR zPpwm|_czutNrrP9o8W+TjJ;X#mcudiVpwp@zo6z&89lzxwDJMT=iAva?%!BX}ZF0TB^>VQf?#5BV|Iv7{2{HImq)h|+uG`8|FN~N|kX|PGr*MfVd<6VmKH(g+9 zrCTwk`@1p1&j1gR(w3(R9UwQpkGhh@L!LYas+5*_S~n0fBVkv65yhSG@*CK|GD;>Ibj?<)08+0M8wnpX@m*<&CI603Q?|CbR{^okoOk(Z$b53&Y++oa|Ul2x;~`qV4Hs zSUNIEHrZdzo>w+8A^_>T3*D1y#=8q5+JZaNumDd>M_-xzzGC(z#IRf@J1R@$4{8d0 zwv9P}Cv)y;X&A<+O)8poLRCq1YRfSAm1dYhlR9f*)iS%zS*O;S3jBnqLE)TX)JZkd z?P~IE(R9 zRR$x6Dw88pyn!ajA;S{UJailxes+WV`Z!k~xo_Z_;3uFbKb7)>D}CaB_h|L>W`2!) zuzt+nsS{oHnk=|#vK+t2G#~G&VqW|4m5iJBs~1k{fP!E2`Y!FutU;u2y0$uw)`VI`IEu1IbtEi)u;^FEE%@a3OUY`;7Q`o`%Gxzm^ z$>{iN;#X?Q;H66CWILzf?kn*uVj0b>RvwlQAbI$1izj}xR zYwGvq{B`o1{&M~%ev_?awLPDN#*Ku@>V^G-afydfiHDNJL!ZP$9uLG-tmH@j37g~h zven!>fa#oTw6EgQT^3*86bQoO^Yhd--Rk%t-YIDW;i)fmv}?yMDd+sTH3Berb)ATc zvtlxTbTQCgxcXos!; zqM-PfeIz8b(<|?Gg2)O|hExs$r)pX3TX)aMhO5NJj~vab9MpkwPxA>vJGD7R4~$B; z@SLH|xtC{))DXF(ogyhXsA7=F-}R>b;)Wtui8 zD8(hMqTZ30hmMJZL}Rm0Ca@*S2KCoTO?W)Wz>((2Ei7sPsk?*CkFLaaCU~-B|&!@UkdwBMF;8c^h1?O6BKV7SlAH(+9PC`uR-4;uI2ZC>AF?ZSG&% zQgb-x;IFYDlxNK1a6){$9)3j0E??NH!xy$OgUET}$J-+@Xw2F|EKHx{eB&{I6 zy*B&6Ig+weK{3z6o+tJt9gNmV3#ji`H-bp`>1JJoYC!*-hc`Ykjs*)vmqhKHvHE!* z%Qn&NLc#hcW7%D>{6xfwjngTxX_U*Hcew?9c|QFg?*Gy=2l0&TNmJOycUrhJtz}dR zcQwV$I_A6RGOPT3luy(o=KRjw^D>Zlidxk;!J%1M%>JBPs*F>PL|p9H7N>gzKox|I&IHP38q+gBc4{LKmc4 zog;Q^=@W`gA>eK!kN%gu3D&Q3Qj_|awBVk;+8QqFah@oz?Q3fjL zumd74IT!CS@-hGCbb3nGY}N=)j(l`I96L%4**RL(p+)8rb?|5}i%vD?gAUAg6w%`0 z;KuCpQ}Heb3+R_X!d%J4RMfnnUbvzKhNfn!Eo-@2sb;oatyii|jF}UkH?4)M`lOao zKU~YM_ANF}YUyg%^5uCcwalfK<|DKI`qoG0+}7bQ?P(D&DDZ#!$gH-}@};1q2852+ zAHjnrFBVoZ&t2RSj)hZOI7)tF&a*xzZA=UnR7#=rPg~A|J|mn&pa&#h>3TU2fI2MYgiXL3}MDF;ky45jQ9I~Tk$gc5cszzG~;yh_rNW8Nb9Z%BVB4-}0W20dhj|!%Q!*}-j0sf%b;+gUS{pn<+=(+eA!?4> zgm7NjI0b;|o^;fw=F%urK>pJPISG(hLKzGrpJ1|XX^w(RF3OZXAy-qu##oa@-WVHJ zchwF{%@Z9>w18zUY7_lwgE`C2c0`mgLLsbcp}Fk@w=6s32dUax@RR0^(^_p@J&LH% z>p{_xw&}J;FAE7l$;`4P@tyLyUU%9Wc7dg3$d2*>vNdS|=&!JW7Fp=ud`AoDw-@xi zc1Bk!`l~iJM}HLCq0I@pO!ZBc4d4S&iB3h|3v$xB*DQ_cC!(Kj1O0<&Z{gzFZ(2Y< zOVGa`9ag|!Cm9p-e Y|4H`tn(>2$zSjoeY8n0eZRzKAp&mOdw%V!R?WPvs38O`yXet3YdFsNHCG0L!Lt@>WDgn(f zo>S7P!r%!rV!J6kvyM<{1=g@lnKc{r31*Oz3;DNZ{29LWNFcDdru}iUyP*YNUcos}{3jYkZ<)*ll%AM|4UX!9}!F zN1j?YUDi20VIO4sMLFUUW&w915KB^Z^?F%BZAws?Fj6f3ZHm9bHznN@>q{3ouyD zetv`XPd^-$18Qu^=;7=%Wz?Q^)XA9Bg4bq9!_o51;uV%|yRd_dc2V?amnse|UY*&( zuvEj`Yop-;4Hm(}SBq{-A=|Plp4SPMq$8`w0y;qsTkSotuyr1M>O_m}m$lS7)G}d> z$CV!RwBkV^_Vvy>SxM8ixnI+_9PiN$>sx6R;W3}&i`t<{m&n2c**4LFtI3ywZFmrV z6!lxhETY%@NWe*b}0oU^h(-*rTI9);7$X5h(+Z*f1 zk@1K^{I8dLmL}^}HYXkKe2BnnwO-D6Q|60pH z{e2^TwykKO!mm+UrF3I1rl3a2rY)G@G(T7)k}qjcwD6qmlvya;?efpqa6)TPMw~|` zNm^5NnlY>!b!IyYE#p1pN0gHbDql?_u7tmz~nE@F0#mr-<{d>bu=}DIa9}D6wuyOR#i8Kbd$t*x3>zxxppc!)fDXk}digR2PAU$9Yx$txkF2VN~J)OQDq_9#`s9UgALxuBjA9;^BaTMe*&4 zhjodEn#6-uA9bY?LM5QA!LiI~+`-0qUF;e6jLpQRWs2)esR46}PD>LEa(38o9 zq6j$E(O4Zs{}sWNEoaS(a5-+DA{#jY!w@FWK?XL_XyuN!O4fWVx8$C+rKzZ4O=*jo zR}U$1&D?G|>YDoytz7o_*XWz5ag95bEzq`t&B$jUB8^DQwZS88wAuSvPbWCt%v;^M zqLQJ$VFo^xxlOa7=`gpHmMQmGO3UPBn9LnZid$uyZh3T^)S7s!MT|?q2Y$4QOYJItt*ZEd zQQl-%iOFDhhtIiUzxX&(hq>Yv~}>~Z15K=^{m^iwwd+i&0_+v1WBXs6|gugBG?tUfu7VCXIoT5t1Z)?p1 z7Ae^P4o*NDKn0&xeK2klRNQP_tR&n8Ow-m>0g%jdUKUQy`HsC6AEy+2MnAEe4{ean zw^X=pJcZ-u}hm!&D3tKUi7q5*R|ls zvOvWj$(5`S838gnTa#4%6k*-vuwl;(eO9gP2-^)SSQ$L#TI53NXug%zTSTLr`E&Tm zy&Qgn!evKr=9X@$q73fl*XxJGUmnWp1-ld7GYt8R&bYsEa*k4CfmI{nv?tgGLT`H@tbyUtKf7)W{ zVz*ZILGUPgc0_2veq_N$J$RD$|MD)ef7p|}?_2H8_TsXIo78~98lKkUyfr}L2Ms9P z%mnd`tve&ps$-Xq~2Bv^LN-`YZ?+9y%0p z1~NIL9P2}PvCBQ-;j`RwCc-%4UM#&_stt({lneLPh-V(F+8VOz!4J^SYxTn$b>~|D zt$M*x;>L0Za$VsDtB|%}#u@PxP)&ejaLi=T8LfTw5CKF&0~W0hESBi9+^Ct#{<)db zCAI*t*#GYw<85TyR@h&BGScnEg}uX~Boy(2wb|d}n;orHQtl^fb)2?RBL88voGsp8 z-rDr_ET%%48*Z132?gNX8tkMgo5(ZSQ9$(k{w0C(^r>DE)`~D|uaeWJOySHx#da-L z$VN+-G8ZjxT1&1~ONSq>qKu5NXR_Q?LT^6W$muL`j%Y8S=!yB zzn2N3g&lmEOO%3_)-rww@92IJ2WpLvM=i&HS^*>nLzc!`Y^A7)Uo$gEE9Kfk?oYTY zA++)N{U7`A|A!lY*IN}OH~t>7!E@QL61*Z@)UdMHQ#SsXO4DJeWi&^0Tl0glWNEfM zk;#fhtjC7dK|v#CPhw3!u|ciqSViL9%BtEu5)n_a~F1^Ugs|B+dRjL`HCS^%8)Y{u#X3VuK z8L28s*nT8p6>DK})+2&)nX$vXRWk~YhuFd_kvPyO7HH58(^6dNZ zZ;kIjB&Tb^zw;$pZfkxDJ@GNsg8vdJl42`DG3pWPQ0m+pujT6Hw*GacReSF~fJb70 zkVV#ZRi-xQX}TjJXzEHb+SNPSq~k#)5!%{WA&BTwxquq2b4meAWy(YxI0d{X~t z6C=;mK}p%B>`b+s&rMX2uq~n7G}@bNJJXtINu0Aw!?}N;-hpYt(%zCjr<{D54{BO< z+YZc84LbLy@|xoGESuYZ7j6sp&%gB`=h5~y?_lHeWk@i^jwQcPzp$U(k79)+s`LF^ zao~0gzzCQt3;7G8n_0iyt?ukT!C94-g5C*rqNX_U&l^2joMfr(}2L0cv zh*+UJGJ-qM5Jsg%c4xGESMa!;W=oB-alugyY4l3A zao3@E^h?$S%t~#iXwmi7R+LY~K z|D~;ifAx!2!T%4TFEse~(H{ms{|CU2Y8`yF4c^xT{A5-amYErrfM}c&pDVF#q0$(F zO{X|27k|X5qm~)t5AQLRHGtMGo zDig@cd-iXrA2we7s}^P+P;^A^AO;hN&Rf6~rBw~E(0%g8A4B)8pEX05lgJ9)V<ott-+1&5Ipb~VOE2;$la}&~Z*FpGsz>#K`IHm7$R@fkWz+2e8tRVh z%qrXxJ58b=2I~kVKQ=$tug*YA{>nkQ4nJN9v9|2VoyhWYgRm@Y^a;_i`fS`3n1>cTem5O7B@4?qSa0KpyuwEqF;(5t-aHtx4eILsWg58lBC&& zs}*bMjpt9@YrX6`c+=iF(G#8>2@m1eea+#BI%rO60nV;bt;2D}t`t635ZScXWYlR zkW?OzPJo}yyE`Qge{%><-52j=O;uDlHQ&n_SK~w7IH`xOVoEj#bA;dL99UMsm3--S za&U*pZ9q@5 zsAxv93rue#LS@E9K4W04gLy?`lEP6Z+>j{!a=Zq9<4y9=9bQNEu)LD5iL(Qo5UraD-31TnD z$#!v^tg|{!rW5MZ&JlQws4Wrzb-Ooo8Ua*&vIzAT$hpTW1P9`ro)}z{MREExtuDjao3(iCB0V@TZAz|r=&?i}ml;?4j7t?2 zV|jJX5=C@sqlDb^;LP$m+vo-9k^<7fCO3x^*7yp(;+&UWPz#o)HaI#A{%N&8MyW`I z8}$&jSp+MN=D`yqA_WQRlShRK7D+`6hT0Vm@|``S7C&5=&FOT(oRl>Ru`%iraq@ z3~PtoPN9(+uLPmU6LYx1g-t1Oq%iR1N-`6cob6oV8@U{Nehg2?AZ@mNmk`r}z?U01i_&heSk%V+@_Fu>#-C$vr(GQI5#_QZBFkenjaPp1)=0|EU3S`@n%^y%?3fzo2K*(rG zF#Eh3hba5S6>|R`QaPhvym#Pvh1o87J2^J6P0+fli@co}>t7$6=T?^iMt7mF+mCnA zhi2y-i?y4`m+89EIbUBakpbkN&Rsi)cUVqhnT^TVsaIIWJoz>npCGbvz+GQF>&{!s z23>k~J5}goJ+e1lU;OWXsekRoxNYTk>5CU$W8BrIv^QX^3O>|1Ijt{#IN$q_{3mC> z5ATqJ!;5d~vUTD``~PsIoOsT&vJ)LQX+XiKIN2N7-%&1+pGJ6Wb^D@(Mkw&uA$=?A zm4BXC)3~Y;oXJ)ZlOz)OnoW`fvMTjKq4n*kfUIo{iC? zEZT7}@^Y_+g-{gwN8+=5_Ya*PD}Sm>zL>avN)Dv;R)H0o3)wtu7^a#$v{X^uwh#27lw# zS8iH?qNN)iB%wJ5y%h#~d<8x8<@!q(O`n7fbdXFed2DHFRh5+b;mX~MSxQLFvM+>n ztUx*T4^_0D*0p(!OTCB!=Vw$DyTTHGN#;WbpB%W&5{Idg3OwzOwTpS$eXCW;P(#?J z-8DePdtgCH@Y|k3t}HzsiDg&J=Vm^hNIj#fX8JeUvUR}~&jr8VdDpJ&ym{_;Y`f>u z@%dS?kU74cHD2xbK62naPmaF#plG3RJF%;M!t$eq`N!su(+b8D7p36k{7Ras;r=#X z{VvUahTmixWYa}H5L+4r`86JO#5<`q^0+9EzkTG16!kG|`TfYd7(9r_GFubdyA|L^ zxqd7b*AEU1{AswVC@IyXqLd&%f6AgsqnH4YarB23bvZ>I&Dzt0HMAjjk~P6s?z%lR z+=ZUN0=ELZiYMI<`KTZI@JA?F@${4ki=mQnM>9 z!OMAe7u!-z$v3(f29$2A1ho9lw|}3pf2GGHy~h5P4v_cl_U{4vSA4r9T?RekGM{Am z6}t7WADSz#+JfLSe9b?Q?VP8cXt6|Clz)~EYbeTV9nm1g?y0Ema4eT7G-jPCQ@kRP zs4h1xkyPENr;%HB@+qV~X|ADNwT_PE6XavMbzN(?{~LskSW-eYW}jied$GyKYrkTB zV~gjGe6D;}uq0N6U#5#~DnzEKw-H8Fx0uq5Cjcem%@@9BoG)BHfeQ`CaaZ01k{z+} zi9S#+Xy$*E!7p%GB31RwGTDAL`wjs~+HyK7+!7(6z3~$&Rm757TB?DXZ_>k|C;800 zQ8B-8!=T>825~z-PDp~l9wjmQ>fuS#E9L{$s&8c)YbB#jd=PNX@Umj?7VVjm;|`Z9 z3F9_u@B7eO&ovtSJ2cdl=J&Gv`(~}$uYX|#K^a0`@DYV` ztPJvvOo81L{q+l~=x_PL+Z`98d2YwDN0YUx)8S7hK%X@dRBbqe78lnrH5q?KSKTS*iB=^Or=cF?Pl@Ti>DhFei;3 zl;{7BOGko7+WGe^p+5z20t1@9-Re%Ps{hghOGJ>UZrEq`v(pz!Iy(U>o!HUO(~eyG z+fMl=gH+0d`(HNvVB9<&wcyD@-Hse2-?kD?*xYV^lRdqZZ-u$QTxEaT-xTKMQs0ZI z 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¥OvydJA6r=#Oz+$y-?fFzkRB*_*$W} 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%0D2h;wBk^zh|kF{ZgcFj2#)jQKDeUT2!LR}l& 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