spoof.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. const mcc = "{{mcc}}"
  2. const mnc = "{{mnc}}"
  3. const simOperator = "{{simOperator}}"
  4. const networkOperator = "{{networkOperator}}"
  5. const simSerialNumber = "{{simSerialNumber}}"
  6. const iccId = "{{iccId}}"
  7. const number = "{{number}}"
  8. const imei = "{{imei}}"
  9. const imsi = "{{imsi}}"
  10. const countryIso = "{{countryIso}}"
  11. const subId = "{{subId}}"
  12. class Log {
  13. static TAG = "[SMS]"
  14. static Debug = false
  15. static format(...msg) {
  16. let m = []
  17. for (let i = 0; i < msg.length; i++) {
  18. if (typeof msg[i] === "object") {
  19. m.push(JSON.stringify(msg[i]))
  20. } else {
  21. m.push(msg[i])
  22. }
  23. }
  24. m = m.join(" ")
  25. return m
  26. }
  27. static i(...msg) {
  28. if (!this.Debug) return
  29. console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  30. }
  31. static w(...msg) {
  32. console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  33. }
  34. static e(...msg) {
  35. console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  36. }
  37. static s(...msg) {
  38. console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  39. }
  40. }
  41. setImmediate(() => {
  42. Java.perform(function () {
  43. Log.i("")
  44. Log.i("[.] Cert Pinning Bypass/Re-Pinning")
  45. var CertificateFactory = Java.use(
  46. "java.security.cert.CertificateFactory"
  47. )
  48. var FileInputStream = Java.use("java.io.FileInputStream")
  49. var BufferedInputStream = Java.use("java.io.BufferedInputStream")
  50. var X509Certificate = Java.use("java.security.cert.X509Certificate")
  51. var KeyStore = Java.use("java.security.KeyStore")
  52. var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory")
  53. var SSLContext = Java.use("javax.net.ssl.SSLContext")
  54. // Load CAs from an InputStream
  55. Log.i("[+] Loading our CA...")
  56. var cf = CertificateFactory.getInstance("X.509")
  57. try {
  58. var fileInputStream = FileInputStream.$new(
  59. "/data/local/tmp/cert-der.crt"
  60. )
  61. } catch (err) {
  62. Log.i("[o] " + err)
  63. }
  64. var bufferedInputStream = BufferedInputStream.$new(fileInputStream)
  65. var ca = cf.generateCertificate(bufferedInputStream)
  66. bufferedInputStream.close()
  67. var certInfo = Java.cast(ca, X509Certificate)
  68. Log.i("[o] Our CA Info: " + certInfo.getSubjectDN())
  69. // Create a KeyStore containing our trusted CAs
  70. Log.i("[+] Creating a KeyStore for our CA...")
  71. var keyStoreType = KeyStore.getDefaultType()
  72. var keyStore = KeyStore.getInstance(keyStoreType)
  73. keyStore.load(null, null)
  74. keyStore.setCertificateEntry("ca", ca)
  75. // Create a TrustManager that trusts the CAs in our KeyStore
  76. Log.i(
  77. "[+] Creating a TrustManager that trusts the CA in our KeyStore..."
  78. )
  79. var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm()
  80. var tmf = TrustManagerFactory.getInstance(tmfAlgorithm)
  81. tmf.init(keyStore)
  82. Log.i("[+] Our TrustManager is ready...")
  83. Log.i("[+] Hijacking SSLContext methods now...")
  84. Log.i("[-] Waiting for the app to invoke SSLContext.init()...")
  85. SSLContext.init.overload(
  86. "[Ljavax.net.ssl.KeyManager;",
  87. "[Ljavax.net.ssl.TrustManager;",
  88. "java.security.SecureRandom"
  89. ).implementation = function (a, b, c) {
  90. Log.i("[o] App invoked javax.net.ssl.SSLContext.init...")
  91. SSLContext.init
  92. .overload(
  93. "[Ljavax.net.ssl.KeyManager;",
  94. "[Ljavax.net.ssl.TrustManager;",
  95. "java.security.SecureRandom"
  96. )
  97. .call(this, a, tmf.getTrustManagers(), c)
  98. Log.i(
  99. "[+] SSLContext initialized with our custom TrustManager!"
  100. )
  101. }
  102. const SmsManager = Java.use("android.telephony.SmsManager")
  103. SmsManager.getSmsManagerForSubscriptionId.overload(
  104. "int"
  105. ).implementation = function (i) {
  106. const _smsManager = this.getSmsManagerForSubscriptionId(i)
  107. Log.i(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
  108. return _smsManager
  109. }
  110. SmsManager.getDefault.overload().implementation = function () {
  111. const _smsManager = this.getDefault()
  112. Log.i(`SmsManager.getDefault`)
  113. return _smsManager
  114. }
  115. SmsManager.getDefaultSmsSubscriptionId.overload().implementation =
  116. function () {
  117. const _subId = this.getDefaultSmsSubscriptionId()
  118. Log.i(
  119. `spoof SmsManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
  120. )
  121. return parseInt(subId)
  122. }
  123. SmsManager.getSubscriptionId.overload().implementation = function () {
  124. const _subId = this.getSubscriptionId()
  125. Log.i(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
  126. return parseInt(subId)
  127. }
  128. SmsManager.getCarrierConfigValues.overload().implementation =
  129. function () {
  130. const _config = this.getCarrierConfigValues()
  131. Log.i(`SmsManager.getCarrierConfigValues: ${_config}`)
  132. return _config
  133. }
  134. const CarrierConfigManager = Java.use(
  135. "android.telephony.CarrierConfigManager"
  136. )
  137. CarrierConfigManager.getConfigForSubId.overload("int").implementation =
  138. function (i) {
  139. const _config = this.getConfigForSubId(i)
  140. Log.i(`CarrierConfigManager.getConfigForSubId: ${i}`)
  141. return _config
  142. }
  143. const SubscriptionManager = Java.use(
  144. "android.telephony.SubscriptionManager"
  145. )
  146. SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
  147. function () {
  148. const _count = this.getActiveSubscriptionInfoCount()
  149. Log.i(
  150. `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
  151. )
  152. return _count
  153. }
  154. SubscriptionManager.getDefaultSubscriptionId.overload().implementation =
  155. function () {
  156. const _subId = this.getDefaultSubscriptionId()
  157. Log.i(
  158. `spoof SubscriptionManager.getDefaultSubscriptionId: ${_subId} -> ${subId}`
  159. )
  160. return parseInt(subId)
  161. }
  162. SubscriptionManager.getDefaultSmsSubscriptionId.overload().implementation =
  163. function () {
  164. const _subId = this.getDefaultSmsSubscriptionId()
  165. Log.i(
  166. `spoof SubscriptionManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
  167. )
  168. return parseInt(subId)
  169. }
  170. SubscriptionManager.getDefaultVoiceSubscriptionId.overload().implementation =
  171. function () {
  172. const _subId = this.getDefaultVoiceSubscriptionId()
  173. Log.i(
  174. `spoof SubscriptionManager.getDefaultVoiceSubscriptionId: ${_subId} -> ${subId}`
  175. )
  176. return parseInt(subId)
  177. }
  178. SubscriptionManager.getActiveDataSubscriptionId.overload().implementation =
  179. function () {
  180. const _subId = this.getActiveDataSubscriptionId()
  181. Log.i(
  182. `spoof SubscriptionManager.getActiveDataSubscriptionId: ${_subId} -> ${subId}`
  183. )
  184. return parseInt(subId)
  185. }
  186. SubscriptionManager.getSlotIndex.overload("int").implementation =
  187. function (i) {
  188. const _slotIndex = this.getSlotIndex(i)
  189. Log.i(
  190. `spoof SubscriptionManager.getSlotIndex: ${_slotIndex} -> 0`
  191. )
  192. return 0
  193. }
  194. SubscriptionManager.isUsableSubscriptionId.overload(
  195. "int"
  196. ).implementation = function (i) {
  197. const _isUsable = this.isUsableSubscriptionId(i)
  198. Log.i(
  199. `SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`
  200. )
  201. return _isUsable
  202. }
  203. SubscriptionManager.isValidSubscriptionId.overload(
  204. "int"
  205. ).implementation = function (i) {
  206. const _isValid = this.isValidSubscriptionId(i)
  207. Log.i(
  208. `spoof SubscriptionManager.isValidSubscriptionId(${i}): ${_isValid} -> true`
  209. )
  210. return true
  211. }
  212. SubscriptionManager.getPhoneNumber.overload("int").implementation =
  213. function (i) {
  214. Log.i(
  215. `spoof SubscriptionManager.getPhoneNumber(${i}): -> ${number}`
  216. )
  217. return number
  218. }
  219. SubscriptionManager.getPhoneNumber.overload(
  220. "int",
  221. "int"
  222. ).implementation = function (i, i2) {
  223. Log.i(
  224. `spoof SubscriptionManager.getPhoneNumber(${i},${i2}): -> ${number}`
  225. )
  226. return number
  227. }
  228. SubscriptionManager.getActiveSubscriptionInfoList.overload().implementation =
  229. function () {
  230. const _list = this.getActiveSubscriptionInfoList()
  231. Log.i(
  232. `SubscriptionManager.getActiveSubscriptionInfoList ${_list.size()}`
  233. )
  234. return _list
  235. }
  236. SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
  237. function () {
  238. const _list = this.getActiveSubscriptionIdList()
  239. Log.i(
  240. `spoof SubscriptionManager.getActiveSubscriptionIdList ${_list} -> ${subId}`
  241. )
  242. return [parseInt(subId)]
  243. }
  244. SubscriptionManager.getActiveSubscriptionInfo.overload(
  245. "int"
  246. ).implementation = function (i) {
  247. const _info = this.getActiveSubscriptionInfo(i)
  248. const simCount = this.getActiveSubscriptionInfoCountMax()
  249. let subInfo = null
  250. try {
  251. for (let i = 0; i < simCount; i++) {
  252. subInfo = this.getActiveSubscriptionInfoForSimSlotIndex(i)
  253. if (subInfo) {
  254. break
  255. }
  256. }
  257. Log.i(
  258. `spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`
  259. )
  260. } catch (error) {
  261. console.error(
  262. `spoof error SubscriptionManager.getActiveSubscriptionInfo(${i})`
  263. )
  264. error.printStackTrace()
  265. }
  266. return subInfo
  267. }
  268. SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex.overload(
  269. "int"
  270. ).implementation = function (i) {
  271. const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
  272. Log.i(
  273. `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
  274. _info ? "ok" : "null"
  275. }`
  276. )
  277. return _info
  278. }
  279. SubscriptionManager.isActiveSubscriptionId.overload(
  280. "int"
  281. ).implementation = function (i) {
  282. const _isActive = this.isActiveSubscriptionId(i)
  283. Log.i(
  284. `spoof SubscriptionManager.isActiveSubscriptionId(${i}): ${_isActive} -> true`
  285. )
  286. return true
  287. }
  288. const SubscriptionInfo = Java.use("android.telephony.SubscriptionInfo")
  289. SubscriptionInfo.getMcc.overload().implementation = function () {
  290. const _mcc = this.getMcc()
  291. Log.i(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
  292. return parseInt(mcc)
  293. }
  294. SubscriptionInfo.getMnc.overload().implementation = function () {
  295. const _mnc = this.getMnc()
  296. Log.i(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
  297. return parseInt(mnc)
  298. }
  299. SubscriptionInfo.getMccString.overload().implementation = function () {
  300. const _mccString = this.getMccString()
  301. Log.i(
  302. `spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`
  303. )
  304. return mcc
  305. }
  306. SubscriptionInfo.getMncString.overload().implementation = function () {
  307. const _mncString = this.getMncString()
  308. Log.i(
  309. `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
  310. )
  311. return mnc
  312. }
  313. SubscriptionInfo.getNumber.overload().implementation = function () {
  314. const _number = this.getNumber()
  315. Log.i(
  316. `spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`
  317. )
  318. return number
  319. }
  320. SubscriptionInfo.getIccId.overload().implementation = function () {
  321. const _iccId = this.getIccId()
  322. Log.i(
  323. `spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`
  324. )
  325. return iccId
  326. }
  327. SubscriptionInfo.getCountryIso.overload().implementation = function () {
  328. const _countryIso = this.getCountryIso()
  329. Log.i(
  330. `spoof SubscriptionInfo.getCountryIso: ${_countryIso} -> ${countryIso}`
  331. )
  332. return countryIso
  333. }
  334. SubscriptionInfo.getSubscriptionId.overload().implementation =
  335. function () {
  336. const _subId = this.getSubscriptionId()
  337. if (!subId) {
  338. Log.i(_subId)
  339. return _subId
  340. }
  341. Log.i(
  342. `spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`
  343. )
  344. return parseInt(subId)
  345. }
  346. const TelephonyManager = Java.use("android.telephony.TelephonyManager")
  347. TelephonyManager.createForSubscriptionId.overload(
  348. "int"
  349. ).implementation = function (i) {
  350. Log.i(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
  351. return this
  352. }
  353. TelephonyManager.getLine1Number.overload().implementation =
  354. function () {
  355. const _number = this.getLine1Number()
  356. Log.i(
  357. `spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`
  358. )
  359. return number
  360. }
  361. TelephonyManager.getSimOperator.overload().implementation =
  362. function () {
  363. const _simOperator = this.getSimOperator()
  364. Log.i(
  365. `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
  366. )
  367. return simOperator
  368. }
  369. TelephonyManager.getNetworkOperator.overload().implementation =
  370. function () {
  371. const _networkOperator = this.getNetworkOperator()
  372. Log.i(
  373. `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
  374. )
  375. return networkOperator
  376. }
  377. TelephonyManager.getSimSerialNumber.overload().implementation =
  378. function () {
  379. const _simSerialNumber = this.getSimSerialNumber()
  380. Log.i(
  381. `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
  382. )
  383. return simSerialNumber
  384. }
  385. TelephonyManager.getSubscriberId.overload().implementation =
  386. function () {
  387. const _imsi = this.getSubscriberId()
  388. Log.i(
  389. `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
  390. )
  391. return imsi
  392. }
  393. TelephonyManager.getImei.overload().implementation = function () {
  394. const _imei = this.getImei()
  395. Log.i(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
  396. return imei
  397. }
  398. TelephonyManager.getNetworkCountryIso.overload().implementation =
  399. function () {
  400. const _countryIso = this.getNetworkCountryIso()
  401. Log.i(
  402. `spoof TelephonyManager.getNetworkCountryIso: ${_countryIso} -> ${countryIso}`
  403. )
  404. return countryIso
  405. }
  406. TelephonyManager.getSimCountryIso.overload().implementation =
  407. function () {
  408. const _countryIso = this.getSimCountryIso()
  409. Log.i(
  410. `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
  411. )
  412. return countryIso
  413. }
  414. TelephonyManager.getSubscriptionId.overload().implementation =
  415. function () {
  416. const _subId = this.getSubscriptionId()
  417. if (!subId) {
  418. Log.i(_subId)
  419. return _subId
  420. }
  421. Log.i(
  422. `spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`
  423. )
  424. return parseInt(subId)
  425. }
  426. TelephonyManager.getSimState.overload().implementation = function () {
  427. const _simState = this.getSimState()
  428. Log.i(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
  429. return 5
  430. }
  431. const PhoneNumberVerification = Java.use(
  432. "com.google.android.gms.constellation.PhoneNumberVerification"
  433. )
  434. PhoneNumberVerification.$init.overload(
  435. "java.lang.String",
  436. "long",
  437. "int",
  438. "int",
  439. "java.lang.String",
  440. "android.os.Bundle"
  441. ).implementation = function (str, j, i, i2, str2, bundle) {
  442. Log.i("PhoneNumberVerification.$init")
  443. Log.i(
  444. `str: ${str}, j: ${j}, i: ${i}, i2: ${i2}, str2: ${str2}`
  445. )
  446. // print bundle
  447. if (bundle) {
  448. const keySet = bundle.keySet().toArray()
  449. for (let i = 0; i < keySet.length; i++) {
  450. const key = keySet[i]
  451. Log.i(`key: ${key}, value: ${bundle.get(key)}`)
  452. }
  453. }
  454. return this.$init(str, j, i, i2, str2, bundle)
  455. }
  456. const aays = Java.use("aays")
  457. aays.d.overload("int", "boolean").implementation = function (i, z) {
  458. Log.i("aays.d", i, z, Object.keys(this.f.value))
  459. return number
  460. }
  461. const aoor = Java.use("aoor")
  462. aoor.h.overload("android.content.Context", "int").implementation =
  463. function (c, i) {
  464. const _i = this.h(c, i)
  465. Log.i("aoor.h", c, i, _i)
  466. return _i
  467. }
  468. const SetAsterismConsentRequest = Java.use(
  469. "com.google.android.gms.asterism.SetAsterismConsentRequest"
  470. )
  471. SetAsterismConsentRequest.$init.overload(
  472. //int i, int i2, int i3, int[] iArr, Long l, int i4, Bundle bundle, int i5, String str, String str2, String str3, String str4, String str5, String str6, String str7, String str8
  473. "int",
  474. "int",
  475. "int",
  476. "[I",
  477. "java.lang.Long",
  478. "int",
  479. "android.os.Bundle",
  480. "int",
  481. "java.lang.String",
  482. "java.lang.String",
  483. "java.lang.String",
  484. "java.lang.String",
  485. "java.lang.String",
  486. "java.lang.String",
  487. "java.lang.String",
  488. "java.lang.String"
  489. ).implementation = function (
  490. i,
  491. i2,
  492. i3,
  493. iArr,
  494. l,
  495. i4,
  496. bundle,
  497. i5,
  498. str,
  499. str2,
  500. str3,
  501. str4,
  502. str5,
  503. str6,
  504. str7,
  505. str8
  506. ) {
  507. Log.i(
  508. Java.use("android.util.Log").getStackTraceString(
  509. Java.use("java.lang.Throwable").$new()
  510. )
  511. )
  512. Log.i("SetAsterismConsentRequest.$init")
  513. Log.i(
  514. `i: ${i}, i2: ${i2}, i3: ${i3}, iArr: ${iArr}, l: ${l}, i4: ${i4}, i5: ${i5}, str: ${str}, str2: ${str2}, str3: ${str3}, str4: ${str4}, str5: ${str5}, str6: ${str6}, str7: ${str7}, str8: ${str8}`
  515. )
  516. // print bundle
  517. const keySet = bundle.keySet().toArray()
  518. for (let i = 0; i < keySet.length; i++) {
  519. const key = keySet[i]
  520. Log.i(`key: ${key}, value: ${bundle.get(key)}`)
  521. }
  522. return this.$init(
  523. i,
  524. i2,
  525. i3,
  526. iArr,
  527. l,
  528. i4,
  529. bundle,
  530. i5,
  531. str,
  532. str2,
  533. str3,
  534. str4,
  535. str5,
  536. str6,
  537. str7,
  538. str8
  539. )
  540. }
  541. const SetAsterismConsentResponse = Java.use(
  542. "com.google.android.gms.asterism.SetAsterismConsentResponse"
  543. )
  544. SetAsterismConsentResponse.$init.overload(
  545. "int",
  546. "java.lang.String",
  547. "java.lang.String"
  548. ).implementation = function (i, str, str2) {
  549. Log.i(
  550. Java.use("android.util.Log").getStackTraceString(
  551. Java.use("java.lang.Throwable").$new()
  552. )
  553. )
  554. Log.i("SetAsterismConsentResponse.$init")
  555. Log.i(`i: ${i}, str: ${str}, str2: ${str2}`)
  556. // return this.$init(
  557. // 1,
  558. // "c4q5zP5Ft4A:APA91bEASr50HwwOY789LSZrcHPT8aG_fT19xlelS35qgIJeC3UBYypAHmmL9IygzlphzTKKz0wCdiQwuoPZMJKvgKPmGi3_imdr1CY0s7fs8qa_LMgNDFfvWEnpTCReAYc7IjThhFQq",
  559. // "c4q5zP5Ft4A"
  560. // )
  561. return this.$init(i, str, str2)
  562. }
  563. })
  564. // spoof sim to exist
  565. const bjsf = Java.use("bjsf")
  566. bjsf.s.overload("android.content.Context").implementation = function (c) {
  567. Log.i("bjsf.s")
  568. return true
  569. }
  570. const asts = Java.use("asts")
  571. asts.b.overload().implementation = function () {
  572. const url = this.b()
  573. Log.i("asts.b(configUrl)", url.orElse("null"))
  574. Log.i("l", this.l())
  575. Log.i("g", this.g())
  576. Log.i("k", this.k())
  577. const str = Java.use("arhb").M().s().a()
  578. Log.i("str", str)
  579. // todo: rcs-acs-mcc%s.jibe.google.com
  580. return Java.use("j$.util.Optional").of(
  581. "http://rcs-acs-mcc255.jibe.google.com/"
  582. )
  583. }
  584. })