{"workflows": [{"url": "http://editorial-app.appspot.com/workflow/5905065432842240/L8MawNZOOFw", "workflow_data": {"username": "moha", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:syntax-mode"}, "type": "advancedText"}, "expression2": {"text": "markdown", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"button1Value": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "button3Value": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "button2Value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "title": "Share Document Text...", "button3Title": "", "button2Title": "Use Plain Text", "button1Title": "Convert to HTML", "message": {"text": "Do you want to convert this Markdown document to HTML for sharing?", "tokenRanges": {}, "type": "advancedText"}, "showCancelButton": true}, "class": "WorkflowActionShowAlert"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"tables": true, "autolinks": true, "smartypants": true, "strikethrough": true, "footnotes": true, "metadata": false, "superscript": true}, "class": "WorkflowActionConvertMarkdown"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "\n\n\n\n?\n\n", "tokenRanges": {"{67, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionShowShareSheet"}], "name": "Share...", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone10,5", "systemVersion": "13.2.3"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_ARCHIVE.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22moha%22%2C%20%22description%22%3A%20%22Shows%20the%20iOS%20share%20sheet%20with%20the%20selected%20text%20as%20input.%20If%20nothing%20is%20selected%2C%20the%20entire%20document%20is%20shared.%20In%20a%20Markdown%20document%2C%20the%20text%20can%20optionally%20be%20converted%20to%20HTML%20first.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Asyntax-mode%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22markdown%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22button1Value%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button3Value%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button2Value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22title%22%3A%20%22Share%20Document%20Text...%22%2C%20%22button3Title%22%3A%20%22%22%2C%20%22button2Title%22%3A%20%22Use%20Plain%20Text%22%2C%20%22button1Title%22%3A%20%22Convert%20to%20HTML%22%2C%20%22message%22%3A%20%7B%22text%22%3A%20%22Do%20you%20want%20to%20convert%20this%20Markdown%20document%20to%20HTML%20for%20sharing%3F%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22showCancelButton%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionShowAlert%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22tables%22%3A%20true%2C%20%22autolinks%22%3A%20true%2C%20%22smartypants%22%3A%20true%2C%20%22strikethrough%22%3A%20true%2C%20%22footnotes%22%3A%20true%2C%20%22metadata%22%3A%20false%2C%20%22superscript%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionConvertMarkdown%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3C%21DOCTYPE%20html%3E%5Cn%3Chtml%3E%5Cn%3Chead%3E%3Cmeta%20charset%3D%5C%22utf-8%5C%22%2F%3E%3C%2Fhead%3E%5Cn%3Cbody%3E%5Cn%3F%5Cn%3C%2Fbody%3E%5Cn%3C%2Fhtml%3E%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B67%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionShowShareSheet%22%7D%5D%2C%20%22name%22%3A%20%22Share...%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone10%2C5%22%2C%20%22systemVersion%22%3A%20%2213.2.3%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_ARCHIVE.png%22%7D", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "title": "Share..."}, {"url": "http://editorial-app.appspot.com/workflow/5781690014236672/VURRRRkx3hE", "workflow_data": {"username": "List URLs", "name": "List URLs...", "description": "Shows a list of URLs in the current document. Selecting one of the URLs opens it in the browser panel.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "foldedTextOption": 0}, "class": "WorkflowActionGetEditorText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionExtractURLs"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "If no URLs are found...", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"showHUD": true, "HUDTitle": "No URLs found", "stopOption": 0}, "class": "WorkflowActionStopWorkflow"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"list": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "title": "", "showInPopover": true, "allowMultipleSelection": false}, "class": "WorkflowActionSelectFromList"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "If URL is selected...", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 1}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"URL": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "waitUntilLoaded": false, "revealBrowserAutomatically": true, "openIn": 0, "tabOption": 0}, "class": "WorkflowActionOpenURL"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}], "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone9,1", "systemVersion": "12.4"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_ANCHOR.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22List%20URLs%22%2C%20%22name%22%3A%20%22List%20URLs...%22%2C%20%22description%22%3A%20%22Shows%20a%20list%20of%20URLs%20in%20the%20current%20document.%20Selecting%20one%20of%20the%20URLs%20opens%20it%20in%20the%20browser%20panel.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22foldedTextOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionGetEditorText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionExtractURLs%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22If%20no%20URLs%20are%20found...%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22showHUD%22%3A%20true%2C%20%22HUDTitle%22%3A%20%22No%20URLs%20found%22%2C%20%22stopOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionStopWorkflow%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22list%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22title%22%3A%20%22%22%2C%20%22showInPopover%22%3A%20true%2C%20%22allowMultipleSelection%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionSelectFromList%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22If%20URL%20is%20selected...%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22URL%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22waitUntilLoaded%22%3A%20false%2C%20%22revealBrowserAutomatically%22%3A%20true%2C%20%22openIn%22%3A%200%2C%20%22tabOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionOpenURL%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%5D%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone9%2C1%22%2C%20%22systemVersion%22%3A%20%2212.4%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_ANCHOR.png%22%7D", "description": "Shows a list of URLs in the current document. Selecting one of the URLs opens it in the browser panel.", "title": "List URLs..."}, {"url": "http://editorial-app.appspot.com/workflow/5822453280407552/A58S1Ed21xo", "workflow_data": {"username": "catlegsworktoo", "description": "Replaces the selected word(s) with a Markdown link, pointing to the first Google result. E.g. when you select \"Markdown\", it is replaced with \"[Markdown](http://daringfireball.net/projects/markdown)\".", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"script": "#coding: utf-8\nimport editor\nimport console\n\ndef main():\n\ttext = editor.get_selected_text()\n\tif not text:\n\t\tconsole.hud_alert('Nothing Selected', 'error')\n\t\treturn\n\timport requests\n\timport urllib\n\turl = 'https://www.google.com/search?q=%s&btnI' % (urllib.quote(text, ''),)\n\ttry:\n\t\tr = requests.head(url)\n\t\tlink_url = r.headers['location']\n\t\tmd_link = '[%s](%s)' % (text, link_url)\n\t\teditor.insert_text(md_link)\n\texcept:\n\t\tconsole.hud_alert('Something went wrong', 'error')\n\nmain()\n"}, "class": "WorkflowActionRunScript"}], "name": "Lucky Link", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone11,8", "systemVersion": "12.4"}, "type": "wkflw", "public": true, "icon": "minicons-icons-entertainment-dices.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22catlegsworktoo%22%2C%20%22description%22%3A%20%22Replaces%20the%20selected%20word%28s%29%20with%20a%20Markdown%20link%2C%20pointing%20to%20the%20first%20Google%20result.%20E.g.%20when%20you%20select%20%5C%22Markdown%5C%22%2C%20it%20is%20replaced%20with%20%5C%22%5BMarkdown%5D%28http%3A%2F%2Fdaringfireball.net%2Fprojects%2Fmarkdown%29%5C%22.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22script%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20editor%5Cnimport%20console%5Cn%5Cndef%20main%28%29%3A%5Cn%5Cttext%20%3D%20editor.get_selected_text%28%29%5Cn%5Ctif%20not%20text%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Nothing%20Selected%27%2C%20%27error%27%29%5Cn%5Ct%5Ctreturn%5Cn%5Ctimport%20requests%5Cn%5Ctimport%20urllib%5Cn%5Cturl%20%3D%20%27https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25s%26btnI%27%20%25%20%28urllib.quote%28text%2C%20%27%27%29%2C%29%5Cn%5Cttry%3A%5Cn%5Ct%5Ctr%20%3D%20requests.head%28url%29%5Cn%5Ct%5Ctlink_url%20%3D%20r.headers%5B%27location%27%5D%5Cn%5Ct%5Ctmd_link%20%3D%20%27%5B%25s%5D%28%25s%29%27%20%25%20%28text%2C%20link_url%29%5Cn%5Ct%5Cteditor.insert_text%28md_link%29%5Cn%5Ctexcept%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Something%20went%20wrong%27%2C%20%27error%27%29%5Cn%5Cnmain%28%29%5Cn%22%7D%2C%20%22class%22%3A%20%22WorkflowActionRunScript%22%7D%5D%2C%20%22name%22%3A%20%22Lucky%20Link%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone11%2C8%22%2C%20%22systemVersion%22%3A%20%2212.4%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-entertainment-dices.png%22%7D", "description": "Replaces the selected word(s) with a Markdown link, pointing to the first Google result. E.g. when you select \"Markdown\", it is replaced with \"[Markdown](http://daringfireball.net/projects/markdown)\".", "title": "Lucky Link"}, {"url": "http://editorial-app.appspot.com/workflow/5808078909865984/3OSmK0mEpvE", "workflow_data": {"username": "JStarkman", "description": "Very simple workflow to collapse all the Headings (single #) in the current document. \n\nThe format to match is that the # must be at the beginning of a line followed by a single space. ", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"pattern": {"text": "^# ", "tokenRanges": {}, "type": "advancedText"}, "invert": true}, "class": "WorkflowActionFoldLinesMatchingPattern"}], "name": "Fold Headings", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone7,2", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "minicons-icons-actions-square-remove.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22JStarkman%22%2C%20%22description%22%3A%20%22Very%20simple%20workflow%20to%20collapse%20all%20the%20Headings%20%28single%20%23%29%20in%20the%20current%20document.%20%5Cn%5CnThe%20format%20to%20match%20is%20that%20the%20%23%20must%20be%20at%20the%20beginning%20of%20a%20line%20followed%20by%20a%20single%20space.%20%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22pattern%22%3A%20%7B%22text%22%3A%20%22%5E%23%20%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22invert%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionFoldLinesMatchingPattern%22%7D%5D%2C%20%22name%22%3A%20%22Fold%20Headings%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone7%2C2%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-actions-square-remove.png%22%7D", "description": "Very simple workflow to collapse all the Headings (single #) in the current document. \n\nThe format to match is that the # must be at the beginning of a line followed by a single space. ", "title": "Fold Headings"}, {"url": "http://editorial-app.appspot.com/workflow/5889968220143616/CawwPjPNBL0", "workflow_data": {"username": "Scott Larson", "description": "This workflow creates a markdown document with a file name and Markdown Frontmatter generated from a UI form fields. It creates an out put file name and frontmatter title from fields that are specific to creating a document that a screen writer would use to make a scene document.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Scene File UI", "parameters": {"outputText": {"text": "?-?-?-?", "tokenRanges": {"{0, 1}": "%ui:Scene Title Field", "{6, 1}": "%ui:Environment Title Field", "{4, 1}": "%ui:Location Title Field", "{2, 1}": "%ui:Setting Title Field"}, "type": "advancedText"}, "ui": "[\n {\n \"nodes\" : [\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 32}, {143, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"63291FBC-497C-4755-B29C-61367FB01A29\",\n \"font_size\" : 17,\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"name\" : \"Scene Title Field\",\n \"spellchecking_type\" : \"default\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 98}, {142, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"E989A04B-A439-4B52-932B-36ACB4F0E408\",\n \"name\" : \"Setting Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 162}, {142, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"77C08DCA-BF3B-4BB7-9230-0EAD1A11EAFF\",\n \"name\" : \"Location Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 226}, {143, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"0C8371B0-E61A-4C38-95AB-E9E2A12856F5\",\n \"name\" : \"Environment Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 32}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Scene Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"05C38341-4356-420C-B4A6-4877D1CE41D4\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Scene Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 98}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Setting Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"EC1840B3-EF37-4386-8A0B-D5CAA68B63E1\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Setting Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 162}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Location Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"EA2689E0-9178-450F-932C-1E84E48028CF\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Loc Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 226}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Environment Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"ADF3ED51-4FBE-4210-8903-C04120C52778\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Env Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n }\n ],\n \"frame\" : \"{{0, 0}, {320, 320}}\",\n \"class\" : \"View\",\n \"attributes\" : {\n \"flex\" : \"\",\n \"editWorkflow\" : true,\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"enabled\" : true,\n \"tint_color\" : \"RGBA(0.000000,0.478000,1.000000,1.000000)\",\n \"border_color\" : \"RGBA(0.000000,0.000000,0.000000,1.000000)\",\n \"background_color\" : \"RGBA(1.000000,1.000000,1.000000,1.000000)\",\n \"name\" : \"\"\n },\n \"selected\" : false\n }\n]", "presentationStyle": 0}, "class": "WorkflowActionCustomUI"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"caseOption": 1}, "class": "WorkflowActionChangeCase"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-file-name", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-front-matter-title", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "scene-front-matter-title"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"caseOption": 2}, "class": "WorkflowActionChangeCase"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"findOption": 0, "find": {"text": "-", "tokenRanges": {}, "type": "advancedText"}, "replace": {"text": ". ", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFindReplace"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-front-matter-title-update", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Create Markdown Scene Entry", "parameters": {"content": {"text": "---\ntitle: ?\nsubtitle:\nauthor: Scott Larson\ndate: ?/?/? ?:?\n---\n\n## Previously\n## Main Objective\n## Main Obstacle\n## Up Next\n\n?\n", "tokenRanges": {"{50, 1}": "%date:yyyy", "{126, 1}": "%cursor", "{54, 1}": "%date:dd", "{11, 1}": "scene-front-matter-title-update", "{56, 1}": "%date:hh", "{58, 1}": "%date:mm", "{52, 1}": "%date:MM"}, "type": "advancedText"}, "open": true, "filename": {"text": "?.md", "tokenRanges": {"{0, 1}": "scene-file-name"}, "type": "advancedText"}}, "class": "WorkflowActionCreateNewDocument"}], "name": "Markdown (Scene)", "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad4,1", "systemVersion": "12.4.1"}, "type": "edtpl", "public": true, "icon": "minicons-icons-text-left-align.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22Scott%20Larson%22%2C%20%22description%22%3A%20%22This%20workflow%20creates%20a%20markdown%20document%20with%20a%20file%20name%20and%20Markdown%20Frontmatter%20%20generated%20from%20a%20UI%20form%20fields.%20It%20creates%20an%20out%20put%20file%20name%20and%20frontmatter%20title%20from%20fields%20that%20are%20specific%20to%20creating%20a%20document%20that%20a%20%20screen%20writer%20would%20use%20to%20make%20a%20scene%20document.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Scene%20File%20UI%22%2C%20%22parameters%22%3A%20%7B%22outputText%22%3A%20%7B%22text%22%3A%20%22%3F-%3F-%3F-%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25ui%3AScene%20Title%20Field%22%2C%20%22%7B6%2C%201%7D%22%3A%20%22%25ui%3AEnvironment%20Title%20Field%22%2C%20%22%7B4%2C%201%7D%22%3A%20%22%25ui%3ALocation%20Title%20Field%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22%25ui%3ASetting%20Title%20Field%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ui%22%3A%20%22%5B%5Cn%20%20%7B%5Cn%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%2032%7D%2C%20%7B143%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2263291FBC-497C-4755-B29C-61367FB01A29%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Scene%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%2098%7D%2C%20%7B142%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22E989A04B-A439-4B52-932B-36ACB4F0E408%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Setting%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%20162%7D%2C%20%7B142%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2277C08DCA-BF3B-4BB7-9230-0EAD1A11EAFF%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Location%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%20226%7D%2C%20%7B143%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%220C8371B0-E61A-4C38-95AB-E9E2A12856F5%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Environment%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%2032%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Scene%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2205C38341-4356-420C-B4A6-4877D1CE41D4%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Scene%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%2098%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Setting%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22EC1840B3-EF37-4386-8A0B-D5CAA68B63E1%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Setting%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%20162%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Location%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22EA2689E0-9178-450F-932C-1E84E48028CF%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Loc%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%20226%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Environment%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22ADF3ED51-4FBE-4210-8903-C04120C52778%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Env%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%5D%2C%5Cn%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B0%2C%200%7D%2C%20%7B320%2C%20320%7D%7D%5C%22%2C%5Cn%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22View%5C%22%2C%5Cn%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%5C%22flex%5C%22%20%3A%20%5C%22%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22enabled%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%5C%22tint_color%5C%22%20%3A%20%5C%22RGBA%280.000000%2C0.478000%2C1.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22border_color%5C%22%20%3A%20%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22background_color%5C%22%20%3A%20%5C%22RGBA%281.000000%2C1.000000%2C1.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22%5C%22%5Cn%20%20%20%20%7D%2C%5Cn%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%7D%5Cn%5D%22%2C%20%22presentationStyle%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCustomUI%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22caseOption%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionChangeCase%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-file-name%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-front-matter-title%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22scene-front-matter-title%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22caseOption%22%3A%202%7D%2C%20%22class%22%3A%20%22WorkflowActionChangeCase%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22findOption%22%3A%200%2C%20%22find%22%3A%20%7B%22text%22%3A%20%22-%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22replace%22%3A%20%7B%22text%22%3A%20%22.%20%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFindReplace%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-front-matter-title-update%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Create%20Markdown%20Scene%20Entry%22%2C%20%22parameters%22%3A%20%7B%22content%22%3A%20%7B%22text%22%3A%20%22---%5Cntitle%3A%20%3F%5Cnsubtitle%3A%5Cnauthor%3A%20Scott%20Larson%5Cndate%3A%20%3F%2F%3F%2F%3F%20%3F%3A%3F%5Cn---%5Cn%5Cn%23%23%20Previously%5Cn%23%23%20Main%20Objective%5Cn%23%23%20Main%20Obstacle%5Cn%23%23%20Up%20Next%5Cn%5Cn%3F%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B50%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%2C%20%22%7B126%2C%201%7D%22%3A%20%22%25cursor%22%2C%20%22%7B54%2C%201%7D%22%3A%20%22%25date%3Add%22%2C%20%22%7B11%2C%201%7D%22%3A%20%22scene-front-matter-title-update%22%2C%20%22%7B56%2C%201%7D%22%3A%20%22%25date%3Ahh%22%2C%20%22%7B58%2C%201%7D%22%3A%20%22%25date%3Amm%22%2C%20%22%7B52%2C%201%7D%22%3A%20%22%25date%3AMM%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22open%22%3A%20true%2C%20%22filename%22%3A%20%7B%22text%22%3A%20%22%3F.md%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22scene-file-name%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCreateNewDocument%22%7D%5D%2C%20%22name%22%3A%20%22Markdown%20%28Scene%29%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad4%2C1%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22edtpl%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-text-left-align.png%22%7D", "description": "This workflow creates a markdown document with a file name and Markdown Frontmatter generated from a UI form fields. It creates an out put file name and frontmatter title from fields that are specific to creating a document that a screen writer would use to make a scene document.", "title": "Markdown (Scene)"}, {"url": "http://editorial-app.appspot.com/workflow/5842356829945856/CkWuC7VA-3A", "workflow_data": {"username": "", "description": "This is a collection of several unrelated custom actions.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "READ ME\u2757", "parameters": {"text": {"text": "This is not an actual workflow, it just contains a collection of custom actions that are meant to be saved as presets.\n\nRunning this won't do anything because of the following 'Stop' action.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "---------------------------------------------------------------------------------------", "parameters": {"showHUD": false, "HUDTitle": ""}, "class": "WorkflowActionStopWorkflow"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Send to Drafts", "parameters": {"0217F8EB-80EF-4A2C-A9E5-7E18DC6C3248": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1C841272-0445-4065-853D-785C8DBE61D3": true, "143D755D-53CA-4286-B024-A20A1578BF3B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "47E71F88-8D67-4E22-8E06-6EF4DA6D1626": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"title": "Text", "type": "advancedText", "key": "EC988DCA-5C83-43C2-9CD6-1DF50A0A448D", "height": 120}, {"type": "switch", "key": "1C841272-0445-4065-853D-785C8DBE61D3", "title": "Return to Editorial"}], "30D112E0-6074-4B9E-9F59-5EFA908FC9A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AECCCF4E-41A4-4C07-ABB0-45DF485AFD2D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9A5C7E4F-0E3F-4918-A7B2-A9F790F8BF54": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A035F565-D7EA-4F35-86F2-74B8B91721C2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F19F7720-C188-42BA-B4F7-8A94251CBB62": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2C1B952C-CBC1-4E7E-A1D5-1ADB1D3160A0": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "291DA446-1159-45ED-AE69-FB0F73E3CB04": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7EC41E5D-8181-43D3-90A6-BA7A729AD37A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E05EB8C4-3C06-48D4-91C9-E5EA271879E5": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D890C0A9-6A00-4D3F-A997-40B6614EB9E2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "FD8A2171-5D14-4E7B-BEE4-4440DBA53C6C": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "EC988DCA-5C83-43C2-9CD6-1DF50A0A448D": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "39FDFB9D-8D85-4A8B-A546-D7451F978EDC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6091BAEA-7008-4A83-BC09-8B5515F8E323": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "30B1D86A-AC53-4145-8ABB-481688A09E30": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#NOTE: Drafts doesn't support a 'success' callback URL when no action is triggered, so if 'Return to Editorial' is on, the text is also copied to the clipboard.\n\nimport workflow\nimport webbrowser\nfrom urllib import quote\n\nparams = workflow.get_parameters()\ntext = params.get('Text', None)\ncallback = params.get('Return to Editorial', False)\n\nif text:\n\turl = 'drafts://x-callback-url/create?text=' + quote(text)\n\tif callback:\n\t\turl += '&action=' + quote('Copy to Clipboard')\n\t\turl += '&x-success=' + quote('editorial://')\n\tsuccess = webbrowser.open(url)\n\tif not success:\n\t\timport console\n\t\tconsole.hud_alert('Drafts not installed', 'error', 1.5)\n", "7A90A31B-EC7D-44F5-89B5-63A8CB4C207F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A0980BAA-E704-49D7-962E-DAB627E9F402": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Post with TweetBot", "parameters": {"DF194431-87BB-4812-80C3-9E5AB43F2C37": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8055E0DF-CD9A-4AD4-99E7-A8D6356360AB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "222622CB-9B38-42A7-847F-43A98BA19764": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "312D5B0A-73FE-4236-A720-7FCB9EF51D81": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"placeholder": "(Default Account)", "type": "basicText", "key": "CEB04CDB-BADD-4409-9B8F-8E073222E446", "title": "Account"}, {"title": "Tweet", "type": "advancedText", "key": "0A5A0AF9-F928-44FC-B995-EC4087050735", "height": 100}, {"type": "switch", "key": "99FAF415-0381-4238-B15F-4D5C50F6B413", "title": "Return to Editorial"}], "EE6DFE6A-3257-42AF-AFA6-C11ADE65559D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "99FAF415-0381-4238-B15F-4D5C50F6B413": true, "CDB2FAE9-2230-4B4B-ABA2-673267CA0166": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3F5656FF-CA7E-42BF-9B5A-56ACD9F7E5A7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7ABE0A9A-6749-4C3B-8719-915584215A14": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A494C1C1-6722-401A-ACE9-7A18E4E74E55": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "CEB04CDB-BADD-4409-9B8F-8E073222E446": "", "53EBDE34-739F-4BF0-B827-576CCCE9ABE6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "534B636B-1D5F-4A10-B4C5-32CBFC0AF3C6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A3B2161D-4604-43D8-A6B9-18A62C7CA6C9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D0AB689E-465F-4E6B-A61D-AFED521EE8E9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "49F9F435-2FDE-463F-BCBB-AE681D4578B2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0C4BA658-9E6E-4404-83DE-F909D40CDEF1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E511A644-13BE-47B1-9D71-511D750D6BB4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0A5A0AF9-F928-44FC-B995-EC4087050735": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "__custom_action_script__": "import workflow\nimport webbrowser\nfrom urllib import quote\n\nparams = workflow.get_parameters()\n\naccount = params.get('Account', None)\ntweet = params.get('Tweet', None)\ncallback = params.get('Return to Editorial', False)\n\n#tweetbot:///post?text=&callback_url=&in_reply_to_status_id=\n\nif tweet:\n\turl = 'tweetbot://'\n\tif account:\n\t\turl += quote(account)\n\turl += '/post?text=' + quote(tweet)\n\tif callback:\n\t\turl += '&callback_url=' + quote('editorial://')\n\twebbrowser.open(url)\n\n", "156F61D9-0566-48F6-A7B9-4D349BE78AE3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "674B8A7B-F599-45F0-BAB8-71ED1E45A19E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "36D42353-DB32-4C63-B266-EC5AADA5B00D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9EB2C8A0-07D7-436C-92BA-7B74777BBD34": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "81A29078-05D8-4975-B647-77E494DBF3BC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "51D1C493-CFCE-44F5-BA52-108C97E54933": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "204F7CD1-A4FF-41FD-AAA0-DDC598476C04": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Add to Evernote", "parameters": {"0352C55C-3F35-44FA-AB29-7E6A904A0613": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "456E0613-00B2-48DC-B291-21B2EC27D75A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "82720418-3940-4B9C-A2D1-3B70204D2304": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9631D935-B88F-4C69-8BCC-3F049AF483F0": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AE2F6C40-53E2-404F-A846-8A29D40E6CF7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "EB421585-1A18-45FD-8ABC-1DBE5E8619B6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"type": "basicText", "key": "B2C9A8F4-4F8A-401E-B133-BC44EEEEF2AE", "title": "Title"}, {"title": "Content", "type": "advancedText", "key": "D59D3667-23C6-4ABB-B75F-0B13990D775B", "height": 120}, {"placeholder": "(Get your token here: www.evernote.com/api/DeveloperToken.action)", "type": "basicText", "key": "10BB6296-7848-4280-ADB5-635C64224DE9", "title": "Dev Token"}], "7ACA768E-8A89-4415-B07C-B31BCE83FA3D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "04457BA2-8D74-4741-A93D-0B6D5205BF49": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "69F42725-4A73-4167-8B1E-A09D2BA9E24F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F54B0353-898D-4DCA-B92D-1BEB3BF7758D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DAF66F40-F705-43B9-92AB-D5A92CEFA442": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "EEC5B36C-C818-4F5C-82D5-41AC5A6E1BA9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "CFC86F37-AB60-42D5-B646-80E6FE691A77": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C57AA5DE-33C8-4B45-AE6E-6064A62F742C": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A32EA424-A040-4AE5-84E9-591A2D1FF2B4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "796C9ABC-17C4-4F6C-8AC5-279AFE86D058": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "10BB6296-7848-4280-ADB5-635C64224DE9": "", "1B77F140-097C-4127-BEE2-BB01184FC14E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "679ED8AF-7896-4C04-AC9F-E9461ABDB007": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "774B128A-6DC2-476C-B440-F3758AA39A78": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "B2C9A8F4-4F8A-401E-B133-BC44EEEEF2AE": "", "A3719759-62CC-4C4B-9AB5-4BCD38B0F3C7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "EBA59274-B1ED-4393-BFE8-E98ED9128A25": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "4C710287-CB44-471C-AD45-433C9EC90D02": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "# To get a developer token, visit\n# https://www.evernote.com/api/DeveloperToken.action\nimport workflow\nimport console\n\nparams = workflow.get_parameters()\nauth_token = params.get('Dev Token', None)\nnote_title = params.get('Title', '')\nnote_content = params.get('Content', '')\n\nif not auth_token:\n\tconsole.hud_alert('Evernote Dev Token Missing', 'error', 2.0)\n\tworkflow.stop()\nelif note_title or note_content:\n\timport evernote.edam.userstore.constants as UserStoreConstants\n\timport evernote.edam.type.ttypes as Types\n\tfrom evernote.api.client import EvernoteClient\n\tfrom xml.sax.saxutils import escape\n\t\n\tclient = EvernoteClient(token=auth_token, sandbox=False)\n\tnote_store = client.get_note_store()\n\t\n\t# To create a new note, simply create a new Note object and fill in\n\t# attributes such as the note's title.\n\tnote = Types.Note()\n\tnote.title = note_title\n\tnote.content = ''\n\tnote.content += ''\n\tnote.content += ''\n\tnote.content += escape(note_content)\n\tnote.content += ''\n\t\n\t# Finally, send the new note to Evernote using the createNote method\n\t# The new Note object that is returned will contain server-generated\n\t# attributes such as the new note's unique GUID.\n\tcreated_note = note_store.createNote(note)\n\tconsole.hud_alert('Note Created', 'success', 1.5)\n", "D59D3667-23C6-4ABB-B75F-0B13990D775B": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "5FEE6EFC-7BE6-4708-84A3-B3182767177D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3BE8EFF8-FBD7-4DF8-B567-518194D148BA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "29EB2687-683D-4A58-AB6B-A941402DAEF1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "85840AA5-5C07-4FA1-8692-53694FB83B2C": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3DECDA1F-D3D2-4E90-AB8C-D12C08B58373": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "CDF9DE95-858F-4647-A126-AEF9625125A9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "4C4D6EA0-A549-47FA-80A6-C5B6A19785BD": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "510DBD6D-2689-4417-AC04-9553B9272267": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8F6FDF93-1B6C-4FA6-95B7-A6C477D5FFFE": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F053FE50-E285-4077-B111-325A769238C3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "06F181C0-7013-4DD7-B09D-CBFD9334B4C7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Define with DuckDuckGo", "parameters": {"BE534FC3-F6BA-481E-B1D8-8E62D34EFD66": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A0C2918D-A916-40BB-92FE-6A44E2D5B045": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "575D606B-7F49-4DD6-8C1D-DD3B46840316": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8E6B3440-584F-4C2E-BA50-C11A313DB63B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C6CB5F0F-C999-4888-9B56-541AECEC2E8B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3B1B9207-645B-4CAD-9608-25DA4A317BC5": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "684BBA4F-E350-4D8E-8DF3-89378A91D452": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "# http://api.duckduckgo.com/?q=define+ostensibly&format=json&pretty=1\n\nimport workflow\nimport console\nimport requests\nimport json\nfrom urllib import quote\nparams = workflow.get_parameters()\nterm = params.get('Define', '')\nif term:\n\ttry:\n\t\turl = 'http://api.duckduckgo.com/?q=define+' + quote(term) + '&format=json'\n\t\tr = requests.get(url)\n\t\td = json.loads(r.text)\n\t\tdefinition = d.get('Definition', None)\n\t\tif definition:\n\t\t\tworkflow.set_output(definition)\n\t\telse:\n\t\t\tconsole.hud_alert('No Definition Found', 'error', 1.5)\n\texcept:\n\t\tconsole.hud_alert('Definition Request Failed', 'error', 1.5)\n", "7B7E9CFE-C687-4170-B46D-161A1EACA0C8": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A807F7DF-164C-446F-B977-F49A20A0C26E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "611C3E36-88E4-4F6C-9AD7-2F063DC8B71D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E1202951-73CE-4C09-8DCD-D0E79D2A61C9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F917E5C7-E300-4EF2-ABDB-2A508DCCF365": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"title": "Define", "type": "advancedText", "key": "8B8F3A1E-B83C-4B67-B3EC-87B36AB458E3", "height": 60}], "8B8F3A1E-B83C-4B67-B3EC-87B36AB458E3": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "479BBA56-96B7-4BD5-A5F1-21EF22E5AF0F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8E8129E4-FC24-40FE-B647-CF0B8362FB8B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "67C57B94-3E46-49FC-8FB3-27A942833489": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "729287BB-4E46-4A54-85D1-ADAC5D25480F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "5B74E06E-E622-4F10-A7BD-EBE753AB7A86": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "EE1CF495-4B2D-4D8B-9061-18E0E5B0DBA4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Get RSS Feed Titles", "parameters": {"BACDC10E-897F-4EAE-8278-8C34EE88DCA2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D110DEC1-2DF8-43F4-8A6F-2AE932CE4AF1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "12ABF778-3390-4340-9E21-38453DC6C783": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"placeholder": "http://example.com/rss.xml", "type": "basicText", "key": "B15FA92A-12FC-4B68-B520-420DC4E4D595", "title": "Feed URL"}], "AF9E2606-3AE4-41A1-A840-EC9453370702": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "5D8F6E03-6800-4D06-803A-A97C9908D48B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "5A07BA4D-C17C-4CF0-B30E-21A06F44DA92": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "4DE980FD-DA6B-4143-8809-9556986C511C": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C3EF5455-F439-436B-9FE8-E5A7FAF86233": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BDDBB8C4-EBD9-473A-B51A-A28DA62A88C4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "74CEF61F-4266-4770-A855-48937BD16B15": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C0F90D6C-DFBA-446A-A233-535E4B3B32B9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BB25125C-D24B-493F-A340-D1A962600596": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8B14AE50-B0C9-4B1B-A2E8-447B307D5EF1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1EAA574A-64DB-4C69-8787-4D173A7480C0": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "import workflow\nimport console\n\nparams = workflow.get_parameters()\nurl = params.get('Feed URL', None)\n\nif url:\n\tconsole.show_activity()\n\timport feedparser\n\tfeed = feedparser.parse(url)\n\tentries = feed.get('entries', None)\n\tif not entries:\n\t\tentries = feed.get('articles', None)\n\toutput_list = []\n\tif entries:\n\t\tfor entry in entries:\n\t\t\toutput_list.append(entry['title'])\n\tconsole.hide_activity()\n\toutput = '\\n'.join(output_list)\n\tworkflow.set_output(output)\n", "C841B051-92A1-47B6-959B-C899CB1991ED": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "B15FA92A-12FC-4B68-B520-420DC4E4D595": "", "A51B78B1-A5EA-48D3-861D-ECC8F00B8831": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0B04F212-0ABC-4886-B065-6BC2181E1AC9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3AFE1DCB-DF5E-46D9-8633-9D9563578386": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3788EDC6-BB26-462B-9260-352157C6005A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Select Next Occurrence", "parameters": {"37C9A579-02C9-4D10-AD20-6C47D4031448": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9F407BE1-E65A-47B7-BA64-505855FDB3E8": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "B35A3AA0-A70C-4EDD-AFCC-76DEB2187D16": false, "D3C6CFF4-1AC1-4ABA-B0FE-B42FC65988B2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F39BBD2E-F3A5-429E-BA3A-ABBFFB6D2659": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6AAB6208-3B16-438C-893E-AC46A8A92D39": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "5384BC3A-0FD7-45EC-8CA5-61320688D0B1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3D67FEDB-7684-4231-971F-6D15190B7D02": true, "775CB321-0094-41DE-B86E-1C11AC3E3085": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "82159FC6-A7C5-4049-8215-773BBB1D33EA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D92825A3-4B7D-470E-9226-E7E77652EA77": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7D5686AE-7498-48AA-8E47-330E4379FFCA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C39223D9-340E-49BB-90C4-745703A27A1A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2ABF039F-CBC9-43DE-AF52-6ECFE0674BAE": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "217C9D51-D748-459F-A3E8-C9F39A07CE5B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "import workflow\nimport editor\nimport re\n\nstart, end = editor.get_selection()\ntext = editor.get_text()\nparams = workflow.get_parameters()\nterm = params.get('Select Next Occurrence of', '')\nwrap = params.get('Wrap Around', False)\nregex = params.get('Regular Expression', False)\npattern = term if regex else re.escape(term)\n\nif term and text:\n\tmatch = re.search(pattern, text[end:])\n\toffset = end\n\tif not match and wrap:\n\t\tmatch = re.search(pattern, text)\n\t\toffset = 0\n\tif match:\n\t\teditor.set_selection(match.start(0) + offset, match.end(0) + offset)\n\n", "9D596A84-F9A6-464A-90C1-756CE9A9FBFC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"title": "Select Next Occurrence of", "type": "advancedText", "key": "6AAB6208-3B16-438C-893E-AC46A8A92D39", "height": 60}, {"type": "switch", "key": "B35A3AA0-A70C-4EDD-AFCC-76DEB2187D16", "title": "Regular Expression"}, {"type": "switch", "key": "3D67FEDB-7684-4231-971F-6D15190B7D02", "title": "Wrap Around"}]}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Get Stock Price", "parameters": {"8DD4E127-9BC3-4E71-9906-8183EB22A71E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "75483700-A12C-4CD9-B353-28B7ABD689C1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C6323715-08C9-43ED-A293-7B33AB24D6A2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6B2B9D39-6707-4DF6-8D26-9B7D41C58784": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8206FDA1-3695-44AD-8815-96DB8FD43C52": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0D20CE31-7551-4856-9C94-BC7A3244BEFD": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7C69D060-532E-489D-ADA1-C835CC9E6175": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"placeholder": "Example: AAPL", "type": "basicText", "key": "61E0B385-F668-463D-B0F8-1C6447815C44", "title": "Symbol"}], "20AFA058-634C-4681-BEDB-0959D4D853BC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F7F44F24-B811-4091-B706-2524D9641317": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "591C26D4-766E-4427-AB5D-D3D6E0E55328": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "import workflow\nimport urllib\ns = workflow.get_parameters().get('Symbol')\nif s:\n\ttry:\n\t\turl = 'http://finance.yahoo.com/d/quotes.csv?s=' + s + '&f=l1'\n\t\tf = urllib.urlopen(url)\n\t\tprice = f.read()\n\t\tworkflow.set_output(price)\n\texcept IOError:\n\t\timport console\n\t\tconsole.hud_alert('Could not get stock price', 'error', 1.5)\n", "61E0B385-F668-463D-B0F8-1C6447815C44": "AAPL", "E4D83CC2-C054-4003-AD92-2AEE7C6C0435": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Create Short URL (is.gd)", "parameters": {"10B1B7A9-80C5-4F95-9EAA-F07972B0EBFC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "5E93090E-6437-4C55-B094-83DE96B52703": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C567E82B-ACB7-405D-970E-72C0A2B441E3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "40E9FF24-8C64-4229-B981-2D8D82260D7D": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E2106D1B-D7C6-4F6D-9B3B-537CA72CE811": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "81075EBD-B31E-4298-9FC4-48D5A674EE46": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F9FFC76E-0679-475D-AA09-FF2CD72EF00B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1C90F8A2-BE1A-4A55-8233-DF038A895A06": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "4FF30A71-E12D-4EBD-8123-1F53728EC2CF": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "__custom_action_parameters__": [{"type": "advancedText", "key": "4FF30A71-E12D-4EBD-8123-1F53728EC2CF", "title": "URL"}], "76F230D3-33FD-450E-A16B-0E5E56EDE069": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "import workflow\nimport clipboard\nimport re\nimport console\n\nlong_url = workflow.get_parameters()['URL']\nif re.match('http(s)?://.*', long_url):\n\timport urllib\n\ttry:\n\t\tshort_url = urllib.urlopen('http://is.gd/create.php?format=simple&url=' + urllib.quote(long_url, '')).read()\n\t\tif re.match('http://is.gd.*', short_url):\n\t\t\tworkflow.set_output(short_url)\n\t\telse:\n\t\t\tconsole.hud_alert('Failed to shorten URL', 'error', 1.5)\n\texcept IOError:\n\t\tconsole.hud_alert('Failed to shorten URL', 'error', 1.5)\nelse:\n\tconsole.hud_alert('Invalid URL', 'error', 1.5)\n"}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Schedule Notification", "parameters": {"__custom_action_parameters__": [{"optionTitles": ["(None)", "Beep", "Bleep", "Coin", "Error", "Spaceship"], "type": "selectOption", "key": "862FB2F6-1EE9-4C29-A300-9CEE71BA9EF0", "title": "Sound"}, {"keyboardType": 2, "type": "basicText", "key": "CE644B5C-69B0-49A0-BF4A-75A36498757C", "title": "Delay (Minutes)"}, {"title": "Text", "type": "advancedText", "key": "7D651A4D-2FB1-40FF-8D5A-BD229BD1932D", "height": 100}, {"title": "Launch URL (optional)", "keyboardType": 3, "type": "advancedText", "key": "359B956D-9411-4CD8-99EF-C0B7B526C83A", "height": 60}], "359B956D-9411-4CD8-99EF-C0B7B526C83A": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "862FB2F6-1EE9-4C29-A300-9CEE71BA9EF0": 2, "CE644B5C-69B0-49A0-BF4A-75A36498757C": "3", "F88F3762-0A14-4093-ACA9-3EFAF15D3E07": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7D651A4D-2FB1-40FF-8D5A-BD229BD1932D": {"text": "Hello", "tokenRanges": {}, "type": "advancedText"}, "E73307C2-86EA-416F-958C-515B8C50D99E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9045C4C2-C0C2-45F8-94CA-FD67A056FA67": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F5F109B7-E71A-41F6-B18C-7E7CE0F4F407": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D867DE9C-6751-493F-AB9E-7E3D66073EC2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "80AB8F76-C78C-43D8-89D3-95DC7089B65C": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#coding: utf-8\nimport workflow\nimport notification\nimport console\n\nsounds = ['Beep', 'Bleep', 'Coin_1', 'Error', 'Spaceship']\nparams = workflow.get_parameters()\neffect_index = params['Sound']\neffect_name = sounds[effect_index - 1] if effect_index > 0 else None\nmessage = params['Text']\nlaunch_url = params['Launch URL (optional)']\n\ntry:\n\tdelay = float(params['Delay (Minutes)'])\nexcept ValueError:\n\tconsole.hud_alert('Invalid Delay', 'error')\nnotification.schedule(message, delay * 60, effect_name, launch_url)\nconsole.hud_alert('Scheduled', 'success', 1.0)\n\n", "D7F3FA22-DCF5-4A30-A139-B68783ECAD05": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Cancel All Notifications", "parameters": {"E34ED55B-FBEB-4F8F-9D0C-95FFD1DE039A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3A9BEAB2-2B3E-406C-B42B-265D62E483DA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F4F4B693-ADE6-47A2-B415-E0146DD88F1A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "717F8A2C-28FB-452A-B526-438413AEAE55": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C08D2B9F-763E-4D47-BF3F-E78C29B1DAA4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [], "EBDA4415-A049-4FE8-9A30-17D5B03C5DA1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "714E0559-7484-49D8-A9DC-6010611669A6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#coding: utf-8\nimport workflow\nimport notification\n\nnotification.cancel_all()\n\nworkflow.set_output = workflow.get_input()\n", "85306C9A-B368-4B73-8857-FBE3ECB0922F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "41F5C805-5E66-4A77-BC05-BBA84DC22DC2": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Compare (Diff)", "parameters": {"DD6CA9FD-BFC3-4E2A-9B4C-B00F5B046BA8": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "A25A8AE4-C956-4D2C-BF0D-4C9D247DB7D6": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "8DE8D02F-DCD8-47D0-A6CA-3C608AD98083": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "864F256C-515C-4158-BE3A-86ED61472F36": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "60C613B4-0902-4F5F-9659-6CE06E71E752": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "33A0A4E3-1D89-4418-8A36-1015D59A61D7": 0, "DBAD4725-4CE7-4CD3-8F1D-109B7A1C4056": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9FC62B34-5EB2-4ADC-9F2B-7E187B79F39B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"title": "Text A", "type": "advancedText", "key": "A25A8AE4-C956-4D2C-BF0D-4C9D247DB7D6", "height": 100}, {"title": "Text B", "type": "advancedText", "key": "DD6CA9FD-BFC3-4E2A-9B4C-B00F5B046BA8", "height": 100}, {"optionTitles": ["HTML", "Critic Markup"], "type": "selectOption", "key": "33A0A4E3-1D89-4418-8A36-1015D59A61D7", "title": "Output Format"}], "E97BF5C5-8263-49D2-9A89-007C3D4B57A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#coding: utf-8\nimport workflow\nimport difflib\nfrom StringIO import StringIO\n\ndef diff(a, b, del1, del2, ins1, ins2):\n\tseq = difflib.SequenceMatcher(None, a, b)\n\topcodes = seq.get_opcodes()\n\tout = StringIO()\n\tfor op, a0, a1, b0, b1 in opcodes:\n\t\tif op == 'equal':\n\t\t\tout.write(a[a0:a1])\n\t\tif op == 'insert' or op == 'replace':\n\t\t\tout.write(ins1 + b[b0:b1] + ins2)\n\t\tif op == 'delete' or op == 'replace':\n\t\t\tout.write(del1 + a[a0:a1] + del2)\n\treturn out.getvalue()\n\nparams = workflow.get_parameters()\na = params['Text A']\nb = params['Text B']\nif params['Output Format'] == 0:\n\timport cgi\n\ta = cgi.escape(a)\n\tb = cgi.escape(b)\n\thtml = diff(a, b, '', '', '', '')\n\tworkflow.set_output(html)\nelse:\n\tcritic_markup = diff(a, b, '{--', '--}', '{++', '++}')\n\tworkflow.set_output(critic_markup)\n"}, "class": "WorkflowActionCustom"}], "name": "Custom Actions Pack", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone10,6", "systemVersion": "13.1.3"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_SPANNER.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22This%20is%20a%20collection%20of%20several%20unrelated%20custom%20actions.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22READ%20ME%5Cu2757%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22This%20is%20not%20an%20actual%20workflow%2C%20it%20just%20contains%20a%20collection%20of%20custom%20actions%20that%20are%20meant%20to%20be%20saved%20as%20presets.%5Cn%5CnRunning%20this%20won%27t%20do%20anything%20because%20of%20the%20following%20%27Stop%27%20action.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22---------------------------------------------------------------------------------------%22%2C%20%22parameters%22%3A%20%7B%22showHUD%22%3A%20false%2C%20%22HUDTitle%22%3A%20%22%22%7D%2C%20%22class%22%3A%20%22WorkflowActionStopWorkflow%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Send%20to%20Drafts%22%2C%20%22parameters%22%3A%20%7B%220217F8EB-80EF-4A2C-A9E5-7E18DC6C3248%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221C841272-0445-4065-853D-785C8DBE61D3%22%3A%20true%2C%20%22143D755D-53CA-4286-B024-A20A1578BF3B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2247E71F88-8D67-4E22-8E06-6EF4DA6D1626%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22title%22%3A%20%22Text%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%22EC988DCA-5C83-43C2-9CD6-1DF50A0A448D%22%2C%20%22height%22%3A%20120%7D%2C%20%7B%22type%22%3A%20%22switch%22%2C%20%22key%22%3A%20%221C841272-0445-4065-853D-785C8DBE61D3%22%2C%20%22title%22%3A%20%22Return%20to%20Editorial%22%7D%5D%2C%20%2230D112E0-6074-4B9E-9F59-5EFA908FC9A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AECCCF4E-41A4-4C07-ABB0-45DF485AFD2D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229A5C7E4F-0E3F-4918-A7B2-A9F790F8BF54%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A035F565-D7EA-4F35-86F2-74B8B91721C2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F19F7720-C188-42BA-B4F7-8A94251CBB62%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222C1B952C-CBC1-4E7E-A1D5-1ADB1D3160A0%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22291DA446-1159-45ED-AE69-FB0F73E3CB04%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227EC41E5D-8181-43D3-90A6-BA7A729AD37A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E05EB8C4-3C06-48D4-91C9-E5EA271879E5%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D890C0A9-6A00-4D3F-A997-40B6614EB9E2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22FD8A2171-5D14-4E7B-BEE4-4440DBA53C6C%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22EC988DCA-5C83-43C2-9CD6-1DF50A0A448D%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2239FDFB9D-8D85-4A8B-A546-D7451F978EDC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226091BAEA-7008-4A83-BC09-8B5515F8E323%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2230B1D86A-AC53-4145-8ABB-481688A09E30%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23NOTE%3A%20Drafts%20doesn%27t%20support%20a%20%27success%27%20callback%20URL%20when%20no%20action%20is%20triggered%2C%20so%20if%20%27Return%20to%20Editorial%27%20is%20on%2C%20the%20text%20is%20also%20copied%20to%20the%20clipboard.%5Cn%5Cnimport%20workflow%5Cnimport%20webbrowser%5Cnfrom%20urllib%20import%20quote%5Cn%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cntext%20%3D%20params.get%28%27Text%27%2C%20None%29%5Cncallback%20%3D%20params.get%28%27Return%20to%20Editorial%27%2C%20False%29%5Cn%5Cnif%20text%3A%5Cn%5Cturl%20%3D%20%27drafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%27%20%2B%20quote%28text%29%5Cn%5Ctif%20callback%3A%5Cn%5Ct%5Cturl%20%2B%3D%20%27%26action%3D%27%20%2B%20quote%28%27Copy%20to%20Clipboard%27%29%5Cn%5Ct%5Cturl%20%2B%3D%20%27%26x-success%3D%27%20%2B%20quote%28%27editorial%3A%2F%2F%27%29%5Cn%5Ctsuccess%20%3D%20webbrowser.open%28url%29%5Cn%5Ctif%20not%20success%3A%5Cn%5Ct%5Ctimport%20console%5Cn%5Ct%5Ctconsole.hud_alert%28%27Drafts%20not%20installed%27%2C%20%27error%27%2C%201.5%29%5Cn%22%2C%20%227A90A31B-EC7D-44F5-89B5-63A8CB4C207F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A0980BAA-E704-49D7-962E-DAB627E9F402%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Post%20with%20TweetBot%22%2C%20%22parameters%22%3A%20%7B%22DF194431-87BB-4812-80C3-9E5AB43F2C37%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228055E0DF-CD9A-4AD4-99E7-A8D6356360AB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22222622CB-9B38-42A7-847F-43A98BA19764%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22312D5B0A-73FE-4236-A720-7FCB9EF51D81%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22placeholder%22%3A%20%22%28Default%20Account%29%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22CEB04CDB-BADD-4409-9B8F-8E073222E446%22%2C%20%22title%22%3A%20%22Account%22%7D%2C%20%7B%22title%22%3A%20%22Tweet%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%220A5A0AF9-F928-44FC-B995-EC4087050735%22%2C%20%22height%22%3A%20100%7D%2C%20%7B%22type%22%3A%20%22switch%22%2C%20%22key%22%3A%20%2299FAF415-0381-4238-B15F-4D5C50F6B413%22%2C%20%22title%22%3A%20%22Return%20to%20Editorial%22%7D%5D%2C%20%22EE6DFE6A-3257-42AF-AFA6-C11ADE65559D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2299FAF415-0381-4238-B15F-4D5C50F6B413%22%3A%20true%2C%20%22CDB2FAE9-2230-4B4B-ABA2-673267CA0166%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223F5656FF-CA7E-42BF-9B5A-56ACD9F7E5A7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227ABE0A9A-6749-4C3B-8719-915584215A14%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A494C1C1-6722-401A-ACE9-7A18E4E74E55%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22CEB04CDB-BADD-4409-9B8F-8E073222E446%22%3A%20%22%22%2C%20%2253EBDE34-739F-4BF0-B827-576CCCE9ABE6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22534B636B-1D5F-4A10-B4C5-32CBFC0AF3C6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A3B2161D-4604-43D8-A6B9-18A62C7CA6C9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D0AB689E-465F-4E6B-A61D-AFED521EE8E9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2249F9F435-2FDE-463F-BCBB-AE681D4578B2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220C4BA658-9E6E-4404-83DE-F909D40CDEF1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E511A644-13BE-47B1-9D71-511D750D6BB4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220A5A0AF9-F928-44FC-B995-EC4087050735%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22import%20workflow%5Cnimport%20webbrowser%5Cnfrom%20urllib%20import%20quote%5Cn%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cn%5Cnaccount%20%3D%20params.get%28%27Account%27%2C%20None%29%5Cntweet%20%3D%20params.get%28%27Tweet%27%2C%20None%29%5Cncallback%20%3D%20params.get%28%27Return%20to%20Editorial%27%2C%20False%29%5Cn%5Cn%23tweetbot%3A%2F%2F%3Cscreenname%3E%2Fpost%3Ftext%3D%3Ctext%3E%26callback_url%3D%3Curl%3E%26in_reply_to_status_id%3D%3Ctweet_id%3E%5Cn%5Cnif%20tweet%3A%5Cn%5Cturl%20%3D%20%27tweetbot%3A%2F%2F%27%5Cn%5Ctif%20account%3A%5Cn%5Ct%5Cturl%20%2B%3D%20quote%28account%29%5Cn%5Cturl%20%2B%3D%20%27%2Fpost%3Ftext%3D%27%20%2B%20quote%28tweet%29%5Cn%5Ctif%20callback%3A%5Cn%5Ct%5Cturl%20%2B%3D%20%27%26callback_url%3D%27%20%2B%20quote%28%27editorial%3A%2F%2F%27%29%5Cn%5Ctwebbrowser.open%28url%29%5Cn%5Cn%22%2C%20%22156F61D9-0566-48F6-A7B9-4D349BE78AE3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22674B8A7B-F599-45F0-BAB8-71ED1E45A19E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2236D42353-DB32-4C63-B266-EC5AADA5B00D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229EB2C8A0-07D7-436C-92BA-7B74777BBD34%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2281A29078-05D8-4975-B647-77E494DBF3BC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2251D1C493-CFCE-44F5-BA52-108C97E54933%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22204F7CD1-A4FF-41FD-AAA0-DDC598476C04%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Add%20to%20Evernote%22%2C%20%22parameters%22%3A%20%7B%220352C55C-3F35-44FA-AB29-7E6A904A0613%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22456E0613-00B2-48DC-B291-21B2EC27D75A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2282720418-3940-4B9C-A2D1-3B70204D2304%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229631D935-B88F-4C69-8BCC-3F049AF483F0%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AE2F6C40-53E2-404F-A846-8A29D40E6CF7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22EB421585-1A18-45FD-8ABC-1DBE5E8619B6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22B2C9A8F4-4F8A-401E-B133-BC44EEEEF2AE%22%2C%20%22title%22%3A%20%22Title%22%7D%2C%20%7B%22title%22%3A%20%22Content%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%22D59D3667-23C6-4ABB-B75F-0B13990D775B%22%2C%20%22height%22%3A%20120%7D%2C%20%7B%22placeholder%22%3A%20%22%28Get%20your%20token%20here%3A%20www.evernote.com%2Fapi%2FDeveloperToken.action%29%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%2210BB6296-7848-4280-ADB5-635C64224DE9%22%2C%20%22title%22%3A%20%22Dev%20Token%22%7D%5D%2C%20%227ACA768E-8A89-4415-B07C-B31BCE83FA3D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2204457BA2-8D74-4741-A93D-0B6D5205BF49%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2269F42725-4A73-4167-8B1E-A09D2BA9E24F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F54B0353-898D-4DCA-B92D-1BEB3BF7758D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DAF66F40-F705-43B9-92AB-D5A92CEFA442%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22EEC5B36C-C818-4F5C-82D5-41AC5A6E1BA9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22CFC86F37-AB60-42D5-B646-80E6FE691A77%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C57AA5DE-33C8-4B45-AE6E-6064A62F742C%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A32EA424-A040-4AE5-84E9-591A2D1FF2B4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22796C9ABC-17C4-4F6C-8AC5-279AFE86D058%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2210BB6296-7848-4280-ADB5-635C64224DE9%22%3A%20%22%22%2C%20%221B77F140-097C-4127-BEE2-BB01184FC14E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22679ED8AF-7896-4C04-AC9F-E9461ABDB007%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22774B128A-6DC2-476C-B440-F3758AA39A78%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22B2C9A8F4-4F8A-401E-B133-BC44EEEEF2AE%22%3A%20%22%22%2C%20%22A3719759-62CC-4C4B-9AB5-4BCD38B0F3C7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22EBA59274-B1ED-4393-BFE8-E98ED9128A25%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%224C710287-CB44-471C-AD45-433C9EC90D02%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23%20To%20get%20a%20developer%20token%2C%20visit%5Cn%23%20https%3A%2F%2Fwww.evernote.com%2Fapi%2FDeveloperToken.action%5Cnimport%20workflow%5Cnimport%20console%5Cn%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cnauth_token%20%3D%20params.get%28%27Dev%20Token%27%2C%20None%29%5Cnnote_title%20%3D%20params.get%28%27Title%27%2C%20%27%27%29%5Cnnote_content%20%3D%20params.get%28%27Content%27%2C%20%27%27%29%5Cn%5Cnif%20not%20auth_token%3A%5Cn%5Ctconsole.hud_alert%28%27Evernote%20Dev%20Token%20Missing%27%2C%20%27error%27%2C%202.0%29%5Cn%5Ctworkflow.stop%28%29%5Cnelif%20note_title%20or%20note_content%3A%5Cn%5Ctimport%20evernote.edam.userstore.constants%20as%20UserStoreConstants%5Cn%5Ctimport%20evernote.edam.type.ttypes%20as%20Types%5Cn%5Ctfrom%20evernote.api.client%20import%20EvernoteClient%5Cn%5Ctfrom%20xml.sax.saxutils%20import%20escape%5Cn%5Ct%5Cn%5Ctclient%20%3D%20EvernoteClient%28token%3Dauth_token%2C%20sandbox%3DFalse%29%5Cn%5Ctnote_store%20%3D%20client.get_note_store%28%29%5Cn%5Ct%5Cn%5Ct%23%20To%20create%20a%20new%20note%2C%20simply%20create%20a%20new%20Note%20object%20and%20fill%20in%5Cn%5Ct%23%20attributes%20such%20as%20the%20note%27s%20title.%5Cn%5Ctnote%20%3D%20Types.Note%28%29%5Cn%5Ctnote.title%20%3D%20note_title%5Cn%5Ctnote.content%20%3D%20%27%3C%3Fxml%20version%3D%5C%221.0%5C%22%20encoding%3D%5C%22UTF-8%5C%22%3F%3E%27%5Cn%5Ctnote.content%20%2B%3D%20%27%3C%21DOCTYPE%20en-note%20SYSTEM%20%27%20%5C%5C%5Cn%20%20%20%20%27%5C%22http%3A%2F%2Fxml.evernote.com%2Fpub%2Fenml2.dtd%5C%22%3E%27%5Cn%5Ctnote.content%20%2B%3D%20%27%3Cen-note%3E%27%5Cn%5Ctnote.content%20%2B%3D%20escape%28note_content%29%5Cn%5Ctnote.content%20%2B%3D%20%27%3C%2Fen-note%3E%27%5Cn%5Ct%5Cn%5Ct%23%20Finally%2C%20send%20the%20new%20note%20to%20Evernote%20using%20the%20createNote%20method%5Cn%5Ct%23%20The%20new%20Note%20object%20that%20is%20returned%20will%20contain%20server-generated%5Cn%5Ct%23%20attributes%20such%20as%20the%20new%20note%27s%20unique%20GUID.%5Cn%5Ctcreated_note%20%3D%20note_store.createNote%28note%29%5Cn%5Ctconsole.hud_alert%28%27Note%20Created%27%2C%20%27success%27%2C%201.5%29%5Cn%22%2C%20%22D59D3667-23C6-4ABB-B75F-0B13990D775B%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225FEE6EFC-7BE6-4708-84A3-B3182767177D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223BE8EFF8-FBD7-4DF8-B567-518194D148BA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2229EB2687-683D-4A58-AB6B-A941402DAEF1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2285840AA5-5C07-4FA1-8692-53694FB83B2C%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223DECDA1F-D3D2-4E90-AB8C-D12C08B58373%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22CDF9DE95-858F-4647-A126-AEF9625125A9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%224C4D6EA0-A549-47FA-80A6-C5B6A19785BD%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22510DBD6D-2689-4417-AC04-9553B9272267%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228F6FDF93-1B6C-4FA6-95B7-A6C477D5FFFE%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F053FE50-E285-4077-B111-325A769238C3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2206F181C0-7013-4DD7-B09D-CBFD9334B4C7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Define%20with%20DuckDuckGo%22%2C%20%22parameters%22%3A%20%7B%22BE534FC3-F6BA-481E-B1D8-8E62D34EFD66%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A0C2918D-A916-40BB-92FE-6A44E2D5B045%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22575D606B-7F49-4DD6-8C1D-DD3B46840316%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228E6B3440-584F-4C2E-BA50-C11A313DB63B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C6CB5F0F-C999-4888-9B56-541AECEC2E8B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223B1B9207-645B-4CAD-9608-25DA4A317BC5%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22684BBA4F-E350-4D8E-8DF3-89378A91D452%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23%20http%3A%2F%2Fapi.duckduckgo.com%2F%3Fq%3Ddefine%2Bostensibly%26format%3Djson%26pretty%3D1%5Cn%5Cnimport%20workflow%5Cnimport%20console%5Cnimport%20requests%5Cnimport%20json%5Cnfrom%20urllib%20import%20quote%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cnterm%20%3D%20params.get%28%27Define%27%2C%20%27%27%29%5Cnif%20term%3A%5Cn%5Cttry%3A%5Cn%5Ct%5Cturl%20%3D%20%27http%3A%2F%2Fapi.duckduckgo.com%2F%3Fq%3Ddefine%2B%27%20%2B%20quote%28term%29%20%2B%20%27%26format%3Djson%27%5Cn%5Ct%5Ctr%20%3D%20requests.get%28url%29%5Cn%5Ct%5Ctd%20%3D%20json.loads%28r.text%29%5Cn%5Ct%5Ctdefinition%20%3D%20d.get%28%27Definition%27%2C%20None%29%5Cn%5Ct%5Ctif%20definition%3A%5Cn%5Ct%5Ct%5Ctworkflow.set_output%28definition%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27No%20Definition%20Found%27%2C%20%27error%27%2C%201.5%29%5Cn%5Ctexcept%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Definition%20Request%20Failed%27%2C%20%27error%27%2C%201.5%29%5Cn%22%2C%20%227B7E9CFE-C687-4170-B46D-161A1EACA0C8%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A807F7DF-164C-446F-B977-F49A20A0C26E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22611C3E36-88E4-4F6C-9AD7-2F063DC8B71D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E1202951-73CE-4C09-8DCD-D0E79D2A61C9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F917E5C7-E300-4EF2-ABDB-2A508DCCF365%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22title%22%3A%20%22Define%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%228B8F3A1E-B83C-4B67-B3EC-87B36AB458E3%22%2C%20%22height%22%3A%2060%7D%5D%2C%20%228B8F3A1E-B83C-4B67-B3EC-87B36AB458E3%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22479BBA56-96B7-4BD5-A5F1-21EF22E5AF0F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228E8129E4-FC24-40FE-B647-CF0B8362FB8B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2267C57B94-3E46-49FC-8FB3-27A942833489%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22729287BB-4E46-4A54-85D1-ADAC5D25480F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225B74E06E-E622-4F10-A7BD-EBE753AB7A86%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22EE1CF495-4B2D-4D8B-9061-18E0E5B0DBA4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Get%20RSS%20Feed%20Titles%22%2C%20%22parameters%22%3A%20%7B%22BACDC10E-897F-4EAE-8278-8C34EE88DCA2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D110DEC1-2DF8-43F4-8A6F-2AE932CE4AF1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2212ABF778-3390-4340-9E21-38453DC6C783%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22placeholder%22%3A%20%22http%3A%2F%2Fexample.com%2Frss.xml%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22B15FA92A-12FC-4B68-B520-420DC4E4D595%22%2C%20%22title%22%3A%20%22Feed%20URL%22%7D%5D%2C%20%22AF9E2606-3AE4-41A1-A840-EC9453370702%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225D8F6E03-6800-4D06-803A-A97C9908D48B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225A07BA4D-C17C-4CF0-B30E-21A06F44DA92%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%224DE980FD-DA6B-4143-8809-9556986C511C%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C3EF5455-F439-436B-9FE8-E5A7FAF86233%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BDDBB8C4-EBD9-473A-B51A-A28DA62A88C4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2274CEF61F-4266-4770-A855-48937BD16B15%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C0F90D6C-DFBA-446A-A233-535E4B3B32B9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BB25125C-D24B-493F-A340-D1A962600596%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228B14AE50-B0C9-4B1B-A2E8-447B307D5EF1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221EAA574A-64DB-4C69-8787-4D173A7480C0%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22import%20workflow%5Cnimport%20console%5Cn%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cnurl%20%3D%20params.get%28%27Feed%20URL%27%2C%20None%29%5Cn%5Cnif%20url%3A%5Cn%5Ctconsole.show_activity%28%29%5Cn%5Ctimport%20feedparser%5Cn%5Ctfeed%20%3D%20feedparser.parse%28url%29%5Cn%5Ctentries%20%3D%20feed.get%28%27entries%27%2C%20None%29%5Cn%5Ctif%20not%20entries%3A%5Cn%5Ct%5Ctentries%20%3D%20feed.get%28%27articles%27%2C%20None%29%5Cn%5Ctoutput_list%20%3D%20%5B%5D%5Cn%5Ctif%20entries%3A%5Cn%5Ct%5Ctfor%20entry%20in%20entries%3A%5Cn%5Ct%5Ct%5Ctoutput_list.append%28entry%5B%27title%27%5D%29%5Cn%5Ctconsole.hide_activity%28%29%5Cn%5Ctoutput%20%3D%20%27%5C%5Cn%27.join%28output_list%29%5Cn%5Ctworkflow.set_output%28output%29%5Cn%22%2C%20%22C841B051-92A1-47B6-959B-C899CB1991ED%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22B15FA92A-12FC-4B68-B520-420DC4E4D595%22%3A%20%22%22%2C%20%22A51B78B1-A5EA-48D3-861D-ECC8F00B8831%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220B04F212-0ABC-4886-B065-6BC2181E1AC9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223AFE1DCB-DF5E-46D9-8633-9D9563578386%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223788EDC6-BB26-462B-9260-352157C6005A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Select%20Next%20Occurrence%22%2C%20%22parameters%22%3A%20%7B%2237C9A579-02C9-4D10-AD20-6C47D4031448%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229F407BE1-E65A-47B7-BA64-505855FDB3E8%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22B35A3AA0-A70C-4EDD-AFCC-76DEB2187D16%22%3A%20false%2C%20%22D3C6CFF4-1AC1-4ABA-B0FE-B42FC65988B2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F39BBD2E-F3A5-429E-BA3A-ABBFFB6D2659%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226AAB6208-3B16-438C-893E-AC46A8A92D39%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225384BC3A-0FD7-45EC-8CA5-61320688D0B1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223D67FEDB-7684-4231-971F-6D15190B7D02%22%3A%20true%2C%20%22775CB321-0094-41DE-B86E-1C11AC3E3085%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2282159FC6-A7C5-4049-8215-773BBB1D33EA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D92825A3-4B7D-470E-9226-E7E77652EA77%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227D5686AE-7498-48AA-8E47-330E4379FFCA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C39223D9-340E-49BB-90C4-745703A27A1A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222ABF039F-CBC9-43DE-AF52-6ECFE0674BAE%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22217C9D51-D748-459F-A3E8-C9F39A07CE5B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22import%20workflow%5Cnimport%20editor%5Cnimport%20re%5Cn%5Cnstart%2C%20end%20%3D%20editor.get_selection%28%29%5Cntext%20%3D%20editor.get_text%28%29%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cnterm%20%3D%20params.get%28%27Select%20Next%20Occurrence%20of%27%2C%20%27%27%29%5Cnwrap%20%3D%20params.get%28%27Wrap%20Around%27%2C%20False%29%5Cnregex%20%3D%20params.get%28%27Regular%20Expression%27%2C%20False%29%5Cnpattern%20%3D%20term%20if%20regex%20else%20re.escape%28term%29%5Cn%5Cnif%20term%20and%20text%3A%5Cn%5Ctmatch%20%3D%20re.search%28pattern%2C%20text%5Bend%3A%5D%29%5Cn%5Ctoffset%20%3D%20end%5Cn%5Ctif%20not%20match%20and%20wrap%3A%5Cn%5Ct%5Ctmatch%20%3D%20re.search%28pattern%2C%20text%29%5Cn%5Ct%5Ctoffset%20%3D%200%5Cn%5Ctif%20match%3A%5Cn%5Ct%5Cteditor.set_selection%28match.start%280%29%20%2B%20offset%2C%20match.end%280%29%20%2B%20offset%29%5Cn%5Cn%22%2C%20%229D596A84-F9A6-464A-90C1-756CE9A9FBFC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22title%22%3A%20%22Select%20Next%20Occurrence%20of%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%226AAB6208-3B16-438C-893E-AC46A8A92D39%22%2C%20%22height%22%3A%2060%7D%2C%20%7B%22type%22%3A%20%22switch%22%2C%20%22key%22%3A%20%22B35A3AA0-A70C-4EDD-AFCC-76DEB2187D16%22%2C%20%22title%22%3A%20%22Regular%20Expression%22%7D%2C%20%7B%22type%22%3A%20%22switch%22%2C%20%22key%22%3A%20%223D67FEDB-7684-4231-971F-6D15190B7D02%22%2C%20%22title%22%3A%20%22Wrap%20Around%22%7D%5D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Get%20Stock%20Price%22%2C%20%22parameters%22%3A%20%7B%228DD4E127-9BC3-4E71-9906-8183EB22A71E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2275483700-A12C-4CD9-B353-28B7ABD689C1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C6323715-08C9-43ED-A293-7B33AB24D6A2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226B2B9D39-6707-4DF6-8D26-9B7D41C58784%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228206FDA1-3695-44AD-8815-96DB8FD43C52%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220D20CE31-7551-4856-9C94-BC7A3244BEFD%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227C69D060-532E-489D-ADA1-C835CC9E6175%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22placeholder%22%3A%20%22Example%3A%20AAPL%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%2261E0B385-F668-463D-B0F8-1C6447815C44%22%2C%20%22title%22%3A%20%22Symbol%22%7D%5D%2C%20%2220AFA058-634C-4681-BEDB-0959D4D853BC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F7F44F24-B811-4091-B706-2524D9641317%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22591C26D4-766E-4427-AB5D-D3D6E0E55328%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22import%20workflow%5Cnimport%20urllib%5Cns%20%3D%20workflow.get_parameters%28%29.get%28%27Symbol%27%29%5Cnif%20s%3A%5Cn%5Cttry%3A%5Cn%5Ct%5Cturl%20%3D%20%27http%3A%2F%2Ffinance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3D%27%20%2B%20s%20%2B%20%27%26f%3Dl1%27%5Cn%5Ct%5Ctf%20%3D%20urllib.urlopen%28url%29%5Cn%5Ct%5Ctprice%20%3D%20f.read%28%29%5Cn%5Ct%5Ctworkflow.set_output%28price%29%5Cn%5Ctexcept%20IOError%3A%5Cn%5Ct%5Ctimport%20console%5Cn%5Ct%5Ctconsole.hud_alert%28%27Could%20not%20get%20stock%20price%27%2C%20%27error%27%2C%201.5%29%5Cn%22%2C%20%2261E0B385-F668-463D-B0F8-1C6447815C44%22%3A%20%22AAPL%22%2C%20%22E4D83CC2-C054-4003-AD92-2AEE7C6C0435%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Create%20Short%20URL%20%28is.gd%29%22%2C%20%22parameters%22%3A%20%7B%2210B1B7A9-80C5-4F95-9EAA-F07972B0EBFC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%225E93090E-6437-4C55-B094-83DE96B52703%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C567E82B-ACB7-405D-970E-72C0A2B441E3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2240E9FF24-8C64-4229-B981-2D8D82260D7D%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E2106D1B-D7C6-4F6D-9B3B-537CA72CE811%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2281075EBD-B31E-4298-9FC4-48D5A674EE46%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F9FFC76E-0679-475D-AA09-FF2CD72EF00B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221C90F8A2-BE1A-4A55-8233-DF038A895A06%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%224FF30A71-E12D-4EBD-8123-1F53728EC2CF%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%224FF30A71-E12D-4EBD-8123-1F53728EC2CF%22%2C%20%22title%22%3A%20%22URL%22%7D%5D%2C%20%2276F230D3-33FD-450E-A16B-0E5E56EDE069%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22import%20workflow%5Cnimport%20clipboard%5Cnimport%20re%5Cnimport%20console%5Cn%5Cnlong_url%20%3D%20workflow.get_parameters%28%29%5B%27URL%27%5D%5Cnif%20re.match%28%27http%28s%29%3F%3A%2F%2F.%2A%27%2C%20long_url%29%3A%5Cn%5Ctimport%20urllib%5Cn%5Cttry%3A%5Cn%5Ct%5Ctshort_url%20%3D%20urllib.urlopen%28%27http%3A%2F%2Fis.gd%2Fcreate.php%3Fformat%3Dsimple%26url%3D%27%20%2B%20urllib.quote%28long_url%2C%20%27%27%29%29.read%28%29%5Cn%5Ct%5Ctif%20re.match%28%27http%3A%2F%2Fis.gd.%2A%27%2C%20short_url%29%3A%5Cn%5Ct%5Ct%5Ctworkflow.set_output%28short_url%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27Failed%20to%20shorten%20URL%27%2C%20%27error%27%2C%201.5%29%5Cn%5Ctexcept%20IOError%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Failed%20to%20shorten%20URL%27%2C%20%27error%27%2C%201.5%29%5Cnelse%3A%5Cn%5Ctconsole.hud_alert%28%27Invalid%20URL%27%2C%20%27error%27%2C%201.5%29%5Cn%22%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Schedule%20Notification%22%2C%20%22parameters%22%3A%20%7B%22__custom_action_parameters__%22%3A%20%5B%7B%22optionTitles%22%3A%20%5B%22%28None%29%22%2C%20%22Beep%22%2C%20%22Bleep%22%2C%20%22Coin%22%2C%20%22Error%22%2C%20%22Spaceship%22%5D%2C%20%22type%22%3A%20%22selectOption%22%2C%20%22key%22%3A%20%22862FB2F6-1EE9-4C29-A300-9CEE71BA9EF0%22%2C%20%22title%22%3A%20%22Sound%22%7D%2C%20%7B%22keyboardType%22%3A%202%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22CE644B5C-69B0-49A0-BF4A-75A36498757C%22%2C%20%22title%22%3A%20%22Delay%20%28Minutes%29%22%7D%2C%20%7B%22title%22%3A%20%22Text%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%227D651A4D-2FB1-40FF-8D5A-BD229BD1932D%22%2C%20%22height%22%3A%20100%7D%2C%20%7B%22title%22%3A%20%22Launch%20URL%20%28optional%29%22%2C%20%22keyboardType%22%3A%203%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%22359B956D-9411-4CD8-99EF-C0B7B526C83A%22%2C%20%22height%22%3A%2060%7D%5D%2C%20%22359B956D-9411-4CD8-99EF-C0B7B526C83A%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22862FB2F6-1EE9-4C29-A300-9CEE71BA9EF0%22%3A%202%2C%20%22CE644B5C-69B0-49A0-BF4A-75A36498757C%22%3A%20%223%22%2C%20%22F88F3762-0A14-4093-ACA9-3EFAF15D3E07%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227D651A4D-2FB1-40FF-8D5A-BD229BD1932D%22%3A%20%7B%22text%22%3A%20%22Hello%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E73307C2-86EA-416F-958C-515B8C50D99E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229045C4C2-C0C2-45F8-94CA-FD67A056FA67%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F5F109B7-E71A-41F6-B18C-7E7CE0F4F407%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D867DE9C-6751-493F-AB9E-7E3D66073EC2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2280AB8F76-C78C-43D8-89D3-95DC7089B65C%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20notification%5Cnimport%20console%5Cn%5Cnsounds%20%3D%20%5B%27Beep%27%2C%20%27Bleep%27%2C%20%27Coin_1%27%2C%20%27Error%27%2C%20%27Spaceship%27%5D%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cneffect_index%20%3D%20params%5B%27Sound%27%5D%5Cneffect_name%20%3D%20sounds%5Beffect_index%20-%201%5D%20if%20effect_index%20%3E%200%20else%20None%5Cnmessage%20%3D%20params%5B%27Text%27%5D%5Cnlaunch_url%20%3D%20params%5B%27Launch%20URL%20%28optional%29%27%5D%5Cn%5Cntry%3A%5Cn%5Ctdelay%20%3D%20float%28params%5B%27Delay%20%28Minutes%29%27%5D%29%5Cnexcept%20ValueError%3A%5Cn%5Ctconsole.hud_alert%28%27Invalid%20Delay%27%2C%20%27error%27%29%5Cnnotification.schedule%28message%2C%20delay%20%2A%2060%2C%20effect_name%2C%20launch_url%29%5Cnconsole.hud_alert%28%27Scheduled%27%2C%20%27success%27%2C%201.0%29%5Cn%5Cn%22%2C%20%22D7F3FA22-DCF5-4A30-A139-B68783ECAD05%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Cancel%20All%20Notifications%22%2C%20%22parameters%22%3A%20%7B%22E34ED55B-FBEB-4F8F-9D0C-95FFD1DE039A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223A9BEAB2-2B3E-406C-B42B-265D62E483DA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F4F4B693-ADE6-47A2-B415-E0146DD88F1A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22717F8A2C-28FB-452A-B526-438413AEAE55%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C08D2B9F-763E-4D47-BF3F-E78C29B1DAA4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%5D%2C%20%22EBDA4415-A049-4FE8-9A30-17D5B03C5DA1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22714E0559-7484-49D8-A9DC-6010611669A6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20notification%5Cn%5Cnnotification.cancel_all%28%29%5Cn%5Cnworkflow.set_output%20%3D%20workflow.get_input%28%29%5Cn%22%2C%20%2285306C9A-B368-4B73-8857-FBE3ECB0922F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2241F5C805-5E66-4A77-BC05-BBA84DC22DC2%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Compare%20%28Diff%29%22%2C%20%22parameters%22%3A%20%7B%22DD6CA9FD-BFC3-4E2A-9B4C-B00F5B046BA8%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A25A8AE4-C956-4D2C-BF0D-4C9D247DB7D6%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228DE8D02F-DCD8-47D0-A6CA-3C608AD98083%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22864F256C-515C-4158-BE3A-86ED61472F36%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2260C613B4-0902-4F5F-9659-6CE06E71E752%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2233A0A4E3-1D89-4418-8A36-1015D59A61D7%22%3A%200%2C%20%22DBAD4725-4CE7-4CD3-8F1D-109B7A1C4056%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229FC62B34-5EB2-4ADC-9F2B-7E187B79F39B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22title%22%3A%20%22Text%20A%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%22A25A8AE4-C956-4D2C-BF0D-4C9D247DB7D6%22%2C%20%22height%22%3A%20100%7D%2C%20%7B%22title%22%3A%20%22Text%20B%22%2C%20%22type%22%3A%20%22advancedText%22%2C%20%22key%22%3A%20%22DD6CA9FD-BFC3-4E2A-9B4C-B00F5B046BA8%22%2C%20%22height%22%3A%20100%7D%2C%20%7B%22optionTitles%22%3A%20%5B%22HTML%22%2C%20%22Critic%20Markup%22%5D%2C%20%22type%22%3A%20%22selectOption%22%2C%20%22key%22%3A%20%2233A0A4E3-1D89-4418-8A36-1015D59A61D7%22%2C%20%22title%22%3A%20%22Output%20Format%22%7D%5D%2C%20%22E97BF5C5-8263-49D2-9A89-007C3D4B57A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20difflib%5Cnfrom%20StringIO%20import%20StringIO%5Cn%5Cndef%20diff%28a%2C%20b%2C%20del1%2C%20del2%2C%20ins1%2C%20ins2%29%3A%5Cn%5Ctseq%20%3D%20difflib.SequenceMatcher%28None%2C%20a%2C%20b%29%5Cn%5Ctopcodes%20%3D%20seq.get_opcodes%28%29%5Cn%5Ctout%20%3D%20StringIO%28%29%5Cn%5Ctfor%20op%2C%20a0%2C%20a1%2C%20b0%2C%20b1%20in%20opcodes%3A%5Cn%5Ct%5Ctif%20op%20%3D%3D%20%27equal%27%3A%5Cn%5Ct%5Ct%5Ctout.write%28a%5Ba0%3Aa1%5D%29%5Cn%5Ct%5Ctif%20op%20%3D%3D%20%27insert%27%20or%20op%20%3D%3D%20%27replace%27%3A%5Cn%5Ct%5Ct%5Ctout.write%28ins1%20%2B%20b%5Bb0%3Ab1%5D%20%2B%20ins2%29%5Cn%5Ct%5Ctif%20op%20%3D%3D%20%27delete%27%20or%20op%20%3D%3D%20%27replace%27%3A%5Cn%5Ct%5Ct%5Ctout.write%28del1%20%2B%20a%5Ba0%3Aa1%5D%20%2B%20del2%29%5Cn%5Ctreturn%20out.getvalue%28%29%5Cn%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cna%20%3D%20params%5B%27Text%20A%27%5D%5Cnb%20%3D%20params%5B%27Text%20B%27%5D%5Cnif%20params%5B%27Output%20Format%27%5D%20%3D%3D%200%3A%5Cn%5Ctimport%20cgi%5Cn%5Cta%20%3D%20cgi.escape%28a%29%5Cn%5Ctb%20%3D%20cgi.escape%28b%29%5Cn%5Cthtml%20%3D%20diff%28a%2C%20b%2C%20%27%3Cdel%3E%27%2C%20%27%3C%2Fdel%3E%27%2C%20%27%3Cins%3E%27%2C%20%27%3C%2Fins%3E%27%29%5Cn%5Ctworkflow.set_output%28html%29%5Cnelse%3A%5Cn%5Ctcritic_markup%20%3D%20diff%28a%2C%20b%2C%20%27%7B--%27%2C%20%27--%7D%27%2C%20%27%7B%2B%2B%27%2C%20%27%2B%2B%7D%27%29%5Cn%5Ctworkflow.set_output%28critic_markup%29%5Cn%22%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%5D%2C%20%22name%22%3A%20%22Custom%20Actions%20Pack%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone10%2C6%22%2C%20%22systemVersion%22%3A%20%2213.1.3%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_SPANNER.png%22%7D", "description": "This is a collection of several unrelated custom actions.", "title": "Custom Actions Pack"}, {"url": "http://editorial-app.appspot.com/workflow/5816713257943040/ja9d58z15Ds", "workflow_data": {"username": "", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:syntax-mode"}, "type": "advancedText"}, "expression2": {"text": "markdown", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"button1Value": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "button3Value": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "button2Value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "title": "Share Document Text...", "button3Title": "", "button2Title": "Use Plain Text", "button1Title": "Convert to HTML", "message": {"text": "Do you want to convert this Markdown document to HTML for sharing?", "tokenRanges": {}, "type": "advancedText"}, "showCancelButton": true}, "class": "WorkflowActionShowAlert"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"tables": true, "autolinks": true, "smartypants": true, "strikethrough": true, "footnotes": true, "metadata": false, "superscript": true}, "class": "WorkflowActionConvertMarkdown"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "\n\n\n\n?\n\n", "tokenRanges": {"{67, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionShowShareSheet"}], "name": "Share...", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone11,8", "systemVersion": "13.1.3"}, "type": "wkflw", "public": true, "icon": "minicons-icons-navigation-log-out-2.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Shows%20the%20iOS%20share%20sheet%20with%20the%20selected%20text%20as%20input.%20If%20nothing%20is%20selected%2C%20the%20entire%20document%20is%20shared.%20In%20a%20Markdown%20document%2C%20the%20text%20can%20optionally%20be%20converted%20to%20HTML%20first.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Asyntax-mode%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22markdown%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22button1Value%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button3Value%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button2Value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22title%22%3A%20%22Share%20Document%20Text...%22%2C%20%22button3Title%22%3A%20%22%22%2C%20%22button2Title%22%3A%20%22Use%20Plain%20Text%22%2C%20%22button1Title%22%3A%20%22Convert%20to%20HTML%22%2C%20%22message%22%3A%20%7B%22text%22%3A%20%22Do%20you%20want%20to%20convert%20this%20Markdown%20document%20to%20HTML%20for%20sharing%3F%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22showCancelButton%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionShowAlert%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22tables%22%3A%20true%2C%20%22autolinks%22%3A%20true%2C%20%22smartypants%22%3A%20true%2C%20%22strikethrough%22%3A%20true%2C%20%22footnotes%22%3A%20true%2C%20%22metadata%22%3A%20false%2C%20%22superscript%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionConvertMarkdown%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3C%21DOCTYPE%20html%3E%5Cn%3Chtml%3E%5Cn%3Chead%3E%3Cmeta%20charset%3D%5C%22utf-8%5C%22%2F%3E%3C%2Fhead%3E%5Cn%3Cbody%3E%5Cn%3F%5Cn%3C%2Fbody%3E%5Cn%3C%2Fhtml%3E%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B67%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionShowShareSheet%22%7D%5D%2C%20%22name%22%3A%20%22Share...%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone11%2C8%22%2C%20%22systemVersion%22%3A%20%2213.1.3%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-navigation-log-out-2.png%22%7D", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "title": "Share..."}, {"url": "http://editorial-app.appspot.com/workflow/5785200948674560/MkRjKC7U-bY", "workflow_data": {"username": "luis", "description": "", "actions": [{"customTitle": "", "parameters": {"content": {"text": "este es una prueba ", "tokenRanges": {}, "type": "advancedText"}, "open": true, "filename": {"text": "archivo ", "tokenRanges": {}, "type": "advancedText"}}, "pauseWithoutShowingParameters": false, "colorLabel": 1, "class": "WorkflowActionCreateNewDocument", "pauseBeforeRunning": false}], "name": "My Workflow 2", "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad8,1", "systemVersion": "13.1.3"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_SPANNER.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22luis%22%2C%20%22description%22%3A%20%22%22%2C%20%22actions%22%3A%20%5B%7B%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22content%22%3A%20%7B%22text%22%3A%20%22este%20es%20una%20prueba%20%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22open%22%3A%20true%2C%20%22filename%22%3A%20%7B%22text%22%3A%20%22archivo%20%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22colorLabel%22%3A%201%2C%20%22class%22%3A%20%22WorkflowActionCreateNewDocument%22%2C%20%22pauseBeforeRunning%22%3A%20false%7D%5D%2C%20%22name%22%3A%20%22My%20Workflow%202%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad8%2C1%22%2C%20%22systemVersion%22%3A%20%2213.1.3%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_SPANNER.png%22%7D", "description": "", "title": "My Workflow 2"}, {"url": "http://editorial-app.appspot.com/workflow/5849803632148480/WZK4wcp5OFs", "workflow_data": {"username": "", "description": "Workflow for transferring files from Working Copy to Editorial and back again.\n\nWhen called with input, it will pick the filename from the first line and write the other lines into this file, which lets Working Copy create a new file with predefined content. The filename contains a unique identifier for remembering where it belongs. To avoid overwriting files in Editorial by mistake, the previous contents of files are put in WorkingCopy.bak\n\nWhen this workflow is called without any input the contents of the current file is written back to Working Copy.\n\nChange askcommit variable to 0 if you just want to save and not be asked to commit.\n\nTo install a new version of this workflow delete or rename this one and perform Edit in Editorial from Working Copy.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "all", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "all"}, "type": "advancedText"}, "expression2": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "key", "value": {"text": "4ADYHVSW", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "askcommit", "value": {"text": "1", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "path", "value": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:filename"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:file-extension"}, "type": "advancedText"}, "expression2": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 1}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "path", "value": {"text": "?.?", "tokenRanges": {"{0, 1}": "%editor:filename", "{2, 1}": "%editor:file-extension"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "foldedTextOption": 0}, "class": "WorkflowActionGetEditorText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"revealBrowserAutomatically": true, "URL:__URL_ESCAPE__": 1, "URL": {"text": "working-copy://x-callback-url/write/?key=?&askcommit=?&path=?&text=?", "tokenRanges": {"{53, 1}": "askcommit", "{67, 1}": "Input", "{60, 1}": "path", "{41, 1}": "key"}, "type": "advancedText"}, "openIn": 1, "tabOption": 0, "waitUntilLoaded": false}, "class": "WorkflowActionOpenURL"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"showHUD": false, "HUDTitle": ""}, "class": "WorkflowActionStopWorkflow"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"regex": {"text": "(.*)\\n", "tokenRanges": {}, "type": "advancedText"}, "matchGroup": "1", "searchTypeOption": 0}, "class": "WorkflowActionMatchRegularExpression"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "filename", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "all"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"findOption": 1, "find": {"text": "?\n", "tokenRanges": {"{0, 1}": "filename"}, "type": "advancedText"}, "replace": {"text": "", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFindReplace"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "text", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": false, "ifNotExists": 0, "filename": "%var:filename"}, "class": "WorkflowActionGetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 1}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": false, "text": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "ifNotExists": 0, "filename": "WorkingCopy.bak"}, "class": "WorkflowActionSetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"duration": 2, "HUDText": {"text": "Previous content of ? put in WorkingCopy.bak", "tokenRanges": {"{20, 1}": "filename"}, "type": "advancedText"}, "icon": 0}, "class": "WorkflowActionShowHUD"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": false, "text": {"text": "?", "tokenRanges": {"{0, 1}": "text"}, "type": "advancedText"}, "ifNotExists": 0, "filename": "%var:filename"}, "class": "WorkflowActionSetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": false, "filename": "%var:filename"}, "class": "WorkflowActionOpenDocument"}], "name": "Working Copy", "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad7,1", "systemVersion": "13.1.2"}, "type": "wkflw", "public": true, "icon": "minicons-social-github_alt.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Workflow%20for%20transferring%20files%20from%20Working%20Copy%20to%20Editorial%20and%20back%20again.%5Cn%5CnWhen%20called%20with%20input%2C%20it%20will%20pick%20the%20filename%20from%20the%20first%20line%20and%20write%20the%20other%20lines%20into%20this%20file%2C%20which%20lets%20Working%20Copy%20create%20a%20new%20file%20with%20predefined%20content.%20The%20filename%20contains%20a%20unique%20identifier%20for%20remembering%20where%20it%20belongs.%20To%20avoid%20overwriting%20files%20in%20Editorial%20by%20mistake%2C%20the%20previous%20contents%20of%20files%20are%20put%20in%20WorkingCopy.bak%5Cn%5CnWhen%20this%20workflow%20is%20called%20without%20any%20input%20the%20contents%20of%20the%20current%20file%20is%20written%20back%20to%20Working%20Copy.%5Cn%5CnChange%20askcommit%20variable%20to%200%20if%20you%20just%20want%20to%20save%20and%20not%20be%20asked%20to%20commit.%5Cn%5CnTo%20install%20a%20new%20version%20of%20this%20workflow%20delete%20or%20rename%20this%20one%20and%20perform%20Edit%20in%20Editorial%20from%20Working%20Copy.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22all%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22all%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22key%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%224ADYHVSW%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22askcommit%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22path%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Afilename%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Afile-extension%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22path%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F.%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Afilename%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22%25editor%3Afile-extension%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22foldedTextOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionGetEditorText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22revealBrowserAutomatically%22%3A%20true%2C%20%22URL%3A__URL_ESCAPE__%22%3A%201%2C%20%22URL%22%3A%20%7B%22text%22%3A%20%22working-copy%3A%2F%2Fx-callback-url%2Fwrite%2F%3Fkey%3D%3F%26askcommit%3D%3F%26path%3D%3F%26text%3D%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B53%2C%201%7D%22%3A%20%22askcommit%22%2C%20%22%7B67%2C%201%7D%22%3A%20%22Input%22%2C%20%22%7B60%2C%201%7D%22%3A%20%22path%22%2C%20%22%7B41%2C%201%7D%22%3A%20%22key%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22openIn%22%3A%201%2C%20%22tabOption%22%3A%200%2C%20%22waitUntilLoaded%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionOpenURL%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22showHUD%22%3A%20false%2C%20%22HUDTitle%22%3A%20%22%22%7D%2C%20%22class%22%3A%20%22WorkflowActionStopWorkflow%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22regex%22%3A%20%7B%22text%22%3A%20%22%28.%2A%29%5C%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22matchGroup%22%3A%20%221%22%2C%20%22searchTypeOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionMatchRegularExpression%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22filename%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22all%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22findOption%22%3A%201%2C%20%22find%22%3A%20%7B%22text%22%3A%20%22%3F%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22filename%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22replace%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFindReplace%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22text%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20false%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22%25var%3Afilename%22%7D%2C%20%22class%22%3A%20%22WorkflowActionGetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20false%2C%20%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22WorkingCopy.bak%22%7D%2C%20%22class%22%3A%20%22WorkflowActionSetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22duration%22%3A%202%2C%20%22HUDText%22%3A%20%7B%22text%22%3A%20%22Previous%20content%20of%20%3F%20put%20in%20WorkingCopy.bak%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B20%2C%201%7D%22%3A%20%22filename%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22icon%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionShowHUD%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20false%2C%20%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22text%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22%25var%3Afilename%22%7D%2C%20%22class%22%3A%20%22WorkflowActionSetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20false%2C%20%22filename%22%3A%20%22%25var%3Afilename%22%7D%2C%20%22class%22%3A%20%22WorkflowActionOpenDocument%22%7D%5D%2C%20%22name%22%3A%20%22Working%20Copy%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad7%2C1%22%2C%20%22systemVersion%22%3A%20%2213.1.2%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-social-github_alt.png%22%7D", "description": "Workflow for transferring files from Working Copy to Editorial and back again.\n\nWhen called with input, it will pick the filename from the first line and write the other lines into this file, which lets Working Copy create a new file with predefined content. The filename contains a unique identifier for remembering where it belongs. To avoid overwriting files in Editorial by mistake, the previous contents of files are put in WorkingCopy.bak\n\nWhen this workflow is called without any input the contents of the current file is written back to Working Copy.\n\nChange askcommit variable to 0 if you just want to save and not be asked to commit.\n\nTo install a new version of this workflow delete or rename this one and perform Edit in Editorial from Working Copy.", "title": "Working Copy"}, {"url": "http://editorial-app.appspot.com/workflow/5784176531865600/nBYhCAVpGds", "workflow_data": {"username": "AK", "description": "This is a TaskPaper workflow to automatically complete a task, entering today\u2019s date as the date of completion, and duplicate the completed task as an incomplete task at the end of the list.\n\nIt is intended for those following some of Mark Forster\u2019s time management systems.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"numberOfSteps": {"text": "1", "tokenRanges": {}, "type": "advancedText"}, "direction": 0, "unit": 1}, "class": "WorkflowActionMoveCaret"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"numberOfSteps": {"text": "1", "tokenRanges": {}, "type": "advancedText"}, "direction": 1, "unit": 1}, "class": "WorkflowActionExtendSelection"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionSetClipboard"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"numberOfSteps": {"text": "1", "tokenRanges": {}, "type": "advancedText"}, "direction": 1, "unit": 1}, "class": "WorkflowActionMoveCaret"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"replacement": {"text": " @done(?-?-?)", "tokenRanges": {"{11, 1}": "%date:dd", "{9, 1}": "%date:MM", "{7, 1}": "%date:yyyy"}, "type": "advancedText"}}, "class": "WorkflowActionReplaceSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"numberOfSteps": {"text": "1", "tokenRanges": {}, "type": "advancedText"}, "direction": 1, "unit": 0}, "class": "WorkflowActionMoveCaret"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"replacement": {"text": "\n?", "tokenRanges": {"{1, 1}": "Clipboard"}, "type": "advancedText"}}, "class": "WorkflowActionReplaceSelectedText"}], "name": "Complete and Duplicate at End", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone8,1", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_SPANNER.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22AK%22%2C%20%22description%22%3A%20%22This%20is%20a%20TaskPaper%20workflow%20to%20automatically%20complete%20a%20task%2C%20entering%20today%5Cu2019s%20date%20as%20the%20date%20of%20completion%2C%20and%20duplicate%20the%20completed%20task%20as%20an%20incomplete%20task%20at%20the%20end%20of%20the%20list.%5Cn%5CnIt%20is%20intended%20for%20those%20following%20some%20of%20Mark%20Forster%5Cu2019s%20time%20management%20systems.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22numberOfSteps%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22direction%22%3A%200%2C%20%22unit%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionMoveCaret%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22numberOfSteps%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22direction%22%3A%201%2C%20%22unit%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionExtendSelection%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionSetClipboard%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22numberOfSteps%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22direction%22%3A%201%2C%20%22unit%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionMoveCaret%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22replacement%22%3A%20%7B%22text%22%3A%20%22%20%40done%28%3F-%3F-%3F%29%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B11%2C%201%7D%22%3A%20%22%25date%3Add%22%2C%20%22%7B9%2C%201%7D%22%3A%20%22%25date%3AMM%22%2C%20%22%7B7%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionReplaceSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22numberOfSteps%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22direction%22%3A%201%2C%20%22unit%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionMoveCaret%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22replacement%22%3A%20%7B%22text%22%3A%20%22%5Cn%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B1%2C%201%7D%22%3A%20%22Clipboard%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionReplaceSelectedText%22%7D%5D%2C%20%22name%22%3A%20%22Complete%20and%20Duplicate%20at%20End%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone8%2C1%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_SPANNER.png%22%7D", "description": "This is a TaskPaper workflow to automatically complete a task, entering today\u2019s date as the date of completion, and duplicate the completed task as an incomplete task at the end of the list.\n\nIt is intended for those following some of Mark Forster\u2019s time management systems.", "title": "Complete and Duplicate at End"}, {"url": "http://editorial-app.appspot.com/workflow/5829805807239168/DuuynmYhExg", "workflow_data": {"username": "angel", "description": "This is a custom UI for Editorial which will present a fully featured FTP client in a popup window over the editor.\n\nAfter downloading you will need to tap the Info button next to the workflow, go to the Edit Workflow page, tap on the action block to expand it, and fill in your FTP login credentials in the variables below. Once you've done that just run it from the workflow menu and you should be set.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "FTP UI", "parameters": {"76A5A84D-0561-4834-856C-545D188ABC42": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17F9FFEF-24E7-4B85-80AF-E6FFD48F26E9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "12CB7DEE-EEC1-4FCB-97BF-BBB95A56A03B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17DDDC80-EB5C-4A4A-BE33-F29B1EA496A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3DD56DC4-7B69-49DC-8A3B-2DB7A851AC30": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D74B99FF-2F76-4624-9C02-A0E1785348A5": "", "F953659E-E15A-4FE6-82B4-1BB1CE613B3E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DBA7A162-8790-4615-A5C1-EFF8EB870E0B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "350C4857-3A55-4278-A792-F144FA8B92F1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D95E75B5-2181-465B-A147-20D14D1B88A7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7B2C7297-7737-47B0-8548-2F6579D63B3A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AF803B87-F589-4DDF-8D61-888339533174": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "74EE867C-63BF-42F5-8F85-2AD1663D9528": "172.16.1.48", "E03DEE1B-0607-4EBE-9F82-434D690A3588": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8FA2F3A3-A33F-4E29-B492-31CA733496EC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9B35529B-8F25-4F88-A9B4-781FB250B846": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"placeholder": "/", "type": "basicText", "key": "D74B99FF-2F76-4624-9C02-A0E1785348A5", "title": "Initial_Path"}, {"placeholder": "ftp.example.com", "keyboardType": 3, "type": "basicText", "key": "74EE867C-63BF-42F5-8F85-2AD1663D9528", "title": "FTP_Server"}, {"placeholder": "guyot@unapologetic.io", "keyboardType": 7, "type": "basicText", "key": "B42E2195-685F-4022-B61E-14A19BDACD7D", "title": "FTP_Username"}, {"placeholder": "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", "type": "basicText", "key": "FCF40D27-4DB7-4121-97F6-F968A900E92E", "title": "FTP_Password"}], "B8C377DB-C007-491E-9B69-9967410CC875": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "FCF40D27-4DB7-4121-97F6-F968A900E92E": "B2esaL1a", "6E695F21-0664-4FC9-920E-12821330B610": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17E340BF-6CF0-45D7-AA81-F135B91DE224": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0FBCC4E3-9F73-4A4A-8857-766400E58E37": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9C3FFE2C-6C49-46C9-BD53-E5AAAE2BD8CA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6A2FC1A6-979E-4125-87D1-52EB38FC4527": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "ABBDEFCC-F896-4F7A-B35F-5023B651DD88": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "98F26812-BFCB-4DC1-8FC4-E7282BCAF39A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C8D3ACB2-86C1-479E-979E-666D5FE5BB97": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9E029915-8290-426B-9B8E-326654FA13DC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0B2A14F2-513A-4FEC-B3FB-204BDFA18B47": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AD8FDF1C-B8D2-48EB-A547-37B910262AAB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F2C3515D-1C29-423D-99C0-95B6FB4887DC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "95FA6C87-6EB6-4562-B4B0-38C99BF57114": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3A9BD136-9079-44AD-89C5-53D329731D83": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1C7EAC87-52E9-42C6-A8C7-18AB70F3FD23": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "B42E2195-685F-4022-B61E-14A19BDACD7D": "angel_augusto", "6C12A397-2296-483B-BE29-87C6F9D8013B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "867B865E-787D-45E1-B3BF-64412F9D6FA4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6CC50A85-8999-47B5-B830-88C48A0443AB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BE54AC05-8D78-4F95-822A-AC4907F58791": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2D8A39CF-8976-4772-A439-9A46FA9C79D3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2B5E2C3D-F83E-4B48-B316-FFC6DC26E26A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DBD9CAA1-1A12-4ABE-A9C7-EBBF0D77357E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "CF4A2FE6-4960-4F51-BAE9-3218272C1C6E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "25171F4E-EB9B-47E7-9902-E3ED071C0362": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8913248B-FE4C-4839-BD1E-22533BA6586B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9D387E48-805E-46E4-83A9-30876058FD42": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "90D8071E-9FC5-4FFA-94E6-0BC3006E4236": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "77021432-36A0-48A7-8A82-9C4609E71B23": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "68AE2162-AF92-4CE6-B5E5-A99BA2D7CFB9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "FC89D8BA-5448-455D-BBAC-21F1F0775A66": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E34AD0C6-2E7C-46DF-8E5C-A61D619E4063": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C4ACD630-2532-48C6-88DE-EA95FB7FA074": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C57929EE-43A1-4384-BF54-95AF57E3552A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "010A0730-7B55-419F-AD63-86DAE22BCFF3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "93D9F4AF-C4DB-4E00-A32E-52AE27A1E174": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BE013931-6B92-45BB-A3F9-5747D2BD1587": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BEA876CA-3C94-415F-B229-B5DAC3A68DD7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1E06CA8B-C928-4F60-8418-D04B6D3E0AA3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0FE68B9D-5A5D-4746-94A6-E183EEC712E1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E6FC01C2-5EB7-4867-B73C-FA4A657FE032": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#coding: utf-8\nimport workflow\nimport ui\nimport console\nimport editor\nimport time\nimport clipboard\nimport photos\nfrom PIL import Image\nfrom io import BytesIO\nimport webbrowser\nfrom ftplib import FTP\n\n# Get the custom parameters as a dictionary (titles are keys):\nparams = workflow.get_parameters()\n# Get the action's input (a string):\naction_in = workflow.get_input()\n\n##############################\n##### FTP Protocol Class #####\n##############################\n\nclass FTP_Instance:\n\tdef __init__(self):\n\t\tself.initial_path = params['Initial_Path']\n\t\tself.ftp = FTP(params['FTP_Server'])\n\t\tself.ftp.login(params['FTP_Username'], params['FTP_Password'])\n\t\tself.ftp.cwd(self.initial_path)\n\n\tdef open_file(self, filename, path):\n\t\tself.ftp.cwd(path)\n\t\ttemp = open('temp', \"wb\")\n\t\tself.ftp.retrbinary('RETR ' + filename, temp.write)\n\t\ttemp.close()\n\t\tread = open('temp', 'r')\n\t\tfile_contents = read.read()\n\t\tread.close()\n\t\treturn file_contents\n\n\tdef check_file_exists(self, filename, path):\n\t\texisting_files = self.ftp.nlst(path)\n\t\treturn filename in existing_files\n\t\t\n\tdef mkd(self, path):\n\t\tchecked_path = ''\n\t\tdirectories = path[1:].split('/')\n\t\tself.ftp.cwd(self.initial_path)\n\t\tfor i in range(len(directories)):\n\t\t\tcurrent_dir = self.ftp.nlst(self.initial_path + checked_path)\n\t\t\tif directories[i] in current_dir:\n\t\t\t\tchecked_path += '/' + directories[i]\n\t\t\t\tself.ftp.cwd(self.initial_path + checked_path)\n\t\t\telse:\n\t\t\t\tchecked_path += '/' + directories[i]\n\t\t\t\tself.ftp.mkd(self.initial_path + checked_path)\n\t\t\t\tself.ftp.cwd(self.initial_path + checked_path)\n\t\t\n\tdef overwrite_file(self, filename, text, path):\n\t\tself.ftp.cwd(path)\n\t\tfile = open('temp', 'w')\n\t\tfile.write(text)\n\t\tfile.close()\n\t\tfile = open('temp', 'r')\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + filename, file)\n\t\tif text != self.open_file(filename,path):\n\t\t\tconsole.hud_alert('File Overwrite Failed', 'error', 5.0)\n\t\telse:\n\t\t\tconsole.hud_alert('File Overwritten', 'success', 5.0)\n\t\tfile.close()\n\t\n\tdef upload_image(self, imagename, path):\n\t\timage = photos.pick_image()\n\t\tbuffer = BytesIO()\n\t\timage.save(buffer, 'PNG')\n\t\tbuffer.seek(0)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + imagename, buffer)\n\t\n\tdef create_and_upload_file(self, filename, text, path):\n\t\tfile = open('temp', 'w')\n\t\tfile.write(text)\n\t\tfile.close()\n\t\tfile = open('temp', 'r')\n\t\tself.upload_file(file, filename, path)\n\t\tfile.close()\n\n\tdef upload_file(self, file, filename, path):\n\t\tif path != '':\n\t\t\tself.mkd(path)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + filename, file)\n\n\tdef print_directory(self, path):\n\t\tprint self.ftp.nlst(path)\n\t\t\n\tdef duplicate_file(self, filename, path):\n\t\ti = 1\n\t\tfind_extension = filename.split('.')\n\t\tnew_filename = ''\n\t\tfor n in range(len(find_extension)-1):\n\t\t\tnew_filename += find_extension[n] + '.'\n\t\tnew_filename = new_filename[:-1]\n\t\tcheck_filename = new_filename + '-' + str(i) + '.' + find_extension[n+1]\n\t\tfile_contents = self.open_file(filename, path)\n\t\twhile self.check_file_exists(check_filename, path):\n\t\t\ti += 1\n\t\t\tcheck_filename = new_filename + '-' + str(i) + '.' + find_extension[n+1]\n\t\tself.create_and_upload_file(check_filename, file_contents, path)\n\t\t\n\tdef duplicate_folder(self, foldername, path):\n\t\ti = 1\n\t\tnew_foldername = foldername + '-' + str(i)\n\t\twhile self.check_file_exists(new_foldername, path):\n\t\t\ti += 1\n\t\t\tnew_foldername = foldername + '-' + str(i)\n\t\tself.ftp.mkd(path + '/' + new_foldername)\n\t\t# Get directory to duplicate as dictionary with keys marking items as files or folders\n\t\tdir_items = ftp.directory_with_types(path + '/' + foldername)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], path + '/' + foldername)\n\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, path + '/' + new_foldername)\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\tself.ftp.mkd(path + '/' + new_foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_in_folder = self.ftp.nlst(path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], path + '/' + foldername, path + '/' + new_foldername)\n\t# Helper action\n\tdef duplicate_folder_helper(self, foldername, from_path, to_path):\n\t\t# Get directory to duplicate as dictionary with keys marking items as files or folders\n\t\tdir_items = ftp.directory_with_types(from_path + '/' + foldername)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], from_path + '/' + foldername)\n\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, to_path + '/' + foldername)\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\tself.ftp.mkd(to_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_in_folder = self.ftp.nlst(from_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], from_path + '/' + foldername, to_path + '/' + foldername)\n\n\tdef move_file(self, filename, from_path, to_path):\n\t\tif not self.check_file_exists(filename, to_path):\n\t\t\tfile_contents = self.open_file(filename, from_path)\n\t\t\tself.create_and_upload_file(filename, file_contents, to_path)\n\t\t\tif self.check_file_exists(filename, to_path):\n\t\t\t\tif self.open_file(filename, to_path) == file_contents:\n\t\t\t\t\tself.ftp.cwd(from_path)\n\t\t\t\t\tself.ftp.delete(filename)\n\t\telse:\n\t\t\tconsole.hud_alert('File with same name already exists in this location', 'error', 5.0)\n\t\t\t\n\tdef move_folder(self, foldername, from_path, to_path):\n\t\tall_files_moved = True\n\t\tif not self.check_file_exists(foldername, to_path):\n\t\t\tself.ftp.mkd(to_path + '/' + foldername)\n\t\t\t# Get directory of folder contents to be moved\n\t\t\tdir_items = ftp.directory_with_types(from_path + '/' + foldername)\n\t\t\tfor item in dir_items:\n\t\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], from_path + '/' + foldername)\n\t\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, to_path + '/' + foldername)\n\t\t\t\t\tif not self.check_file_exists(dir_items[item]['title'], to_path + '/' + foldername):\n\t\t\t\t\t\tall_files_moved = False\n\t\t\t\t\t\tprint 'false'\n\t\t\t\telse:\n\t\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\t\tself.ftp.mkd(to_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\t\titems_in_folder = self.ftp.nlst(from_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], from_path + '/' + foldername, to_path + '/' + foldername)\n\t\telse:\n\t\t\tconsole.hud_alert('Folder of same name already exists in this location', 'error', 5.0)\n\t\t\treturn\n\t\tif all_files_moved:\n\t\t\tself.delete_folder(foldername, from_path)\n\t\telse:\n\t\t\tconsole.hud_alert('All files may not have been moved', 'error')\n\t\t\t\t\t\t\t\n\tdef delete_folder(self, foldername, path):\n\t\tftp.delete_folder_helper(path + '/' + foldername)\n\t\tftp.ftp.cwd(path)\n\t\tftp.ftp.rmd(foldername)\n\t# Helper action\n\tdef delete_folder_helper(self, path):\n\t\tself.ftp.cwd(path)\n\t\tdir_items = ftp.directory_with_types(path)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tself.ftp.delete(dir_items[item]['title'])\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\titems_in_folder = self.ftp.nlst(path + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_inside = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_inside = True\n\t\t\t\t\tif items_inside == True:\n\t\t\t\t\t\tsave_path = path\n\t\t\t\t\t\tself.delete_folder_helper(path + '/' + dir_items[item]['title'])\n\t\t\t\t\t\tself.ftp.cwd(save_path)\n\t\t\t\t\t\tself.ftp.rmd(dir_items[item]['title'])\n\t\t\t\t\telse:\n\t\t\t\t\t\tself.ftp.rmd(dir_items[item]['title'])\n\t\t\n\tdef directory_with_types(self, path):\n\t\ti = 0\n\t\tdirectory_list = []\n\t\tdirectory_dict = {}\n\t\ttitle_list = self.ftp.nlst(path)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.retrlines('LIST', callback=directory_list.append)\n\t\tfor item in directory_list:\n\t\t\tif i < len(title_list):\n\t\t\t\tlisting = {}\n\t\t\t\tif item.upper().startswith('D'):\n\t\t\t\t\tlisting['type'] = 'folder'\n\t\t\t\telse:\n\t\t\t\t\tlisting['type'] = 'file'\n\t\t\t\tdirectory_dict[i] = listing\n\t\t\t\tdirectory_dict[i]['title'] = title_list[i]\n\t\t\t\ti += 1\n\t\treturn directory_dict\n\n\tdef quit(self):\n\t\tself.ftp.quit()\n\n##########################\n##### FTP UI Client ######\n##########################\n\n# Initiate FTP Connection\nftp = FTP_Instance()\n\n# Build directory to be displayed in rows of file manager\ndef build_directory(path=params['Initial_Path']):\n\t# Get directory as dictionary with keys marking items as files or folders\n\tlist_items = ftp.directory_with_types(path)\n\tsource_list = []\n\t# Pull data from list_items and prepare a list of dictionaries readable by ListDataSource element\n\tfor item in list_items:\n\t\td = {}\n\t\td['title'] = list_items[item]['title']\n\t\t# For files, do not include accessory action icons in their rows, but mark them with file icons\n\t\tif list_items[item]['type'] == 'file':\n\t\t\td['accessory_type'] = 'none'\n\t\t\td['image'] = 'ionicons-document-24'\n\t\t# For folders, add chevron arrow accessory action icons to rows and mark with folder icons\n\t\telse:\n\t\t\td['accessory_type'] = 'detail_disclosure_button'\n\t\t\td['image'] = 'ionicons-folder-24'\n\t\t# Add each prepared dictionary to overall list of dictionaries\n\t\tif d['title'][:1] != '.':\n\t\t\tsource_list.append(d)\n\t# Return list of dictionaries with all files and folders properly flagged\t\n\treturn source_list\n\n###############\n# Back Button #\n###############\n# Action to be run when user taps the back button in the top left of the UI\ndef back_button_tapped(sender):\n\tif not sender.superview.secondary_actions.hidden:\n\t\tsender.superview.secondary_actions.hidden = True\n\t\tsender.superview.secondary_button1.enabled = True\n\t\tsender.superview.file_label.editable = False\n\t\tbutton_actions_closed = False\n\telif not sender.superview.button_actions.hidden:\n\t\tsender.superview.plus_button.enabled = True\n\t\tsender.superview.button_actions.hidden = True\n\t\tsender.superview.file_label.editable = False\n\t\tbutton_actions_closed = False\n\t\tif sender.superview.path_field.text == '/':\n\t\t\tsender.superview.back_button.enabled = False\n\telse:\n\t\tbutton_actions_closed = True\n\t\n\tif button_actions_closed == True:\n\t\t# Get current path\n\t\tpath = sender.superview.path_field.text\n\t\t# Split the path at slashes\n\t\tpath = path.split('/')\n\t\tnew_path = ''\n\t\t# Put the path back together with slashes, but leave the final path item removed (path is back one level)\n\t\tfor i in range(len(path) - 1):\n\t\t\tnew_path += path[i] + '/'\n\t\t# Remove trailing backslash, unless you are in the top level directory '/'\n\t\tif len(new_path) > 1:\n\t\t\tnew_path = new_path[:-1]\n\t\t# Build the directory for the new path and send it to the ListDataSource element\n\t\tsender.superview.list_source.items = build_directory(new_path)\n\t\t# Adjust the title TextField to display the new path\n\t\tsender.superview.path_field.text = ftp.ftp.pwd()\n\t\t# If the new path leaves you at the top level directory, disable the back button\n\t\tif new_path == '/':\n\t\t\tsender.enabled = False\n\n###############\n# Plus Button #\n###############\ndef plus_button_tapped(sender):\n\tsender.superview.back_button.enabled = True\n\tsender.superview.button1.title = 'Upload File in Editor'\n\tsender.superview.button1.action = upload_file_in_editor\n\tsender.superview.button2.title = 'New folder'\n\tsender.superview.button2.action = new_folder\n\tsender.superview.button3.title = 'Upload Image'\n\tsender.superview.button3.action = upload_image_button_tapped\n\tsender.superview.button4.title = 'Run Custom Code'\n\tsender.superview.button5.title = 'Upload Dropbox File'\n\tsender.superview.button6.title = 'Upload Local File'\n\tsender.superview.button3.hidden = False\n\tsender.superview.button4.hidden = True\n\tsender.superview.button5.hidden = True\n\tsender.superview.button6.hidden = True\n\tsender.superview.button7.hidden = True\n\tsender.superview.button8.hidden = True\n\tsender.superview.file_icon.image = ui.Image.named('ionicons-plus-24')\n\tsender.superview.file_label.text = sender.superview.path_field.text\n\tsender.superview.button_actions.hidden = False\n\tsender.superview.plus_button.enabled = False\n\tsender.superview.close_button.center = (sender.superview.width/2,155)\n\tif sender.superview.height < 500:\n\t\tsender.superview.scroll_buttons.content_size = (sender.superview.width, 207)\n\tsender.superview.scroll_buttons.content_offset = (0,0)\n\t\n###############\n# Home Button #\n###############\ndef home_button_tapped(sender):\n\tif not sender.superview.secondary_actions.hidden:\n\t\tsender.superview.secondary_actions.hidden = True\n\t\tsender.superview.secondary_button1.enabled = True\n\t\tsender.superview.file_label.editable = False\n\tif not sender.superview.button_actions.hidden:\n\t\tsender.superview.plus_button.enabled = True\n\t\tsender.superview.button_actions.hidden = True\n\t\tsender.superview.file_label.editable = False\n\tsender.superview.back_button.enabled = True\n\tsender.superview.list_source.items = build_directory()\n\t# Adjust the title TextField to display the new path\n\tsender.superview.path_field.text = ftp.ftp.pwd()\n\n##########################\n##### Button Actions #####\n##########################\ndef close_button_tapped(sender):\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.hidden = True\n\ndef cancel_button_tapped(sender):\n\tsender.superview.hidden = True\n\tsender.superview.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.superview.file_label.editable = False\n\t\ndef copy_path_button_tapped(sender):\n\tclipboard.set(sender.superview.superview.superview.path_field.text + '/' + sender.superview.superview.superview.file_label.text)\n\tconsole.hud_alert('Copied', 'success')\n\n#######################\n# Plus Button Actions #\n#######################\ndef upload_file_in_editor(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'upload')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Upload File'\n\tsender.superview.superview.superview.secondary_button1.action = upload_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef upload_file(sender):\n\tfilename = sender.superview.superview.superview.file_label.text\n\ttext = editor.get_text()\n\tpath = sender.superview.superview.superview.path_field.text\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.create_and_upload_file(filename, text, path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\ndef new_folder(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'new_folder')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Create Folder'\n\tsender.superview.superview.superview.secondary_button1.action = create_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef create_folder(sender):\n\tfoldername = sender.superview.superview.superview.file_label.text\n\tpath = sender.superview.superview.superview.path_field.text + '/' + foldername\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.mkd(path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('Folder \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\t\ndef upload_image_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'new_image')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Show Image Picker'\n\tsender.superview.superview.superview.secondary_button1.action = upload_image\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\n@ui.in_background\ndef upload_image(sender):\n\timagename = sender.superview.superview.superview.file_label.text\n\tpath = sender.superview.superview.superview.path_field.text\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.upload_image(imagename, path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\n################\n# File Actions #\n################\ndef open_button_tapped(sender):\n\tfile_contents = ftp.open_file(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\teditor.set_file_contents(sender.superview.superview.superview.file_label.text, file_contents, 'local')\n\twebbrowser.open('editorial://open/' + sender.superview.superview.superview.file_label.text + '?root=local')\n\tsender.superview.superview.superview.close()\n\ndef overwrite_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Overwrite With File in Editor'\n\tsender.superview.superview.superview.secondary_button1.action = overwrite_with_file_in_editor\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef overwrite_with_file_in_editor(sender):\n\tfilename = sender.superview.superview.superview.file_label.text\n\ttext = editor.get_text()\n\tpath = sender.superview.superview.superview.path_field.text\n\tftp.overwrite_file(filename, text, path)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\ndef rename_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'file')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Rename File'\n\tsender.superview.superview.superview.secondary_button1.action = rename_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary Action\ndef rename_file(sender):\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.rename(sender.superview.superview.superview.file_label.name, sender.superview.superview.superview.file_label.text)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\ndef delete_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Permanently Delete File?'\n\tsender.superview.superview.superview.secondary_button1.action = permanently_delete_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef permanently_delete_file(sender):\n\tftp.ftp.delete(sender.superview.superview.superview.file_label.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\ndef move_file_button_tapped(sender):\n\tsender.superview.superview.superview.back_button.enabled = False\n\tsender.superview.superview.superview.home_button.enabled = False\n\tsender.superview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.superview.move_list_source.items = build_move_directory(sender.superview.superview.superview.move_path_field.text)\n\tsender.superview.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.superview.move_path_field.text + '\\''\n\tsender.superview.superview.superview.move_table_view.hidden = False\n\tsender.superview.superview.superview.move_back_button.hidden = False\n\tsender.superview.superview.superview.move_cancel_button.hidden = False\n\tsender.superview.superview.superview.select_folder.hidden = False\n\tsender.superview.superview.superview.select_folder.action = file_select_folder_button_tapped\n\tsender.superview.superview.superview.move_label_background.hidden = False\n\tsender.superview.superview.superview.table_view.hidden = True\n# Secondary action\ndef file_select_folder_button_tapped(sender):\n\tftp.move_file(sender.superview.superview.file_label.text, sender.superview.superview.path_field.text, sender.superview.superview.move_path_field.text)\n\tsender.superview.superview.list_source.items = build_directory(sender.superview.superview.path_field.text)\n\tsender.hidden = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.superview.superview.move_cancel_button.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\t\ndef duplicate_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Duplicate File?'\n\tsender.superview.superview.superview.secondary_button1.action = duplicate_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef duplicate_file(sender):\n\tftp.duplicate_file(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\n##################\n# Folder Actions #\n##################\ndef rename_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'folder')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Rename Folder'\n\tsender.superview.superview.superview.secondary_button1.action = rename_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef rename_folder(sender):\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.rename(sender.superview.superview.superview.file_label.name, sender.superview.superview.superview.file_label.text)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\telse:\n\t\tconsole.hud_alert('Folder \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\ndef delete_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Delete Folder & Contents?'\n\tsender.superview.superview.superview.secondary_button1.action = permanently_delete_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef permanently_delete_folder(sender):\n\tftp.delete_folder(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\ndef move_folder_button_tapped(sender):\n\tsender.superview.superview.superview.back_button.enabled = False\n\tsender.superview.superview.superview.home_button.enabled = False\n\tsender.superview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.superview.move_list_source.items = build_move_directory(sender.superview.superview.superview.move_path_field.text)\n\tsender.superview.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.superview.move_path_field.text + '\\''\n\tsender.superview.superview.superview.move_table_view.hidden = False\n\tsender.superview.superview.superview.move_back_button.hidden = False\n\tsender.superview.superview.superview.move_cancel_button.hidden = False\n\tsender.superview.superview.superview.select_folder.hidden = False\n\tsender.superview.superview.superview.select_folder.action = folder_select_folder_button_tapped\n\tsender.superview.superview.superview.move_label_background.hidden = False\n\tsender.superview.superview.superview.table_view.hidden = True\n# Secondary action\ndef folder_select_folder_button_tapped(sender):\n\tftp.move_folder(sender.superview.superview.file_label.text, sender.superview.superview.path_field.text, sender.superview.superview.move_path_field.text)\n\tsender.superview.superview.list_source.items = build_directory(sender.superview.superview.path_field.text)\n\tsender.hidden = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.superview.superview.move_cancel_button.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\t\ndef duplicate_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Duplicate Folder & Contents?'\n\tsender.superview.superview.superview.secondary_button1.action = duplicate_entire_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef duplicate_entire_folder(sender):\n\tftp.duplicate_folder(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\n#####################\n##### Delegates #####\n#####################\n\n#######################\n# Navigation Delegate #\n#######################\nclass navigation_delegate():\n\tdef tableview_did_select(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\t# If selected item is a folder...\n\t\tif tableview.data_source.items[row]['accessory_type'] != 'none':\n\t\t\t# Build the new directory\n\t\t\tif tableview.superview.path_field.text[-1:] != '/':\n\t\t\t\ttableview.superview.list_source.items = build_directory(tableview.superview.path_field.text + '/' + selection)\n\t\t\telse:\n\t\t\t\ttableview.superview.list_source.items = build_directory(tableview.superview.path_field.text + selection)\n\t\t\t# Set text field to display new path\n\t\t\ttableview.superview.path_field.text = ftp.ftp.pwd()\n\t\t\t# Enable the back button if you are no longer on the top level directory\n\t\t\tif tableview.superview.path_field.text != '/':\n\t\t\t\ttableview.superview.back_button.enabled = True\n\t\t# If selected item is a file...\n\t\telse:\n\t\t\ttableview.superview.button1.title = 'Download & Open'\n\t\t\ttableview.superview.button1.action = open_button_tapped\n\t\t\ttableview.superview.button2.title = 'Overwrite File'\n\t\t\ttableview.superview.button2.action = overwrite_button_tapped\n\t\t\ttableview.superview.button3.title = 'Rename File'\n\t\t\ttableview.superview.button3.action = rename_file_button_tapped\n\t\t\ttableview.superview.button4.title = 'Delete File'\n\t\t\ttableview.superview.button4.action = delete_file_button_tapped\n\t\t\ttableview.superview.button5.title = 'Move File'\n\t\t\ttableview.superview.button5.action = move_file_button_tapped\n\t\t\ttableview.superview.button6.title = 'Duplicate File'\n\t\t\ttableview.superview.button6.action = duplicate_file_button_tapped\n\t\t\ttableview.superview.button7.title = 'Copy File Path'\n\t\t\ttableview.superview.button7.action = copy_path_button_tapped\n\t\t\ttableview.superview.button3.hidden = False\n\t\t\ttableview.superview.button4.hidden = False\n\t\t\ttableview.superview.button5.hidden = False\n\t\t\ttableview.superview.button6.hidden = False\n\t\t\ttableview.superview.button7.hidden = False\n\t\t\ttableview.superview.button8.hidden = True\n\t\t\ttableview.superview.file_icon.image = ui.Image.named('ionicons-document-24')\n\t\t\ttableview.superview.file_label.text = selection\n\t\t\ttableview.superview.button_actions.hidden = False\n\t\t\ttableview.superview.plus_button.enabled = False\n\t\t\ttableview.superview.back_button.enabled = True\n\t\t\ttableview.superview.close_button.center = (tableview.superview.width/2,272)\n\t\t\tif tableview.superview.height < 500:\n\t\t\t\ttableview.superview.scroll_buttons.content_size = (tableview.superview.width, 325)\n\t\t\ttableview.superview.scroll_buttons.content_offset = (0,0)\n\t\n\tdef tableview_accessory_button_tapped(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\ttableview.superview.button1.title = 'Rename Folder'\n\t\ttableview.superview.button1.action = rename_folder_button_tapped\n\t\ttableview.superview.button2.title = 'Delete Folder'\n\t\ttableview.superview.button2.action = delete_folder_button_tapped\n\t\ttableview.superview.button3.title = 'Move Folder'\n\t\ttableview.superview.button3.action = move_folder_button_tapped\n\t\ttableview.superview.button4.title = 'Duplicate Folder'\n\t\ttableview.superview.button4.action = duplicate_folder_button_tapped\n\t\ttableview.superview.button5.title = 'Copy Folder Path'\n\t\ttableview.superview.button5.action = copy_path_button_tapped\n\t\ttableview.superview.button3.hidden = False\n\t\ttableview.superview.button4.hidden = False\n\t\ttableview.superview.button5.hidden = False\n\t\ttableview.superview.button6.hidden = True\n\t\ttableview.superview.button7.hidden = True\n\t\ttableview.superview.button8.hidden = True\n\t\ttableview.superview.file_icon.image = ui.Image.named('ionicons-folder-24')\n\t\ttableview.superview.file_label.text = selection\n\t\ttableview.superview.button_actions.hidden = False\n\t\ttableview.superview.plus_button.enabled = False\n\t\ttableview.superview.back_button.enabled = True\n\t\ttableview.superview.close_button.center = (tableview.superview.width/2,213)\n\t\tif tableview.superview.height < 500:\n\t\t\ttableview.superview.scroll_buttons.content_size = (tableview.superview.width, 266)\n\t\ttableview.superview.scroll_buttons.content_offset = (0,0)\n\n#######################\n# Path Field Delegate #\n#######################\nclass path_navigation_delegate():\n\tdef textfield_should_begin_editing(self,textfield):\n\t\treturn True\n\t# When user hits return after editing TextField...\n\tdef textfield_should_return(self,textfield):\n\t\t# Get the current path from the text field\n\t\tself.path = textfield.text\n\t\t# Test to see if the new path is a valid directory...\n\t\ttry:\n\t\t\t# If it is, build that directory and load it into the ListDataSource element\n\t\t\ttextfield.superview.list_source.items = build_directory(self.path)\n\t\texcept:\n\t\t\t# If it is not a valid path, alert the user and reset the path in the TextField to what it was previously\n\t\t\tconsole.hud_alert('Directory \\'' + self.path + '\\' Does Not Seem To Exist', 'error', 5.0)\n\t\t\ttextfield.text = ftp.ftp.pwd()\n\t\ttextfield.end_editing()\n\t# If keyboard is dismissed without return being hit, reset the path in the TextField to the current directory\n\tdef textfield_did_end_editing(self,textfield):\n\t\ttextfield.text = ftp.ftp.pwd()\n\t\t\n#######################\n# File Label Delegate #\n#######################\nclass file_label_delegate():\n\tdef __init__(self, textview, type):\n\t\tself.type = type\n\tdef textview_should_begin_editing(self, textview):\n\t\treturn True\n\tdef textview_did_begin_editing(self, textview):\n\t\tif self.type == 'upload':\n\t\t\ttextview.text = 'filename.txt'\n\t\telif self.type == 'new_folder':\n\t\t\ttextview.text = 'foldername'\n\t\telif self.type == 'new_image':\n\t\t\ttextview.text = 'imagename.png'\n\tdef textview_did_end_editing(self, textview):\n\t\ttextview.text = textview.name\n\tdef textview_should_change(self, textview, range, replacement):\n\t\treturn True\n\tdef textview_did_change(self, textview):\n\t\tif self.type == 'upload' or self.type == 'new_folder' or self.type == 'new_image':\n\t\t\ttextview.superview.superview.secondary_button1.enabled = True\n\t\tif '\\n' in textview.text:\n\t\t\ttextview.text = textview.text.rstrip('\\n')\n\t\t\ttextview.end_editing()\n\t\t\tif textview.superview.superview.secondary_button1.enabled == True:\n\t\t\t\tif self.type == 'folder':\n\t\t\t\t\trename_folder(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'file':\n\t\t\t\t\trename_file(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'upload':\n\t\t\t\t\tupload_file_in_editor(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'new_folder':\n\t\t\t\t\tcreate_folder(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'new_image':\n\t\t\t\t\tupload_image(textview.superview.superview.secondary_button1)\n\t\tif self.type != 'upload' and self.type != 'new_folder' and self.type != 'new_image':\n\t\t\tif textview.text != textview.name:\n\t\t\t\ttextview.superview.superview.secondary_button1.enabled = True\n\t\t\telse:\n\t\t\t\ttextview.superview.superview.secondary_button1.enabled = False\n\tdef textview_did_change_selection(self, textview):\n\t\tpass\n\t\t\n#######################\n# Move File Delegate #\n#######################\nclass move_delegate():\n\tdef tableview_did_select(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\t# If selected item is a folder...\n\t\tif tableview.data_source.items[row]['accessory_type'] != 'none':\n\t\t\t# Build the new directory\n\t\t\tif tableview.superview.superview.move_path_field.text[-1:] != '/':\n\t\t\t\ttableview.superview.superview.move_list_source.items = build_move_directory(tableview.superview.superview.move_path_field.text + '/' + selection)\n\t\t\telse:\n\t\t\t\ttableview.superview.superview.move_list_source.items = build_directory(tableview.superview.superview.move_path_field.text + selection)\n\t\t\t# Set text field to display new path\n\t\t\ttableview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\t\t\ttableview.superview.superview.select_folder.title = 'Move to \\'' + tableview.superview.superview.move_path_field.text + '\\''\n\t\t\t# Enable the back button if you are no longer on the top level directory\n\t\t\tif tableview.superview.superview.move_path_field.text != '/':\n\t\t\t\ttableview.superview.superview.move_back_button.enabled = True\n\n# Build directory to be displayed in rows of TableView for moving files\ndef build_move_directory(path=params['Initial_Path']):\n\t# Get directory as dictionary with keys marking items as files or folders\n\tlist_items = ftp.directory_with_types(path)\n\tsource_list = []\n\t# Pull data from list_items and prepare a list of dictionaries readable by ListDataSource element\n\tfor item in list_items:\n\t\td = {}\n\t\td['title'] = list_items[item]['title']\n\t\t# For files, do not include accessory action icons in their rows, but mark them with file icons\n\t\tif list_items[item]['type'] == 'file':\n\t\t\td['accessory_type'] = 'none'\n\t\t\td['image'] = 'ionicons-document-24'\n\t\t# For folders, add chevron arrow accessory action icons to rows and mark with folder icons\n\t\telse:\n\t\t\td['accessory_type'] = 'disclosure_indicator'\n\t\t\td['image'] = 'ionicons-folder-24'\n\t\t# Add each prepared dictionary to overall list of dictionaries\n\t\tif d['title'][:1] != '.':\n\t\t\tsource_list.append(d)\n\t# Return list of dictionaries with all files and folders properly flagged\t\n\treturn source_list\n\t\n#####################################\n##### Move File/Folder Buttons ######\n#####################################\ndef move_back_button_tapped(sender):\n\t# Get current path\n\tpath = sender.superview.superview.move_path_field.text\n\t# Split the path at slashes\n\tpath = path.split('/')\n\tnew_path = ''\n\t# Put the path back together with slashes, but leave the final path item removed (path is back one level)\n\tfor i in range(len(path) - 1):\n\t\tnew_path += path[i] + '/'\n\t# Remove trailing backslash, unless you are in the top level directory '/'\n\tif len(new_path) > 1:\n\t\tnew_path = new_path[:-1]\n\t# Build the directory for the new path and send it to the ListDataSource element\n\tsender.superview.superview.move_list_source.items = build_move_directory(new_path)\n\t# Adjust the title TextField to display the new path\n\tsender.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.move_path_field.text + '\\''\n\t# If the new path leaves you at the top level directory, disable the back button\n\tif new_path == '/':\n\t\tsender.enabled = False\n\t\t\ndef move_cancel_button_tapped(sender):\n\tsender.superview.hidden = True\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.hidden = True\n\tsender.superview.superview.select_folder.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\n##########################\n##### User Interface #####\n##########################\nclass FTP_Client(ui.View):\n\tdef __init__(self,data_source):\n\t\t# Set up the view\n\t\tself.bounds = (0,0,320,500)\n\t\tself.background_color = '#F6F6F6'\n\t\tself.name = 'FTP_Client'\n\t\t# Set up the loading icon\n\t\tself.loading_view = ui.ActivityIndicator()\n\t\tself.loading_view.center = (self.width / 2, self.height / 2)\n\t\tself.loading_view.style = ui.ACTIVITY_INDICATOR_STYLE_GRAY\n\t\tself.add_subview(self.loading_view)\n\t\t# Set up the TextField where the path will be displayed\n\t\tself.path_field = ui.TextField()\n\t\tself.path_field.placeholder = '/'\n\t\tself.path_field.text = ftp.ftp.pwd()\n\t\tself.path_field.frame = (15,60,self.width-30,32) # Define the field's coordinates and measurments\n\t\tself.path_field.alignment = ui.ALIGN_CENTER\n\t\tself.path_field.delegate = path_navigation_delegate() # Set up the TextField's delegate\n\t\tself.add_subview(self.path_field)\n\t\tnav_background = ui.Label()\n\t\tnav_background.frame = (47,0,self.width,50)\n\t\tnav_background.background_color = '#f0f0f0'\n\t\tnav_background.center = (self.width/2,25)\n\t\tnav_background.alignment = ui.ALIGN_CENTER\n\t\tnav_background.send_to_back()\n\t\tself.add_subview(nav_background)\n\t\ttitle = ui.Label()\n\t\ttitle.text = params['FTP_Server'] # Text to display on title bar\n\t\ttitle.frame = (47,0,self.width-128,50)\n\t\ttitle.background_color = '#f0f0f0'\n\t\ttitle.center = (self.width/2+15,25)\n\t\ttitle.alignment = ui.ALIGN_CENTER\n\t\ttitle.send_to_back()\n\t\tself.add_subview(title)\n\t\t# Set up the back button\n\t\tself.back_button = ui.Button()\n\t\tself.back_button.image = ui.Image.named('ionicons-chevron-left-24')\n\t\tself.back_button.frame = (10,10,32,32)\n\t\tself.back_button.font = ('', 25)\n\t\tself.back_button.action = back_button_tapped # Set the back button's action to back_button_tapped function\n\t\tself.add_subview(self.back_button)\n\t\t# Set up the plus button\n\t\tself.plus_button = ui.Button()\n\t\tself.plus_button.image = ui.Image.named('ionicons-plus-24')\n\t\tself.plus_button.frame = (275,10,32,32)\n\t\tself.plus_button.font = ('', 25)\n\t\tself.plus_button.action = plus_button_tapped # Set the plus button's action to plus_button_tapped function\n\t\tself.add_subview(self.plus_button)\n\t\t# Set up the home button\n\t\tself.home_button = ui.Button()\n\t\tself.home_button.image = ui.Image.named('ionicons-home-24')\n\t\tself.home_button.frame = (45,10,32,32)\n\t\tself.home_button.font = ('', 25)\n\t\tself.home_button.action = home_button_tapped # Set the back button's action to back_button_tapped function\n\t\tself.add_subview(self.home_button)\n\t\t# Set up the data source element for the TableView\n\t\tself.list_source = ui.ListDataSource(items=[])\n\t\tself.list_source.move_enabled = False\n\t\tself.list_source.delete_enabled = False\n\t\tself.list_source.items = data_source # Set data source to the element that will be passed into this class upon initiation\n\t\t# Set up the TableView\n\t\tself.table_view = ui.TableView()\n\t\tself.table_view.row_height = 44\n\t\tself.table_view.delegate = navigation_delegate() # Link the navigation delegate\n\t\tself.table_view.frame = (0,100,self.width, self.height - 100)\n\t\tself.table_view.flex = 'H'\n\t\tself.table_view.data_source = self.list_source # Set the data source to the ListDataSource element\n\t\tself.add_subview(self.table_view)\n\t\t# Set up the view for button actions\n\t\tself.button_actions = ui.View()\n\t\tself.button_actions.bounds = (0,0,320,460)\n\t\tself.button_actions.center = (self.width/2,self.height/2+40)\n\t\tself.button_actions.background_color = '#f0f0f0'\n\t\tself.button_actions.name = 'button_actions'\n\t\tself.button_actions.flex = 'WH'\n\t\tself.button_actions.alpha = 1.0\n\t\tself.button_actions.hidden = True # Hide view until needed\n\t\tself.add_subview(self.button_actions)\n\t\tself.label_background = ui.Label()\n\t\tself.label_background.text = ''\n\t\tself.label_background.frame = (0,0,self.width,50)\n\t\tself.label_background.center = (self.width/2,self.height/8-28)\n\t\tself.label_background.background_color = '#f8f8f8'\n\t\tself.button_actions.add_subview(self.label_background)\n\t\t# Set up the title label to display which file was selected\n\t\tself.file_label = ui.TextView()\n\t\tself.file_label.font = ('', 18)\n\t\tself.file_label.frame = (0,0,self.width-55,45)\n\t\tself.file_label.center = (self.width/2+25,self.height/8-25)\n\t\tself.file_label.background_color = '#f8f8f8'\n\t\tself.file_label.alignment = ui.ALIGN_LEFT\n\t\tself.file_label.editable = False\n\t\tself.button_actions.add_subview(self.file_label)\n\t\tself.file_icon = ui.ImageView()\n\t\tself.file_icon.frame = (0,0,23,23)\n\t\tself.file_icon.center = (30,self.height/8-28)\n\t\tself.button_actions.add_subview(self.file_icon)\n\t\t# Set up scroll view so all buttons can be accessed if keyboard is up\n\t\tself.scroll_buttons = ui.ScrollView()\n\t\tself.scroll_buttons.frame = (0,58,self.width, self.height - 100)\n\t\tself.scroll_buttons.background_color = '#f0f0f0'\n\t\tself.scroll_buttons.flex = 'H'\n\t\tself.scroll_buttons.always_bounce_vertical = True\n\t\tself.scroll_buttons.bounces = True\n\t\tself.scroll_buttons.content_size = (self.width, self.height - 100)\n\t\tself.scroll_buttons.paging_enabled = True\n\t\tself.button_actions.add_subview(self.scroll_buttons)\n\t\t# Set up button1\n\t\tself.button1 = ui.Button()\n\t\tself.button1.frame = (0,15,self.width/2.2,50)\n\t\tself.button1.center = (self.width/4+3,self.height/8-27)\n\t\tself.button1.background_color = '#fff'\n\t\tself.scroll_buttons.add_subview(self.button1)\n\t\t# Set up button2\n\t\tself.button2 = ui.Button()\n\t\tself.button2.frame = (0,15,self.width/2.2,50)\n\t\tself.button2.center = (self.width/2+77,self.height/8-27)\n\t\tself.button2.background_color = '#fff'\n\t\tself.button2.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button2)\n\t\t# Set up button3\n\t\tself.button3 = ui.Button()\n\t\tself.button3.frame = (0,15,self.width/2.2,50)\n\t\tself.button3.center = (self.width/4+3,self.height/8+32)\n\t\tself.button3.background_color = '#fff'\n\t\tself.button3.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button3)\n\t\t# Set up button4\n\t\tself.button4 = ui.Button()\n\t\tself.button4.frame = (0,15,self.width/2.2,50)\n\t\tself.button4.center = (self.width/2+77,self.height/8+32)\n\t\tself.button4.background_color = '#fff'\n\t\tself.button4.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button4)\n\t\t# Set up button5\n\t\tself.button5 = ui.Button()\n\t\tself.button5.frame = (0,15,self.width/2.2,50)\n\t\tself.button5.center = (self.width/4+3,self.height/8+91)\n\t\tself.button5.background_color = '#fff'\n\t\tself.button5.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button5)\n\t\t# Set up button6\n\t\tself.button6 = ui.Button()\n\t\tself.button6.frame = (0,15,self.width/2.2,50)\n\t\tself.button6.center = (self.width/2+77,self.height/8+91)\n\t\tself.button6.background_color = '#fff'\n\t\tself.button6.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button6)\n\t\t# Set up button7\n\t\tself.button7 = ui.Button()\n\t\tself.button7.frame = (0,15,self.width/2.2,50)\n\t\tself.button7.center = (self.width/4+3,self.height/8+150)\n\t\tself.button7.background_color = '#fff'\n\t\tself.button7.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button7)\n\t\t# Set up button8\n\t\tself.button8 = ui.Button()\n\t\tself.button8.frame = (0,15,self.width/2.2,50)\n\t\tself.button8.center = (self.width/2+77,self.height/8+150)\n\t\tself.button8.background_color = '#fff'\n\t\tself.button8.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button8)\n\t\t# Set up the close button to dismiss the button actions view\n\t\tself.close_button = ui.Button()\n\t\tself.close_button.title = 'Close'\n\t\tself.close_button.frame = (0,15,self.width-20,50)\n\t\tself.close_button.center = (self.width/2,self.height/8+210)\n\t\tself.close_button.background_color = '#fff'\n\t\tself.close_button.alpha = 1.0\n\t\tself.close_button.action = close_button_tapped\n\t\tself.scroll_buttons.add_subview(self.close_button)\n\t\t# Set up view for secondary actions\n\t\tself.secondary_actions = ui.View()\n\t\tself.secondary_actions.bounds = (0,0,320,460)\n\t\tself.secondary_actions.center = (self.width/2,self.height/2+40)\n\t\tself.secondary_actions.background_color = '#f0f0f0'\n\t\tself.secondary_actions.name = 'secondary_actions'\n\t\tself.secondary_actions.flex = 'WH'\n\t\tself.secondary_actions.alpha = 1.0\n\t\tself.secondary_actions.hidden = True # Hide view until needed\n\t\tself.button_actions.add_subview(self.secondary_actions)\n\t\t# Set up Secondary button1\n\t\tself.secondary_button1 = ui.Button()\n\t\tself.secondary_button1.frame = (0,15,self.width-21,50)\n\t\tself.secondary_button1.center = (self.width/2,self.height/8-29)\n\t\tself.secondary_button1.background_color = '#fff'\n\t\tself.secondary_button1.alpha = 1.0\n\t\tself.secondary_actions.add_subview(self.secondary_button1)\n\t\t# Set up the cancel button to dismiss the secondary actions view\n\t\tself.cancel_button = ui.Button()\n\t\tself.cancel_button.title = 'Cancel'\n\t\tself.cancel_button.frame = (0,15,self.width-20,50)\n\t\tself.cancel_button.center = (self.width/2,94)\n\t\tself.cancel_button.background_color = '#fff'\n\t\tself.cancel_button.alpha = 1.0\n\t\tself.cancel_button.action = cancel_button_tapped\n\t\tself.secondary_actions.add_subview(self.cancel_button)\n\t\t# Set up the data source element for the TableView for moving files\n\t\tself.move_list_source = ui.ListDataSource(items=[])\n\t\tself.move_list_source.move_enabled = False\n\t\tself.move_list_source.delete_enabled = False\n\t\t# Set up the TableView for Moving Files\n\t\tself.move_table_view = ui.TableView()\n\t\tself.move_table_view.row_height = 44\n\t\tself.move_table_view.delegate = move_delegate() # Link the navigation delegate for moving files\n\t\tself.move_table_view.frame = (0,127,self.width, self.height - 185)\n\t\tself.move_table_view.flex = 'H'\n\t\tself.move_table_view.data_source = self.move_list_source # Set the data source to the ListDataSource element\n\t\tself.move_table_view.hidden = True\n\t\tself.move_table_view.alpha = 1.0\n\t\tself.move_table_view.background_color = '#fff'\n\t\tself.button_actions.add_subview(self.move_table_view)\n\t\tself.move_label_background = ui.Label()\n\t\tself.move_label_background.text = ''\n\t\tself.move_label_background.frame = (0,0,self.width,170)\n\t\tself.move_label_background.center = (self.width/2,self.height/8-28)\n\t\tself.move_label_background.hidden = True\n\t\tself.move_label_background.background_color = '#f0f0f0'\n\t\tself.button_actions.add_subview(self.move_label_background)\n\t\t# Set up the button to select folder to move file into\n\t\tself.select_folder = ui.Button()\n\t\tself.select_folder.frame = (0,0,self.width-20,50)\n\t\tself.select_folder.center = (self.width/2,self.height/8-28)\n\t\tself.select_folder.background_color = '#fff'\n\t\tself.select_folder.hidden = True\n\t\tself.button_actions.add_subview(self.select_folder)\n\t\t# Set up the back button for the move file view\n\t\tself.move_back_button = ui.Button()\n\t\tself.move_back_button.image = ui.Image.named('ionicons-chevron-left-24')\n\t\tself.move_back_button.background_color = '#fff'\n\t\tself.move_back_button.frame = (10,69,50,50)\n\t\tself.move_back_button.font = ('', 25)\n\t\tself.move_back_button.action = move_back_button_tapped # Set the back button's action to move_back_button_tapped function\n\t\tself.move_back_button.hidden = True\n\t\tself.button_actions.add_subview(self.move_back_button)\n\t\t# Set up the cancel button to dismiss the move file view\n\t\tself.move_cancel_button = ui.Button()\n\t\tself.move_cancel_button.title = 'Cancel'\n\t\tself.move_cancel_button.frame = (0,15,self.width-80,50)\n\t\tself.move_cancel_button.center = (self.width/2+30,self.height/8+31)\n\t\tself.move_cancel_button.background_color = '#fff'\n\t\tself.move_cancel_button.alpha = 1.0\n\t\tself.move_cancel_button.action = move_cancel_button_tapped\n\t\tself.move_cancel_button.hidden = True\n\t\tself.button_actions.add_subview(self.move_cancel_button)\n\t\t# Set up the TextField where the current path will be held\n\t\tself.move_path_field = ui.TextField()\n\t\tself.move_path_field.text = ftp.ftp.pwd()\n\t\tself.move_path_field.hidden = True\n\t\tself.button_actions.add_subview(self.move_path_field)\n\n# Build the initial directory and store it to the source_list variable\nsource_list = build_directory()\n\n# Initiate the view and pass it the source_list\nview = FTP_Client(source_list)\n# Present the view in a popover\nview.present(style = 'popover', hide_title_bar = True)\n", "26DF96A7-B364-42B8-93AE-439D0650676A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A9D399AD-1AE7-453D-9F37-9B66FE3DF0A9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7C719344-C891-4AB0-95AE-A113A91D1248": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1E45370D-12DA-4162-BE1D-00E57FD826A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6BB5C954-DACE-44BC-BAA5-BA386343A159": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "93D7ECD9-8FF4-4ED4-910A-1024DFFA875F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3D76ECEE-8D86-4F1F-B6CE-161124D878F3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "15E08D0D-F62D-4AC0-92EF-A2809B7DFBB6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F276A4A8-DABC-4867-A241-5D85D5A2F8D4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9EF136C5-4458-4EC1-8B41-2CEC520138DB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E4A933E5-76E4-4B94-8996-0AEEF41399E8": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6A5B2A56-80C7-4E7B-8E2F-EBF2993ED68B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6D17DF79-ECA4-4EF9-B5D2-1AAB32E34D11": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DD306F77-489E-4A09-BAAD-01E9D233934E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "ui": "[{\"class\":\"View\",\"attributes\":{\"background_color\":\"RGBA(1.000000,1.000000,1.000000,1.000000)\",\"tint_color\":\"RGBA(0.000000,0.478000,1.000000,1.000000)\",\"enabled\":true,\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"flex\":\"\"},\"frame\":\"{{0, 0}, {540, 575}}\",\"nodes\":[{\"class\":\"View\",\"attributes\":{\"name\":\"view1\",\"uuid\":\"691D7635-ED21-47B1-BB0C-D03DF74DFA8B\",\"enabled\":true,\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"flex\":\"\"},\"frame\":\"{{162, 279}, {215, 58}}\",\"nodes\":[]},{\"class\":\"Button\",\"attributes\":{\"font_size\":15,\"enabled\":true,\"flex\":\"\",\"font_bold\":false,\"name\":\"button1\",\"uuid\":\"891737B6-0D9F-4C3A-AABF-15D9B73D64AB\",\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"title\":\"Download\"},\"frame\":\"{{162, 279}, {107, 58}}\",\"nodes\":[]},{\"class\":\"Button\",\"attributes\":{\"font_size\":15,\"enabled\":true,\"flex\":\"\",\"font_bold\":false,\"name\":\"button2\",\"uuid\":\"93DF31A4-D186-45A9-8180-04EB9C517035\",\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"title\":\"Overwrite\"},\"frame\":\"{{270, 279}, {107, 58}}\",\"nodes\":[]}]}]", "68A2A40E-0E92-4737-8FF2-F176B3645CBC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D4B85DD2-E06A-467A-9137-868147CB5EF5": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E48FCCAE-719D-4713-936F-4217132FB7F9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BFEAA0EA-62A6-4DA4-976D-493B3F338463": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "07E5006D-CD8C-4383-8BE9-6A8D8F6CCC07": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AA0729B7-4EA3-4539-98A3-9FA5550C5AF3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}], "name": "FTP_Client", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone9,4", "systemVersion": "13.1.2"}, "type": "wkflw", "public": true, "icon": "minicons-icons-transfer-upload-5.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22angel%22%2C%20%22description%22%3A%20%22This%20is%20a%20custom%20UI%20for%20Editorial%20which%20will%20present%20a%20fully%20featured%20FTP%20client%20in%20a%20popup%20window%20over%20the%20editor.%5Cn%5CnAfter%20downloading%20you%20will%20need%20to%20tap%20the%20Info%20button%20next%20to%20the%20workflow%2C%20go%20to%20the%20Edit%20Workflow%20page%2C%20tap%20on%20the%20action%20block%20to%20expand%20it%2C%20and%20fill%20in%20your%20FTP%20login%20credentials%20in%20the%20variables%20below.%20Once%20you%27ve%20done%20that%20just%20run%20it%20from%20the%20workflow%20menu%20and%20you%20should%20be%20set.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22FTP%20UI%22%2C%20%22parameters%22%3A%20%7B%2276A5A84D-0561-4834-856C-545D188ABC42%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217F9FFEF-24E7-4B85-80AF-E6FFD48F26E9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2212CB7DEE-EEC1-4FCB-97BF-BBB95A56A03B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217DDDC80-EB5C-4A4A-BE33-F29B1EA496A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223DD56DC4-7B69-49DC-8A3B-2DB7A851AC30%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D74B99FF-2F76-4624-9C02-A0E1785348A5%22%3A%20%22%22%2C%20%22F953659E-E15A-4FE6-82B4-1BB1CE613B3E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DBA7A162-8790-4615-A5C1-EFF8EB870E0B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22350C4857-3A55-4278-A792-F144FA8B92F1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D95E75B5-2181-465B-A147-20D14D1B88A7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227B2C7297-7737-47B0-8548-2F6579D63B3A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AF803B87-F589-4DDF-8D61-888339533174%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2274EE867C-63BF-42F5-8F85-2AD1663D9528%22%3A%20%22172.16.1.48%22%2C%20%22E03DEE1B-0607-4EBE-9F82-434D690A3588%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228FA2F3A3-A33F-4E29-B492-31CA733496EC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229B35529B-8F25-4F88-A9B4-781FB250B846%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22placeholder%22%3A%20%22%2F%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22D74B99FF-2F76-4624-9C02-A0E1785348A5%22%2C%20%22title%22%3A%20%22Initial_Path%22%7D%2C%20%7B%22placeholder%22%3A%20%22ftp.example.com%22%2C%20%22keyboardType%22%3A%203%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%2274EE867C-63BF-42F5-8F85-2AD1663D9528%22%2C%20%22title%22%3A%20%22FTP_Server%22%7D%2C%20%7B%22placeholder%22%3A%20%22guyot%40unapologetic.io%22%2C%20%22keyboardType%22%3A%207%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22B42E2195-685F-4022-B61E-14A19BDACD7D%22%2C%20%22title%22%3A%20%22FTP_Username%22%7D%2C%20%7B%22placeholder%22%3A%20%22%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22FCF40D27-4DB7-4121-97F6-F968A900E92E%22%2C%20%22title%22%3A%20%22FTP_Password%22%7D%5D%2C%20%22B8C377DB-C007-491E-9B69-9967410CC875%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22FCF40D27-4DB7-4121-97F6-F968A900E92E%22%3A%20%22B2esaL1a%22%2C%20%226E695F21-0664-4FC9-920E-12821330B610%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217E340BF-6CF0-45D7-AA81-F135B91DE224%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220FBCC4E3-9F73-4A4A-8857-766400E58E37%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229C3FFE2C-6C49-46C9-BD53-E5AAAE2BD8CA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226A2FC1A6-979E-4125-87D1-52EB38FC4527%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ABBDEFCC-F896-4F7A-B35F-5023B651DD88%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2298F26812-BFCB-4DC1-8FC4-E7282BCAF39A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C8D3ACB2-86C1-479E-979E-666D5FE5BB97%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229E029915-8290-426B-9B8E-326654FA13DC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220B2A14F2-513A-4FEC-B3FB-204BDFA18B47%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AD8FDF1C-B8D2-48EB-A547-37B910262AAB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F2C3515D-1C29-423D-99C0-95B6FB4887DC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2295FA6C87-6EB6-4562-B4B0-38C99BF57114%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223A9BD136-9079-44AD-89C5-53D329731D83%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221C7EAC87-52E9-42C6-A8C7-18AB70F3FD23%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22B42E2195-685F-4022-B61E-14A19BDACD7D%22%3A%20%22angel_augusto%22%2C%20%226C12A397-2296-483B-BE29-87C6F9D8013B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22867B865E-787D-45E1-B3BF-64412F9D6FA4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226CC50A85-8999-47B5-B830-88C48A0443AB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BE54AC05-8D78-4F95-822A-AC4907F58791%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222D8A39CF-8976-4772-A439-9A46FA9C79D3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222B5E2C3D-F83E-4B48-B316-FFC6DC26E26A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DBD9CAA1-1A12-4ABE-A9C7-EBBF0D77357E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22CF4A2FE6-4960-4F51-BAE9-3218272C1C6E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2225171F4E-EB9B-47E7-9902-E3ED071C0362%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228913248B-FE4C-4839-BD1E-22533BA6586B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229D387E48-805E-46E4-83A9-30876058FD42%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2290D8071E-9FC5-4FFA-94E6-0BC3006E4236%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2277021432-36A0-48A7-8A82-9C4609E71B23%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2268AE2162-AF92-4CE6-B5E5-A99BA2D7CFB9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22FC89D8BA-5448-455D-BBAC-21F1F0775A66%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E34AD0C6-2E7C-46DF-8E5C-A61D619E4063%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C4ACD630-2532-48C6-88DE-EA95FB7FA074%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C57929EE-43A1-4384-BF54-95AF57E3552A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22010A0730-7B55-419F-AD63-86DAE22BCFF3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2293D9F4AF-C4DB-4E00-A32E-52AE27A1E174%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BE013931-6B92-45BB-A3F9-5747D2BD1587%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BEA876CA-3C94-415F-B229-B5DAC3A68DD7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221E06CA8B-C928-4F60-8418-D04B6D3E0AA3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220FE68B9D-5A5D-4746-94A6-E183EEC712E1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E6FC01C2-5EB7-4867-B73C-FA4A657FE032%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20ui%5Cnimport%20console%5Cnimport%20editor%5Cnimport%20time%5Cnimport%20clipboard%5Cnimport%20photos%5Cnfrom%20PIL%20import%20Image%5Cnfrom%20io%20import%20BytesIO%5Cnimport%20webbrowser%5Cnfrom%20ftplib%20import%20FTP%5Cn%5Cn%23%20Get%20the%20custom%20parameters%20as%20a%20dictionary%20%28titles%20are%20keys%29%3A%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cn%23%20Get%20the%20action%27s%20input%20%28a%20string%29%3A%5Cnaction_in%20%3D%20workflow.get_input%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20FTP%20Protocol%20Class%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cnclass%20FTP_Instance%3A%5Cn%5Ctdef%20__init__%28self%29%3A%5Cn%5Ct%5Ctself.initial_path%20%3D%20params%5B%27Initial_Path%27%5D%5Cn%5Ct%5Ctself.ftp%20%3D%20FTP%28params%5B%27FTP_Server%27%5D%29%5Cn%5Ct%5Ctself.ftp.login%28params%5B%27FTP_Username%27%5D%2C%20params%5B%27FTP_Password%27%5D%29%5Cn%5Ct%5Ctself.ftp.cwd%28self.initial_path%29%5Cn%5Cn%5Ctdef%20open_file%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Cttemp%20%3D%20open%28%27temp%27%2C%20%5C%22wb%5C%22%29%5Cn%5Ct%5Ctself.ftp.retrbinary%28%27RETR%20%27%20%2B%20filename%2C%20temp.write%29%5Cn%5Ct%5Cttemp.close%28%29%5Cn%5Ct%5Ctread%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctfile_contents%20%3D%20read.read%28%29%5Cn%5Ct%5Ctread.close%28%29%5Cn%5Ct%5Ctreturn%20file_contents%5Cn%5Cn%5Ctdef%20check_file_exists%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctexisting_files%20%3D%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ctreturn%20filename%20in%20existing_files%5Cn%5Ct%5Ct%5Cn%5Ctdef%20mkd%28self%2C%20path%29%3A%5Cn%5Ct%5Ctchecked_path%20%3D%20%27%27%5Cn%5Ct%5Ctdirectories%20%3D%20path%5B1%3A%5D.split%28%27%2F%27%29%5Cn%5Ct%5Ctself.ftp.cwd%28self.initial_path%29%5Cn%5Ct%5Ctfor%20i%20in%20range%28len%28directories%29%29%3A%5Cn%5Ct%5Ct%5Ctcurrent_dir%20%3D%20self.ftp.nlst%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ctif%20directories%5Bi%5D%20in%20current_dir%3A%5Cn%5Ct%5Ct%5Ct%5Ctchecked_path%20%2B%3D%20%27%2F%27%20%2B%20directories%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctchecked_path%20%2B%3D%20%27%2F%27%20%2B%20directories%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20overwrite_file%28self%2C%20filename%2C%20text%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27w%27%29%5Cn%5Ct%5Ctfile.write%28text%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20filename%2C%20file%29%5Cn%5Ct%5Ctif%20text%20%21%3D%20self.open_file%28filename%2Cpath%29%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20Overwrite%20Failed%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20Overwritten%27%2C%20%27success%27%2C%205.0%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Cn%5Ctdef%20upload_image%28self%2C%20imagename%2C%20path%29%3A%5Cn%5Ct%5Ctimage%20%3D%20photos.pick_image%28%29%5Cn%5Ct%5Ctbuffer%20%3D%20BytesIO%28%29%5Cn%5Ct%5Ctimage.save%28buffer%2C%20%27PNG%27%29%5Cn%5Ct%5Ctbuffer.seek%280%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20imagename%2C%20buffer%29%5Cn%5Ct%5Cn%5Ctdef%20create_and_upload_file%28self%2C%20filename%2C%20text%2C%20path%29%3A%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27w%27%29%5Cn%5Ct%5Ctfile.write%28text%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctself.upload_file%28file%2C%20filename%2C%20path%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Cn%5Ctdef%20upload_file%28self%2C%20file%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctif%20path%20%21%3D%20%27%27%3A%5Cn%5Ct%5Ct%5Ctself.mkd%28path%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20filename%2C%20file%29%5Cn%5Cn%5Ctdef%20print_directory%28self%2C%20path%29%3A%5Cn%5Ct%5Ctprint%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20duplicate_file%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%201%5Cn%5Ct%5Ctfind_extension%20%3D%20filename.split%28%27.%27%29%5Cn%5Ct%5Ctnew_filename%20%3D%20%27%27%5Cn%5Ct%5Ctfor%20n%20in%20range%28len%28find_extension%29-1%29%3A%5Cn%5Ct%5Ct%5Ctnew_filename%20%2B%3D%20find_extension%5Bn%5D%20%2B%20%27.%27%5Cn%5Ct%5Ctnew_filename%20%3D%20new_filename%5B%3A-1%5D%5Cn%5Ct%5Ctcheck_filename%20%3D%20new_filename%20%2B%20%27-%27%20%2B%20str%28i%29%20%2B%20%27.%27%20%2B%20find_extension%5Bn%2B1%5D%5Cn%5Ct%5Ctfile_contents%20%3D%20self.open_file%28filename%2C%20path%29%5Cn%5Ct%5Ctwhile%20self.check_file_exists%28check_filename%2C%20path%29%3A%5Cn%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ct%5Ctcheck_filename%20%3D%20new_filename%20%2B%20%27-%27%20%2B%20str%28i%29%20%2B%20%27.%27%20%2B%20find_extension%5Bn%2B1%5D%5Cn%5Ct%5Ctself.create_and_upload_file%28check_filename%2C%20file_contents%2C%20path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20duplicate_folder%28self%2C%20foldername%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%201%5Cn%5Ct%5Ctnew_foldername%20%3D%20foldername%20%2B%20%27-%27%20%2B%20str%28i%29%5Cn%5Ct%5Ctwhile%20self.check_file_exists%28new_foldername%2C%20path%29%3A%5Cn%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ct%5Ctnew_foldername%20%3D%20foldername%20%2B%20%27-%27%20%2B%20str%28i%29%5Cn%5Ct%5Ctself.ftp.mkd%28path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%5Ct%23%20Get%20directory%20to%20duplicate%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28path%20%2B%20%27%2F%27%20%2B%20new_foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%23%20Helper%20action%5Cn%5Ctdef%20duplicate_folder_helper%28self%2C%20foldername%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ct%23%20Get%20directory%20to%20duplicate%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Cn%5Ctdef%20move_file%28self%2C%20filename%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ctif%20not%20self.check_file_exists%28filename%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28filename%2C%20from_path%29%5Cn%5Ct%5Ct%5Ctself.create_and_upload_file%28filename%2C%20file_contents%2C%20to_path%29%5Cn%5Ct%5Ct%5Ctif%20self.check_file_exists%28filename%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20self.open_file%28filename%2C%20to_path%29%20%3D%3D%20file_contents%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28from_path%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.delete%28filename%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20with%20same%20name%20already%20exists%20in%20this%20location%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Ct%5Cn%5Ctdef%20move_folder%28self%2C%20foldername%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ctall_files_moved%20%3D%20True%5Cn%5Ct%5Ctif%20not%20self.check_file_exists%28foldername%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%23%20Get%20directory%20of%20folder%20contents%20to%20be%20moved%5Cn%5Ct%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20not%20self.check_file_exists%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctall_files_moved%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctprint%20%27false%27%5Cn%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27Folder%20of%20same%20name%20already%20exists%20in%20this%20location%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Ctreturn%5Cn%5Ct%5Ctif%20all_files_moved%3A%5Cn%5Ct%5Ct%5Ctself.delete_folder%28foldername%2C%20from_path%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27All%20files%20may%20not%20have%20been%20moved%27%2C%20%27error%27%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Cn%5Ctdef%20delete_folder%28self%2C%20foldername%2C%20path%29%3A%5Cn%5Ct%5Ctftp.delete_folder_helper%28path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctftp.ftp.cwd%28path%29%5Cn%5Ct%5Ctftp.ftp.rmd%28foldername%29%5Cn%5Ct%23%20Helper%20action%5Cn%5Ctdef%20delete_folder_helper%28self%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.delete%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28path%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_inside%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_inside%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_inside%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctsave_path%20%3D%20path%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.delete_folder_helper%28path%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28save_path%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.rmd%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.rmd%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20directory_with_types%28self%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%200%5Cn%5Ct%5Ctdirectory_list%20%3D%20%5B%5D%5Cn%5Ct%5Ctdirectory_dict%20%3D%20%7B%7D%5Cn%5Ct%5Cttitle_list%20%3D%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.retrlines%28%27LIST%27%2C%20callback%3Ddirectory_list.append%29%5Cn%5Ct%5Ctfor%20item%20in%20directory_list%3A%5Cn%5Ct%5Ct%5Ctif%20i%20%3C%20len%28title_list%29%3A%5Cn%5Ct%5Ct%5Ct%5Ctlisting%20%3D%20%7B%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20item.upper%28%29.startswith%28%27D%27%29%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctlisting%5B%27type%27%5D%20%3D%20%27folder%27%5Cn%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctlisting%5B%27type%27%5D%20%3D%20%27file%27%5Cn%5Ct%5Ct%5Ct%5Ctdirectory_dict%5Bi%5D%20%3D%20listing%5Cn%5Ct%5Ct%5Ct%5Ctdirectory_dict%5Bi%5D%5B%27title%27%5D%20%3D%20title_list%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ctreturn%20directory_dict%5Cn%5Cn%5Ctdef%20quit%28self%29%3A%5Cn%5Ct%5Ctself.ftp.quit%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20FTP%20UI%20Client%20%23%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cn%23%20Initiate%20FTP%20Connection%5Cnftp%20%3D%20FTP_Instance%28%29%5Cn%5Cn%23%20Build%20directory%20to%20be%20displayed%20in%20rows%20of%20file%20manager%5Cndef%20build_directory%28path%3Dparams%5B%27Initial_Path%27%5D%29%3A%5Cn%5Ct%23%20Get%20directory%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ctlist_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ctsource_list%20%3D%20%5B%5D%5Cn%5Ct%23%20Pull%20data%20from%20list_items%20and%20prepare%20a%20list%20of%20dictionaries%20readable%20by%20ListDataSource%20element%5Cn%5Ctfor%20item%20in%20list_items%3A%5Cn%5Ct%5Ctd%20%3D%20%7B%7D%5Cn%5Ct%5Ctd%5B%27title%27%5D%20%3D%20list_items%5Bitem%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20For%20files%2C%20do%20not%20include%20accessory%20action%20icons%20in%20their%20rows%2C%20but%20mark%20them%20with%20file%20icons%5Cn%5Ct%5Ctif%20list_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27none%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-document-24%27%5Cn%5Ct%5Ct%23%20For%20folders%2C%20add%20chevron%20arrow%20accessory%20action%20icons%20to%20rows%20and%20mark%20with%20folder%20icons%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27detail_disclosure_button%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-folder-24%27%5Cn%5Ct%5Ct%23%20Add%20each%20prepared%20dictionary%20to%20overall%20list%20of%20dictionaries%5Cn%5Ct%5Ctif%20d%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ctsource_list.append%28d%29%5Cn%5Ct%23%20Return%20list%20of%20dictionaries%20with%20all%20files%20and%20folders%20properly%20flagged%5Ct%5Cn%5Ctreturn%20source_list%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Back%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Action%20to%20be%20run%20when%20user%20taps%20the%20back%20button%20in%20the%20top%20left%20of%20the%20UI%5Cndef%20back_button_tapped%28sender%29%3A%5Cn%5Ctif%20not%20sender.superview.secondary_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.secondary_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20False%5Cn%5Ctelif%20not%20sender.superview.button_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.button_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20False%5Cn%5Ct%5Ctif%20sender.superview.path_field.text%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ctsender.superview.back_button.enabled%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20True%5Cn%5Ct%5Cn%5Ctif%20button_actions_closed%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%23%20Get%20current%20path%5Cn%5Ct%5Ctpath%20%3D%20sender.superview.path_field.text%5Cn%5Ct%5Ct%23%20Split%20the%20path%20at%20slashes%5Cn%5Ct%5Ctpath%20%3D%20path.split%28%27%2F%27%29%5Cn%5Ct%5Ctnew_path%20%3D%20%27%27%5Cn%5Ct%5Ct%23%20Put%20the%20path%20back%20together%20with%20slashes%2C%20but%20leave%20the%20final%20path%20item%20removed%20%28path%20is%20back%20one%20level%29%5Cn%5Ct%5Ctfor%20i%20in%20range%28len%28path%29%20-%201%29%3A%5Cn%5Ct%5Ct%5Ctnew_path%20%2B%3D%20path%5Bi%5D%20%2B%20%27%2F%27%5Cn%5Ct%5Ct%23%20Remove%20trailing%20backslash%2C%20unless%20you%20are%20in%20the%20top%20level%20directory%20%27%2F%27%5Cn%5Ct%5Ctif%20len%28new_path%29%20%3E%201%3A%5Cn%5Ct%5Ct%5Ctnew_path%20%3D%20new_path%5B%3A-1%5D%5Cn%5Ct%5Ct%23%20Build%20the%20directory%20for%20the%20new%20path%20and%20send%20it%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctsender.superview.list_source.items%20%3D%20build_directory%28new_path%29%5Cn%5Ct%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ct%5Ctsender.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%23%20If%20the%20new%20path%20leaves%20you%20at%20the%20top%20level%20directory%2C%20disable%20the%20back%20button%5Cn%5Ct%5Ctif%20new_path%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ctsender.enabled%20%3D%20False%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Plus%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20plus_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.button1.title%20%3D%20%27Upload%20File%20in%20Editor%27%5Cn%5Ctsender.superview.button1.action%20%3D%20upload_file_in_editor%5Cn%5Ctsender.superview.button2.title%20%3D%20%27New%20folder%27%5Cn%5Ctsender.superview.button2.action%20%3D%20new_folder%5Cn%5Ctsender.superview.button3.title%20%3D%20%27Upload%20Image%27%5Cn%5Ctsender.superview.button3.action%20%3D%20upload_image_button_tapped%5Cn%5Ctsender.superview.button4.title%20%3D%20%27Run%20Custom%20Code%27%5Cn%5Ctsender.superview.button5.title%20%3D%20%27Upload%20Dropbox%20File%27%5Cn%5Ctsender.superview.button6.title%20%3D%20%27Upload%20Local%20File%27%5Cn%5Ctsender.superview.button3.hidden%20%3D%20False%5Cn%5Ctsender.superview.button4.hidden%20%3D%20True%5Cn%5Ctsender.superview.button5.hidden%20%3D%20True%5Cn%5Ctsender.superview.button6.hidden%20%3D%20True%5Cn%5Ctsender.superview.button7.hidden%20%3D%20True%5Cn%5Ctsender.superview.button8.hidden%20%3D%20True%5Cn%5Ctsender.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-plus-24%27%29%5Cn%5Ctsender.superview.file_label.text%20%3D%20sender.superview.path_field.text%5Cn%5Ctsender.superview.button_actions.hidden%20%3D%20False%5Cn%5Ctsender.superview.plus_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.close_button.center%20%3D%20%28sender.superview.width%2F2%2C155%29%5Cn%5Ctif%20sender.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ctsender.superview.scroll_buttons.content_size%20%3D%20%28sender.superview.width%2C%20207%29%5Cn%5Ctsender.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Home%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20home_button_tapped%28sender%29%3A%5Cn%5Ctif%20not%20sender.superview.secondary_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.secondary_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ctif%20not%20sender.superview.button_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.button_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.list_source.items%20%3D%20build_directory%28%29%5Cn%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ctsender.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Button%20Actions%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20close_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Cndef%20cancel_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Cndef%20copy_path_button_tapped%28sender%29%3A%5Cn%5Ctclipboard.set%28sender.superview.superview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ctconsole.hud_alert%28%27Copied%27%2C%20%27success%27%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Plus%20Button%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20upload_file_in_editor%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27upload%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Upload%20File%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20upload_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20upload_file%28sender%29%3A%5Cn%5Ctfilename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Cttext%20%3D%20editor.get_text%28%29%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.create_and_upload_file%28filename%2C%20text%2C%20path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Cndef%20new_folder%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27new_folder%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Create%20Folder%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20create_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20create_folder%28sender%29%3A%5Cn%5Ctfoldername%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20foldername%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.mkd%28path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Folder%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Ct%5Cndef%20upload_image_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27new_image%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Show%20Image%20Picker%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20upload_image%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cn%40ui.in_background%5Cndef%20upload_image%28sender%29%3A%5Cn%5Ctimagename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.upload_image%28imagename%2C%20path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20File%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20open_button_tapped%28sender%29%3A%5Cn%5Ctfile_contents%20%3D%20ftp.open_file%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Cteditor.set_file_contents%28sender.superview.superview.superview.file_label.text%2C%20file_contents%2C%20%27local%27%29%5Cn%5Ctwebbrowser.open%28%27editorial%3A%2F%2Fopen%2F%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%3Froot%3Dlocal%27%29%5Cn%5Ctsender.superview.superview.superview.close%28%29%5Cn%5Cndef%20overwrite_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Overwrite%20With%20File%20in%20Editor%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20overwrite_with_file_in_editor%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20overwrite_with_file_in_editor%28sender%29%3A%5Cn%5Ctfilename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Cttext%20%3D%20editor.get_text%28%29%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctftp.overwrite_file%28filename%2C%20text%2C%20path%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cndef%20rename_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27file%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Rename%20File%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20rename_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20Action%5Cndef%20rename_file%28sender%29%3A%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.rename%28sender.superview.superview.superview.file_label.name%2C%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Cndef%20delete_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Permanently%20Delete%20File%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20permanently_delete_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20permanently_delete_file%28sender%29%3A%5Cn%5Ctftp.ftp.delete%28sender.superview.superview.superview.file_label.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cndef%20move_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.back_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.home_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28sender.superview.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ctsender.superview.superview.superview.move_table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_back_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_cancel_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.action%20%3D%20file_select_folder_button_tapped%5Cn%5Ctsender.superview.superview.superview.move_label_background.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.table_view.hidden%20%3D%20True%5Cn%23%20Secondary%20action%5Cndef%20file_select_folder_button_tapped%28sender%29%3A%5Cn%5Ctftp.move_file%28sender.superview.superview.file_label.text%2C%20sender.superview.superview.path_field.text%2C%20sender.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.path_field.text%29%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_cancel_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ct%5Cndef%20duplicate_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Duplicate%20File%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20duplicate_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20duplicate_file%28sender%29%3A%5Cn%5Ctftp.duplicate_file%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Folder%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20rename_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27folder%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Rename%20Folder%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20rename_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20rename_folder%28sender%29%3A%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.rename%28sender.superview.superview.superview.file_label.name%2C%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Folder%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Cndef%20delete_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Delete%20Folder%20%26%20Contents%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20permanently_delete_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20permanently_delete_folder%28sender%29%3A%5Cn%5Ctftp.delete_folder%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Cndef%20move_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.back_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.home_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28sender.superview.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ctsender.superview.superview.superview.move_table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_back_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_cancel_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.action%20%3D%20folder_select_folder_button_tapped%5Cn%5Ctsender.superview.superview.superview.move_label_background.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.table_view.hidden%20%3D%20True%5Cn%23%20Secondary%20action%5Cndef%20folder_select_folder_button_tapped%28sender%29%3A%5Cn%5Ctftp.move_folder%28sender.superview.superview.file_label.text%2C%20sender.superview.superview.path_field.text%2C%20sender.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.path_field.text%29%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_cancel_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ct%5Cndef%20duplicate_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Duplicate%20Folder%20%26%20Contents%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20duplicate_entire_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20duplicate_entire_folder%28sender%29%3A%5Cn%5Ctftp.duplicate_folder%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Delegates%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Navigation%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20navigation_delegate%28%29%3A%5Cn%5Ctdef%20tableview_did_select%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20folder...%5Cn%5Ct%5Ctif%20tableview.data_source.items%5Brow%5D%5B%27accessory_type%27%5D%20%21%3D%20%27none%27%3A%5Cn%5Ct%5Ct%5Ct%23%20Build%20the%20new%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.path_field.text%5B-1%3A%5D%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.list_source.items%20%3D%20build_directory%28tableview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.list_source.items%20%3D%20build_directory%28tableview.superview.path_field.text%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ct%23%20Set%20text%20field%20to%20display%20new%20path%5Cn%5Ct%5Ct%5Cttableview.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Ct%23%20Enable%20the%20back%20button%20if%20you%20are%20no%20longer%20on%20the%20top%20level%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.path_field.text%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20file...%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Cttableview.superview.button1.title%20%3D%20%27Download%20%26%20Open%27%5Cn%5Ct%5Ct%5Cttableview.superview.button1.action%20%3D%20open_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button2.title%20%3D%20%27Overwrite%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button2.action%20%3D%20overwrite_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button3.title%20%3D%20%27Rename%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button3.action%20%3D%20rename_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button4.title%20%3D%20%27Delete%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button4.action%20%3D%20delete_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button5.title%20%3D%20%27Move%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button5.action%20%3D%20move_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button6.title%20%3D%20%27Duplicate%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button6.action%20%3D%20duplicate_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button7.title%20%3D%20%27Copy%20File%20Path%27%5Cn%5Ct%5Ct%5Cttableview.superview.button7.action%20%3D%20copy_path_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button3.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button4.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button5.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button6.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button7.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button8.hidden%20%3D%20True%5Cn%5Ct%5Ct%5Cttableview.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-document-24%27%29%5Cn%5Ct%5Ct%5Cttableview.superview.file_label.text%20%3D%20selection%5Cn%5Ct%5Ct%5Cttableview.superview.button_actions.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.plus_button.enabled%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Ct%5Cttableview.superview.close_button.center%20%3D%20%28tableview.superview.width%2F2%2C272%29%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_size%20%3D%20%28tableview.superview.width%2C%20325%29%5Cn%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Ct%5Cn%5Ctdef%20tableview_accessory_button_tapped%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Cttableview.superview.button1.title%20%3D%20%27Rename%20Folder%27%5Cn%5Ct%5Cttableview.superview.button1.action%20%3D%20rename_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button2.title%20%3D%20%27Delete%20Folder%27%5Cn%5Ct%5Cttableview.superview.button2.action%20%3D%20delete_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button3.title%20%3D%20%27Move%20Folder%27%5Cn%5Ct%5Cttableview.superview.button3.action%20%3D%20move_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button4.title%20%3D%20%27Duplicate%20Folder%27%5Cn%5Ct%5Cttableview.superview.button4.action%20%3D%20duplicate_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button5.title%20%3D%20%27Copy%20Folder%20Path%27%5Cn%5Ct%5Cttableview.superview.button5.action%20%3D%20copy_path_button_tapped%5Cn%5Ct%5Cttableview.superview.button3.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button4.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button5.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button6.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.button7.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.button8.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-folder-24%27%29%5Cn%5Ct%5Cttableview.superview.file_label.text%20%3D%20selection%5Cn%5Ct%5Cttableview.superview.button_actions.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.plus_button.enabled%20%3D%20False%5Cn%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Cttableview.superview.close_button.center%20%3D%20%28tableview.superview.width%2F2%2C213%29%5Cn%5Ct%5Ctif%20tableview.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_size%20%3D%20%28tableview.superview.width%2C%20266%29%5Cn%5Ct%5Cttableview.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Path%20Field%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20path_navigation_delegate%28%29%3A%5Cn%5Ctdef%20textfield_should_begin_editing%28self%2Ctextfield%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ct%23%20When%20user%20hits%20return%20after%20editing%20TextField...%5Cn%5Ctdef%20textfield_should_return%28self%2Ctextfield%29%3A%5Cn%5Ct%5Ct%23%20Get%20the%20current%20path%20from%20the%20text%20field%5Cn%5Ct%5Ctself.path%20%3D%20textfield.text%5Cn%5Ct%5Ct%23%20Test%20to%20see%20if%20the%20new%20path%20is%20a%20valid%20directory...%5Cn%5Ct%5Cttry%3A%5Cn%5Ct%5Ct%5Ct%23%20If%20it%20is%2C%20build%20that%20directory%20and%20load%20it%20into%20the%20ListDataSource%20element%5Cn%5Ct%5Ct%5Cttextfield.superview.list_source.items%20%3D%20build_directory%28self.path%29%5Cn%5Ct%5Ctexcept%3A%5Cn%5Ct%5Ct%5Ct%23%20If%20it%20is%20not%20a%20valid%20path%2C%20alert%20the%20user%20and%20reset%20the%20path%20in%20the%20TextField%20to%20what%20it%20was%20previously%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27Directory%20%5C%5C%27%27%20%2B%20self.path%20%2B%20%27%5C%5C%27%20Does%20Not%20Seem%20To%20Exist%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Cttextfield.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Cttextfield.end_editing%28%29%5Cn%5Ct%23%20If%20keyboard%20is%20dismissed%20without%20return%20being%20hit%2C%20reset%20the%20path%20in%20the%20TextField%20to%20the%20current%20directory%5Cn%5Ctdef%20textfield_did_end_editing%28self%2Ctextfield%29%3A%5Cn%5Ct%5Cttextfield.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20File%20Label%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20file_label_delegate%28%29%3A%5Cn%5Ctdef%20__init__%28self%2C%20textview%2C%20type%29%3A%5Cn%5Ct%5Ctself.type%20%3D%20type%5Cn%5Ctdef%20textview_should_begin_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ctdef%20textview_did_begin_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctif%20self.type%20%3D%3D%20%27upload%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27filename.txt%27%5Cn%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_folder%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27foldername%27%5Cn%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27imagename.png%27%5Cn%5Ctdef%20textview_did_end_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Cttextview.text%20%3D%20textview.name%5Cn%5Ctdef%20textview_should_change%28self%2C%20textview%2C%20range%2C%20replacement%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ctdef%20textview_did_change%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctif%20self.type%20%3D%3D%20%27upload%27%20or%20self.type%20%3D%3D%20%27new_folder%27%20or%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctif%20%27%5C%5Cn%27%20in%20textview.text%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20textview.text.rstrip%28%27%5C%5Cn%27%29%5Cn%5Ct%5Ct%5Cttextview.end_editing%28%29%5Cn%5Ct%5Ct%5Ctif%20textview.superview.superview.secondary_button1.enabled%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20self.type%20%3D%3D%20%27folder%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctrename_folder%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctrename_file%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27upload%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctupload_file_in_editor%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_folder%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctcreate_folder%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctupload_image%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ctif%20self.type%20%21%3D%20%27upload%27%20and%20self.type%20%21%3D%20%27new_folder%27%20and%20self.type%20%21%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Ctif%20textview.text%20%21%3D%20textview.name%3A%5Cn%5Ct%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctdef%20textview_did_change_selection%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctpass%5Cn%5Ct%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Move%20File%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20move_delegate%28%29%3A%5Cn%5Ctdef%20tableview_did_select%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20folder...%5Cn%5Ct%5Ctif%20tableview.data_source.items%5Brow%5D%5B%27accessory_type%27%5D%20%21%3D%20%27none%27%3A%5Cn%5Ct%5Ct%5Ct%23%20Build%20the%20new%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.superview.move_path_field.text%5B-1%3A%5D%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28tableview.superview.superview.move_path_field.text%20%2B%20%27%2F%27%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_list_source.items%20%3D%20build_directory%28tableview.superview.superview.move_path_field.text%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ct%23%20Set%20text%20field%20to%20display%20new%20path%5Cn%5Ct%5Ct%5Cttableview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Cttableview.superview.superview.select_folder.title%20%3D%20%20%27Move%20to%20%5C%5C%27%27%20%2B%20tableview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ct%5Ct%5Ct%23%20Enable%20the%20back%20button%20if%20you%20are%20no%20longer%20on%20the%20top%20level%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.superview.move_path_field.text%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_back_button.enabled%20%3D%20True%5Cn%5Cn%23%20Build%20directory%20to%20be%20displayed%20in%20rows%20of%20TableView%20for%20moving%20files%5Cndef%20build_move_directory%28path%3Dparams%5B%27Initial_Path%27%5D%29%3A%5Cn%5Ct%23%20Get%20directory%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ctlist_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ctsource_list%20%3D%20%5B%5D%5Cn%5Ct%23%20Pull%20data%20from%20list_items%20and%20prepare%20a%20list%20of%20dictionaries%20readable%20by%20ListDataSource%20element%5Cn%5Ctfor%20item%20in%20list_items%3A%5Cn%5Ct%5Ctd%20%3D%20%7B%7D%5Cn%5Ct%5Ctd%5B%27title%27%5D%20%3D%20list_items%5Bitem%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20For%20files%2C%20do%20not%20include%20accessory%20action%20icons%20in%20their%20rows%2C%20but%20mark%20them%20with%20file%20icons%5Cn%5Ct%5Ctif%20list_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27none%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-document-24%27%5Cn%5Ct%5Ct%23%20For%20folders%2C%20add%20chevron%20arrow%20accessory%20action%20icons%20to%20rows%20and%20mark%20with%20folder%20icons%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27disclosure_indicator%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-folder-24%27%5Cn%5Ct%5Ct%23%20Add%20each%20prepared%20dictionary%20to%20overall%20list%20of%20dictionaries%5Cn%5Ct%5Ctif%20d%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ctsource_list.append%28d%29%5Cn%5Ct%23%20Return%20list%20of%20dictionaries%20with%20all%20files%20and%20folders%20properly%20flagged%5Ct%5Cn%5Ctreturn%20source_list%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Move%20File%2FFolder%20Buttons%20%23%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20move_back_button_tapped%28sender%29%3A%5Cn%5Ct%23%20Get%20current%20path%5Cn%5Ctpath%20%3D%20sender.superview.superview.move_path_field.text%5Cn%5Ct%23%20Split%20the%20path%20at%20slashes%5Cn%5Ctpath%20%3D%20path.split%28%27%2F%27%29%5Cn%5Ctnew_path%20%3D%20%27%27%5Cn%5Ct%23%20Put%20the%20path%20back%20together%20with%20slashes%2C%20but%20leave%20the%20final%20path%20item%20removed%20%28path%20is%20back%20one%20level%29%5Cn%5Ctfor%20i%20in%20range%28len%28path%29%20-%201%29%3A%5Cn%5Ct%5Ctnew_path%20%2B%3D%20path%5Bi%5D%20%2B%20%27%2F%27%5Cn%5Ct%23%20Remove%20trailing%20backslash%2C%20unless%20you%20are%20in%20the%20top%20level%20directory%20%27%2F%27%5Cn%5Ctif%20len%28new_path%29%20%3E%201%3A%5Cn%5Ct%5Ctnew_path%20%3D%20new_path%5B%3A-1%5D%5Cn%5Ct%23%20Build%20the%20directory%20for%20the%20new%20path%20and%20send%20it%20to%20the%20ListDataSource%20element%5Cn%5Ctsender.superview.superview.move_list_source.items%20%3D%20build_move_directory%28new_path%29%5Cn%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ctsender.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ct%23%20If%20the%20new%20path%20leaves%20you%20at%20the%20top%20level%20directory%2C%20disable%20the%20back%20button%5Cn%5Ctif%20new_path%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ctsender.enabled%20%3D%20False%5Cn%5Ct%5Ct%5Cndef%20move_cancel_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.select_folder.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20User%20Interface%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20FTP_Client%28ui.View%29%3A%5Cn%5Ctdef%20__init__%28self%2Cdata_source%29%3A%5Cn%5Ct%5Ct%23%20Set%20up%20the%20view%5Cn%5Ct%5Ctself.bounds%20%3D%20%280%2C0%2C320%2C500%29%5Cn%5Ct%5Ctself.background_color%20%3D%20%27%23F6F6F6%27%5Cn%5Ct%5Ctself.name%20%3D%20%27FTP_Client%27%5Cn%5Ct%5Ct%23%20Set%20up%20the%20loading%20icon%5Cn%5Ct%5Ctself.loading_view%20%3D%20ui.ActivityIndicator%28%29%5Cn%5Ct%5Ctself.loading_view.center%20%3D%20%28self.width%20%2F%202%2C%20self.height%20%2F%202%29%5Cn%5Ct%5Ctself.loading_view.style%20%3D%20ui.ACTIVITY_INDICATOR_STYLE_GRAY%5Cn%5Ct%5Ctself.add_subview%28self.loading_view%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TextField%20where%20the%20path%20will%20be%20displayed%5Cn%5Ct%5Ctself.path_field%20%3D%20ui.TextField%28%29%5Cn%5Ct%5Ctself.path_field.placeholder%20%3D%20%27%2F%27%5Cn%5Ct%5Ctself.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ctself.path_field.frame%20%3D%20%2815%2C60%2Cself.width-30%2C32%29%20%23%20Define%20the%20field%27s%20coordinates%20and%20measurments%5Cn%5Ct%5Ctself.path_field.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Ctself.path_field.delegate%20%3D%20path_navigation_delegate%28%29%20%23%20Set%20up%20the%20TextField%27s%20delegate%5Cn%5Ct%5Ctself.add_subview%28self.path_field%29%5Cn%5Ct%5Ctnav_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctnav_background.frame%20%3D%20%2847%2C0%2Cself.width%2C50%29%5Cn%5Ct%5Ctnav_background.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctnav_background.center%20%3D%20%28self.width%2F2%2C25%29%5Cn%5Ct%5Ctnav_background.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Ctnav_background.send_to_back%28%29%5Cn%5Ct%5Ctself.add_subview%28nav_background%29%5Cn%5Ct%5Cttitle%20%3D%20ui.Label%28%29%5Cn%5Ct%5Cttitle.text%20%3D%20params%5B%27FTP_Server%27%5D%20%23%20Text%20to%20display%20on%20title%20bar%5Cn%5Ct%5Cttitle.frame%20%3D%20%2847%2C0%2Cself.width-128%2C50%29%5Cn%5Ct%5Cttitle.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Cttitle.center%20%3D%20%28self.width%2F2%2B15%2C25%29%5Cn%5Ct%5Cttitle.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Cttitle.send_to_back%28%29%5Cn%5Ct%5Ctself.add_subview%28title%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20back%20button%5Cn%5Ct%5Ctself.back_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.back_button.image%20%3D%20ui.Image.named%28%27ionicons-chevron-left-24%27%29%5Cn%5Ct%5Ctself.back_button.frame%20%3D%20%2810%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.back_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.back_button.action%20%3D%20back_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20back_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.back_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20plus%20button%5Cn%5Ct%5Ctself.plus_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.plus_button.image%20%3D%20ui.Image.named%28%27ionicons-plus-24%27%29%5Cn%5Ct%5Ctself.plus_button.frame%20%3D%20%28275%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.plus_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.plus_button.action%20%3D%20plus_button_tapped%20%23%20Set%20the%20plus%20button%27s%20action%20to%20plus_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.plus_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20home%20button%5Cn%5Ct%5Ctself.home_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.home_button.image%20%3D%20ui.Image.named%28%27ionicons-home-24%27%29%5Cn%5Ct%5Ctself.home_button.frame%20%3D%20%2845%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.home_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.home_button.action%20%3D%20home_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20back_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.home_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20data%20source%20element%20for%20the%20TableView%5Cn%5Ct%5Ctself.list_source%20%3D%20ui.ListDataSource%28items%3D%5B%5D%29%5Cn%5Ct%5Ctself.list_source.move_enabled%20%3D%20False%5Cn%5Ct%5Ctself.list_source.delete_enabled%20%3D%20False%5Cn%5Ct%5Ctself.list_source.items%20%3D%20data_source%20%23%20Set%20data%20source%20to%20the%20element%20that%20will%20be%20passed%20into%20this%20class%20upon%20initiation%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TableView%5Cn%5Ct%5Ctself.table_view%20%3D%20ui.TableView%28%29%5Cn%5Ct%5Ctself.table_view.row_height%20%3D%2044%5Cn%5Ct%5Ctself.table_view.delegate%20%3D%20navigation_delegate%28%29%20%23%20Link%20the%20navigation%20delegate%5Cn%5Ct%5Ctself.table_view.frame%20%3D%20%280%2C100%2Cself.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.table_view.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.table_view.data_source%20%3D%20self.list_source%20%23%20Set%20the%20data%20source%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctself.add_subview%28self.table_view%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20view%20for%20button%20actions%5Cn%5Ct%5Ctself.button_actions%20%3D%20ui.View%28%29%5Cn%5Ct%5Ctself.button_actions.bounds%20%3D%20%280%2C0%2C320%2C460%29%5Cn%5Ct%5Ctself.button_actions.center%20%3D%20%28self.width%2F2%2Cself.height%2F2%2B40%29%5Cn%5Ct%5Ctself.button_actions.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.button_actions.name%20%3D%20%27button_actions%27%5Cn%5Ct%5Ctself.button_actions.flex%20%3D%20%27WH%27%5Cn%5Ct%5Ctself.button_actions.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.button_actions.hidden%20%3D%20True%20%23%20Hide%20view%20until%20needed%5Cn%5Ct%5Ctself.add_subview%28self.button_actions%29%5Cn%5Ct%5Ctself.label_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctself.label_background.text%20%3D%20%27%27%5Cn%5Ct%5Ctself.label_background.frame%20%3D%20%280%2C0%2Cself.width%2C50%29%5Cn%5Ct%5Ctself.label_background.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.label_background.background_color%20%3D%20%27%23f8f8f8%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.label_background%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20title%20label%20to%20display%20which%20file%20was%20selected%5Cn%5Ct%5Ctself.file_label%20%3D%20ui.TextView%28%29%5Cn%5Ct%5Ctself.file_label.font%20%3D%20%28%27%3Csystem%3E%27%2C%2018%29%5Cn%5Ct%5Ctself.file_label.frame%20%3D%20%280%2C0%2Cself.width-55%2C45%29%5Cn%5Ct%5Ctself.file_label.center%20%3D%20%28self.width%2F2%2B25%2Cself.height%2F8-25%29%5Cn%5Ct%5Ctself.file_label.background_color%20%3D%20%27%23f8f8f8%27%5Cn%5Ct%5Ctself.file_label.alignment%20%3D%20ui.ALIGN_LEFT%5Cn%5Ct%5Ctself.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.file_label%29%5Cn%5Ct%5Ctself.file_icon%20%3D%20ui.ImageView%28%29%5Cn%5Ct%5Ctself.file_icon.frame%20%3D%20%280%2C0%2C23%2C23%29%5Cn%5Ct%5Ctself.file_icon.center%20%3D%20%2830%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.file_icon%29%5Cn%5Ct%5Ct%23%20Set%20up%20scroll%20view%20so%20all%20buttons%20can%20be%20accessed%20if%20keyboard%20is%20up%5Cn%5Ct%5Ctself.scroll_buttons%20%3D%20ui.ScrollView%28%29%5Cn%5Ct%5Ctself.scroll_buttons.frame%20%3D%20%280%2C58%2Cself.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.scroll_buttons.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.scroll_buttons.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.scroll_buttons.always_bounce_vertical%20%3D%20True%5Cn%5Ct%5Ctself.scroll_buttons.bounces%20%3D%20True%5Cn%5Ct%5Ctself.scroll_buttons.content_size%20%3D%20%28self.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.scroll_buttons.paging_enabled%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.scroll_buttons%29%5Cn%5Ct%5Ct%23%20Set%20up%20button1%5Cn%5Ct%5Ctself.button1%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button1.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button1.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8-27%29%5Cn%5Ct%5Ctself.button1.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button1%29%5Cn%5Ct%5Ct%23%20Set%20up%20button2%5Cn%5Ct%5Ctself.button2%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button2.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button2.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8-27%29%5Cn%5Ct%5Ctself.button2.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button2.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button2%29%5Cn%5Ct%5Ct%23%20Set%20up%20button3%5Cn%5Ct%5Ctself.button3%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button3.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button3.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B32%29%5Cn%5Ct%5Ctself.button3.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button3.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button3%29%5Cn%5Ct%5Ct%23%20Set%20up%20button4%5Cn%5Ct%5Ctself.button4%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button4.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button4.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B32%29%5Cn%5Ct%5Ctself.button4.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button4.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button4%29%5Cn%5Ct%5Ct%23%20Set%20up%20button5%5Cn%5Ct%5Ctself.button5%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button5.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button5.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B91%29%5Cn%5Ct%5Ctself.button5.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button5.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button5%29%5Cn%5Ct%5Ct%23%20Set%20up%20button6%5Cn%5Ct%5Ctself.button6%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button6.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button6.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B91%29%5Cn%5Ct%5Ctself.button6.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button6.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button6%29%5Cn%5Ct%5Ct%23%20Set%20up%20button7%5Cn%5Ct%5Ctself.button7%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button7.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button7.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B150%29%5Cn%5Ct%5Ctself.button7.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button7.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button7%29%5Cn%5Ct%5Ct%23%20Set%20up%20button8%5Cn%5Ct%5Ctself.button8%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button8.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button8.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B150%29%5Cn%5Ct%5Ctself.button8.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button8.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button8%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20close%20button%20to%20dismiss%20the%20button%20actions%20view%5Cn%5Ct%5Ctself.close_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.close_button.title%20%3D%20%27Close%27%5Cn%5Ct%5Ctself.close_button.frame%20%3D%20%280%2C15%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.close_button.center%20%3D%20%28self.width%2F2%2Cself.height%2F8%2B210%29%5Cn%5Ct%5Ctself.close_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.close_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.close_button.action%20%3D%20close_button_tapped%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.close_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20view%20for%20secondary%20actions%5Cn%5Ct%5Ctself.secondary_actions%20%3D%20ui.View%28%29%5Cn%5Ct%5Ctself.secondary_actions.bounds%20%3D%20%280%2C0%2C320%2C460%29%5Cn%5Ct%5Ctself.secondary_actions.center%20%3D%20%28self.width%2F2%2Cself.height%2F2%2B40%29%5Cn%5Ct%5Ctself.secondary_actions.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.secondary_actions.name%20%3D%20%27secondary_actions%27%5Cn%5Ct%5Ctself.secondary_actions.flex%20%3D%20%27WH%27%5Cn%5Ct%5Ctself.secondary_actions.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.secondary_actions.hidden%20%3D%20True%20%23%20Hide%20view%20until%20needed%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.secondary_actions%29%5Cn%5Ct%5Ct%23%20Set%20up%20Secondary%20button1%5Cn%5Ct%5Ctself.secondary_button1%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.secondary_button1.frame%20%3D%20%280%2C15%2Cself.width-21%2C50%29%5Cn%5Ct%5Ctself.secondary_button1.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-29%29%5Cn%5Ct%5Ctself.secondary_button1.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.secondary_button1.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.secondary_actions.add_subview%28self.secondary_button1%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20cancel%20button%20to%20dismiss%20the%20secondary%20actions%20view%5Cn%5Ct%5Ctself.cancel_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.cancel_button.title%20%3D%20%27Cancel%27%5Cn%5Ct%5Ctself.cancel_button.frame%20%3D%20%280%2C15%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.cancel_button.center%20%3D%20%28self.width%2F2%2C94%29%5Cn%5Ct%5Ctself.cancel_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.cancel_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.cancel_button.action%20%3D%20cancel_button_tapped%5Cn%5Ct%5Ctself.secondary_actions.add_subview%28self.cancel_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20data%20source%20element%20for%20the%20TableView%20for%20moving%20files%5Cn%5Ct%5Ctself.move_list_source%20%3D%20ui.ListDataSource%28items%3D%5B%5D%29%5Cn%5Ct%5Ctself.move_list_source.move_enabled%20%3D%20False%5Cn%5Ct%5Ctself.move_list_source.delete_enabled%20%3D%20False%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TableView%20for%20Moving%20Files%5Cn%5Ct%5Ctself.move_table_view%20%3D%20ui.TableView%28%29%5Cn%5Ct%5Ctself.move_table_view.row_height%20%3D%2044%5Cn%5Ct%5Ctself.move_table_view.delegate%20%3D%20move_delegate%28%29%20%23%20Link%20the%20navigation%20delegate%20for%20moving%20files%5Cn%5Ct%5Ctself.move_table_view.frame%20%3D%20%280%2C127%2Cself.width%2C%20self.height%20-%20185%29%5Cn%5Ct%5Ctself.move_table_view.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.move_table_view.data_source%20%3D%20self.move_list_source%20%23%20Set%20the%20data%20source%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctself.move_table_view.hidden%20%3D%20True%5Cn%5Ct%5Ctself.move_table_view.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.move_table_view.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_table_view%29%5Cn%5Ct%5Ctself.move_label_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctself.move_label_background.text%20%3D%20%27%27%5Cn%5Ct%5Ctself.move_label_background.frame%20%3D%20%280%2C0%2Cself.width%2C170%29%5Cn%5Ct%5Ctself.move_label_background.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.move_label_background.hidden%20%3D%20True%5Cn%5Ct%5Ctself.move_label_background.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_label_background%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20button%20to%20select%20folder%20to%20move%20file%20into%5Cn%5Ct%5Ctself.select_folder%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.select_folder.frame%20%3D%20%280%2C0%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.select_folder.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.select_folder.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.select_folder.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.select_folder%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20back%20button%20for%20the%20move%20file%20view%5Cn%5Ct%5Ctself.move_back_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.move_back_button.image%20%3D%20ui.Image.named%28%27ionicons-chevron-left-24%27%29%5Cn%5Ct%5Ctself.move_back_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.move_back_button.frame%20%3D%20%2810%2C69%2C50%2C50%29%5Cn%5Ct%5Ctself.move_back_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.move_back_button.action%20%3D%20move_back_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20move_back_button_tapped%20function%5Cn%5Ct%5Ctself.move_back_button.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_back_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20cancel%20button%20to%20dismiss%20the%20move%20file%20view%5Cn%5Ct%5Ctself.move_cancel_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.move_cancel_button.title%20%3D%20%27Cancel%27%5Cn%5Ct%5Ctself.move_cancel_button.frame%20%3D%20%280%2C15%2Cself.width-80%2C50%29%5Cn%5Ct%5Ctself.move_cancel_button.center%20%3D%20%28self.width%2F2%2B30%2Cself.height%2F8%2B31%29%5Cn%5Ct%5Ctself.move_cancel_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.move_cancel_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.move_cancel_button.action%20%3D%20move_cancel_button_tapped%5Cn%5Ct%5Ctself.move_cancel_button.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_cancel_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TextField%20where%20the%20current%20path%20will%20be%20held%5Cn%5Ct%5Ctself.move_path_field%20%3D%20ui.TextField%28%29%5Cn%5Ct%5Ctself.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ctself.move_path_field.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_path_field%29%5Cn%5Cn%23%20Build%20the%20initial%20directory%20and%20store%20it%20to%20the%20source_list%20variable%5Cnsource_list%20%3D%20build_directory%28%29%5Cn%5Cn%23%20Initiate%20the%20view%20and%20pass%20it%20the%20source_list%5Cnview%20%3D%20FTP_Client%28source_list%29%5Cn%23%20Present%20the%20view%20in%20a%20popover%5Cnview.present%28style%20%3D%20%27popover%27%2C%20hide_title_bar%20%3D%20True%29%5Cn%22%2C%20%2226DF96A7-B364-42B8-93AE-439D0650676A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A9D399AD-1AE7-453D-9F37-9B66FE3DF0A9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227C719344-C891-4AB0-95AE-A113A91D1248%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221E45370D-12DA-4162-BE1D-00E57FD826A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226BB5C954-DACE-44BC-BAA5-BA386343A159%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2293D7ECD9-8FF4-4ED4-910A-1024DFFA875F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223D76ECEE-8D86-4F1F-B6CE-161124D878F3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2215E08D0D-F62D-4AC0-92EF-A2809B7DFBB6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F276A4A8-DABC-4867-A241-5D85D5A2F8D4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229EF136C5-4458-4EC1-8B41-2CEC520138DB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E4A933E5-76E4-4B94-8996-0AEEF41399E8%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226A5B2A56-80C7-4E7B-8E2F-EBF2993ED68B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226D17DF79-ECA4-4EF9-B5D2-1AAB32E34D11%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DD306F77-489E-4A09-BAAD-01E9D233934E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ui%22%3A%20%22%5B%7B%5C%22class%5C%22%3A%5C%22View%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22background_color%5C%22%3A%5C%22RGBA%281.000000%2C1.000000%2C1.000000%2C1.000000%29%5C%22%2C%5C%22tint_color%5C%22%3A%5C%22RGBA%280.000000%2C0.478000%2C1.000000%2C1.000000%29%5C%22%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22flex%5C%22%3A%5C%22%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B0%2C%200%7D%2C%20%7B540%2C%20575%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%7B%5C%22class%5C%22%3A%5C%22View%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22name%5C%22%3A%5C%22view1%5C%22%2C%5C%22uuid%5C%22%3A%5C%22691D7635-ED21-47B1-BB0C-D03DF74DFA8B%5C%22%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22flex%5C%22%3A%5C%22%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B162%2C%20279%7D%2C%20%7B215%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%2C%7B%5C%22class%5C%22%3A%5C%22Button%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22font_size%5C%22%3A15%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22flex%5C%22%3A%5C%22%5C%22%2C%5C%22font_bold%5C%22%3Afalse%2C%5C%22name%5C%22%3A%5C%22button1%5C%22%2C%5C%22uuid%5C%22%3A%5C%22891737B6-0D9F-4C3A-AABF-15D9B73D64AB%5C%22%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22title%5C%22%3A%5C%22Download%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B162%2C%20279%7D%2C%20%7B107%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%2C%7B%5C%22class%5C%22%3A%5C%22Button%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22font_size%5C%22%3A15%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22flex%5C%22%3A%5C%22%5C%22%2C%5C%22font_bold%5C%22%3Afalse%2C%5C%22name%5C%22%3A%5C%22button2%5C%22%2C%5C%22uuid%5C%22%3A%5C%2293DF31A4-D186-45A9-8180-04EB9C517035%5C%22%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22title%5C%22%3A%5C%22Overwrite%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B270%2C%20279%7D%2C%20%7B107%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%5D%7D%5D%22%2C%20%2268A2A40E-0E92-4737-8FF2-F176B3645CBC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D4B85DD2-E06A-467A-9137-868147CB5EF5%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E48FCCAE-719D-4713-936F-4217132FB7F9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BFEAA0EA-62A6-4DA4-976D-493B3F338463%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2207E5006D-CD8C-4383-8BE9-6A8D8F6CCC07%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AA0729B7-4EA3-4539-98A3-9FA5550C5AF3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%5D%2C%20%22name%22%3A%20%22FTP_Client%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone9%2C4%22%2C%20%22systemVersion%22%3A%20%2213.1.2%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-transfer-upload-5.png%22%7D", "description": "This is a custom UI for Editorial which will present a fully featured FTP client in a popup window over the editor.\n\nAfter downloading you will need to tap the Info button next to the workflow, go to the Edit Workflow page, tap on the action block to expand it, and fill in your FTP login credentials in the variables below. Once you've done that just run it from the workflow menu and you should be set.", "title": "FTP_Client"}, {"url": "http://editorial-app.appspot.com/workflow/5847798767419392/ZX-MzKkUbyc", "workflow_data": {"username": "", "description": "This is a custom UI for Editorial which will present a fully featured FTP client in a popup window over the editor.\n\nAfter downloading you will need to tap the Info button next to the workflow, go to the Edit Workflow page, tap on the action block to expand it, and fill in your FTP login credentials in the variables below. Once you've done that just run it from the workflow menu and you should be set.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "FTP UI", "parameters": {"76A5A84D-0561-4834-856C-545D188ABC42": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17F9FFEF-24E7-4B85-80AF-E6FFD48F26E9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "12CB7DEE-EEC1-4FCB-97BF-BBB95A56A03B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17DDDC80-EB5C-4A4A-BE33-F29B1EA496A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3DD56DC4-7B69-49DC-8A3B-2DB7A851AC30": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D74B99FF-2F76-4624-9C02-A0E1785348A5": "", "F953659E-E15A-4FE6-82B4-1BB1CE613B3E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DBA7A162-8790-4615-A5C1-EFF8EB870E0B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "350C4857-3A55-4278-A792-F144FA8B92F1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "D95E75B5-2181-465B-A147-20D14D1B88A7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7B2C7297-7737-47B0-8548-2F6579D63B3A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AF803B87-F589-4DDF-8D61-888339533174": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "74EE867C-63BF-42F5-8F85-2AD1663D9528": "172.16.1.48", "E03DEE1B-0607-4EBE-9F82-434D690A3588": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "B42E2195-685F-4022-B61E-14A19BDACD7D": "angel_augusto", "9B35529B-8F25-4F88-A9B4-781FB250B846": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_parameters__": [{"placeholder": "/", "type": "basicText", "key": "D74B99FF-2F76-4624-9C02-A0E1785348A5", "title": "Initial_Path"}, {"placeholder": "ftp.example.com", "keyboardType": 3, "type": "basicText", "key": "74EE867C-63BF-42F5-8F85-2AD1663D9528", "title": "FTP_Server"}, {"placeholder": "guyot@unapologetic.io", "keyboardType": 7, "type": "basicText", "key": "B42E2195-685F-4022-B61E-14A19BDACD7D", "title": "FTP_Username"}, {"placeholder": "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", "type": "basicText", "key": "FCF40D27-4DB7-4121-97F6-F968A900E92E", "title": "FTP_Password"}], "B8C377DB-C007-491E-9B69-9967410CC875": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "FCF40D27-4DB7-4121-97F6-F968A900E92E": "B2esaL1a", "6E695F21-0664-4FC9-920E-12821330B610": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "17E340BF-6CF0-45D7-AA81-F135B91DE224": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BE013931-6B92-45BB-A3F9-5747D2BD1587": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9C3FFE2C-6C49-46C9-BD53-E5AAAE2BD8CA": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6A2FC1A6-979E-4125-87D1-52EB38FC4527": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "ABBDEFCC-F896-4F7A-B35F-5023B651DD88": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "98F26812-BFCB-4DC1-8FC4-E7282BCAF39A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C8D3ACB2-86C1-479E-979E-666D5FE5BB97": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9E029915-8290-426B-9B8E-326654FA13DC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6A5B2A56-80C7-4E7B-8E2F-EBF2993ED68B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AD8FDF1C-B8D2-48EB-A547-37B910262AAB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F2C3515D-1C29-423D-99C0-95B6FB4887DC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "95FA6C87-6EB6-4562-B4B0-38C99BF57114": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3A9BD136-9079-44AD-89C5-53D329731D83": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1C7EAC87-52E9-42C6-A8C7-18AB70F3FD23": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6C12A397-2296-483B-BE29-87C6F9D8013B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "867B865E-787D-45E1-B3BF-64412F9D6FA4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6CC50A85-8999-47B5-B830-88C48A0443AB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BE54AC05-8D78-4F95-822A-AC4907F58791": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2D8A39CF-8976-4772-A439-9A46FA9C79D3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "2B5E2C3D-F83E-4B48-B316-FFC6DC26E26A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "DBD9CAA1-1A12-4ABE-A9C7-EBBF0D77357E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "CF4A2FE6-4960-4F51-BAE9-3218272C1C6E": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "25171F4E-EB9B-47E7-9902-E3ED071C0362": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "8913248B-FE4C-4839-BD1E-22533BA6586B": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9D387E48-805E-46E4-83A9-30876058FD42": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "90D8071E-9FC5-4FFA-94E6-0BC3006E4236": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "77021432-36A0-48A7-8A82-9C4609E71B23": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "68AE2162-AF92-4CE6-B5E5-A99BA2D7CFB9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "FC89D8BA-5448-455D-BBAC-21F1F0775A66": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E34AD0C6-2E7C-46DF-8E5C-A61D619E4063": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C4ACD630-2532-48C6-88DE-EA95FB7FA074": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "C57929EE-43A1-4384-BF54-95AF57E3552A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "010A0730-7B55-419F-AD63-86DAE22BCFF3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "93D9F4AF-C4DB-4E00-A32E-52AE27A1E174": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BEA876CA-3C94-415F-B229-B5DAC3A68DD7": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1E06CA8B-C928-4F60-8418-D04B6D3E0AA3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "0FE68B9D-5A5D-4746-94A6-E183EEC712E1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E6FC01C2-5EB7-4867-B73C-FA4A657FE032": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "__custom_action_script__": "#coding: utf-8\nimport workflow\nimport ui\nimport console\nimport editor\nimport time\nimport clipboard\nimport photos\nfrom PIL import Image\nfrom io import BytesIO\nimport webbrowser\nfrom ftplib import FTP\n\n# Get the custom parameters as a dictionary (titles are keys):\nparams = workflow.get_parameters()\n# Get the action's input (a string):\naction_in = workflow.get_input()\n\n##############################\n##### FTP Protocol Class #####\n##############################\n\nclass FTP_Instance:\n\tdef __init__(self):\n\t\tself.initial_path = params['Initial_Path']\n\t\tself.ftp = FTP(params['FTP_Server'])\n\t\tself.ftp.login(params['FTP_Username'], params['FTP_Password'])\n\t\tself.ftp.cwd(self.initial_path)\n\n\tdef open_file(self, filename, path):\n\t\tself.ftp.cwd(path)\n\t\ttemp = open('temp', \"wb\")\n\t\tself.ftp.retrbinary('RETR ' + filename, temp.write)\n\t\ttemp.close()\n\t\tread = open('temp', 'r')\n\t\tfile_contents = read.read()\n\t\tread.close()\n\t\treturn file_contents\n\n\tdef check_file_exists(self, filename, path):\n\t\texisting_files = self.ftp.nlst(path)\n\t\treturn filename in existing_files\n\t\t\n\tdef mkd(self, path):\n\t\tchecked_path = ''\n\t\tdirectories = path[1:].split('/')\n\t\tself.ftp.cwd(self.initial_path)\n\t\tfor i in range(len(directories)):\n\t\t\tcurrent_dir = self.ftp.nlst(self.initial_path + checked_path)\n\t\t\tif directories[i] in current_dir:\n\t\t\t\tchecked_path += '/' + directories[i]\n\t\t\t\tself.ftp.cwd(self.initial_path + checked_path)\n\t\t\telse:\n\t\t\t\tchecked_path += '/' + directories[i]\n\t\t\t\tself.ftp.mkd(self.initial_path + checked_path)\n\t\t\t\tself.ftp.cwd(self.initial_path + checked_path)\n\t\t\n\tdef overwrite_file(self, filename, text, path):\n\t\tself.ftp.cwd(path)\n\t\tfile = open('temp', 'w')\n\t\tfile.write(text)\n\t\tfile.close()\n\t\tfile = open('temp', 'r')\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + filename, file)\n\t\tif text != self.open_file(filename,path):\n\t\t\tconsole.hud_alert('File Overwrite Failed', 'error', 5.0)\n\t\telse:\n\t\t\tconsole.hud_alert('File Overwritten', 'success', 5.0)\n\t\tfile.close()\n\t\n\tdef upload_image(self, imagename, path):\n\t\timage = photos.pick_image()\n\t\tbuffer = BytesIO()\n\t\timage.save(buffer, 'PNG')\n\t\tbuffer.seek(0)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + imagename, buffer)\n\t\n\tdef create_and_upload_file(self, filename, text, path):\n\t\tfile = open('temp', 'w')\n\t\tfile.write(text)\n\t\tfile.close()\n\t\tfile = open('temp', 'r')\n\t\tself.upload_file(file, filename, path)\n\t\tfile.close()\n\n\tdef upload_file(self, file, filename, path):\n\t\tif path != '':\n\t\t\tself.mkd(path)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.storbinary('STOR ' + filename, file)\n\n\tdef print_directory(self, path):\n\t\tprint self.ftp.nlst(path)\n\t\t\n\tdef duplicate_file(self, filename, path):\n\t\ti = 1\n\t\tfind_extension = filename.split('.')\n\t\tnew_filename = ''\n\t\tfor n in range(len(find_extension)-1):\n\t\t\tnew_filename += find_extension[n] + '.'\n\t\tnew_filename = new_filename[:-1]\n\t\tcheck_filename = new_filename + '-' + str(i) + '.' + find_extension[n+1]\n\t\tfile_contents = self.open_file(filename, path)\n\t\twhile self.check_file_exists(check_filename, path):\n\t\t\ti += 1\n\t\t\tcheck_filename = new_filename + '-' + str(i) + '.' + find_extension[n+1]\n\t\tself.create_and_upload_file(check_filename, file_contents, path)\n\t\t\n\tdef duplicate_folder(self, foldername, path):\n\t\ti = 1\n\t\tnew_foldername = foldername + '-' + str(i)\n\t\twhile self.check_file_exists(new_foldername, path):\n\t\t\ti += 1\n\t\t\tnew_foldername = foldername + '-' + str(i)\n\t\tself.ftp.mkd(path + '/' + new_foldername)\n\t\t# Get directory to duplicate as dictionary with keys marking items as files or folders\n\t\tdir_items = ftp.directory_with_types(path + '/' + foldername)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], path + '/' + foldername)\n\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, path + '/' + new_foldername)\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\tself.ftp.mkd(path + '/' + new_foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_in_folder = self.ftp.nlst(path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], path + '/' + foldername, path + '/' + new_foldername)\n\t# Helper action\n\tdef duplicate_folder_helper(self, foldername, from_path, to_path):\n\t\t# Get directory to duplicate as dictionary with keys marking items as files or folders\n\t\tdir_items = ftp.directory_with_types(from_path + '/' + foldername)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], from_path + '/' + foldername)\n\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, to_path + '/' + foldername)\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\tself.ftp.mkd(to_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_in_folder = self.ftp.nlst(from_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], from_path + '/' + foldername, to_path + '/' + foldername)\n\n\tdef move_file(self, filename, from_path, to_path):\n\t\tif not self.check_file_exists(filename, to_path):\n\t\t\tfile_contents = self.open_file(filename, from_path)\n\t\t\tself.create_and_upload_file(filename, file_contents, to_path)\n\t\t\tif self.check_file_exists(filename, to_path):\n\t\t\t\tif self.open_file(filename, to_path) == file_contents:\n\t\t\t\t\tself.ftp.cwd(from_path)\n\t\t\t\t\tself.ftp.delete(filename)\n\t\telse:\n\t\t\tconsole.hud_alert('File with same name already exists in this location', 'error', 5.0)\n\t\t\t\n\tdef move_folder(self, foldername, from_path, to_path):\n\t\tall_files_moved = True\n\t\tif not self.check_file_exists(foldername, to_path):\n\t\t\tself.ftp.mkd(to_path + '/' + foldername)\n\t\t\t# Get directory of folder contents to be moved\n\t\t\tdir_items = ftp.directory_with_types(from_path + '/' + foldername)\n\t\t\tfor item in dir_items:\n\t\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\t\tfile_contents = self.open_file(dir_items[item]['title'], from_path + '/' + foldername)\n\t\t\t\t\tself.create_and_upload_file(dir_items[item]['title'], file_contents, to_path + '/' + foldername)\n\t\t\t\t\tif not self.check_file_exists(dir_items[item]['title'], to_path + '/' + foldername):\n\t\t\t\t\t\tall_files_moved = False\n\t\t\t\t\t\tprint 'false'\n\t\t\t\telse:\n\t\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\t\tself.ftp.mkd(to_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\t\titems_in_folder = self.ftp.nlst(from_path + '/' + foldername + '/' + dir_items[item]['title'])\n\t\t\t\t\t\titems_to_duplicate = False\n\t\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\t\titems_to_duplicate = True\n\t\t\t\t\t\tif items_to_duplicate == True:\n\t\t\t\t\t\t\tself.duplicate_folder_helper(dir_items[item]['title'], from_path + '/' + foldername, to_path + '/' + foldername)\n\t\telse:\n\t\t\tconsole.hud_alert('Folder of same name already exists in this location', 'error', 5.0)\n\t\t\treturn\n\t\tif all_files_moved:\n\t\t\tself.delete_folder(foldername, from_path)\n\t\telse:\n\t\t\tconsole.hud_alert('All files may not have been moved', 'error')\n\t\t\t\t\t\t\t\n\tdef delete_folder(self, foldername, path):\n\t\tftp.delete_folder_helper(path + '/' + foldername)\n\t\tftp.ftp.cwd(path)\n\t\tftp.ftp.rmd(foldername)\n\t# Helper action\n\tdef delete_folder_helper(self, path):\n\t\tself.ftp.cwd(path)\n\t\tdir_items = ftp.directory_with_types(path)\n\t\tfor item in dir_items:\n\t\t\tif dir_items[item]['type'] == 'file':\n\t\t\t\tself.ftp.delete(dir_items[item]['title'])\n\t\t\telse:\n\t\t\t\tif dir_items[item]['title'][:1] != '.':\n\t\t\t\t\titems_in_folder = self.ftp.nlst(path + '/' + dir_items[item]['title'])\n\t\t\t\t\titems_inside = False\n\t\t\t\t\tfor folderitem in items_in_folder:\n\t\t\t\t\t\tif folderitem[:1] != '.':\n\t\t\t\t\t\t\titems_inside = True\n\t\t\t\t\tif items_inside == True:\n\t\t\t\t\t\tsave_path = path\n\t\t\t\t\t\tself.delete_folder_helper(path + '/' + dir_items[item]['title'])\n\t\t\t\t\t\tself.ftp.cwd(save_path)\n\t\t\t\t\t\tself.ftp.rmd(dir_items[item]['title'])\n\t\t\t\t\telse:\n\t\t\t\t\t\tself.ftp.rmd(dir_items[item]['title'])\n\t\t\n\tdef directory_with_types(self, path):\n\t\ti = 0\n\t\tdirectory_list = []\n\t\tdirectory_dict = {}\n\t\ttitle_list = self.ftp.nlst(path)\n\t\tself.ftp.cwd(path)\n\t\tself.ftp.retrlines('LIST', callback=directory_list.append)\n\t\tfor item in directory_list:\n\t\t\tif i < len(title_list):\n\t\t\t\tlisting = {}\n\t\t\t\tif item.upper().startswith('D'):\n\t\t\t\t\tlisting['type'] = 'folder'\n\t\t\t\telse:\n\t\t\t\t\tlisting['type'] = 'file'\n\t\t\t\tdirectory_dict[i] = listing\n\t\t\t\tdirectory_dict[i]['title'] = title_list[i]\n\t\t\t\ti += 1\n\t\treturn directory_dict\n\n\tdef quit(self):\n\t\tself.ftp.quit()\n\n##########################\n##### FTP UI Client ######\n##########################\n\n# Initiate FTP Connection\nftp = FTP_Instance()\n\n# Build directory to be displayed in rows of file manager\ndef build_directory(path=params['Initial_Path']):\n\t# Get directory as dictionary with keys marking items as files or folders\n\tlist_items = ftp.directory_with_types(path)\n\tsource_list = []\n\t# Pull data from list_items and prepare a list of dictionaries readable by ListDataSource element\n\tfor item in list_items:\n\t\td = {}\n\t\td['title'] = list_items[item]['title']\n\t\t# For files, do not include accessory action icons in their rows, but mark them with file icons\n\t\tif list_items[item]['type'] == 'file':\n\t\t\td['accessory_type'] = 'none'\n\t\t\td['image'] = 'ionicons-document-24'\n\t\t# For folders, add chevron arrow accessory action icons to rows and mark with folder icons\n\t\telse:\n\t\t\td['accessory_type'] = 'detail_disclosure_button'\n\t\t\td['image'] = 'ionicons-folder-24'\n\t\t# Add each prepared dictionary to overall list of dictionaries\n\t\tif d['title'][:1] != '.':\n\t\t\tsource_list.append(d)\n\t# Return list of dictionaries with all files and folders properly flagged\t\n\treturn source_list\n\n###############\n# Back Button #\n###############\n# Action to be run when user taps the back button in the top left of the UI\ndef back_button_tapped(sender):\n\tif not sender.superview.secondary_actions.hidden:\n\t\tsender.superview.secondary_actions.hidden = True\n\t\tsender.superview.secondary_button1.enabled = True\n\t\tsender.superview.file_label.editable = False\n\t\tbutton_actions_closed = False\n\telif not sender.superview.button_actions.hidden:\n\t\tsender.superview.plus_button.enabled = True\n\t\tsender.superview.button_actions.hidden = True\n\t\tsender.superview.file_label.editable = False\n\t\tbutton_actions_closed = False\n\t\tif sender.superview.path_field.text == '/':\n\t\t\tsender.superview.back_button.enabled = False\n\telse:\n\t\tbutton_actions_closed = True\n\t\n\tif button_actions_closed == True:\n\t\t# Get current path\n\t\tpath = sender.superview.path_field.text\n\t\t# Split the path at slashes\n\t\tpath = path.split('/')\n\t\tnew_path = ''\n\t\t# Put the path back together with slashes, but leave the final path item removed (path is back one level)\n\t\tfor i in range(len(path) - 1):\n\t\t\tnew_path += path[i] + '/'\n\t\t# Remove trailing backslash, unless you are in the top level directory '/'\n\t\tif len(new_path) > 1:\n\t\t\tnew_path = new_path[:-1]\n\t\t# Build the directory for the new path and send it to the ListDataSource element\n\t\tsender.superview.list_source.items = build_directory(new_path)\n\t\t# Adjust the title TextField to display the new path\n\t\tsender.superview.path_field.text = ftp.ftp.pwd()\n\t\t# If the new path leaves you at the top level directory, disable the back button\n\t\tif new_path == '/':\n\t\t\tsender.enabled = False\n\n###############\n# Plus Button #\n###############\ndef plus_button_tapped(sender):\n\tsender.superview.back_button.enabled = True\n\tsender.superview.button1.title = 'Upload File in Editor'\n\tsender.superview.button1.action = upload_file_in_editor\n\tsender.superview.button2.title = 'New folder'\n\tsender.superview.button2.action = new_folder\n\tsender.superview.button3.title = 'Upload Image'\n\tsender.superview.button3.action = upload_image_button_tapped\n\tsender.superview.button4.title = 'Run Custom Code'\n\tsender.superview.button5.title = 'Upload Dropbox File'\n\tsender.superview.button6.title = 'Upload Local File'\n\tsender.superview.button3.hidden = False\n\tsender.superview.button4.hidden = True\n\tsender.superview.button5.hidden = True\n\tsender.superview.button6.hidden = True\n\tsender.superview.button7.hidden = True\n\tsender.superview.button8.hidden = True\n\tsender.superview.file_icon.image = ui.Image.named('ionicons-plus-24')\n\tsender.superview.file_label.text = sender.superview.path_field.text\n\tsender.superview.button_actions.hidden = False\n\tsender.superview.plus_button.enabled = False\n\tsender.superview.close_button.center = (sender.superview.width/2,155)\n\tif sender.superview.height < 500:\n\t\tsender.superview.scroll_buttons.content_size = (sender.superview.width, 207)\n\tsender.superview.scroll_buttons.content_offset = (0,0)\n\t\n###############\n# Home Button #\n###############\ndef home_button_tapped(sender):\n\tif not sender.superview.secondary_actions.hidden:\n\t\tsender.superview.secondary_actions.hidden = True\n\t\tsender.superview.secondary_button1.enabled = True\n\t\tsender.superview.file_label.editable = False\n\tif not sender.superview.button_actions.hidden:\n\t\tsender.superview.plus_button.enabled = True\n\t\tsender.superview.button_actions.hidden = True\n\t\tsender.superview.file_label.editable = False\n\tsender.superview.back_button.enabled = True\n\tsender.superview.list_source.items = build_directory()\n\t# Adjust the title TextField to display the new path\n\tsender.superview.path_field.text = ftp.ftp.pwd()\n\n##########################\n##### Button Actions #####\n##########################\ndef close_button_tapped(sender):\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.hidden = True\n\ndef cancel_button_tapped(sender):\n\tsender.superview.hidden = True\n\tsender.superview.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.superview.file_label.editable = False\n\t\ndef copy_path_button_tapped(sender):\n\tclipboard.set(sender.superview.superview.superview.path_field.text + '/' + sender.superview.superview.superview.file_label.text)\n\tconsole.hud_alert('Copied', 'success')\n\n#######################\n# Plus Button Actions #\n#######################\ndef upload_file_in_editor(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'upload')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Upload File'\n\tsender.superview.superview.superview.secondary_button1.action = upload_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef upload_file(sender):\n\tfilename = sender.superview.superview.superview.file_label.text\n\ttext = editor.get_text()\n\tpath = sender.superview.superview.superview.path_field.text\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.create_and_upload_file(filename, text, path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\ndef new_folder(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'new_folder')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Create Folder'\n\tsender.superview.superview.superview.secondary_button1.action = create_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef create_folder(sender):\n\tfoldername = sender.superview.superview.superview.file_label.text\n\tpath = sender.superview.superview.superview.path_field.text + '/' + foldername\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.mkd(path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('Folder \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\t\ndef upload_image_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'new_image')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Show Image Picker'\n\tsender.superview.superview.superview.secondary_button1.action = upload_image\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\n@ui.in_background\ndef upload_image(sender):\n\timagename = sender.superview.superview.superview.file_label.text\n\tpath = sender.superview.superview.superview.path_field.text\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.upload_image(imagename, path)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.text = sender.superview.superview.superview.file_label.name\n\t\tsender.superview.superview.superview.secondary_button1.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\n################\n# File Actions #\n################\ndef open_button_tapped(sender):\n\tfile_contents = ftp.open_file(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\teditor.set_file_contents(sender.superview.superview.superview.file_label.text, file_contents, 'local')\n\twebbrowser.open('editorial://open/' + sender.superview.superview.superview.file_label.text + '?root=local')\n\tsender.superview.superview.superview.close()\n\ndef overwrite_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Overwrite With File in Editor'\n\tsender.superview.superview.superview.secondary_button1.action = overwrite_with_file_in_editor\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef overwrite_with_file_in_editor(sender):\n\tfilename = sender.superview.superview.superview.file_label.text\n\ttext = editor.get_text()\n\tpath = sender.superview.superview.superview.path_field.text\n\tftp.overwrite_file(filename, text, path)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\ndef rename_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'file')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Rename File'\n\tsender.superview.superview.superview.secondary_button1.action = rename_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary Action\ndef rename_file(sender):\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.rename(sender.superview.superview.superview.file_label.name, sender.superview.superview.superview.file_label.text)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\telse:\n\t\tconsole.hud_alert('File \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\t\ndef delete_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Permanently Delete File?'\n\tsender.superview.superview.superview.secondary_button1.action = permanently_delete_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef permanently_delete_file(sender):\n\tftp.ftp.delete(sender.superview.superview.superview.file_label.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\ndef move_file_button_tapped(sender):\n\tsender.superview.superview.superview.back_button.enabled = False\n\tsender.superview.superview.superview.home_button.enabled = False\n\tsender.superview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.superview.move_list_source.items = build_move_directory(sender.superview.superview.superview.move_path_field.text)\n\tsender.superview.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.superview.move_path_field.text + '\\''\n\tsender.superview.superview.superview.move_table_view.hidden = False\n\tsender.superview.superview.superview.move_back_button.hidden = False\n\tsender.superview.superview.superview.move_cancel_button.hidden = False\n\tsender.superview.superview.superview.select_folder.hidden = False\n\tsender.superview.superview.superview.select_folder.action = file_select_folder_button_tapped\n\tsender.superview.superview.superview.move_label_background.hidden = False\n\tsender.superview.superview.superview.table_view.hidden = True\n# Secondary action\ndef file_select_folder_button_tapped(sender):\n\tftp.move_file(sender.superview.superview.file_label.text, sender.superview.superview.path_field.text, sender.superview.superview.move_path_field.text)\n\tsender.superview.superview.list_source.items = build_directory(sender.superview.superview.path_field.text)\n\tsender.hidden = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.superview.superview.move_cancel_button.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\t\ndef duplicate_file_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Duplicate File?'\n\tsender.superview.superview.superview.secondary_button1.action = duplicate_file\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef duplicate_file(sender):\n\tftp.duplicate_file(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\n##################\n# Folder Actions #\n##################\ndef rename_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.enabled = False\n\tsender.superview.superview.superview.file_label.delegate = file_label_delegate(sender.superview.superview.superview.file_label, 'folder')\n\tsender.superview.superview.superview.file_label.editable = True\n\tsender.superview.superview.superview.file_label.name = sender.superview.superview.superview.file_label.text\n\tsender.superview.superview.superview.file_label.begin_editing()\n\tsender.superview.superview.superview.secondary_button1.title = 'Rename Folder'\n\tsender.superview.superview.superview.secondary_button1.action = rename_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef rename_folder(sender):\n\tif not ftp.check_file_exists(sender.superview.superview.superview.file_label.text,sender.superview.superview.superview.path_field.text):\n\t\tftp.ftp.rename(sender.superview.superview.superview.file_label.name, sender.superview.superview.superview.file_label.text)\n\t\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\t\tsender.superview.superview.superview.plus_button.enabled = True\n\t\tsender.superview.superview.superview.file_label.editable = False\n\t\tsender.superview.hidden = True\n\t\tsender.superview.superview.hidden = True\n\telse:\n\t\tconsole.hud_alert('Folder \\'' + sender.superview.superview.superview.file_label.text + '\\' Already Exists')\n\ndef delete_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Delete Folder & Contents?'\n\tsender.superview.superview.superview.secondary_button1.action = permanently_delete_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef permanently_delete_folder(sender):\n\tftp.delete_folder(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\ndef move_folder_button_tapped(sender):\n\tsender.superview.superview.superview.back_button.enabled = False\n\tsender.superview.superview.superview.home_button.enabled = False\n\tsender.superview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.superview.move_list_source.items = build_move_directory(sender.superview.superview.superview.move_path_field.text)\n\tsender.superview.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.superview.move_path_field.text + '\\''\n\tsender.superview.superview.superview.move_table_view.hidden = False\n\tsender.superview.superview.superview.move_back_button.hidden = False\n\tsender.superview.superview.superview.move_cancel_button.hidden = False\n\tsender.superview.superview.superview.select_folder.hidden = False\n\tsender.superview.superview.superview.select_folder.action = folder_select_folder_button_tapped\n\tsender.superview.superview.superview.move_label_background.hidden = False\n\tsender.superview.superview.superview.table_view.hidden = True\n# Secondary action\ndef folder_select_folder_button_tapped(sender):\n\tftp.move_folder(sender.superview.superview.file_label.text, sender.superview.superview.path_field.text, sender.superview.superview.move_path_field.text)\n\tsender.superview.superview.list_source.items = build_directory(sender.superview.superview.path_field.text)\n\tsender.hidden = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.superview.superview.move_cancel_button.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\t\ndef duplicate_folder_button_tapped(sender):\n\tsender.superview.superview.superview.secondary_button1.title = 'Duplicate Folder & Contents?'\n\tsender.superview.superview.superview.secondary_button1.action = duplicate_entire_folder\n\tsender.superview.superview.superview.secondary_actions.hidden = False\n# Secondary action\ndef duplicate_entire_folder(sender):\n\tftp.duplicate_folder(sender.superview.superview.superview.file_label.text, sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.list_source.items = build_directory(sender.superview.superview.superview.path_field.text)\n\tsender.superview.superview.superview.plus_button.enabled = True\n\tsender.superview.hidden = True\n\tsender.superview.superview.hidden = True\n\t\n#####################\n##### Delegates #####\n#####################\n\n#######################\n# Navigation Delegate #\n#######################\nclass navigation_delegate():\n\tdef tableview_did_select(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\t# If selected item is a folder...\n\t\tif tableview.data_source.items[row]['accessory_type'] != 'none':\n\t\t\t# Build the new directory\n\t\t\tif tableview.superview.path_field.text[-1:] != '/':\n\t\t\t\ttableview.superview.list_source.items = build_directory(tableview.superview.path_field.text + '/' + selection)\n\t\t\telse:\n\t\t\t\ttableview.superview.list_source.items = build_directory(tableview.superview.path_field.text + selection)\n\t\t\t# Set text field to display new path\n\t\t\ttableview.superview.path_field.text = ftp.ftp.pwd()\n\t\t\t# Enable the back button if you are no longer on the top level directory\n\t\t\tif tableview.superview.path_field.text != '/':\n\t\t\t\ttableview.superview.back_button.enabled = True\n\t\t# If selected item is a file...\n\t\telse:\n\t\t\ttableview.superview.button1.title = 'Download & Open'\n\t\t\ttableview.superview.button1.action = open_button_tapped\n\t\t\ttableview.superview.button2.title = 'Overwrite File'\n\t\t\ttableview.superview.button2.action = overwrite_button_tapped\n\t\t\ttableview.superview.button3.title = 'Rename File'\n\t\t\ttableview.superview.button3.action = rename_file_button_tapped\n\t\t\ttableview.superview.button4.title = 'Delete File'\n\t\t\ttableview.superview.button4.action = delete_file_button_tapped\n\t\t\ttableview.superview.button5.title = 'Move File'\n\t\t\ttableview.superview.button5.action = move_file_button_tapped\n\t\t\ttableview.superview.button6.title = 'Duplicate File'\n\t\t\ttableview.superview.button6.action = duplicate_file_button_tapped\n\t\t\ttableview.superview.button7.title = 'Copy File Path'\n\t\t\ttableview.superview.button7.action = copy_path_button_tapped\n\t\t\ttableview.superview.button3.hidden = False\n\t\t\ttableview.superview.button4.hidden = False\n\t\t\ttableview.superview.button5.hidden = False\n\t\t\ttableview.superview.button6.hidden = False\n\t\t\ttableview.superview.button7.hidden = False\n\t\t\ttableview.superview.button8.hidden = True\n\t\t\ttableview.superview.file_icon.image = ui.Image.named('ionicons-document-24')\n\t\t\ttableview.superview.file_label.text = selection\n\t\t\ttableview.superview.button_actions.hidden = False\n\t\t\ttableview.superview.plus_button.enabled = False\n\t\t\ttableview.superview.back_button.enabled = True\n\t\t\ttableview.superview.close_button.center = (tableview.superview.width/2,272)\n\t\t\tif tableview.superview.height < 500:\n\t\t\t\ttableview.superview.scroll_buttons.content_size = (tableview.superview.width, 325)\n\t\t\ttableview.superview.scroll_buttons.content_offset = (0,0)\n\t\n\tdef tableview_accessory_button_tapped(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\ttableview.superview.button1.title = 'Rename Folder'\n\t\ttableview.superview.button1.action = rename_folder_button_tapped\n\t\ttableview.superview.button2.title = 'Delete Folder'\n\t\ttableview.superview.button2.action = delete_folder_button_tapped\n\t\ttableview.superview.button3.title = 'Move Folder'\n\t\ttableview.superview.button3.action = move_folder_button_tapped\n\t\ttableview.superview.button4.title = 'Duplicate Folder'\n\t\ttableview.superview.button4.action = duplicate_folder_button_tapped\n\t\ttableview.superview.button5.title = 'Copy Folder Path'\n\t\ttableview.superview.button5.action = copy_path_button_tapped\n\t\ttableview.superview.button3.hidden = False\n\t\ttableview.superview.button4.hidden = False\n\t\ttableview.superview.button5.hidden = False\n\t\ttableview.superview.button6.hidden = True\n\t\ttableview.superview.button7.hidden = True\n\t\ttableview.superview.button8.hidden = True\n\t\ttableview.superview.file_icon.image = ui.Image.named('ionicons-folder-24')\n\t\ttableview.superview.file_label.text = selection\n\t\ttableview.superview.button_actions.hidden = False\n\t\ttableview.superview.plus_button.enabled = False\n\t\ttableview.superview.back_button.enabled = True\n\t\ttableview.superview.close_button.center = (tableview.superview.width/2,213)\n\t\tif tableview.superview.height < 500:\n\t\t\ttableview.superview.scroll_buttons.content_size = (tableview.superview.width, 266)\n\t\ttableview.superview.scroll_buttons.content_offset = (0,0)\n\n#######################\n# Path Field Delegate #\n#######################\nclass path_navigation_delegate():\n\tdef textfield_should_begin_editing(self,textfield):\n\t\treturn True\n\t# When user hits return after editing TextField...\n\tdef textfield_should_return(self,textfield):\n\t\t# Get the current path from the text field\n\t\tself.path = textfield.text\n\t\t# Test to see if the new path is a valid directory...\n\t\ttry:\n\t\t\t# If it is, build that directory and load it into the ListDataSource element\n\t\t\ttextfield.superview.list_source.items = build_directory(self.path)\n\t\texcept:\n\t\t\t# If it is not a valid path, alert the user and reset the path in the TextField to what it was previously\n\t\t\tconsole.hud_alert('Directory \\'' + self.path + '\\' Does Not Seem To Exist', 'error', 5.0)\n\t\t\ttextfield.text = ftp.ftp.pwd()\n\t\ttextfield.end_editing()\n\t# If keyboard is dismissed without return being hit, reset the path in the TextField to the current directory\n\tdef textfield_did_end_editing(self,textfield):\n\t\ttextfield.text = ftp.ftp.pwd()\n\t\t\n#######################\n# File Label Delegate #\n#######################\nclass file_label_delegate():\n\tdef __init__(self, textview, type):\n\t\tself.type = type\n\tdef textview_should_begin_editing(self, textview):\n\t\treturn True\n\tdef textview_did_begin_editing(self, textview):\n\t\tif self.type == 'upload':\n\t\t\ttextview.text = 'filename.txt'\n\t\telif self.type == 'new_folder':\n\t\t\ttextview.text = 'foldername'\n\t\telif self.type == 'new_image':\n\t\t\ttextview.text = 'imagename.png'\n\tdef textview_did_end_editing(self, textview):\n\t\ttextview.text = textview.name\n\tdef textview_should_change(self, textview, range, replacement):\n\t\treturn True\n\tdef textview_did_change(self, textview):\n\t\tif self.type == 'upload' or self.type == 'new_folder' or self.type == 'new_image':\n\t\t\ttextview.superview.superview.secondary_button1.enabled = True\n\t\tif '\\n' in textview.text:\n\t\t\ttextview.text = textview.text.rstrip('\\n')\n\t\t\ttextview.end_editing()\n\t\t\tif textview.superview.superview.secondary_button1.enabled == True:\n\t\t\t\tif self.type == 'folder':\n\t\t\t\t\trename_folder(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'file':\n\t\t\t\t\trename_file(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'upload':\n\t\t\t\t\tupload_file_in_editor(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'new_folder':\n\t\t\t\t\tcreate_folder(textview.superview.superview.secondary_button1)\n\t\t\t\telif self.type == 'new_image':\n\t\t\t\t\tupload_image(textview.superview.superview.secondary_button1)\n\t\tif self.type != 'upload' and self.type != 'new_folder' and self.type != 'new_image':\n\t\t\tif textview.text != textview.name:\n\t\t\t\ttextview.superview.superview.secondary_button1.enabled = True\n\t\t\telse:\n\t\t\t\ttextview.superview.superview.secondary_button1.enabled = False\n\tdef textview_did_change_selection(self, textview):\n\t\tpass\n\t\t\n#######################\n# Move File Delegate #\n#######################\nclass move_delegate():\n\tdef tableview_did_select(self, tableview, section, row):\n\t\t# Save title of tapped row\n\t\tselection = tableview.data_source.items[row]['title']\n\t\t# If selected item is a folder...\n\t\tif tableview.data_source.items[row]['accessory_type'] != 'none':\n\t\t\t# Build the new directory\n\t\t\tif tableview.superview.superview.move_path_field.text[-1:] != '/':\n\t\t\t\ttableview.superview.superview.move_list_source.items = build_move_directory(tableview.superview.superview.move_path_field.text + '/' + selection)\n\t\t\telse:\n\t\t\t\ttableview.superview.superview.move_list_source.items = build_directory(tableview.superview.superview.move_path_field.text + selection)\n\t\t\t# Set text field to display new path\n\t\t\ttableview.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\t\t\ttableview.superview.superview.select_folder.title = 'Move to \\'' + tableview.superview.superview.move_path_field.text + '\\''\n\t\t\t# Enable the back button if you are no longer on the top level directory\n\t\t\tif tableview.superview.superview.move_path_field.text != '/':\n\t\t\t\ttableview.superview.superview.move_back_button.enabled = True\n\n# Build directory to be displayed in rows of TableView for moving files\ndef build_move_directory(path=params['Initial_Path']):\n\t# Get directory as dictionary with keys marking items as files or folders\n\tlist_items = ftp.directory_with_types(path)\n\tsource_list = []\n\t# Pull data from list_items and prepare a list of dictionaries readable by ListDataSource element\n\tfor item in list_items:\n\t\td = {}\n\t\td['title'] = list_items[item]['title']\n\t\t# For files, do not include accessory action icons in their rows, but mark them with file icons\n\t\tif list_items[item]['type'] == 'file':\n\t\t\td['accessory_type'] = 'none'\n\t\t\td['image'] = 'ionicons-document-24'\n\t\t# For folders, add chevron arrow accessory action icons to rows and mark with folder icons\n\t\telse:\n\t\t\td['accessory_type'] = 'disclosure_indicator'\n\t\t\td['image'] = 'ionicons-folder-24'\n\t\t# Add each prepared dictionary to overall list of dictionaries\n\t\tif d['title'][:1] != '.':\n\t\t\tsource_list.append(d)\n\t# Return list of dictionaries with all files and folders properly flagged\t\n\treturn source_list\n\t\n#####################################\n##### Move File/Folder Buttons ######\n#####################################\ndef move_back_button_tapped(sender):\n\t# Get current path\n\tpath = sender.superview.superview.move_path_field.text\n\t# Split the path at slashes\n\tpath = path.split('/')\n\tnew_path = ''\n\t# Put the path back together with slashes, but leave the final path item removed (path is back one level)\n\tfor i in range(len(path) - 1):\n\t\tnew_path += path[i] + '/'\n\t# Remove trailing backslash, unless you are in the top level directory '/'\n\tif len(new_path) > 1:\n\t\tnew_path = new_path[:-1]\n\t# Build the directory for the new path and send it to the ListDataSource element\n\tsender.superview.superview.move_list_source.items = build_move_directory(new_path)\n\t# Adjust the title TextField to display the new path\n\tsender.superview.superview.move_path_field.text = ftp.ftp.pwd()\n\tsender.superview.superview.select_folder.title = 'Move to \\'' + sender.superview.superview.move_path_field.text + '\\''\n\t# If the new path leaves you at the top level directory, disable the back button\n\tif new_path == '/':\n\t\tsender.enabled = False\n\t\t\ndef move_cancel_button_tapped(sender):\n\tsender.superview.hidden = True\n\tsender.superview.superview.move_table_view.hidden = True\n\tsender.superview.superview.move_back_button.hidden = True\n\tsender.hidden = True\n\tsender.superview.superview.select_folder.hidden = True\n\tsender.superview.superview.move_label_background.hidden = True\n\tsender.superview.superview.table_view.hidden = False\n\tsender.superview.superview.plus_button.enabled = True\n\tsender.superview.superview.back_button.enabled = True\n\tsender.superview.superview.home_button.enabled = True\n\tsender.superview.superview.secondary_button1.enabled = True\n\tsender.superview.superview.file_label.editable = False\n\n##########################\n##### User Interface #####\n##########################\nclass FTP_Client(ui.View):\n\tdef __init__(self,data_source):\n\t\t# Set up the view\n\t\tself.bounds = (0,0,320,500)\n\t\tself.background_color = '#F6F6F6'\n\t\tself.name = 'FTP_Client'\n\t\t# Set up the loading icon\n\t\tself.loading_view = ui.ActivityIndicator()\n\t\tself.loading_view.center = (self.width / 2, self.height / 2)\n\t\tself.loading_view.style = ui.ACTIVITY_INDICATOR_STYLE_GRAY\n\t\tself.add_subview(self.loading_view)\n\t\t# Set up the TextField where the path will be displayed\n\t\tself.path_field = ui.TextField()\n\t\tself.path_field.placeholder = '/'\n\t\tself.path_field.text = ftp.ftp.pwd()\n\t\tself.path_field.frame = (15,60,self.width-30,32) # Define the field's coordinates and measurments\n\t\tself.path_field.alignment = ui.ALIGN_CENTER\n\t\tself.path_field.delegate = path_navigation_delegate() # Set up the TextField's delegate\n\t\tself.add_subview(self.path_field)\n\t\tnav_background = ui.Label()\n\t\tnav_background.frame = (47,0,self.width,50)\n\t\tnav_background.background_color = '#f0f0f0'\n\t\tnav_background.center = (self.width/2,25)\n\t\tnav_background.alignment = ui.ALIGN_CENTER\n\t\tnav_background.send_to_back()\n\t\tself.add_subview(nav_background)\n\t\ttitle = ui.Label()\n\t\ttitle.text = params['FTP_Server'] # Text to display on title bar\n\t\ttitle.frame = (47,0,self.width-128,50)\n\t\ttitle.background_color = '#f0f0f0'\n\t\ttitle.center = (self.width/2+15,25)\n\t\ttitle.alignment = ui.ALIGN_CENTER\n\t\ttitle.send_to_back()\n\t\tself.add_subview(title)\n\t\t# Set up the back button\n\t\tself.back_button = ui.Button()\n\t\tself.back_button.image = ui.Image.named('ionicons-chevron-left-24')\n\t\tself.back_button.frame = (10,10,32,32)\n\t\tself.back_button.font = ('', 25)\n\t\tself.back_button.action = back_button_tapped # Set the back button's action to back_button_tapped function\n\t\tself.add_subview(self.back_button)\n\t\t# Set up the plus button\n\t\tself.plus_button = ui.Button()\n\t\tself.plus_button.image = ui.Image.named('ionicons-plus-24')\n\t\tself.plus_button.frame = (275,10,32,32)\n\t\tself.plus_button.font = ('', 25)\n\t\tself.plus_button.action = plus_button_tapped # Set the plus button's action to plus_button_tapped function\n\t\tself.add_subview(self.plus_button)\n\t\t# Set up the home button\n\t\tself.home_button = ui.Button()\n\t\tself.home_button.image = ui.Image.named('ionicons-home-24')\n\t\tself.home_button.frame = (45,10,32,32)\n\t\tself.home_button.font = ('', 25)\n\t\tself.home_button.action = home_button_tapped # Set the back button's action to back_button_tapped function\n\t\tself.add_subview(self.home_button)\n\t\t# Set up the data source element for the TableView\n\t\tself.list_source = ui.ListDataSource(items=[])\n\t\tself.list_source.move_enabled = False\n\t\tself.list_source.delete_enabled = False\n\t\tself.list_source.items = data_source # Set data source to the element that will be passed into this class upon initiation\n\t\t# Set up the TableView\n\t\tself.table_view = ui.TableView()\n\t\tself.table_view.row_height = 44\n\t\tself.table_view.delegate = navigation_delegate() # Link the navigation delegate\n\t\tself.table_view.frame = (0,100,self.width, self.height - 100)\n\t\tself.table_view.flex = 'H'\n\t\tself.table_view.data_source = self.list_source # Set the data source to the ListDataSource element\n\t\tself.add_subview(self.table_view)\n\t\t# Set up the view for button actions\n\t\tself.button_actions = ui.View()\n\t\tself.button_actions.bounds = (0,0,320,460)\n\t\tself.button_actions.center = (self.width/2,self.height/2+40)\n\t\tself.button_actions.background_color = '#f0f0f0'\n\t\tself.button_actions.name = 'button_actions'\n\t\tself.button_actions.flex = 'WH'\n\t\tself.button_actions.alpha = 1.0\n\t\tself.button_actions.hidden = True # Hide view until needed\n\t\tself.add_subview(self.button_actions)\n\t\tself.label_background = ui.Label()\n\t\tself.label_background.text = ''\n\t\tself.label_background.frame = (0,0,self.width,50)\n\t\tself.label_background.center = (self.width/2,self.height/8-28)\n\t\tself.label_background.background_color = '#f8f8f8'\n\t\tself.button_actions.add_subview(self.label_background)\n\t\t# Set up the title label to display which file was selected\n\t\tself.file_label = ui.TextView()\n\t\tself.file_label.font = ('', 18)\n\t\tself.file_label.frame = (0,0,self.width-55,45)\n\t\tself.file_label.center = (self.width/2+25,self.height/8-25)\n\t\tself.file_label.background_color = '#f8f8f8'\n\t\tself.file_label.alignment = ui.ALIGN_LEFT\n\t\tself.file_label.editable = False\n\t\tself.button_actions.add_subview(self.file_label)\n\t\tself.file_icon = ui.ImageView()\n\t\tself.file_icon.frame = (0,0,23,23)\n\t\tself.file_icon.center = (30,self.height/8-28)\n\t\tself.button_actions.add_subview(self.file_icon)\n\t\t# Set up scroll view so all buttons can be accessed if keyboard is up\n\t\tself.scroll_buttons = ui.ScrollView()\n\t\tself.scroll_buttons.frame = (0,58,self.width, self.height - 100)\n\t\tself.scroll_buttons.background_color = '#f0f0f0'\n\t\tself.scroll_buttons.flex = 'H'\n\t\tself.scroll_buttons.always_bounce_vertical = True\n\t\tself.scroll_buttons.bounces = True\n\t\tself.scroll_buttons.content_size = (self.width, self.height - 100)\n\t\tself.scroll_buttons.paging_enabled = True\n\t\tself.button_actions.add_subview(self.scroll_buttons)\n\t\t# Set up button1\n\t\tself.button1 = ui.Button()\n\t\tself.button1.frame = (0,15,self.width/2.2,50)\n\t\tself.button1.center = (self.width/4+3,self.height/8-27)\n\t\tself.button1.background_color = '#fff'\n\t\tself.scroll_buttons.add_subview(self.button1)\n\t\t# Set up button2\n\t\tself.button2 = ui.Button()\n\t\tself.button2.frame = (0,15,self.width/2.2,50)\n\t\tself.button2.center = (self.width/2+77,self.height/8-27)\n\t\tself.button2.background_color = '#fff'\n\t\tself.button2.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button2)\n\t\t# Set up button3\n\t\tself.button3 = ui.Button()\n\t\tself.button3.frame = (0,15,self.width/2.2,50)\n\t\tself.button3.center = (self.width/4+3,self.height/8+32)\n\t\tself.button3.background_color = '#fff'\n\t\tself.button3.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button3)\n\t\t# Set up button4\n\t\tself.button4 = ui.Button()\n\t\tself.button4.frame = (0,15,self.width/2.2,50)\n\t\tself.button4.center = (self.width/2+77,self.height/8+32)\n\t\tself.button4.background_color = '#fff'\n\t\tself.button4.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button4)\n\t\t# Set up button5\n\t\tself.button5 = ui.Button()\n\t\tself.button5.frame = (0,15,self.width/2.2,50)\n\t\tself.button5.center = (self.width/4+3,self.height/8+91)\n\t\tself.button5.background_color = '#fff'\n\t\tself.button5.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button5)\n\t\t# Set up button6\n\t\tself.button6 = ui.Button()\n\t\tself.button6.frame = (0,15,self.width/2.2,50)\n\t\tself.button6.center = (self.width/2+77,self.height/8+91)\n\t\tself.button6.background_color = '#fff'\n\t\tself.button6.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button6)\n\t\t# Set up button7\n\t\tself.button7 = ui.Button()\n\t\tself.button7.frame = (0,15,self.width/2.2,50)\n\t\tself.button7.center = (self.width/4+3,self.height/8+150)\n\t\tself.button7.background_color = '#fff'\n\t\tself.button7.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button7)\n\t\t# Set up button8\n\t\tself.button8 = ui.Button()\n\t\tself.button8.frame = (0,15,self.width/2.2,50)\n\t\tself.button8.center = (self.width/2+77,self.height/8+150)\n\t\tself.button8.background_color = '#fff'\n\t\tself.button8.alpha = 1.0\n\t\tself.scroll_buttons.add_subview(self.button8)\n\t\t# Set up the close button to dismiss the button actions view\n\t\tself.close_button = ui.Button()\n\t\tself.close_button.title = 'Close'\n\t\tself.close_button.frame = (0,15,self.width-20,50)\n\t\tself.close_button.center = (self.width/2,self.height/8+210)\n\t\tself.close_button.background_color = '#fff'\n\t\tself.close_button.alpha = 1.0\n\t\tself.close_button.action = close_button_tapped\n\t\tself.scroll_buttons.add_subview(self.close_button)\n\t\t# Set up view for secondary actions\n\t\tself.secondary_actions = ui.View()\n\t\tself.secondary_actions.bounds = (0,0,320,460)\n\t\tself.secondary_actions.center = (self.width/2,self.height/2+40)\n\t\tself.secondary_actions.background_color = '#f0f0f0'\n\t\tself.secondary_actions.name = 'secondary_actions'\n\t\tself.secondary_actions.flex = 'WH'\n\t\tself.secondary_actions.alpha = 1.0\n\t\tself.secondary_actions.hidden = True # Hide view until needed\n\t\tself.button_actions.add_subview(self.secondary_actions)\n\t\t# Set up Secondary button1\n\t\tself.secondary_button1 = ui.Button()\n\t\tself.secondary_button1.frame = (0,15,self.width-21,50)\n\t\tself.secondary_button1.center = (self.width/2,self.height/8-29)\n\t\tself.secondary_button1.background_color = '#fff'\n\t\tself.secondary_button1.alpha = 1.0\n\t\tself.secondary_actions.add_subview(self.secondary_button1)\n\t\t# Set up the cancel button to dismiss the secondary actions view\n\t\tself.cancel_button = ui.Button()\n\t\tself.cancel_button.title = 'Cancel'\n\t\tself.cancel_button.frame = (0,15,self.width-20,50)\n\t\tself.cancel_button.center = (self.width/2,94)\n\t\tself.cancel_button.background_color = '#fff'\n\t\tself.cancel_button.alpha = 1.0\n\t\tself.cancel_button.action = cancel_button_tapped\n\t\tself.secondary_actions.add_subview(self.cancel_button)\n\t\t# Set up the data source element for the TableView for moving files\n\t\tself.move_list_source = ui.ListDataSource(items=[])\n\t\tself.move_list_source.move_enabled = False\n\t\tself.move_list_source.delete_enabled = False\n\t\t# Set up the TableView for Moving Files\n\t\tself.move_table_view = ui.TableView()\n\t\tself.move_table_view.row_height = 44\n\t\tself.move_table_view.delegate = move_delegate() # Link the navigation delegate for moving files\n\t\tself.move_table_view.frame = (0,127,self.width, self.height - 185)\n\t\tself.move_table_view.flex = 'H'\n\t\tself.move_table_view.data_source = self.move_list_source # Set the data source to the ListDataSource element\n\t\tself.move_table_view.hidden = True\n\t\tself.move_table_view.alpha = 1.0\n\t\tself.move_table_view.background_color = '#fff'\n\t\tself.button_actions.add_subview(self.move_table_view)\n\t\tself.move_label_background = ui.Label()\n\t\tself.move_label_background.text = ''\n\t\tself.move_label_background.frame = (0,0,self.width,170)\n\t\tself.move_label_background.center = (self.width/2,self.height/8-28)\n\t\tself.move_label_background.hidden = True\n\t\tself.move_label_background.background_color = '#f0f0f0'\n\t\tself.button_actions.add_subview(self.move_label_background)\n\t\t# Set up the button to select folder to move file into\n\t\tself.select_folder = ui.Button()\n\t\tself.select_folder.frame = (0,0,self.width-20,50)\n\t\tself.select_folder.center = (self.width/2,self.height/8-28)\n\t\tself.select_folder.background_color = '#fff'\n\t\tself.select_folder.hidden = True\n\t\tself.button_actions.add_subview(self.select_folder)\n\t\t# Set up the back button for the move file view\n\t\tself.move_back_button = ui.Button()\n\t\tself.move_back_button.image = ui.Image.named('ionicons-chevron-left-24')\n\t\tself.move_back_button.background_color = '#fff'\n\t\tself.move_back_button.frame = (10,69,50,50)\n\t\tself.move_back_button.font = ('', 25)\n\t\tself.move_back_button.action = move_back_button_tapped # Set the back button's action to move_back_button_tapped function\n\t\tself.move_back_button.hidden = True\n\t\tself.button_actions.add_subview(self.move_back_button)\n\t\t# Set up the cancel button to dismiss the move file view\n\t\tself.move_cancel_button = ui.Button()\n\t\tself.move_cancel_button.title = 'Cancel'\n\t\tself.move_cancel_button.frame = (0,15,self.width-80,50)\n\t\tself.move_cancel_button.center = (self.width/2+30,self.height/8+31)\n\t\tself.move_cancel_button.background_color = '#fff'\n\t\tself.move_cancel_button.alpha = 1.0\n\t\tself.move_cancel_button.action = move_cancel_button_tapped\n\t\tself.move_cancel_button.hidden = True\n\t\tself.button_actions.add_subview(self.move_cancel_button)\n\t\t# Set up the TextField where the current path will be held\n\t\tself.move_path_field = ui.TextField()\n\t\tself.move_path_field.text = ftp.ftp.pwd()\n\t\tself.move_path_field.hidden = True\n\t\tself.button_actions.add_subview(self.move_path_field)\n\n# Build the initial directory and store it to the source_list variable\nsource_list = build_directory()\n\n# Initiate the view and pass it the source_list\nview = FTP_Client(source_list)\n# Present the view in a popover\nview.present(style = 'popover', hide_title_bar = True)\n", "8FA2F3A3-A33F-4E29-B492-31CA733496EC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "26DF96A7-B364-42B8-93AE-439D0650676A": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "A9D399AD-1AE7-453D-9F37-9B66FE3DF0A9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "7C719344-C891-4AB0-95AE-A113A91D1248": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "1E45370D-12DA-4162-BE1D-00E57FD826A1": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6BB5C954-DACE-44BC-BAA5-BA386343A159": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "93D7ECD9-8FF4-4ED4-910A-1024DFFA875F": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "3D76ECEE-8D86-4F1F-B6CE-161124D878F3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "15E08D0D-F62D-4AC0-92EF-A2809B7DFBB6": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "F276A4A8-DABC-4867-A241-5D85D5A2F8D4": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E4A933E5-76E4-4B94-8996-0AEEF41399E8": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "BFEAA0EA-62A6-4DA4-976D-493B3F338463": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "6D17DF79-ECA4-4EF9-B5D2-1AAB32E34D11": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "68A2A40E-0E92-4737-8FF2-F176B3645CBC": {"text": "This action runs a Python script that can be configured with your own parameters. Tap and hold the action to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "ui": "[{\"class\":\"View\",\"attributes\":{\"background_color\":\"RGBA(1.000000,1.000000,1.000000,1.000000)\",\"tint_color\":\"RGBA(0.000000,0.478000,1.000000,1.000000)\",\"enabled\":true,\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"flex\":\"\"},\"frame\":\"{{0, 0}, {540, 575}}\",\"nodes\":[{\"class\":\"View\",\"attributes\":{\"name\":\"view1\",\"uuid\":\"691D7635-ED21-47B1-BB0C-D03DF74DFA8B\",\"enabled\":true,\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"flex\":\"\"},\"frame\":\"{{162, 279}, {215, 58}}\",\"nodes\":[]},{\"class\":\"Button\",\"attributes\":{\"font_size\":15,\"enabled\":true,\"flex\":\"\",\"font_bold\":false,\"name\":\"button1\",\"uuid\":\"891737B6-0D9F-4C3A-AABF-15D9B73D64AB\",\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"title\":\"Download\"},\"frame\":\"{{162, 279}, {107, 58}}\",\"nodes\":[]},{\"class\":\"Button\",\"attributes\":{\"font_size\":15,\"enabled\":true,\"flex\":\"\",\"font_bold\":false,\"name\":\"button2\",\"uuid\":\"93DF31A4-D186-45A9-8180-04EB9C517035\",\"border_color\":\"RGBA(0.000000,0.000000,0.000000,1.000000)\",\"title\":\"Overwrite\"},\"frame\":\"{{270, 279}, {107, 58}}\",\"nodes\":[]}]}]", "D4B85DD2-E06A-467A-9137-868147CB5EF5": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "E48FCCAE-719D-4713-936F-4217132FB7F9": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "9EF136C5-4458-4EC1-8B41-2CEC520138DB": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "07E5006D-CD8C-4383-8BE9-6A8D8F6CCC07": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}, "AA0729B7-4EA3-4539-98A3-9FA5550C5AF3": {"text": "This action runs a Python script that can be configured with your own parameters. Tap the options (\u25bc) button to edit the script or the parameters that are shown here. This comment is actually a text parameter itself \u2013 feel free to remove it.", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionCustom"}], "name": "FTP_Client", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone9,4", "systemVersion": "13.1.2"}, "type": "wkflw", "public": true, "icon": "minicons-icons-transfer-upload-5.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22This%20is%20a%20custom%20UI%20for%20Editorial%20which%20will%20present%20a%20fully%20featured%20FTP%20client%20in%20a%20popup%20window%20over%20the%20editor.%5Cn%5CnAfter%20downloading%20you%20will%20need%20to%20tap%20the%20Info%20button%20next%20to%20the%20workflow%2C%20go%20to%20the%20Edit%20Workflow%20page%2C%20tap%20on%20the%20action%20block%20to%20expand%20it%2C%20and%20fill%20in%20your%20FTP%20login%20credentials%20in%20the%20variables%20below.%20Once%20you%27ve%20done%20that%20just%20run%20it%20from%20the%20workflow%20menu%20and%20you%20should%20be%20set.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22FTP%20UI%22%2C%20%22parameters%22%3A%20%7B%2276A5A84D-0561-4834-856C-545D188ABC42%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217F9FFEF-24E7-4B85-80AF-E6FFD48F26E9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2212CB7DEE-EEC1-4FCB-97BF-BBB95A56A03B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217DDDC80-EB5C-4A4A-BE33-F29B1EA496A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223DD56DC4-7B69-49DC-8A3B-2DB7A851AC30%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D74B99FF-2F76-4624-9C02-A0E1785348A5%22%3A%20%22%22%2C%20%22F953659E-E15A-4FE6-82B4-1BB1CE613B3E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DBA7A162-8790-4615-A5C1-EFF8EB870E0B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22350C4857-3A55-4278-A792-F144FA8B92F1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22D95E75B5-2181-465B-A147-20D14D1B88A7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227B2C7297-7737-47B0-8548-2F6579D63B3A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AF803B87-F589-4DDF-8D61-888339533174%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2274EE867C-63BF-42F5-8F85-2AD1663D9528%22%3A%20%22172.16.1.48%22%2C%20%22E03DEE1B-0607-4EBE-9F82-434D690A3588%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22B42E2195-685F-4022-B61E-14A19BDACD7D%22%3A%20%22angel_augusto%22%2C%20%229B35529B-8F25-4F88-A9B4-781FB250B846%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_parameters__%22%3A%20%5B%7B%22placeholder%22%3A%20%22%2F%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22D74B99FF-2F76-4624-9C02-A0E1785348A5%22%2C%20%22title%22%3A%20%22Initial_Path%22%7D%2C%20%7B%22placeholder%22%3A%20%22ftp.example.com%22%2C%20%22keyboardType%22%3A%203%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%2274EE867C-63BF-42F5-8F85-2AD1663D9528%22%2C%20%22title%22%3A%20%22FTP_Server%22%7D%2C%20%7B%22placeholder%22%3A%20%22guyot%40unapologetic.io%22%2C%20%22keyboardType%22%3A%207%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22B42E2195-685F-4022-B61E-14A19BDACD7D%22%2C%20%22title%22%3A%20%22FTP_Username%22%7D%2C%20%7B%22placeholder%22%3A%20%22%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%5Cu2022%22%2C%20%22type%22%3A%20%22basicText%22%2C%20%22key%22%3A%20%22FCF40D27-4DB7-4121-97F6-F968A900E92E%22%2C%20%22title%22%3A%20%22FTP_Password%22%7D%5D%2C%20%22B8C377DB-C007-491E-9B69-9967410CC875%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22FCF40D27-4DB7-4121-97F6-F968A900E92E%22%3A%20%22B2esaL1a%22%2C%20%226E695F21-0664-4FC9-920E-12821330B610%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2217E340BF-6CF0-45D7-AA81-F135B91DE224%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BE013931-6B92-45BB-A3F9-5747D2BD1587%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229C3FFE2C-6C49-46C9-BD53-E5AAAE2BD8CA%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226A2FC1A6-979E-4125-87D1-52EB38FC4527%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ABBDEFCC-F896-4F7A-B35F-5023B651DD88%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2298F26812-BFCB-4DC1-8FC4-E7282BCAF39A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C8D3ACB2-86C1-479E-979E-666D5FE5BB97%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229E029915-8290-426B-9B8E-326654FA13DC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226A5B2A56-80C7-4E7B-8E2F-EBF2993ED68B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AD8FDF1C-B8D2-48EB-A547-37B910262AAB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F2C3515D-1C29-423D-99C0-95B6FB4887DC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2295FA6C87-6EB6-4562-B4B0-38C99BF57114%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223A9BD136-9079-44AD-89C5-53D329731D83%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221C7EAC87-52E9-42C6-A8C7-18AB70F3FD23%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226C12A397-2296-483B-BE29-87C6F9D8013B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22867B865E-787D-45E1-B3BF-64412F9D6FA4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226CC50A85-8999-47B5-B830-88C48A0443AB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BE54AC05-8D78-4F95-822A-AC4907F58791%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222D8A39CF-8976-4772-A439-9A46FA9C79D3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%222B5E2C3D-F83E-4B48-B316-FFC6DC26E26A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22DBD9CAA1-1A12-4ABE-A9C7-EBBF0D77357E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22CF4A2FE6-4960-4F51-BAE9-3218272C1C6E%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2225171F4E-EB9B-47E7-9902-E3ED071C0362%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%228913248B-FE4C-4839-BD1E-22533BA6586B%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229D387E48-805E-46E4-83A9-30876058FD42%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2290D8071E-9FC5-4FFA-94E6-0BC3006E4236%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2277021432-36A0-48A7-8A82-9C4609E71B23%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2268AE2162-AF92-4CE6-B5E5-A99BA2D7CFB9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22FC89D8BA-5448-455D-BBAC-21F1F0775A66%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E34AD0C6-2E7C-46DF-8E5C-A61D619E4063%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C4ACD630-2532-48C6-88DE-EA95FB7FA074%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22C57929EE-43A1-4384-BF54-95AF57E3552A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22010A0730-7B55-419F-AD63-86DAE22BCFF3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2293D9F4AF-C4DB-4E00-A32E-52AE27A1E174%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BEA876CA-3C94-415F-B229-B5DAC3A68DD7%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221E06CA8B-C928-4F60-8418-D04B6D3E0AA3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%220FE68B9D-5A5D-4746-94A6-E183EEC712E1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E6FC01C2-5EB7-4867-B73C-FA4A657FE032%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22__custom_action_script__%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20ui%5Cnimport%20console%5Cnimport%20editor%5Cnimport%20time%5Cnimport%20clipboard%5Cnimport%20photos%5Cnfrom%20PIL%20import%20Image%5Cnfrom%20io%20import%20BytesIO%5Cnimport%20webbrowser%5Cnfrom%20ftplib%20import%20FTP%5Cn%5Cn%23%20Get%20the%20custom%20parameters%20as%20a%20dictionary%20%28titles%20are%20keys%29%3A%5Cnparams%20%3D%20workflow.get_parameters%28%29%5Cn%23%20Get%20the%20action%27s%20input%20%28a%20string%29%3A%5Cnaction_in%20%3D%20workflow.get_input%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20FTP%20Protocol%20Class%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cnclass%20FTP_Instance%3A%5Cn%5Ctdef%20__init__%28self%29%3A%5Cn%5Ct%5Ctself.initial_path%20%3D%20params%5B%27Initial_Path%27%5D%5Cn%5Ct%5Ctself.ftp%20%3D%20FTP%28params%5B%27FTP_Server%27%5D%29%5Cn%5Ct%5Ctself.ftp.login%28params%5B%27FTP_Username%27%5D%2C%20params%5B%27FTP_Password%27%5D%29%5Cn%5Ct%5Ctself.ftp.cwd%28self.initial_path%29%5Cn%5Cn%5Ctdef%20open_file%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Cttemp%20%3D%20open%28%27temp%27%2C%20%5C%22wb%5C%22%29%5Cn%5Ct%5Ctself.ftp.retrbinary%28%27RETR%20%27%20%2B%20filename%2C%20temp.write%29%5Cn%5Ct%5Cttemp.close%28%29%5Cn%5Ct%5Ctread%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctfile_contents%20%3D%20read.read%28%29%5Cn%5Ct%5Ctread.close%28%29%5Cn%5Ct%5Ctreturn%20file_contents%5Cn%5Cn%5Ctdef%20check_file_exists%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctexisting_files%20%3D%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ctreturn%20filename%20in%20existing_files%5Cn%5Ct%5Ct%5Cn%5Ctdef%20mkd%28self%2C%20path%29%3A%5Cn%5Ct%5Ctchecked_path%20%3D%20%27%27%5Cn%5Ct%5Ctdirectories%20%3D%20path%5B1%3A%5D.split%28%27%2F%27%29%5Cn%5Ct%5Ctself.ftp.cwd%28self.initial_path%29%5Cn%5Ct%5Ctfor%20i%20in%20range%28len%28directories%29%29%3A%5Cn%5Ct%5Ct%5Ctcurrent_dir%20%3D%20self.ftp.nlst%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ctif%20directories%5Bi%5D%20in%20current_dir%3A%5Cn%5Ct%5Ct%5Ct%5Ctchecked_path%20%2B%3D%20%27%2F%27%20%2B%20directories%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctchecked_path%20%2B%3D%20%27%2F%27%20%2B%20directories%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28self.initial_path%20%2B%20checked_path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20overwrite_file%28self%2C%20filename%2C%20text%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27w%27%29%5Cn%5Ct%5Ctfile.write%28text%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20filename%2C%20file%29%5Cn%5Ct%5Ctif%20text%20%21%3D%20self.open_file%28filename%2Cpath%29%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20Overwrite%20Failed%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20Overwritten%27%2C%20%27success%27%2C%205.0%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Cn%5Ctdef%20upload_image%28self%2C%20imagename%2C%20path%29%3A%5Cn%5Ct%5Ctimage%20%3D%20photos.pick_image%28%29%5Cn%5Ct%5Ctbuffer%20%3D%20BytesIO%28%29%5Cn%5Ct%5Ctimage.save%28buffer%2C%20%27PNG%27%29%5Cn%5Ct%5Ctbuffer.seek%280%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20imagename%2C%20buffer%29%5Cn%5Ct%5Cn%5Ctdef%20create_and_upload_file%28self%2C%20filename%2C%20text%2C%20path%29%3A%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27w%27%29%5Cn%5Ct%5Ctfile.write%28text%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Ct%5Ctfile%20%3D%20open%28%27temp%27%2C%20%27r%27%29%5Cn%5Ct%5Ctself.upload_file%28file%2C%20filename%2C%20path%29%5Cn%5Ct%5Ctfile.close%28%29%5Cn%5Cn%5Ctdef%20upload_file%28self%2C%20file%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Ctif%20path%20%21%3D%20%27%27%3A%5Cn%5Ct%5Ct%5Ctself.mkd%28path%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.storbinary%28%27STOR%20%27%20%2B%20filename%2C%20file%29%5Cn%5Cn%5Ctdef%20print_directory%28self%2C%20path%29%3A%5Cn%5Ct%5Ctprint%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20duplicate_file%28self%2C%20filename%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%201%5Cn%5Ct%5Ctfind_extension%20%3D%20filename.split%28%27.%27%29%5Cn%5Ct%5Ctnew_filename%20%3D%20%27%27%5Cn%5Ct%5Ctfor%20n%20in%20range%28len%28find_extension%29-1%29%3A%5Cn%5Ct%5Ct%5Ctnew_filename%20%2B%3D%20find_extension%5Bn%5D%20%2B%20%27.%27%5Cn%5Ct%5Ctnew_filename%20%3D%20new_filename%5B%3A-1%5D%5Cn%5Ct%5Ctcheck_filename%20%3D%20new_filename%20%2B%20%27-%27%20%2B%20str%28i%29%20%2B%20%27.%27%20%2B%20find_extension%5Bn%2B1%5D%5Cn%5Ct%5Ctfile_contents%20%3D%20self.open_file%28filename%2C%20path%29%5Cn%5Ct%5Ctwhile%20self.check_file_exists%28check_filename%2C%20path%29%3A%5Cn%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ct%5Ctcheck_filename%20%3D%20new_filename%20%2B%20%27-%27%20%2B%20str%28i%29%20%2B%20%27.%27%20%2B%20find_extension%5Bn%2B1%5D%5Cn%5Ct%5Ctself.create_and_upload_file%28check_filename%2C%20file_contents%2C%20path%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20duplicate_folder%28self%2C%20foldername%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%201%5Cn%5Ct%5Ctnew_foldername%20%3D%20foldername%20%2B%20%27-%27%20%2B%20str%28i%29%5Cn%5Ct%5Ctwhile%20self.check_file_exists%28new_foldername%2C%20path%29%3A%5Cn%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ct%5Ctnew_foldername%20%3D%20foldername%20%2B%20%27-%27%20%2B%20str%28i%29%5Cn%5Ct%5Ctself.ftp.mkd%28path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%5Ct%23%20Get%20directory%20to%20duplicate%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28path%20%2B%20%27%2F%27%20%2B%20new_foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20path%20%2B%20%27%2F%27%20%2B%20new_foldername%29%5Cn%5Ct%23%20Helper%20action%5Cn%5Ctdef%20duplicate_folder_helper%28self%2C%20foldername%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ct%23%20Get%20directory%20to%20duplicate%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Cn%5Ctdef%20move_file%28self%2C%20filename%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ctif%20not%20self.check_file_exists%28filename%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28filename%2C%20from_path%29%5Cn%5Ct%5Ct%5Ctself.create_and_upload_file%28filename%2C%20file_contents%2C%20to_path%29%5Cn%5Ct%5Ct%5Ctif%20self.check_file_exists%28filename%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20self.open_file%28filename%2C%20to_path%29%20%3D%3D%20file_contents%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28from_path%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.delete%28filename%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27File%20with%20same%20name%20already%20exists%20in%20this%20location%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Ct%5Cn%5Ctdef%20move_folder%28self%2C%20foldername%2C%20from_path%2C%20to_path%29%3A%5Cn%5Ct%5Ctall_files_moved%20%3D%20True%5Cn%5Ct%5Ctif%20not%20self.check_file_exists%28foldername%2C%20to_path%29%3A%5Cn%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%23%20Get%20directory%20of%20folder%20contents%20to%20be%20moved%5Cn%5Ct%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfile_contents%20%3D%20self.open_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctself.create_and_upload_file%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20file_contents%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20not%20self.check_file_exists%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctall_files_moved%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctprint%20%27false%27%5Cn%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.mkd%28to_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28from_path%20%2B%20%27%2F%27%20%2B%20foldername%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_to_duplicate%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_to_duplicate%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.duplicate_folder_helper%28dir_items%5Bitem%5D%5B%27title%27%5D%2C%20from_path%20%2B%20%27%2F%27%20%2B%20foldername%2C%20to_path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27Folder%20of%20same%20name%20already%20exists%20in%20this%20location%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Ctreturn%5Cn%5Ct%5Ctif%20all_files_moved%3A%5Cn%5Ct%5Ct%5Ctself.delete_folder%28foldername%2C%20from_path%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27All%20files%20may%20not%20have%20been%20moved%27%2C%20%27error%27%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Cn%5Ctdef%20delete_folder%28self%2C%20foldername%2C%20path%29%3A%5Cn%5Ct%5Ctftp.delete_folder_helper%28path%20%2B%20%27%2F%27%20%2B%20foldername%29%5Cn%5Ct%5Ctftp.ftp.cwd%28path%29%5Cn%5Ct%5Ctftp.ftp.rmd%28foldername%29%5Cn%5Ct%23%20Helper%20action%5Cn%5Ctdef%20delete_folder_helper%28self%2C%20path%29%3A%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctdir_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ct%5Ctfor%20item%20in%20dir_items%3A%5Cn%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ctself.ftp.delete%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20dir_items%5Bitem%5D%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_in_folder%20%3D%20self.ftp.nlst%28path%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctitems_inside%20%3D%20False%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctfor%20folderitem%20in%20items_in_folder%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctif%20folderitem%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctitems_inside%20%3D%20True%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctif%20items_inside%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctsave_path%20%3D%20path%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.delete_folder_helper%28path%20%2B%20%27%2F%27%20%2B%20dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.cwd%28save_path%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.rmd%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ct%5Ctself.ftp.rmd%28dir_items%5Bitem%5D%5B%27title%27%5D%29%5Cn%5Ct%5Ct%5Cn%5Ctdef%20directory_with_types%28self%2C%20path%29%3A%5Cn%5Ct%5Cti%20%3D%200%5Cn%5Ct%5Ctdirectory_list%20%3D%20%5B%5D%5Cn%5Ct%5Ctdirectory_dict%20%3D%20%7B%7D%5Cn%5Ct%5Cttitle_list%20%3D%20self.ftp.nlst%28path%29%5Cn%5Ct%5Ctself.ftp.cwd%28path%29%5Cn%5Ct%5Ctself.ftp.retrlines%28%27LIST%27%2C%20callback%3Ddirectory_list.append%29%5Cn%5Ct%5Ctfor%20item%20in%20directory_list%3A%5Cn%5Ct%5Ct%5Ctif%20i%20%3C%20len%28title_list%29%3A%5Cn%5Ct%5Ct%5Ct%5Ctlisting%20%3D%20%7B%7D%5Cn%5Ct%5Ct%5Ct%5Ctif%20item.upper%28%29.startswith%28%27D%27%29%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctlisting%5B%27type%27%5D%20%3D%20%27folder%27%5Cn%5Ct%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctlisting%5B%27type%27%5D%20%3D%20%27file%27%5Cn%5Ct%5Ct%5Ct%5Ctdirectory_dict%5Bi%5D%20%3D%20listing%5Cn%5Ct%5Ct%5Ct%5Ctdirectory_dict%5Bi%5D%5B%27title%27%5D%20%3D%20title_list%5Bi%5D%5Cn%5Ct%5Ct%5Ct%5Cti%20%2B%3D%201%5Cn%5Ct%5Ctreturn%20directory_dict%5Cn%5Cn%5Ctdef%20quit%28self%29%3A%5Cn%5Ct%5Ctself.ftp.quit%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20FTP%20UI%20Client%20%23%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cn%23%20Initiate%20FTP%20Connection%5Cnftp%20%3D%20FTP_Instance%28%29%5Cn%5Cn%23%20Build%20directory%20to%20be%20displayed%20in%20rows%20of%20file%20manager%5Cndef%20build_directory%28path%3Dparams%5B%27Initial_Path%27%5D%29%3A%5Cn%5Ct%23%20Get%20directory%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ctlist_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ctsource_list%20%3D%20%5B%5D%5Cn%5Ct%23%20Pull%20data%20from%20list_items%20and%20prepare%20a%20list%20of%20dictionaries%20readable%20by%20ListDataSource%20element%5Cn%5Ctfor%20item%20in%20list_items%3A%5Cn%5Ct%5Ctd%20%3D%20%7B%7D%5Cn%5Ct%5Ctd%5B%27title%27%5D%20%3D%20list_items%5Bitem%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20For%20files%2C%20do%20not%20include%20accessory%20action%20icons%20in%20their%20rows%2C%20but%20mark%20them%20with%20file%20icons%5Cn%5Ct%5Ctif%20list_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27none%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-document-24%27%5Cn%5Ct%5Ct%23%20For%20folders%2C%20add%20chevron%20arrow%20accessory%20action%20icons%20to%20rows%20and%20mark%20with%20folder%20icons%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27detail_disclosure_button%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-folder-24%27%5Cn%5Ct%5Ct%23%20Add%20each%20prepared%20dictionary%20to%20overall%20list%20of%20dictionaries%5Cn%5Ct%5Ctif%20d%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ctsource_list.append%28d%29%5Cn%5Ct%23%20Return%20list%20of%20dictionaries%20with%20all%20files%20and%20folders%20properly%20flagged%5Ct%5Cn%5Ctreturn%20source_list%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Back%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Action%20to%20be%20run%20when%20user%20taps%20the%20back%20button%20in%20the%20top%20left%20of%20the%20UI%5Cndef%20back_button_tapped%28sender%29%3A%5Cn%5Ctif%20not%20sender.superview.secondary_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.secondary_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20False%5Cn%5Ctelif%20not%20sender.superview.button_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.button_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20False%5Cn%5Ct%5Ctif%20sender.superview.path_field.text%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ctsender.superview.back_button.enabled%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctbutton_actions_closed%20%3D%20True%5Cn%5Ct%5Cn%5Ctif%20button_actions_closed%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%23%20Get%20current%20path%5Cn%5Ct%5Ctpath%20%3D%20sender.superview.path_field.text%5Cn%5Ct%5Ct%23%20Split%20the%20path%20at%20slashes%5Cn%5Ct%5Ctpath%20%3D%20path.split%28%27%2F%27%29%5Cn%5Ct%5Ctnew_path%20%3D%20%27%27%5Cn%5Ct%5Ct%23%20Put%20the%20path%20back%20together%20with%20slashes%2C%20but%20leave%20the%20final%20path%20item%20removed%20%28path%20is%20back%20one%20level%29%5Cn%5Ct%5Ctfor%20i%20in%20range%28len%28path%29%20-%201%29%3A%5Cn%5Ct%5Ct%5Ctnew_path%20%2B%3D%20path%5Bi%5D%20%2B%20%27%2F%27%5Cn%5Ct%5Ct%23%20Remove%20trailing%20backslash%2C%20unless%20you%20are%20in%20the%20top%20level%20directory%20%27%2F%27%5Cn%5Ct%5Ctif%20len%28new_path%29%20%3E%201%3A%5Cn%5Ct%5Ct%5Ctnew_path%20%3D%20new_path%5B%3A-1%5D%5Cn%5Ct%5Ct%23%20Build%20the%20directory%20for%20the%20new%20path%20and%20send%20it%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctsender.superview.list_source.items%20%3D%20build_directory%28new_path%29%5Cn%5Ct%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ct%5Ctsender.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%23%20If%20the%20new%20path%20leaves%20you%20at%20the%20top%20level%20directory%2C%20disable%20the%20back%20button%5Cn%5Ct%5Ctif%20new_path%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ctsender.enabled%20%3D%20False%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Plus%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20plus_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.button1.title%20%3D%20%27Upload%20File%20in%20Editor%27%5Cn%5Ctsender.superview.button1.action%20%3D%20upload_file_in_editor%5Cn%5Ctsender.superview.button2.title%20%3D%20%27New%20folder%27%5Cn%5Ctsender.superview.button2.action%20%3D%20new_folder%5Cn%5Ctsender.superview.button3.title%20%3D%20%27Upload%20Image%27%5Cn%5Ctsender.superview.button3.action%20%3D%20upload_image_button_tapped%5Cn%5Ctsender.superview.button4.title%20%3D%20%27Run%20Custom%20Code%27%5Cn%5Ctsender.superview.button5.title%20%3D%20%27Upload%20Dropbox%20File%27%5Cn%5Ctsender.superview.button6.title%20%3D%20%27Upload%20Local%20File%27%5Cn%5Ctsender.superview.button3.hidden%20%3D%20False%5Cn%5Ctsender.superview.button4.hidden%20%3D%20True%5Cn%5Ctsender.superview.button5.hidden%20%3D%20True%5Cn%5Ctsender.superview.button6.hidden%20%3D%20True%5Cn%5Ctsender.superview.button7.hidden%20%3D%20True%5Cn%5Ctsender.superview.button8.hidden%20%3D%20True%5Cn%5Ctsender.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-plus-24%27%29%5Cn%5Ctsender.superview.file_label.text%20%3D%20sender.superview.path_field.text%5Cn%5Ctsender.superview.button_actions.hidden%20%3D%20False%5Cn%5Ctsender.superview.plus_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.close_button.center%20%3D%20%28sender.superview.width%2F2%2C155%29%5Cn%5Ctif%20sender.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ctsender.superview.scroll_buttons.content_size%20%3D%20%28sender.superview.width%2C%20207%29%5Cn%5Ctsender.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Home%20Button%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20home_button_tapped%28sender%29%3A%5Cn%5Ctif%20not%20sender.superview.secondary_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.secondary_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ctif%20not%20sender.superview.button_actions.hidden%3A%5Cn%5Ct%5Ctsender.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.button_actions.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.list_source.items%20%3D%20build_directory%28%29%5Cn%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ctsender.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Button%20Actions%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20close_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Cndef%20cancel_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Cndef%20copy_path_button_tapped%28sender%29%3A%5Cn%5Ctclipboard.set%28sender.superview.superview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ctconsole.hud_alert%28%27Copied%27%2C%20%27success%27%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Plus%20Button%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20upload_file_in_editor%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27upload%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Upload%20File%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20upload_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20upload_file%28sender%29%3A%5Cn%5Ctfilename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Cttext%20%3D%20editor.get_text%28%29%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.create_and_upload_file%28filename%2C%20text%2C%20path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Cndef%20new_folder%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27new_folder%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Create%20Folder%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20create_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20create_folder%28sender%29%3A%5Cn%5Ctfoldername%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20foldername%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.mkd%28path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Folder%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Ct%5Cndef%20upload_image_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27new_image%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Show%20Image%20Picker%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20upload_image%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cn%40ui.in_background%5Cndef%20upload_image%28sender%29%3A%5Cn%5Ctimagename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.upload_image%28imagename%2C%20path%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.text%20%3D%20sender.superview.superview.superview.file_label.name%5Cn%5Ct%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20File%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20open_button_tapped%28sender%29%3A%5Cn%5Ctfile_contents%20%3D%20ftp.open_file%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Cteditor.set_file_contents%28sender.superview.superview.superview.file_label.text%2C%20file_contents%2C%20%27local%27%29%5Cn%5Ctwebbrowser.open%28%27editorial%3A%2F%2Fopen%2F%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%3Froot%3Dlocal%27%29%5Cn%5Ctsender.superview.superview.superview.close%28%29%5Cn%5Cndef%20overwrite_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Overwrite%20With%20File%20in%20Editor%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20overwrite_with_file_in_editor%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20overwrite_with_file_in_editor%28sender%29%3A%5Cn%5Ctfilename%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Cttext%20%3D%20editor.get_text%28%29%5Cn%5Ctpath%20%3D%20sender.superview.superview.superview.path_field.text%5Cn%5Ctftp.overwrite_file%28filename%2C%20text%2C%20path%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cndef%20rename_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27file%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Rename%20File%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20rename_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20Action%5Cndef%20rename_file%28sender%29%3A%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.rename%28sender.superview.superview.superview.file_label.name%2C%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27File%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Ct%5Cndef%20delete_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Permanently%20Delete%20File%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20permanently_delete_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20permanently_delete_file%28sender%29%3A%5Cn%5Ctftp.ftp.delete%28sender.superview.superview.superview.file_label.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cndef%20move_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.back_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.home_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28sender.superview.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ctsender.superview.superview.superview.move_table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_back_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_cancel_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.action%20%3D%20file_select_folder_button_tapped%5Cn%5Ctsender.superview.superview.superview.move_label_background.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.table_view.hidden%20%3D%20True%5Cn%23%20Secondary%20action%5Cndef%20file_select_folder_button_tapped%28sender%29%3A%5Cn%5Ctftp.move_file%28sender.superview.superview.file_label.text%2C%20sender.superview.superview.path_field.text%2C%20sender.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.path_field.text%29%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_cancel_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ct%5Cndef%20duplicate_file_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Duplicate%20File%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20duplicate_file%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20duplicate_file%28sender%29%3A%5Cn%5Ctftp.duplicate_file%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Folder%20Actions%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20rename_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.file_label.delegate%20%3D%20file_label_delegate%28sender.superview.superview.superview.file_label%2C%20%27folder%27%29%5Cn%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20True%5Cn%5Ctsender.superview.superview.superview.file_label.name%20%3D%20sender.superview.superview.superview.file_label.text%5Cn%5Ctsender.superview.superview.superview.file_label.begin_editing%28%29%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Rename%20Folder%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20rename_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20rename_folder%28sender%29%3A%5Cn%5Ctif%20not%20ftp.check_file_exists%28sender.superview.superview.superview.file_label.text%2Csender.superview.superview.superview.path_field.text%29%3A%5Cn%5Ct%5Ctftp.ftp.rename%28sender.superview.superview.superview.file_label.name%2C%20sender.superview.superview.superview.file_label.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ct%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ct%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ctelse%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Folder%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.file_label.text%20%2B%20%27%5C%5C%27%20Already%20Exists%27%29%5Cn%5Cndef%20delete_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Delete%20Folder%20%26%20Contents%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20permanently_delete_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20permanently_delete_folder%28sender%29%3A%5Cn%5Ctftp.delete_folder%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Cndef%20move_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.back_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.home_button.enabled%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28sender.superview.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ctsender.superview.superview.superview.move_table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_back_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.move_cancel_button.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.select_folder.action%20%3D%20folder_select_folder_button_tapped%5Cn%5Ctsender.superview.superview.superview.move_label_background.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.superview.table_view.hidden%20%3D%20True%5Cn%23%20Secondary%20action%5Cndef%20folder_select_folder_button_tapped%28sender%29%3A%5Cn%5Ctftp.move_folder%28sender.superview.superview.file_label.text%2C%20sender.superview.superview.path_field.text%2C%20sender.superview.superview.move_path_field.text%29%5Cn%5Ctsender.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.path_field.text%29%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_cancel_button.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ct%5Cndef%20duplicate_folder_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.superview.superview.secondary_button1.title%20%3D%20%27Duplicate%20Folder%20%26%20Contents%3F%27%5Cn%5Ctsender.superview.superview.superview.secondary_button1.action%20%3D%20duplicate_entire_folder%5Cn%5Ctsender.superview.superview.superview.secondary_actions.hidden%20%3D%20False%5Cn%23%20Secondary%20action%5Cndef%20duplicate_entire_folder%28sender%29%3A%5Cn%5Ctftp.duplicate_folder%28sender.superview.superview.superview.file_label.text%2C%20sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.list_source.items%20%3D%20build_directory%28sender.superview.superview.superview.path_field.text%29%5Cn%5Ctsender.superview.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.hidden%20%3D%20True%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Delegates%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Navigation%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20navigation_delegate%28%29%3A%5Cn%5Ctdef%20tableview_did_select%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20folder...%5Cn%5Ct%5Ctif%20tableview.data_source.items%5Brow%5D%5B%27accessory_type%27%5D%20%21%3D%20%27none%27%3A%5Cn%5Ct%5Ct%5Ct%23%20Build%20the%20new%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.path_field.text%5B-1%3A%5D%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.list_source.items%20%3D%20build_directory%28tableview.superview.path_field.text%20%2B%20%27%2F%27%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.list_source.items%20%3D%20build_directory%28tableview.superview.path_field.text%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ct%23%20Set%20text%20field%20to%20display%20new%20path%5Cn%5Ct%5Ct%5Cttableview.superview.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Ct%23%20Enable%20the%20back%20button%20if%20you%20are%20no%20longer%20on%20the%20top%20level%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.path_field.text%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20file...%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Cttableview.superview.button1.title%20%3D%20%27Download%20%26%20Open%27%5Cn%5Ct%5Ct%5Cttableview.superview.button1.action%20%3D%20open_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button2.title%20%3D%20%27Overwrite%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button2.action%20%3D%20overwrite_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button3.title%20%3D%20%27Rename%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button3.action%20%3D%20rename_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button4.title%20%3D%20%27Delete%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button4.action%20%3D%20delete_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button5.title%20%3D%20%27Move%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button5.action%20%3D%20move_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button6.title%20%3D%20%27Duplicate%20File%27%5Cn%5Ct%5Ct%5Cttableview.superview.button6.action%20%3D%20duplicate_file_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button7.title%20%3D%20%27Copy%20File%20Path%27%5Cn%5Ct%5Ct%5Cttableview.superview.button7.action%20%3D%20copy_path_button_tapped%5Cn%5Ct%5Ct%5Cttableview.superview.button3.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button4.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button5.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button6.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button7.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.button8.hidden%20%3D%20True%5Cn%5Ct%5Ct%5Cttableview.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-document-24%27%29%5Cn%5Ct%5Ct%5Cttableview.superview.file_label.text%20%3D%20selection%5Cn%5Ct%5Ct%5Cttableview.superview.button_actions.hidden%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.plus_button.enabled%20%3D%20False%5Cn%5Ct%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Ct%5Cttableview.superview.close_button.center%20%3D%20%28tableview.superview.width%2F2%2C272%29%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_size%20%3D%20%28tableview.superview.width%2C%20325%29%5Cn%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Ct%5Cn%5Ctdef%20tableview_accessory_button_tapped%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Cttableview.superview.button1.title%20%3D%20%27Rename%20Folder%27%5Cn%5Ct%5Cttableview.superview.button1.action%20%3D%20rename_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button2.title%20%3D%20%27Delete%20Folder%27%5Cn%5Ct%5Cttableview.superview.button2.action%20%3D%20delete_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button3.title%20%3D%20%27Move%20Folder%27%5Cn%5Ct%5Cttableview.superview.button3.action%20%3D%20move_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button4.title%20%3D%20%27Duplicate%20Folder%27%5Cn%5Ct%5Cttableview.superview.button4.action%20%3D%20duplicate_folder_button_tapped%5Cn%5Ct%5Cttableview.superview.button5.title%20%3D%20%27Copy%20Folder%20Path%27%5Cn%5Ct%5Cttableview.superview.button5.action%20%3D%20copy_path_button_tapped%5Cn%5Ct%5Cttableview.superview.button3.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button4.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button5.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.button6.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.button7.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.button8.hidden%20%3D%20True%5Cn%5Ct%5Cttableview.superview.file_icon.image%20%3D%20ui.Image.named%28%27ionicons-folder-24%27%29%5Cn%5Ct%5Cttableview.superview.file_label.text%20%3D%20selection%5Cn%5Ct%5Cttableview.superview.button_actions.hidden%20%3D%20False%5Cn%5Ct%5Cttableview.superview.plus_button.enabled%20%3D%20False%5Cn%5Ct%5Cttableview.superview.back_button.enabled%20%3D%20True%5Cn%5Ct%5Cttableview.superview.close_button.center%20%3D%20%28tableview.superview.width%2F2%2C213%29%5Cn%5Ct%5Ctif%20tableview.superview.height%20%3C%20500%3A%5Cn%5Ct%5Ct%5Cttableview.superview.scroll_buttons.content_size%20%3D%20%28tableview.superview.width%2C%20266%29%5Cn%5Ct%5Cttableview.superview.scroll_buttons.content_offset%20%3D%20%280%2C0%29%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Path%20Field%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20path_navigation_delegate%28%29%3A%5Cn%5Ctdef%20textfield_should_begin_editing%28self%2Ctextfield%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ct%23%20When%20user%20hits%20return%20after%20editing%20TextField...%5Cn%5Ctdef%20textfield_should_return%28self%2Ctextfield%29%3A%5Cn%5Ct%5Ct%23%20Get%20the%20current%20path%20from%20the%20text%20field%5Cn%5Ct%5Ctself.path%20%3D%20textfield.text%5Cn%5Ct%5Ct%23%20Test%20to%20see%20if%20the%20new%20path%20is%20a%20valid%20directory...%5Cn%5Ct%5Cttry%3A%5Cn%5Ct%5Ct%5Ct%23%20If%20it%20is%2C%20build%20that%20directory%20and%20load%20it%20into%20the%20ListDataSource%20element%5Cn%5Ct%5Ct%5Cttextfield.superview.list_source.items%20%3D%20build_directory%28self.path%29%5Cn%5Ct%5Ctexcept%3A%5Cn%5Ct%5Ct%5Ct%23%20If%20it%20is%20not%20a%20valid%20path%2C%20alert%20the%20user%20and%20reset%20the%20path%20in%20the%20TextField%20to%20what%20it%20was%20previously%5Cn%5Ct%5Ct%5Ctconsole.hud_alert%28%27Directory%20%5C%5C%27%27%20%2B%20self.path%20%2B%20%27%5C%5C%27%20Does%20Not%20Seem%20To%20Exist%27%2C%20%27error%27%2C%205.0%29%5Cn%5Ct%5Ct%5Cttextfield.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Cttextfield.end_editing%28%29%5Cn%5Ct%23%20If%20keyboard%20is%20dismissed%20without%20return%20being%20hit%2C%20reset%20the%20path%20in%20the%20TextField%20to%20the%20current%20directory%5Cn%5Ctdef%20textfield_did_end_editing%28self%2Ctextfield%29%3A%5Cn%5Ct%5Cttextfield.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20File%20Label%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20file_label_delegate%28%29%3A%5Cn%5Ctdef%20__init__%28self%2C%20textview%2C%20type%29%3A%5Cn%5Ct%5Ctself.type%20%3D%20type%5Cn%5Ctdef%20textview_should_begin_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ctdef%20textview_did_begin_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctif%20self.type%20%3D%3D%20%27upload%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27filename.txt%27%5Cn%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_folder%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27foldername%27%5Cn%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20%27imagename.png%27%5Cn%5Ctdef%20textview_did_end_editing%28self%2C%20textview%29%3A%5Cn%5Ct%5Cttextview.text%20%3D%20textview.name%5Cn%5Ctdef%20textview_should_change%28self%2C%20textview%2C%20range%2C%20replacement%29%3A%5Cn%5Ct%5Ctreturn%20True%5Cn%5Ctdef%20textview_did_change%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctif%20self.type%20%3D%3D%20%27upload%27%20or%20self.type%20%3D%3D%20%27new_folder%27%20or%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ctif%20%27%5C%5Cn%27%20in%20textview.text%3A%5Cn%5Ct%5Ct%5Cttextview.text%20%3D%20textview.text.rstrip%28%27%5C%5Cn%27%29%5Cn%5Ct%5Ct%5Cttextview.end_editing%28%29%5Cn%5Ct%5Ct%5Ctif%20textview.superview.superview.secondary_button1.enabled%20%3D%3D%20True%3A%5Cn%5Ct%5Ct%5Ct%5Ctif%20self.type%20%3D%3D%20%27folder%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctrename_folder%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctrename_file%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27upload%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctupload_file_in_editor%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_folder%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctcreate_folder%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ct%5Ct%5Ctelif%20self.type%20%3D%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Ct%5Ct%5Ctupload_image%28textview.superview.superview.secondary_button1%29%5Cn%5Ct%5Ctif%20self.type%20%21%3D%20%27upload%27%20and%20self.type%20%21%3D%20%27new_folder%27%20and%20self.type%20%21%3D%20%27new_image%27%3A%5Cn%5Ct%5Ct%5Ctif%20textview.text%20%21%3D%20textview.name%3A%5Cn%5Ct%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttextview.superview.superview.secondary_button1.enabled%20%3D%20False%5Cn%5Ctdef%20textview_did_change_selection%28self%2C%20textview%29%3A%5Cn%5Ct%5Ctpass%5Cn%5Ct%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%20Move%20File%20Delegate%20%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20move_delegate%28%29%3A%5Cn%5Ctdef%20tableview_did_select%28self%2C%20tableview%2C%20section%2C%20row%29%3A%5Cn%5Ct%5Ct%23%20Save%20title%20of%20tapped%20row%5Cn%5Ct%5Ctselection%20%3D%20tableview.data_source.items%5Brow%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20If%20selected%20item%20is%20a%20folder...%5Cn%5Ct%5Ctif%20tableview.data_source.items%5Brow%5D%5B%27accessory_type%27%5D%20%21%3D%20%27none%27%3A%5Cn%5Ct%5Ct%5Ct%23%20Build%20the%20new%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.superview.move_path_field.text%5B-1%3A%5D%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_list_source.items%20%3D%20build_move_directory%28tableview.superview.superview.move_path_field.text%20%2B%20%27%2F%27%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_list_source.items%20%3D%20build_directory%28tableview.superview.superview.move_path_field.text%20%2B%20selection%29%5Cn%5Ct%5Ct%5Ct%23%20Set%20text%20field%20to%20display%20new%20path%5Cn%5Ct%5Ct%5Cttableview.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ct%5Cttableview.superview.superview.select_folder.title%20%3D%20%20%27Move%20to%20%5C%5C%27%27%20%2B%20tableview.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ct%5Ct%5Ct%23%20Enable%20the%20back%20button%20if%20you%20are%20no%20longer%20on%20the%20top%20level%20directory%5Cn%5Ct%5Ct%5Ctif%20tableview.superview.superview.move_path_field.text%20%21%3D%20%27%2F%27%3A%5Cn%5Ct%5Ct%5Ct%5Cttableview.superview.superview.move_back_button.enabled%20%3D%20True%5Cn%5Cn%23%20Build%20directory%20to%20be%20displayed%20in%20rows%20of%20TableView%20for%20moving%20files%5Cndef%20build_move_directory%28path%3Dparams%5B%27Initial_Path%27%5D%29%3A%5Cn%5Ct%23%20Get%20directory%20as%20dictionary%20with%20keys%20marking%20items%20as%20files%20or%20folders%5Cn%5Ctlist_items%20%3D%20ftp.directory_with_types%28path%29%5Cn%5Ctsource_list%20%3D%20%5B%5D%5Cn%5Ct%23%20Pull%20data%20from%20list_items%20and%20prepare%20a%20list%20of%20dictionaries%20readable%20by%20ListDataSource%20element%5Cn%5Ctfor%20item%20in%20list_items%3A%5Cn%5Ct%5Ctd%20%3D%20%7B%7D%5Cn%5Ct%5Ctd%5B%27title%27%5D%20%3D%20list_items%5Bitem%5D%5B%27title%27%5D%5Cn%5Ct%5Ct%23%20For%20files%2C%20do%20not%20include%20accessory%20action%20icons%20in%20their%20rows%2C%20but%20mark%20them%20with%20file%20icons%5Cn%5Ct%5Ctif%20list_items%5Bitem%5D%5B%27type%27%5D%20%3D%3D%20%27file%27%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27none%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-document-24%27%5Cn%5Ct%5Ct%23%20For%20folders%2C%20add%20chevron%20arrow%20accessory%20action%20icons%20to%20rows%20and%20mark%20with%20folder%20icons%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctd%5B%27accessory_type%27%5D%20%3D%20%27disclosure_indicator%27%5Cn%5Ct%5Ct%5Ctd%5B%27image%27%5D%20%3D%20%27ionicons-folder-24%27%5Cn%5Ct%5Ct%23%20Add%20each%20prepared%20dictionary%20to%20overall%20list%20of%20dictionaries%5Cn%5Ct%5Ctif%20d%5B%27title%27%5D%5B%3A1%5D%20%21%3D%20%27.%27%3A%5Cn%5Ct%5Ct%5Ctsource_list.append%28d%29%5Cn%5Ct%23%20Return%20list%20of%20dictionaries%20with%20all%20files%20and%20folders%20properly%20flagged%5Ct%5Cn%5Ctreturn%20source_list%5Cn%5Ct%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20Move%20File%2FFolder%20Buttons%20%23%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cndef%20move_back_button_tapped%28sender%29%3A%5Cn%5Ct%23%20Get%20current%20path%5Cn%5Ctpath%20%3D%20sender.superview.superview.move_path_field.text%5Cn%5Ct%23%20Split%20the%20path%20at%20slashes%5Cn%5Ctpath%20%3D%20path.split%28%27%2F%27%29%5Cn%5Ctnew_path%20%3D%20%27%27%5Cn%5Ct%23%20Put%20the%20path%20back%20together%20with%20slashes%2C%20but%20leave%20the%20final%20path%20item%20removed%20%28path%20is%20back%20one%20level%29%5Cn%5Ctfor%20i%20in%20range%28len%28path%29%20-%201%29%3A%5Cn%5Ct%5Ctnew_path%20%2B%3D%20path%5Bi%5D%20%2B%20%27%2F%27%5Cn%5Ct%23%20Remove%20trailing%20backslash%2C%20unless%20you%20are%20in%20the%20top%20level%20directory%20%27%2F%27%5Cn%5Ctif%20len%28new_path%29%20%3E%201%3A%5Cn%5Ct%5Ctnew_path%20%3D%20new_path%5B%3A-1%5D%5Cn%5Ct%23%20Build%20the%20directory%20for%20the%20new%20path%20and%20send%20it%20to%20the%20ListDataSource%20element%5Cn%5Ctsender.superview.superview.move_list_source.items%20%3D%20build_move_directory%28new_path%29%5Cn%5Ct%23%20Adjust%20the%20title%20TextField%20to%20display%20the%20new%20path%5Cn%5Ctsender.superview.superview.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ctsender.superview.superview.select_folder.title%20%3D%20%27Move%20to%20%5C%5C%27%27%20%2B%20sender.superview.superview.move_path_field.text%20%2B%20%27%5C%5C%27%27%5Cn%5Ct%23%20If%20the%20new%20path%20leaves%20you%20at%20the%20top%20level%20directory%2C%20disable%20the%20back%20button%5Cn%5Ctif%20new_path%20%3D%3D%20%27%2F%27%3A%5Cn%5Ct%5Ctsender.enabled%20%3D%20False%5Cn%5Ct%5Ct%5Cndef%20move_cancel_button_tapped%28sender%29%3A%5Cn%5Ctsender.superview.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_table_view.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_back_button.hidden%20%3D%20True%5Cn%5Ctsender.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.select_folder.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.move_label_background.hidden%20%3D%20True%5Cn%5Ctsender.superview.superview.table_view.hidden%20%3D%20False%5Cn%5Ctsender.superview.superview.plus_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.back_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.home_button.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.secondary_button1.enabled%20%3D%20True%5Cn%5Ctsender.superview.superview.file_label.editable%20%3D%20False%5Cn%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cn%23%23%23%23%23%20User%20Interface%20%23%23%23%23%23%5Cn%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%5Cnclass%20FTP_Client%28ui.View%29%3A%5Cn%5Ctdef%20__init__%28self%2Cdata_source%29%3A%5Cn%5Ct%5Ct%23%20Set%20up%20the%20view%5Cn%5Ct%5Ctself.bounds%20%3D%20%280%2C0%2C320%2C500%29%5Cn%5Ct%5Ctself.background_color%20%3D%20%27%23F6F6F6%27%5Cn%5Ct%5Ctself.name%20%3D%20%27FTP_Client%27%5Cn%5Ct%5Ct%23%20Set%20up%20the%20loading%20icon%5Cn%5Ct%5Ctself.loading_view%20%3D%20ui.ActivityIndicator%28%29%5Cn%5Ct%5Ctself.loading_view.center%20%3D%20%28self.width%20%2F%202%2C%20self.height%20%2F%202%29%5Cn%5Ct%5Ctself.loading_view.style%20%3D%20ui.ACTIVITY_INDICATOR_STYLE_GRAY%5Cn%5Ct%5Ctself.add_subview%28self.loading_view%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TextField%20where%20the%20path%20will%20be%20displayed%5Cn%5Ct%5Ctself.path_field%20%3D%20ui.TextField%28%29%5Cn%5Ct%5Ctself.path_field.placeholder%20%3D%20%27%2F%27%5Cn%5Ct%5Ctself.path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ctself.path_field.frame%20%3D%20%2815%2C60%2Cself.width-30%2C32%29%20%23%20Define%20the%20field%27s%20coordinates%20and%20measurments%5Cn%5Ct%5Ctself.path_field.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Ctself.path_field.delegate%20%3D%20path_navigation_delegate%28%29%20%23%20Set%20up%20the%20TextField%27s%20delegate%5Cn%5Ct%5Ctself.add_subview%28self.path_field%29%5Cn%5Ct%5Ctnav_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctnav_background.frame%20%3D%20%2847%2C0%2Cself.width%2C50%29%5Cn%5Ct%5Ctnav_background.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctnav_background.center%20%3D%20%28self.width%2F2%2C25%29%5Cn%5Ct%5Ctnav_background.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Ctnav_background.send_to_back%28%29%5Cn%5Ct%5Ctself.add_subview%28nav_background%29%5Cn%5Ct%5Cttitle%20%3D%20ui.Label%28%29%5Cn%5Ct%5Cttitle.text%20%3D%20params%5B%27FTP_Server%27%5D%20%23%20Text%20to%20display%20on%20title%20bar%5Cn%5Ct%5Cttitle.frame%20%3D%20%2847%2C0%2Cself.width-128%2C50%29%5Cn%5Ct%5Cttitle.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Cttitle.center%20%3D%20%28self.width%2F2%2B15%2C25%29%5Cn%5Ct%5Cttitle.alignment%20%3D%20ui.ALIGN_CENTER%5Cn%5Ct%5Cttitle.send_to_back%28%29%5Cn%5Ct%5Ctself.add_subview%28title%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20back%20button%5Cn%5Ct%5Ctself.back_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.back_button.image%20%3D%20ui.Image.named%28%27ionicons-chevron-left-24%27%29%5Cn%5Ct%5Ctself.back_button.frame%20%3D%20%2810%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.back_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.back_button.action%20%3D%20back_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20back_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.back_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20plus%20button%5Cn%5Ct%5Ctself.plus_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.plus_button.image%20%3D%20ui.Image.named%28%27ionicons-plus-24%27%29%5Cn%5Ct%5Ctself.plus_button.frame%20%3D%20%28275%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.plus_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.plus_button.action%20%3D%20plus_button_tapped%20%23%20Set%20the%20plus%20button%27s%20action%20to%20plus_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.plus_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20home%20button%5Cn%5Ct%5Ctself.home_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.home_button.image%20%3D%20ui.Image.named%28%27ionicons-home-24%27%29%5Cn%5Ct%5Ctself.home_button.frame%20%3D%20%2845%2C10%2C32%2C32%29%5Cn%5Ct%5Ctself.home_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.home_button.action%20%3D%20home_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20back_button_tapped%20function%5Cn%5Ct%5Ctself.add_subview%28self.home_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20data%20source%20element%20for%20the%20TableView%5Cn%5Ct%5Ctself.list_source%20%3D%20ui.ListDataSource%28items%3D%5B%5D%29%5Cn%5Ct%5Ctself.list_source.move_enabled%20%3D%20False%5Cn%5Ct%5Ctself.list_source.delete_enabled%20%3D%20False%5Cn%5Ct%5Ctself.list_source.items%20%3D%20data_source%20%23%20Set%20data%20source%20to%20the%20element%20that%20will%20be%20passed%20into%20this%20class%20upon%20initiation%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TableView%5Cn%5Ct%5Ctself.table_view%20%3D%20ui.TableView%28%29%5Cn%5Ct%5Ctself.table_view.row_height%20%3D%2044%5Cn%5Ct%5Ctself.table_view.delegate%20%3D%20navigation_delegate%28%29%20%23%20Link%20the%20navigation%20delegate%5Cn%5Ct%5Ctself.table_view.frame%20%3D%20%280%2C100%2Cself.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.table_view.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.table_view.data_source%20%3D%20self.list_source%20%23%20Set%20the%20data%20source%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctself.add_subview%28self.table_view%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20view%20for%20button%20actions%5Cn%5Ct%5Ctself.button_actions%20%3D%20ui.View%28%29%5Cn%5Ct%5Ctself.button_actions.bounds%20%3D%20%280%2C0%2C320%2C460%29%5Cn%5Ct%5Ctself.button_actions.center%20%3D%20%28self.width%2F2%2Cself.height%2F2%2B40%29%5Cn%5Ct%5Ctself.button_actions.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.button_actions.name%20%3D%20%27button_actions%27%5Cn%5Ct%5Ctself.button_actions.flex%20%3D%20%27WH%27%5Cn%5Ct%5Ctself.button_actions.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.button_actions.hidden%20%3D%20True%20%23%20Hide%20view%20until%20needed%5Cn%5Ct%5Ctself.add_subview%28self.button_actions%29%5Cn%5Ct%5Ctself.label_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctself.label_background.text%20%3D%20%27%27%5Cn%5Ct%5Ctself.label_background.frame%20%3D%20%280%2C0%2Cself.width%2C50%29%5Cn%5Ct%5Ctself.label_background.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.label_background.background_color%20%3D%20%27%23f8f8f8%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.label_background%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20title%20label%20to%20display%20which%20file%20was%20selected%5Cn%5Ct%5Ctself.file_label%20%3D%20ui.TextView%28%29%5Cn%5Ct%5Ctself.file_label.font%20%3D%20%28%27%3Csystem%3E%27%2C%2018%29%5Cn%5Ct%5Ctself.file_label.frame%20%3D%20%280%2C0%2Cself.width-55%2C45%29%5Cn%5Ct%5Ctself.file_label.center%20%3D%20%28self.width%2F2%2B25%2Cself.height%2F8-25%29%5Cn%5Ct%5Ctself.file_label.background_color%20%3D%20%27%23f8f8f8%27%5Cn%5Ct%5Ctself.file_label.alignment%20%3D%20ui.ALIGN_LEFT%5Cn%5Ct%5Ctself.file_label.editable%20%3D%20False%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.file_label%29%5Cn%5Ct%5Ctself.file_icon%20%3D%20ui.ImageView%28%29%5Cn%5Ct%5Ctself.file_icon.frame%20%3D%20%280%2C0%2C23%2C23%29%5Cn%5Ct%5Ctself.file_icon.center%20%3D%20%2830%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.file_icon%29%5Cn%5Ct%5Ct%23%20Set%20up%20scroll%20view%20so%20all%20buttons%20can%20be%20accessed%20if%20keyboard%20is%20up%5Cn%5Ct%5Ctself.scroll_buttons%20%3D%20ui.ScrollView%28%29%5Cn%5Ct%5Ctself.scroll_buttons.frame%20%3D%20%280%2C58%2Cself.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.scroll_buttons.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.scroll_buttons.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.scroll_buttons.always_bounce_vertical%20%3D%20True%5Cn%5Ct%5Ctself.scroll_buttons.bounces%20%3D%20True%5Cn%5Ct%5Ctself.scroll_buttons.content_size%20%3D%20%28self.width%2C%20self.height%20-%20100%29%5Cn%5Ct%5Ctself.scroll_buttons.paging_enabled%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.scroll_buttons%29%5Cn%5Ct%5Ct%23%20Set%20up%20button1%5Cn%5Ct%5Ctself.button1%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button1.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button1.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8-27%29%5Cn%5Ct%5Ctself.button1.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button1%29%5Cn%5Ct%5Ct%23%20Set%20up%20button2%5Cn%5Ct%5Ctself.button2%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button2.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button2.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8-27%29%5Cn%5Ct%5Ctself.button2.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button2.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button2%29%5Cn%5Ct%5Ct%23%20Set%20up%20button3%5Cn%5Ct%5Ctself.button3%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button3.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button3.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B32%29%5Cn%5Ct%5Ctself.button3.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button3.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button3%29%5Cn%5Ct%5Ct%23%20Set%20up%20button4%5Cn%5Ct%5Ctself.button4%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button4.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button4.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B32%29%5Cn%5Ct%5Ctself.button4.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button4.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button4%29%5Cn%5Ct%5Ct%23%20Set%20up%20button5%5Cn%5Ct%5Ctself.button5%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button5.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button5.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B91%29%5Cn%5Ct%5Ctself.button5.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button5.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button5%29%5Cn%5Ct%5Ct%23%20Set%20up%20button6%5Cn%5Ct%5Ctself.button6%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button6.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button6.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B91%29%5Cn%5Ct%5Ctself.button6.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button6.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button6%29%5Cn%5Ct%5Ct%23%20Set%20up%20button7%5Cn%5Ct%5Ctself.button7%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button7.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button7.center%20%3D%20%28self.width%2F4%2B3%2Cself.height%2F8%2B150%29%5Cn%5Ct%5Ctself.button7.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button7.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button7%29%5Cn%5Ct%5Ct%23%20Set%20up%20button8%5Cn%5Ct%5Ctself.button8%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.button8.frame%20%3D%20%280%2C15%2Cself.width%2F2.2%2C50%29%5Cn%5Ct%5Ctself.button8.center%20%3D%20%28self.width%2F2%2B77%2Cself.height%2F8%2B150%29%5Cn%5Ct%5Ctself.button8.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button8.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.button8%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20close%20button%20to%20dismiss%20the%20button%20actions%20view%5Cn%5Ct%5Ctself.close_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.close_button.title%20%3D%20%27Close%27%5Cn%5Ct%5Ctself.close_button.frame%20%3D%20%280%2C15%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.close_button.center%20%3D%20%28self.width%2F2%2Cself.height%2F8%2B210%29%5Cn%5Ct%5Ctself.close_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.close_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.close_button.action%20%3D%20close_button_tapped%5Cn%5Ct%5Ctself.scroll_buttons.add_subview%28self.close_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20view%20for%20secondary%20actions%5Cn%5Ct%5Ctself.secondary_actions%20%3D%20ui.View%28%29%5Cn%5Ct%5Ctself.secondary_actions.bounds%20%3D%20%280%2C0%2C320%2C460%29%5Cn%5Ct%5Ctself.secondary_actions.center%20%3D%20%28self.width%2F2%2Cself.height%2F2%2B40%29%5Cn%5Ct%5Ctself.secondary_actions.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.secondary_actions.name%20%3D%20%27secondary_actions%27%5Cn%5Ct%5Ctself.secondary_actions.flex%20%3D%20%27WH%27%5Cn%5Ct%5Ctself.secondary_actions.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.secondary_actions.hidden%20%3D%20True%20%23%20Hide%20view%20until%20needed%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.secondary_actions%29%5Cn%5Ct%5Ct%23%20Set%20up%20Secondary%20button1%5Cn%5Ct%5Ctself.secondary_button1%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.secondary_button1.frame%20%3D%20%280%2C15%2Cself.width-21%2C50%29%5Cn%5Ct%5Ctself.secondary_button1.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-29%29%5Cn%5Ct%5Ctself.secondary_button1.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.secondary_button1.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.secondary_actions.add_subview%28self.secondary_button1%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20cancel%20button%20to%20dismiss%20the%20secondary%20actions%20view%5Cn%5Ct%5Ctself.cancel_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.cancel_button.title%20%3D%20%27Cancel%27%5Cn%5Ct%5Ctself.cancel_button.frame%20%3D%20%280%2C15%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.cancel_button.center%20%3D%20%28self.width%2F2%2C94%29%5Cn%5Ct%5Ctself.cancel_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.cancel_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.cancel_button.action%20%3D%20cancel_button_tapped%5Cn%5Ct%5Ctself.secondary_actions.add_subview%28self.cancel_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20data%20source%20element%20for%20the%20TableView%20for%20moving%20files%5Cn%5Ct%5Ctself.move_list_source%20%3D%20ui.ListDataSource%28items%3D%5B%5D%29%5Cn%5Ct%5Ctself.move_list_source.move_enabled%20%3D%20False%5Cn%5Ct%5Ctself.move_list_source.delete_enabled%20%3D%20False%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TableView%20for%20Moving%20Files%5Cn%5Ct%5Ctself.move_table_view%20%3D%20ui.TableView%28%29%5Cn%5Ct%5Ctself.move_table_view.row_height%20%3D%2044%5Cn%5Ct%5Ctself.move_table_view.delegate%20%3D%20move_delegate%28%29%20%23%20Link%20the%20navigation%20delegate%20for%20moving%20files%5Cn%5Ct%5Ctself.move_table_view.frame%20%3D%20%280%2C127%2Cself.width%2C%20self.height%20-%20185%29%5Cn%5Ct%5Ctself.move_table_view.flex%20%3D%20%27H%27%5Cn%5Ct%5Ctself.move_table_view.data_source%20%3D%20self.move_list_source%20%23%20Set%20the%20data%20source%20to%20the%20ListDataSource%20element%5Cn%5Ct%5Ctself.move_table_view.hidden%20%3D%20True%5Cn%5Ct%5Ctself.move_table_view.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.move_table_view.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_table_view%29%5Cn%5Ct%5Ctself.move_label_background%20%3D%20ui.Label%28%29%5Cn%5Ct%5Ctself.move_label_background.text%20%3D%20%27%27%5Cn%5Ct%5Ctself.move_label_background.frame%20%3D%20%280%2C0%2Cself.width%2C170%29%5Cn%5Ct%5Ctself.move_label_background.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.move_label_background.hidden%20%3D%20True%5Cn%5Ct%5Ctself.move_label_background.background_color%20%3D%20%27%23f0f0f0%27%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_label_background%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20button%20to%20select%20folder%20to%20move%20file%20into%5Cn%5Ct%5Ctself.select_folder%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.select_folder.frame%20%3D%20%280%2C0%2Cself.width-20%2C50%29%5Cn%5Ct%5Ctself.select_folder.center%20%3D%20%28self.width%2F2%2Cself.height%2F8-28%29%5Cn%5Ct%5Ctself.select_folder.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.select_folder.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.select_folder%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20back%20button%20for%20the%20move%20file%20view%5Cn%5Ct%5Ctself.move_back_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.move_back_button.image%20%3D%20ui.Image.named%28%27ionicons-chevron-left-24%27%29%5Cn%5Ct%5Ctself.move_back_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.move_back_button.frame%20%3D%20%2810%2C69%2C50%2C50%29%5Cn%5Ct%5Ctself.move_back_button.font%20%3D%20%28%27%3Csystem%3E%27%2C%2025%29%5Cn%5Ct%5Ctself.move_back_button.action%20%3D%20move_back_button_tapped%20%23%20Set%20the%20back%20button%27s%20action%20to%20move_back_button_tapped%20function%5Cn%5Ct%5Ctself.move_back_button.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_back_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20cancel%20button%20to%20dismiss%20the%20move%20file%20view%5Cn%5Ct%5Ctself.move_cancel_button%20%3D%20ui.Button%28%29%5Cn%5Ct%5Ctself.move_cancel_button.title%20%3D%20%27Cancel%27%5Cn%5Ct%5Ctself.move_cancel_button.frame%20%3D%20%280%2C15%2Cself.width-80%2C50%29%5Cn%5Ct%5Ctself.move_cancel_button.center%20%3D%20%28self.width%2F2%2B30%2Cself.height%2F8%2B31%29%5Cn%5Ct%5Ctself.move_cancel_button.background_color%20%3D%20%27%23fff%27%5Cn%5Ct%5Ctself.move_cancel_button.alpha%20%3D%201.0%5Cn%5Ct%5Ctself.move_cancel_button.action%20%3D%20move_cancel_button_tapped%5Cn%5Ct%5Ctself.move_cancel_button.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_cancel_button%29%5Cn%5Ct%5Ct%23%20Set%20up%20the%20TextField%20where%20the%20current%20path%20will%20be%20held%5Cn%5Ct%5Ctself.move_path_field%20%3D%20ui.TextField%28%29%5Cn%5Ct%5Ctself.move_path_field.text%20%3D%20ftp.ftp.pwd%28%29%5Cn%5Ct%5Ctself.move_path_field.hidden%20%3D%20True%5Cn%5Ct%5Ctself.button_actions.add_subview%28self.move_path_field%29%5Cn%5Cn%23%20Build%20the%20initial%20directory%20and%20store%20it%20to%20the%20source_list%20variable%5Cnsource_list%20%3D%20build_directory%28%29%5Cn%5Cn%23%20Initiate%20the%20view%20and%20pass%20it%20the%20source_list%5Cnview%20%3D%20FTP_Client%28source_list%29%5Cn%23%20Present%20the%20view%20in%20a%20popover%5Cnview.present%28style%20%3D%20%27popover%27%2C%20hide_title_bar%20%3D%20True%29%5Cn%22%2C%20%228FA2F3A3-A33F-4E29-B492-31CA733496EC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2226DF96A7-B364-42B8-93AE-439D0650676A%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22A9D399AD-1AE7-453D-9F37-9B66FE3DF0A9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%227C719344-C891-4AB0-95AE-A113A91D1248%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%221E45370D-12DA-4162-BE1D-00E57FD826A1%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226BB5C954-DACE-44BC-BAA5-BA386343A159%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2293D7ECD9-8FF4-4ED4-910A-1024DFFA875F%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%223D76ECEE-8D86-4F1F-B6CE-161124D878F3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2215E08D0D-F62D-4AC0-92EF-A2809B7DFBB6%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22F276A4A8-DABC-4867-A241-5D85D5A2F8D4%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E4A933E5-76E4-4B94-8996-0AEEF41399E8%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22BFEAA0EA-62A6-4DA4-976D-493B3F338463%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%226D17DF79-ECA4-4EF9-B5D2-1AAB32E34D11%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2268A2A40E-0E92-4737-8FF2-F176B3645CBC%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20and%20hold%20the%20action%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ui%22%3A%20%22%5B%7B%5C%22class%5C%22%3A%5C%22View%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22background_color%5C%22%3A%5C%22RGBA%281.000000%2C1.000000%2C1.000000%2C1.000000%29%5C%22%2C%5C%22tint_color%5C%22%3A%5C%22RGBA%280.000000%2C0.478000%2C1.000000%2C1.000000%29%5C%22%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22flex%5C%22%3A%5C%22%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B0%2C%200%7D%2C%20%7B540%2C%20575%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%7B%5C%22class%5C%22%3A%5C%22View%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22name%5C%22%3A%5C%22view1%5C%22%2C%5C%22uuid%5C%22%3A%5C%22691D7635-ED21-47B1-BB0C-D03DF74DFA8B%5C%22%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22flex%5C%22%3A%5C%22%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B162%2C%20279%7D%2C%20%7B215%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%2C%7B%5C%22class%5C%22%3A%5C%22Button%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22font_size%5C%22%3A15%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22flex%5C%22%3A%5C%22%5C%22%2C%5C%22font_bold%5C%22%3Afalse%2C%5C%22name%5C%22%3A%5C%22button1%5C%22%2C%5C%22uuid%5C%22%3A%5C%22891737B6-0D9F-4C3A-AABF-15D9B73D64AB%5C%22%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22title%5C%22%3A%5C%22Download%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B162%2C%20279%7D%2C%20%7B107%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%2C%7B%5C%22class%5C%22%3A%5C%22Button%5C%22%2C%5C%22attributes%5C%22%3A%7B%5C%22font_size%5C%22%3A15%2C%5C%22enabled%5C%22%3Atrue%2C%5C%22flex%5C%22%3A%5C%22%5C%22%2C%5C%22font_bold%5C%22%3Afalse%2C%5C%22name%5C%22%3A%5C%22button2%5C%22%2C%5C%22uuid%5C%22%3A%5C%2293DF31A4-D186-45A9-8180-04EB9C517035%5C%22%2C%5C%22border_color%5C%22%3A%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5C%22title%5C%22%3A%5C%22Overwrite%5C%22%7D%2C%5C%22frame%5C%22%3A%5C%22%7B%7B270%2C%20279%7D%2C%20%7B107%2C%2058%7D%7D%5C%22%2C%5C%22nodes%5C%22%3A%5B%5D%7D%5D%7D%5D%22%2C%20%22D4B85DD2-E06A-467A-9137-868147CB5EF5%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22E48FCCAE-719D-4713-936F-4217132FB7F9%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%229EF136C5-4458-4EC1-8B41-2CEC520138DB%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%2207E5006D-CD8C-4383-8BE9-6A8D8F6CCC07%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22AA0729B7-4EA3-4539-98A3-9FA5550C5AF3%22%3A%20%7B%22text%22%3A%20%22This%20action%20runs%20a%20Python%20script%20that%20can%20be%20configured%20with%20your%20own%20parameters.%20Tap%20the%20options%20%28%5Cu25bc%29%20button%20to%20edit%20the%20script%20or%20the%20parameters%20that%20are%20shown%20here.%20This%20comment%20is%20actually%20a%20text%20parameter%20itself%20%5Cu2013%20feel%20free%20to%20remove%20it.%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCustom%22%7D%5D%2C%20%22name%22%3A%20%22FTP_Client%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone9%2C4%22%2C%20%22systemVersion%22%3A%20%2213.1.2%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-transfer-upload-5.png%22%7D", "description": "This is a custom UI for Editorial which will present a fully featured FTP client in a popup window over the editor.\n\nAfter downloading you will need to tap the Info button next to the workflow, go to the Edit Workflow page, tap on the action block to expand it, and fill in your FTP login credentials in the variables below. Once you've done that just run it from the workflow menu and you should be set.", "title": "FTP_Client"}, {"url": "http://editorial-app.appspot.com/workflow/5826075359707136/uTQqi50FT3E", "workflow_data": {"username": "", "description": "Shows a diff that compares the selected document with text in the clipboard. The diff is shown in the Preview panel.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"script": "#coding: utf-8\nimport workflow\nimport difflib\nimport clipboard\nimport re\nimport editor\nimport console\n\ndef main():\n\ttext1 = clipboard.get()\n\tif not text1:\n\t\tconsole.hud_alert('Clipboard Empty', 'error')\n\t\tworkflow.stop()\n\t\treturn\n\ttext2 = editor.get_text()\n\tif not text2:\n\t\tconsole.hud_alert('No Text in Editor', 'error')\n\t\tworkflow.stop()\n\t\treturn\n\td = difflib.Differ()\n\tlines1 = text1.splitlines()\n\tlines2 = text2.splitlines()\n\tout_lines = []\n\tdiff_lines = list(d.compare(lines1, lines2))\n\tfor i, line in enumerate(diff_lines):\n\t\tif line.startswith('+'):\n\t\t\tout_lines.append('
%s
' % line[2:])\n\t\telif line.startswith('-'):\n\t\t\tout_lines.append('
%s
' % line[2:])\n\t\telif line.startswith('?') and i > 0:\n\t\t\tprev_line = diff_lines[i-1]\n\t\t\tranges = [(m.start(), m.end()) for m in re.finditer(r'\\++|-+', line)]\n\t\t\tfor start, end in reversed(ranges):\n\t\t\t\tspan_tag = '' % ('deleted' if line[start] == '-' else 'added')\n\t\t\t\tprev_line = prev_line[:start] + span_tag + prev_line[start:end] + '' + prev_line[end:]\n\t\t\tpre_tag = '
' % ('added' if prev_line.startswith('+') else 'deleted')\n\t\t\tout_lines[i-1] = '%s%s
' % (pre_tag, prev_line[2:],)\n\t\t\tout_lines.append('')\n\t\telse:\n\t\t\tout_lines.append('
%s
' % line[2:])\n\t\n\tworkflow.set_output('\\n'.join(out_lines))\n\nmain()\n"}, "class": "WorkflowActionRunScript"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"html": {"text": "\n\n\n\n\n\n?\n\n", "tokenRanges": {"{763, 1}": "Input"}, "type": "advancedText"}, "baseURL": "", "title": "Diff"}, "class": "WorkflowActionShowHTMLPreview"}], "name": "Diff with Clipboard", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone9,4", "systemVersion": "13.1.2"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_DIRECTIONS.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Shows%20a%20diff%20that%20compares%20the%20selected%20document%20with%20text%20in%20the%20clipboard.%20The%20diff%20is%20shown%20in%20the%20Preview%20panel.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22script%22%3A%20%22%23coding%3A%20utf-8%5Cnimport%20workflow%5Cnimport%20difflib%5Cnimport%20clipboard%5Cnimport%20re%5Cnimport%20editor%5Cnimport%20console%5Cn%5Cndef%20main%28%29%3A%5Cn%5Cttext1%20%3D%20clipboard.get%28%29%5Cn%5Ctif%20not%20text1%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27Clipboard%20Empty%27%2C%20%27error%27%29%5Cn%5Ct%5Ctworkflow.stop%28%29%5Cn%5Ct%5Ctreturn%5Cn%5Cttext2%20%3D%20editor.get_text%28%29%5Cn%5Ctif%20not%20text2%3A%5Cn%5Ct%5Ctconsole.hud_alert%28%27No%20Text%20in%20Editor%27%2C%20%27error%27%29%5Cn%5Ct%5Ctworkflow.stop%28%29%5Cn%5Ct%5Ctreturn%5Cn%5Ctd%20%3D%20difflib.Differ%28%29%5Cn%5Ctlines1%20%3D%20text1.splitlines%28%29%5Cn%5Ctlines2%20%3D%20text2.splitlines%28%29%5Cn%5Ctout_lines%20%3D%20%5B%5D%5Cn%5Ctdiff_lines%20%3D%20list%28d.compare%28lines1%2C%20lines2%29%29%5Cn%5Ctfor%20i%2C%20line%20in%20enumerate%28diff_lines%29%3A%5Cn%5Ct%5Ctif%20line.startswith%28%27%2B%27%29%3A%5Cn%5Ct%5Ct%5Ctout_lines.append%28%27%3Cpre%20class%3D%5C%22diffline%20added%5C%22%3E%25s%3C%2Fpre%3E%27%20%25%20line%5B2%3A%5D%29%5Cn%5Ct%5Ctelif%20line.startswith%28%27-%27%29%3A%5Cn%5Ct%5Ct%5Ctout_lines.append%28%27%3Cpre%20class%3D%5C%22diffline%20deleted%5C%22%3E%25s%3C%2Fpre%3E%27%20%25%20line%5B2%3A%5D%29%5Cn%5Ct%5Ctelif%20line.startswith%28%27%3F%27%29%20and%20i%20%3E%200%3A%5Cn%5Ct%5Ct%5Ctprev_line%20%3D%20diff_lines%5Bi-1%5D%5Cn%5Ct%5Ct%5Ctranges%20%3D%20%5B%28m.start%28%29%2C%20m.end%28%29%29%20for%20m%20in%20re.finditer%28r%27%5C%5C%2B%2B%7C-%2B%27%2C%20line%29%5D%5Cn%5Ct%5Ct%5Ctfor%20start%2C%20end%20in%20reversed%28ranges%29%3A%5Cn%5Ct%5Ct%5Ct%5Ctspan_tag%20%3D%20%27%3Cspan%20class%3D%5C%22%25s-highlight%5C%22%3E%27%20%25%20%28%27deleted%27%20if%20line%5Bstart%5D%20%3D%3D%20%27-%27%20else%20%27added%27%29%5Cn%5Ct%5Ct%5Ct%5Ctprev_line%20%3D%20prev_line%5B%3Astart%5D%20%2B%20span_tag%20%2B%20prev_line%5Bstart%3Aend%5D%20%2B%20%27%3C%2Fspan%3E%27%20%2B%20prev_line%5Bend%3A%5D%5Cn%5Ct%5Ct%5Ctpre_tag%20%3D%20%27%3Cpre%20class%3D%5C%22diffline%20%25s%5C%22%3E%27%20%25%20%28%27added%27%20if%20prev_line.startswith%28%27%2B%27%29%20else%20%27deleted%27%29%5Cn%5Ct%5Ct%5Ctout_lines%5Bi-1%5D%20%3D%20%27%25s%25s%3C%2Fpre%3E%27%20%25%20%28pre_tag%2C%20prev_line%5B2%3A%5D%2C%29%5Cn%5Ct%5Ct%5Ctout_lines.append%28%27%27%29%5Cn%5Ct%5Ctelse%3A%5Cn%5Ct%5Ct%5Ctout_lines.append%28%27%3Cpre%20class%3D%5C%22common%5C%22%3E%25s%3C%2Fpre%3E%27%20%25%20line%5B2%3A%5D%29%5Cn%5Ct%5Cn%5Ctworkflow.set_output%28%27%5C%5Cn%27.join%28out_lines%29%29%5Cn%5Cnmain%28%29%5Cn%22%7D%2C%20%22class%22%3A%20%22WorkflowActionRunScript%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22html%22%3A%20%7B%22text%22%3A%20%22%3C%21DOCTYPE%20html%3E%5Cn%3Chtml%3E%5Cn%3Chead%3E%3Cmeta%20charset%3D%5C%22utf-8%5C%22%2F%3E%5Cn%3Cstyle%20type%3D%5C%22text%2Fcss%5C%22%3E%5Cnbody%20%7B%5Cn%5Ctbackground-color%3A%20%23f6f6f6%3B%5Cn%5Ctcolor%3A%20%23333%3B%5Cn%5Ctmargin%3A%2016px%3B%5Cn%7D%5Cnpre%20%7B%5Cn%5Ctfont-family%3A%20Menlo%2C%20monospace%3B%5Cn%5Ctwhite-space%3A%20pre-wrap%3B%5Cn%5Ctmargin-top%3A%200%3B%5Cn%5Ctmargin-bottom%3A%200%3B%5Cn%5Ctoverflow%3A%20hidden%3B%5Cn%7D%5Cnpre.diffline%20%7B%5Cn%5Ctborder-width%3A%200%200%200%208px%3B%5Cn%5Ctmargin-left%3A%20-16px%3B%5Cn%5Ctmargin-right%3A%20-16px%3B%5Cn%5Ctpadding-right%3A%2016px%3B%5Cn%5Ctpadding-left%3A%208px%3B%5Cn%5Ctborder-style%3A%20solid%3B%5Cn%7D%5Cn.added%20%7B%5Cn%5Ctcolor%3A%20green%3B%5Cn%5Ctbackground-color%3A%20%23f4fbef%3B%5Cn%5Ctborder-color%3A%20%23c9ffb3%3B%5Cn%7D%5Cn.deleted%20%7B%5Cn%5Ctcolor%3A%20%23820e03%3B%5Cn%5Ctbackground-color%3A%20%23fbefef%3B%5Cn%5Ctborder-color%3A%20%23ffb3b4%3B%5Cn%7D%5Cn.deleted-highlight%20%7B%5Cn%5Ctbackground-color%3A%20%23ffb3b4%3B%5Cn%5Ctborder-radius%3A%203px%3B%5Cn%7D%5Cn.added-highlight%20%7B%5Cn%5Ctbackground-color%3A%20%23c9ffb3%3B%5Cn%5Ctborder-radius%3A%203px%3B%5Cn%7D%5Cn.common%20%7B%5Cn%5Ctcolor%3A%20%23999%3B%5Cn%7D%5Cn%3C%2Fstyle%3E%5Cn%3C%2Fhead%3E%5Cn%3Cbody%3E%5Cn%3F%5Cn%3C%2Fbody%3E%5Cn%3C%2Fhtml%3E%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B763%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22baseURL%22%3A%20%22%22%2C%20%22title%22%3A%20%22Diff%22%7D%2C%20%22class%22%3A%20%22WorkflowActionShowHTMLPreview%22%7D%5D%2C%20%22name%22%3A%20%22Diff%20with%20Clipboard%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone9%2C4%22%2C%20%22systemVersion%22%3A%20%2213.1.2%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_DIRECTIONS.png%22%7D", "description": "Shows a diff that compares the selected document with text in the clipboard. The diff is shown in the Preview panel.", "title": "Diff with Clipboard"}, {"url": "http://editorial-app.appspot.com/workflow/5799339444142080/4qi_H8TEZHc", "workflow_data": {"username": "", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:syntax-mode"}, "type": "advancedText"}, "expression2": {"text": "markdown", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"button1Value": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "button3Value": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "button2Value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "title": "Share Document Text...", "button3Title": "", "button2Title": "Use Plain Text", "button1Title": "Convert to HTML", "message": {"text": "Do you want to convert this Markdown document to HTML for sharing?", "tokenRanges": {}, "type": "advancedText"}, "showCancelButton": true}, "class": "WorkflowActionShowAlert"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "[[html]]", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "emptySelectionOption": 1, "foldedTextOption": 0, "selectEntireLines": false}, "class": "WorkflowActionGetSelectedText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"tables": true, "autolinks": true, "smartypants": true, "strikethrough": true, "footnotes": true, "metadata": false, "superscript": true}, "class": "WorkflowActionConvertMarkdown"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "\n\n\n\n?\n\n", "tokenRanges": {"{67, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionShowShareSheet"}], "name": "Share...", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone10,6", "systemVersion": "13.1.1"}, "type": "wkflw", "public": true, "icon": "minicons-icons-navigation-log-out-2.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Shows%20the%20iOS%20share%20sheet%20with%20the%20selected%20text%20as%20input.%20If%20nothing%20is%20selected%2C%20the%20entire%20document%20is%20shared.%20In%20a%20Markdown%20document%2C%20the%20text%20can%20optionally%20be%20converted%20to%20HTML%20first.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Asyntax-mode%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22markdown%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22button1Value%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button3Value%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22button2Value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22title%22%3A%20%22Share%20Document%20Text...%22%2C%20%22button3Title%22%3A%20%22%22%2C%20%22button2Title%22%3A%20%22Use%20Plain%20Text%22%2C%20%22button1Title%22%3A%20%22Convert%20to%20HTML%22%2C%20%22message%22%3A%20%7B%22text%22%3A%20%22Do%20you%20want%20to%20convert%20this%20Markdown%20document%20to%20HTML%20for%20sharing%3F%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22showCancelButton%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionShowAlert%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22%5B%5Bhtml%5D%5D%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22emptySelectionOption%22%3A%201%2C%20%22foldedTextOption%22%3A%200%2C%20%22selectEntireLines%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetSelectedText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22tables%22%3A%20true%2C%20%22autolinks%22%3A%20true%2C%20%22smartypants%22%3A%20true%2C%20%22strikethrough%22%3A%20true%2C%20%22footnotes%22%3A%20true%2C%20%22metadata%22%3A%20false%2C%20%22superscript%22%3A%20true%7D%2C%20%22class%22%3A%20%22WorkflowActionConvertMarkdown%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3C%21DOCTYPE%20html%3E%5Cn%3Chtml%3E%5Cn%3Chead%3E%3Cmeta%20charset%3D%5C%22utf-8%5C%22%2F%3E%3C%2Fhead%3E%5Cn%3Cbody%3E%5Cn%3F%5Cn%3C%2Fbody%3E%5Cn%3C%2Fhtml%3E%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B67%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionShowShareSheet%22%7D%5D%2C%20%22name%22%3A%20%22Share...%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone10%2C6%22%2C%20%22systemVersion%22%3A%20%2213.1.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-navigation-log-out-2.png%22%7D", "description": "Shows the iOS share sheet with the selected text as input. If nothing is selected, the entire document is shared. In a Markdown document, the text can optionally be converted to HTML first.", "title": "Share..."}, {"url": "http://editorial-app.appspot.com/workflow/5906740604305408/yd0sRhLF77U", "workflow_data": {"username": "", "description": "Modified version of Clean Up Completed Tasks workflow. Intended to be run every now and then on a Main.taskpaper file to empty the archive by filtering lines tagged as @done and prepending them to an Archive.taskpaper. The lack of disclosure triangles in Editorial means having to look at that eventually unwieldy archive, but I don't always want to just delete completed tasks. Thanks to @scottzero for the original workflow this is based on. \n\nNote: all I did was change the filenames (and paths) in the proper actions and then change the line filtering to @done.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"includeExtension": true, "includeFolder": false}, "class": "WorkflowActionGetFileName"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression1": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}, "expression2": {"text": "todo.taskpaper", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionCondition"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "foldedTextOption": 0}, "class": "WorkflowActionGetEditorText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression": {"text": "@done", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 0}, "class": "WorkflowActionFilterLines"}, {"pauseWithoutShowingParameters": true, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "completed", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "foldedTextOption": 0}, "class": "WorkflowActionGetEditorText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"expression": {"text": "@done", "tokenRanges": {}, "type": "advancedText"}, "comparisonType": 1}, "class": "WorkflowActionFilterLines"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "todo", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": true, "ifNotExists": 0, "filename": "done.taskpaper"}, "class": "WorkflowActionGetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "done", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": true, "text": {"text": "?\n?", "tokenRanges": {"{0, 1}": "completed", "{2, 1}": "done"}, "type": "advancedText"}, "ifNotExists": 0, "filename": "done.taskpaper"}, "class": "WorkflowActionSetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"inDropbox": true, "text": {"text": "?", "tokenRanges": {"{0, 1}": "todo"}, "type": "advancedText"}, "ifNotExists": 0, "filename": "todo.taskpaper"}, "class": "WorkflowActionSetFileContents"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionConditionEnd"}], "name": "Clean Up TaskPaper Archive", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone6,1", "systemVersion": "12.4.2"}, "type": "wkflw", "public": true, "icon": "minicons-icons-folder-validate.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Modified%20version%20of%20Clean%20Up%20Completed%20Tasks%20workflow.%20Intended%20to%20be%20run%20every%20now%20and%20then%20on%20a%20Main.taskpaper%20file%20to%20empty%20the%20archive%20by%20filtering%20lines%20tagged%20as%20%40done%20and%20prepending%20them%20to%20an%20Archive.taskpaper.%20The%20lack%20of%20disclosure%20triangles%20in%20Editorial%20means%20having%20to%20look%20at%20that%20eventually%20unwieldy%20archive%2C%20but%20I%20don%27t%20always%20want%20to%20just%20delete%20completed%20tasks.%20Thanks%20to%20%40scottzero%20for%20the%20original%20workflow%20this%20is%20based%20on.%20%5Cn%5CnNote%3A%20all%20I%20did%20was%20change%20the%20filenames%20%28and%20paths%29%20in%20the%20proper%20actions%20and%20then%20change%20the%20line%20filtering%20to%20%40done.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22includeExtension%22%3A%20true%2C%20%22includeFolder%22%3A%20false%7D%2C%20%22class%22%3A%20%22WorkflowActionGetFileName%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression1%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22expression2%22%3A%20%7B%22text%22%3A%20%22todo.taskpaper%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCondition%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22foldedTextOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionGetEditorText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression%22%3A%20%7B%22text%22%3A%20%22%40done%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionFilterLines%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20true%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22completed%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22foldedTextOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionGetEditorText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22expression%22%3A%20%7B%22text%22%3A%20%22%40done%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22comparisonType%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionFilterLines%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22todo%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20true%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22done.taskpaper%22%7D%2C%20%22class%22%3A%20%22WorkflowActionGetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22done%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20true%2C%20%22text%22%3A%20%7B%22text%22%3A%20%22%3F%5Cn%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22completed%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22done%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22done.taskpaper%22%7D%2C%20%22class%22%3A%20%22WorkflowActionSetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22inDropbox%22%3A%20true%2C%20%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22todo%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ifNotExists%22%3A%200%2C%20%22filename%22%3A%20%22todo.taskpaper%22%7D%2C%20%22class%22%3A%20%22WorkflowActionSetFileContents%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionConditionEnd%22%7D%5D%2C%20%22name%22%3A%20%22Clean%20Up%20TaskPaper%20Archive%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone6%2C1%22%2C%20%22systemVersion%22%3A%20%2212.4.2%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-folder-validate.png%22%7D", "description": "Modified version of Clean Up Completed Tasks workflow. Intended to be run every now and then on a Main.taskpaper file to empty the archive by filtering lines tagged as @done and prepending them to an Archive.taskpaper. The lack of disclosure triangles in Editorial means having to look at that eventually unwieldy archive, but I don't always want to just delete completed tasks. Thanks to @scottzero for the original workflow this is based on. \n\nNote: all I did was change the filenames (and paths) in the proper actions and then change the line filtering to @done.", "title": "Clean Up TaskPaper Archive"}, {"url": "http://editorial-app.appspot.com/workflow/5779206315180032/uoVxHz0tSP8", "workflow_data": {"username": "", "description": "This is a work flow that creates a markdown file with a name and front matter based on date and time.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Create Markdown Document Note Entry", "parameters": {"content": {"text": "---\ntitle: Note\nsubtitle:\nauthor: Scott Larson\ndate: ?/?/? ?:?\n---\n\n## ?", "tokenRanges": {"{53, 1}": "%date:yyyy", "{57, 1}": "%date:dd", "{61, 1}": "%date:mm", "{71, 1}": "%cursor", "{55, 1}": "%date:MM", "{59, 1}": "%date:hh"}, "type": "advancedText"}, "open": true, "filename": {"text": "?-?-?-?-?-?-note.md", "tokenRanges": {"{8, 1}": "%date:mm", "{4, 1}": "%date:dd", "{6, 1}": "%date:HH", "{2, 1}": "%date:MM", "{0, 1}": "%date:yyyy", "{10, 1}": "%date:ss"}, "type": "advancedText"}}, "class": "WorkflowActionCreateNewDocument"}], "name": "Markdown(Note)", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone9,2", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "minicons-icons-text-left-align.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22This%20is%20a%20work%20flow%20that%20creates%20a%20markdown%20file%20with%20a%20name%20and%20front%20matter%20based%20on%20date%20and%20time.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Create%20Markdown%20Document%20Note%20Entry%22%2C%20%22parameters%22%3A%20%7B%22content%22%3A%20%7B%22text%22%3A%20%22---%5Cntitle%3A%20Note%5Cnsubtitle%3A%5Cnauthor%3A%20Scott%20Larson%5Cndate%3A%20%3F%2F%3F%2F%3F%20%3F%3A%3F%5Cn---%5Cn%5Cn%23%23%20%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B53%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%2C%20%22%7B57%2C%201%7D%22%3A%20%22%25date%3Add%22%2C%20%22%7B61%2C%201%7D%22%3A%20%22%25date%3Amm%22%2C%20%22%7B71%2C%201%7D%22%3A%20%22%25cursor%22%2C%20%22%7B55%2C%201%7D%22%3A%20%22%25date%3AMM%22%2C%20%22%7B59%2C%201%7D%22%3A%20%22%25date%3Ahh%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22open%22%3A%20true%2C%20%22filename%22%3A%20%7B%22text%22%3A%20%22%3F-%3F-%3F-%3F-%3F-%3F-note.md%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B8%2C%201%7D%22%3A%20%22%25date%3Amm%22%2C%20%22%7B4%2C%201%7D%22%3A%20%22%25date%3Add%22%2C%20%22%7B6%2C%201%7D%22%3A%20%22%25date%3AHH%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22%25date%3AMM%22%2C%20%22%7B0%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%2C%20%22%7B10%2C%201%7D%22%3A%20%22%25date%3Ass%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCreateNewDocument%22%7D%5D%2C%20%22name%22%3A%20%22Markdown%28Note%29%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone9%2C2%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-text-left-align.png%22%7D", "description": "This is a work flow that creates a markdown file with a name and front matter based on date and time.", "title": "Markdown(Note)"}, {"url": "http://editorial-app.appspot.com/workflow/5900574708989952/SYb4MzmyVoI", "workflow_data": {"username": "tt", "description": "", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "? (? - ?.?.?):\n", "tokenRanges": {"{11, 1}": "%date:yyyy", "{0, 1}": "%browser:title", "{3, 1}": "%browser:url", "{9, 1}": "%date:MM", "{7, 1}": "%date:dd"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "title", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?\n", "tokenRanges": {"{0, 1}": "%browser:selection"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"findOption": 0, "find": {"text": ":", "tokenRanges": {}, "type": "advancedText"}, "replace": {"text": " -", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFindReplace"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?\n?", "tokenRanges": {"{0, 1}": "title", "{2, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"findOption": 0, "find": {"text": "http://", "tokenRanges": {}, "type": "advancedText"}, "replace": {"text": "", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFindReplace"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "", "tokenRanges": {}, "type": "advancedText"}, "prefixOrSuffix": 0}, "class": "WorkflowActionPrefixSuffixLines"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "browsercontent", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"numberOfSteps": {"text": "1", "tokenRanges": {}, "type": "advancedText"}, "direction": 2, "unit": 0}, "class": "WorkflowActionExtendSelection"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"foldedTextReplacement": "\u2026", "foldedTextOption": 0}, "class": "WorkflowActionGetEditorText"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"replacement": {"text": "?\n?", "tokenRanges": {"{0, 1}": "Input", "{2, 1}": "browsercontent"}, "type": "advancedText"}}, "class": "WorkflowActionReplaceSelectedText"}], "name": "paste browsercontent+link_", "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad4,5", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "minicons-icons-artwork-bucket.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22tt%22%2C%20%22description%22%3A%20%22%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%20%28%3F%20-%20%3F.%3F.%3F%29%3A%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B11%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%2C%20%22%7B0%2C%201%7D%22%3A%20%22%25browser%3Atitle%22%2C%20%22%7B3%2C%201%7D%22%3A%20%22%25browser%3Aurl%22%2C%20%22%7B9%2C%201%7D%22%3A%20%22%25date%3AMM%22%2C%20%22%7B7%2C%201%7D%22%3A%20%22%25date%3Add%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22title%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25browser%3Aselection%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22findOption%22%3A%200%2C%20%22find%22%3A%20%7B%22text%22%3A%20%22%3A%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22replace%22%3A%20%7B%22text%22%3A%20%22%20-%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFindReplace%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%5Cn%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22title%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22findOption%22%3A%200%2C%20%22find%22%3A%20%7B%22text%22%3A%20%22http%3A%2F%2F%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22replace%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFindReplace%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22prefixOrSuffix%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionPrefixSuffixLines%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22browsercontent%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22numberOfSteps%22%3A%20%7B%22text%22%3A%20%221%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22direction%22%3A%202%2C%20%22unit%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionExtendSelection%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22foldedTextReplacement%22%3A%20%22%5Cu2026%22%2C%20%22foldedTextOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionGetEditorText%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22replacement%22%3A%20%7B%22text%22%3A%20%22%3F%5Cn%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22browsercontent%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionReplaceSelectedText%22%7D%5D%2C%20%22name%22%3A%20%22paste%20browsercontent%2Blink_%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad4%2C5%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22minicons-icons-artwork-bucket.png%22%7D", "description": "", "title": "paste browsercontent+link_"}, {"url": "http://editorial-app.appspot.com/workflow/5797017490030592/8f2OR4EN-OQ", "workflow_data": {"username": "", "description": "Put text selected inside a

HTML tag.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "selected_text", "value": {"text": "?", "tokenRanges": {"{0, 1}": "%editor:selection"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {}, "class": "WorkflowActionGetClipboard"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "URL", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Clipboard"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "

?

", "tokenRanges": {"{3, 1}": "selected_text"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"replacement": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionReplaceSelectedText"}], "name": "p", "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad8,5", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_SPANNER.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22Put%20text%20selected%20inside%20a%20%3Cp%3E%20HTML%20tag.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22selected_text%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25editor%3Aselection%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%7D%2C%20%22class%22%3A%20%22WorkflowActionGetClipboard%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22URL%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Clipboard%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3Cp%3E%3F%3C%2Fp%3E%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B3%2C%201%7D%22%3A%20%22selected_text%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22replacement%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionReplaceSelectedText%22%7D%5D%2C%20%22name%22%3A%20%22p%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad8%2C5%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_SPANNER.png%22%7D", "description": "Put text selected inside a

HTML tag.", "title": "p"}, {"url": "http://editorial-app.appspot.com/workflow/5775905095942144/BNvia3Fx7hE", "workflow_data": {"username": "Scott Larson", "name": "Markdown(Scene)", "description": "This workflow creates a markdown document for scene based content that aids in the creation of a story. The workflow creates a file name and front matter taken from a custom UI that grabs input from the following fields: Scene, Setting, Location and Enviroment titles. It also populates the document with the following story history headers: Previously, Objective, Obstacle and Up Next.", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Scene File UI", "parameters": {"outputText": {"text": "?-?-?-?", "tokenRanges": {"{0, 1}": "%ui:Scene Title Field", "{6, 1}": "%ui:Environment Title Field", "{4, 1}": "%ui:Location Title Field", "{2, 1}": "%ui:Setting Title Field"}, "type": "advancedText"}, "ui": "[\n {\n \"nodes\" : [\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 32}, {143, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"63291FBC-497C-4755-B29C-61367FB01A29\",\n \"font_size\" : 17,\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"name\" : \"Scene Title Field\",\n \"spellchecking_type\" : \"default\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 98}, {142, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"E989A04B-A439-4B52-932B-36ACB4F0E408\",\n \"name\" : \"Setting Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 162}, {142, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"77C08DCA-BF3B-4BB7-9230-0EAD1A11EAFF\",\n \"name\" : \"Location Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{143, 226}, {143, 32}}\",\n \"class\" : \"TextField\",\n \"attributes\" : {\n \"uuid\" : \"0C8371B0-E61A-4C38-95AB-E9E2A12856F5\",\n \"name\" : \"Environment Title Field\",\n \"frame\" : \"{{170, 254}, {200, 32}}\",\n \"secure\" : false,\n \"editWorkflow\" : true,\n \"alignment\" : \"left\",\n \"autocorrection_type\" : \"default\",\n \"font_name\" : \"\",\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"class\" : \"TextField\",\n \"spellchecking_type\" : \"default\",\n \"font_size\" : 17\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 32}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Scene Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"05C38341-4356-420C-B4A6-4877D1CE41D4\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Scene Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 98}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Setting Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"EC1840B3-EF37-4386-8A0B-D5CAA68B63E1\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Setting Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 162}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Location Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"EA2689E0-9178-450F-932C-1E84E48028CF\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Loc Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n },\n {\n \"nodes\" : [\n\n ],\n \"frame\" : \"{{31, 226}, {97, 32}}\",\n \"class\" : \"Label\",\n \"attributes\" : {\n \"name\" : \"Environment Title Label\",\n \"frame\" : \"{{195, 254}, {150, 32}}\",\n \"uuid\" : \"ADF3ED51-4FBE-4210-8903-C04120C52778\",\n \"class\" : \"Label\",\n \"alignment\" : \"left\",\n \"text\" : \"Env Title\",\n \"font_size\" : 18,\n \"font_name\" : \"\"\n },\n \"selected\" : false\n }\n ],\n \"frame\" : \"{{0, 0}, {320, 320}}\",\n \"class\" : \"View\",\n \"attributes\" : {\n \"flex\" : \"\",\n \"editWorkflow\" : true,\n \"action_workflow\" : \"{\\\"actions\\\":[]}\",\n \"enabled\" : true,\n \"tint_color\" : \"RGBA(0.000000,0.478000,1.000000,1.000000)\",\n \"border_color\" : \"RGBA(0.000000,0.000000,0.000000,1.000000)\",\n \"background_color\" : \"RGBA(1.000000,1.000000,1.000000,1.000000)\",\n \"name\" : \"\"\n },\n \"selected\" : false\n }\n]", "presentationStyle": 0}, "class": "WorkflowActionCustomUI"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"caseOption": 1}, "class": "WorkflowActionChangeCase"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-file-name", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-front-matter-title", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"text": {"text": "?", "tokenRanges": {"{0, 1}": "scene-front-matter-title"}, "type": "advancedText"}}, "class": "WorkflowActionFormatString"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"caseOption": 2}, "class": "WorkflowActionChangeCase"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"findOption": 0, "find": {"text": "-", "tokenRanges": {}, "type": "advancedText"}, "replace": {"text": ". ", "tokenRanges": {}, "type": "advancedText"}}, "class": "WorkflowActionFindReplace"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"name": "scene-front-matter-title-update", "value": {"text": "?", "tokenRanges": {"{0, 1}": "Input"}, "type": "advancedText"}}, "class": "WorkflowActionStoreVariable"}, {"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "Create Markdown Scene Entry", "parameters": {"content": {"text": "---\ntitle: ?\nsubtitle:\nauthor: Scott Larson\ndate: ?/?/? ?:?\n---\n\n## Previously\n## Main Objective\n## Main Obstacle\n## Up Next\n\n?\n", "tokenRanges": {"{50, 1}": "%date:yyyy", "{126, 1}": "%cursor", "{54, 1}": "%date:dd", "{11, 1}": "scene-front-matter-title-update", "{56, 1}": "%date:hh", "{58, 1}": "%date:mm", "{52, 1}": "%date:MM"}, "type": "advancedText"}, "open": true, "filename": {"text": "?.md", "tokenRanges": {"{0, 1}": "scene-file-name"}, "type": "advancedText"}}, "class": "WorkflowActionCreateNewDocument"}], "version": "133001", "device": {"userInterfaceIdiom": 1, "model": "iPad4,1", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_SPANNER.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22Scott%20Larson%22%2C%20%22name%22%3A%20%22Markdown%28Scene%29%22%2C%20%22description%22%3A%20%22This%20workflow%20creates%20a%20markdown%20document%20for%20scene%20based%20content%20that%20aids%20in%20the%20creation%20of%20a%20story.%20The%20workflow%20creates%20a%20file%20name%20and%20front%20matter%20taken%20from%20a%20custom%20UI%20that%20grabs%20input%20from%20the%20following%20fields%3A%20Scene%2C%20Setting%2C%20Location%20and%20Enviroment%20titles.%20It%20also%20populates%20the%20document%20with%20the%20following%20story%20history%20headers%3A%20Previously%2C%20Objective%2C%20Obstacle%20and%20Up%20Next.%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Scene%20File%20UI%22%2C%20%22parameters%22%3A%20%7B%22outputText%22%3A%20%7B%22text%22%3A%20%22%3F-%3F-%3F-%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22%25ui%3AScene%20Title%20Field%22%2C%20%22%7B6%2C%201%7D%22%3A%20%22%25ui%3AEnvironment%20Title%20Field%22%2C%20%22%7B4%2C%201%7D%22%3A%20%22%25ui%3ALocation%20Title%20Field%22%2C%20%22%7B2%2C%201%7D%22%3A%20%22%25ui%3ASetting%20Title%20Field%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22ui%22%3A%20%22%5B%5Cn%20%20%7B%5Cn%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%2032%7D%2C%20%7B143%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2263291FBC-497C-4755-B29C-61367FB01A29%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Scene%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%2098%7D%2C%20%7B142%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22E989A04B-A439-4B52-932B-36ACB4F0E408%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Setting%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%20162%7D%2C%20%7B142%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2277C08DCA-BF3B-4BB7-9230-0EAD1A11EAFF%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Location%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B143%2C%20226%7D%2C%20%7B143%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%220C8371B0-E61A-4C38-95AB-E9E2A12856F5%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Environment%20Title%20Field%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B170%2C%20254%7D%2C%20%7B200%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22secure%5C%22%20%3A%20false%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22autocorrection_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22TextField%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22spellchecking_type%5C%22%20%3A%20%5C%22default%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2017%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%2032%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Scene%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%2205C38341-4356-420C-B4A6-4877D1CE41D4%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Scene%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%2098%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Setting%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22EC1840B3-EF37-4386-8A0B-D5CAA68B63E1%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Setting%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%20162%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Location%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22EA2689E0-9178-450F-932C-1E84E48028CF%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Loc%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22nodes%5C%22%20%3A%20%5B%5Cn%5Cn%20%20%20%20%20%20%20%20%5D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B31%2C%20226%7D%2C%20%7B97%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22Environment%20Title%20Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B195%2C%20254%7D%2C%20%7B150%2C%2032%7D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22uuid%5C%22%20%3A%20%5C%22ADF3ED51-4FBE-4210-8903-C04120C52778%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22Label%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22alignment%5C%22%20%3A%20%5C%22left%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22text%5C%22%20%3A%20%5C%22Env%20Title%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_size%5C%22%20%3A%2018%2C%5Cn%20%20%20%20%20%20%20%20%20%20%5C%22font_name%5C%22%20%3A%20%5C%22%3CSystem%3E%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%2C%5Cn%20%20%20%20%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%5D%2C%5Cn%20%20%20%20%5C%22frame%5C%22%20%3A%20%5C%22%7B%7B0%2C%200%7D%2C%20%7B320%2C%20320%7D%7D%5C%22%2C%5Cn%20%20%20%20%5C%22class%5C%22%20%3A%20%5C%22View%5C%22%2C%5Cn%20%20%20%20%5C%22attributes%5C%22%20%3A%20%7B%5Cn%20%20%20%20%20%20%5C%22flex%5C%22%20%3A%20%5C%22%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22editWorkflow%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%5C%22action_workflow%5C%22%20%3A%20%5C%22%7B%5C%5C%5C%22actions%5C%5C%5C%22%3A%5B%5D%7D%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22enabled%5C%22%20%3A%20true%2C%5Cn%20%20%20%20%20%20%5C%22tint_color%5C%22%20%3A%20%5C%22RGBA%280.000000%2C0.478000%2C1.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22border_color%5C%22%20%3A%20%5C%22RGBA%280.000000%2C0.000000%2C0.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22background_color%5C%22%20%3A%20%5C%22RGBA%281.000000%2C1.000000%2C1.000000%2C1.000000%29%5C%22%2C%5Cn%20%20%20%20%20%20%5C%22name%5C%22%20%3A%20%5C%22%5C%22%5Cn%20%20%20%20%7D%2C%5Cn%20%20%20%20%5C%22selected%5C%22%20%3A%20false%5Cn%20%20%7D%5Cn%5D%22%2C%20%22presentationStyle%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionCustomUI%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22caseOption%22%3A%201%7D%2C%20%22class%22%3A%20%22WorkflowActionChangeCase%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-file-name%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-front-matter-title%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22text%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22scene-front-matter-title%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFormatString%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22caseOption%22%3A%202%7D%2C%20%22class%22%3A%20%22WorkflowActionChangeCase%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22findOption%22%3A%200%2C%20%22find%22%3A%20%7B%22text%22%3A%20%22-%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22replace%22%3A%20%7B%22text%22%3A%20%22.%20%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionFindReplace%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22name%22%3A%20%22scene-front-matter-title-update%22%2C%20%22value%22%3A%20%7B%22text%22%3A%20%22%3F%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22Input%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionStoreVariable%22%7D%2C%20%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22Create%20Markdown%20Scene%20Entry%22%2C%20%22parameters%22%3A%20%7B%22content%22%3A%20%7B%22text%22%3A%20%22---%5Cntitle%3A%20%3F%5Cnsubtitle%3A%5Cnauthor%3A%20Scott%20Larson%5Cndate%3A%20%3F%2F%3F%2F%3F%20%3F%3A%3F%5Cn---%5Cn%5Cn%23%23%20Previously%5Cn%23%23%20Main%20Objective%5Cn%23%23%20Main%20Obstacle%5Cn%23%23%20Up%20Next%5Cn%5Cn%3F%5Cn%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B50%2C%201%7D%22%3A%20%22%25date%3Ayyyy%22%2C%20%22%7B126%2C%201%7D%22%3A%20%22%25cursor%22%2C%20%22%7B54%2C%201%7D%22%3A%20%22%25date%3Add%22%2C%20%22%7B11%2C%201%7D%22%3A%20%22scene-front-matter-title-update%22%2C%20%22%7B56%2C%201%7D%22%3A%20%22%25date%3Ahh%22%2C%20%22%7B58%2C%201%7D%22%3A%20%22%25date%3Amm%22%2C%20%22%7B52%2C%201%7D%22%3A%20%22%25date%3AMM%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22open%22%3A%20true%2C%20%22filename%22%3A%20%7B%22text%22%3A%20%22%3F.md%22%2C%20%22tokenRanges%22%3A%20%7B%22%7B0%2C%201%7D%22%3A%20%22scene-file-name%22%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%7D%2C%20%22class%22%3A%20%22WorkflowActionCreateNewDocument%22%7D%5D%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%201%2C%20%22model%22%3A%20%22iPad4%2C1%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_SPANNER.png%22%7D", "description": "This workflow creates a markdown document for scene based content that aids in the creation of a story. The workflow creates a file name and front matter taken from a custom UI that grabs input from the following fields: Scene, Setting, Location and Enviroment titles. It also populates the document with the following story history headers: Previously, Objective, Obstacle and Up Next.", "title": "Markdown(Scene)"}, {"url": "http://editorial-app.appspot.com/workflow/5771554507980800/vISPQ0BYvjA", "workflow_data": {"username": "", "description": "", "actions": [{"pauseWithoutShowingParameters": false, "pauseBeforeRunning": false, "customTitle": "", "parameters": {"URL": {"text": "http://www.hp.com", "tokenRanges": {}, "type": "advancedText"}, "waitUntilLoaded": false, "revealBrowserAutomatically": true, "openIn": 1, "tabOption": 0}, "class": "WorkflowActionOpenURL"}], "name": "MyTest", "version": "133001", "device": {"userInterfaceIdiom": 0, "model": "iPhone11,8", "systemVersion": "12.4.1"}, "type": "wkflw", "public": true, "icon": "TYPICONS-ALL_PUZZLE.png"}, "install_url": "editorial://add-workflow?workflow-data=%7B%22username%22%3A%20%22%22%2C%20%22description%22%3A%20%22%22%2C%20%22actions%22%3A%20%5B%7B%22pauseWithoutShowingParameters%22%3A%20false%2C%20%22pauseBeforeRunning%22%3A%20false%2C%20%22customTitle%22%3A%20%22%22%2C%20%22parameters%22%3A%20%7B%22URL%22%3A%20%7B%22text%22%3A%20%22http%3A%2F%2Fwww.hp.com%22%2C%20%22tokenRanges%22%3A%20%7B%7D%2C%20%22type%22%3A%20%22advancedText%22%7D%2C%20%22waitUntilLoaded%22%3A%20false%2C%20%22revealBrowserAutomatically%22%3A%20true%2C%20%22openIn%22%3A%201%2C%20%22tabOption%22%3A%200%7D%2C%20%22class%22%3A%20%22WorkflowActionOpenURL%22%7D%5D%2C%20%22name%22%3A%20%22MyTest%22%2C%20%22version%22%3A%20%22133001%22%2C%20%22device%22%3A%20%7B%22userInterfaceIdiom%22%3A%200%2C%20%22model%22%3A%20%22iPhone11%2C8%22%2C%20%22systemVersion%22%3A%20%2212.4.1%22%7D%2C%20%22type%22%3A%20%22wkflw%22%2C%20%22public%22%3A%20true%2C%20%22icon%22%3A%20%22TYPICONS-ALL_PUZZLE.png%22%7D", "description": "", "title": "MyTest"}]}