EkriirkE

fyrapi-test.py

Aug 25th, 2023
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.79 KB | None | 0 0
  1. #Found by watching requests from new.reddit.com actions in your browser F12 debug console
  2. import FYRAPI
  3.  
  4. #Login
  5. r=FYRAPI.Reddit(username="SpambotSwatter",password="lolno")
  6. r._core.debug=True  #print messages
  7. r.testlogin=None    #speed up by not testing curent credentials
  8. #r=FYRAPI(None,None)    #anonymous token... broken 23-08-17
  9.  
  10.  
  11.  
  12. ################
  13. #################------   New.GQL API used by website
  14. ################
  15.  
  16. #redditor Karma
  17. #print( r.GQL("db6eb1356b13",{"name":"SpambotSwatter"}) )
  18.  
  19. #redditor Trophies
  20. #print( r.GQL("3c59e5ed6f14",{"profileName":"SpambotSwatter"}) )
  21.  
  22. #chat unread indicators
  23. #print( r.GQL("051a1d7b8755") )
  24.  
  25. #message and chat unread indicators
  26. #print( r.GQL("fbbc7389e1ff") )
  27.  
  28. #Add a social link
  29. #print( r.GQL("5064afb1fbe2",{"input":{"socialLinks":[{"handle":"u/SpambotSwatter","type":"REDDIT"}]}}) )
  30. #                {"input":{"socialLinks":[{"outboundUrl":"https://www.youtube.com/BigClive","title":"YouTube","type":"YOUTUBE"}]}}
  31. #                {"input":{"socialLinks":[{"outboundUrl":"https://www.spamcop.net/","title":"Report SPAM EMail","type":"CUSTOM"}]}}
  32.  
  33. #redditor SocialLinks
  34. print( r.GQL("11a239b07f86",{"username":"SpambotSwatter"}) )
  35.  
  36.  
  37. #Edit social link
  38. #print( r.GQL("c558e604581f",{"input":{"socialLinks":[{"outboundUrl":"https://spamcop.net/","title":"Report The SPAM","type":"CUSTOM","id":"f4defbdf-411f-47a3-b89e-c6f5e6faafa5"}]}})  )
  39.  
  40. #Delete social link
  41. #print( r.GQL("7eb2600cd927",{"input":{"socialLinkIds":["f4defbdf-411f-47a3-b89e-c6f5e6faafa5"]}})  )
  42.  
  43. #Self multireddits
  44. #print( r.GQL("b65f99b680f5",{"includeSources":True}) )
  45.  
  46. #redditor multireddits
  47. #print( r.GQL("3d04e2bb92b5",{"name":"SpambotSwatter","first":3}) )
  48.  
  49. #subscribed subreddits and users
  50. #print( r.GQL("ca83defc2e15",{"includeSources":True}) )
  51.  
  52. #subscribed subreddits
  53. #print( r.GQL("775bcf2e4ca3",{"first":20}) )
  54.  
  55. #Get special events
  56. #print( r.GQL("6c73f2f0b64f") )
  57.  
  58. #Pull redditor posts, comments.  website uses .json page for comment/overview but the filter here seems to work
  59. #print( r.GQL("e8d58a13151d",{"username":"SpambotSwatter","sort":"NEW"}) )
  60. #print( r.GQL("e8d58a13151d",{"username":"SpambotSwatter","sort":"NEW","filter":"POSTS"}) )
  61. #print( r.GQL("e8d58a13151d",{"username":"SpambotSwatter","sort":"NEW","filter":"COMMENTS"}) )
  62.  
  63. #View modqueue, queueType MOD = Modqueue | REMOVED | REPORTED | EDITED | UNMODERATED
  64. if 0:
  65.     print( r.GQL("6fea93cb6fbb",{
  66.         "first":25,
  67.         "includeAllModActivitySummaries":True,
  68.         "includeDevPlatformMetadata":True,
  69.         "includeModActivitySummariesByNames":False,
  70.         "isModqueueListing":True,
  71.         "queueType":"MOD",
  72.         "sort":"SORT_DATE",
  73.         "subredditNames":["BotReddit"]
  74.     }) )
  75.  
  76. #Front page
  77. if 0:
  78.     print( r.GQL("d45d9e249839",{
  79.         "adContext":{
  80.             "layout":"CARD",
  81.             "clientSignalsession.ionData":{
  82.                 "adsSeenCount":0,
  83.                 "totalPostsSeenCount":128,
  84.                 "session.ionStartTime":time.strftime("%Y-%m-%dT%T.0%SZ")
  85.             }
  86.         },
  87.         "feedRankingContext":{
  88.             "servingId":"9e1e75ed-c479-4682-96df-c5218963b844",#This seems to be generated by script, not passed from the servers
  89.             "loggedOutAllowNsfw":True
  90.         },
  91.         "forceGeopopular":True,
  92.         "includeCommunityDUs":False,
  93.         "includeInterestTopics":False,
  94.         "includeFeaturedAnnouncements":True,
  95.         "includeLiveEvents":True,
  96.         "includeIdentity":False,
  97.         "includePostRecommendations":True,
  98.         "includeFreeMarketplaceElement":True,
  99.         "includeSubredditQuestions":True,
  100.         "includeExposureEvents":True,
  101.         "recentPostIds":[],
  102.         "sort":"BEST"
  103.     }) )
  104.  
  105. #Pull subreddit posts
  106. if 0:
  107.     print( r.GQL("abb696a96055",{
  108.         "subredditName":"BotReddit",
  109.         "isFake":False,
  110.         "sort":"HOT",
  111.         "adContext":{
  112.             "layout":"CLASSIC",
  113.             "clientSignalsession.ionData":{
  114.                 "adsSeenCount":0,
  115.                 "totalPostsSeenCount":25,
  116.                 "session.ionStartTime":time.strftime("%Y-%m-%dT%T.0%SZ")
  117.             }
  118.         },
  119.         "includeAchievementFlairs":True,
  120.         "includeCustomEmojis":True,
  121.         "includeIdentity":True,
  122.         "includeInterestTopics":False,
  123.         "includeQuestions":True,
  124.         "includeRules":False,
  125.         "includeRedditorKarma":False,
  126.         "includeSubredditLinks":False,
  127.         "includeSubredditRankings":True,
  128.         "includeSubredditChannels":True,
  129.         "includeTopicLinks":False
  130.     }) )
  131.  
  132. #Pull related posts
  133. if 0:
  134.     print( r.GQL("41973b2a5a8f",{
  135.         "postId":"t3_145xxxx",
  136.         "adContext":{
  137.             "layout":"CARD",
  138.             "sourcePostId":"t3_145xxxx",
  139.             "clientSignalsession.ionData":{
  140.                 "adsSeenCount":0,
  141.                 "totalPostsSeenCount":28,
  142.                 "session.ionStartTime":time.strftime("%Y-%m-%dT%T.0%SZ")
  143.             }
  144.         },
  145.         "range":"WEEK",
  146.         "sort":"TOP",
  147.         "subredditName":"BotReddit",
  148.         "listingBelowCorrelationId":"c9019a43-a3a1-4104-b8fb-71cb0d71af08",
  149.         "nsfwListingBelowCorrelationId":"181cd374-eb40-4f8b-ba5e-b65d0d4cd2f8",
  150.         "includePostFeed":True,
  151.         "includeNSFWListingBelowExperiment":False,
  152.         "includeListingBelowExperiment":False,
  153.         "includePostQASchemaEligibilityFlag":False,
  154.         "includeOtherDiscussions":False
  155.     }) )
  156.  
  157. #popular posts
  158. if 0:
  159.     print( r.GQL("11db30728cfb",{
  160.         "name":"popular",
  161.         "includeIdentity":False,
  162.         "adContext":{
  163.             "layout":"CLASSIC",
  164.             "clientSignalsession.ionData":{
  165.                 "adsSeenCount":0,
  166.                 "totalPostsSeenCount":0,
  167.                 "session.ionStartTime":time.strftime("%Y-%m-%dT%T.0%SZ")
  168.             }
  169.         },"isFake":True,
  170.         "includeAchievementFlairs":False,
  171.         "includeAppliedFlair":False,
  172.         "includeCustomEmojis":False,
  173.         "includeDevPlatformMetadata":True,
  174.         "includeQuestions":False,
  175.         "includeRecents":True,
  176.         "includeRedditorKarma":False,
  177.         "includeRules":False,
  178.         "includeSubredditLinks":False,
  179.         "includeTopicLinks":False,
  180.         "includeTrending":True,
  181.         "includeSubredditRankings":True,
  182.         "includeSubredditChannels":True,
  183.         "isAdHocMulti":False,
  184.         "isAll":False,
  185.         "isLoggedOutGatedOptedin":False,
  186.         "isLoggedOutQuarantineOptedin":False,
  187.         "isPopular":True,
  188.         "recentPostIds":["t3_two5tl","t3_two5fs","t3_two41x","t3_two57b","t3_wswaff"],
  189.         "subredditNames":[],
  190.         "sort":"HOT"
  191.     }) )
  192.  
  193. #sub moderation stats/log
  194. if 0:
  195.     print( r.GQL("bf67bf218716",{
  196.         "subredditName":"BotReddit",
  197.         "currentModName":"SpambotSwatter",
  198.         "startDateInsights":time.strftime("%Y-%m-%dT%T.0%SZ"),
  199.         "endDateInsights":time.strftime("%Y-%m-%dT%T.0%SZ"),
  200.         "includeInsightsData":True,
  201.         #"actions":["APPROVE_LINK"],"first":50
  202.     }) )
  203.  
  204. #Pull comments
  205. #print( r.GQL("1b7d106afc6c","variables":{"postId":"t3_144xxxx","requestPostModerationInfo":True}) )
  206.  
  207. #Get post/comment moderated info
  208. #print( r.GQL("0ac619d6eb7e",{"commentIds":[],"postIds":["t3_147xxxx",...]} }
  209.  
  210. #sub moderator list
  211. #print( r.GQL("fcd88a3eea91",{"subredditName":"BotReddit"}) )
  212.  
  213. #sub moderation ctegories {"id":"45bc34defbb5","variables":{}}
  214. #remove/spam item {"id":"6a4c2bda9036","variables":{"input":{"id":"t3_hvxxxx","isSpam":false}}}
  215. #approve item {"id":"660e0733e963","variables":{"input":{"id":"t3_r2xxxx"}}}
  216. #Sticky post {"id":"13de9d1fcbe3","variables":{"input":{"postId":"t3_145xxxx","sticky":true,"toProfile":false}}}
  217. #subreddit predictorTournaments {"id":"cebfc8734cec","variables":{"subredditName":"BotReddit","isLatestOnly":true}}
  218. #subreddit platform metadata {"id":"fbfb3b396dfe","variables":{"subredditName":"BotReddit","mimetype":"application/json"}}
  219. #post reaction info {"id":"72e76fc8e5c5","variables":{"id":"t3_146xxxx"}}
  220. #post media info {"id":"abbb27126771","variables":{"postId":"t3_145xxxx","includeSubredditRankings":true}}
  221. #post crowd control {"id":"0100b521f182","variables":{"postId":"t3_145xxxx"}}
  222. #post stats/shares {"id":"556ffe7b3296","variables":{"postId":"t3_145xxxx","subredditId":"t5_2xxxx"}}
  223. #subrddit community tags {"id":"bac623887684","variables":{"subredditId":"t5_2xxxx","pageSize":1050}}
  224. #sub contentrating survey {"id":"15c4ad40a0bc","variables":{"id":"t5_2sxxx"}}
  225. #sub country settings {"id":"abd8b9be540b","variables":{"subredditId":"t5_2xxxx"}}
  226. #sub style and stats {"id":"d968e053a7b8","variables":{"id":"t5_2xxxx"}}
  227. #sub dev platform metadata {"id":"fbfb3b396dfe","variables":{"subredditName":"BotReddit","mimetype":"application/json"}}
  228. #query UX experiences {"id":"388d61b2a794","variables":{"experienceInputs":["LIVE_CHAT_VIDEO_EDU","LIVE_CHAT_REACTION_EDU"]}}
  229. #get notifications {"id":"be3e43b15ada","variables":{"first":5}}
  230. #more notifications{"id":"be3e43b15ada","variables":{"after":base64.b64encode("825d827c-0860-11ee-xxxx-a627b55a708a|t1_jnnxxx"),"first":10}}
  231. #coin offers {"id":"098518521d5b"}
  232. #active surveys {"id":"89970a6dad30"}
  233. #muted subreddits {"id":"c09ff0d041c1"}
  234. #woke identity {"id":"1508e05ea2ee"}
  235. #notification settings {"id":"d03522f8a8d4","variables":{"channel":"PUSH"}}
  236. #update notification setting {"id":"129085be0500","variables":{"input":{"preferences":[{"isEnabled":false,"messageType":"ONE_OFF"}]}}}
  237. #update inbox seen date {"id":"85d656894a08","variables":{"input":{"lastSentAt":"6/14/2023"}}}
  238. #mark all chats/messages as read {"id":"bfc6fe51708d","variables":{"input":{"channels":[]}}}
  239. #saved items {"id":"e355dad0c712","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  240. #hidden items {"id":"e15294d413b1","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  241. #upvoted posts {"id":"5b90e18285c7","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  242. #downvoted posts {"id":"42616342e99c","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  243. #received awards {"id":"5e560e39ad16","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  244. #given awards {"id":"48cc7f05ceee","variables":{"includeIdentity":false,"includeModerated":false,"first":25,"after":null}}
  245. #get (recent)post infos {"id":"75c9f18c044f","variables":{"includeIdentity":false,"includeModerated":true,"recentPostIds":["t3_xvxxxx","t3_wsxxxx"]}}
  246.  
  247.  
  248. #Search, reults paginated: your xxxAfter cursor is the ...pageInfo.endCursor value, e.g. data.search.general.comments.pageInfo.endCursor
  249. if 0:
  250.     print( r.GQL("f4c660a1a7d4",{
  251.             "query":"SpambotSwatter",
  252.             "sort":"NEW",
  253.             "filters":[ {"key":"nsfw","value":"1"}, ],
  254.             "productSurface":"web2x",
  255.             "includePosts":False,
  256.             "includeCommunities":False,
  257.             "includeAuthors":False,
  258.             "includeComments":True,
  259.             "postsAfter":None,
  260.             "communitiesAfter":None,
  261.             "authorsAfter":None,
  262.             "commentsAfter":None,
  263.             "searchInput":{ "queryId":r.token("queryId"),"structureType":"search"   },
  264.             "communitySearch":False,
  265.             "customFeedSearch":False,
  266.             #"limit":"50",
  267.         }) )
  268.  
  269. #reportForm returns site and subreddit specific reasons via child comment/submission id
  270. #print( r.GQL("404920cc0308",{"itemId":"t1_jn3s0zq","hostAppName":"R2","formVersion":"2.1","locale":"en-US"}) )
  271.  
  272. #Submit Report
  273. #print( r.GQL("cec8e7309a27",{"input":{"commentId":"t1_jn3sxxx","fromHelpDesk":False,"hostAppName":"R2","siteRule":"SPAM_BOTS"}}}
  274. #print( r.GQL("cec8e7309a27",{"input":{"commentId":"t1_jmxxxxx","fromHelpDesk":False,"hostAppName":"R2","subredditRule":"Rule 1: Violates Our Policies"}}}
  275. #print( r.GQL("cec8e7309a27",{"input":{"commentId":"t1_jnxxxxx","fromHelpDesk":False,"hostAppName":"R2","customRule":"This is a scam"}}}
  276.  
  277.  
  278.  
  279. ################
  280. #################------   Traditionnal API (still) used by website
  281. ################
  282.  
  283. #Site admin report
  284. #print( r.OAuth("report",{"raw_json":"1","gilding_detail":"1"},{"reason":"site_reason_selected","site_reason":"This is spam","custom_text":"Scamming in PMs","usernames":"ResponseAvailable395","api_type":"json","from_help_desk":True}) )
  285.  
  286. #View modmail
  287. #print( r.OAuth("mod/conversations",{"sort":"recent","state":"inbox","entity":"BotReddit"}) )
  288.  
  289. #Lock item
  290. #print( r.OAuth("lock","redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t3_h5xxxx"}) )
  291.  
  292. #make comment
  293. #print( r.OAuth("comment.json",{"api_type":"json","return_rtjson":True,"thing_id":"t1_xxxxx","text":"","richtext_json":json.dumps(  {"document":[{"e":"par","c":[{"e":"text","t":"comment"}]}]} )},{}) )
  294.  
  295. #make submission
  296. #print( r.OAuth("submit",{"resubmit":True},{"sr":"u_spambotswatter","submit_type":"profile","api_type":"json","show_error_list":True,"title":"Post title","spoiler":False,"nsfw":False,"kind":"self","original_content":False,"post_to_twitter":False,"sendreplies":True,"richtext_json":json.dumps(    {"document":[{"e":"par","c":[{"e":"text","t":"And the content"}]}]} ),"validate_on_submit":True} ) )
  297.  
  298. #edit comment
  299. #print( r.OAuth("editusertext",{"emotes_as_images":True,"rtj":"only","redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"api_type":"json","return_rtjson":True,"thing_id":"t1_jo5xxxx","text":None,"richtext_json":json.dumps( {"document":[{"e":"par","c":[{"e":"text","t":"This is my new comment"}]}]}  )}) )
  300.  
  301. #delete comment, message, ...
  302. #print( r.OAuth("del",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t1_jo5xxxx"}) )
  303.  
  304. #upvote dir=1, unvote dir=0, downvote dir=-1,  legacy included these, new prob relies on referer:  voted from | comment/directlink {"page_type":"comment"} | submission {"page_type":"link","sort":"top"} | userpage {"page_type":"account","sort":"new","sort_filter_time":"all"} | subreddit/frontpage {"page_type":"listing","sort":"new"} | messages {}
  305. #print( r.OAuth("vote",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t3_146xxxx","dir":1,"api_type":"json"}) )
  306.  
  307. #block user
  308. #print( r.OAuth("block_user",{"raw_json":1,"gilding_detail":1},{"name":"spez"}) )
  309.  
  310. #unblock user
  311. #print( r.OAuth("unfriend",{"raw_json":1,"gilding_detail":1},{"name":"SpambotSwatter","container":"t2_3xxxx","type":"enemy"}) )
  312.  
  313. #Follow user/subscribe, action=unsub to unfollow
  314. #print( r.OAuth("subscribe",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"action":"sub","sr_name":"u_SpambotSwatter","api_type":"json"}) )
  315. #print( r.OAuth("subscribe",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"action":"sub","sr_name":"Botreddit","api_type":"json"}) )
  316.  
  317. #save item
  318. #print( r.OAuth("vote",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t3_146xxxx"}) )
  319.  
  320. #redditor details
  321. #print( r.OAuth("user/SpambotSwatter/about.json",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1}) )
  322.  
  323. #ignore reports
  324. #print( r.OAuth("ignore_reports",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t3_146xxxx"}) )
  325.  
  326. #unignore reports
  327. #print( r.OAuth("unignore_reports",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"id":"t3_146xxxx"}) )
  328.  
  329. #mark as OC
  330. #print( r.OAuth("original_content",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","raw_json":1,"gilding_detail":1},{"fullname":"t3_145xxxx","should_set_oc":True}) )
  331.  
  332. #enable viewing over18
  333. #print( r.OAuth("v1/me/prefs",{"raw_json":1,"gilding_detail":1},{"over_18":True}) )
  334.  
  335. #go on/offline
  336. #print( r.OAuth("v1/me/prefs",{"raw_json":1,"gilding_detail":1},{"show_presence":True}) )
  337.  
  338. #load more comments, threadid as URI, new comment IDs as token comma-space separated then base64 encoded
  339. #r.post("https://gateway.reddit.com/desktopapi/v1/morecomments/t3_147xxxx?emotes_as_images=true&rtj=only&redditWebClient=web2x&app=web2x-client-production&profile_img=true&allow_over18=1&include=identity",json={"token":base64.b64encode("jnydxxx, jnz5xxx")})
  340.  
  341. #sub moderator list
  342. #print( r.OAuth("v1/BotReddit/moderators",{"redditWebClient":"desktop2x","app":"desktop2x-client-production","username":"","count":10,"raw_json":1,"gilding_detail":1}) )
  343.  
  344. #Assign user flair
  345. #print( r.OAuth("r/BotReddit/api/selectflair",{"raw_json":1,"gilding_detail":1},{"api_type":"json","flair_template_id":"x-y-z","name":"SpamboSwatter","text":"Swatter of Bots"}) )
  346.  
  347. #send message
  348. if 0:
  349.     r.session.post("https://www.reddit.com/api/compose?embedded=true",{
  350.         "uh":r.tokens["modhash"],
  351.         "to":"/u/SpambotSwatter",
  352.         "undefined":"",
  353.         "subject":"I love",
  354.         "thing_id":"",
  355.         "text":"...you",
  356.         #"g-recaptcha-response":"...",
  357.         "source":"compose",
  358.         "embedded":"web2x",
  359.         "id":"/compose-message",
  360.         "renderstyle":"html"
  361.         })
  362.  
  363. #mark message read
  364. #r.session.post("https://www.reddit.com/api/read_message?embedded=true",{"id":"t4_1vvxxxx","uh":r.tokens["modhash"],"renderstyle":"html"})
  365.  
  366. #mark message unread
  367. #r.session.post("https://www.reddit.com/api/unread_message?embedded=true",{"id":"t4_1vvxxxx","executed":"unread","embedded":"web2x","uh":r.tokens["modhash"],"renderstyle":"html"})
  368.  
  369.  
  370.  
  371. ################
  372. #################---legacy website funcs, no new.reddit analogue?
  373. ################
  374.  
  375. #redditor comments
  376. #print( r.get("https://gateway.reddit.com/desktopapi/v1/user/SpambotSwatter/comments?rtj=only&emotes_as_images=true&allow_quarantined=true&redditWebClient=web2x&app=web2x-client-production&profile_img=true&allow_over18=1&include=identity&sort=new") )
  377.  
  378. #Add Friend
  379. #print( r.post("https://www.reddit.com/friend?note=",body=urllib.parse.urlencode( {"nam":"SpambotSwatter","container":"t2_xxxxx","type":"friend","r":"u_SpambotSwatter","uh":r.token("modhash"),"renderstyle":"html"} )) )
  380.  
  381. #Remove friend
  382. #print( r.post("https://www.reddit.com/unfriend",body=urllib.parse.urlencode( {"nam":"SpambotSwatter","container":"t2_xxxxx","type":"friend","r":"u_SpambotSwatter","uh":r.token("modhash"),"renderstyle":"html"} )) )
  383.  
  384. #Assign user flair
  385. #print( r.post("https://www.reddit.com/api/flair",body=urllib.parse.urlencode( {"name":"SpambotSwatter","text":"Swatter of Bots","css_class":"","id":"%flair-fukubaka","r":"BotReddit","uh":r.token("modhash"),"renderstyle":"html"} )) )
  386.  
  387. #Create app
  388. #print( r.post("https://www.reddit.com/api/updateapp",body=urllib.parse.urlencode( {"uh":r.token("modhash"),"name":"ScriptName","app_type":"script","description":"Script Desc.","about_url":"http://about.com/","redirect_uri":"http://redirect.com","id":"%create-app","renderstyle":"html"} )) )
  389.  
  390.  
Add Comment
Please, Sign In to add comment