Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
77f440b
chore: stallion production release
Thor963 Mar 15, 2025
29a8aae
chore: base merged changelog
Thor963 Mar 15, 2025
f888820
fix: modifed event emitter init, added fallback for mounting prod bun…
Thor963 Mar 17, 2025
63a4527
chore(release): 2.0.1-alpha.1
Mar 17, 2025
ab3f0d4
fix: removed stallion enabled script reading logic from native, enabl…
Thor963 Mar 26, 2025
9a2197c
chore(release): 2.0.1-alpha.2
Mar 26, 2025
62cadf0
Alpha: Sync[iOS] & Restart + UI Changes (#38)
Thor963 Apr 22, 2025
c1a0316
chore: back merged main
Thor963 Apr 22, 2025
70b8067
feat: restart logic, ui revamp v0, ios sync and other bugfixes
Thor963 Apr 22, 2025
9cc9656
chore(release): 2.1.0-alpha.1
Apr 22, 2025
0620f85
chore: ios typo fix (#41)
Apr 29, 2025
c0c9bdb
fix: ios stage event typo
Thor963 Apr 29, 2025
bf9b787
chore(release): 2.1.0-alpha.2
Apr 29, 2025
3636acd
feat: added stream downloading for android (#42)
Thor963 May 11, 2025
df0d0d8
chore(release): 2.1.0-alpha.3
May 11, 2025
1471b57
feat: resume download android
Thor963 May 11, 2025
628eaca
chore(release): 2.2.0-alpha.1
May 11, 2025
d4d8433
feat: bundle signing (#44)
Thor963 Jun 6, 2025
1110e51
chore(release): 2.2.0-alpha.2
Jun 6, 2025
b16b74d
feat: bundle signing 2.3.0, back merge
Thor963 Jun 6, 2025
9e1117f
chore(release): 2.3.0-alpha.1
Jun 6, 2025
f0d454f
fix: exception handling ios newarch (#53)
Thor963 Jun 18, 2025
f36e6cd
chore: lockfile update
Thor963 Jun 18, 2025
f02c4f7
chore: node upgrade
Thor963 Jun 18, 2025
225085e
chore: node upgrade 20
Thor963 Jun 18, 2025
00bb17c
chore(release): 2.3.0-alpha.2
Jun 18, 2025
979640a
fix: removeEventListener exported
Thor963 Jun 18, 2025
c96c438
Merge branch 'alpha' of github.com-Thor963:stallion-tech/react-native…
Thor963 Jun 18, 2025
0f50efb
chore(release): 2.3.0-alpha.3
Jun 18, 2025
6c8202f
fix: android sdk token expriy logic fixed (#66)
Thor963 Jun 25, 2025
aebbe3e
chore(release): 2.3.0-alpha.4
Jun 25, 2025
044a5ad
fix: release v2.3.0-alpha.5 (#75)
Thor963 Nov 26, 2025
1093587
chore(release): 2.3.0-alpha.5
Nov 26, 2025
e7b9443
fix: js error boundary, exception handler safety checks (#86)
Thor963 Dec 16, 2025
3269c88
chore(release): 2.3.0-alpha.6
Dec 16, 2025
03cf350
chore: package stable update
Dec 17, 2025
c92e6cd
fix: android 16kb, removed react codegen block (#91)
Thor963 Dec 30, 2025
5e8c51f
chore(release): 2.3.0-alpha.7
Dec 30, 2025
e431d97
fix: alpha 2.3.1 16kb support
Thor963 Dec 30, 2025
5d0f551
Revert "fix: alpha 2.3.1 16kb support"
Thor963 Dec 30, 2025
5890a27
fix: alpha 2.3.1 release
Thor963 Dec 30, 2025
c0d576d
chore(release): 2.3.0-alpha.8
Dec 30, 2025
44a53b2
chore: back merged main
Dec 30, 2025
1b212c7
chore(release): 2.4.0-alpha.1
Dec 30, 2025
0147989
chore: back merge main
Jan 2, 2026
8d071c0
chore(release): 2.4.0-alpha.2
Jan 2, 2026
0cdde47
fix: ios precompiled deps fix pod deps installation (#93)
Thor963 Jan 3, 2026
7c1076c
chore(release): 2.4.0-alpha.3
Jan 3, 2026
3430975
feat: 2.4.0 alpha (#96)
Thor963 Jan 14, 2026
64035c3
chore(release): 2.4.0-alpha.4
Jan 14, 2026
bb51fa5
fix: getActiveBundleHash function added (#101)
Thor963 Feb 13, 2026
7cee360
chore(release): 2.4.0-alpha.5
Feb 13, 2026
1d26cd0
chore: back merged main
Thor963 Mar 5, 2026
017e79a
fix: added 16kb support for bspatch lib also (#114)
Thor963 Apr 24, 2026
27439a3
chore(release): 2.4.0-alpha.6
Apr 24, 2026
cb5e74e
chore: updated stable sdk version
Thor963 May 12, 2026
5dc99ec
fix: custom base url support (#109)
Thor963 Jun 6, 2026
4025225
chore(release): 2.4.0-alpha.7
Jun 6, 2026
68ac8fc
chore: back merged main
Thor963 Jun 7, 2026
a2fcd8a
chore(release): 2.5.0-alpha.1
Jun 7, 2026
9131422
chore: version updated, test removed
Thor963 Jun 7, 2026
b18ffb5
Merge branch 'alpha' of github.com-Thor963:stallion-tech/react-native…
Thor963 Jun 7, 2026
0ffa2a8
chore: ci pipeline publish modification
Thor963 Jun 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,48 +4,48 @@ on:
branches:
- main
- alpha

jobs:
build-and-publish:
runs-on: ubuntu-latest
# Prevent the app's own release commit from re-triggering this workflow
if: github.actor != 'stallion-release-bot[bot]'
permissions: write-all
steps:
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.RELEASE_APP_ID }}
private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}

- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
fetch-depth: 0
persist-credentials: true

- name: Setup
uses: ./.github/actions/setup

- name: Typecheck files
run: yarn typecheck

- name: Checkout
uses: actions/checkout@v3

- name: Setup
uses: ./.github/actions/setup

- name: Run unit tests
run: yarn test --maxWorkers=2 --coverage

- name: Checkout
uses: actions/checkout@v3

- name: Setup
uses: ./.github/actions/setup

- name: Setup git user
run: |
git config --global user.name ${{ secrets.GH_DEPLOY_NAME }}
git config --global user.email ${{ secrets.GH_DEPLOY_EMAIL }}
git config --global user.name "${{ secrets.GH_DEPLOY_NAME }}"
git config --global user.email "${{ secrets.GH_DEPLOY_EMAIL }}"

- name: Prep release
run: yarn prepare-release

- name: Release package
run: yarn semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GIT_AUTHOR_EMAIL: ${{ secrets.GH_DEPLOY_EMAIL }}
GIT_AUTHOR_NAME: ${{ secrets.GH_DEPLOY_NAME }}
Expand Down
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,34 @@
# [2.5.0-alpha.1](https://github.com/stallion-tech/react-native-stallion/compare/v2.4.0...v2.5.0-alpha.1) (2026-06-07)


### Bug Fixes

* added 16kb support for bspatch lib also ([#114](https://github.com/stallion-tech/react-native-stallion/issues/114)) ([017e79a](https://github.com/stallion-tech/react-native-stallion/commit/017e79a124f0043c54cab302a47b1e1833927b16))
* alpha 2.3.1 release ([5890a27](https://github.com/stallion-tech/react-native-stallion/commit/5890a27f0e39e7f3b698d0f155e50196c36f335d))
* android 16kb, removed react codegen block ([#91](https://github.com/stallion-tech/react-native-stallion/issues/91)) ([c92e6cd](https://github.com/stallion-tech/react-native-stallion/commit/c92e6cd4dea287643ad1d87262a71303af805d6b))
* android sdk token expriy logic fixed ([#66](https://github.com/stallion-tech/react-native-stallion/issues/66)) ([6c8202f](https://github.com/stallion-tech/react-native-stallion/commit/6c8202fff4a46c9eaf066d793b402e9d9084bed3))
* custom base url support ([#109](https://github.com/stallion-tech/react-native-stallion/issues/109)) ([5dc99ec](https://github.com/stallion-tech/react-native-stallion/commit/5dc99ec5f6bd73ae91f0a3ef8f8aa87ba0427e67))
* exception handling ios newarch ([#53](https://github.com/stallion-tech/react-native-stallion/issues/53)) ([f0d454f](https://github.com/stallion-tech/react-native-stallion/commit/f0d454fe9ebf83bcbc2b09fd96bb17dd5b2a8a82)), closes [#49](https://github.com/stallion-tech/react-native-stallion/issues/49)
* getActiveBundleHash function added ([#101](https://github.com/stallion-tech/react-native-stallion/issues/101)) ([bb51fa5](https://github.com/stallion-tech/react-native-stallion/commit/bb51fa551b05b6eb3d4996e2db0d4c9b895a64d8))
* ios precompiled deps fix pod deps installation ([#93](https://github.com/stallion-tech/react-native-stallion/issues/93)) ([0cdde47](https://github.com/stallion-tech/react-native-stallion/commit/0cdde4781b5e441e7b84803612e9949d5ccb07f7))
* ios stage event typo ([c0c9bdb](https://github.com/stallion-tech/react-native-stallion/commit/c0c9bdbc4d15cad7934559fbef6a397dde4a6c50))
* js error boundary, exception handler safety checks ([#86](https://github.com/stallion-tech/react-native-stallion/issues/86)) ([e7b9443](https://github.com/stallion-tech/react-native-stallion/commit/e7b94434f280f0160630b30890aced8ea36c3410))
* modifed event emitter init, added fallback for mounting prod bundle ([#32](https://github.com/stallion-tech/react-native-stallion/issues/32)) ([f888820](https://github.com/stallion-tech/react-native-stallion/commit/f888820305f57bc76649673d289ff15949558ab8))
* release v2.3.0-alpha.5 ([#75](https://github.com/stallion-tech/react-native-stallion/issues/75)) ([044a5ad](https://github.com/stallion-tech/react-native-stallion/commit/044a5addc9b36c153946e847ac9b34c59e5c5be5))
* removed stallion enabled script reading logic from native, enabled by default ([ab3f0d4](https://github.com/stallion-tech/react-native-stallion/commit/ab3f0d4ba6d20f4277b0611c9a6783d49e44cb3f))
* removeEventListener exported ([979640a](https://github.com/stallion-tech/react-native-stallion/commit/979640a8b485d8ab0bb03b5799fc176289429228))


### Features

* 2.4.0 alpha ([#96](https://github.com/stallion-tech/react-native-stallion/issues/96)) ([3430975](https://github.com/stallion-tech/react-native-stallion/commit/3430975b038b0d82f1549d104d7277ce2d540020))
* added stream downloading for android ([#42](https://github.com/stallion-tech/react-native-stallion/issues/42)) ([3636acd](https://github.com/stallion-tech/react-native-stallion/commit/3636acd4d48c4ae2e5f5659e4f0a31239f745d4b))
* bundle signing ([#44](https://github.com/stallion-tech/react-native-stallion/issues/44)) ([d4d8433](https://github.com/stallion-tech/react-native-stallion/commit/d4d84335409ef9b8b4eb5c223ef5217f4d0cd54f)), closes [#49](https://github.com/stallion-tech/react-native-stallion/issues/49)
* bundle signing 2.3.0, back merge ([b16b74d](https://github.com/stallion-tech/react-native-stallion/commit/b16b74d7bba4a07aa52af6a1864e2c971cea46ab))
* restart logic, ui revamp v0, ios sync and other bugfixes ([70b8067](https://github.com/stallion-tech/react-native-stallion/commit/70b806753d2a3784686b93ebe15eef802d2665e8))
* resume download android ([1471b57](https://github.com/stallion-tech/react-native-stallion/commit/1471b5780608df29437fbe8048205fb3537d2859))

# [2.4.0-alpha.7](https://github.com/stallion-tech/react-native-stallion/compare/v2.4.0-alpha.6...v2.4.0-alpha.7) (2026-06-06)
# [2.4.0](https://github.com/stallion-tech/react-native-stallion/compare/v2.3.2...v2.4.0) (2026-05-12)


Expand All @@ -8,6 +39,13 @@
# [2.4.0-alpha.6](https://github.com/stallion-tech/react-native-stallion/compare/v2.4.0-alpha.5...v2.4.0-alpha.6) (2026-04-24)


### Bug Fixes

* custom base url support ([#109](https://github.com/stallion-tech/react-native-stallion/issues/109)) ([5dc99ec](https://github.com/stallion-tech/react-native-stallion/commit/5dc99ec5f6bd73ae91f0a3ef8f8aa87ba0427e67))

# [2.4.0-alpha.6](https://github.com/stallion-tech/react-native-stallion/compare/v2.4.0-alpha.5...v2.4.0-alpha.6) (2026-04-24)


### Bug Fixes

* added 16kb support for bspatch lib also ([#114](https://github.com/stallion-tech/react-native-stallion/issues/114)) ([017e79a](https://github.com/stallion-tech/react-native-stallion/commit/017e79a124f0043c54cab302a47b1e1833927b16))
Expand Down
20 changes: 15 additions & 5 deletions android/src/main/java/com/stallion/StallionModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,21 @@ public String getName() {

@ReactMethod
public void onLaunch(String launchData) {
// try {
// JSONObject launchDataJson = new JSONObject(launchData);
// } catch (Exception e) {
// e.printStackTrace();
// }
try {
String customBaseUrl = null;
if (launchData != null && !launchData.isEmpty()) {
JSONObject launchDataJson = new JSONObject(launchData);
if (launchDataJson.has("baseUrl") && !launchDataJson.isNull("baseUrl")) {
String baseUrl = launchDataJson.optString("baseUrl", "");
if (!baseUrl.isEmpty()) {
customBaseUrl = baseUrl;
}
}
}
com.stallion.utils.StallionApiBaseUrl.set(customBaseUrl);
} catch (Exception e) {
e.printStackTrace();
}
stallionStateManager.setIsMounted(true);
DeviceEventManagerModule.RCTDeviceEventEmitter eventEmitter = getReactApplicationContext().getJSModule(
DeviceEventManagerModule.RCTDeviceEventEmitter.class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,28 @@ public class StallionApiConstants {
public static final String STALLION_SDK_TOKEN_KEY = "x-sdk-pin-access-token";
public static final String STALLION_DEVICE_ID_KEY = "uid";

/** Legacy global API host; used only to detect implicit defaults in prefs. */
public static final String LEGACY_DEFAULT_STALLION_API_BASE = "https://api.stalliontech.io";

public static final String STALLION_API_BASE = "https://api.stalliontech.io";
public static final String REGIONAL_API_BASE_AP = "https://api-ap.stalliontech.io";
public static final String REGIONAL_API_BASE_US = "https://api-us.stalliontech.io";

/** @deprecated Use LEGACY_DEFAULT_STALLION_API_BASE or getStallionApiBase() */
@Deprecated
public static final String DEFAULT_STALLION_API_BASE = LEGACY_DEFAULT_STALLION_API_BASE;

/**
* Gets the API base URL from config or returns default
* @return String - The base URL to use
*/
public static String getStallionApiBase() {
return com.stallion.utils.StallionApiBaseUrl.get();
}

// Keep old constant for backward compatibility, but mark as deprecated
/** @deprecated Use getStallionApiBase() instead */
@Deprecated
public static final String STALLION_API_BASE = DEFAULT_STALLION_API_BASE;

public static final String STALLION_INFO_API_PATH = "/api/v1/promoted/get-update-meta";
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static void sync() {

// Make API call using StallionApiManager
JSONObject releaseMeta = StallionApiManager.post(
StallionApiConstants.STALLION_API_BASE + StallionApiConstants.STALLION_INFO_API_PATH,
StallionApiConstants.getStallionApiBase() + StallionApiConstants.STALLION_INFO_API_PATH,
requestPayload.toString()
);

Expand Down
25 changes: 24 additions & 1 deletion android/src/main/java/com/stallion/storage/StallionConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@

import java.util.UUID;

import com.stallion.storage.StallionConfigConstants;
import com.stallion.utils.StallionApiBaseUrl;

public class StallionConfig {
private String uid;
private final String projectId;
Expand All @@ -22,7 +25,7 @@ public class StallionConfig {
private String lastDownloadingUrl;
private String lastUnverifiedHash;
private final String publicSigningKey;

private String baseUrl;

public StallionConfig(Context context, SharedPreferences sharedPreferences) {
this.sharedPreferences = sharedPreferences;
Expand Down Expand Up @@ -77,6 +80,8 @@ public StallionConfig(Context context, SharedPreferences sharedPreferences) {
this.filesDirectory = context.getFilesDir().getAbsolutePath();
this.lastDownloadingUrl = sharedPreferences.getString(StallionConfigConstants.LAST_DOWNLOADING_URL_IDENTIFIER, "");
this.lastUnverifiedHash = sharedPreferences.getString(StallionConfigConstants.LAST_UNVERIFIED_HASH, "");
String storedBaseUrl = sharedPreferences.getString(StallionConfigConstants.BASE_URL_IDENTIFIER, "");
this.baseUrl = storedBaseUrl != null ? storedBaseUrl : "";
}

public String getLastDownloadingUrl() {
Expand Down Expand Up @@ -143,6 +148,23 @@ public String getPublicSigningKey() {
return this.publicSigningKey;
}

public String getBaseUrl() {
return this.baseUrl;
}

public void setBaseUrl(String baseUrl) {
if (baseUrl == null || baseUrl.isEmpty()) {
this.baseUrl = "";
sharedPreferences.edit().remove(StallionConfigConstants.BASE_URL_IDENTIFIER).apply();
return;
}
this.baseUrl = baseUrl;
sharedPreferences
.edit()
.putString(StallionConfigConstants.BASE_URL_IDENTIFIER, this.baseUrl)
.apply();
}

public JSONObject toJSON() {
JSONObject configJson = new JSONObject();
try {
Expand All @@ -151,6 +173,7 @@ public JSONObject toJSON() {
configJson.put("appToken", this.appToken);
configJson.put("sdkToken", this.sdkToken);
configJson.put("appVersion", this.appVersion);
configJson.put("baseUrl", StallionApiBaseUrl.get());
return configJson;
} catch (JSONException ignored) {
return new JSONObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class StallionConfigConstants {
public static final String API_KEY_IDENTIFIER = "x-sdk-access-token";
public static final String LAST_DOWNLOADING_URL_IDENTIFIER = "StallionLastDownloadingUrl";
public static final String LAST_UNVERIFIED_HASH = "LastUnverifiedHash";
public static final String BASE_URL_IDENTIFIER = "StallionBaseUrl";

public static final String PROD_DIRECTORY = "/StallionProd";
public static final String STAGE_DIRECTORY = "/StallionStage";
Expand Down
59 changes: 59 additions & 0 deletions android/src/main/java/com/stallion/utils/StallionApiBaseUrl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.stallion.utils;

import com.stallion.storage.StallionConfig;
import com.stallion.storage.StallionStateManager;
import com.stallion.networkmanager.StallionApiConstants;

public class StallionApiBaseUrl {

/**
* Gets the API base URL: custom baseUrl if set, else regional URL from app token.
* @return String - The base URL to use
*/
public static String get() {
try {
StallionStateManager stateManager = StallionStateManager.getInstance();
if (stateManager != null && stateManager.getStallionConfig() != null) {
return resolve(stateManager.getStallionConfig());
}
} catch (Exception e) {
// Fallback to regional default on any error
}
return StallionApiConstants.REGIONAL_API_BASE_AP;
}

static String resolve(StallionConfig config) {
String stored = config.getBaseUrl();
if (stored != null && !stored.isEmpty()) {
return stored;
}

String region = StallionTokenRegion.parseTokenRegion(config.getAppToken());
if (region == null) {
region = StallionTokenRegion.defaultRegion();
}
return regionalBaseUrl(region);
}

static String regionalBaseUrl(String region) {
if ("us".equals(region)) {
return StallionApiConstants.REGIONAL_API_BASE_US;
}
return StallionApiConstants.REGIONAL_API_BASE_AP;
}

/**
* Sets a custom base URL, or clears it when null/empty.
* @param baseUrl - The custom base URL to set, or null/empty to clear
*/
public static void set(String baseUrl) {
try {
StallionStateManager stateManager = StallionStateManager.getInstance();
if (stateManager != null && stateManager.getStallionConfig() != null) {
stateManager.getStallionConfig().setBaseUrl(baseUrl);
}
} catch (Exception e) {
// Silently fail
}
}
}
51 changes: 51 additions & 0 deletions android/src/main/java/com/stallion/utils/StallionTokenRegion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.stallion.utils;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

public final class StallionTokenRegion {

private static final Set<String> VALID_REGIONS = new HashSet<>(Arrays.asList("ap", "us"));

private StallionTokenRegion() {}

/**
* Parses the region prefix from a Stallion token.
* Returns "ap", "us", or null. Null means legacy unprefixed token; caller should default to "ap".
*/
public static String parseTokenRegion(String token) {
if (token == null) {
return null;
}
token = token.trim();
if (token.isEmpty()) {
return null;
}

// App token: spb_<region>_<44-char nanoid> → 49 chars
if (token.startsWith("spb_") && token.length() == 49 && token.charAt(6) == '_') {
return extractRegion(token);
}

// CI token: stl_<region>_<36-char nanoid> → 43 chars
if (token.startsWith("stl_") && token.length() == 43 && token.charAt(6) == '_') {
return extractRegion(token);
}

return null;
}

public static String defaultRegion() {
return "ap";
}

private static String extractRegion(String token) {
String code = token.substring(4, 6).toLowerCase(Locale.ROOT);
if (!code.matches("[a-z]{2}")) {
return null;
}
return VALID_REGIONS.contains(code) ? code : null;
}
}
7 changes: 0 additions & 7 deletions example/android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,4 @@
<string name="app_name">StallionExample</string>
<string name="StallionProjectId">67210b6f3e19d894c6a1a4fb</string>
<string name="StallionAppToken">spb_KLNEjOkETM48i3N1SffGDvEl-OsSiHZrhxER2kq3Ok</string>
<string name="StallionPublicSigningKey">MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApm9SgaDU9lXLi5OD6sd9
WpNP8bWeGRzLYOReqH5yuu21kYTDaDt1/+vTpCBNuyX2ZjtKNvKujnAXuWf8Zfj4
JcWb/r4clDQK0sNy8G7x7s+4Mup6W73lW5AtUnREQZX8IA00lp76r9ii6HYxXTpO
CgHpXyRyPLkMNc+HxaTmDHbldZtRCREcLldI7NnQkFMyZlHK2r1QxiQLpTIEK0vI
IJyXeHOeJUROebZn/UI7UDKiSCvlaHMsJ4pnIAyLrtqFQ8w9rf3aljmYX52m6Rbc
df8fwbWtBCH8OPW5SEDTMDzvE1siAvYwRNxbeXHMrAypPg/DaATdXoKMObjJWRm1
owIDAQAB</string>
</resources>
Loading
Loading