{"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]} {"graph": {"acyclic": false, "pipe_collision": false}, "nodes": {"0x15f4f9bc190": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Start Node 0", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Initial Program": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe https://www.tiktok.com/upload?lang=en", "Data": "{\"type\": \"Start Node\", \"x\": 0, \"y\": 0, \"Application\": \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe https://www.tiktok.com/upload?lang=en\"}"}}, "0x15f4f9be200": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Bash Commands 1", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -259.2984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \npip3 install opencv-python-headless\npip3 install numpy\npip3 install requests\npip3 install pyttsx3\npip3 install moviepy\n\n\n", "Data": "{\"type\": \"bash\", \"code\": \" \\npip3 install --upgrade --force-reinstall \\\"git+https://github.com/yt-dlp/yt-dlp.git\\\"\\n\\n\\n\"}"}}, "0x15f4f9be470": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Python Code 2", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"code": " \nimport cv2\nimport numpy as np\nimport requests\nimport pyttsx3\nfrom PIL import ImageFont, ImageDraw, Image\nfrom moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip\n\ndef download_file(url, filename):\n response = requests.get(url)\n with open(filename, 'wb') as f:\n f.write(response.content)\n\n# Generate synthetic video\nsynthetic_video_url = genSyntheticVideo(\"robots dancing around a fire\")\nsynthetic_video_filename = 'synthetic.mp4'\ndownload_file(synthetic_video_url, synthetic_video_filename)\n\n# Generate voiceover text using GPT-3\nvoiceover_text = gpt3Prompt(\"generate a short 2 sentence voiceover about how Cheat layer marketing agents allow you to grow any brand on autopilot\", \"\") \n\nvoiceover_text += \"This video was generated and uploaded automatically using Cheat Layer marketing agents for tiktok.\"\n\n# Generate voice from the text\nvoiceover_filename = 'voiceover.mp3'\ngenVoice(voiceover_text, voiceover_filename)\n\n# Load synthetic video and voiceover\nvideo_clip = VideoFileClip(synthetic_video_filename).loop(duration=AudioFileClip(voiceover_filename).duration)\naudio_clip = AudioFileClip(voiceover_filename)\n\n# Composite video and audio\nfinal_clip = CompositeVideoClip([video_clip.set_audio(audio_clip)])\nfinal_clip.write_videofile('voiceover_video.mp4', codec='libx264', audio_codec='aac')\n\n# Draw sentences on top of the video\nfont_path = 'arial.ttf' # Use a common font path or include the font in the project directory\nfont_size = 48\nfont = ImageFont.truetype(font_path, font_size)\n\ncap = cv2.VideoCapture('voiceover_video.mp4')\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nframe_rate = int(cap.get(cv2.CAP_PROP_FPS))\nfourcc = cv2.VideoWriter_fourcc(*'mp4v')\nout = cv2.VideoWriter('text_video.mp4', fourcc, frame_rate, (frame_width, frame_height))\nwords = voiceover_text.split()\n\ndef chunk_list_to_string(lst, size):\n return [' '.join(lst[i:i + size]) for i in range(0, len(lst), size)]\n\nsentences = chunk_list_to_string(words, 3)\n#sentences = voiceover_text.split('. ')\ncurrent_sentence = 0\nframe_counter = 0\n\nwhile cap.isOpened():\n ret, frame = cap.read()\n if not ret:\n break\n\n if frame_counter == 8:\n current_sentence = (current_sentence + 1) % len(sentences)\n frame_counter = 0\n\n # Convert the image to RGB (OpenCV uses BGR)\n cv2_im_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n pil_im = Image.fromarray(cv2_im_rgb)\n\n draw = ImageDraw.Draw(pil_im)\n text = sentences[current_sentence]\n\n # Calculate text size and position\n #text_size = [32,32]\n text_size = draw.textsize(text, font=font)\n text_x = 20\n text_y = (frame_height - text_size[1]) / 2\n\n # Draw the text on the frame\n draw.text((text_x, text_y), text, font=font, fill=(255, 255, 255))\n\n # Convert back to BGR for OpenCV\n frame_with_text = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)\n\n out.write(frame_with_text)\n frame_counter += 1\n\ncap.release()\nout.release()\n\n# Overlay the voiceover on the final video with text\ntext_video_clip = VideoFileClip('text_video.mp4')\nfinal_audio_video_clip = CompositeVideoClip([text_video_clip.set_audio(audio_clip)])\nfinal_audio_video_clip.write_videofile('cheatlayer.mp4', codec='libx264', audio_codec='aac')\n\n", "Data": "{\"type\": \"python\", \"code\": \" \\ngenSyntheticVideo(\\\"AI automation\\\")\\n\"}"}}, "0x15f4f9be9e0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 3", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 960, "Y": 628, "semanticTarget": "A pink button with white text that says Select Files", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a man riding a wave on top of a surfboard\", \"x\": 960, \"y\": 628}"}}, "0x15f4f9beda0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 4", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [201.04651162790697, -116.8984007192033], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "cheatlayer.mp4", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bef80": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Keypress.png", "name": "Keypress 5", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"String": "return", "Saved Values": "None", "Type": "Keypress", "Data": "{\"type\": \"keypress_manual\"}"}}, "0x15f4f9bf4c0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 8", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 25.50159928079671], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 867, "Y": 477, "semanticTarget": "Input text box for a caption with the word CheatLayer in it", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with the words upload video on it\", \"x\": 867, \"y\": 477}"}}, "0x15f4f9bfca0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Move.png", "name": "Scroll 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-318.95348837209303, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"Distance": "-5000", "Data": "{\"type\": \"scroll\"}"}}, "0x15f4f9bfdc0": {"type_": "nodes.basic.BasicNodeA", "icon": "c:\\Users\\Public\\cheatlayer\\examples\\Click.png", "name": "CLICK 11", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [-58.953488372093034, 167.90159928079675], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"X": 1025, "Y": 453, "semanticTarget": "A pink button with white text that says Post", "Type": "Click", "Data": "{\"type\": \"Left Mouse Click\", \"semanticTarget\": \"Caption: a screen shot of a web page with a message\", \"x\": 1025, \"y\": 453}"}}, "0x15f4fab1db0": {"type_": "nodes.basic.BasicNodeA", "icon": null, "name": "GPT4 10", "color": [13, 18, 23, 255], "border_color": [74, 84, 85, 255], "text_color": [255, 255, 255, 180], "disabled": false, "selected": false, "visible": true, "width": 160, "height": 71.2, "pos": [180.89147286821708, 7.669041141261857], "port_deletion_allowed": false, "subgraph_session": {}, "custom": {"input": " Generate a short tiktok caption about a video of marketing agents generate videos using Dalle3+Stable Video and automate uploading them and a/b testing them for you, so you can grow any brand on auto-pilot! #cheatlayer #chatgpt", "Automation Input": "", "Data": "{\"type\": \"GPT4\"}"}}}, "connections": [{"out": ["0x15f4f9bc190", "out A"], "in": ["0x15f4f9be200", "in A"]}, {"out": ["0x15f4f9be200", "out A"], "in": ["0x15f4f9be470", "in A"]}, {"out": ["0x15f4f9be470", "out A"], "in": ["0x15f4f9be9e0", "in A"]}, {"out": ["0x15f4f9be9e0", "out A"], "in": ["0x15f4f9beda0", "in A"]}, {"out": ["0x15f4f9beda0", "out A"], "in": ["0x15f4f9bef80", "in A"]}, {"out": ["0x15f4f9bef80", "out A"], "in": ["0x15f4f9bf4c0", "in A"]}, {"out": ["0x15f4f9bf4c0", "out A"], "in": ["0x15f4fab1db0", "in A"]}, {"in": ["0x15f4f9bfca0", "in A"], "out": ["0x15f4fab1db0", "out A"]}, {"out": ["0x15f4f9bfca0", "out A"], "in": ["0x15f4f9bfdc0", "in A"]}]}