PageSourceSearch

https://weonjeong-ai-profile.hf.space/

html weonjeong-ai-profile.hf.space collected 2026-10-03 17:30:33 UTC 100,599 bytes, 125 lines download raw bytes

1<!doctype html>
2<html
3	lang="en"
4	style="
5		margin: 0;
6		padding: 0;
7		min-height: 100%;
8		display: flex;
9		flex-direction: column;
10	"
11>
12	<head>
13		<meta charset="utf-8" />
14		<meta
15			name="viewport"
16			content="width=device-width, initial-scale=1, shrink-to-fit=no"
17		/>
18		<meta property="og:title" content="Gradio" />
19		<meta property="og:type" content="website" />
20		<meta property="og:url" content="{url}" />
21		<meta property="og:description" content="Click to try out the app!" />
22		<meta
23			property="og:image"
24			content="https://raw.githubusercontent.com/gradio-app/gradio/main/js/_website/src/lib/assets/img/header-image.jpg"
25		/>
26		<meta name="twitter:card" content="summary_large_image" />
27		<meta name="twitter:creator" content="@Gradio" />
28		<meta name="twitter:title" content="Gradio" />
29		<meta name="twitter:description" content="Click to try out the app!" />
30		<meta
31			name="twitter:image"
32			content="https://raw.githubusercontent.com/gradio-app/gradio/main/js/_website/src/lib/assets/img/header-image.jpg"
33		/>
34
35		<style>
36			:root {
37				--bg: white;
38				--col:   #27272a;
39				--bg-dark: #0f0f11;
40				--col-dark: #f4f4f5;
41			}
42
43
44			body {
45				background: var(--bg);
46				color: var(--col);
47				font-family: Arial, Helvetica, sans-serif;
48			}
49
50			@media (prefers-color-scheme: dark) {
51				body {
52					background: var(--bg-dark);
53					color: var(--col-dark);
54				}
55			}
56		</style>
57
58		<meta property="og:url" content="https://gradio.app/" />
59		<meta property="og:type" content="website" />
60		<meta property="og:image" content="" />
61		<meta property="og:title" content="AI 프로필 사진 · Connect AI LAB" />
62		<meta
63			property="og:description"
64			content=""
65		/>
66		<meta name="twitter:card" content="summary_large_image" />
67		<meta name="twitter:creator" content="@teamGradio" />
68		<meta name="twitter:title" content="AI 프로필 사진 · Connect AI LAB" />
69		<meta
70			name="twitter:description"
71			content=""
72		/>
73		<meta name="twitter:image" content="" />
74
75		
75<script>window.gradio_config = {"version":"6.17.3","api_prefix":"/gradio_api","mode":"blocks","app_id":17634833700219892252,"dev_mode":false,"vibe_mode":false,"analytics_enabled":true,"components":[{"id":1,"type":"textbox","props":{"value":"[]","type":"text","lines":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"hidden-images-b64","autofocus":false,"autoscroll":true,"elem_classes":["hidden-input"],"preserved_by_key":["value"],"rtl":false,"buttons":[],"submit_btn":false,"stop_btn":false,"name":"textbox","_selectable":false},"skip_api":false,"component_class_id":"0fc9c4cad71d1ab8599f7d2f997c7cf3bcabb4ea624a2db880c7fe38ffd613d7","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"Hello!!"},{"id":2,"type":"textbox","props":{"value":"","type":"text","lines":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"prompt-gradio-input","autofocus":false,"autoscroll":true,"elem_classes":["hidden-input"],"preserved_by_key":["value"],"rtl":false,"buttons":[],"submit_btn":false,"stop_btn":false,"name":"textbox","_selectable":false},"skip_api":false,"component_class_id":"0fc9c4cad71d1ab8599f7d2f997c7cf3bcabb4ea624a2db880c7fe38ffd613d7","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"Hello!!"},{"id":3,"type":"dropdown","props":{"choices":[["Multiple-Angles","Multiple-Angles"],["Photo-to-Anime","Photo-to-Anime"],["Anime-V2","Anime-V2"],["Light-Migration","Light-Migration"],["Upscaler","Upscaler"],["Style-Transfer","Style-Transfer"],["Manga-Tone","Manga-Tone"],["Anything2Real","Anything2Real"],["Fal-Multiple-Angles","Fal-Multiple-Angles"],["Polaroid-Photo","Polaroid-Photo"],["Unblur-Anything","Unblur-Anything"],["Midnight-Noir-Eyes-Spotlight","Midnight-Noir-Eyes-Spotlight"],["Hyper-Realistic-Portrait","Hyper-Realistic-Portrait"],["Ultra-Realistic-Portrait","Ultra-Realistic-Portrait"],["Pixar-Inspired-3D","Pixar-Inspired-3D"],["Noir-Comic-Book","Noir-Comic-Book"],["Any-light","Any-light"],["Studio-DeLight","Studio-DeLight"],["Cinematic-FlatLog","Cinematic-FlatLog"]],"value":"Hyper-Realistic-Portrait","type":"value","allow_custom_value":false,"filterable":true,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"gradio-lora","elem_classes":["hidden-input"],"preserved_by_key":["value"],"buttons":[],"name":"dropdown","_selectable":false},"skip_api":false,"component_class_id":"d806107f105ee5d039611f55ea03696f0982a8e0a21facb914536be3d41a2664","key":null,"api_info":{"type":"string","enum":["Multiple-Angles","Photo-to-Anime","Anime-V2","Light-Migration","Upscaler","Style-Transfer","Manga-Tone","Anything2Real","Fal-Multiple-Angles","Polaroid-Photo","Unblur-Anything","Midnight-Noir-Eyes-Spotlight","Hyper-Realistic-Portrait","Ultra-Realistic-Portrait","Pixar-Inspired-3D","Noir-Comic-Book","Any-light","Studio-DeLight","Cinematic-FlatLog"]},"api_info_as_input":{"type":"string","enum":["Multiple-Angles","Photo-to-Anime","Anime-V2","Light-Migration","Upscaler","Style-Transfer","Manga-Tone","Anything2Real","Fal-Multiple-Angles","Polaroid-Photo","Unblur-Anything","Midnight-Noir-Eyes-Spotlight","Hyper-Realistic-Portrait","Ultra-Realistic-Portrait","Pixar-Inspired-3D","Noir-Comic-Book","Any-light","Studio-DeLight","Cinematic-FlatLog"]},"api_info_as_output":{"type":"string","enum":["Multiple-Angles","Photo-to-Anime","Anime-V2","Light-Migration","Upscaler","Style-Transfer","Manga-Tone","Anything2Real","Fal-Multiple-Angles","Polaroid-Photo","Unblur-Anything","Midnight-Noir-Eyes-Spotlight","Hyper-Realistic-Portrait","Ultra-Realistic-Portrait","Pixar-Inspired-3D","Noir-Comic-Book","Any-light","Studio-DeLight","Cinematic-FlatLog"]},"example_inputs":"Multiple-Angles"},{"id":4,"type":"slider","props":{"minimum":0,"maximum":2147483647,"value":0,"step":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"gradio-seed","elem_classes":["hidden-input"],"preserved_by_key":["value"],"name":"slider","_selectable":false},"skip_api":false,"component_class_id":"390a95edbee85fb6202194179cdf2f8
75c67c6552ff26c02a3bb3298f6f221fb0c","key":null,"api_info":{"type":"number","description":"numeric value between 0 and 2147483647"},"api_info_as_input":{"type":"number","description":"numeric value between 0 and 2147483647"},"api_info_as_output":{"type":"number","description":"numeric value between 0 and 2147483647"},"example_inputs":0},{"id":5,"type":"checkbox","props":{"value":true,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"gradio-randomize","elem_classes":["hidden-input"],"preserved_by_key":["value"],"buttons":[],"name":"checkbox","_selectable":false},"skip_api":false,"component_class_id":"8315fb025ed928bf225e0ead17c361a3653163da6b97250a1b0c411dceebd6b9","key":null,"api_info":{"type":"boolean"},"api_info_as_input":{"type":"boolean"},"api_info_as_output":{"type":"boolean"},"example_inputs":true},{"id":6,"type":"slider","props":{"minimum":1.0,"maximum":10.0,"value":1.0,"step":0.1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"gradio-guidance","elem_classes":["hidden-input"],"preserved_by_key":["value"],"name":"slider","_selectable":false},"skip_api":false,"component_class_id":"390a95edbee85fb6202194179cdf2f8c67c6552ff26c02a3bb3298f6f221fb0c","key":null,"api_info":{"type":"number","description":"numeric value between 1.0 and 10.0"},"api_info_as_input":{"type":"number","description":"numeric value between 1.0 and 10.0"},"api_info_as_output":{"type":"number","description":"numeric value between 1.0 and 10.0"},"example_inputs":1.0},{"id":7,"type":"slider","props":{"minimum":1,"maximum":50,"value":4,"step":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"gradio-steps","elem_classes":["hidden-input"],"preserved_by_key":["value"],"name":"slider","_selectable":false},"skip_api":false,"component_class_id":"390a95edbee85fb6202194179cdf2f8c67c6552ff26c02a3bb3298f6f221fb0c","key":null,"api_info":{"type":"number","description":"numeric value between 1 and 50"},"api_info_as_input":{"type":"number","description":"numeric value between 1 and 50"},"api_info_as_output":{"type":"number","description":"numeric value between 1 and 50"},"example_inputs":1},{"id":8,"type":"image","props":{"streamable":false,"format":"png","image_mode":"RGB","sources":["upload","webcam","clipboard"],"type":"numpy","show_label":false,"buttons":["download","share","fullscreen"],"container":false,"min_width":160,"visible":true,"streaming":false,"elem_id":"gradio-result","elem_classes":["hidden-input"],"preserved_by_key":["value"],"webcam_options":{"mirror":true,"constraints":null},"watermark":{"watermark":null,"position":"bottom-right"},"name":"image","_selectable":false},"skip_api":false,"component_class_id":"cf34c74b52d93e528ef734415997d3d347fae6292f8b225082ce22677e6bdbad","key":null,"api_info":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to a local file","title":"Path"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Publicly available url or base64 encoded image","title":"Url"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Size of image in bytes","title":"Size"},"orig_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Original filename","title":"Orig Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"mime type of image","title":"Mime Type"},"is_stream":{"default":false,"description":"Can always be set to False","title":"Is Stream","type":"boolean"},"meta":{"additionalProperties":true,"default":{"_type":"gradio.FileData"},"title":"Meta","type":"object"}},"title":"ImageData","type":"object","additional_description":"A local filepath or publicly available URL."},"api_info_as_input":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to a local file","title":"Path"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Publicly available url or base64 encoded image","title":"Url"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Size of image in bytes","title":"Size"},"orig_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Original filename","title":"Orig Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}
75],"default":null,"description":"mime type of image","title":"Mime Type"},"is_stream":{"default":false,"description":"Can always be set to False","title":"Is Stream","type":"boolean"},"meta":{"additionalProperties":true,"default":{"_type":"gradio.FileData"},"title":"Meta","type":"object"}},"title":"ImageData","type":"object","additional_description":"A local filepath or publicly available URL."},"api_info_as_output":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to a local file","title":"Path"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Publicly available url or base64 encoded image","title":"Url"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Size of image in bytes","title":"Size"},"orig_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Original filename","title":"Orig Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"mime type of image","title":"Mime Type"},"is_stream":{"default":false,"description":"Can always be set to False","title":"Is Stream","type":"boolean"},"meta":{"additionalProperties":true,"default":{"_type":"gradio.FileData"},"title":"Meta","type":"object"}},"title":"ImageData","type":"object","additional_description":"A local filepath or publicly available URL."},"example_inputs":{"path":"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png","meta":{"_type":"gradio.FileData"},"orig_name":"bus.png","url":"https://raw.githubusercontent.com/gradio-app/gradio/main/test/test_files/bus.png"}},{"id":9,"type":"textbox","props":{"value":"","type":"text","lines":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"example-idx-input","autofocus":false,"autoscroll":true,"elem_classes":["hidden-input"],"preserved_by_key":["value"],"rtl":false,"buttons":[],"submit_btn":false,"stop_btn":false,"name":"textbox","_selectable":false},"skip_api":false,"component_class_id":"0fc9c4cad71d1ab8599f7d2f997c7cf3bcabb4ea624a2db880c7fe38ffd613d7","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"Hello!!"},{"id":10,"type":"textbox","props":{"value":"","type":"text","lines":1,"show_label":false,"container":false,"min_width":160,"visible":true,"elem_id":"example-result-data","autofocus":false,"autoscroll":true,"elem_classes":["hidden-input"],"preserved_by_key":["value"],"rtl":false,"buttons":[],"submit_btn":false,"stop_btn":false,"name":"textbox","_selectable":false},"skip_api":false,"component_class_id":"0fc9c4cad71d1ab8599f7d2f997c7cf3bcabb4ea624a2db880c7fe38ffd613d7","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"Hello!!"},{"id":11,"type":"button","props":{"value":"Load Example","variant":"secondary","size":"lg","link_target":"_self","visible":true,"interactive":true,"elem_id":"example-load-btn","elem_classes":[],"preserved_by_key":["value"],"name":"button","_selectable":false},"skip_api":true,"component_class_id":"9802f23c83089d1c7f880af56b1493552cad2509ae4bf55adfb8ed1e639a4a8d","key":null},{"id":12,"type":"html","props":{"_retryable":false,"_undoable":false,"likeable":false,"streamable":false,"value":"\u003cstyle\u003e.gh-btn,.gh-btn:hover{background:#ff0000!important;border-color:#ff0000!important;}.gh-btn svg{fill:#fff!important;}.gh-btn span{color:#fff!important;-webkit-text-fill-color:#fff!important;}.lora-selector-card{display:none!important;}.app-logo{box-shadow:0 0 20px rgba(57,255,20,.6),inset 0 0 8px rgba(255,255,255,.25)!important;}.app-title{text-shadow:0 0 14px rgba(57,255,20,.45);letter-spacing:.3px;}.app-badge.fast{background:linear-gradient(135deg,#12b981,#39ff14)!important;color:#04140b!important;font-weight:800!important;box-shadow:0 0 12px rgba(57,255,20,.4);}.app-shell{box-shadow:0 0 80px -24px rgba(57,255,20,.35)!important;}.btn-run{box-shadow:0 6px 24px rgba(57,255,20,.3)!important;letter-spacing:.5px;}.suggestion-chip{transition:all .15s ease;}.suggestion-chip:hover{box-shadow:0 0 14px rgba(57,255,20,.35);}\u003c/style\u003e","html_template":"${value}","css_template":"","js_on_load":"element.addEventListener(\u0027click\u0027, function() { trigger(\u0027click\u0027) });","apply_default_css":true,"show_label":false,"visible":true,"elem_classes":[],"preserved_by_key":["value"],"container":false,"padding":false,"autoscroll":false,"buttons":[],"props":{},"name":"html","_selectable":false,"component_class_name":"HTML"},"skip_api":false,"component_class_id":"470d374173809727c94172a54261a1d855e76f7da7ed9381ddbd63d6390c332c","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"\u003cp\u003eHello\u003c/p\u003e"},{"id":13,"type":"html","props":{"_retryable":false,"_undoable":false,"likeable":false,"streamable":false,"value":"\n    \u003cdiv class=\"app-shell\"\u003e\n\n      \u003c!-- Header --\u003e\n      \u003cdiv class=\"app-header\"\u003e\n        \u003cdiv class=\"app-header-left\"\u003e\n          \u003cdiv class=\"app-logo\"\u003e\u003csvg viewBox=\"0 0 24 24\" fill=\"white\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n  \u003cpath d=\"M12 2C12 2 7 6.5 7 13c0 1.4.3 2.7.8 3.9L5 19.7l1.4 1.4 2.8-2.8c1.2.5 2.5.7 3.8.7s2.6-.2 3.8-.7l2.8 2.8 1.4-1.4-2.8-2.8c.5-1.2.8-2.5.8-3.9 0-6.5-5-11-5-11z\"/\u003e\n  \u003ccircle cx=\"12\" cy=\"13\" r=\"2\"/\u003e\n  \u003cpath d=\"M9 21c0 1.1.9 2 2 2h2c1.1 0 2-.9 2-2v-1H9v1z\"/\u003e\n\u003c/svg\u003e\u003c/div\u003e\n          \u003cspan class=\"app-title\"\u003eAI 프로필 사진\u003c/span\u003e\n          \u003cspan class=\"app-badge\"\u003eCONNECT AI LAB\u003c/span\u003e\n          \u003cspan class=\"app-badge fast\"\u003e⚡ 4스텝 초고속\u003c/span\u003e\n        \u003c/div\u003e\n\n        \u003c!-- GitHub button: highlighted orange, same in light \u0026 dark --\u003e\n        \u003ca href=\"https://www.youtube.com/@CONNECT-AI-LAB\"\n           target=\"_blank\"\n           class=\"gh-btn\"\u003e\n          \u003csvg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath fill=\"#ffffff\" d=\"M23.5 6.2a3 3 0 0 0-2.1-2.1C19.5 3.5 12 3.5 12 3.5s-7.5 0-9.4.6A3 3 0 0 0 .5 6.2 31 31 0 0 0 0 12a31 31 0 0 0 .5 5.8 3 3 0 0 0 2.1 2.1c1.9.6 9.4.6 9.4.6s7.5 0 9.4-.6a3 3 0 0 0 2.1-2.1A31 31 0 0 0 24 12a31 31 0 0 0-.5-5.8zM9.5 15.5v-7l6.5 3.5-6.5 3.5z\"/\u003e\u003c/svg\u003e\n          \u003cspan\u003e구독\u003c/span\u003e\n        \u003c/a\u003e\n      \u003c/div\u003e\n\n      \u003c!-- Toolbar --\u003e\n      \u003cdiv class=\"app-toolbar\"\u003e\n        \u003cbutton id=\"tb-upload\" class=\"modern-tb-btn\" title=\"사진 올리기\"\u003e\n          \u003csvg class=\"tb-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpath d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4\"/\u003e\u003cpolyline points=\"17 8 12 3 7 8\"/\u003e\u003cline x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/\u003e\u003c/svg\u003e\u003cspan class=\"tb-label\"\u003e올리기\u003c/span\u003e\n        \u003c/button\u003e\n        \u003cbutton id=\"tb-remove\" class=\"modern-tb-btn\" title=\"선택 사진 삭제\"\u003e\n          \u003csvg class=\"tb-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ccircle cx=\"12\" cy=\"12\" r=\"10\"/\u003e\u003cline x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/\u003e\u003cline x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/\u003e\u003c/svg\u003e\u003cspan class=\"tb-label\"\u003e삭제\u003c/span\u003e\n        \u003c/button\u003e\n        \u003cbutton id=\"tb-clear\" class=\"modern-tb-btn\" title=\"전체 삭제\"\u003e\n          \u003csvg class=\"tb-svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003cpolyline points=\"3 6 5 6 21 6\"/\u003e\u003cpath d=\"M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2\"/\u003e\u003cline x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/\u003e\u003cline x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/\u003e\u003c/svg\u003e\u003cspan class=\"tb-label\"\u003e전체삭제\u003c/span\u003e\n        \u003c/button\u003e\n        \u003cdiv class=\"tb-sep\"\u003e\u003c/div\u003e\n        \u003cspan id=\"tb-image-count\" class=\"tb-info\"\u003eNo images\u003c/span\u003e\n      \u003c/div\u003e\n\n      \u003c!-- Main row --\u003e\n      \u003cdiv class=\"app-main-row\"\u003e\n\n        \u003c!-- Left --\u003e\n        \u003cdiv class=\"app-main-left\"\u003e\n\n          \u003cdiv id=\"gallery-drop-zone\"\u003e\n            \u003cdiv id=\"upload-prompt\" class=\"upload-prompt-modern\"\u003e\n              \u003cdiv id=\"upload-click-area\" class=\"upload-click-area\"\u003e\n                \u003csvg viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n                  \u003crect x=\"8\" y=\"14\" width=\"64\" height=\"52\" rx=\"6\" fill=\"none\"\n                        stroke=\"#12b981\" stroke-width=\"2\" stroke-dasharray=\"4 3\"/\u003e\n                  \u003cpolygon points=\"12,62 30,40 42,50 54,34 68,62\"\n                           fill=\"rgba(57,255,20,0.12)\" stroke=\"#12b981\" stroke-width=\"1.5\"/\u003e\n                  \u003ccircle cx=\"28\" cy=\"30\" r=\"6\"\n                          fill=\"rgba(57,255,20,0.18)\" stroke=\"#12b981\" stroke-width=\"1.5\"/\u003e\n                \u003c/svg\u003e\n                \u003cspan class=\"upload-main-text\"\u003e셀카를 여기에 올리세요\u003c/span\u003e\n                \u003cspan class=\"upload-sub-text\"\u003e정면·밝은 셀카 한 장이면 충분해요 (여러 장도 가능)\u003c/span\u003e\n              \u003c/div\u003e\n            \u003c/div\u003e\n            \u003cinput id=\"custom-file-input\" type=\"file\" accept=\"image/*\" multiple style=\"display:none;\" /\u003e\n            \u003cdiv id=\"image-gallery-grid\" class=\"image-gallery-grid\" style=\"display:none;\"\u003e\u003c/div\u003e\n          \u003c/div\u003e\n\n          \u003cdiv class=\"hint-bar\"\u003e\n            \u003cb\u003e1.\u003c/b\u003e 셀카 올리기 \u0026nbsp;\u0026middot;\u0026nbsp; \u003cb\u003e2.\u003c/b\u003e 아래 스타일 클릭 \u0026nbsp;\u0026middot;\u0026nbsp;\n            \u003cb\u003e3.\u003c/b\u003e 오른쪽 \u003cb\u003e프로필 만들기\u003c/b\u003e \u0026nbsp;\u0026middot;\u0026nbsp; 얼굴은 그대로 유지돼요\n          \u003c/div\u003e\n\n          \u003cdiv class=\"suggestions-section\"\u003e\n            \u003cdiv class=\"suggestions-title\"\u003e스타일 \u
750026mdash; 클릭하면 자동 입력돼요\u003c/div\u003e\n            \u003cdiv class=\"suggestions-wrap\"\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Turn this photo into a professional corporate headshot, dark business suit, plain neutral studio background, soft lighting. Keep the face and identity exactly the same.\u0027); window.__setLora(\u0027Hyper-Realistic-Portrait\u0027)\"\u003e💼 정장 프로필\u003c/button\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Turn this photo into a professional studio headshot, soft rim lighting, dark grey gradient background, editorial style. Keep the face and identity exactly the same.\u0027); window.__setLora(\u0027Hyper-Realistic-Portrait\u0027)\"\u003e🎬 스튜디오\u003c/button\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Turn this photo into a neat ID-style portrait, plain white background, formal attire, front-facing, even lighting. Keep the face and identity exactly the same.\u0027); window.__setLora(\u0027Hyper-Realistic-Portrait\u0027)\"\u003e📄 이력서 반명함\u003c/button\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Turn this photo into a professional outdoor headshot, softly blurred office background, natural daylight, warm tone. Keep the face and identity exactly the same.\u0027); window.__setLora(\u0027Hyper-Realistic-Portrait\u0027)\"\u003e🌤️ 야외 자연광\u003c/button\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Unblur and upscale to high resolution. Keep the same face.\u0027); window.__setLora(\u0027Upscaler\u0027)\"\u003e✨ 또렷하게(업스케일)\u003c/button\u003e\n              \u003cbutton class=\"suggestion-chip\" onclick=\"window.__setPrompt(\u0027Neutral uniform studio lighting. Preserve identity and composition.\u0027); window.__setLora(\u0027Studio-DeLight\u0027)\"\u003e💡 조명 보정\u003c/button\u003e\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n          \u003cdiv class=\"examples-section\"\u003e\n            \u003cdiv class=\"examples-title\"\u003e💡 팁\u003c/div\u003e\n            \u003cdiv class=\"hint-bar\" style=\"margin-top:8px\"\u003e\n              정면·밝은 셀카일수록 결과가 좋아요 \u0026nbsp;\u0026middot;\u0026nbsp; 결과가 아쉬우면 \u003cb\u003e지시 강도\u003c/b\u003e를 낮춰 얼굴을 더 살리세요 \u0026nbsp;\u0026middot;\u0026nbsp;\n              ⚠️ 프로필·이력서용 (여권·관공서 제출 불가)\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n        \u003c/div\u003e\u003c!-- /left --\u003e\n\n        \u003c!-- Right --\u003e\n        \u003cdiv class=\"app-main-right\"\u003e\n\n          \u003cdiv class=\"panel-card\"\u003e\n            \u003cdiv class=\"panel-card-title\"\u003e편집 지시\u003c/div\u003e\n            \u003cdiv class=\"panel-card-body\"\u003e\n              \u003clabel class=\"modern-label\" for=\"custom-prompt-input\"\u003e지시문 (또는 위 스타일 버튼 클릭)\u003c/label\u003e\n              \u003ctextarea id=\"custom-prompt-input\" class=\"modern-textarea\" rows=\"3\"\n                        placeholder=\"예: 정장 입은 프로필 사진으로. 얼굴은 그대로.\"\u003e\u003c/textarea\u003e\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n          \u003cdiv class=\"lora-selector-card\"\u003e\n            \u003cdiv class=\"lora-selector-body\"\u003e\n              \u003cdiv class=\"lora-select-label\"\u003e편집 스타일(LoRA) \u0026mdash; 프로필은 Hyper-Realistic-Portrait\u003c/div\u003e\n              \u003cselect id=\"custom-lora-select\" class=\"lora-native-select\"\u003e\n                \u003coption value=\"Multiple-Angles\"\u003eMultiple-Angles\u003c/option\u003e\n\u003coption value=\"Photo-to-Anime\"\u003ePhoto-to-Anime\u003c/option\u003e\n\u003coption value=\"Anime-V2\"\u003eAnime-V2\u003c/option\u003e\n\u003coption value=\"Light-Migration\"\u003eLight-Migration\u003c/option\u003e\n\u003coption value=\"Upscaler\"\u003eUpscaler\u003c/option\u003e\n\u003coption value=\"Style-Transfer\"\u003eStyle-Transfer\u003c/option\u003e\n\u003coption value=\"Manga-Tone\"\u003eManga-Tone\u003c/option\u003e\n\u003coption value=\"Anything2Real\"\u003eAnything2Real\u003c/option\u003e\n\u003coption value=\"Fal-Multiple-Angles\"\u003eFal-Multiple-Angles\u003c/option\u003e\n\u003coption value=\"Polaroid-Photo\"\u003ePolaroid-Photo\u003c/option\u003e\n\u003coption value=\"Unblur-Anything\"\u003eUnblur-Anything\u003c/option\u003e\n\u003coption value=\"Midnight-Noir-Eyes-Spotlight\"\u003eMidnight-Noir-Eyes-Spotlight\u003c/option\u003e\n\u003coption value=\"Hyper-Realistic-Portrait\" selected\u003eHyper-Realistic-Portrait\u003c/option\u003e\n\u003coption value=\"Ultra-Realistic-Portrait\"\u003eUltra-Realistic-Portrait\u003c/option\u003e\n\u003coption value=\"Pixar-Inspired-3D\"\u003ePixar-Inspired-3D\u003c/option\u003e\n\u003coption value=\"Noir-Comic-Book\"\u003eNoir-Comic-Book\u003c/option\u003e\n\u003coption value=\"Any-light\"\u003eAny-light\u003c/option\u003e\n\u003coption value=\"Studio-DeLight\"\u003eStudio-DeLight\u003c/option\u003e\n\u003coption value=\"Cinematic-FlatLog\"\u003eCinematic-FlatLog\u003c/option\u003e\n              \u003c/select\u003e\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n          \u003cdiv style=\"padding:14px 18px 6px;\"\u003e\n            \u003cbutton id=\"custom-run-btn\" class=\"btn-run\"\u003e\n              \u003csvg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n                \u003cpath d=\"M12 2C12 2 7 6.5 7 13c0 1.4.3 2.7.8 3.9L5 19.7l1.4 1.4 2.8-2.8c1.2.5 2.5.7 3.8.7s2.6-.2 3.8-.7l2.8 2.8 1.4-1.4-2.8-2.8c.5-1.2.8-2.5.8-3.9 0-6.5-5-11-5-11z\"/\u003e\n                \u003ccircle cx=\"12\" cy=\"13\" r=\"2\"/\u003e\n              \u003c/svg\u003e\n              \u003cspan id=\"run-btn-label\"\u003e📸 프로필 만들기\u003c/span\u003e\n            \u003c/button\u003e\n          \u003c/div\u003e\n\n          \u003cdiv class=\"output-frame\" style=\"flex:1\"\u003e\n            \u003cdiv class=\"out-title\"\u003e\n              \u003cspan\u003e결과\u003c/span\u003e\n              \u003cspan id=\"dl-btn-output\" class=\"out-download-btn\" title=\"저장\"\u003e\n                \u003csvg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003cpath d=\"M12 16l-5-5h3V4h4v7h3l-5 5z\" fill=\"currentColor\"/\u003e\u003cpath d=\"M20 18H4v2h16v-2z\" fill=\"currentColor\"/\u003e\u003c/svg\u003e 저장\n              \u003c/span\u003e\n            \u003c/div\u003e\n            \u003cdiv class=\"out-body\" id=\"output-image-container\"\u003e\n              \u003cdiv class=\"modern-loader\" id=\"output-loader\"\u003e\n                \u003cdiv class=\"loader-spinner\"\u003e\u003c/div\u003e\n                \u003cdiv class=\"loader-text\"\u003eAI가 만드는 중…\u003c/div\u003e\n                \u003cdiv class=\"loader-bar-track\"\u003e\u003cdiv class=\"loader-bar-fill\"\u003e\u003c/div\u003e\u003c/div\u003e\n              \u003c/div\u003e\n              \u003cdiv class=\"out-placeholder\" id=\"output-placeholder\"\u003e여기에 결과가 나옵니다\u003c/div\u003e\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n          \u003cdiv class=\"settings-group\"\u003e\n            \u003cdiv class=\"settings-group-title\"\u003e세부 설정\u003c/div\u003e\n            \u003cdiv class=\"settings-group-body\"\u003e\n              \u003cdiv class=\"slider-row\"\u003e\n                \u003clabel\u003e시드\u003c/label\u003e\n                \u003cinput type=\"range\" id=\"custom-seed\" min=\"0\" max=\"2147483647\" step=\"1\" value=\"0\"\u003e\n                \u003cspan class=\"slider-val\" id=\"custom-seed-val\"\u003e0\u003c/span\u003e\n              \u003c/div\u003e\n              \u003cdiv class=\"checkbox-row\"\u003e\n                \u003cinput type=\"checkbox\" id=\"custom-randomize\" checked\u003e\n                \u003clabel for=\"custom-randomize\"\u003e시드 랜덤\u003c/label\u003e\n              \u003c/div\u003e\n              \u003cdiv class=\"slider-row\"\u003e\n                \u003clabel\u003e지시 강도\u003c/label\u003e\n                \u003cinput type=\"range\" id=\"custom-guidance\" min=\"1\" max=\"10\" step=\"0.1\" value=\"1.0\"\u003e\n                \u003cspan class=\"slider-val\" id=\"custom-guidance-val\"\u003e1.0\u003c/span\u003e\n              \u003c/div\u003e\n              \u003cdiv class=\"slider-row\"\u003e\n                \u003clabel\u003e스텝\u003c/label\u003e\n                \u003cinput type=\"range\" id=\"custom-steps\" min=\"1\" max=\"50\" step=\"1\" value=\"4\"\u003e\n                \u003cspan class=\"slider-val\" id=\"custom-steps-val\"\u003e4\u003c/span\u003e\n              \u003c/div\u003e\n            \u003c/div\u003e\n          \u003c/div\u003e\n\n        \u003c/div\u003e\u003c!-- /right --\u003e\n      \u003c/div\u003e\u003c!-- /main-row --\u003e\n\n      \u003cdiv class=\"exp-note\"\u003e\n        \u003cb\u003eConnect AI LAB\u003c/b\u003e \u0026middot; 오픈소스 \u003ca href=\"https://huggingface.co/Qwen/Qwen-Image-Edit-2511\" target=\"_blank\"\u003eQwen-Image-Edit\u003c/a\u003e 기반\n        \u0026middot; 유튜브 \u003ca href=\"https://www.youtube.com/@CONNECT-AI-LAB\" target=\"_blank\"\u003e@CONNECT-AI-LAB\u003c/a\u003e 구독\n      \u003c/div\u003e\n\n      \u003cdiv class=\"app-statusbar\"\u003e\n        \u003cdiv class=\"sb-section\" id=\"sb-image-count\"\u003e사진을 올려주세요\u003c/div\u003e\n        \u003cdiv class=\"sb-section sb-fixed\"\u003e준비됨\u003c/div\u003e\n      \u003c/div\u003e\n\n    \u003c/div\u003e\u003c!-- /app-shell --\u003e\n    ","html_template":"${value}","css_template":"","js_on_load":"element.addEventListener(\u0027click\u0027, function() { trigger(\u0027click\u0027) });","apply_default_css":true,"show_label":false,"visible":true,"elem_classes":[],"preserved_by_key":["value"],"container":false,"padding":false,"autoscroll":false,"buttons":[],"props":{},"name":"html","_selectable":false,"component_class_name":"HTML"},"skip_api":false,"component_class_id":"470d374173809727c94172a54261a1d855e76f7da7ed9381ddbd63d6390c332c","key":null,"api_info":{"type":"string"},"api_info_as_input":{"type":"string"},"api_info_as_output":{"type":"string"},"example_inputs":"\u003cp\u003eHello\u003c/p\u003e"},{"id":14,"type":"button","props":{"value":"Run","variant":"secondary","size":"lg","link_target":"_self","visible":true,"interactive":true,"elem_id":"gradio-run-btn","elem_classes":[],"preserved_by_key":["value"],"name":"button","_selectable":false},"skip_api":true,"component_class_id":"9802f23c83089d1c7f880af56b1493552cad2509ae4bf55adfb8ed1e639a4a8d","key":null}],"css":"\n@import url(\u0027https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800\u0026family=JetBrains+Mono:wght@400;500;600\u0026display=swap\u0027);\n\n*{box-sizing:border-box;margin:0;padding:0}\n\n:root{\n    --or:       #12b981;\n    --or-dim:   #0e8f63;\n    --or-bright:#39ff14;\n    --or-glow:  rgba(57,255,20,.28);\n    --or-soft:  rgba(57,255,20,.12);\n    --or-xsoft: rgba(57,255,20,.06);\n    --bg:       #0d0d0f;\n    --bg1:      #141416;\n    --bg2:      #1a1a1d;\n    --bg3:      #222226;\n    --border:   #2a2a2e;\n    --border2:  #333338;\n    --text:     #e8e8ec;\n    --text2:    #9898a8;\n    --text3:    #555560;\n    --mono:     \u0027JetBrains Mono\u0027, monospace;\n}\n\nhtml, body, .gradio-container {\n    color-scheme: dark !important;\n    background: #0d0d0f !important;\n}\n\nbody, .gradio-container {\n    font-family: \u0027Inter\u0027, system-ui, -apple-system, sans-serif !important;\n    font-size: 14px !important;\n    color: #e8e8ec !important;\n    min-height: 100vh;\n    background: #0d0d0f !important;\n}\n\nfooter { display: none !important; }\n.hidden-input { display:none!important;height:0!important;overflow:hidden!important;margin:0!important;padding:0!important; }\n\n#example-load-btn, #gradio-run-btn {\n    position: absolute !important;\n    left: -9999px !important;\n    top: -9999px !important;\n    width: 1px !important;\n    height: 1px !important;\n    opacity: .01 !important;\n    pointer-events: none !important;\n    overflow: hidden !important;\n}\n\n/* ── App shell ─────────────────────────────────────────────────────────────── */\n.app-shell {\n    background: #141416 !important;\n    border: 1px solid #2a2a2e !important;\n    border-radius: 18px;\n    margin: 12px auto;\n    max-width: 1440px;\n    overflow: hidden;\n    box-shadow:\n        0 32px 64px -16px rgba(0,0,0,.8),\n        0 0 0 1px rgba(255,255,255,.03),\n        0 0 60px -20px rgba(57,255,20,.2);\n}\n\n/* ── Header ────────────────────────────────────────────────────────────────── */\n.app-header {\n    background: #1a1a1d !important;\n    border-bottom: 1px solid #2a2a2e !important;\n    padding: 14px 24px;\n    display: flex;
75\n    align-items: center;\n    justify-content: space-between;\n    flex-wrap: wrap;\n    gap: 12px;\n}\n.app-header-left { display:flex; align-items:center; gap:12px; }\n.app-logo {\n    width: 38px; height: 38px;\n    background: linear-gradient(135deg, #12b981, #39ff14);\n    border-radius: 11px;\n    display: flex; align-items: center; justify-content: center;\n    box-shadow: 0 4px 14px rgba(57,255,20,.3);\n    flex-shrink: 0;\n}\n.app-logo svg { width:22px; height:22px; fill:#fff; }\n.app-title {\n    font-size: 18px; font-weight: 800; letter-spacing: -.4px;\n    background: linear-gradient(135deg, #fff, #aaa);\n    -webkit-background-clip: text;\n    -webkit-text-fill-color: transparent;\n    font-family: \u0027Inter\u0027, sans-serif;\n}\n.app-badge {\n    font-size: 11px; font-weight: 700; padding: 3px 10px;\n    border-radius: 20px; letter-spacing: .3px;\n    background: rgba(57,255,20,.12);\n    color: #39ff14 !important;\n    -webkit-text-fill-color: #39ff14 !important;\n    border: 1px solid rgba(57,255,20,.3);\n    font-family: \u0027Inter\u0027, sans-serif;\n}\n.app-badge.fast {\n    background: rgba(34,197,94,.1);\n    color: #4ade80 !important;\n    -webkit-text-fill-color: #4ade80 !important;\n    border: 1px solid rgba(34,197,94,.25);\n}\n\n/* ── GitHub button - highlighted, always same in light \u0026 dark ────────────── */\n.gh-btn {\n    display: inline-flex !important;\n    align-items: center !important;\n    gap: 7px !important;\n    padding: 7px 14px !important;\n    border-radius: 8px !important;\n    text-decoration: none !important;\n    font-family: \u0027Inter\u0027, sans-serif !important;\n    font-size: 13px !important;\n    font-weight: 700 !important;\n    letter-spacing: .1px !important;\n    /* Fixed colors - never change with theme */\n    background: #12b981 !important;\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n    border: 1px solid rgba(255,255,255,.15) !important;\n    box-shadow:\n        0 2px 8px rgba(57,255,20,.4),\n        0 1px 0 rgba(255,255,255,.1) inset !important;\n    transition: transform .15s ease, box-shadow .15s ease, background .15s ease !important;\n    cursor: pointer !important;\n    flex-shrink: 0 !important;\n}\n.gh-btn:hover {\n    background: #39ff14 !important;\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n    transform: translateY(-1px) !important;\n    box-shadow:\n        0 4px 16px rgba(57,255,20,.55),\n        0 1px 0 rgba(255,255,255,.12) inset !important;\n}\n.gh-btn:active {\n    background: #0e8f63 !important;\n    transform: translateY(0) !important;\n    box-shadow: 0 1px 4px rgba(57,255,20,.3) !important;\n}\n.gh-btn svg {\n    fill: #ffffff !important;\n    flex-shrink: 0;\n    width: 15px !important;\n    height: 15px !important;\n}\n.gh-btn span {\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n}\n\n/* Lock GitHub button against ANY browser/OS theme override */\n@media (prefers-color-scheme: light) {\n    .gh-btn {\n        background: #12b981 !important;\n        color: #ffffff !important;\n        -webkit-text-fill-color: #ffffff !important;\n        border-color: rgba(255,255,255,.15) !important;\n    }\n    .gh-btn:hover {\n        background: #39ff14 !important;\n        color: #ffffff !important;\n        -webkit-text-fill-color: #ffffff !important;\n    }\n    .gh-btn svg { fill: #ffffff !important; }\n    .gh-btn span { color: #ffffff !important; -webkit-text-fill-color: #ffffff !important; }\n}\n@media (prefers-color-scheme: dark) {\n    .gh-btn {\n        background: #12b981 !important;\n        color: #ffffff !important;\n        -webkit-text-fill-color: #ffffff !important;\n    }\n    .gh-btn:hover { background: #39ff14 !important; }\n    .gh-btn svg { fill: #ffffff !important; }\n    .gh-btn span { color: #ffffff !important; -webkit-text-fill-color: #ffffff !important; }\n}\n\n/* ── Toolbar ───────────────────────────────────────────────────────────────── */\n.app-toolbar {\n    background: #141416 !important;\n    border-bottom: 1px solid #2a2a2e !important;\n    padding: 7px 16px;\n    display: flex; gap: 4px; align-items: center; flex-wrap: wrap;\n}\n.tb-sep { width:1px; height:28px; background:#2a2a2e; margin:0 8px; }\n.modern-tb-btn {\n    display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n    min-width: 32px; height: 34px;\n    background: transparent; border: 1px solid transparent;\n    border-radius: 8px; cursor: pointer;\n    font-size: 13px; font-weight: 700; padding: 0 12px;\n    font-family: \u0027Inter\u0027, sans-serif;\n    color: #ffffff !important;\n    -webkit-text-fill-color: #ffffff !important;\n    transition: all .15s ease;\n}\n.modern-tb-btn:hover { background: rgba(57,255,20,.12); border-color: rgba(57,255,20,.4); }\n.modern-tb-btn:active { background: rgba(57,255,20,.22); border-color: #12b981; }\n.modern-tb-btn .tb-label { font-size:13px; color:#fff!important; -webkit-text-fill-color:#fff!important; font-weight:700; }\n.modern-tb-btn .tb-svg { width:15px; height:15px; flex-shrink:0; }\n.modern-tb-btn .tb-svg, .modern-tb-btn .tb-svg * { stroke:#fff!important; fill:none!important; }\n.tb-info { font-family:var(--mono); font-size:12px; color:#555560; padding:0 8px; display:flex; align-items:center; }\n\n@media (prefers-color-scheme: light) {\n    .modern-tb-btn { color:#fff!important; -webkit-text-fill-color:#fff!important; }\n    .modern-tb-btn .tb-label { color:#fff!important; -webkit-text-fill-color:#fff!important; }\n    .modern-tb-btn .tb-svg, .modern-tb-btn .tb-svg * { stroke:#fff!important; }\n}\n\n/* ── Main layout ───────────────────────────────────────────────────────────── */\n.app-main-row { display:flex; gap:0; flex:1; overflow:hidden; }\n.app-main-left { flex:1; display:flex; flex-direction:column; min-width:0; border-right:1px solid #2a2a2e; }\n.app-main-right { width:440px; display:flex; flex-direction:column; flex-shrink:0; background:#141416!important; }\n\n/* ── Drop zone ─────────────────────────────────────────────────────────────── */\n#gallery-drop-zone { position:relative; background:#09090b!important; min-height:440px; overflow:auto; }\n#gallery-drop-zone.drag-over { outline:2px solid #12b981; outline-offset:-2px; background:rgba(57,255,20,.05)!important; }\n\n.upload-prompt-modern { position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); z-index:20; }\n.upload-click-area {\n    display:flex; flex-direction:column; align-items:center; justify-content:center;\n    cursor:pointer; padding:36px 52px; border:2px dashed #333338; border-radius:16px;\n    background:rgba(57,255,20,.05); transition:all .2s ease; gap:8px;\n}\n.upload-click-area:hover { background:rgba(57,255,20,.1); border-color:#12b981; transform:scale(1.03); }\n.upload-click-area:active { background:rgba(57,255,20,.15); transform:scale(.98); }\n.upload-click-area svg { width:80px; height:80px; }\n.upload-main-text { color:#9898a8; font-size:14px; font-weight:600; margin-top:4px; font-family:\u0027Inter\u0027,sans-serif; }\n.upload-sub-text { color:#555560; font-size:12px; font-weight:400; text-align:center; max-width:280px; line-height:1.5; font-family:\u0027Inter\u0027,sans-serif; }\n\n/* ── Gallery grid ──────────────────────────────────────────────────────────── */\n.image-gallery-grid {\n    display:grid; grid-template-columns:repeat(auto-fill,minmax(140px,1fr));\n    gap:12px; padding:16px; align-content:start;\n}\n.gallery-thumb {\n    position:relative; aspect-ratio:1; border-radius:10px; overflow:hidden;\n    cursor:pointer; border:2px solid #2a2a2e; transition:all .2s ease; background:#1a1a1d;\n}\n.gallery-thumb:hover { border-color:#333338; transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,.4); }\n.gallery-thumb.selected { border-color:#12b981!important; box-shadow:0 0 0 3px rgba(57,255,20,.25); }\n.gallery-thumb img { width:100%; height:100%; object-fit:cover; }\n.thumb-badge {\n    position:absolute; top:6px; left:6px; background:#12b981; color:#fff;\n    padding:2px 8px; border-radius:4px; font-family:var(--mono); font-size:11px; font-weight:600;\n}\n.thumb-remove {\n    position:absolute; top:6px; right:6px; width:24px; height:24px;\n    background:rgba(0,0,0,.75); color:#fff; border:1px solid rgba(255,255,255,.15);\n    border-radius:50%; cursor:pointer; display:none;
75\n    align-items:center; justify-content:center; font-size:12px; transition:all .15s; line-height:1;\n}\n.gallery-thumb:hover .thumb-remove { display:flex; }\n.thumb-remove:hover { background:#12b981; border-color:#12b981; }\n.gallery-add-card {\n    aspect-ratio:1; border-radius:10px; border:2px dashed #333338;\n    display:flex; flex-direction:column; align-items:center; justify-content:center;\n    cursor:pointer; transition:all .2s ease; background:rgba(57,255,20,.05); gap:4px;\n}\n.gallery-add-card:hover { border-color:#12b981; background:rgba(57,255,20,.1); }\n.gallery-add-card .add-icon { font-size:28px; color:#555560; font-weight:300; }\n.gallery-add-card .add-text { font-size:12px; color:#555560; font-weight:600; font-family:\u0027Inter\u0027,sans-serif; }\n\n/* ── Hint bar ──────────────────────────────────────────────────────────────── */\n.hint-bar {\n    background: rgba(57,255,20,.05) !important;\n    border-top:1px solid #2a2a2e; border-bottom:1px solid #2a2a2e;\n    padding:10px 20px; font-size:13px; color:#9898a8; line-height:1.7;\n    font-weight:400; font-family:\u0027Inter\u0027,sans-serif;\n}\n.hint-bar b { color:#39ff14; font-weight:700; }\n.hint-bar kbd {\n    display:inline-block; padding:1px 6px; background:#222226;\n    border:1px solid #333338; border-radius:4px;\n    font-family:var(--mono); font-size:11px; color:#9898a8;\n}\n\n/* ── Suggestions ───────────────────────────────────────────────────────────── */\n.suggestions-section { border-top:1px solid #2a2a2e; padding:12px 16px; background:#141416!important; }\n.suggestions-title, .examples-title {\n    font-size:11px; font-weight:700; color:#555560;\n    text-transform:uppercase; letter-spacing:1px; margin-bottom:10px;\n    font-family:\u0027Inter\u0027,sans-serif;\n}\n.suggestions-wrap { display:flex; flex-wrap:wrap; gap:6px; }\n.suggestion-chip {\n    display:inline-flex; align-items:center; gap:4px; padding:5px 13px;\n    background:rgba(57,255,20,.1); border:1px solid rgba(57,255,20,.25); border-radius:20px;\n    color:#39ff14; font-size:12px; font-weight:600; font-family:\u0027Inter\u0027,sans-serif;\n    cursor:pointer; transition:all .15s; white-space:nowrap;\n}\n.suggestion-chip:hover { background:rgba(57,255,20,.2); border-color:#12b981; color:#fff; transform:translateY(-1px); }\n\n/* ── Examples ──────────────────────────────────────────────────────────────── */\n.examples-section { border-top:1px solid #2a2a2e; padding:14px 16px 18px; background:#141416!important; }\n.examples-scroll { display:flex; gap:10px; overflow-x:auto; padding-bottom:10px; padding-top:2px; }\n.examples-scroll::-webkit-scrollbar { height:5px; }\n.examples-scroll::-webkit-scrollbar-track { background:#0d0d0f; border-radius:3px; }\n.examples-scroll::-webkit-scrollbar-thumb { background:#333338; border-radius:3px; }\n.examples-scroll::-webkit-scrollbar-thumb:hover { background:#0e8f63; }\n.example-card {\n    flex-shrink:0; width:220px; background:#1a1a1d!important; border:1px solid #2a2a2e;\n    border-radius:12px; overflow:hidden; cursor:pointer; transition:all .2s ease;\n}\n.example-card:hover { border-color:#12b981; transform:translateY(-3px); box-shadow:0 6px 20px rgba(57,255,20,.22); }\n.example-card.loading { opacity:.5; pointer-events:none; }\n.example-thumbs { display:flex; height:115px; overflow:hidden; background:#222226!important; }\n.example-thumbs img { flex:1; object-fit:cover; min-width:0; }\n.example-thumb-placeholder {\n    flex:1; display:flex; align-items:center; justify-content:center;\n    background:#222226!important; color:#555560; font-size:11px; min-width:0;\n}\n.example-meta { padding:7px 10px 3px; display:flex; align-items:center; gap:5px; flex-wrap:wrap; }\n.example-badge {\n    display:inline-flex; padding:2px 7px; background:rgba(57,255,20,.1); border-radius:4px;\n    font-size:10px; font-weight:700; color:#39ff14; font-family:var(--mono);\n    white-space:nowrap; border:1px solid rgba(57,255,20,.2);\n}\n.example-lora-badge {\n    display:inline-flex; padding:2px 7px; background:rgba(255,255,255,.06); border-radius:4px;\n    font-size:10px; font-weight:600; color:#9898a8; font-family:var(--mono);\n    white-space:nowrap; border:1px solid #2a2a2e;\n    max-width:120px; overflow:hidden; text-overflow:ellipsis;\n}\n.example-prompt-text {\n    padding:2px 10px 10px; font-size:11.5px; color:#9898a8; line-height:1.45;\n    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;\n    overflow:hidden; font-weight:400; font-family:\u0027Inter\u0027,sans-serif;\n}\n\n/* ── Right panel ───────────────────────────────────────────────────────────── */\n.panel-card { border-bottom:1px solid #2a2a2e; background:#141416!important; }\n.panel-card-title {\n    padding:11px 20px; font-size:11px; font-weight:700; color:#555560;\n    text-transform:uppercase; letter-spacing:1px;\n    border-bottom:1px solid rgba(42,42,46,.6);\n    background:#141416!important; font-family:\u0027Inter\u0027,sans-serif;\n}\n.panel-card-body { padding:14px 18px; display:flex; flex-direction:column; gap:8px; background:#141416!important; }\n.modern-label { font-size:13px; font-weight:600; color:#9898a8; margin-bottom:4px; display:block; font-family:\u0027Inter\u0027,sans-serif; }\n.modern-textarea {\n    width:100%; background:#09090b!important; border:1px solid #2a2a2e; border-radius:8px;\n    padding:10px 14px; font-family:\u0027Inter\u0027,sans-serif; font-size:14px;\n    color:#e8e8ec!important; -webkit-text-fill-color:#e8e8ec!important;\n    resize:vertical; outline:none; min-height:44px; transition:border-color .2s; font-weight:400;\n}\n.modern-textarea:focus { border-color:#12b981; box-shadow:0 0 0 3px rgba(57,255,20,.22); }\n.modern-textarea::placeholder { color:#555560!important; -webkit-text-fill-color:#555560!important; }\n.modern-textarea.error-flash {\n    border-color:#ef4444!important;\n    box-shadow:0 0 0 3px rgba(239,68,68,.2)!important;\n    animation:shake .4s ease;\n}\n@keyframes shake {\n    0%,100%{transform:translateX(0)}\n    20%,60%{transform:translateX(-4px)}\n    40%,80%{transform:translateX(4px)}\n}\n\n/* ── LoRA selector - always dark ───────────────────────────────────────────── */\n.lora-selector-card { border-bottom:1px solid #2a2a2e!important; background:#0d0d0f!important; }\n.lora-selector-body { padding:12px 18px!important; background:#0d0d0f!important; }\n.lora-select-label {\n    font-size:11px!important; font-weight:700!important;\n    color:#555560!important; -webkit-text-fill-color:#555560!important;\n    text-transform:uppercase!important; letter-spacing:1px!important;\n    margin-bottom:8px!important; display:flex!important; align-items:center!important;\n    gap:6px!important; font-family:\u0027Inter\u0027,sans-serif!important;\n}\n.lora-select-label::before {\n    content:\u0027\u0027; display:inline-block; width:8px; height:8px;\n    background:#12b981; border-radius:50%; flex-shrink:0;\n}\n.lora-native-select {\n    width:100%!important; background:#09090b!important;\n    border:1px solid #333338!important; border-radius:8px!important;\n    padding:9px 36px 9px 14px!important;\n    font-family:\u0027Inter\u0027,sans-serif!important;\n    font-size:13px!important; font-weight:600!important;\n    color:#e8e8ec!important; -webkit-text-fill-color:#e8e8ec!important;\n    outline:none!important; appearance:none!important; -webkit-appearance:none!important;\n    background-image:url(\"data:image/svg+xml,%3Csvg xmlns=\u0027http://www.w3.org/2000/svg\u0027 width=\u002712\u0027 height=\u002712\u0027 viewBox=\u00270 0 12 12\u0027%3E%3Cpath fill=\u0027%2312b981\u0027 d=\u0027M6 8L1 3h10z\u0027/%3E%3C/svg%3E\")!important;\n    background-repeat:no-repeat!important; background-position:right 12px center!important;\n    cursor:pointer!important; transition:border-color .2s!important; color-scheme:dark!important;\n}\n.lora-native-select:focus { border-color:#12b981!important; box-shadow:0 0 0 3px rgba(57,255,20,.22)!important; }\n.lora-native-select option { background:#1a1a1d!important; color:#e8e8ec!important; }\n\n@media (prefers-color-scheme: light) {\n    .lora-selector-card { background:#0d0d0f!important; }\n    .lora-selector-body { background:#0d0d0f!important; }\n    .lora-select-label { color:#555560!important; -webkit-text-fill-color:#555560!important; }\n    .lora-native-select {\n        background:#09090b!important; color:#e8e8ec!important;\n        -webkit-text-fill-color:#e8e8ec!important;\n        border-color:#333338!important; color-scheme:dark!important;\n    }\n    .lora-native-select option { background:#1a1a1d!important; color:#e8e8ec!important; }\n}\n\n/* ── Toast ─────────────────────────────────────────────────────────────────── */\n.toast-notification {\n    position:fixed; top:24px; left:50%;\n    transform:translateX(-50%) translateY(-120%);\n    z-index:9999; padding:10px 24px; border-radius:10px;\n    font-family:\u0027Inter\u0027,sans-serif; font-size:14px; font-weight:700;\n    display:flex; align-items:center; gap:8px;\n    box-shadow:0 8px 24px rgba(0,0,0,.5);\n    transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .35s ease;\n    opacity:0; pointer-events:none;\n}\n.toast-notification.visible { transform:translateX(-50%) translateY(0); opacity:1; pointer-events:auto; }\n.toast-notification.error   { background:linear-gradient(135deg,#dc2626,#b91c1c); color:#fff; border:1px solid rgba(255,255,255,.15); }\n.toast-notification.warning { background:linear-gradient(135deg,#12b981,#0e8f63); color:#fff; border:1px solid rgba(255,255,255,.15); }\n.toast-notification.info    { background:linear-gradient(135deg,#2563eb,#1d4ed8); color:#fff; border:1px solid rgba(255,255,255,.15); }\n\n/* ── Run button ────────────────────────────────────────────────────────────── */\n.btn-run {\n    display:flex; align-items:center; justify-content:center; gap:8px; width:100%;\n    background:linear-gradient(135deg,#12b981,#0e8f63); border:none; border-radius:10px;\n    padding:13px 24px; cursor:pointer; font-size:15px; font-weight:800;\n    font-family:\u0027Inter\u0027,sans-serif;\n    color:#fff!important; -webkit-text-fill-color:#fff!important;\n    transition:all .2s ease; letter-spacing:.2px;\n    box-shadow:0 4px 20px rgba(57,255,20,.28),inset 0 1px 0 rgba(255,255,255,.12);\n}\n.btn-run:hover {\n    background:linear-gradient(135deg,#39ff14,#12b981); transform:translateY(-1px);\n    box-shadow:0 8px 28px rgba(57,255,20,.45),inset 0 1px 0 rgba(255,255,255,.15);\n}\n.btn-run:active { transform:translateY(0); box-shadow:0 2px 10px rgba(57,255,20,.28); }\n.btn-run svg { width:18px; height:18px; fill:#fff!important; }\n#custom-run-btn, #custom-run-btn *, #run-btn-label, .btn-run, .btn-run * {\n    color:#fff!important; -webkit-text-fill-color:#fff!important; fill:#fff!important;\n}\n\n/* ── Output ────────────────────────────────────────────────────────────────── */\n.output-frame { border-bottom:1px solid #2a2a2e; display:flex; flex-direction:column; position:relative; }\n.out-title {\n    padding:10px 20px; font-size:11px; font-weight:700;\n    color:#fff!important; -webkit-text-fill-color:#fff!important;\n    text-transform:uppercase; letter-spacing:1px;\n    border-bottom:1px solid rgba(42,42,46,.6);\n    display:flex; align-items:center; justify-content:space-between;\n    background:#141416!important; font-family:\u0027Inter\u0027,sans-serif;\n}\n.out-body {\n    flex:1; background:#09090b!important;\n    display:flex; align-items:center; justify-content:center;\n    overflow:hidden; min-height:240px; position:relative;\n}\n.out-body img { max-width:100%; max-height:460px; image-rendering:auto; }\n.out-placeholder { color:#555560; font-size:13px; text-align:center; padding:20px; font-weight:500; font-family:\u0027Inter\u0027,sans-serif; }\n.out-download-btn {\n    display:none; align-items:center; justify-content:center;\n    background:rgba(57,255,20,.12); border:1px solid rgba(57,255,20,.28); border-radius:6px;\n    cursor:pointer; padding:3px 10px; font-size:11px; font-weight:700;\n    color:#39ff14!important; -webkit-text-fill-color:#39ff14!important;\n    gap:4px; height:24px; transition:all .15s; font-family:\u0027Inter\u0027,sans-serif;\n}\n.out-download-btn:hover {\n    background:#12b981; border-color:#12b981;\n    color:#fff!important; -webkit-text-fill-color:#fff!important;\n}\n.out-download-btn.visible { display:inline-flex; }\n.out-download-btn svg { width:12px; height:12px; fill:#39ff14; }\n.out-download-btn:hover svg { fill:#fff; }\n\n/* ── Loader ────────────────────────────────────────────────────────────────── */\n.modern-loader {\n    display:none; position:absolute; top:0; left:0; right:0; bottom:0;\n    background:rgba(9,9,11,.93); z-index:15;\n    flex-direction:column; align-items:center; justify-content:center;\n    gap:16px; backdrop-filter:blur(4px);\n}\n.modern-loader.active { display:flex; }\n.modern-loader .loader-spinner {\n    width:36px; height:36px; border:3px solid #2a2a2e;\n    border-top-color:#12b981; border-radius:50%; animation:spin .8s linear infinite;\n}\n@keyframes spin { to{transform:rotate(360deg)} }\n.modern-loader .loader-text { font-size:13px; color:#9898a8; font-weight:600; font-family:\u0027Inter\u0027,sans-serif; }
75\n.loader-bar-track { width:200px; height:4px; background:#2a2a2e; border-radius:2px; overflow:hidden; }\n.loader-bar-fill {\n    height:100%; background:linear-gradient(90deg,#12b981,#39ff14,#12b981);\n    background-size:200% 100%; animation:shimmer 1.5s ease-in-out infinite; border-radius:2px;\n}\n@keyframes shimmer { 0%{background-position:200% 0} 100%{background-position:-200% 0} }\n\n/* ── Settings ──────────────────────────────────────────────────────────────── */\n.settings-group { border:1px solid #2a2a2e; border-radius:10px; margin:12px 16px; padding:0; overflow:hidden; background:#141416!important; }\n.settings-group-title {\n    font-size:11px; font-weight:700; color:#555560; text-transform:uppercase; letter-spacing:1px;\n    padding:9px 16px; border-bottom:1px solid #2a2a2e;\n    background:rgba(26,26,29,.5)!important; font-family:\u0027Inter\u0027,sans-serif;\n}\n.settings-group-body { padding:14px 16px; display:flex; flex-direction:column; gap:12px; background:#141416!important; }\n.slider-row { display:flex; align-items:center; gap:10px; min-height:28px; }\n.slider-row label { font-size:13px; font-weight:600; color:#9898a8; min-width:72px; flex-shrink:0; font-family:\u0027Inter\u0027,sans-serif; }\n.slider-row input[type=\"range\"] {\n    flex:1; -webkit-appearance:none; appearance:none;\n    height:5px; background:#333338; border-radius:3px; outline:none; min-width:0;\n}\n.slider-row input[type=\"range\"]::-webkit-slider-thumb {\n    -webkit-appearance:none; width:16px; height:16px;\n    background:linear-gradient(135deg,#12b981,#0e8f63);\n    border-radius:50%; cursor:pointer;\n    box-shadow:0 2px 6px rgba(57,255,20,.28); transition:transform .15s;\n}\n.slider-row input[type=\"range\"]::-webkit-slider-thumb:hover { transform:scale(1.2); }\n.slider-row input[type=\"range\"]::-moz-range-thumb {\n    width:16px; height:16px; background:linear-gradient(135deg,#12b981,#0e8f63);\n    border-radius:50%; cursor:pointer; border:none; box-shadow:0 2px 6px rgba(57,255,20,.28);\n}\n.slider-row .slider-val {\n    min-width:52px; text-align:right; font-family:var(--mono); font-size:12px;\n    font-weight:500; padding:3px 8px; background:#09090b; border:1px solid #2a2a2e;\n    border-radius:6px; color:#9898a8; flex-shrink:0;\n}\n.checkbox-row { display:flex; align-items:center; gap:8px; font-size:13px; color:#9898a8; }\n.checkbox-row input[type=\"checkbox\"] { accent-color:#12b981; width:16px; height:16px; cursor:pointer; }\n.checkbox-row label { color:#9898a8; font-size:13px; cursor:pointer; font-weight:500; font-family:\u0027Inter\u0027,sans-serif; }\n\n/* ── Status bar ────────────────────────────────────────────────────────────── */\n.app-statusbar {\n    background:#141416!important; border-top:1px solid #2a2a2e;\n    padding:6px 20px; display:flex; gap:12px; height:34px; align-items:center; font-size:12px;\n}\n.app-statusbar .sb-section {\n    padding:0 12px; flex:1; display:flex; align-items:center;\n    font-family:var(--mono); font-size:12px; color:#555560;\n    overflow:hidden; white-space:nowrap;\n}\n.app-statusbar .sb-section.sb-fixed {\n    flex:0 0 auto; min-width:90px; text-align:center; justify-content:center;\n    padding:3px 12px; background:rgba(57,255,20,.1); border-radius:6px;\n    color:#39ff14; font-weight:700; border:1px solid rgba(57,255,20,.2);\n}\n\n/* ── Footer ────────────────────────────────────────────────────────────────── */\n.exp-note {\n    padding:10px 20px; font-size:12px; color:#555560;\n    border-top:1px solid #2a2a2e; text-align:center; font-weight:500;\n    background:#141416!important; font-family:\u0027Inter\u0027,sans-serif;\n}\n.exp-note a { color:#39ff14!important; -webkit-text-fill-color:#39ff14!important; text-decoration:none; }\n.exp-note a:hover { text-decoration:underline;
75 color:#fff!important; -webkit-text-fill-color:#fff!important; }\n\n/* ── Scrollbars ────────────────────────────────────────────────────────────── */\n::-webkit-scrollbar { width:7px; height:7px; }\n::-webkit-scrollbar-track { background:#09090b; }\n::-webkit-scrollbar-thumb { background:#333338; border-radius:4px; }\n::-webkit-scrollbar-thumb:hover { background:#0e8f63; }\n\n/* ── Responsive ────────────────────────────────────────────────────────────── */\n@media(max-width:860px){\n    .app-main-row { flex-direction:column; }\n    .app-main-right { width:100%; }\n    .app-main-left { border-right:none; border-bottom:1px solid #2a2a2e; }\n}\n","connect_heartbeat":false,"js":null,"head":null,"title":"AI 프로필 사진 · Connect AI LAB","space_id":"WeonJeong/ai-profile","enable_queue":true,"show_error":true,"footer_links":["api","gradio","settings"],"is_colab":false,"max_file_size":null,"stylesheets":[],"theme":"default","protocol":"sse_v3","body_css":{"body_background_fill":"white","body_text_color":"#27272a","body_background_fill_dark":"#0f0f11","body_text_color_dark":"#f4f4f5"},"fill_height":false,"fill_width":false,"theme_hash":"8ad6f9b14414574fe6c6d9b4362dcdd63dfdc66d8c34cbef0982888dfc44ff04","pwa":true,"pages":[["","Home",true]],"page":{"":{"layout":{"id":0,"children":[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12,"children":[]},{"id":13,"children":[]},{"id":14}]},"components":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"dependencies":[0,1,2,3]}},"mcp_server":true,"i18n_translations":null,"dependencies":[{"id":0,"targets":[[0,"load"]],"inputs":[],"outputs":[],"backend_fn":false,"js":"\n() =\u003e {\nfunction init() {\n    if (window.__qwenInitDone) return;\n\n    const galleryGrid  = document.getElementById(\u0027image-gallery-grid\u0027);\n    const dropZone     = document.getElementById(\u0027gallery-drop-zone\u0027);\n    const uploadPrompt = document.getElementById(\u0027upload-prompt\u0027);\n    const uploadClick  = document.getElementById(\u0027upload-click-area\u0027);\n    const fileInput    = document.getElementById(\u0027custom-file-input\u0027);\n    const btnUpload    = document.getElementById(\u0027tb-upload\u0027);\n    const btnRemove    = document.getElementById(\u0027tb-remove\u0027);\n    const btnClear     = document.getElementById(\u0027tb-clear\u0027);\n    const promptInput  = document.getElementById(\u0027custom-prompt-input\u0027);\n    const loraSelect   = document.getElementById(\u0027custom-lora-select\u0027);\n    const runBtnEl     = document.getElementById(\u0027custom-run-btn\u0027);\n    const imgCountTb   = document.getElementById(\u0027tb-image-count\u0027);\n    const imgCountSb   = document.getElementById(\u0027sb-image-count\u0027);\n\n    if (!galleryGrid || !fileInput || !dropZone) { setTimeout(init, 250); return; }\n    window.__qwenInitDone = true;\n\n    let images = [];\n    window.__uploadedImages = images;\n    let selectedIdx = -1;\n    let toastTimer  = null;\n\n    /* ── Force dark styles on elements that browsers may override ── */\n    function enforceDarkStyles() {\n        /* LoRA card */\n        const loraCard  = document.querySelector(\u0027.lora-selector-card\u0027);\n        const loraBody  = document.querySelector(\u0027.lora-selector-body\u0027);\n        const loraLabel = document.querySelector(\u0027.lora-select-label\u0027);\n        const loraEl    = document.getElementById(\u0027custom-lora-select\u0027);\n        if (loraCard)  { loraCard.style.setProperty(\u0027background\u0027,\u0027#0d0d0f\u0027,\u0027important\u0027); }\n        if (loraBody)  { loraBody.style.setProperty(\u0027background\u0027,\u0027#0d0d0f\u0027,\u0027important\u0027); }\n        if (loraLabel) {\n            loraLabel.style.setProperty(\u0027color\u0027,\u0027#555560\u0027,\u0027important\u0027);\n            loraLabel.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#555560\u0027,\u0027important\u0027);\n        }\n        if (loraEl) {\n            loraEl.style.setProperty(\u0027background-color\u0027,\u0027#09090b\u0027,\u0027important\u0027);\n            loraEl.style.setProperty(\u0027color\u0027,\u0027#e8e8ec\u0027,\u0027important\u0027);\n            loraEl.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#e8e8ec\u0027,\u0027important\u0027);\n            loraEl.style.setProperty(\u0027border-color\u0027,\u0027#333338\u0027,\u0027important\u0027);\n        }\n\n        /* GitHub button */\n        const ghBtn = document.querySelector(\u0027.gh-btn\u0027);\n        if (ghBtn) {\n            ghBtn.style.setProperty(\u0027background\u0027,\u0027#12b981\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027border-color\u0027,\u0027rgba(255,255,255,.15)\u0027,\u0027important\u0027);
75\n            ghBtn.style.setProperty(\u0027box-shadow\u0027,\u00270 2px 8px rgba(57,255,20,.4)\u0027,\u0027important\u0027);\n            const svg = ghBtn.querySelector(\u0027svg\u0027);\n            if (svg) svg.style.setProperty(\u0027fill\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            const span = ghBtn.querySelector(\u0027span\u0027);\n            if (span) {\n                span.style.setProperty(\u0027color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n                span.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            }\n        }\n\n        /* Shell sections */\n        const shell   = document.querySelector(\u0027.app-shell\u0027);\n        const header  = document.querySelector(\u0027.app-header\u0027);\n        const toolbar = document.querySelector(\u0027.app-toolbar\u0027);\n        if (shell)   shell.style.setProperty(\u0027background\u0027,\u0027#141416\u0027,\u0027important\u0027);\n        if (header)  header.style.setProperty(\u0027background\u0027,\u0027#1a1a1d\u0027,\u0027important\u0027);\n        if (toolbar) toolbar.style.setProperty(\u0027background\u0027,\u0027#141416\u0027,\u0027important\u0027);\n    }\n\n    enforceDarkStyles();\n    setInterval(enforceDarkStyles, 800);\n\n    /* GitHub button hover interaction */\n    const ghBtn = document.querySelector(\u0027.gh-btn\u0027);\n    if (ghBtn) {\n        ghBtn.addEventListener(\u0027mouseenter\u0027, () =\u003e {\n            ghBtn.style.setProperty(\u0027background\u0027,\u0027#39ff14\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027transform\u0027,\u0027translateY(-1px)\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027box-shadow\u0027,\u00270 4px 16px rgba(57,255,20,.55)\u0027,\u0027important\u0027);\n        });\n        ghBtn.addEventListener(\u0027mouseleave\u0027, () =\u003e {\n            ghBtn.style.setProperty(\u0027background\u0027,\u0027#12b981\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027-webkit-text-fill-color\u0027,\u0027#ffffff\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027transform\u0027,\u0027translateY(0)\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027box-shadow\u0027,\u00270 2px 8px rgba(57,255,20,.4)\u0027,\u0027important\u0027);\n        });\n        ghBtn.addEventListener(\u0027mousedown\u0027, () =\u003e {\n            ghBtn.style.setProperty(\u0027background\u0027,\u0027#0e8f63\u0027,\u0027important\u0027);\n            ghBtn.style.setProperty(\u0027transform\u0027,\u0027translateY(0)\u0027,\u0027important\u0027);\n        });\n        ghBtn.addEventListener(\u0027mouseup\u0027, () =\u003e {\n            ghBtn.style.setProperty(\u0027background\u0027,\u0027#39ff14\u0027,\u0027important\u0027);\n        });\n    }\n\n    function showToast(message, type) {\n        let toast = document.getElementById(\u0027app-toast\u0027);\n        if (!toast) {\n            toast = document.createElement(\u0027div\u0027);\n            toast.id = \u0027app-toast\u0027;\n            toast.className = \u0027toast-notification\u0027;\n            toast.innerHTML = \u0027\u003cspan class=\"toast-icon\"\u003e\u003c/span\u003e\u003cspan class=\"toast-text\"\u003e\u003c/span\u003e\u0027;\n            document.body.appendChild(toast);\n        }\n        const icon = toast.querySelector(\u0027.toast-icon\u0027);\n        const text = toast.querySelector(\u0027.toast-text\u0027);\n        toast.className = \u0027toast-notification \u0027 + (type || \u0027error\u0027);\n        icon.textContent = type === \u0027warning\u0027 ? \u0027\\u26A0\u0027 : type === \u0027info\u0027 ? \u0027\\u2139\u0027 : \u0027\\u2717\u0027;\n        text.textContent = message;\n        if (toastTimer) clearTimeout(toastTimer);\n        void toast.offsetWidth;\n        toast.classList.add(\u0027visible\u0027);\n        toastTimer = setTimeout(() =\u003e toast.classList.remove(\u0027visible\u0027), 3500);\n    }\n    window.__showToast = showToast;\n\n    function flashPromptError() {\n        if (!promptInput) return;\n        promptInput.classList.add(\u0027error-flash\u0027);\n        promptInput.focus();\n        setTimeout(() =\u003e promptInput.classList.remove(\u0027error-flash\u0027), 800);\n    }\n\n    function setGradioValue(containerId, value) {\n        const container = document.getElementById(containerId);\n        if (!container) return;\n        container.querySelectorAll(\u0027input, textarea\u0027).forEac
75h(el =\u003e {\n            if (el.type === \u0027file\u0027 || el.type === \u0027range\u0027 || el.type === \u0027checkbox\u0027) return;\n            const proto = el.tagName === \u0027TEXTAREA\u0027 ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n            const ns = Object.getOwnPropertyDescriptor(proto, \u0027value\u0027);\n            if (ns \u0026\u0026 ns.set) {\n                ns.set.call(el, value);\n                el.dispatchEvent(new Event(\u0027input\u0027,  {bubbles:true, composed:true}));\n                el.dispatchEvent(new Event(\u0027change\u0027, {bubbles:true, composed:true}));\n            }\n        });\n    }\n    window.__setGradioValue = setGradioValue;\n\n    function syncImagesToGradio() {\n        window.__uploadedImages = images;\n        const b64Array = images.map(img =\u003e img.b64);\n        setGradioValue(\u0027hidden-images-b64\u0027, JSON.stringify(b64Array));\n        updateCounts();\n    }\n    function syncPromptToGradio() {\n        if (promptInput) setGradioValue(\u0027prompt-gradio-input\u0027, promptInput.value);\n    }\n    function syncLoraToGradio() {\n        if (!loraSelect) return;\n        const container = document.getElementById(\u0027gradio-lora\u0027);\n        if (!container) return;\n        container.querySelectorAll(\u0027input\u0027).forEach(el =\u003e {\n            const ns = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \u0027value\u0027);\n            if (ns \u0026\u0026 ns.set) {\n                ns.set.call(el, loraSelect.value);\n                el.dispatchEvent(new Event(\u0027input\u0027,  {bubbles:true, composed:true}));\n                el.dispatchEvent(new Event(\u0027change\u0027, {bubbles:true, composed:true}));\n            }\n        });\n    }\n\n    function updateCounts() {\n        const n   = images.length;\n        const txt = n \u003e 0 ? n + \u0027장\u0027 : \u0027사진 없음\u0027;\n        if (imgCountTb) imgCountTb.textContent = txt;\n        if (imgCountSb) imgCountSb.textContent = n \u003e 0 ? txt + \u0027 올림\u0027 : \u0027사진을 올려주세요\u0027;\n    }\n\n    function addImage(b64, name) {\n        images.push({id: Date.now() + Math.random(), b64, name});\n        renderGallery(); syncImagesToGradio();\n    }\n    window.__addImage = addImage;\n\n    function removeImage(idx) {\n        images.splice(idx, 1);\n        if (selectedIdx === idx) selectedIdx = -1;\n        else if (selectedIdx \u003e idx) selectedIdx--;\n        renderGallery(); syncImagesToGradio();\n    }\n\n    function clearAll() {\n        images = []; window.__uploadedImages = images; selectedIdx = -1;\n        renderGallery(); syncImagesToGradio();\n    }\n    window.__clearAll = clearAll;\n\n    function renderGallery() {\n        if (images.length === 0) {\n            galleryGrid.innerHTML = \u0027\u0027; galleryGrid.style.display = \u0027none\u0027;\n            if (uploadPrompt) uploadPrompt.style.display = \u0027\u0027;\n            return;\n        }\n        if (uploadPrompt) uploadPrompt.style.display = \u0027none\u0027;\n        galleryGrid.style.display = \u0027grid\u0027;\n        let html = \u0027\u0027;\n        images.forEach((img, i) =\u003e {\n            const sel = i === selectedIdx ? \u0027 selected\u0027 : \u0027\u0027;\n            html += \u0027\u003cdiv class=\"gallery-thumb\u0027 + sel + \u0027\" data-idx=\"\u0027 + i + \u0027\"\u003e\u0027\n                  + \u0027\u003cimg src=\"\u0027 + img.b64 + \u0027\" alt=\"\u0027 + (img.name||\u0027image\u0027) + \u0027\"\u003e\u0027\n                  + \u0027\u003cspan class=\"thumb-badge\"\u003e#\u0027 + (i+1) + \u0027\u003c/span\u003e\u0027\n                  + \u0027\u003cbutton class=\"thumb-remove\" data-remove=\"\u0027 + i + \u0027\"\u003e\\u2715\u003c/button\u003e\u0027\n                  + \u0027\u003c/div\u003e\u0027;\n        });\n        html += \u0027\u003cdiv class=\"gallery-add-card\" id=\"gallery-add-card\"\u003e\u003cspan class=\"add-icon\"\u003e+\u003c/span\u003e\u003cspan class=\"add-text\"\u003e추가\u003c/span\u003e\u003c/div\u003e\u0027;\n        galleryGrid.innerHTML = html;\n        galleryGrid.querySelectorAll(\u0027.gallery-thumb\u0027).forEac
75h(thumb =\u003e {\n            thumb.addEventListener(\u0027click\u0027, (e) =\u003e {\n                if (e.target.closest(\u0027.thumb-remove\u0027)) return;\n                selectedIdx = (selectedIdx === parseInt(thumb.dataset.idx)) ? -1 : parseInt(thumb.dataset.idx);\n                renderGallery();\n            });\n        });\n        galleryGrid.querySelectorAll(\u0027.thumb-remove\u0027).forEach(btn =\u003e {\n            btn.addEventListener(\u0027click\u0027, (e) =\u003e { e.stopPropagation(); removeImage(parseInt(btn.dataset.remove)); });\n        });\n        const addCard = document.getElementById(\u0027gallery-add-card\u0027);\n        if (addCard) addCard.addEventListener(\u0027click\u0027, () =\u003e fileInput.click());\n    }\n\n    function processFiles(files) {\n        Array.from(files).forEach(file =\u003e {\n            if (!file.type.startsWith(\u0027image/\u0027)) return;\n            const reader = new FileReader();\n            reader.onload = (e) =\u003e addImage(e.target.result, file.name);\n            reader.readAsDataURL(file);\n        });\n    }\n\n    fileInput.addEventListener(\u0027change\u0027, (e) =\u003e { processFiles(e.target.files); e.target.value = \u0027\u0027; });\n    if (uploadClick) uploadClick.addEventListener(\u0027click\u0027, () =\u003e fileInput.click());\n    if (btnUpload)   btnUpload.addEventListener(\u0027click\u0027,  () =\u003e fileInput.click());\n    if (btnRemove)   btnRemove.addEventListener(\u0027click\u0027,  () =\u003e { if (selectedIdx \u003e= 0) removeImage(selectedIdx); });\n    if (btnClear)    btnClear.addEventListener(\u0027click\u0027,   clearAll);\n\n    dropZone.addEventListener(\u0027dragover\u0027,  (e) =\u003e { e.preventDefault(); dropZone.classList.add(\u0027drag-over\u0027); });\n    dropZone.addEventListener(\u0027dragleave\u0027, (e) =\u003e { e.preventDefault(); dropZone.classList.remove(\u0027drag-over\u0027); });\n    dropZone.addEventListener(\u0027drop\u0027, (e) =\u003e {\n        e.preventDefault(); dropZone.classList.remove(\u0027drag-over\u0027);\n        if (e.dataTransfer.files.length) processFiles(e.dataTransfer.files);\n    });\n\n    if (promptInput) promptInput.addEventListener(\u0027input\u0027, syncPromptToGradio);\n    if (loraSelect)  loraSelect.addEventListener(\u0027change\u0027, syncLoraToGradio);\n\n    window.__setPrompt = function(text) { if (promptInput) { promptInput.value = text; syncPromptToGradio(); } };\n    window.__setLora   = function(lora) {\n        if (loraSelect) {\n            loraSelect.value = lora;\n            loraSelect.dispatchEvent(new Event(\u0027change\u0027, {bubbles:true}));\n            syncLoraToGradio();\n        }\n    };\n\n    document.querySelectorAll(\u0027.example-card[data-idx]\u0027).forEach(card =\u003e {\n        card.addEventListener(\u0027click\u0027, () =\u003e {\n            const idx = card.getAttribute(\u0027data-idx\u0027);\n            document.querySelectorAll(\u0027.example-card.loading\u0027).forEach(c =\u003e c.classList.remove(\u0027loading\u0027));\n            card.classList.add(\u0027loading\u0027);\n            showToast(\u0027Loading example\\u2026\u0027, \u0027info\u0027);\n            setGradioValue(\u0027example-result-data\u0027, \u0027\u0027);\n            setGradioValue(\u0027example-idx-input\u0027, idx);\n            setTimeout(() =\u003e {\n                const btn = document.getElementById(\u0027example-load-btn\u0027);\n                if (btn) { const b = btn.querySelector(\u0027button\u0027); if (b) b.click(); else btn.click(); }\n            }, 150);\n            setTimeout(() =\u003e card.classList.remove(\u0027loading\u0027), 12000);\n        });\n    });\n\n    function syncSlider(customId, gradioId) {\n        const slider  = document.getElementById(customId);\n        const valSpan = document.getElementById(customId + \u0027-val\u0027);\n        if (!slider) return;\n        slider.addEventListener(\u0027input\u0027, () =\u003e {\n            if (valSpan) valSpan.textContent = slider.value;\n            const container = document.getElementById(gradioId);\n            if (!container) return;\n            container.querySelectorAll(\u0027input[type=\"range\"],input[type=\"number\"]\u0027).forEac
75h(el =\u003e {\n                const ns = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \u0027value\u0027);\n                if (ns \u0026\u0026 ns.set) {\n                    ns.set.call(el, slider.value);\n                    el.dispatchEvent(new Event(\u0027input\u0027,  {bubbles:true, composed:true}));\n                    el.dispatchEvent(new Event(\u0027change\u0027, {bubbles:true, composed:true}));\n                }\n            });\n        });\n    }\n    syncSlider(\u0027custom-seed\u0027,     \u0027gradio-seed\u0027);\n    syncSlider(\u0027custom-guidance\u0027, \u0027gradio-guidance\u0027);\n    syncSlider(\u0027custom-steps\u0027,    \u0027gradio-steps\u0027);\n\n    const randCheck = document.getElementById(\u0027custom-randomize\u0027);\n    if (randCheck) {\n        randCheck.addEventListener(\u0027change\u0027, () =\u003e {\n            const container = document.getElementById(\u0027gradio-randomize\u0027);\n            if (!container) return;\n            const cb = container.querySelector(\u0027input[type=\"checkbox\"]\u0027);\n            if (cb \u0026\u0026 cb.checked !== randCheck.checked) cb.click();\n        });\n    }\n\n    function showLoader() {\n        const l = document.getElementById(\u0027output-loader\u0027);\n        if (l) l.classList.add(\u0027active\u0027);\n        const sb = document.querySelector(\u0027.sb-fixed\u0027);\n        if (sb) sb.textContent = \u0027만드는 중\\u2026\u0027;\n    }\n    function hideLoader() {\n        const l = document.getElementById(\u0027output-loader\u0027);\n        if (l) l.classList.remove(\u0027active\u0027);\n        const sb = document.querySelector(\u0027.sb-fixed\u0027);\n        if (sb) sb.textContent = \u0027Done\u0027;\n    }\n    window.__showLoader = showLoader;\n    window.__hideLoader = hideLoader;\n\n    function validateBeforeRun() {\n        const promptVal = promptInput ? promptInput.value.trim() : \u0027\u0027;\n        const hasImages = images.length \u003e 0;\n        if (!hasImages \u0026\u0026 !promptVal) { showToast(\u0027사진을 올리고 스타일을 골라주세요\u0027, \u0027error\u0027); flashPromptError(); return false; }\n        if (!hasImages)  { showToast(\u0027사진을 먼저 올려주세요\u0027, \u0027error\u0027); return false; }\n        if (!promptVal)  { showToast(\u0027스타일을 고르거나 지시문을 입력하세요\u0027, \u0027warning\u0027); flashPromptError(); return false; }\n        return true;\n    }\n\n    window.__clickGradioRunBtn = function() {\n        if (!validateBeforeRun()) return;\n        syncPromptToGradio(); syncImagesToGradio(); syncLoraToGradio(); showLoader();\n        setTimeout(() =\u003e {\n            const gradioBtn = document.getElementById(\u0027gradio-run-btn\u0027);\n            if (!gradioBtn) return;\n            const btn = gradioBtn.querySelector(\u0027button\u0027);\n            if (btn) btn.click(); else gradioBtn.click();\n        }, 200);\n    };\n\n    if (runBtnEl) runBtnEl.addEventListener(\u0027click\u0027, () =\u003e window.__clickGradioRunBtn());\n\n    renderGallery();\n    updateCounts();\n}\ninit();\n}\n","queue":false,"api_name":"js_fn","api_description":null,"scroll_to_output":false,"show_progress":"full","show_progress_on":null,"batch":false,"max_batch_size":4,"cancels":[],"types":{"generator":false,"cancel":false},"collects_event_data":false,"trigger_after":null,"trigger_only_on_success":false,"trigger_only_on_failure":false,"trigger_mode":"once","api_visibility":"private","rendered_in":null,"render_id":null,"connection":"sse","time_limit":null,"stream_every":0.5,"event_specific_args":null,"component_prop_inputs":[],"js_implementation":null},{"id":1,"targets":[[0,"load"]],"inputs":[],"outputs":[],"backend_fn":false,"js":"\n() =\u003e {\nfunction watchOutputs() {\n    const resultContainer = document.getElementById(\u0027gradio-result\u0027);\n    const outBody = document.getElementById(\u0027output-image-container\u0027);\n    const outPh   = document.getElementById(\u0027output-placeholder\u0027);\n    const dlBtn   = document.getElementById(\u0027dl-btn-output\u0027);\n\n    if (!resultContainer || !outBody) { setTimeout(watchOutputs, 500); return; }\n\n    if (dlBtn) {\n        dlBtn.addEventListener(\u0027click\u0027, (e) =\u003e {\n            e.stopPropagation();\n            const img = outBody.querySelector(\u0027img.modern-out-img\u0027);\n            if (img \u0026\u0026 img.src) {\n                const a = document.createElement(\u0027a\u0027);\n                a.href = img.src; a.download = \u0027qwen_edit_output.png\u0027;\n                document.body.appendChild(a); a.click(); document.body.removeChild(a);\n            }\n        });\n    }\n\n    function syncImage() {\n        const resultImg = resultContainer.querySelector(\u0027img\u0027);\n        if (resultImg \u0026\u0026 resultImg.src) {\n            if (outPh) outPh.style.display = \u0027none\u0027;\n            let existing = outBody.querySelector(\u0027img.modern-out-img\u0027);\n            if (!existing) {\n                existing = document.createElement(\u0027img\u0027);\n                existing.className = \u0027modern-out-img\u0027;\n                outBody.appendChild(existing);\n            }\n            if (existing.src !== resultImg.src) {\n                existing.src = resultImg.src;\n                if (dlBtn) dlBtn.classList.add(\u0027visible\u0027);\n                if (window.__hideLoader) window.__hideLoader();\n            }\n        }\n    }\n    const observer = new MutationObserver(syncImage);\n    observer.observe(resultContainer, {childList:true, subtree:true, attributes:true, attributeFilter:[\u0027src\u0027]});\n    setInterval(syncImage, 800);\n}\nwatchOutputs();
75\n\nfunction watchSeed() {\n    const seedContainer = document.getElementById(\u0027gradio-seed\u0027);\n    const seedSlider    = document.getElementById(\u0027custom-seed\u0027);\n    const seedVal       = document.getElementById(\u0027custom-seed-val\u0027);\n    if (!seedContainer || !seedSlider) { setTimeout(watchSeed, 500); return; }\n    function sync() {\n        const el = seedContainer.querySelector(\u0027input[type=\"range\"],input[type=\"number\"]\u0027);\n        if (el \u0026\u0026 el.value) { seedSlider.value = el.value; if (seedVal) seedVal.textContent = el.value; }\n    }\n    const obs = new MutationObserver(sync);\n    obs.observe(seedContainer, {childList:true, subtree:true, attributes:true, attributeFilter:[\u0027value\u0027]});\n    setInterval(sync, 1000);\n}\nwatchSeed();\n\nfunction watchExampleResults() {\n    const container = document.getElementById(\u0027example-result-data\u0027);\n    if (!container) { setTimeout(watchExampleResults, 500); return; }\n    let lastProcessed = \u0027\u0027;\n\n    function checkResult() {\n        const el  = container.querySelector(\u0027textarea\u0027) || container.querySelector(\u0027input\u0027);\n        if (!el) return;\n        const val = el.value;\n        if (!val || val === lastProcessed || val.length \u003c 20) return;\n        try {\n            const data = JSON.parse(val);\n            if (data.status === \u0027ok\u0027 \u0026\u0026 data.images \u0026\u0026 data.images.length \u003e 0) {\n                lastProcessed = val;\n                if (window.__clearAll)  window.__clearAll();\n                if (window.__setPrompt \u0026\u0026 data.prompt) window.__setPrompt(data.prompt);\n                if (window.__setLora   \u0026\u0026 data.lora)   window.__setLora(data.lora);\n                data.images.forEach((b64, i) =\u003e {\n                    if (b64 \u0026\u0026 window.__addImage) {\n                        const name = (data.names \u0026\u0026 data.names[i]) ? data.names[i] : (\u0027example_\u0027+(i+1)+\u0027.jpg\u0027);\n                        window.__addImage(b64, name);\n                    }\n                });\n                document.querySelectorAll(\u0027.example-card.loading\u0027).forEach(c =\u003e c.classList.remove(\u0027loading\u0027));\n                if (window.__showToast) window.__showToast(\u0027Example loaded \\u2014 \u0027 + data.images.length + \u0027 image(s)\u0027, \u0027info\u0027);\n            } else if (data.status === \u0027error\u0027) {\n                document.querySelectorAll(\u0027.example-card.loading\u0027).forEach(c =\u003e c.classList.remove(\u0027loading\u0027));\n                if (window.__showToast) window.__showToast(\u0027불러오지 못했어요\u0027, \u0027error\u0027);\n            }\n        } catch(e) { console.error(\u0027Example parse error:\u0027, e); }\n    }\n\n    const obs = new MutationObserver(checkResult);\n    obs.observe(container, {childList:true, subtree:true, characterData:true, attributes:true});\n    setInterval(checkResult, 500);\n}\nwatchExampleResults();\n}\n","queue":false,"api_name":"js_fn_1","api_description":null,"scroll_to_output":false,"show_progress":"full","show_progress_on":null,"batch":false,"max_batch_size":4,"cancels":[],"types":{"generator":false,"cancel":false},"collects_event_data":false,"trigger_after":null,"trigger_only_on_success":false,"trigger_only_on_failure":false,"trigger_mode":"once","api_visibility":"private","rendered_in":null,"render_id":null,"connection":"sse","time_limit":null,"stream_every":0.5,"event_specific_args":null,"component_prop_inputs":[],"js_implementation":null},{"id":2,"targets":[[14,"click"]],"inputs":[1,2,3,4,5,6,7],"outputs":[8,4],"backend_fn":true,"js":"(imgs, p, la, s, rs, gs, st) =\u003e {\n            const images    = window.__uploadedImages || [];\n            const b64Array  = images.map(img =\u003e img.b64);\n            const imgsJson  = JSON.stringify(b64Array);\n            const promptEl  = document.getElementById(\u0027custom-prompt-input\u0027);\n            const loraEl    = document.getElementById(\u0027custom-lora-select\u0027);\n            const promptVal = promptEl ? promptEl.value : p;\n            const loraVal   = loraEl   ? loraEl.value   : la;\n            return [imgsJson, promptVal, loraVal, s, rs, gs, st];\n        }","queue":true,"api_name":"infer","api_description":null,"scroll_to_output":false,"show_progress":"full","show_progress_on":null,"batch":false,"max_batch_size":4,"cancels":[],"types":{"generator":false,"cancel":false},"collects_event_data":false,"trigger_after":null,"trigger_only_on_success":false,"trigger_only_on_failure":false,"trigger_mode":"once","api_visibility":"public","rendered_in":null,"render_id":null,"connection":"sse","time_limit":null,"stream_every":0.5,"event_specific_args":null,"component_prop_input
75s":[],"js_implementation":null},{"id":3,"targets":[[11,"click"]],"inputs":[9],"outputs":[10],"backend_fn":true,"js":null,"queue":false,"api_name":"load_example_data","api_description":null,"scroll_to_output":false,"show_progress":"full","show_progress_on":null,"batch":false,"max_batch_size":4,"cancels":[],"types":{"generator":false,"cancel":false},"collects_event_data":false,"trigger_after":null,"trigger_only_on_success":false,"trigger_only_on_failure":false,"trigger_mode":"once","api_visibility":"public","rendered_in":null,"render_id":null,"connection":"sse","time_limit":null,"stream_every":0.5,"event_specific_args":null,"component_prop_inputs":[],"js_implementation":null}],"layout":{"id":0,"children":[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12,"children":[]},{"id":13,"children":[]},{"id":14}]},"username":null,"deep_link_state":"none","current_page":"","root":"https://weonjeong-ai-profile.hf.space"};</script>
75<script>window.gradio_api_info = {"named_endpoints":{"/infer":{"parameters":[{"label":"parameter_1","parameter_name":"images_b64_json","parameter_has_default":true,"parameter_default":"[]","type":{"type":"string"},"python_type":{"type":"str","description":""},"component":"Textbox","example_input":"Hello!!"},{"label":"parameter_2","parameter_name":"prompt","parameter_has_default":true,"parameter_default":"","type":{"type":"string"},"python_type":{"type":"str","description":""},"component":"Textbox","example_input":"Hello!!"},{"label":"parameter_3","parameter_name":"lora_adapter","parameter_has_default":true,"parameter_default":"Hyper-Realistic-Portrait","type":{"type":"string","enum":["Multiple-Angles","Photo-to-Anime","Anime-V2","Light-Migration","Upscaler","Style-Transfer","Manga-Tone","Anything2Real","Fal-Multiple-Angles","Polaroid-Photo","Unblur-Anything","Midnight-Noir-Eyes-Spotlight","Hyper-Realistic-Portrait","Ultra-Realistic-Portrait","Pixar-Inspired-3D","Noir-Comic-Book","Any-light","Studio-DeLight","Cinematic-FlatLog"]},"python_type":{"type":"Literal[\u0027Multiple-Angles\u0027, \u0027Photo-to-Anime\u0027, \u0027Anime-V2\u0027, \u0027Light-Migration\u0027, \u0027Upscaler\u0027, \u0027Style-Transfer\u0027, \u0027Manga-Tone\u0027, \u0027Anything2Real\u0027, \u0027Fal-Multiple-Angles\u0027, \u0027Polaroid-Photo\u0027, \u0027Unblur-Anything\u0027, \u0027Midnight-Noir-Eyes-Spotlight\u0027, \u0027Hyper-Realistic-Portrait\u0027, \u0027Ultra-Realistic-Portrait\u0027, \u0027Pixar-Inspired-3D\u0027, \u0027Noir-Comic-Book\u0027, \u0027Any-light\u0027, \u0027Studio-DeLight\u0027, \u0027Cinematic-FlatLog\u0027]","description":""},"component":"Dropdown","example_input":"Multiple-Angles"},{"label":"parameter_4","parameter_name":"seed","parameter_has_default":true,"parameter_default":0,"type":{"type":"number","description":"numeric value between 0 and 2147483647"},"python_type":{"type":"float","description":""},"component":"Slider","example_input":0},{"label":"parameter_5","parameter_name":"randomize_seed","parameter_has_default":true,"parameter_default":true,"type":{"type":"boolean"},"python_type":{"type":"bool","description":""},"component":"Checkbox","example_input":true},{"label":"parameter_6","parameter_name":"guidance_scale","parameter_has_default":true,"parameter_default":1.0,"type":{"type":"number","description":"numeric value between 1.0 and 10.0"},"python_type":{"type":"float","description":""},"component":"Slider","example_input":1.0},{"label":"parameter_7","parameter_name":"steps","parameter_has_default":true,"parameter_default":4,"type":{"type":"number","description":"numeric value between 1 and 50"},"python_type":{"type":"float","description":""},"component":"Slider","example_input":1}],"returns":[{"label":"value_8","type":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Path to a local file","title":"Path"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Publicly available url or base64 encoded image","title":"Url"},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Size of image in bytes","title":"Size"},"orig_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Original filename","title":"Orig Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"mime type of image","title":"Mime Type"},"is_stream":{"default":false,"description":"Can always be set to False","title":"Is Stream","type":"boolean"},"meta":{"additionalProperties":true,"default":{"_type":"gradio.FileData"},"title":"Meta","type":"object"}},"title":"ImageData","type":"object","additional_description":"A local filepath or publicly available URL."},"python_type":{"type":"filepath","description":""},"component":"Image"},{"label":"value_4","type":{"type":"number","description":"numeric value between 0 and 2147483647"},"python_type":{"type":"float","description":"numeric value between 0 and 2147483647"},"component":"Slider"}],"api_visibility":"public","description":"","code_snippets":{"python":"from gradio_client import Client\n\nclient = Client(\"WeonJeong/ai-profile\")\nresult = client.predict(\n\timages_b64_json=\"[]\",\n\tprompt=\"\",\n\tlora_adapter=\"Hyper-Realistic-Portrait\",\n\tseed=0,\n\trandomize_seed=True,\n\tguidance_scale=1.0,\n\tsteps=4,\n\tapi_name=\"/infer\",\n)\nprint(result)","javascript":"import { Client } from \"@gradio/client\";\n\nconst client = await Client.connect(\"WeonJeong/ai-profile\");\nconst result = await client.predict(\"/infer\", {\n\t\timages_b64_json: \"[]\",\n\t\tprompt: \"\",\n\t\tlora_adapter: \"Hyper-Realistic-Portrait\",\n\t\tseed: 0,\n\t\trandomize_seed: true,\n\t\tguid
75ance_scale: 1.0,\n\t\tsteps: 4,\n});\n\nconsole.log(result.data);","bash":"curl -X POST http://localhost:7860/gradio_api/call/v2/infer -s -H \"Content-Type: application/json\" \\\n  -d \u0027{\"images_b64_json\": \"[]\", \"prompt\": \"\", \"lora_adapter\": \"Hyper-Realistic-Portrait\", \"seed\": 0, \"randomize_seed\": true, \"guidance_scale\": 1.0, \"steps\": 4}\u0027 \\\n  | awk -F\u0027\"\u0027 \u0027{ print $4}\u0027 \\\n  | read EVENT_ID; curl -N http://localhost:7860/gradio_api/call/infer/$EVENT_ID","cli":"{command} predict WeonJeong/ai-profile /infer \u0027{\n  \"images_b64_json\": \"[]\",\n  \"prompt\": \"Hello!!\",\n  \"lora_adapter\": \"Hyper-Realistic-Portrait\",\n  \"seed\": 0,\n  \"randomize_seed\": true,\n  \"guidance_scale\": 1.0,\n  \"steps\": 4\n}\u0027\n"}},"/load_example_data":{"parameters":[{"label":"parameter_9","parameter_name":"idx_str","parameter_has_default":true,"parameter_default":"","type":{"type":"string"},"python_type":{"type":"str","description":""},"component":"Textbox","example_input":"Hello!!"}],"returns":[{"label":"value_10","type":{"type":"string"},"python_type":{"type":"str","description":""},"component":"Textbox"}],"api_visibility":"public","description":"","code_snippets":{"python":"from gradio_client import Client\n\nclient = Client(\"WeonJeong/ai-profile\")\nresult = client.predict(\n\tidx_str=\"\",\n\tapi_name=\"/load_example_data\",\n)\nprint(result)","javascript":"import { Client } from \"@gradio/client\";\n\nconst client = await Client.connect(\"WeonJeong/ai-profile\");\nconst result = await client.predict(\"/load_example_data\", {\n\t\tidx_str: \"\",\n});\n\nconsole.log(result.data);","bash":"curl -X POST http://localhost:7860/gradio_api/call/v2/load_example_data -s -H \"Content-Type: application/json\" \\\n  -d \u0027{\"idx_str\": \"\"}\u0027 \\\n  | awk -F\u0027\"\u0027 \u0027{ print $4}\u0027 \\\n  | read EVENT_ID; curl -N http://localhost:7860/gradio_api/call/load_example_data/$EVENT_ID","cli":"{command} predict WeonJeong/ai-profile /load_example_data \u0027{\n  \"idx_str\": \"Hello!!\"\n}\u0027\n"}}},"unnamed_endpoints":{}};</script>
75
76
77		
77<script
78			src="https://weonjeong-ai-profile.hf.space/static/js/iframeResizer.contentWindow.min.js"
79			async
80		></script>
80
81		
81<script data-gradio-mode>
82			window.__gradio_mode__ = "app";
83			window.iFrameResizer = {
84				autoResize: false,
85				sizeWidth: false
86			};
87			window.parent?.postMessage(
88				{ type: "SET_SCROLLING", enabled: false },
89				"*"
90			);
91		</script>
91
92		<link rel="manifest" href="/manifest.json" />
93		
93<script type="module" crossorigin src="./assets/index-CTFdGFMX.js"></script>
93
94		<link rel="stylesheet" crossorigin href="./assets/index-BMxruX6a.css">
95	</head>
96
97	<body
98		style="
99			width: 100%;
100			margin: 0;
101			padding: 0;
102			display: flex;
103			flex-direction: column;
104			flex-grow: 1;
105		"
106	>
107		<gradio-app
108			control_page_title="true"
109			embed="false"
110			eager="true"
111			style="display: flex; flex-direction: column; flex-grow: 1"
112		>
113		</gradio-app>
114		
114<script>
115			const ce = document.getElementsByTagName("gradio-app");
116
117			if (ce[0]) {
118				ce[0].addEventListener("domchange", () => {
119					document.body.style.padding = "0";
120				});
121				document.body.style.padding = "0";
122			}
123		</script>
123
124	</body>
125</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.