diff --git a/artifacts/fb-publisher/.replit-artifact/artifact.toml b/artifacts/fb-publisher/.replit-artifact/artifact.toml new file mode 100644 index 0000000000000000000000000000000000000000..b2d35b599053735f7d13493b11eaf1a18ec41fcf --- /dev/null +++ b/artifacts/fb-publisher/.replit-artifact/artifact.toml @@ -0,0 +1,23 @@ +kind = "web" + previewPath = "/__dev-fb" + title = "FB Publisher (Dev Only)" + version = "1.0.0" + id = "artifacts/fb-publisher" + router = "path" + + [[integratedSkills]] + name = "react-vite" + version = "1.0.0" + + [[services]] + name = "web" + paths = [] + localPort = 18305 + + [services.development] + run = "pnpm --filter @workspace/fb-publisher run dev" + + [services.env] + PORT = "18305" + BASE_PATH = "/" + \ No newline at end of file diff --git a/artifacts/fb-publisher/components.json b/artifacts/fb-publisher/components.json new file mode 100644 index 0000000000000000000000000000000000000000..3ff62cf0842657da595682900f6aa27592c67b4c --- /dev/null +++ b/artifacts/fb-publisher/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/artifacts/fb-publisher/dist/public/assets/index-CBpzG2YA.css b/artifacts/fb-publisher/dist/public/assets/index-CBpzG2YA.css new file mode 100644 index 0000000000000000000000000000000000000000..93dcdb7ed10714073ac343856242517822b23472 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/assets/index-CBpzG2YA.css @@ -0,0 +1 @@ +@layer properties;@layer theme,base,clerk,components,utilities;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: "Tajawal", "Inter", system-ui, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50: oklch(97.1% .013 17.38);--color-red-300: oklch(80.8% .114 19.571);--color-red-400: oklch(70.4% .191 22.216);--color-red-500: oklch(63.7% .237 25.331);--color-red-600: oklch(57.7% .245 27.325);--color-red-700: oklch(50.5% .213 27.518);--color-red-800: oklch(44.4% .177 26.899);--color-red-900: oklch(39.6% .141 25.723);--color-red-950: oklch(25.8% .092 26.042);--color-orange-400: oklch(75% .183 55.934);--color-orange-700: oklch(55.3% .195 38.402);--color-orange-900: oklch(40.8% .123 38.172);--color-yellow-300: oklch(90.5% .182 98.111);--color-yellow-400: oklch(85.2% .199 91.936);--color-yellow-500: oklch(79.5% .184 86.047);--color-yellow-700: oklch(55.4% .135 66.442);--color-yellow-900: oklch(42.1% .095 57.708);--color-green-300: oklch(87.1% .15 154.449);--color-green-400: oklch(79.2% .209 151.711);--color-green-500: oklch(72.3% .219 149.579);--color-green-700: oklch(52.7% .154 150.069);--color-green-800: oklch(44.8% .119 151.328);--color-green-900: oklch(39.3% .095 152.535);--color-blue-400: oklch(70.7% .165 254.624);--color-blue-700: oklch(48.8% .243 264.376);--color-blue-900: oklch(37.9% .146 265.522);--color-purple-500: oklch(62.7% .265 303.9);--color-gray-50: oklch(98.5% .002 247.839);--color-gray-200: oklch(92.8% .006 264.531);--color-gray-300: oklch(87.2% .01 258.338);--color-gray-400: oklch(70.7% .022 261.325);--color-gray-500: oklch(55.1% .027 264.364);--color-gray-600: oklch(44.6% .03 256.802);--color-gray-700: oklch(37.3% .034 259.733);--color-gray-800: oklch(27.8% .033 256.848);--color-gray-900: oklch(21% .034 264.665);--color-black: #000;--color-white: #fff;--spacing: .25rem;--container-sm: 24rem;--container-md: 28rem;--container-lg: 32rem;--container-3xl: 48rem;--container-4xl: 56rem;--container-5xl: 64rem;--container-6xl: 72rem;--container-7xl: 80rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-base--line-height: 1.5 ;--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--text-xl: 1.25rem;--text-xl--line-height: calc(1.75 / 1.25);--text-2xl: 1.5rem;--text-2xl--line-height: calc(2 / 1.5);--text-3xl: 1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl: 2.25rem;--text-4xl--line-height: calc(2.5 / 2.25);--text-5xl: 3rem;--text-5xl--line-height: 1;--text-6xl: 3.75rem;--text-6xl--line-height: 1;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--font-weight-extrabold: 800;--tracking-tight: -.025em;--tracking-widest: .1em;--leading-tight: 1.25;--leading-snug: 1.375;--leading-normal: 1.5;--leading-relaxed: 1.625;--radius-2xl: 1rem;--radius-3xl: 1.5rem;--ease-in-out: cubic-bezier(.4, 0, .2, 1);--animate-spin: spin 1s linear infinite;--animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce: bounce 1s infinite;--blur-sm: 8px;--aspect-video: 16 / 9;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: "Tajawal", "Inter", system-ui, sans-serif;--default-mono-font-family: var(--font-mono);--radius: 12px;--color-border: hsl(var(--border))}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:currentcolor}@supports (color: color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.\@container\/field-group{container-type:inline-size;container-name:field-group}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3\.5{top:calc(var(--spacing) * 3.5)}.top-4{top:calc(var(--spacing) * 4)}.top-\[1px\]{top:1px}.top-\[50\%\]{top:50%}.top-\[60\%\]{top:60%}.top-full{top:100%}.-right-12{right:calc(var(--spacing) * -12)}.right-0{right:calc(var(--spacing) * 0)}.right-1{right:calc(var(--spacing) * 1)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.-bottom-12{bottom:calc(var(--spacing) * -12)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-12{left:calc(var(--spacing) * -12)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.order-first{order:-9999}.order-last{order:9999}.\!m-0{margin:calc(var(--spacing) * 0)!important}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.my-0{margin-block:calc(var(--spacing) * 0)}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:calc(var(--spacing) * 1)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-4{margin-top:calc(var(--spacing) * -4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-4{margin-left:calc(var(--spacing) * -4)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-\[--cell-size\]{width:--cell-size;height:--cell-size}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-20{height:calc(var(--spacing) * 20)}.h-\[--cell-size\]{height:--cell-size}.h-\[1px\]{height:1px}.h-\[var\(--radix-navigation-menu-viewport-height\)\]{height:var(--radix-navigation-menu-viewport-height)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[--radix-context-menu-content-available-height\]{max-height:--radix-context-menu-content-available-height}.max-h-\[--radix-select-content-available-height\]{max-height:--radix-select-content-available-height}.max-h-\[300px\]{max-height:300px}.max-h-\[420px\]{max-height:420px}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[60px\]{min-height:60px}.min-h-\[100dvh\]{min-height:100dvh}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-14{width:calc(var(--spacing) * 14)}.w-24{width:calc(var(--spacing) * 24)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[--cell-size\]{width:--cell-size}.w-\[1px\]{width:1px}.w-\[100px\]{width:100px}.w-\[440px\]{width:440px}.w-\[var\(--sidebar-width\)\]{width:var(--sidebar-width)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[var\(--skeleton-width\)\]{max-width:var(--skeleton-width)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-10{min-width:calc(var(--spacing) * 10)}.min-w-\[--cell-size\]{min-width:--cell-size}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[140px\]{min-width:140px}.min-w-\[150px\]{min-width:150px}.min-w-\[200px\]{min-width:200px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-full{flex-basis:100%}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.origin-\[--radix-context-menu-content-transform-origin\]{transform-origin:--radix-context-menu-content-transform-origin}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:--radix-dropdown-menu-content-transform-origin}.origin-\[--radix-hover-card-content-transform-origin\]{transform-origin:--radix-hover-card-content-transform-origin}.origin-\[--radix-menubar-content-transform-origin\]{transform-origin:--radix-menubar-content-transform-origin}.origin-\[--radix-popover-content-transform-origin\]{transform-origin:--radix-popover-content-transform-origin}.origin-\[--radix-select-content-transform-origin\]{transform-origin:--radix-select-content-transform-origin}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:--radix-tooltip-content-transform-origin}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x: -1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x: -50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x: 1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y: -50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-caret-blink{animation:caret-blink 1.25s ease-out infinite}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-none{touch-action:none}.resize-none{resize:none}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-7{gap:calc(var(--spacing) * 7)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-16{gap:calc(var(--spacing) * 16)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse: 0;margin-inline-start:calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse: 0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.self-stretch{align-self:stretch}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.\!rounded-none{border-radius:0!important}.rounded{border-radius:12px}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[calc\(var\(--radius\)-5px\)\]{border-radius:calc(var(--radius) - 5px)}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-l-md{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.rounded-tl-sm{border-top-left-radius:calc(var(--radius) - 4px)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0px!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-\[3px\]{border-style:var(--tw-border-style);border-width:3px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style: dashed;border-style:dashed}.border-none{--tw-border-style: none;border-style:none}.\[border-color\:var\(--badge-outline\)\]{border-color:var(--badge-outline)}.\[border-color\:var\(--button-outline\)\]{border-color:var(--button-outline)}.border-\[\#2a2a45\]{border-color:#2a2a45}.border-\[\#3a3a55\]{border-color:#3a3a55}.border-\[\#3a3a55\]\/40{border-color:color-mix(in oklab,#3a3a55 40%,transparent)}.border-\[\#bb86fc\]{border-color:#bb86fc}.border-\[\#bb86fc\]\/20{border-color:color-mix(in oklab,#bb86fc 20%,transparent)}.border-\[\#bb86fc\]\/30{border-color:color-mix(in oklab,#bb86fc 30%,transparent)}.border-\[--color-border\]{border-color:--color-border}.border-blue-700{border-color:var(--color-blue-700)}.border-border{border-color:hsl(var(--border))}.border-border\/50{border-color:hsl(var(--border))}@supports (color: color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive))}@supports (color: color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,hsl(var(--destructive)) 50%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-green-700{border-color:var(--color-green-700)}.border-green-800{border-color:var(--color-green-800)}.border-input{border-color:hsl(var(--input))}.border-orange-700{border-color:var(--color-orange-700)}.border-primary{border-color:hsl(var(--primary))}.border-primary\/50{border-color:hsl(var(--primary))}@supports (color: color-mix(in lab,red,red)){.border-primary\/50{border-color:color-mix(in oklab,hsl(var(--primary)) 50%,transparent)}}.border-purple-500\/30{border-color:color-mix(in srgb,oklch(62.7% .265 303.9) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-red-500\/30{border-color:color-mix(in srgb,oklch(63.7% .237 25.331) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-700{border-color:var(--color-red-700)}.border-red-800{border-color:var(--color-red-800)}.border-sidebar-border{border-color:hsl(var(--sidebar-border))}.border-transparent{border-color:transparent}.border-white\/10{border-color:color-mix(in srgb,#fff 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-yellow-500\/30{border-color:color-mix(in srgb,oklch(79.5% .184 86.047) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-yellow-500\/40{border-color:color-mix(in srgb,oklch(79.5% .184 86.047) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-yellow-500\/40{border-color:color-mix(in oklab,var(--color-yellow-500) 40%,transparent)}}.border-yellow-700{border-color:var(--color-yellow-700)}.border-t-\[\#bb86fc\]{border-top-color:#bb86fc}.border-t-transparent{border-top-color:transparent}.border-l-transparent{border-left-color:transparent}.\!bg-transparent{background-color:transparent!important}.bg-\[\#0f0f1e\]{background-color:#0f0f1e}.bg-\[\#1a1a30\]{background-color:#1a1a30}.bg-\[\#1f1f3a\]{background-color:#1f1f3a}.bg-\[\#1f1f3a\]\/40{background-color:color-mix(in oklab,#1f1f3a 40%,transparent)}.bg-\[\#3a3a55\]{background-color:#3a3a55}.bg-\[\#16162a\]{background-color:#16162a}.bg-\[\#16162a\]\/90{background-color:color-mix(in oklab,#16162a 90%,transparent)}.bg-\[\#bb86fc\]{background-color:#bb86fc}.bg-\[\#bb86fc\]\/10{background-color:color-mix(in oklab,#bb86fc 10%,transparent)}.bg-\[\#bb86fc\]\/20{background-color:color-mix(in oklab,#bb86fc 20%,transparent)}.bg-\[--color-bg\]{background-color:--color-bg}.bg-accent{background-color:hsl(var(--accent))}.bg-background{background-color:hsl(var(--background))}.bg-black\/70{background-color:color-mix(in srgb,#000 70%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-black\/80{background-color:color-mix(in srgb,#000 80%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-foreground{background-color:hsl(var(--foreground))}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-800\/60{background-color:color-mix(in srgb,oklch(27.8% .033 256.848) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-gray-800\/60{background-color:color-mix(in oklab,var(--color-gray-800) 60%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:color-mix(in srgb,oklch(72.3% .219 149.579) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500) 20%,transparent)}}.bg-green-900\/40{background-color:color-mix(in srgb,oklch(39.3% .095 152.535) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-green-900\/40{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.bg-input{background-color:hsl(var(--input))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color: color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}.bg-orange-900\/40{background-color:color-mix(in srgb,oklch(40.8% .123 38.172) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-orange-900\/40{background-color:color-mix(in oklab,var(--color-orange-900) 40%,transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color: color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.bg-primary\/20{background-color:hsl(var(--primary))}@supports (color: color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,hsl(var(--primary)) 20%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:color-mix(in srgb,oklch(63.7% .237 25.331) 10%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.bg-red-500\/20{background-color:color-mix(in srgb,oklch(63.7% .237 25.331) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.bg-red-500\/90{background-color:color-mix(in srgb,oklch(63.7% .237 25.331) 90%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-500\/90{background-color:color-mix(in oklab,var(--color-red-500) 90%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-red-700{background-color:var(--color-red-700)}.bg-red-900\/30{background-color:color-mix(in srgb,oklch(39.6% .141 25.723) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.bg-red-950\/20{background-color:color-mix(in srgb,oklch(25.8% .092 26.042) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-950\/20{background-color:color-mix(in oklab,var(--color-red-950) 20%,transparent)}}.bg-red-950\/40{background-color:color-mix(in srgb,oklch(25.8% .092 26.042) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-red-950\/40{background-color:color-mix(in oklab,var(--color-red-950) 40%,transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sidebar{background-color:hsl(var(--sidebar))}.bg-sidebar-border{background-color:hsl(var(--sidebar-border))}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-500{background-color:var(--color-yellow-500)}.fill-current{fill:currentcolor}.fill-primary{fill:hsl(var(--primary))}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[1px\]{padding:1px}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-\[--cell-size\]{padding-inline:--cell-size}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Tajawal,Inter,system-ui,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading, var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading, var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading, var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading, var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-sm\/relaxed{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading, var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading: 1;line-height:1}.leading-normal{--tw-leading: var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading: var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading: var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading: var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight: var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight: var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight: var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking: var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-widest{--tw-tracking: var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.text-\[\#0d0d18\]{color:#0d0d18}.text-\[\#bb86fc\]{color:#bb86fc}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-black{color:var(--color-black)}.text-blue-400{color:var(--color-blue-400)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentcolor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/50{color:hsl(var(--foreground))}@supports (color: color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,hsl(var(--foreground)) 50%,transparent)}}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-900{color:var(--color-gray-900)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-400{color:var(--color-orange-400)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sidebar-foreground{color:hsl(var(--sidebar-foreground))}.text-sidebar-foreground\/70{color:hsl(var(--sidebar-foreground))}@supports (color: color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,hsl(var(--sidebar-foreground)) 70%,transparent)}}.text-white{color:var(--color-white)}.text-white\/80{color:color-mix(in srgb,#fff 80%,transparent)}@supports (color: color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.accent-\[\#bb86fc\]{accent-color:#bb86fc}.opacity-0{opacity:0%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-70{opacity:70%}.opacity-75{opacity:75%}.opacity-90{opacity:90%}.\!shadow-none{--tw-shadow: 0 0 #0000 !important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / .25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / .05));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-ring{--tw-ring-color: hsl(var(--ring))}.ring-sidebar-ring{--tw-ring-color: hsl(var(--sidebar-ring))}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.outline-hidden{--tw-outline-style: none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline:2px solid transparent;outline-offset:2px}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-offset-2{outline-offset:2px}.outline-transparent{outline-color:transparent}.backdrop-blur-sm{--tw-backdrop-blur: blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.duration-100{--tw-duration: .1s;transition-duration:.1s}.duration-200{--tw-duration: .2s;transition-duration:.2s}.duration-300{--tw-duration: .3s;transition-duration:.3s}.duration-1000{--tw-duration: 1s;transition-duration:1s}.ease-in-out{--tw-ease: var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease: linear;transition-timing-function:linear}.fade-in-0{--tw-enter-opacity: 0 ;--tw-enter-opacity: 0}.outline-none{--tw-outline-style: none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale: 95% ;--tw-enter-scale: .95}.\[--cell-size\:2rem\]{--cell-size: 2rem}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:100%}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:100%}}@media(hover:hover){.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:100%}}.group-has-data-\[sidebar\=menu-action\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has(*[data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-has-\[\[data-orientation\=horizontal\]\]\/field\:text-balance:is(:where(.group\/field):has(*:is([data-orientation=horizontal])) *){text-wrap:balance}.group-has-\[\[data-slot\=item-description\]\]\/item\:translate-y-0\.5:is(:where(.group\/item):has(*:is([data-slot=item-description])) *){--tw-translate-y: calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-has-\[\[data-slot\=item-description\]\]\/item\:self-start:is(:where(.group\/item):has(*:is([data-slot=item-description])) *){align-self:flex-start}.group-has-\[\>input\]\/input-group\:pt-2\.5:is(:where(.group\/input-group):has(>input) *){padding-top:calc(var(--spacing) * 2.5)}.group-has-\[\>input\]\/input-group\:pb-2\.5:is(:where(.group\/input-group):has(>input) *){padding-bottom:calc(var(--spacing) * 2.5)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:h-8\!:is(:where(.group)[data-collapsible=icon] *){height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-8\!:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+var\(--spacing-4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + var(--spacing-4))}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)\+var\(--spacing-4\)\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + var(--spacing-4) + 2px)}.group-data-\[collapsible\=icon\]\:w-\[var\(--sidebar-width-icon\)\]:is(:where(.group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:p-0\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 0)!important}.group-data-\[collapsible\=icon\]\:p-2\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0%}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:calc(var(--spacing) * 0)}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x: calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[disabled\=true\]\/field\:opacity-50:is(:where(.group\/field)[data-disabled=true] *){opacity:50%}.group-data-\[disabled\=true\]\/input-group\:opacity-50:is(:where(.group\/input-group)[data-disabled=true] *){opacity:50%}.group-data-\[focused\=true\]\/day\:relative:is(:where(.group\/day)[data-focused=true] *){position:relative}.group-data-\[focused\=true\]\/day\:z-10:is(:where(.group\/day)[data-focused=true] *){z-index:10}.group-data-\[focused\=true\]\/day\:border-ring:is(:where(.group\/day)[data-focused=true] *){border-color:hsl(var(--ring))}.group-data-\[focused\=true\]\/day\:ring-\[3px\]:is(:where(.group\/day)[data-focused=true] *){--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color: hsl(var(--ring))}@supports (color: color-mix(in lab,red,red)){.group-data-\[focused\=true\]\/day\:ring-ring\/50:is(:where(.group\/day)[data-focused=true] *){--tw-ring-color: color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:calc(var(--spacing) * 0)}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[state\=open\]\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:hsl(var(--sidebar-border))}.group-data-\[variant\=floating\]\:shadow-sm:is(:where(.group)[data-variant=floating] *){--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[variant\=outline\]\/field-group\:-mb-2:is(:where(.group\/field-group)[data-variant=outline] *){margin-bottom:calc(var(--spacing) * -2)}.group-\[\.destructive\]\:border-muted\/40:is(:where(.group):is(.destructive) *){border-color:hsl(var(--muted))}@supports (color: color-mix(in lab,red,red)){.group-\[\.destructive\]\:border-muted\/40:is(:where(.group):is(.destructive) *){border-color:color-mix(in oklab,hsl(var(--muted)) 40%,transparent)}}.group-\[\.destructive\]\:text-red-300:is(:where(.group):is(.destructive) *){color:var(--color-red-300)}.group-\[\.toast\]\:bg-muted:is(:where(.group):is(.toast) *){background-color:hsl(var(--muted))}.group-\[\.toast\]\:bg-primary:is(:where(.group):is(.toast) *){background-color:hsl(var(--primary))}.group-\[\.toast\]\:text-muted-foreground:is(:where(.group):is(.toast) *){color:hsl(var(--muted-foreground))}.group-\[\.toast\]\:text-primary-foreground:is(:where(.group):is(.toast) *){color:hsl(var(--primary-foreground))}.group-\[\.toaster\]\:border-border:is(:where(.group):is(.toaster) *){border-color:hsl(var(--border))}.group-\[\.toaster\]\:bg-background:is(:where(.group):is(.toaster) *){background-color:hsl(var(--background))}.group-\[\.toaster\]\:text-foreground:is(:where(.group):is(.toaster) *){color:hsl(var(--foreground))}.group-\[\.toaster\]\:shadow-lg:is(:where(.group):is(.toaster) *){--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media(hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:hsl(var(--sidebar-accent-foreground))}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:70%}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:hsl(var(--sidebar-accent-foreground))}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing) * 1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing) * 2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:calc(var(--spacing) * 1)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}.placeholder\:text-gray-600::placeholder{color:var(--color-gray-600)}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing) * 0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:calc(var(--spacing) * 1)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:rounded-l-md:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.first\:border-l:first-child{border-left-style:var(--tw-border-style);border-left-width:1px}.last\:mt-0:last-child{margin-top:calc(var(--spacing) * 0)}.last\:rounded-r-md:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x: 105%;--tw-scale-y: 105%;--tw-scale-z: 105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@media(hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}}@media(hover:hover){.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}}@media(hover:hover){.hover\:bg-\[\#1a1a30\]:hover{background-color:#1a1a30}}@media(hover:hover){.hover\:bg-\[\#2a2a4a\]:hover{background-color:#2a2a4a}}@media(hover:hover){.hover\:bg-\[\#2a2a4a\]\/60:hover{background-color:color-mix(in oklab,#2a2a4a 60%,transparent)}}@media(hover:hover){.hover\:bg-\[\#a070e0\]:hover{background-color:#a070e0}}@media(hover:hover){.hover\:bg-accent:hover{background-color:hsl(var(--accent))}}@media(hover:hover){.hover\:bg-blue-900\/20:hover{background-color:color-mix(in srgb,oklch(37.9% .146 265.522) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-blue-900\/20:hover{background-color:color-mix(in oklab,var(--color-blue-900) 20%,transparent)}}}@media(hover:hover){.hover\:bg-green-900\/20:hover{background-color:color-mix(in srgb,oklch(39.3% .095 152.535) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-green-900\/20:hover{background-color:color-mix(in oklab,var(--color-green-900) 20%,transparent)}}}@media(hover:hover){.hover\:bg-muted:hover{background-color:hsl(var(--muted))}}@media(hover:hover){.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted))}@supports (color: color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,hsl(var(--muted)) 50%,transparent)}}}@media(hover:hover){.hover\:bg-orange-900\/20:hover{background-color:color-mix(in srgb,oklch(40.8% .123 38.172) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-orange-900\/20:hover{background-color:color-mix(in oklab,var(--color-orange-900) 20%,transparent)}}}@media(hover:hover){.hover\:bg-red-700:hover{background-color:var(--color-red-700)}}@media(hover:hover){.hover\:bg-red-800:hover{background-color:var(--color-red-800)}}@media(hover:hover){.hover\:bg-red-900\/20:hover{background-color:color-mix(in srgb,oklch(39.6% .141 25.723) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-red-900\/20:hover{background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}}@media(hover:hover){.hover\:bg-secondary:hover{background-color:hsl(var(--secondary))}}@media(hover:hover){.hover\:bg-sidebar-accent:hover{background-color:hsl(var(--sidebar-accent))}}@media(hover:hover){.hover\:bg-yellow-900\/20:hover{background-color:color-mix(in srgb,oklch(42.1% .095 57.708) 20%,transparent)}@supports (color: color-mix(in lab,red,red)){.hover\:bg-yellow-900\/20:hover{background-color:color-mix(in oklab,var(--color-yellow-900) 20%,transparent)}}}@media(hover:hover){.hover\:text-\[\#d4b3ff\]:hover{color:#d4b3ff}}@media(hover:hover){.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}}@media(hover:hover){.hover\:text-foreground:hover{color:hsl(var(--foreground))}}@media(hover:hover){.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}}@media(hover:hover){.hover\:text-red-300:hover{color:var(--color-red-300)}}@media(hover:hover){.hover\:text-sidebar-accent-foreground:hover{color:hsl(var(--sidebar-accent-foreground))}}@media(hover:hover){.hover\:text-white:hover{color:var(--color-white)}}@media(hover:hover){.hover\:underline:hover{text-decoration-line:underline}}@media(hover:hover){.hover\:opacity-100:hover{opacity:100%}}@media(hover:hover){.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow: 0 0 0 1px var(--tw-shadow-color, hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media(hover:hover){.hover\:group-data-\[collapsible\=offcanvas\]\:bg-sidebar:hover:is(:where(.group)[data-collapsible=offcanvas] *){background-color:hsl(var(--sidebar))}}@media(hover:hover){.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group):is(.destructive) *):hover{border-color:hsl(var(--destructive))}@supports (color: color-mix(in lab,red,red)){.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group):is(.destructive) *):hover{border-color:color-mix(in oklab,hsl(var(--destructive)) 30%,transparent)}}}@media(hover:hover){.group-\[\.destructive\]\:hover\:bg-destructive:is(:where(.group):is(.destructive) *):hover{background-color:hsl(var(--destructive))}}@media(hover:hover){.group-\[\.destructive\]\:hover\:text-destructive-foreground:is(:where(.group):is(.destructive) *):hover{color:hsl(var(--destructive-foreground))}}@media(hover:hover){.group-\[\.destructive\]\:hover\:text-red-50:is(:where(.group):is(.destructive) *):hover{color:var(--color-red-50)}}@media(hover:hover){.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:hsl(var(--sidebar-border))}}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:opacity-100:focus{opacity:100%}.focus\:ring-1:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style: none;outline-style:none}.group-\[\.destructive\]\:focus\:ring-destructive:is(:where(.group):is(.destructive) *):focus{--tw-ring-color: hsl(var(--destructive))}.group-\[\.destructive\]\:focus\:ring-red-400:is(:where(.group):is(.destructive) *):focus{--tw-ring-color: var(--color-red-400)}.group-\[\.destructive\]\:focus\:ring-offset-red-600:is(:where(.group):is(.destructive) *):focus{--tw-ring-offset-color: var(--color-red-600)}.focus-visible\:border-ring:focus-visible{border-color:hsl(var(--ring))}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color: hsl(var(--ring))}@supports (color: color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color: color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width: 1px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px;--tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.focus-visible\:outline-none:focus-visible{--tw-outline-style: none;outline-style:none}.active\:scale-95:active{--tw-scale-x: 95%;--tw-scale-y: 95%;--tw-scale-z: 95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:bg-sidebar-accent:active{background-color:hsl(var(--sidebar-accent))}.active\:text-sidebar-accent-foreground:active{color:hsl(var(--sidebar-accent-foreground))}.active\:shadow-none:active{--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:50%}:where(*[data-side=left]) .in-data-\[side\=left\]\:cursor-w-resize{cursor:w-resize}:where(*[data-side=right]) .in-data-\[side\=right\]\:cursor-e-resize{cursor:e-resize}.has-focus\:border-ring:has(*:focus){border-color:hsl(var(--ring))}.has-focus\:ring-\[3px\]:has(*:focus){--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-focus\:ring-ring\/50:has(*:focus){--tw-ring-color: hsl(var(--ring))}@supports (color: color-mix(in lab,red,red)){.has-focus\:ring-ring\/50:has(*:focus){--tw-ring-color: color-mix(in oklab, hsl(var(--ring)) 50%, transparent)}}.has-data-\[state\=checked\]\:border-primary:has(*[data-state=checked]){border-color:hsl(var(--primary))}.has-data-\[state\=checked\]\:bg-primary\/5:has(*[data-state=checked]){background-color:hsl(var(--primary))}@supports (color: color-mix(in lab,red,red)){.has-data-\[state\=checked\]\:bg-primary\/5:has(*[data-state=checked]){background-color:color-mix(in oklab,hsl(var(--primary)) 5%,transparent)}}.has-data-\[variant\=inset\]\:bg-sidebar:has(*[data-variant=inset]){background-color:hsl(var(--sidebar))}.has-\[\:disabled\]\:opacity-50:has(*:is(:disabled)){opacity:50%}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-1:has(*:is([data-slot=input-group-control]:focus-visible)){--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring:has(*:is([data-slot=input-group-control]:focus-visible)){--tw-ring-color: hsl(var(--ring))}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:border-destructive:has(*:is([data-slot][aria-invalid=true])){border-color:hsl(var(--destructive))}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: hsl(var(--destructive))}@supports (color: color-mix(in lab,red,red)){.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: color-mix(in oklab, hsl(var(--destructive)) 20%, transparent)}}.has-\[\>\[data-align\=block-end\]\]\:h-auto:has(>[data-align=block-end]){height:auto}.has-\[\>\[data-align\=block-end\]\]\:flex-col:has(>[data-align=block-end]){flex-direction:column}.has-\[\>\[data-align\=block-start\]\]\:h-auto:has(>[data-align=block-start]){height:auto}.has-\[\>\[data-align\=block-start\]\]\:flex-col:has(>[data-align=block-start]){flex-direction:column}.has-\[\>\[data-slot\=button-group\]\]\:gap-2:has(>[data-slot=button-group]){gap:calc(var(--spacing) * 2)}.has-\[\>\[data-slot\=checkbox-group\]\]\:gap-3:has(>[data-slot=checkbox-group]){gap:calc(var(--spacing) * 3)}.has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}.has-\[\>\[data-slot\=field\]\]\:w-full:has(>[data-slot=field]){width:100%}.has-\[\>\[data-slot\=field\]\]\:flex-col:has(>[data-slot=field]){flex-direction:column}.has-\[\>\[data-slot\=field\]\]\:rounded-md:has(>[data-slot=field]){border-radius:calc(var(--radius) - 2px)}.has-\[\>\[data-slot\=field\]\]\:border:has(>[data-slot=field]){border-style:var(--tw-border-style);border-width:1px}.has-\[\>\[data-slot\=radio-group\]\]\:gap-3:has(>[data-slot=radio-group]){gap:calc(var(--spacing) * 3)}.has-\[\>button\]\:mr-\[-0\.4rem\]:has(>button){margin-right:-.4rem}.has-\[\>button\]\:ml-\[-0\.45rem\]:has(>button){margin-left:-.45rem}.has-\[\>kbd\]\:mr-\[-0\.35rem\]:has(>kbd){margin-right:-.35rem}.has-\[\>kbd\]\:ml-\[-0\.35rem\]:has(>kbd){margin-left:-.35rem}.has-\[\>svg\]\:p-0:has(>svg){padding:calc(var(--spacing) * 0)}.has-\[\>svg\]\:px-2:has(>svg){padding-inline:calc(var(--spacing) * 2)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>textarea\]\:h-auto:has(>textarea){height:auto}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:50%}.aria-selected\:text-muted-foreground[aria-selected=true]{color:hsl(var(--muted-foreground))}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:hsl(var(--sidebar-accent))}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:hsl(var(--sidebar-accent-foreground))}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:50%}.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\[disabled\=true\]\:opacity-50[data-disabled=true]{opacity:50%}.data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:hsl(var(--destructive))}.data-\[motion\=from-end\]\:slide-in-from-right-52[data-motion=from-end]{--tw-enter-translate-x: calc(52*var(--spacing))}.data-\[motion\=from-start\]\:slide-in-from-left-52[data-motion=from-start]{--tw-enter-translate-x: calc(52*var(--spacing)*-1)}.data-\[motion\=to-end\]\:slide-out-to-right-52[data-motion=to-end]{--tw-exit-translate-x: calc(52*var(--spacing))}.data-\[motion\=to-start\]\:slide-out-to-left-52[data-motion=to-start]{--tw-exit-translate-x: calc(52*var(--spacing)*-1)}.data-\[motion\^\=from-\]\:animate-in[data-motion^=from-]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[motion\^\=from-\]\:fade-in[data-motion^=from-]{--tw-enter-opacity: 0}.data-\[motion\^\=to-\]\:animate-out[data-motion^=to-]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[motion\^\=to-\]\:fade-out[data-motion^=to-]{--tw-exit-opacity: 0}.data-\[orientation\=vertical\]\:h-auto[data-orientation=vertical]{height:auto}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:calc(var(--spacing) * 0)}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:calc(var(--spacing) * 1)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x: calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[placeholder\]\:text-muted-foreground[data-placeholder]{color:hsl(var(--muted-foreground))}.data-\[range-end\=true\]\:rounded-md[data-range-end=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-end\=true\]\:bg-primary[data-range-end=true]{background-color:hsl(var(--primary))}.data-\[range-end\=true\]\:text-primary-foreground[data-range-end=true]{color:hsl(var(--primary-foreground))}.data-\[range-middle\=true\]\:rounded-none[data-range-middle=true]{border-radius:0}.data-\[range-middle\=true\]\:bg-accent[data-range-middle=true]{background-color:hsl(var(--accent))}.data-\[range-middle\=true\]\:text-accent-foreground[data-range-middle=true]{color:hsl(var(--accent-foreground))}.data-\[range-start\=true\]\:rounded-md[data-range-start=true]{border-radius:calc(var(--radius) - 2px)}.data-\[range-start\=true\]\:bg-primary[data-range-start=true]{background-color:hsl(var(--primary))}.data-\[range-start\=true\]\:text-primary-foreground[data-range-start=true]{color:hsl(var(--primary-foreground))}.data-\[selected-single\=true\]\:bg-primary[data-selected-single=true]{background-color:hsl(var(--primary))}.data-\[selected-single\=true\]\:text-primary-foreground[data-selected-single=true]{color:hsl(var(--primary-foreground))}.data-\[selected\=true\]\:rounded-none[data-selected=true]{border-radius:0}.data-\[selected\=true\]\:bg-accent[data-selected=true]{background-color:hsl(var(--accent))}.data-\[selected\=true\]\:text-accent-foreground[data-selected=true]{color:hsl(var(--accent-foreground))}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: calc(2*var(--spacing))}.data-\[slot\=checkbox-group\]\:gap-3[data-slot=checkbox-group]{gap:calc(var(--spacing) * 3)}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=closed\]\:animate-accordion-up[data-state=closed]{animation:accordion-up var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration: .3s;transition-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0 ;--tw-exit-opacity: 0}.data-\[state\=closed\]\:fade-out-80[data-state=closed]{--tw-exit-opacity: .8 ;--tw-exit-opacity: .8}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: 95% ;--tw-exit-scale: .95}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50% }.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed]{--tw-exit-translate-x: 100% }.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48% }.data-\[state\=hidden\]\:animate-out[data-state=hidden]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=hidden\]\:fade-out[data-state=hidden]{--tw-exit-opacity: 0}.data-\[state\=on\]\:bg-accent[data-state=on]{background-color:hsl(var(--accent))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:animate-accordion-down[data-state=open]{animation:accordion-down var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:hsl(var(--accent))}@supports (color: color-mix(in lab,red,red)){.data-\[state\=open\]\:bg-accent\/50[data-state=open]{background-color:color-mix(in oklab,hsl(var(--accent)) 50%,transparent)}}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:100%}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration: .5s;transition-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0 ;--tw-enter-opacity: 0}.data-\[state\=open\]\:zoom-in-90[data-state=open]{--tw-enter-scale: 90% ;--tw-enter-scale: .9}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: 95% ;--tw-enter-scale: .95}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50% }.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48% }.data-\[state\=open\]\:slide-in-from-top-full[data-state=open]{--tw-enter-translate-y: -100% }@media(hover:hover){.data-\[state\=open\]\:hover\:bg-accent[data-state=open]:hover{background-color:hsl(var(--accent))}}@media(hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:hsl(var(--sidebar-accent))}}@media(hover:hover){.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:hsl(var(--sidebar-accent-foreground))}}.data-\[state\=open\]\:focus\:bg-accent[data-state=open]:focus{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x: calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=visible\]\:animate-in[data-state=visible]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=visible\]\:fade-in[data-state=visible]{--tw-enter-opacity: 0}.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel]{--tw-translate-x: calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end]{--tw-translate-x: var(--radix-toast-swipe-end-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=end\]\:animate-out[data-swipe=end]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move]{--tw-translate-x: var(--radix-toast-swipe-move-x);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[swipe\=move\]\:transition-none[data-swipe=move]{transition-property:none}.data-\[variant\=label\]\:text-sm[data-variant=label]{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.data-\[variant\=legend\]\:text-base[data-variant=legend]{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.nth-last-2\:-mt-1:nth-last-child(2){margin-top:calc(var(--spacing) * -1)}@media(min-width:40rem){.sm\:top-auto{top:auto}}@media(min-width:40rem){.sm\:right-0{right:calc(var(--spacing) * 0)}}@media(min-width:40rem){.sm\:bottom-0{bottom:calc(var(--spacing) * 0)}}@media(min-width:40rem){.sm\:mt-0{margin-top:calc(var(--spacing) * 0)}}@media(min-width:40rem){.sm\:flex{display:flex}}@media(min-width:40rem){.sm\:max-w-sm{max-width:var(--container-sm)}}@media(min-width:40rem){.sm\:flex-col{flex-direction:column}}@media(min-width:40rem){.sm\:flex-row{flex-direction:row}}@media(min-width:40rem){.sm\:justify-end{justify-content:flex-end}}@media(min-width:40rem){.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}}@media(min-width:40rem){:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse: 0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}}@media(min-width:40rem){.sm\:rounded-lg{border-radius:var(--radius)}}@media(min-width:40rem){.sm\:text-left{text-align:left}}@media(min-width:40rem){.data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open]{--tw-enter-translate-y: 100% }}@media(min-width:48rem){.md\:absolute{position:absolute}}@media(min-width:48rem){.md\:block{display:block}}@media(min-width:48rem){.md\:flex{display:flex}}@media(min-width:48rem){.md\:w-\[var\(--radix-navigation-menu-viewport-width\)\]{width:var(--radix-navigation-menu-viewport-width)}}@media(min-width:48rem){.md\:w-auto{width:auto}}@media(min-width:48rem){.md\:max-w-\[420px\]{max-width:420px}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:48rem){.md\:flex-row{flex-direction:row}}@media(min-width:48rem){.md\:justify-start{justify-content:flex-start}}@media(min-width:48rem){.md\:p-12{padding:calc(var(--spacing) * 12)}}@media(min-width:48rem){.md\:text-right{text-align:right}}@media(min-width:48rem){.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading, var(--text-6xl--line-height))}}@media(min-width:48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}}@media(min-width:48rem){.md\:opacity-0{opacity:0%}}@media(min-width:48rem){.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}}@media(min-width:48rem){.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing) * 0)}}@media(min-width:48rem){.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:calc(var(--radius) + 4px)}}@media(min-width:48rem){.md\:peer-data-\[variant\=inset\]\:shadow-sm:is(:where(.peer)[data-variant=inset]~*){--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media(min-width:48rem){.md\:peer-data-\[variant\=inset\]\:peer-data-\[state\=collapsed\]\:ml-2:is(:where(.peer)[data-variant=inset]~*):is(:where(.peer)[data-state=collapsed]~*){margin-left:calc(var(--spacing) * 2)}}@media(min-width:48rem){.md\:after\:hidden:after{content:var(--tw-content);display:none}}@media(min-width:64rem){.lg\:col-span-1{grid-column:span 1 / span 1}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2 / span 2}}@media(min-width:64rem){.lg\:col-span-3{grid-column:span 3 / span 3}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container field-group (width >= 28rem){.\@md\/field-group\:flex-row{flex-direction:row}}@container field-group (width >= 28rem){.\@md\/field-group\:items-center{align-items:center}}@container field-group (width >= 28rem){.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}}.dark\:border-destructive:is(.dark *){border-color:hsl(var(--destructive))}.dark\:bg-input\/30:is(.dark *){background-color:hsl(var(--input))}@supports (color: color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,hsl(var(--input)) 30%,transparent)}}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:invert:is(.dark *){--tw-invert: invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.dark\:has-data-\[state\=checked\]\:bg-primary\/10:is(.dark *):has(*[data-state=checked]){background-color:hsl(var(--primary))}@supports (color: color-mix(in lab,red,red)){.dark\:has-data-\[state\=checked\]\:bg-primary\/10:is(.dark *):has(*[data-state=checked]){background-color:color-mix(in oklab,hsl(var(--primary)) 10%,transparent)}}.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: hsl(var(--destructive))}@supports (color: color-mix(in lab,red,red)){.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has(*:is([data-slot][aria-invalid=true])){--tw-ring-color: color-mix(in oklab, hsl(var(--destructive)) 40%, transparent)}}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:hsl(var(--muted-foreground))}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke="#ccc"]{stroke:hsl(var(--border))}@supports (color: color-mix(in lab,red,red)){.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke="#ccc"]{stroke:color-mix(in oklab,hsl(var(--border)) 50%,transparent)}}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:hsl(var(--border))}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-layer\]\:outline-none .recharts-layer{--tw-outline-style: none;outline-style:none}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector{fill:hsl(var(--muted))}.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:hsl(var(--muted))}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke="#ccc"]{stroke:hsl(var(--border))}.\[\&_\.recharts-sector\]\:outline-none .recharts-sector{--tw-outline-style: none;outline-style:none}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke="#fff"]{stroke:transparent}.\[\&_\.recharts-surface\]\:outline-none .recharts-surface{--tw-outline-style: none;outline-style:none}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-block:calc(var(--spacing) * 1.5)}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden])~[cmdk-group]{padding-top:calc(var(--spacing) * 0)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg{width:calc(var(--spacing) * 5)}.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input]{height:calc(var(--spacing) * 12)}.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item]{padding-inline:calc(var(--spacing) * 2)}.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item]{padding-block:calc(var(--spacing) * 3)}.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg{height:calc(var(--spacing) * 5)}.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg{width:calc(var(--spacing) * 5)}.\[\&_img\]\:size-full img{width:100%;height:100%}.\[\&_img\]\:object-cover img{object-fit:cover}.\[\&_p\]\:leading-relaxed p{--tw-leading: var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-6 svg:not([class*=size-]){width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0px}.\[\&\+\[data-slot\=item-content\]\]\:flex-none+[data-slot=item-content]{flex:none}.\[\&\:first-child\[data-selected\=true\]_button\]\:rounded-l-md:first-child[data-selected=true] button{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing) * 0)}.\[\.border-b\]\:pb-3:is(.border-b){padding-bottom:calc(var(--spacing) * 3)}.\[\.border-t\]\:pt-3:is(.border-t){padding-top:calc(var(--spacing) * 3)}:is(.rtl\:\*\*\:\[\.rdp-button\\_next\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_next>svg){rotate:180deg}:is(.rtl\:\*\*\:\[\.rdp-button\\_previous\>svg\]\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *) *):is(.rdp-button_previous>svg){rotate:180deg}.\[a\]\:transition-colors:is(a){transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}@media(hover:hover){.\[a\]\:hover\:bg-accent\/50:is(a):hover{background-color:hsl(var(--accent))}@supports (color: color-mix(in lab,red,red)){.\[a\]\:hover\:bg-accent\/50:is(a):hover{background-color:color-mix(in oklab,hsl(var(--accent)) 50%,transparent)}}}.\[\&\:last-child\[data-selected\=true\]_button\]\:rounded-r-md:last-child[data-selected=true] button{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>\*\]\:focus-visible\:relative>*:focus-visible{position:relative}.\[\&\>\*\]\:focus-visible\:z-10>*:focus-visible{z-index:10}@container field-group (width >= 28rem){.\@md\/field-group\:\[\&\>\*\]\:w-auto>*{width:auto}}.\[\&\>\*\:not\(\:first-child\)\]\:rounded-t-none>*:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.\[\&\>\*\:not\(\:first-child\)\]\:rounded-l-none>*:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.\[\&\>\*\:not\(\:first-child\)\]\:border-t-0>*:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:0px}.\[\&\>\*\:not\(\:first-child\)\]\:border-l-0>*:not(:first-child){border-left-style:var(--tw-border-style);border-left-width:0px}.\[\&\>\*\:not\(\:last-child\)\]\:rounded-r-none>*:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.\[\&\>\*\:not\(\:last-child\)\]\:rounded-b-none>*:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.\[\&\>\.sr-only\]\:w-auto>.sr-only{width:auto}.\[\&\>\[data-slot\=field-group\]\]\:gap-4>[data-slot=field-group]{gap:calc(var(--spacing) * 4)}.\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}@container field-group (width >= 28rem){.\@md\/field-group\:\[\&\>\[data-slot\=field-label\]\]\:flex-auto>[data-slot=field-label]{flex:auto}}.\[\&\>\[data-slot\=field\]\]\:p-4>[data-slot=field]{padding:calc(var(--spacing) * 4)}.has-\[select\[aria-hidden\=true\]\:last-child\]\:\[\&\>\[data-slot\=select-trigger\]\:last-of-type\]\:rounded-r-md:has(*:is(select[aria-hidden=true]:last-child))>[data-slot=select-trigger]:last-of-type{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>\[data-slot\=select-trigger\]\:not\(\[class\*\=\'w-\'\]\)\]\:w-fit>[data-slot=select-trigger]:not([class*=w-]){width:fit-content}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y: 2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]{margin-top:1px}@container field-group (width >= 28rem){.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]{margin-top:1px}}.\[\&\>a\]\:underline>a{text-decoration-line:underline}.\[\&\>a\]\:underline-offset-4>a{text-underline-offset:4px}.\[\&\>a\:hover\]\:text-primary>a:hover{color:hsl(var(--primary))}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>input\]\:flex-1>input{flex:1}.has-\[\>\[data-align\=block-end\]\]\:\[\&\>input\]\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=block-start\]\]\:\[\&\>input\]\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=inline-end\]\]\:\[\&\>input\]\:pr-2:has(>[data-align=inline-end])>input{padding-right:calc(var(--spacing) * 2)}.has-\[\>\[data-align\=inline-start\]\]\:\[\&\>input\]\:pl-2:has(>[data-align=inline-start])>input{padding-left:calc(var(--spacing) * 2)}.\[\&\>kbd\]\:rounded-\[calc\(var\(--radius\)-5px\)\]>kbd{border-radius:calc(var(--radius) - 5px)}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>span\]\:text-xs>span{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.\[\&\>span\]\:opacity-70>span{opacity:70%}.\[\&\>span\:last-child\]\:truncate>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:h-3\.5>svg{height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:h-4>svg{height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-3\.5>svg{width:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:w-4>svg{width:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-destructive>svg{color:hsl(var(--destructive))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\]\:text-muted-foreground>svg{color:hsl(var(--muted-foreground))}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:hsl(var(--sidebar-accent-foreground))}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y: -3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5>svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0px}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing) * -2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing) * -2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-slot=card-content] .\[\[data-slot\=card-content\]_\&\]\:bg-transparent{background-color:transparent}[data-slot=popover-content] .\[\[data-slot\=popover-content\]_\&\]\:bg-transparent{background-color:transparent}[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:bg-background\/20{background-color:hsl(var(--background))}@supports (color: color-mix(in lab,red,red)){[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:bg-background\/20{background-color:color-mix(in oklab,hsl(var(--background)) 20%,transparent)}}[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:text-background{color:hsl(var(--background))}[data-slot=tooltip-content] .dark\:\[\[data-slot\=tooltip-content\]_\&\]\:bg-background\/10:is(.dark *){background-color:hsl(var(--background))}@supports (color: color-mix(in lab,red,red)){[data-slot=tooltip-content] .dark\:\[\[data-slot\=tooltip-content\]_\&\]\:bg-background\/10:is(.dark *){background-color:color-mix(in oklab,hsl(var(--background)) 10%,transparent)}}[data-variant=legend]+.\[\[data-variant\=legend\]\+\&\]\:-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}}@property --tw-animation-delay{syntax: "*"; inherits: false; initial-value: 0s;}@property --tw-animation-direction{syntax: "*"; inherits: false; initial-value: normal;}@property --tw-animation-duration{syntax: "*"; inherits: false;}@property --tw-animation-fill-mode{syntax: "*"; inherits: false; initial-value: none;}@property --tw-animation-iteration-count{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-enter-blur{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-enter-opacity{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-enter-rotate{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-enter-scale{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-enter-translate-x{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-enter-translate-y{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-exit-blur{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-exit-opacity{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-exit-rotate{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-exit-scale{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-exit-translate-x{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-exit-translate-y{syntax: "*"; inherits: false; initial-value: 0;}:root{--background: 240 30% 8%;--foreground: 0 0% 96%;--border: 260 30% 25%;--input: 260 30% 18%;--ring: 269 96% 76%;--card: 240 30% 12%;--card-foreground: 0 0% 96%;--popover: 240 30% 12%;--popover-foreground: 0 0% 96%;--primary: 269 96% 76%;--primary-foreground: 240 30% 8%;--secondary: 217 100% 51%;--secondary-foreground: 0 0% 100%;--muted: 240 20% 16%;--muted-foreground: 240 10% 70%;--accent: 269 96% 76%;--accent-foreground: 240 30% 8%;--destructive: 0 75% 60%;--destructive-foreground: 0 0% 100%;--sidebar: 240 30% 10%;--sidebar-foreground: 0 0% 96%;--sidebar-border: 260 30% 22%;--sidebar-primary: 269 96% 76%;--sidebar-primary-foreground: 240 30% 8%;--sidebar-accent: 240 20% 18%;--sidebar-accent-foreground: 0 0% 96%;--sidebar-ring: 269 96% 76%}html,body,#root{min-height:100vh}html{direction:rtl}body{font-family:var(--font-sans);background:radial-gradient(1200px 600px at 0% 0%,rgba(187,134,252,.15),transparent 60%),radial-gradient(1200px 600px at 100% 100%,rgba(8,102,255,.15),transparent 60%),linear-gradient(135deg,#0d0d1c,#1b1429,#111722);background-attachment:fixed;color:hsl(var(--foreground));-webkit-font-smoothing:antialiased}@layer base{*{border-color:hsl(var(--border))}}.glass{background:linear-gradient(135deg,#ffffff0f,#ffffff05);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.08);box-shadow:0 8px 32px #0006}.text-gradient{background:linear-gradient(135deg,#bb86fc,#0866ff);-webkit-background-clip:text;background-clip:text;color:transparent}.btn-primary-grad{background:linear-gradient(135deg,#bb86fc,#8a4ce8);color:#0d0d18;font-weight:700;transition:filter .15s ease,transform .05s ease}.btn-primary-grad:hover{filter:brightness(1.08)}.btn-primary-grad:active{transform:translateY(1px)}.btn-fb-grad{background:linear-gradient(135deg,#0866ff,#1a4cd1);color:#fff;font-weight:700;transition:filter .15s ease,transform .05s ease}.btn-fb-grad:hover{filter:brightness(1.1)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#ffffff0a}::-webkit-scrollbar-thumb{background:#bb86fc66;border-radius:8px}::-webkit-scrollbar-thumb:hover{background:#bb86fca6}@property --tw-translate-x{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-rotate-x{syntax: "*"; inherits: false;}@property --tw-rotate-y{syntax: "*"; inherits: false;}@property --tw-rotate-z{syntax: "*"; inherits: false;}@property --tw-skew-x{syntax: "*"; inherits: false;}@property --tw-skew-y{syntax: "*"; inherits: false;}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-space-x-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-leading{syntax: "*"; inherits: false;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-ordinal{syntax: "*"; inherits: false;}@property --tw-slashed-zero{syntax: "*"; inherits: false;}@property --tw-numeric-figure{syntax: "*"; inherits: false;}@property --tw-numeric-spacing{syntax: "*"; inherits: false;}@property --tw-numeric-fraction{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: ""; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: ""; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: ""; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-outline-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-backdrop-blur{syntax: "*"; inherits: false;}@property --tw-backdrop-brightness{syntax: "*"; inherits: false;}@property --tw-backdrop-contrast{syntax: "*"; inherits: false;}@property --tw-backdrop-grayscale{syntax: "*"; inherits: false;}@property --tw-backdrop-hue-rotate{syntax: "*"; inherits: false;}@property --tw-backdrop-invert{syntax: "*"; inherits: false;}@property --tw-backdrop-opacity{syntax: "*"; inherits: false;}@property --tw-backdrop-saturate{syntax: "*"; inherits: false;}@property --tw-backdrop-sepia{syntax: "*"; inherits: false;}@property --tw-duration{syntax: "*"; inherits: false;}@property --tw-ease{syntax: "*"; inherits: false;}@property --tw-content{syntax: "*"; initial-value: ""; inherits: false;}@property --tw-scale-x{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-scale-y{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-scale-z{syntax: "*"; inherits: false; initial-value: 1;}@property --tw-blur{syntax: "*"; inherits: false;}@property --tw-brightness{syntax: "*"; inherits: false;}@property --tw-contrast{syntax: "*"; inherits: false;}@property --tw-grayscale{syntax: "*"; inherits: false;}@property --tw-hue-rotate{syntax: "*"; inherits: false;}@property --tw-invert{syntax: "*"; inherits: false;}@property --tw-opacity{syntax: "*"; inherits: false;}@property --tw-saturate{syntax: "*"; inherits: false;}@property --tw-sepia{syntax: "*"; inherits: false;}@property --tw-drop-shadow{syntax: "*"; inherits: false;}@property --tw-drop-shadow-color{syntax: "*"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: ""; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: "*"; inherits: false;}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,var(--ngp-accordion-content-height,auto)))))}}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,var(--ngp-accordion-content-height,auto)))))}to{height:0}}@keyframes caret-blink{0%,70%,to{opacity:1}20%,50%{opacity:0}}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-rotate-x: initial;--tw-rotate-y: initial;--tw-rotate-z: initial;--tw-skew-x: initial;--tw-skew-y: initial;--tw-space-y-reverse: 0;--tw-space-x-reverse: 0;--tw-border-style: solid;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-outline-style: solid;--tw-backdrop-blur: initial;--tw-backdrop-brightness: initial;--tw-backdrop-contrast: initial;--tw-backdrop-grayscale: initial;--tw-backdrop-hue-rotate: initial;--tw-backdrop-invert: initial;--tw-backdrop-opacity: initial;--tw-backdrop-saturate: initial;--tw-backdrop-sepia: initial;--tw-duration: initial;--tw-ease: initial;--tw-content: "";--tw-scale-x: 1;--tw-scale-y: 1;--tw-scale-z: 1;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial;--tw-animation-delay: 0s;--tw-animation-direction: normal;--tw-animation-duration: initial;--tw-animation-fill-mode: none;--tw-animation-iteration-count: 1;--tw-enter-blur: 0;--tw-enter-opacity: 1;--tw-enter-rotate: 0;--tw-enter-scale: 1;--tw-enter-translate-x: 0;--tw-enter-translate-y: 0;--tw-exit-blur: 0;--tw-exit-opacity: 1;--tw-exit-rotate: 0;--tw-exit-scale: 1;--tw-exit-translate-x: 0;--tw-exit-translate-y: 0}}} diff --git a/artifacts/fb-publisher/dist/public/assets/index-oEk3pbMd.js b/artifacts/fb-publisher/dist/public/assets/index-oEk3pbMd.js new file mode 100644 index 0000000000000000000000000000000000000000..843d4b112e3eef3e7f61038b40d5e1ffc3393667 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/assets/index-oEk3pbMd.js @@ -0,0 +1,33 @@ +function yo(u,i){for(var s=0;sr[o]})}}}return Object.freeze(Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const c of o)if(c.type==="childList")for(const h of c.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&r(h)}).observe(document,{childList:!0,subtree:!0});function s(o){const c={};return o.integrity&&(c.integrity=o.integrity),o.referrerPolicy&&(c.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?c.credentials="include":o.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function r(o){if(o.ep)return;o.ep=!0;const c=s(o);fetch(o.href,c)}})();function Ao(u){return u&&u.__esModule&&Object.prototype.hasOwnProperty.call(u,"default")?u.default:u}function Qh(u){if(Object.prototype.hasOwnProperty.call(u,"__esModule"))return u;var i=u.default;if(typeof i=="function"){var s=function r(){var o=!1;try{o=this instanceof r}catch{}return o?Reflect.construct(i,arguments,this.constructor):i.apply(this,arguments)};s.prototype=i.prototype}else s={};return Object.defineProperty(s,"__esModule",{value:!0}),Object.keys(u).forEach(function(r){var o=Object.getOwnPropertyDescriptor(u,r);Object.defineProperty(s,r,o.get?o:{enumerable:!0,get:function(){return u[r]}})}),s}var e6={exports:{}},dr={};var h2;function Zb(){if(h2)return dr;h2=1;var u=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function s(r,o,c){var h=null;if(c!==void 0&&(h=""+c),o.key!==void 0&&(h=""+o.key),"key"in o){c={};for(var m in o)m!=="key"&&(c[m]=o[m])}else c=o;return o=c.ref,{$$typeof:u,type:r,key:h,ref:o!==void 0?o:null,props:c}}return dr.Fragment=i,dr.jsx=s,dr.jsxs=s,dr}var m2;function $b(){return m2||(m2=1,e6.exports=Zb()),e6.exports}var f=$b();const Jb=Ao(f),ev=yo({__proto__:null,default:Jb},[f]);var t6={exports:{}},fr={},u6={exports:{}},n6={};var p2;function tv(){return p2||(p2=1,(function(u){function i(D,q){var $=D.length;D.push(q);e:for(;0<$;){var ne=$-1>>>1,x=D[ne];if(0>>1;neo(J,$))ueo(he,J)?(D[ne]=he,D[ue]=$,ne=ue):(D[ne]=J,D[j]=$,ne=j);else if(ueo(he,$))D[ne]=he,D[ue]=$,ne=ue;else break e}}return q}function o(D,q){var $=D.sortIndex-q.sortIndex;return $!==0?$:D.id-q.id}if(u.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var c=performance;u.unstable_now=function(){return c.now()}}else{var h=Date,m=h.now();u.unstable_now=function(){return h.now()-m}}var b=[],p=[],v=1,_=null,w=3,C=!1,N=!1,E=!1,k=!1,B=typeof setTimeout=="function"?setTimeout:null,P=typeof clearTimeout=="function"?clearTimeout:null,z=typeof setImmediate<"u"?setImmediate:null;function K(D){for(var q=s(p);q!==null;){if(q.callback===null)r(p);else if(q.startTime<=D)r(p),q.sortIndex=q.expirationTime,i(b,q);else break;q=s(p)}}function Y(D){if(E=!1,K(D),!N)if(s(b)!==null)N=!0,Z||(Z=!0,oe());else{var q=s(p);q!==null&&le(Y,q.startTime-D)}}var Z=!1,W=-1,I=5,te=-1;function de(){return k?!0:!(u.unstable_now()-teD&&de());){var ne=_.callback;if(typeof ne=="function"){_.callback=null,w=_.priorityLevel;var x=ne(_.expirationTime<=D);if(D=u.unstable_now(),typeof x=="function"){_.callback=x,K(D),q=!0;break t}_===s(b)&&r(b),K(D)}else r(b);_=s(b)}if(_!==null)q=!0;else{var G=s(p);G!==null&&le(Y,G.startTime-D),q=!1}}break e}finally{_=null,w=$,C=!1}q=void 0}}finally{q?oe():Z=!1}}}var oe;if(typeof z=="function")oe=function(){z(fe)};else if(typeof MessageChannel<"u"){var ve=new MessageChannel,ee=ve.port2;ve.port1.onmessage=fe,oe=function(){ee.postMessage(null)}}else oe=function(){B(fe,0)};function le(D,q){W=B(function(){D(u.unstable_now())},q)}u.unstable_IdlePriority=5,u.unstable_ImmediatePriority=1,u.unstable_LowPriority=4,u.unstable_NormalPriority=3,u.unstable_Profiling=null,u.unstable_UserBlockingPriority=2,u.unstable_cancelCallback=function(D){D.callback=null},u.unstable_forceFrameRate=function(D){0>D||125ne?(D.sortIndex=$,i(p,D),s(b)===null&&D===s(p)&&(E?(P(W),W=-1):E=!0,le(Y,$-ne))):(D.sortIndex=x,i(b,D),N||C||(N=!0,Z||(Z=!0,oe()))),D},u.unstable_shouldYield=de,u.unstable_wrapCallback=function(D){var q=w;return function(){var $=w;w=q;try{return D.apply(this,arguments)}finally{w=$}}}})(n6)),n6}var g2;function uv(){return g2||(g2=1,u6.exports=tv()),u6.exports}var i6={exports:{}},ye={};var b2;function nv(){if(b2)return ye;b2=1;var u=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),o=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),h=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),b=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),_=Symbol.iterator;function w(x){return x===null||typeof x!="object"?null:(x=_&&x[_]||x["@@iterator"],typeof x=="function"?x:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},N=Object.assign,E={};function k(x,G,j){this.props=x,this.context=G,this.refs=E,this.updater=j||C}k.prototype.isReactComponent={},k.prototype.setState=function(x,G){if(typeof x!="object"&&typeof x!="function"&&x!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,x,G,"setState")},k.prototype.forceUpdate=function(x){this.updater.enqueueForceUpdate(this,x,"forceUpdate")};function B(){}B.prototype=k.prototype;function P(x,G,j){this.props=x,this.context=G,this.refs=E,this.updater=j||C}var z=P.prototype=new B;z.constructor=P,N(z,k.prototype),z.isPureReactComponent=!0;var K=Array.isArray,Y={H:null,A:null,T:null,S:null,V:null},Z=Object.prototype.hasOwnProperty;function W(x,G,j,J,ue,he){return j=he.ref,{$$typeof:u,type:x,key:G,ref:j!==void 0?j:null,props:he}}function I(x,G){return W(x.type,G,void 0,void 0,void 0,x.props)}function te(x){return typeof x=="object"&&x!==null&&x.$$typeof===u}function de(x){var G={"=":"=0",":":"=2"};return"$"+x.replace(/[=:]/g,function(j){return G[j]})}var fe=/\/+/g;function oe(x,G){return typeof x=="object"&&x!==null&&x.key!=null?de(""+x.key):G.toString(36)}function ve(){}function ee(x){switch(x.status){case"fulfilled":return x.value;case"rejected":throw x.reason;default:switch(typeof x.status=="string"?x.then(ve,ve):(x.status="pending",x.then(function(G){x.status==="pending"&&(x.status="fulfilled",x.value=G)},function(G){x.status==="pending"&&(x.status="rejected",x.reason=G)})),x.status){case"fulfilled":return x.value;case"rejected":throw x.reason}}throw x}function le(x,G,j,J,ue){var he=typeof x;(he==="undefined"||he==="boolean")&&(x=null);var ie=!1;if(x===null)ie=!0;else switch(he){case"bigint":case"string":case"number":ie=!0;break;case"object":switch(x.$$typeof){case u:case i:ie=!0;break;case v:return ie=x._init,le(ie(x._payload),G,j,J,ue)}}if(ie)return ue=ue(x),ie=J===""?"."+oe(x,0):J,K(ue)?(j="",ie!=null&&(j=ie.replace(fe,"$&/")+"/"),le(ue,G,j,"",function(ke){return ke})):ue!=null&&(te(ue)&&(ue=I(ue,j+(ue.key==null||x&&x.key===ue.key?"":(""+ue.key).replace(fe,"$&/")+"/")+ie)),G.push(ue)),1;ie=0;var Le=J===""?".":J+":";if(K(x))for(var Ce=0;Ce"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(u)}catch(i){console.error(i)}}return u(),a6.exports=iv(),a6.exports}var _2;function av(){if(_2)return fr;_2=1;var u=uv(),i=_o(),s=Xh();function r(e){var t="https://react.dev/errors/"+e;if(1x||(e.current=ne[x],ne[x]=null,x--)}function J(e,t){x++,ne[x]=e.current,e.current=t}var ue=G(null),he=G(null),ie=G(null),Le=G(null);function Ce(e,t){switch(J(ie,t),J(he,e),J(ue,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Hf(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Hf(t),e=qf(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}j(ue),J(ue,e)}function ke(){j(ue),j(he),j(ie)}function pu(e){e.memoizedState!==null&&J(Le,e);var t=ue.current,n=qf(t,e.type);t!==n&&(J(he,e),J(ue,n))}function yt(e){he.current===e&&(j(ue),j(he)),Le.current===e&&(j(Le),rr._currentValue=$)}var Qt=Object.prototype.hasOwnProperty,Xe=u.unstable_scheduleCallback,gu=u.unstable_cancelCallback,Rr=u.unstable_shouldYield,ha=u.unstable_requestPaint,At=u.unstable_now,li=u.unstable_getCurrentPriorityLevel,Rn=u.unstable_ImmediatePriority,ma=u.unstable_UserBlockingPriority,Xt=u.unstable_NormalPriority,Ho=u.unstable_LowPriority,Mn=u.unstable_IdlePriority,pa=u.log,We=u.unstable_setDisableYieldValue,_t=null,ct=null;function bu(e){if(typeof pa=="function"&&We(e),ct&&typeof ct.setStrictMode=="function")try{ct.setStrictMode(_t,e)}catch{}}var xt=Math.clz32?Math.clz32:Yo,qo=Math.log,Io=Math.LN2;function Yo(e){return e>>>=0,e===0?32:31-(qo(e)/Io|0)|0}var ci=256,di=4194304;function Tu(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function fi(e,t,n){var a=e.pendingLanes;if(a===0)return 0;var l=0,d=e.suspendedLanes,g=e.pingedLanes;e=e.warmLanes;var y=a&134217727;return y!==0?(a=y&~d,a!==0?l=Tu(a):(g&=y,g!==0?l=Tu(g):n||(n=y&~e,n!==0&&(l=Tu(n))))):(y=a&~d,y!==0?l=Tu(y):g!==0?l=Tu(g):n||(n=a&~e,n!==0&&(l=Tu(n)))),l===0?0:t!==0&&t!==l&&(t&d)===0&&(d=l&-l,n=t&-t,d>=n||d===32&&(n&4194048)!==0)?t:l}function Pn(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Vo(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Mr(){var e=ci;return ci<<=1,(ci&4194048)===0&&(ci=256),e}function Pr(){var e=di;return di<<=1,(di&62914560)===0&&(di=4194304),e}function ga(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function H(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function pe(e,t,n,a,l,d){var g=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var y=e.entanglements,S=e.expirationTimes,M=e.hiddenUpdates;for(n=g&~n;0)":-1l||S[a]!==M[l]){var V=` +`+S[a].replace(" at new "," at ");return e.displayName&&V.includes("")&&(V=V.replace("",e.displayName)),V}while(1<=a&&0<=l);break}}}finally{Xo=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?vi(n):""}function Vg(e){switch(e.tag){case 26:case 27:case 5:return vi(e.type);case 16:return vi("Lazy");case 13:return vi("Suspense");case 19:return vi("SuspenseList");case 0:case 15:return Wo(e.type,!1);case 11:return Wo(e.type.render,!1);case 1:return Wo(e.type,!0);case 31:return vi("Activity");default:return""}}function Mc(e){try{var t="";do t+=Vg(e),e=e.return;while(e);return t}catch(n){return` +Error generating stack: `+n.message+` +`+n.stack}}function Wt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Pc(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Gg(e){var t=Pc(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,d=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(g){a=""+g,d.call(this,g)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(g){a=""+g},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Fr(e){e._valueTracker||(e._valueTracker=Gg(e))}function Uc(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=Pc(e)?e.checked?"true":"false":e.value),e=a,e!==n?(t.setValue(e),!0):!1}function Lr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Kg=/[\n"\\]/g;function Zt(e){return e.replace(Kg,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Zo(e,t,n,a,l,d,g,y){e.name="",g!=null&&typeof g!="function"&&typeof g!="symbol"&&typeof g!="boolean"?e.type=g:e.removeAttribute("type"),t!=null?g==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Wt(t)):e.value!==""+Wt(t)&&(e.value=""+Wt(t)):g!=="submit"&&g!=="reset"||e.removeAttribute("value"),t!=null?$o(e,g,Wt(t)):n!=null?$o(e,g,Wt(n)):a!=null&&e.removeAttribute("value"),l==null&&d!=null&&(e.defaultChecked=!!d),l!=null&&(e.checked=l&&typeof l!="function"&&typeof l!="symbol"),y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.name=""+Wt(y):e.removeAttribute("name")}function zc(e,t,n,a,l,d,g,y){if(d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.type=d),t!=null||n!=null){if(!(d!=="submit"&&d!=="reset"||t!=null))return;n=n!=null?""+Wt(n):"",t=t!=null?""+Wt(t):n,y||t===e.value||(e.value=t),e.defaultValue=t}a=a??l,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=y?e.checked:!!a,e.defaultChecked=!!a,g!=null&&typeof g!="function"&&typeof g!="symbol"&&typeof g!="boolean"&&(e.name=g)}function $o(e,t,n){t==="number"&&Lr(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function yi(e,t,n,a){if(e=e.options,t){t={};for(var l=0;l"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),nl=!1;if(Du)try{var Aa={};Object.defineProperty(Aa,"passive",{get:function(){nl=!0}}),window.addEventListener("test",Aa,Aa),window.removeEventListener("test",Aa,Aa)}catch{nl=!1}var $u=null,il=null,Hr=null;function Yc(){if(Hr)return Hr;var e,t=il,n=t.length,a,l="value"in $u?$u.value:$u.textContent,d=l.length;for(e=0;e=wa),Wc=" ",Zc=!1;function $c(e,t){switch(e){case"keyup":return _3.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Jc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var wi=!1;function w3(e,t){switch(e){case"compositionend":return Jc(t);case"keypress":return t.which!==32?null:(Zc=!0,Wc);case"textInput":return e=t.data,e===Wc&&Zc?null:e;default:return null}}function S3(e,t){if(wi)return e==="compositionend"||!ll&&$c(e,t)?(e=Yc(),Hr=il=$u=null,wi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=a}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=sd(n)}}function ld(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ld(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function cd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Lr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Lr(e.document)}return t}function fl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var N3=Du&&"documentMode"in document&&11>=document.documentMode,Si=null,hl=null,Ta=null,ml=!1;function dd(e,t,n){var a=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ml||Si==null||Si!==Lr(a)||(a=Si,"selectionStart"in a&&fl(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Ta&&Ca(Ta,a)||(Ta=a,a=js(hl,"onSelect"),0>=g,l-=g,ju=1<<32-xt(t)+l|n<d?d:8;var g=D.T,y={};D.T=y,Jl(e,!1,t,n);try{var S=l(),M=D.S;if(M!==null&&M(y,S),S!==null&&typeof S=="object"&&typeof S.then=="function"){var V=H3(S,a);qa(e,t,V,qt(e))}else qa(e,t,a,qt(e))}catch(X){qa(e,t,{then:function(){},status:"rejected",reason:X},qt())}finally{q.p=d,D.T=g}}function G3(){}function Zl(e,t,n,a){if(e.tag!==5)throw Error(r(476));var l=f4(e).queue;d4(e,l,t,$,n===null?G3:function(){return h4(e),n(a)})}function f4(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:$,baseState:$,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Pu,lastRenderedState:$},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Pu,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function h4(e){var t=f4(e).next.queue;qa(e,t,{},qt())}function $l(){return gt(rr)}function m4(){return $e().memoizedState}function p4(){return $e().memoizedState}function K3(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=qt();e=tn(n);var a=un(t,e,n);a!==null&&(It(a,t,n),Ua(a,t,n)),t={cache:kl()},e.payload=t;return}t=t.return}}function Q3(e,t,n){var a=qt();n={lane:a,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},ds(e)?b4(t,n):(n=vl(e,t,n,a),n!==null&&(It(n,e,a),v4(n,t,a)))}function g4(e,t,n){var a=qt();qa(e,t,n,a)}function qa(e,t,n,a){var l={lane:a,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(ds(e))b4(t,l);else{var d=e.alternate;if(e.lanes===0&&(d===null||d.lanes===0)&&(d=t.lastRenderedReducer,d!==null))try{var g=t.lastRenderedState,y=d(g,n);if(l.hasEagerState=!0,l.eagerState=y,zt(y,g))return Qr(e,t,l,0),He===null&&Kr(),!1}catch{}if(n=vl(e,t,l,a),n!==null)return It(n,e,a),v4(n,t,a),!0}return!1}function Jl(e,t,n,a){if(a={lane:2,revertLane:j0(),action:a,hasEagerState:!1,eagerState:null,next:null},ds(e)){if(t)throw Error(r(479))}else t=vl(e,n,a,2),t!==null&&It(t,e,2)}function ds(e){var t=e.alternate;return e===_e||t!==null&&t===_e}function b4(e,t){Mi=as=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function v4(e,t,n){if((n&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,Tt(e,n)}}var fs={readContext:gt,use:ss,useCallback:Ke,useContext:Ke,useEffect:Ke,useImperativeHandle:Ke,useLayoutEffect:Ke,useInsertionEffect:Ke,useMemo:Ke,useReducer:Ke,useRef:Ke,useState:Ke,useDebugValue:Ke,useDeferredValue:Ke,useTransition:Ke,useSyncExternalStore:Ke,useId:Ke,useHostTransitionStatus:Ke,useFormState:Ke,useActionState:Ke,useOptimistic:Ke,useMemoCache:Ke,useCacheRefresh:Ke},y4={readContext:gt,use:ss,useCallback:function(e,t){return Ot().memoizedState=[e,t===void 0?null:t],e},useContext:gt,useEffect:u4,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,cs(4194308,4,r4.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=Ot();t=t===void 0?null:t;var a=e();if(Qn){bu(!0);try{e()}finally{bu(!1)}}return n.memoizedState=[a,t],a},useReducer:function(e,t,n){var a=Ot();if(n!==void 0){var l=n(t);if(Qn){bu(!0);try{n(t)}finally{bu(!1)}}}else l=t;return a.memoizedState=a.baseState=l,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:l},a.queue=e,e=e.dispatch=Q3.bind(null,_e,e),[a.memoizedState,e]},useRef:function(e){var t=Ot();return e={current:e},t.memoizedState=e},useState:function(e){e=Kl(e);var t=e.queue,n=g4.bind(null,_e,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Xl,useDeferredValue:function(e,t){var n=Ot();return Wl(n,e,t)},useTransition:function(){var e=Kl(!1);return e=d4.bind(null,_e,e.queue,!0,!1),Ot().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var a=_e,l=Ot();if(Oe){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),He===null)throw Error(r(349));(Te&124)!==0||Bd(a,t,n)}l.memoizedState=n;var d={value:n,getSnapshot:t};return l.queue=d,u4(qd.bind(null,a,d,e),[e]),a.flags|=2048,Ui(9,ls(),Hd.bind(null,a,d,n,t),null),n},useId:function(){var e=Ot(),t=He.identifierPrefix;if(Oe){var n=Nu,a=ju;n=(a&~(1<<32-xt(a)-1)).toString(32)+n,t="«"+t+"R"+n,n=rs++,0ge?(lt=ce,ce=null):lt=ce.sibling;var De=U(O,ce,R[ge],Q);if(De===null){ce===null&&(ce=lt);break}e&&ce&&De.alternate===null&&t(O,ce),T=d(De,T,ge),we===null?ae=De:we.sibling=De,we=De,ce=lt}if(ge===R.length)return n(O,ce),Oe&&qn(O,ge),ae;if(ce===null){for(;gege?(lt=ce,ce=null):lt=ce.sibling;var An=U(O,ce,De.value,Q);if(An===null){ce===null&&(ce=lt);break}e&&ce&&An.alternate===null&&t(O,ce),T=d(An,T,ge),we===null?ae=An:we.sibling=An,we=An,ce=lt}if(De.done)return n(O,ce),Oe&&qn(O,ge),ae;if(ce===null){for(;!De.done;ge++,De=R.next())De=X(O,De.value,Q),De!==null&&(T=d(De,T,ge),we===null?ae=De:we.sibling=De,we=De);return Oe&&qn(O,ge),ae}for(ce=a(ce);!De.done;ge++,De=R.next())De=F(ce,O,ge,De.value,Q),De!==null&&(e&&De.alternate!==null&&ce.delete(De.key===null?ge:De.key),T=d(De,T,ge),we===null?ae=De:we.sibling=De,we=De);return e&&ce.forEach(function(Wb){return t(O,Wb)}),Oe&&qn(O,ge),ae}function ze(O,T,R,Q){if(typeof R=="object"&&R!==null&&R.type===N&&R.key===null&&(R=R.props.children),typeof R=="object"&&R!==null){switch(R.$$typeof){case w:e:{for(var ae=R.key;T!==null;){if(T.key===ae){if(ae=R.type,ae===N){if(T.tag===7){n(O,T.sibling),Q=l(T,R.props.children),Q.return=O,O=Q;break e}}else if(T.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===I&&_4(ae)===T.type){n(O,T.sibling),Q=l(T,R.props),Ya(Q,R),Q.return=O,O=Q;break e}n(O,T);break}else t(O,T);T=T.sibling}R.type===N?(Q=Bn(R.props.children,O.mode,Q,R.key),Q.return=O,O=Q):(Q=Wr(R.type,R.key,R.props,null,O.mode,Q),Ya(Q,R),Q.return=O,O=Q)}return g(O);case C:e:{for(ae=R.key;T!==null;){if(T.key===ae)if(T.tag===4&&T.stateNode.containerInfo===R.containerInfo&&T.stateNode.implementation===R.implementation){n(O,T.sibling),Q=l(T,R.children||[]),Q.return=O,O=Q;break e}else{n(O,T);break}else t(O,T);T=T.sibling}Q=_l(R,O.mode,Q),Q.return=O,O=Q}return g(O);case I:return ae=R._init,R=ae(R._payload),ze(O,T,R,Q)}if(le(R))return be(O,T,R,Q);if(oe(R)){if(ae=oe(R),typeof ae!="function")throw Error(r(150));return R=ae.call(R),me(O,T,R,Q)}if(typeof R.then=="function")return ze(O,T,hs(R),Q);if(R.$$typeof===z)return ze(O,T,es(O,R),Q);ms(O,R)}return typeof R=="string"&&R!==""||typeof R=="number"||typeof R=="bigint"?(R=""+R,T!==null&&T.tag===6?(n(O,T.sibling),Q=l(T,R),Q.return=O,O=Q):(n(O,T),Q=Al(R,O.mode,Q),Q.return=O,O=Q),g(O)):n(O,T)}return function(O,T,R,Q){try{Ia=0;var ae=ze(O,T,R,Q);return zi=null,ae}catch(ce){if(ce===Ma||ce===us)throw ce;var we=Ft(29,ce,null,O.mode);return we.lanes=Q,we.return=O,we}}}var Fi=x4(!0),w4=x4(!1),uu=G(null),Au=null;function an(e){var t=e.alternate;J(tt,tt.current&1),J(uu,e),Au===null&&(t===null||Ri.current!==null||t.memoizedState!==null)&&(Au=e)}function S4(e){if(e.tag===22){if(J(tt,tt.current),J(uu,e),Au===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(Au=e)}}else rn()}function rn(){J(tt,tt.current),J(uu,uu.current)}function Uu(e){j(uu),Au===e&&(Au=null),j(tt)}var tt=G(0);function ps(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||I0(n)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function e0(e,t,n,a){t=e.memoizedState,n=n(a,t),n=n==null?t:v({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var t0={enqueueSetState:function(e,t,n){e=e._reactInternals;var a=qt(),l=tn(a);l.payload=t,n!=null&&(l.callback=n),t=un(e,l,a),t!==null&&(It(t,e,a),Ua(t,e,a))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var a=qt(),l=tn(a);l.tag=1,l.payload=t,n!=null&&(l.callback=n),t=un(e,l,a),t!==null&&(It(t,e,a),Ua(t,e,a))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=qt(),a=tn(n);a.tag=2,t!=null&&(a.callback=t),t=un(e,a,n),t!==null&&(It(t,e,n),Ua(t,e,n))}};function E4(e,t,n,a,l,d,g){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,d,g):t.prototype&&t.prototype.isPureReactComponent?!Ca(n,a)||!Ca(l,d):!0}function C4(e,t,n,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,a),t.state!==e&&t0.enqueueReplaceState(t,t.state,null)}function Xn(e,t){var n=t;if("ref"in t){n={};for(var a in t)a!=="ref"&&(n[a]=t[a])}if(e=e.defaultProps){n===t&&(n=v({},n));for(var l in e)n[l]===void 0&&(n[l]=e[l])}return n}var gs=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)};function T4(e){gs(e)}function k4(e){console.error(e)}function D4(e){gs(e)}function bs(e,t){try{var n=e.onUncaughtError;n(t.value,{componentStack:t.stack})}catch(a){setTimeout(function(){throw a})}}function O4(e,t,n){try{var a=e.onCaughtError;a(n.value,{componentStack:n.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(l){setTimeout(function(){throw l})}}function u0(e,t,n){return n=tn(n),n.tag=3,n.payload={element:null},n.callback=function(){bs(e,t)},n}function j4(e){return e=tn(e),e.tag=3,e}function N4(e,t,n,a){var l=n.type.getDerivedStateFromError;if(typeof l=="function"){var d=a.value;e.payload=function(){return l(d)},e.callback=function(){O4(t,n,a)}}var g=n.stateNode;g!==null&&typeof g.componentDidCatch=="function"&&(e.callback=function(){O4(t,n,a),typeof l!="function"&&(fn===null?fn=new Set([this]):fn.add(this));var y=a.stack;this.componentDidCatch(a.value,{componentStack:y!==null?y:""})})}function W3(e,t,n,a,l){if(n.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(t=n.alternate,t!==null&&ja(t,n,l,!0),n=uu.current,n!==null){switch(n.tag){case 13:return Au===null?C0():n.alternate===null&&Ve===0&&(Ve=3),n.flags&=-257,n.flags|=65536,n.lanes=l,a===jl?n.flags|=16384:(t=n.updateQueue,t===null?n.updateQueue=new Set([a]):t.add(a),k0(e,a,l)),!1;case 22:return n.flags|=65536,a===jl?n.flags|=16384:(t=n.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([a])},n.updateQueue=t):(n=t.retryQueue,n===null?t.retryQueue=new Set([a]):n.add(a)),k0(e,a,l)),!1}throw Error(r(435,n.tag))}return k0(e,a,l),C0(),!1}if(Oe)return t=uu.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=l,a!==Sl&&(e=Error(r(422),{cause:a}),Oa($t(e,n)))):(a!==Sl&&(t=Error(r(423),{cause:a}),Oa($t(t,n))),e=e.current.alternate,e.flags|=65536,l&=-l,e.lanes|=l,a=$t(a,n),l=u0(e.stateNode,a,l),Ml(e,l),Ve!==4&&(Ve=2)),!1;var d=Error(r(520),{cause:a});if(d=$t(d,n),Za===null?Za=[d]:Za.push(d),Ve!==4&&(Ve=2),t===null)return!0;a=$t(a,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=l&-l,n.lanes|=e,e=u0(n.stateNode,a,e),Ml(n,e),!1;case 1:if(t=n.type,d=n.stateNode,(n.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||d!==null&&typeof d.componentDidCatch=="function"&&(fn===null||!fn.has(d))))return n.flags|=65536,l&=-l,n.lanes|=l,l=j4(l),N4(l,e,n,a),Ml(n,l),!1}n=n.return}while(n!==null);return!1}var R4=Error(r(461)),st=!1;function dt(e,t,n,a){t.child=e===null?w4(t,null,n,a):Fi(t,e.child,n,a)}function M4(e,t,n,a,l){n=n.render;var d=t.ref;if("ref"in a){var g={};for(var y in a)y!=="ref"&&(g[y]=a[y])}else g=a;return Gn(t),a=Ll(e,t,n,g,d,l),y=Bl(),e!==null&&!st?(Hl(e,t,l),zu(e,t,l)):(Oe&&y&&xl(t),t.flags|=1,dt(e,t,a,l),t.child)}function P4(e,t,n,a,l){if(e===null){var d=n.type;return typeof d=="function"&&!yl(d)&&d.defaultProps===void 0&&n.compare===null?(t.tag=15,t.type=d,U4(e,t,d,a,l)):(e=Wr(n.type,null,a,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(d=e.child,!c0(e,l)){var g=d.memoizedProps;if(n=n.compare,n=n!==null?n:Ca,n(g,a)&&e.ref===t.ref)return zu(e,t,l)}return t.flags|=1,e=Ou(d,a),e.ref=t.ref,e.return=t,t.child=e}function U4(e,t,n,a,l){if(e!==null){var d=e.memoizedProps;if(Ca(d,a)&&e.ref===t.ref)if(st=!1,t.pendingProps=a=d,c0(e,l))(e.flags&131072)!==0&&(st=!0);else return t.lanes=e.lanes,zu(e,t,l)}return n0(e,t,n,a,l)}function z4(e,t,n){var a=t.pendingProps,l=a.children,d=e!==null?e.memoizedState:null;if(a.mode==="hidden"){if((t.flags&128)!==0){if(a=d!==null?d.baseLanes|n:n,e!==null){for(l=t.child=e.child,d=0;l!==null;)d=d|l.lanes|l.childLanes,l=l.sibling;t.childLanes=d&~a}else t.childLanes=0,t.child=null;return F4(e,t,a,n)}if((n&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&ts(t,d!==null?d.cachePool:null),d!==null?Ud(t,d):Ul(),S4(t);else return t.lanes=t.childLanes=536870912,F4(e,t,d!==null?d.baseLanes|n:n,n)}else d!==null?(ts(t,d.cachePool),Ud(t,d),rn(),t.memoizedState=null):(e!==null&&ts(t,null),Ul(),rn());return dt(e,t,l,n),t.child}function F4(e,t,n,a){var l=Ol();return l=l===null?null:{parent:et._currentValue,pool:l},t.memoizedState={baseLanes:n,cachePool:l},e!==null&&ts(t,null),Ul(),S4(t),e!==null&&ja(e,t,a,!0),null}function vs(e,t){var n=t.ref;if(n===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof n!="function"&&typeof n!="object")throw Error(r(284));(e===null||e.ref!==n)&&(t.flags|=4194816)}}function n0(e,t,n,a,l){return Gn(t),n=Ll(e,t,n,a,void 0,l),a=Bl(),e!==null&&!st?(Hl(e,t,l),zu(e,t,l)):(Oe&&a&&xl(t),t.flags|=1,dt(e,t,n,l),t.child)}function L4(e,t,n,a,l,d){return Gn(t),t.updateQueue=null,n=Fd(t,a,n,l),zd(e),a=Bl(),e!==null&&!st?(Hl(e,t,d),zu(e,t,d)):(Oe&&a&&xl(t),t.flags|=1,dt(e,t,n,d),t.child)}function B4(e,t,n,a,l){if(Gn(t),t.stateNode===null){var d=ki,g=n.contextType;typeof g=="object"&&g!==null&&(d=gt(g)),d=new n(a,d),t.memoizedState=d.state!==null&&d.state!==void 0?d.state:null,d.updater=t0,t.stateNode=d,d._reactInternals=t,d=t.stateNode,d.props=a,d.state=t.memoizedState,d.refs={},Nl(t),g=n.contextType,d.context=typeof g=="object"&&g!==null?gt(g):ki,d.state=t.memoizedState,g=n.getDerivedStateFromProps,typeof g=="function"&&(e0(t,n,g,a),d.state=t.memoizedState),typeof n.getDerivedStateFromProps=="function"||typeof d.getSnapshotBeforeUpdate=="function"||typeof d.UNSAFE_componentWillMount!="function"&&typeof d.componentWillMount!="function"||(g=d.state,typeof d.componentWillMount=="function"&&d.componentWillMount(),typeof d.UNSAFE_componentWillMount=="function"&&d.UNSAFE_componentWillMount(),g!==d.state&&t0.enqueueReplaceState(d,d.state,null),Fa(t,a,d,l),za(),d.state=t.memoizedState),typeof d.componentDidMount=="function"&&(t.flags|=4194308),a=!0}else if(e===null){d=t.stateNode;var y=t.memoizedProps,S=Xn(n,y);d.props=S;var M=d.context,V=n.contextType;g=ki,typeof V=="object"&&V!==null&&(g=gt(V));var X=n.getDerivedStateFromProps;V=typeof X=="function"||typeof d.getSnapshotBeforeUpdate=="function",y=t.pendingProps!==y,V||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(y||M!==g)&&C4(t,d,a,g),en=!1;var U=t.memoizedState;d.state=U,Fa(t,a,d,l),za(),M=t.memoizedState,y||U!==M||en?(typeof X=="function"&&(e0(t,n,X,a),M=t.memoizedState),(S=en||E4(t,n,S,a,U,M,g))?(V||typeof d.UNSAFE_componentWillMount!="function"&&typeof d.componentWillMount!="function"||(typeof d.componentWillMount=="function"&&d.componentWillMount(),typeof d.UNSAFE_componentWillMount=="function"&&d.UNSAFE_componentWillMount()),typeof d.componentDidMount=="function"&&(t.flags|=4194308)):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=M),d.props=a,d.state=M,d.context=g,a=S):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{d=t.stateNode,Rl(e,t),g=t.memoizedProps,V=Xn(n,g),d.props=V,X=t.pendingProps,U=d.context,M=n.contextType,S=ki,typeof M=="object"&&M!==null&&(S=gt(M)),y=n.getDerivedStateFromProps,(M=typeof y=="function"||typeof d.getSnapshotBeforeUpdate=="function")||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(g!==X||U!==S)&&C4(t,d,a,S),en=!1,U=t.memoizedState,d.state=U,Fa(t,a,d,l),za();var F=t.memoizedState;g!==X||U!==F||en||e!==null&&e.dependencies!==null&&Jr(e.dependencies)?(typeof y=="function"&&(e0(t,n,y,a),F=t.memoizedState),(V=en||E4(t,n,V,a,U,F,S)||e!==null&&e.dependencies!==null&&Jr(e.dependencies))?(M||typeof d.UNSAFE_componentWillUpdate!="function"&&typeof d.componentWillUpdate!="function"||(typeof d.componentWillUpdate=="function"&&d.componentWillUpdate(a,F,S),typeof d.UNSAFE_componentWillUpdate=="function"&&d.UNSAFE_componentWillUpdate(a,F,S)),typeof d.componentDidUpdate=="function"&&(t.flags|=4),typeof d.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof d.componentDidUpdate!="function"||g===e.memoizedProps&&U===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||g===e.memoizedProps&&U===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=F),d.props=a,d.state=F,d.context=S,a=V):(typeof d.componentDidUpdate!="function"||g===e.memoizedProps&&U===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||g===e.memoizedProps&&U===e.memoizedState||(t.flags|=1024),a=!1)}return d=a,vs(e,t),a=(t.flags&128)!==0,d||a?(d=t.stateNode,n=a&&typeof n.getDerivedStateFromError!="function"?null:d.render(),t.flags|=1,e!==null&&a?(t.child=Fi(t,e.child,null,l),t.child=Fi(t,null,n,l)):dt(e,t,n,l),t.memoizedState=d.state,e=t.child):e=zu(e,t,l),e}function H4(e,t,n,a){return Da(),t.flags|=256,dt(e,t,n,a),t.child}var i0={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function a0(e){return{baseLanes:e,cachePool:kd()}}function r0(e,t,n){return e=e!==null?e.childLanes&~n:0,t&&(e|=nu),e}function q4(e,t,n){var a=t.pendingProps,l=!1,d=(t.flags&128)!==0,g;if((g=d)||(g=e!==null&&e.memoizedState===null?!1:(tt.current&2)!==0),g&&(l=!0,t.flags&=-129),g=(t.flags&32)!==0,t.flags&=-33,e===null){if(Oe){if(l?an(t):rn(),Oe){var y=Ye,S;if(S=y){e:{for(S=y,y=yu;S.nodeType!==8;){if(!y){y=null;break e}if(S=cu(S.nextSibling),S===null){y=null;break e}}y=S}y!==null?(t.memoizedState={dehydrated:y,treeContext:Hn!==null?{id:ju,overflow:Nu}:null,retryLane:536870912,hydrationErrors:null},S=Ft(18,null,null,0),S.stateNode=y,S.return=t,t.child=S,wt=t,Ye=null,S=!0):S=!1}S||Yn(t)}if(y=t.memoizedState,y!==null&&(y=y.dehydrated,y!==null))return I0(y)?t.lanes=32:t.lanes=536870912,null;Uu(t)}return y=a.children,a=a.fallback,l?(rn(),l=t.mode,y=ys({mode:"hidden",children:y},l),a=Bn(a,l,n,null),y.return=t,a.return=t,y.sibling=a,t.child=y,l=t.child,l.memoizedState=a0(n),l.childLanes=r0(e,g,n),t.memoizedState=i0,a):(an(t),s0(t,y))}if(S=e.memoizedState,S!==null&&(y=S.dehydrated,y!==null)){if(d)t.flags&256?(an(t),t.flags&=-257,t=o0(e,t,n)):t.memoizedState!==null?(rn(),t.child=e.child,t.flags|=128,t=null):(rn(),l=a.fallback,y=t.mode,a=ys({mode:"visible",children:a.children},y),l=Bn(l,y,n,null),l.flags|=2,a.return=t,l.return=t,a.sibling=l,t.child=a,Fi(t,e.child,null,n),a=t.child,a.memoizedState=a0(n),a.childLanes=r0(e,g,n),t.memoizedState=i0,t=l);else if(an(t),I0(y)){if(g=y.nextSibling&&y.nextSibling.dataset,g)var M=g.dgst;g=M,a=Error(r(419)),a.stack="",a.digest=g,Oa({value:a,source:null,stack:null}),t=o0(e,t,n)}else if(st||ja(e,t,n,!1),g=(n&e.childLanes)!==0,st||g){if(g=He,g!==null&&(a=n&-n,a=(a&42)!==0?1:Je(a),a=(a&(g.suspendedLanes|n))!==0?0:a,a!==0&&a!==S.retryLane))throw S.retryLane=a,Ti(e,a),It(g,e,a),R4;y.data==="$?"||C0(),t=o0(e,t,n)}else y.data==="$?"?(t.flags|=192,t.child=e.child,t=null):(e=S.treeContext,Ye=cu(y.nextSibling),wt=t,Oe=!0,In=null,yu=!1,e!==null&&(eu[tu++]=ju,eu[tu++]=Nu,eu[tu++]=Hn,ju=e.id,Nu=e.overflow,Hn=t),t=s0(t,a.children),t.flags|=4096);return t}return l?(rn(),l=a.fallback,y=t.mode,S=e.child,M=S.sibling,a=Ou(S,{mode:"hidden",children:a.children}),a.subtreeFlags=S.subtreeFlags&65011712,M!==null?l=Ou(M,l):(l=Bn(l,y,n,null),l.flags|=2),l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,y=e.child.memoizedState,y===null?y=a0(n):(S=y.cachePool,S!==null?(M=et._currentValue,S=S.parent!==M?{parent:M,pool:M}:S):S=kd(),y={baseLanes:y.baseLanes|n,cachePool:S}),l.memoizedState=y,l.childLanes=r0(e,g,n),t.memoizedState=i0,a):(an(t),n=e.child,e=n.sibling,n=Ou(n,{mode:"visible",children:a.children}),n.return=t,n.sibling=null,e!==null&&(g=t.deletions,g===null?(t.deletions=[e],t.flags|=16):g.push(e)),t.child=n,t.memoizedState=null,n)}function s0(e,t){return t=ys({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function ys(e,t){return e=Ft(22,e,null,t),e.lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function o0(e,t,n){return Fi(t,e.child,null,n),e=s0(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function I4(e,t,n){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Cl(e.return,t,n)}function l0(e,t,n,a,l){var d=e.memoizedState;d===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:n,tailMode:l}:(d.isBackwards=t,d.rendering=null,d.renderingStartTime=0,d.last=a,d.tail=n,d.tailMode=l)}function Y4(e,t,n){var a=t.pendingProps,l=a.revealOrder,d=a.tail;if(dt(e,t,a.children,n),a=tt.current,(a&2)!==0)a=a&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&I4(e,n,t);else if(e.tag===19)I4(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}a&=1}switch(J(tt,a),l){case"forwards":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&ps(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),l0(t,!1,l,n,d);break;case"backwards":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&ps(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}l0(t,!0,n,null,d);break;case"together":l0(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function zu(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),dn|=t.lanes,(n&t.childLanes)===0)if(e!==null){if(ja(e,t,n,!1),(n&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,n=Ou(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Ou(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function c0(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Jr(e)))}function Z3(e,t,n){switch(t.tag){case 3:Ce(t,t.stateNode.containerInfo),Ju(t,et,e.memoizedState.cache),Da();break;case 27:case 5:pu(t);break;case 4:Ce(t,t.stateNode.containerInfo);break;case 10:Ju(t,t.type,t.memoizedProps.value);break;case 13:var a=t.memoizedState;if(a!==null)return a.dehydrated!==null?(an(t),t.flags|=128,null):(n&t.child.childLanes)!==0?q4(e,t,n):(an(t),e=zu(e,t,n),e!==null?e.sibling:null);an(t);break;case 19:var l=(e.flags&128)!==0;if(a=(n&t.childLanes)!==0,a||(ja(e,t,n,!1),a=(n&t.childLanes)!==0),l){if(a)return Y4(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),J(tt,tt.current),a)break;return null;case 22:case 23:return t.lanes=0,z4(e,t,n);case 24:Ju(t,et,e.memoizedState.cache)}return zu(e,t,n)}function V4(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps)st=!0;else{if(!c0(e,n)&&(t.flags&128)===0)return st=!1,Z3(e,t,n);st=(e.flags&131072)!==0}else st=!1,Oe&&(t.flags&1048576)!==0&&_d(t,$r,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var a=t.elementType,l=a._init;if(a=l(a._payload),t.type=a,typeof a=="function")yl(a)?(e=Xn(a,e),t.tag=1,t=B4(null,t,a,e,n)):(t.tag=0,t=n0(null,t,a,e,n));else{if(a!=null){if(l=a.$$typeof,l===K){t.tag=11,t=M4(null,t,a,e,n);break e}else if(l===W){t.tag=14,t=P4(null,t,a,e,n);break e}}throw t=ee(a)||a,Error(r(306,t,""))}}return t;case 0:return n0(e,t,t.type,t.pendingProps,n);case 1:return a=t.type,l=Xn(a,t.pendingProps),B4(e,t,a,l,n);case 3:e:{if(Ce(t,t.stateNode.containerInfo),e===null)throw Error(r(387));a=t.pendingProps;var d=t.memoizedState;l=d.element,Rl(e,t),Fa(t,a,null,n);var g=t.memoizedState;if(a=g.cache,Ju(t,et,a),a!==d.cache&&Tl(t,[et],n,!0),za(),a=g.element,d.isDehydrated)if(d={element:a,isDehydrated:!1,cache:g.cache},t.updateQueue.baseState=d,t.memoizedState=d,t.flags&256){t=H4(e,t,a,n);break e}else if(a!==l){l=$t(Error(r(424)),t),Oa(l),t=H4(e,t,a,n);break e}else for(e=t.stateNode.containerInfo,e.nodeType===9?e=e.body:e=e.nodeName==="HTML"?e.ownerDocument.body:e,Ye=cu(e.firstChild),wt=t,Oe=!0,In=null,yu=!0,n=w4(t,null,a,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Da(),a===l){t=zu(e,t,n);break e}dt(e,t,a,n)}t=t.child}return t;case 26:return vs(e,t),e===null?(n=Wf(t.type,null,t.pendingProps,null))?t.memoizedState=n:Oe||(n=t.type,e=t.pendingProps,a=Rs(ie.current).createElement(n),a[Ge]=t,a[pt]=e,ht(a,n,e),rt(a),t.stateNode=a):t.memoizedState=Wf(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return pu(t),e===null&&Oe&&(a=t.stateNode=Kf(t.type,t.pendingProps,ie.current),wt=t,yu=!0,l=Ye,pn(t.type)?(Y0=l,Ye=cu(a.firstChild)):Ye=l),dt(e,t,t.pendingProps.children,n),vs(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&Oe&&((l=a=Ye)&&(a=Eb(a,t.type,t.pendingProps,yu),a!==null?(t.stateNode=a,wt=t,Ye=cu(a.firstChild),yu=!1,l=!0):l=!1),l||Yn(t)),pu(t),l=t.type,d=t.pendingProps,g=e!==null?e.memoizedProps:null,a=d.children,B0(l,d)?a=null:g!==null&&B0(l,g)&&(t.flags|=32),t.memoizedState!==null&&(l=Ll(e,t,I3,null,null,n),rr._currentValue=l),vs(e,t),dt(e,t,a,n),t.child;case 6:return e===null&&Oe&&((e=n=Ye)&&(n=Cb(n,t.pendingProps,yu),n!==null?(t.stateNode=n,wt=t,Ye=null,e=!0):e=!1),e||Yn(t)),null;case 13:return q4(e,t,n);case 4:return Ce(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Fi(t,null,a,n):dt(e,t,a,n),t.child;case 11:return M4(e,t,t.type,t.pendingProps,n);case 7:return dt(e,t,t.pendingProps,n),t.child;case 8:return dt(e,t,t.pendingProps.children,n),t.child;case 12:return dt(e,t,t.pendingProps.children,n),t.child;case 10:return a=t.pendingProps,Ju(t,t.type,a.value),dt(e,t,a.children,n),t.child;case 9:return l=t.type._context,a=t.pendingProps.children,Gn(t),l=gt(l),a=a(l),t.flags|=1,dt(e,t,a,n),t.child;case 14:return P4(e,t,t.type,t.pendingProps,n);case 15:return U4(e,t,t.type,t.pendingProps,n);case 19:return Y4(e,t,n);case 31:return a=t.pendingProps,n=t.mode,a={mode:a.mode,children:a.children},e===null?(n=ys(a,n),n.ref=t.ref,t.child=n,n.return=t,t=n):(n=Ou(e.child,a),n.ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return z4(e,t,n);case 24:return Gn(t),a=gt(et),e===null?(l=Ol(),l===null&&(l=He,d=kl(),l.pooledCache=d,d.refCount++,d!==null&&(l.pooledCacheLanes|=n),l=d),t.memoizedState={parent:a,cache:l},Nl(t),Ju(t,et,l)):((e.lanes&n)!==0&&(Rl(e,t),Fa(t,null,null,n),za()),l=e.memoizedState,d=t.memoizedState,l.parent!==a?(l={parent:a,cache:a},t.memoizedState=l,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=l),Ju(t,et,a)):(a=d.cache,Ju(t,et,a),a!==l.cache&&Tl(t,[et],n,!0))),dt(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(r(156,t.tag))}function Fu(e){e.flags|=4}function G4(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!t2(t)){if(t=uu.current,t!==null&&((Te&4194048)===Te?Au!==null:(Te&62914560)!==Te&&(Te&536870912)===0||t!==Au))throw Pa=jl,Dd;e.flags|=8192}}function As(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?Pr():536870912,e.lanes|=t,qi|=t)}function Va(e,t){if(!Oe)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var a=null;n!==null;)n.alternate!==null&&(a=n),n=n.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null}}function Ie(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,a=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,a|=l.subtreeFlags&65011712,a|=l.flags&65011712,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,a|=l.subtreeFlags,a|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=a,e.childLanes=n,t}function $3(e,t,n){var a=t.pendingProps;switch(wl(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ie(t),null;case 1:return Ie(t),null;case 3:return n=t.stateNode,a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Mu(et),ke(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(ka(t)?Fu(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Sd())),Ie(t),null;case 26:return n=t.memoizedState,e===null?(Fu(t),n!==null?(Ie(t),G4(t,n)):(Ie(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Fu(t),Ie(t),G4(t,n)):(Ie(t),t.flags&=-16777217):(e.memoizedProps!==a&&Fu(t),Ie(t),t.flags&=-16777217),null;case 27:yt(t),n=ie.current;var l=t.type;if(e!==null&&t.stateNode!=null)e.memoizedProps!==a&&Fu(t);else{if(!a){if(t.stateNode===null)throw Error(r(166));return Ie(t),null}e=ue.current,ka(t)?xd(t):(e=Kf(l,a,n),t.stateNode=e,Fu(t))}return Ie(t),null;case 5:if(yt(t),n=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==a&&Fu(t);else{if(!a){if(t.stateNode===null)throw Error(r(166));return Ie(t),null}if(e=ue.current,ka(t))xd(t);else{switch(l=Rs(ie.current),e){case 1:e=l.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=l.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=l.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=l.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":e=l.createElement("div"),e.innerHTML=" + + diff --git a/artifacts/fb-publisher/dist/public/extension/popup.js b/artifacts/fb-publisher/dist/public/extension/popup.js new file mode 100644 index 0000000000000000000000000000000000000000..3f81723956227a0a533f4939ef60cd26c5a03c24 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/extension/popup.js @@ -0,0 +1,82 @@ +(function () { + const dot = document.getElementById('dot'); + const titleEl = document.getElementById('statusTitle'); + const subEl = document.getElementById('statusSub'); + const btnStop = document.getElementById('btnStop'); + const btnOpen = document.getElementById('btnOpen'); + + let isPublishing = false; + let pollTimer = null; + + function setIdle() { + isPublishing = false; + dot.className = 'dot idle'; + titleEl.textContent = 'جاهز'; + subEl.textContent = 'لا يوجد نشر نشط حالياً'; + btnStop.classList.add('hidden'); + } + + function setActive() { + isPublishing = true; + dot.className = 'dot active'; + titleEl.textContent = 'جارٍ النشر…'; + subEl.textContent = 'اضغط إيقاف لإنهاء العملية'; + btnStop.classList.remove('hidden'); + } + + function setStopped() { + isPublishing = false; + dot.className = 'dot stopped'; + titleEl.textContent = 'تم الإيقاف'; + subEl.textContent = 'تم إيقاف النشر بنجاح'; + btnStop.classList.add('hidden'); + } + + function checkStatus() { + chrome.runtime.sendMessage({ action: 'getPublishStatus' }, (res) => { + if (chrome.runtime.lastError) return; + if (res && res.isPublishing) { + setActive(); + } else if (!isPublishing) { + setIdle(); + } + }); + } + + function stopPublishing() { + chrome.runtime.sendMessage({ action: 'stopPublishing' }, (res) => { + if (chrome.runtime.lastError) return; + if (res && res.success) setStopped(); + }); + } + + btnStop.addEventListener('click', stopPublishing); + + btnOpen.addEventListener('click', () => { + chrome.storage.local.get('appUrl', (data) => { + const url = (data && data.appUrl) || 'https://social-media-bridge-s2555.replit.app/app'; + chrome.tabs.query({ url: url.replace(/#.*$/, '') + '*' }, (tabs) => { + if (tabs && tabs.length > 0) { + chrome.tabs.update(tabs[0].id, { active: true }); + if (tabs[0].windowId) chrome.windows.update(tabs[0].windowId, { focused: true }); + } else { + chrome.tabs.create({ url: url }); + } + }); + }); + window.close(); + }); + + window.addEventListener('pagehide', () => { + if (isPublishing) { + chrome.runtime.sendMessage({ action: 'stopPublishing' }); + } + }); + + checkStatus(); + pollTimer = setInterval(checkStatus, 2000); + + window.addEventListener('unload', () => { + clearInterval(pollTimer); + }); +})(); diff --git a/artifacts/fb-publisher/dist/public/extension/src/.gitignore b/artifacts/fb-publisher/dist/public/extension/src/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..619be26f5e6b47ecd53862f73075c1cfe5f9e223 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/extension/src/.gitignore @@ -0,0 +1,2 @@ +# الكود المصدري الأصلي — لا يُرفع للـ Git +*.source.js diff --git a/artifacts/fb-publisher/dist/public/extension/src/background.source.js b/artifacts/fb-publisher/dist/public/extension/src/background.source.js new file mode 100644 index 0000000000000000000000000000000000000000..9986b415f425eaf6dc980a76678f3dd27131f1df --- /dev/null +++ b/artifacts/fb-publisher/dist/public/extension/src/background.source.js @@ -0,0 +1,678 @@ +// ========== رابط التطبيق الافتراضي (محدّث لـ Hugging Face) ========== +const DEFAULT_APP_URL = 'https://sare26-fb-publisher-backend.hf.space/app'; + +// ========== نطاق التطبيق الموثوق ========== +const APP_ORIGIN = 'https://sare26-fb-publisher-backend.hf.space'; + +// ========== نظام مراقبة الأخطاء ========== +function bgLogError(source, error, details = {}) { + console.error(`❌ [BG][${source}]`, error, details); +} + +function bgLogInfo(source, message, data = {}) { + console.log(`✅ [BG][${source}]`, message, data); +} + +// ========== الإعدادات الثابتة ========== +const USER_CONFIG = { + userId: null, + doc_id_groups: "3884641628300421", + doc_id_post_text: "3559434960802556", + doc_id_post_photo: "25528973250111023", + fb_dtsg: null, + lsd: null, + dyn: null, + jazoest: "25415", + upload_id: "jsc_c_9", + targetGroupId: null +}; + +// ========== حالة النشر المتعدد ========== +let publishCancelled = false; +let isPublishingNow = false; +let activePublishImages = []; +let appTabId = null; +let currentPublishTabId = null; + +// Promise تنتهي عند اكتمال تحميل التخزين المحلي +let resolveStorageReady; +const storageReady = new Promise((resolve) => { resolveStorageReady = resolve; }); + +// تحميل القيم المخزنة +chrome.storage.local.get(['fb_dtsg', 'lsd', 'dyn', 'targetGroupId', 'publishCancelled', 'userId'], (data) => { + if (data.fb_dtsg) USER_CONFIG.fb_dtsg = data.fb_dtsg; + if (data.lsd) USER_CONFIG.lsd = data.lsd; + if (data.dyn) USER_CONFIG.dyn = data.dyn; + if (data.userId) USER_CONFIG.userId = data.userId; + if (data.targetGroupId) USER_CONFIG.targetGroupId = data.targetGroupId; + if (data.publishCancelled) { + publishCancelled = data.publishCancelled; + chrome.storage.local.set({ publishCancelled: false }); + } + bgLogInfo('init', 'تم تحميل البيانات المخزنة'); + resolveStorageReady(); +}); + +// ========== تأخير عشوائي بين 62 و149 ثانية ========== +function randomDelay() { + return Math.floor(Math.random() * (195 - 80 + 1)) + 80; +} + +// ========== توليد نص عشوائي متغير لكل منشور (حماية من الحظر) ========== +function generateRandomText() { + const emojis = ["✨", "🌟", "💫", "🔥", "⚡", "🎯", "💎", "🔮", "🌈", "🎪", "🎭", "🎨", "🎵", "🎶", "🍀", "🌺", "🌸", "🌼", "🌻", "💐", "🦋", "🐝", "🐞", "🕊️", "🦅"]; + const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const numbers = "0123456789"; + + const randomLetter = letters[Math.floor(Math.random() * letters.length)]; + const randomNumber = numbers[Math.floor(Math.random() * numbers.length)]; + const randomEmoji1 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomEmoji2 = emojis[Math.floor(Math.random() * emojis.length)]; + + let randomWord = ""; + const wordLength = Math.floor(Math.random() * 6) + 5; + for (let i = 0; i < wordLength; i++) { + randomWord += letters[Math.floor(Math.random() * letters.length)]; + } + + return `${randomEmoji1} ${randomWord}${randomNumber} ${randomEmoji2}`; +} + +// ========== دالة استخراج معرف الحساب الشخصي من الكوكيز ========== +function getFacebookUserId() { + return new Promise((resolve) => { + chrome.cookies.get({ url: 'https://www.facebook.com', name: 'c_user' }, (cookie) => { + if (cookie && cookie.value) { + bgLogInfo('cookies', `تم العثور على c_user (حساب شخصي): ${cookie.value}`); + resolve(cookie.value); + } else { + bgLogInfo('cookies', 'لم يتم العثور على c_user - قد لا يكون المستخدم مسجل الدخول'); + resolve(null); + } + }); + }); +} + +// ========== دالة استخراج معرف الصفحة من الكوكيز ========== +function getFacebookPageId() { + return new Promise((resolve) => { + chrome.cookies.get({ url: 'https://www.facebook.com', name: 'i_user' }, (cookie) => { + if (cookie && cookie.value) { + bgLogInfo('cookies', `✅ تم العثور على i_user (معرف الصفحة): ${cookie.value}`); + resolve(cookie.value); + } else { + bgLogInfo('cookies', '⚠️ لم يتم العثور على i_user'); + resolve(null); + } + }); + }); +} + +// ========== دالة استخراج fb_dtsg ========== +async function extractFbDtsg(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => { + let fbDtsg = null; + let lsd = null; + + const dtsgInput = document.querySelector('input[name="fb_dtsg"]'); + if (dtsgInput && dtsgInput.value) fbDtsg = dtsgInput.value; + const lsdInput = document.querySelector('input[name="lsd"]'); + if (lsdInput && lsdInput.value) lsd = lsdInput.value; + + const fullText = document.documentElement.innerHTML; + + if (!fbDtsg) { + let m = fullText.match(/DTSGInitialData[^{]*\{[^}]*"token"\s*:\s*"([^"]+)"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + let m = fullText.match(/\["fb_dtsg"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + let m = fullText.match(/"fb_dtsg"\s*:\s*"([A-Za-z0-9_\-:\.]{10,120})"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + const scripts = document.querySelectorAll('script'); + for (let script of scripts) { + const content = script.textContent; + if (!content) continue; + let m = content.match(/DTSGInitialData[^}]*token["']\s*:\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/fb_dtsg["']\s*:\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/["']fb_dtsg["']\s*,\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/DTSGInitializer[^)]*"token"\s*:\s*"([^"]+)"/); + if (m && m[1]) { fbDtsg = m[1]; break; } + } + } + if (!lsd) { + let m = fullText.match(/\["LSD"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/); + if (m) lsd = m[1]; + } + if (!lsd) { + let m = fullText.match(/["']LSD["']\s*,\s*\[\s*\]\s*,\s*\{\s*["']token["']\s*:\s*["']([^"']+)["']/); + if (m) lsd = m[1]; + } + + return { fb_dtsg: fbDtsg, lsd: lsd }; + } + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ fb_dtsg: null, lsd: null }); + }); + }); +} + +// ========== دالة استخراج __dyn ========== +async function extractDyn(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => { + let dyn = document.querySelector('input[name="__dyn"]')?.value; + if (dyn && dyn.length > 20) return dyn; + + const scripts = document.querySelectorAll('script'); + for (let script of scripts) { + const content = script.textContent; + if (content) { + let match = content.match(/__dyn\s*:\s*"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = content.match(/"__dyn":"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = content.match(/DYN\s*=\s*"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + } + } + + const html = document.documentElement.innerHTML; + let match = html.match(/__dyn":"([^"]+?)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = html.match(/__dyn=([^&"\s]+)/); + if (match && match[1] && match[1].length > 20) return match[1]; + + return null; + } + }, (results) => { + const dyn = results?.[0]?.result || null; + if (dyn) bgLogInfo('extractDyn', `✅ تم استخراج __dyn`); + else bgLogInfo('extractDyn', '❌ لم يتم العثور على __dyn'); + resolve(dyn); + }); + }); +} + +// ========== دالة تحديث الجلسة ========== +async function refreshSession(tabId) { + bgLogInfo('session', 'جاري تحديث الجلسة'); + try { + await chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => fetch('https://www.facebook.com/help/463972400461409/?_rdr', { credentials: 'include', headers: { 'Accept': 'text/html' } }) + }); + await new Promise(r => setTimeout(r, 2000)); + bgLogInfo('session', 'تم تحديث الجلسة بنجاح'); + } catch(e) { bgLogError('session', e); } +} + +// ========== دالة مدمجة: التحقق من الفيسبوك + اصطياد المفاتيح ========== +async function ensureFacebookAndCaptureKeys() { + return new Promise(async (resolve) => { + bgLogInfo('autoCapture', 'بدء عملية التحقق من فيسبوك واصطياد المفاتيح'); + + const personalUserId = await getFacebookUserId(); + const pageId = await getFacebookPageId(); + const effectiveUserId = pageId || personalUserId; + + if (!effectiveUserId) { + resolve({ success: false, error: "not_logged_in", message: "يجب تسجيل الدخول إلى فيسبوك أولاً" }); + return; + } + + USER_CONFIG.userId = effectiveUserId; + bgLogInfo('autoCapture', `✅ استخدام المعرف: ${effectiveUserId}`); + + const tabs = await chrome.tabs.query({ url: ["*://*.facebook.com/*", "*://*.web.facebook.com/*"] }); + let targetTabId = null; + + if (tabs.length === 0) { + const newTab = await chrome.tabs.create({ url: 'https://www.facebook.com', active: true }); + targetTabId = newTab.id; + await new Promise(r => setTimeout(r, 5000)); + } else { + targetTabId = tabs[0].id; + } + + await refreshSession(targetTabId); + let result = await extractFbDtsg(targetTabId); + + if (!result.fb_dtsg) { + await chrome.tabs.reload(targetTabId); + await new Promise(r => setTimeout(r, 5000)); + const retryResult = await extractFbDtsg(targetTabId); + if (!retryResult.fb_dtsg) { + resolve({ success: false, error: "no_fb_dtsg", message: "لم يتم العثور على مفاتيح فيسبوك" }); + return; + } + result = retryResult; + } + + USER_CONFIG.fb_dtsg = result.fb_dtsg; + USER_CONFIG.lsd = result.lsd; + + const dyn = await extractDyn(targetTabId); + if (dyn) USER_CONFIG.dyn = dyn; + + chrome.storage.local.set({ fb_dtsg: result.fb_dtsg, lsd: result.lsd, dyn: dyn, userId: effectiveUserId }); + bgLogInfo('autoCapture', '✅ تم اصطياد المفاتيح بنجاح'); + resolve({ success: true, userId: effectiveUserId, tabId: targetTabId }); + }); +} + +// ========== دالة رفع صورة ========== +async function uploadImage(tabId, imageBase64, fileName) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (config, imgBase64, name) => { + return new Promise((resolve) => { + try { + const byteString = atob(imgBase64.split(',')[1]); + const mimeType = imgBase64.split(',')[0].split(':')[1].split(';')[0]; + const ab = new ArrayBuffer(byteString.length); + const ia = new Uint8Array(ab); + for (let i = 0; i < byteString.length; i++) ia[i] = byteString.charCodeAt(i); + const blob = new Blob([ab], { type: mimeType }); + const formData = new FormData(); + formData.append('fb_dtsg', config.fb_dtsg); + formData.append('profile_id', config.userId); + formData.append('source', '8'); + formData.append('waterfallxapp', 'comet'); + formData.append('farr', blob, name); + formData.append('upload_id', config.upload_id); + formData.append('jazoest', (25000 + Math.floor(Math.random() * 1000)).toString()); + const uploadUrl = `https://upload.facebook.com/ajax/react_composer/attachments/photo/upload?av=${config.userId}&__user=${config.userId}&__a=1&fb_dtsg=${config.fb_dtsg}`; + fetch(uploadUrl, { method: 'OPTIONS', credentials: 'include' }) + .then(() => fetch(uploadUrl, { method: 'POST', credentials: 'include', body: formData, headers: { 'Accept': '*/*', 'Origin': 'https://upload.facebook.com', 'Referer': 'https://upload.facebook.com/' } })) + .then(async (response) => { + const text = await response.text(); + let photoId = null; + const photoIDMatch = text.match(/"photoID":"(\d+)"/); + if (photoIDMatch) photoId = photoIDMatch[1]; + if (!photoId) { const m2 = text.match(/photoID["']\s*:\s*["'](\d+)["']/); if (m2) photoId = m2[1]; } + if (!photoId) { const m3 = text.match(/fbid["']\s*:\s*["'](\d+)["']/); if (m3) photoId = m3[1]; } + if (photoId) resolve({ success: true, photoId }); + else resolve({ success: false, error: 'لم يتم استخراج photoID' }); + }) + .catch(err => resolve({ success: false, error: err.message })); + } catch (e) { resolve({ success: false, error: e.message }); } + }); + }, + args: [USER_CONFIG, imageBase64, fileName] + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ success: false, error: 'فشل تنفيذ السكربت' }); + }); + }); +} + +// ========== دالة فحص حالة المنشور ========== +async function checkPostStatus(tabId, postUrl) { + return new Promise((resolve) => { + if (!postUrl) { resolve({ isPending: false, isPublic: false }); return; } + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (url) => { + return new Promise((resolve) => { + fetch(url, { credentials: 'include', headers: { 'Accept': 'text/html' } }) + .then(res => res.text()) + .then(html => { + const isPending = html.includes('pending_post') || html.includes('في انتظار موافقة المسؤول') || html.includes('pending approval'); + const hasPendingFooter = html.includes('pending_post_footer_title'); + resolve({ isPending: isPending || hasPendingFooter, isPublic: !isPending && !hasPendingFooter, hasPendingFooter }); + }) + .catch(() => resolve({ isPending: false, isPublic: false })); + }); + }, + args: [postUrl] + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ isPending: false, isPublic: false }); + }); + }); +} + +// ========== دالة نشر منشور في مجموعة (مع نص عشوائي للحماية) ========== +async function publishToGroup(tabId, text, photoIds, groupId) { + return new Promise((resolve) => { + if (!groupId) { resolve({ success: false, error: 'لم يتم تحديد المجموعة' }); return; } + const hasPhotos = photoIds && photoIds.length > 0; + const docId = hasPhotos ? USER_CONFIG.doc_id_post_photo : USER_CONFIG.doc_id_post_text; + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (config, postText, imagesIds, targetGroupId, docIdValue) => { + return new Promise((resolve) => { + const hasPhotos = imagesIds && imagesIds.length > 0; + + // ✅ توليد النص العشوائي داخل func - يتغير لكل منشور + const emojis = ["✨", "🌟", "💫", "🔥", "⚡", "🎯", "💎", "🔮", "🌈", "🎪", "🎭", "🎨", "🎵", "🎶", "🍀", "🌺", "🌸", "🌼", "🌻", "💐", "🦋", "🐝", "🐞", "🕊️", "🦅"]; + const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const numbers = "0123456789"; + const randomEmoji1 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomEmoji2 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomNumber = numbers[Math.floor(Math.random() * numbers.length)]; + let randomWord = ""; + const wordLength = Math.floor(Math.random() * 6) + 5; + for (let i = 0; i < wordLength; i++) { + randomWord += letters[Math.floor(Math.random() * letters.length)]; + } + const randomText = `\n​\n​\n​\n​\n​\n${randomEmoji1} ${randomWord}${randomNumber} ${randomEmoji2}`; + + const finalText = (postText || "") + randomText; + + const variables = { + input: { + source: "WWW", + attachments: hasPhotos ? imagesIds.map(id => ({ photo: { id: id } })) : [], + message: { ranges: [], text: finalText }, + inline_activities: [], + explicit_place_id: "0", + tracking: [null], + audience: { to_id: targetGroupId }, + actor_id: config.userId, + client_mutation_id: (Date.now() + Math.floor(Math.random() * 1000000)).toString() + } + }; + const formData = new FormData(); + formData.append('av', config.userId); + formData.append('__user', config.userId); + formData.append('__a', '1'); + formData.append('fb_dtsg', config.fb_dtsg); + formData.append('variables', JSON.stringify(variables)); + formData.append('doc_id', docIdValue); + formData.append('jazoest', config.jazoest); + const prePublishDelay = Math.floor(Math.random() * (3000 - 1000 + 1)) + 1000; + new Promise(r => setTimeout(r, prePublishDelay)) + .then(() => fetch('https://www.facebook.com/api/graphql/', { method: 'OPTIONS', credentials: 'include', headers: { 'Accept': '*/*', 'Origin': 'https://www.facebook.com', 'Referer': `https://www.facebook.com/groups/${targetGroupId}/` } })) + .then(() => fetch('https://www.facebook.com/api/graphql/', { method: 'POST', credentials: 'include', body: formData, headers: { 'Accept': '*/*', 'Origin': 'https://www.facebook.com', 'Referer': `https://www.facebook.com/groups/${targetGroupId}/` } })) + .then(res => res.text()) + .then(rawText => { + let legacyId = null, storyId = null, postUrl = null; + const legacyMatch = rawText.match(/"legacy_story_hideable_id":"(\d+)"/); + if (legacyMatch) { legacyId = legacyMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/posts/${legacyId}/`; } + if (!legacyId) { const storyMatch = rawText.match(/"story_id":"([^"]+)"/); if (storyMatch) { storyId = storyMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/permalink/${storyId}/`; } } + if (!legacyId && !storyId) { const idMatch = rawText.match(/"story":\s*\{\s*"id":\s*"([^"]+)"/); if (idMatch) { storyId = idMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/permalink/${storyId}/`; } } + const hasStory = rawText.includes('"story_id"') || rawText.includes('"story"'); + const hasPendingFooter = rawText.includes('pending_post_footer_title'); + let finalSuccess = false, initialPending = false; + if (postUrl) { finalSuccess = true; initialPending = false; } + else if (hasStory) { finalSuccess = true; initialPending = true; } + else if (hasPendingFooter) { finalSuccess = false; initialPending = true; } + resolve({ success: finalSuccess, pending: initialPending, story_id: legacyId || storyId, post_url: postUrl }); + }) + .catch(e => resolve({ success: false, pending: false, error: e.message, post_url: null })); + }); + }, + args: [USER_CONFIG, text, photoIds, groupId, docId] // ✅ بدون randomText هنا + }, (results) => { + if (results && results[0]) resolve(results[0].result); + else resolve({ success: false, error: 'فشل تنفيذ النشر', post_url: null }); + }); + }); +} + +// ========== دالة جلب المجموعات ========== +async function fetchAllGroups(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (fb_dtsg, av, dyn) => { + return new Promise((resolve) => { + const params = new URLSearchParams(); + params.append('fb_dtsg', fb_dtsg); + params.append('av', av); + if (dyn) params.append('__dyn', dyn); + params.append('variables', JSON.stringify({ "adminGroupsCount": 999, "memberGroupsCount": 999, "scale": 1.5, "count": 999, "cursor": null })); + params.append('doc_id', '3884641628300421'); + fetch('https://www.facebook.com/api/graphql/', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, credentials: 'include', body: params.toString() }) + .then(async (res) => { + const text = await res.text(); + try { + const data = JSON.parse(text); + const groups = []; + const getImageUrl = (node) => node?.image?.uri || node?.profile_picture?.uri || ''; + if (data.data?.adminGroups?.groups_tab?.tab_groups_list?.edges) { + data.data.adminGroups.groups_tab.tab_groups_list.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: true }); }); + } + if (data.data?.viewer?.groups?.edges) { + data.data.viewer.groups.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: false }); }); + } + if (data.data?.nonAdminGroups?.groups_tab?.tab_groups_list?.edges) { + data.data.nonAdminGroups.groups_tab.tab_groups_list.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: false }); }); + } + resolve({ success: true, groups }); + } catch (parseError) { resolve({ success: false, error: 'Invalid JSON' }); } + }) + .catch(err => resolve({ success: false, error: err.message })); + }); + }, + args: [USER_CONFIG.fb_dtsg, USER_CONFIG.userId, USER_CONFIG.dyn || null] + }, (results) => { + const result = results?.[0]?.result; + if (result?.success && result.groups?.length > 0) { + result.groups.sort((a, b) => (a.isAdmin === b.isAdmin) ? 0 : a.isAdmin ? -1 : 1); + resolve({ groups: result.groups }); + } else resolve({ groups: result?.groups || [] }); + }); + }); +} + +// ========== نشر في مجموعة واحدة ========== +async function publishToOneGroup(groupId, text, images) { + return new Promise(async (resolve) => { + const groupUrl = `https://www.facebook.com/groups/${groupId}/`; + chrome.tabs.create({ url: groupUrl, active: false }, async (groupTab) => { + const tabId = groupTab.id; + currentPublishTabId = tabId; + + let tabClosedByUser = false; + let resolved = false; + + const sendProgress = (payload) => { + if (appTabId) chrome.tabs.sendMessage(appTabId, payload).catch(() => {}); + else chrome.runtime.sendMessage(payload).catch(() => {}); + }; + + const onTabRemoved = (removedTabId) => { + if (removedTabId !== tabId) return; + chrome.tabs.onRemoved.removeListener(onTabRemoved); + tabClosedByUser = true; + currentPublishTabId = null; + publishCancelled = true; + sendProgress({ action: "publishStopped", doneCount: 0, total: 0 }); + if (!resolved) { resolved = true; resolve({ success: false, error: 'أغلق المستخدم تبويب فيسبوك', tabClosed: true, post_url: null }); } + }; + chrome.tabs.onRemoved.addListener(onTabRemoved); + + const waitWithCheck = async (ms) => { + const step = 500; let elapsed = 0; + while (elapsed < ms) { if (publishCancelled || tabClosedByUser) return; await new Promise(r => setTimeout(r, Math.min(step, ms - elapsed))); elapsed += step; } + }; + + const initialWait = Math.floor(Math.random() * (20000 - 8000 + 1)) + 8000; + await waitWithCheck(initialWait); + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + + let photoIds = []; + if (!publishCancelled && !tabClosedByUser && images && images.length > 0) { + for (let i = 0; i < images.length; i++) { + if (publishCancelled || tabClosedByUser) break; + const img = images[i]; + const result = await uploadImage(tabId, img.data, img.name); + if (result.success && result.photoId) photoIds.push(result.photoId); + if (i < images.length - 1) await waitWithCheck(1500); + } + } + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + if (photoIds.length > 0) await waitWithCheck(2000); + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + + const publishResult = await publishToGroup(tabId, text, photoIds, groupId); + if (tabClosedByUser) { chrome.tabs.onRemoved.removeListener(onTabRemoved); return; } + if (publishResult.success && publishResult.post_url) { + await waitWithCheck(2000); + if (!tabClosedByUser) { + const statusCheck = await checkPostStatus(tabId, publishResult.post_url); + publishResult.pending = statusCheck.isPending; + } + } + chrome.tabs.onRemoved.removeListener(onTabRemoved); + setTimeout(() => { chrome.tabs.remove(tabId, () => {}); }, 3000); + currentPublishTabId = null; + if (!resolved) { resolved = true; resolve(publishResult); } + }); + }); +} + +// ========== دوال مساعدة ========== +function isAppOrigin(url) { if (!url) return false; try { return new URL(url).origin === APP_ORIGIN; } catch { return false; } } +function isRealAppUrl(url) { if (!url) return false; try { const p = new URL(url); return p.pathname === '/app' || p.pathname.startsWith('/app/') || p.pathname.startsWith('/app?'); } catch { return url.includes('/app'); } } + +// ========== معالجة الرسائل ========== +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (sender.tab && sender.tab.id && sender.tab.url && isAppOrigin(sender.tab.url)) { + appTabId = sender.tab.id; + if (isRealAppUrl(sender.tab.url)) chrome.storage.local.set({ appUrl: sender.tab.url }); + } + + if (request.action === "registerAppUrl") { sendResponse({ success: true }); return true; } + + if (request.action === "getGroups") { + (async () => { + const sendProgress = (p) => { if (appTabId) chrome.tabs.sendMessage(appTabId, p).catch(() => {}); else chrome.runtime.sendMessage(p).catch(() => {}); }; + sendProgress({ action: "groupsProgress", status: "checking", message: "جاري التحقق..." }); + const captureResult = await ensureFacebookAndCaptureKeys(); + if (!captureResult.success) { sendResponse({ success: false, error: captureResult.error, message: captureResult.message }); return; } + sendProgress({ action: "groupsProgress", status: "fetching", message: "جاري جلب المجموعات..." }); + const groupsResult = await fetchAllGroups(captureResult.tabId); + if (groupsResult.groups && groupsResult.groups.length > 0) { + sendProgress({ action: "groupsProgress", status: "complete", message: `تم جلب ${groupsResult.groups.length} مجموعة` }); + sendResponse({ success: true, groups: groupsResult.groups, userId: captureResult.userId }); + } else { + sendResponse({ success: false, error: "no_groups", message: "لم يتم العثور على مجموعات" }); + } + })(); + return true; + } + + if (request.action === "openFacebook") { chrome.tabs.create({ url: 'https://www.facebook.com', active: true }, () => sendResponse({ success: true })); return true; } + if (request.action === "removePublishImage") { if (typeof request.index === 'number' && request.index >= 0 && request.index < activePublishImages.length) activePublishImages.splice(request.index, 1); sendResponse({ success: true, remaining: activePublishImages.length }); return true; } + + if (request.action === "stopPublishing") { + publishCancelled = true; + isPublishingNow = false; + chrome.storage.local.set({ publishCancelled: true }); + if (currentPublishTabId !== null) { chrome.tabs.remove(currentPublishTabId, () => {}); currentPublishTabId = null; } + sendResponse({ success: true }); + return true; + } + + if (request.action === "getPublishStatus") { sendResponse({ isPublishing: isPublishingNow }); return true; } + + if (request.action === "publishToGroup") { + (async () => { + await storageReady; + if (!USER_CONFIG.fb_dtsg || !USER_CONFIG.userId) { sendResponse({ success: false, error: "الرجاء جلب المجموعات أولاً" }); return; } + publishCancelled = false; isPublishingNow = true; chrome.storage.local.set({ publishCancelled: false }); + const result = await publishToOneGroup(request.groupId, request.text || "", request.images || []); + isPublishingNow = false; sendResponse(result); + })(); + return true; + } + + if (request.action === "publishToMultipleGroups") { + (async () => { + await storageReady; + if (isPublishingNow) { sendResponse({ success: false, error: "النشر جارٍ بالفعل" }); return; } + if (!USER_CONFIG.fb_dtsg || !USER_CONFIG.userId) { sendResponse({ success: false, error: "الرجاء جلب المجموعات أولاً" }); return; } + if (!request.groupIds || request.groupIds.length === 0) { sendResponse({ success: false, error: "الرجاء اختيار مجموعة" }); return; } + + publishCancelled = false; isPublishingNow = true; + chrome.storage.local.set({ publishCancelled: false }); + + const groupIds = request.groupIds; + const text = request.text || ""; + activePublishImages = JSON.parse(JSON.stringify(request.images || [])); + + sendResponse({ success: true, started: true, total: groupIds.length }); + + const sendProgress = (payload) => { + if (appTabId) chrome.tabs.sendMessage(appTabId, payload).catch(() => {}); + else chrome.runtime.sendMessage(payload).catch(() => {}); + }; + + for (let i = 0; i < groupIds.length; i++) { + if (publishCancelled) { + const allProgress = []; + for (let j = i; j < groupIds.length; j++) { + allProgress.push({ groupId: groupIds[j], status: "failed", error: "تم إيقاف النشر - أُغلق تبويب فيسبوك" }); + } + sendProgress({ action: "publishStopped", doneCount: i, total: groupIds.length, failedGroups: allProgress }); + break; + } + + const groupId = groupIds[i]; + sendProgress({ action: "publishProgress", current: i + 1, total: groupIds.length, groupId, status: "publishing" }); + + const result = await publishToOneGroup(groupId, text, [...activePublishImages]); + + if (publishCancelled) { + const allProgress = []; + for (let j = i + 1; j < groupIds.length; j++) { + allProgress.push({ groupId: groupIds[j], status: "failed", error: "تم إيقاف النشر - أُغلق تبويب فيسبوك" }); + } + sendProgress({ action: "publishStopped", doneCount: i + (result.success ? 1 : 0), total: groupIds.length, failedGroups: allProgress }); + break; + } + + let status = result.success ? (result.pending ? "pending" : "success") : "failed"; + sendProgress({ action: "publishProgress", current: i + 1, total: groupIds.length, groupId, status, pending: result.pending || false, error: result.error || null, postUrl: result.post_url || null }); + + if (i < groupIds.length - 1 && !publishCancelled) { + const delaySeconds = request.delayConfig?.mode === 'fixed' && request.delayConfig.seconds > 0 ? Math.max(10, Math.floor(request.delayConfig.seconds)) : randomDelay(); + for (let sec = delaySeconds; sec > 0; sec--) { + if (publishCancelled) break; + sendProgress({ action: "publishCountdown", seconds: sec, totalDelay: delaySeconds, nextGroup: i + 2, total: groupIds.length }); + await new Promise(r => setTimeout(r, 1000)); + } + } + } + + if (!publishCancelled) sendProgress({ action: "publishComplete", total: groupIds.length }); + + isPublishingNow = false; publishCancelled = false; + chrome.storage.local.set({ publishCancelled: false }); + })(); + return true; + } +}); + +// ========== فتح صفحة الأداة ========== +chrome.action.onClicked.addListener(async () => { + if (appTabId !== null) { + try { const tab = await chrome.tabs.get(appTabId); if (tab.url && isAppOrigin(tab.url)) { await chrome.tabs.update(appTabId, { active: true }); return; } } catch { appTabId = null; } + } + const stored = await chrome.storage.local.get("appUrl"); + if (stored.appUrl && isRealAppUrl(stored.appUrl) && isAppOrigin(stored.appUrl)) { + try { const existingTabs = await chrome.tabs.query({ url: stored.appUrl.replace(/#.*$/, '') + '*' }); if (existingTabs.length > 0 && existingTabs[0].id) { appTabId = existingTabs[0].id; await chrome.tabs.update(existingTabs[0].id, { active: true }); return; } } catch { } + chrome.tabs.create({ url: stored.appUrl }); return; + } + try { const appTabs = await chrome.tabs.query({ url: [APP_ORIGIN + "/app", APP_ORIGIN + "/app/*"] }); if (appTabs.length > 0 && appTabs[0].id) { appTabId = appTabs[0].id; await chrome.tabs.update(appTabs[0].id, { active: true }); return; } } catch { } + chrome.tabs.create({ url: DEFAULT_APP_URL }); +}); \ No newline at end of file diff --git a/artifacts/fb-publisher/dist/public/extension/src/bridge.source.js b/artifacts/fb-publisher/dist/public/extension/src/bridge.source.js new file mode 100644 index 0000000000000000000000000000000000000000..8f244d0a215982afb828db8a390594c3f8bbce6e --- /dev/null +++ b/artifacts/fb-publisher/dist/public/extension/src/bridge.source.js @@ -0,0 +1,74 @@ +(function () { + const BRIDGE_TAG = "fbpub-bridge"; + const WEB_TAG = "fbpub-web"; + + console.log("[Bridge] Loaded v" + chrome.runtime.getManifest().version); + + // استقبال الرسائل من تطبيق الويب (Replit) + window.addEventListener("message", (event) => { + if (event.source !== window) return; + const msg = event.data; + if (!msg || msg.source !== WEB_TAG) return; + const { requestId, action, payload } = msg; + + console.log("[Bridge] Message from web:", action, payload); + + if (action === "ping") { + window.postMessage( + { + source: BRIDGE_TAG, + requestId, + response: { installed: true, version: chrome.runtime.getManifest().version }, + }, + "*", + ); + return; + } + + // إرسال الأوامر إلى الخلفية (background.js) + chrome.runtime.sendMessage({ action, ...(payload || {}) }, (response) => { + console.log("[Bridge] Response from bg for " + action + ":", response); + window.postMessage( + { + source: BRIDGE_TAG, + requestId, + response: response ?? { success: false, error: "no response" }, + error: chrome.runtime.lastError ? chrome.runtime.lastError.message : null, + }, + "*", + ); + }); + }); + + // استقبال البثوث من الخلفية (publishProgress, publishComplete, إلخ) + chrome.runtime.onMessage.addListener((message) => { + console.log("[Bridge] Broadcast from bg:", message); + window.postMessage( + { + source: BRIDGE_TAG, + broadcast: true, + message, + }, + "*", + ); + }); + + // إشعار جاهزية الجسر للصفحة + window.postMessage( + { + source: BRIDGE_TAG, + event: "ready", + version: chrome.runtime.getManifest().version, + }, + "*", + ); + + // تسجيل رابط الأداة في الخلفية — فقط إذا كانت هذه صفحة التطبيق الفعلية وليس صفحة الهبوط + const _path = window.location.pathname; + if (_path === '/app' || _path.startsWith('/app/') || _path.startsWith('/app?')) { + chrome.runtime.sendMessage({ + action: "registerAppUrl", + url: window.location.href, + }); + } +})(); diff --git a/artifacts/fb-publisher/dist/public/favicon.png b/artifacts/fb-publisher/dist/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..98c2c3513729696f53874f230a83652180ccba2c Binary files /dev/null and b/artifacts/fb-publisher/dist/public/favicon.png differ diff --git a/artifacts/fb-publisher/dist/public/favicon.svg b/artifacts/fb-publisher/dist/public/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..4373d3cd2f3dad5ca6f33b5cdcccc61edaef8eb7 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/artifacts/fb-publisher/dist/public/index.html b/artifacts/fb-publisher/dist/public/index.html new file mode 100644 index 0000000000000000000000000000000000000000..fa6f9ed58d6e7172ec1bb4347fa72b355ddfe2b9 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/index.html @@ -0,0 +1,18 @@ + + + + + + FB Group Publisher PRO + + + + + + + + + +
+ + diff --git a/artifacts/fb-publisher/dist/public/logo.png b/artifacts/fb-publisher/dist/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98c2c3513729696f53874f230a83652180ccba2c Binary files /dev/null and b/artifacts/fb-publisher/dist/public/logo.png differ diff --git a/artifacts/fb-publisher/dist/public/logo.svg b/artifacts/fb-publisher/dist/public/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..482d6c0592dbb7155cb53d88d9dd757543b2d420 --- /dev/null +++ b/artifacts/fb-publisher/dist/public/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/artifacts/fb-publisher/dist/public/opengraph.jpg b/artifacts/fb-publisher/dist/public/opengraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b442e009a1727a44dbcfcf88a165f29c041b877e Binary files /dev/null and b/artifacts/fb-publisher/dist/public/opengraph.jpg differ diff --git a/artifacts/fb-publisher/dist/public/robots.txt b/artifacts/fb-publisher/dist/public/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..c2a49f4fb82f19ffa9089fcf8630e5a2870d3feb --- /dev/null +++ b/artifacts/fb-publisher/dist/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/artifacts/fb-publisher/index.html b/artifacts/fb-publisher/index.html new file mode 100644 index 0000000000000000000000000000000000000000..9ddfc9497396e9cc7b0502c6ceb070382b6251a2 --- /dev/null +++ b/artifacts/fb-publisher/index.html @@ -0,0 +1,17 @@ + + + + + + FB Group Publisher PRO + + + + + + + +
+ + + diff --git a/artifacts/fb-publisher/package.json b/artifacts/fb-publisher/package.json new file mode 100644 index 0000000000000000000000000000000000000000..aa166076a75321eec50cbe37baafb4393edf849c --- /dev/null +++ b/artifacts/fb-publisher/package.json @@ -0,0 +1,83 @@ +{ + "name": "@workspace/fb-publisher", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --config vite.config.ts --host 0.0.0.0", + "build": "vite build --config vite.config.ts", + "serve": "vite preview --config vite.config.ts --host 0.0.0.0", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "devDependencies": { + "@hookform/resolvers": "^3.10.0", + "@radix-ui/react-accordion": "^1.2.4", + "@radix-ui/react-alert-dialog": "^1.1.7", + "@radix-ui/react-aspect-ratio": "^1.1.3", + "@radix-ui/react-avatar": "^1.1.4", + "@radix-ui/react-checkbox": "^1.1.5", + "@radix-ui/react-collapsible": "^1.1.4", + "@radix-ui/react-context-menu": "^2.2.7", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-dropdown-menu": "^2.1.7", + "@radix-ui/react-hover-card": "^1.1.7", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-menubar": "^1.1.7", + "@radix-ui/react-navigation-menu": "^1.2.6", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-progress": "^1.1.3", + "@radix-ui/react-radio-group": "^1.2.4", + "@radix-ui/react-scroll-area": "^1.2.4", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-separator": "^1.1.3", + "@radix-ui/react-slider": "^1.2.4", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.4", + "@radix-ui/react-toast": "^1.2.7", + "@radix-ui/react-toggle": "^1.1.3", + "@radix-ui/react-toggle-group": "^1.1.3", + "@radix-ui/react-tooltip": "^1.2.0", + "@replit/vite-plugin-cartographer": "catalog:", + "@replit/vite-plugin-dev-banner": "catalog:", + "@replit/vite-plugin-runtime-error-modal": "catalog:", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "catalog:", + "@tanstack/react-query": "catalog:", + "@types/node": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "@workspace/api-client-react": "workspace:*", + "class-variance-authority": "catalog:", + "clsx": "catalog:", + "cmdk": "^1.1.1", + "date-fns": "^3.6.0", + "embla-carousel-react": "^8.6.0", + "framer-motion": "catalog:", + "input-otp": "^1.4.2", + "lucide-react": "catalog:", + "next-themes": "^0.4.6", + "react": "catalog:", + "react-day-picker": "^9.11.1", + "react-dom": "catalog:", + "react-hook-form": "^7.55.0", + "react-icons": "^5.4.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.7", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:", + "tw-animate-css": "^1.4.0", + "vaul": "^1.1.2", + "vite": "catalog:", + "wouter": "^3.3.5", + "zod": "catalog:" + }, + "dependencies": { + "@clerk/localizations": "^4.5.5", + "@clerk/react": "^6.4.3", + "@clerk/themes": "^2.4.57", + "jszip": "^3.10.1" + } +} diff --git a/artifacts/fb-publisher/public/extension/background.js b/artifacts/fb-publisher/public/extension/background.js new file mode 100644 index 0000000000000000000000000000000000000000..dd9a3e4bbf2bdc440ec73c929524f248dc5468ef --- /dev/null +++ b/artifacts/fb-publisher/public/extension/background.js @@ -0,0 +1 @@ +const DEFAULT_APP_URL='https://social-media-bridge-s2555.replit.app/app';function bgLogError(_0x24e1e7,_0x445805,_0x623bd3={}){console['error']('❌\x20[BG]['+_0x24e1e7+']',_0x445805,_0x623bd3);}function bgLogInfo(_0x2f6de9,_0x425659,_0x2400a5={}){console['log']('✅\x20[BG]['+_0x2f6de9+']',_0x425659,_0x2400a5);}const USER_CONFIG={'userId':null,'doc_id_groups':'3884641628300421','doc_id_post_text':'3559434960802556','doc_id_post_photo':'25528973250111023','fb_dtsg':null,'lsd':null,'jazoest':'25415','upload_id':'jsc_c_9','targetGroupId':null};let publishCancelled=![],isPublishingNow=![],activePublishImages=[],appTabId=null,currentPublishTabId=null,resolveStorageReady;const storageReady=new Promise(_0x2637a7=>{resolveStorageReady=_0x2637a7;});chrome['storage']['local']['get'](['fb_dtsg','lsd','targetGroupId','publishCancelled','userId'],_0x4b579e=>{if(_0x4b579e['fb_dtsg'])USER_CONFIG['fb_dtsg']=_0x4b579e['fb_dtsg'];if(_0x4b579e['lsd'])USER_CONFIG['lsd']=_0x4b579e['lsd'];if(_0x4b579e['userId'])USER_CONFIG['userId']=_0x4b579e['userId'];if(_0x4b579e['targetGroupId'])USER_CONFIG['targetGroupId']=_0x4b579e['targetGroupId'];_0x4b579e['publishCancelled']&&(publishCancelled=_0x4b579e['publishCancelled'],chrome['storage']['local']['set']({'publishCancelled':![]})),bgLogInfo('init','تم\x20تحميل\x20البيانات\x20المخزنة'),resolveStorageReady();});function randomDelay(){return Math['floor'](Math['random']()*(0x95-0x3e+0x1))+0x3e;}function getFacebookUserId(){return new Promise(_0x2d8a66=>{chrome['cookies']['get']({'url':'https://www.facebook.com','name':'c_user'},_0x532d4e=>{_0x532d4e&&_0x532d4e['value']?(bgLogInfo('cookies','تم\x20العثور\x20على\x20c_user:\x20'+_0x532d4e['value']),_0x2d8a66(_0x532d4e['value'])):(bgLogInfo('cookies','لم\x20يتم\x20العثور\x20على\x20c_user\x20-\x20قد\x20لا\x20يكون\x20المستخدم\x20مسجل\x20الدخول'),_0x2d8a66(null));});});}function parseDtsgFromText(_0x352e66){let _0x6236ee=null,_0x971753=null,_0x375ee2=_0x352e66['match'](/DTSGInitialData[^{]*\{[^}]*"token"\s*:\s*"([^"]+)"/);if(_0x375ee2)_0x6236ee=_0x375ee2[0x1];if(!_0x6236ee){_0x375ee2=_0x352e66['match'](/\["fb_dtsg"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/);if(_0x375ee2)_0x6236ee=_0x375ee2[0x1];}if(!_0x6236ee){_0x375ee2=_0x352e66['match'](/"fb_dtsg"\s*:\s*"([A-Za-z0-9_\-:\.]{10,120})"/);if(_0x375ee2)_0x6236ee=_0x375ee2[0x1];}if(!_0x6236ee){_0x375ee2=_0x352e66['match'](/fb_dtsg["']\s*[,:]\s*["']([^"']{10,120})/);if(_0x375ee2)_0x6236ee=_0x375ee2[0x1];}if(!_0x6236ee){_0x375ee2=_0x352e66['match'](/DTSGInitializer\s*\(\s*\{[^}]*"token"\s*:\s*"([^"]+)"/);if(_0x375ee2)_0x6236ee=_0x375ee2[0x1];}_0x375ee2=_0x352e66['match'](/\["LSD"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/);if(_0x375ee2)_0x971753=_0x375ee2[0x1];if(!_0x971753){_0x375ee2=_0x352e66['match'](/"LSD"\s*,\s*\[\s*\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/);if(_0x375ee2)_0x971753=_0x375ee2[0x1];}return{'fb_dtsg':_0x6236ee,'lsd':_0x971753};}async function extractFbDtsg(_0x258cbb){return new Promise(_0x45919e=>{chrome['scripting']['executeScript']({'target':{'tabId':_0x258cbb},'func':()=>{let _0x514d7c=null,_0x381c4f=null;const _0x5aa70f=document['querySelector']('input[name=\x22fb_dtsg\x22]');if(_0x5aa70f&&_0x5aa70f['value'])_0x514d7c=_0x5aa70f['value'];const _0x1c5bf7=document['querySelector']('input[name=\x22lsd\x22]');if(_0x1c5bf7&&_0x1c5bf7['value'])_0x381c4f=_0x1c5bf7['value'];const _0x235787=document['documentElement']['innerHTML'];if(!_0x514d7c){let _0x24158e=_0x235787['match'](/DTSGInitialData[^{]*\{[^}]*"token"\s*:\s*"([^"]+)"/);if(_0x24158e)_0x514d7c=_0x24158e[0x1];}if(!_0x514d7c){let _0x269bc2=_0x235787['match'](/\["fb_dtsg"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/);if(_0x269bc2)_0x514d7c=_0x269bc2[0x1];}if(!_0x514d7c){let _0xd3123=_0x235787['match'](/"fb_dtsg"\s*:\s*"([A-Za-z0-9_\-:\.]{10,120})"/);if(_0xd3123)_0x514d7c=_0xd3123[0x1];}if(!_0x514d7c){const _0x52ce8a=document['querySelectorAll']('script');for(let _0x5ca0b7 of _0x52ce8a){const _0x219c3b=_0x5ca0b7['textContent'];if(!_0x219c3b)continue;let _0x5b3b59=_0x219c3b['match'](/DTSGInitialData[^}]*token["']\s*:\s*["']([^"']+)["']/);if(_0x5b3b59&&_0x5b3b59[0x1]){_0x514d7c=_0x5b3b59[0x1];break;}_0x5b3b59=_0x219c3b['match'](/fb_dtsg["']\s*:\s*["']([^"']+)["']/);if(_0x5b3b59&&_0x5b3b59[0x1]){_0x514d7c=_0x5b3b59[0x1];break;}_0x5b3b59=_0x219c3b['match'](/["']fb_dtsg["']\s*,\s*["']([^"']+)["']/);if(_0x5b3b59&&_0x5b3b59[0x1]){_0x514d7c=_0x5b3b59[0x1];break;}_0x5b3b59=_0x219c3b['match'](/DTSGInitializer[^)]*"token"\s*:\s*"([^"]+)"/);if(_0x5b3b59&&_0x5b3b59[0x1]){_0x514d7c=_0x5b3b59[0x1];break;}}}if(!_0x381c4f){let _0x34f649=_0x235787['match'](/\["LSD"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/);if(_0x34f649)_0x381c4f=_0x34f649[0x1];}if(!_0x381c4f){let _0xe7e267=_0x235787['match'](/["']LSD["']\s*,\s*\[\s*\]\s*,\s*\{\s*["']token["']\s*:\s*["']([^"']+)["']/);if(_0xe7e267)_0x381c4f=_0xe7e267[0x1];}return{'fb_dtsg':_0x514d7c,'lsd':_0x381c4f};}},_0x369f7e=>{if(_0x369f7e&&_0x369f7e[0x0]&&_0x369f7e[0x0]['result'])_0x45919e(_0x369f7e[0x0]['result']);else _0x45919e({'fb_dtsg':null,'lsd':null});});});}async function extractFbDtsgViaFetch(){try{bgLogInfo('fetchDtsg','محاولة\x20استخراج\x20DTSG\x20عبر\x20fetch...');const _0x182377=await fetch('https://www.facebook.com/',{'credentials':'include','headers':{'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'ar,en-US;q=0.9,en;q=0.8','Cache-Control':'no-cache'}});if(!_0x182377['ok'])return bgLogInfo('fetchDtsg','HTTP\x20error:\x20'+_0x182377['status']),{'fb_dtsg':null,'lsd':null};const _0x2afc96=await _0x182377['text'](),_0x3dbc1f=parseDtsgFromText(_0x2afc96);return bgLogInfo('fetchDtsg',_0x3dbc1f['fb_dtsg']?'✅\x20نجح\x20الاستخراج\x20عبر\x20fetch':'❌\x20لم\x20يُعثر\x20على\x20DTSG\x20في\x20fetch'),_0x3dbc1f;}catch(_0x10d493){return bgLogInfo('fetchDtsg','فشل\x20fetch:\x20'+_0x10d493['message']),{'fb_dtsg':null,'lsd':null};}}async function ensureFacebookAndCaptureKeys(){return new Promise(async _0x3fc6b0=>{bgLogInfo('autoCapture','بدء\x20عملية\x20التحقق\x20من\x20فيسبوك\x20واصطياد\x20المفاتيح\x20تلقائياً');const _0x123e56=await getFacebookUserId();if(!_0x123e56){_0x3fc6b0({'success':![],'error':'not_logged_in','message':'يجب\x20تسجيل\x20الدخول\x20إلى\x20فيسبوك\x20أولاً.\x20هل\x20تريد\x20فتح\x20فيسبوك\x20الآن؟'});return;}USER_CONFIG['userId']=_0x123e56,bgLogInfo('autoCapture','تم\x20التعرف\x20على\x20الحساب:\x20'+_0x123e56);const _0x143a37=await chrome['tabs']['query']({'url':['*://*.facebook.com/*','*://*.web.facebook.com/*']});let _0x3f33d4=null;if(_0x143a37['length']===0x0){bgLogInfo('autoCapture','لا\x20يوجد\x20تبويب\x20فيسبوك\x20مفتوح،\x20جاري\x20فتح\x20تبويب\x20جديد...');const _0xc738e0=await chrome['tabs']['create']({'url':'https://www.facebook.com','active':!![]});_0x3f33d4=_0xc738e0['id'],await new Promise(_0x57712a=>setTimeout(_0x57712a,0x1388));}else _0x3f33d4=_0x143a37[0x0]['id'],bgLogInfo('autoCapture','تم\x20العثور\x20على\x20تبويب\x20فيسبوك\x20مفتوح:\x20'+_0x3f33d4);let _0x226f0f=await extractFbDtsg(_0x3f33d4);if(!_0x226f0f['fb_dtsg']){bgLogInfo('autoCapture','المحاولة\x201\x20فشلت\x20—\x20جاري\x20استخراج\x20DTSG\x20عبر\x20fetch\x20مباشر...');const _0x3026f4=await extractFbDtsgViaFetch();if(_0x3026f4['fb_dtsg'])_0x226f0f=_0x3026f4,bgLogInfo('autoCapture','✅\x20نجح\x20استخراج\x20DTSG\x20عبر\x20fetch');else{bgLogInfo('autoCapture','المحاولة\x202\x20فشلت\x20—\x20جاري\x20تحديث\x20صفحة\x20فيسبوك...'),await chrome['tabs']['reload'](_0x3f33d4),await new Promise(_0x351209=>setTimeout(_0x351209,0x1770));const _0x5adbbb=await extractFbDtsg(_0x3f33d4);if(_0x5adbbb['fb_dtsg'])_0x226f0f=_0x5adbbb,bgLogInfo('autoCapture','✅\x20نجح\x20استخراج\x20DTSG\x20بعد\x20إعادة\x20التحميل');else{const _0xc9cb93=await extractFbDtsgViaFetch();if(!_0xc9cb93['fb_dtsg']){_0x3fc6b0({'success':![],'error':'no_fb_dtsg','message':'لم\x20يتم\x20العثور\x20على\x20مفاتيح\x20فيسبوك.\x20تأكد\x20من\x20أنك\x20مسجل\x20الدخول\x20في\x20فيسبوك\x20بنفس\x20المتصفح\x20وأن\x20الصفحة\x20محملة\x20بالكامل.'});return;}_0x226f0f=_0xc9cb93;}}}USER_CONFIG['fb_dtsg']=_0x226f0f['fb_dtsg'],USER_CONFIG['lsd']=_0x226f0f['lsd'],chrome['storage']['local']['set']({'fb_dtsg':_0x226f0f['fb_dtsg'],'lsd':_0x226f0f['lsd'],'userId':_0x123e56}),bgLogInfo('autoCapture','✅\x20تم\x20اصطياد\x20المفاتيح\x20بنجاح\x20تلقائياً'),_0x3fc6b0({'success':!![],'userId':_0x123e56,'tabId':_0x3f33d4});});}async function uploadImage(_0xac0cfb,_0x1d2148,_0x59a0d2){return new Promise(_0x474830=>{bgLogInfo('upload','رفع\x20الصورة:\x20'+_0x59a0d2),chrome['scripting']['executeScript']({'target':{'tabId':_0xac0cfb},'func':(_0x38b99f,_0x516758,_0x3d7ae7)=>{return new Promise(_0x506a82=>{try{const _0x3301d9=atob(_0x516758['split'](',')[0x1]),_0x4ed531=_0x516758['split'](',')[0x0]['split'](':')[0x1]['split'](';')[0x0],_0x3026b6=new ArrayBuffer(_0x3301d9['length']),_0x241b8e=new Uint8Array(_0x3026b6);for(let _0x5d3531=0x0;_0x5d3531<_0x3301d9['length'];_0x5d3531++)_0x241b8e[_0x5d3531]=_0x3301d9['charCodeAt'](_0x5d3531);const _0xc96fb0=new Blob([_0x3026b6],{'type':_0x4ed531}),_0x462d1c=new FormData();_0x462d1c['append']('fb_dtsg',_0x38b99f['fb_dtsg']),_0x462d1c['append']('profile_id',_0x38b99f['userId']),_0x462d1c['append']('source','8'),_0x462d1c['append']('waterfallxapp','comet'),_0x462d1c['append']('farr',_0xc96fb0,_0x3d7ae7),_0x462d1c['append']('upload_id',_0x38b99f['upload_id']);const _0x4bdea4=(0x61a8+Math['floor'](Math['random']()*0x3e8))['toString']();_0x462d1c['append']('jazoest',_0x4bdea4);const _0x174a13='https://upload.facebook.com/ajax/react_composer/attachments/photo/upload?av='+_0x38b99f['userId']+'&__user='+_0x38b99f['userId']+'&__a=1&fb_dtsg='+_0x38b99f['fb_dtsg'];fetch(_0x174a13,{'method':'OPTIONS','credentials':'include'})['then'](()=>fetch(_0x174a13,{'method':'POST','credentials':'include','body':_0x462d1c,'headers':{'Accept':'*/*','Origin':'https://upload.facebook.com','Referer':'https://upload.facebook.com/'}}))['then'](async _0x3c89f3=>{const _0x579084=await _0x3c89f3['text']();let _0x3e6a24=null;const _0x1f05a6=_0x579084['match'](/"photoID":"(\d+)"/);if(_0x1f05a6)_0x3e6a24=_0x1f05a6[0x1];if(!_0x3e6a24){const _0x32c148=_0x579084['match'](/photoID["']\s*:\s*["'](\d+)["']/);if(_0x32c148)_0x3e6a24=_0x32c148[0x1];}if(!_0x3e6a24){const _0x474a45=_0x579084['match'](/fbid["']\s*:\s*["'](\d+)["']/);if(_0x474a45)_0x3e6a24=_0x474a45[0x1];}_0x3e6a24?_0x506a82({'success':!![],'photoId':_0x3e6a24}):_0x506a82({'success':![],'error':'لم\x20يتم\x20استخراج\x20photoID'});})['catch'](_0x20d224=>_0x506a82({'success':![],'error':_0x20d224['message']}));}catch(_0x3490e8){_0x506a82({'success':![],'error':_0x3490e8['message']});}});},'args':[USER_CONFIG,_0x1d2148,_0x59a0d2]},_0x39cd81=>{if(_0x39cd81&&_0x39cd81[0x0]&&_0x39cd81[0x0]['result'])_0x474830(_0x39cd81[0x0]['result']);else _0x474830({'success':![],'error':'فشل\x20تنفيذ\x20السكربت'});});});}async function checkPostStatus(_0x2d3027,_0x50a17a){return new Promise(_0x2c15ef=>{if(!_0x50a17a){_0x2c15ef({'isPending':![],'isPublic':![]});return;}bgLogInfo('checkStatus','فحص\x20حالة\x20المنشور:\x20'+_0x50a17a),chrome['scripting']['executeScript']({'target':{'tabId':_0x2d3027},'func':_0x4e81b4=>{return new Promise(_0x22c7a4=>{fetch(_0x4e81b4,{'credentials':'include','headers':{'Accept':'text/html'}})['then'](_0x4c2581=>_0x4c2581['text']())['then'](_0xff3860=>{const _0x4b0051=_0xff3860['includes']('pending_post')||_0xff3860['includes']('في\x20انتظار\x20موافقة\x20المسؤول')||_0xff3860['includes']('Your\x20post\x20is\x20pending')||_0xff3860['includes']('منشورك\x20في\x20الانتظار')||_0xff3860['includes']('waiting\x20for\x20admin\x20approval')||_0xff3860['includes']('pending\x20approval')||_0xff3860['includes']('قيد\x20المراجعة')||_0xff3860['includes']('تحت\x20المراجعة')||_0xff3860['includes']('في\x20انتظار\x20المراجعة'),_0x2a3084=_0xff3860['includes']('\x22reaction_count\x22')||_0xff3860['includes']('like_button')||_0xff3860['includes']('comment_list')||_0xff3860['includes']('\x22comment_count\x22'),_0x36a984=_0xff3860['includes']('pending_post_footer_title');_0x22c7a4({'isPending':_0x4b0051||_0x36a984,'isPublic':_0x2a3084&&!_0x4b0051&&!_0x36a984,'hasPendingFooter':_0x36a984});})['catch'](()=>_0x22c7a4({'isPending':![],'isPublic':![]}));});},'args':[_0x50a17a]},_0x24a22f=>{if(_0x24a22f&&_0x24a22f[0x0]&&_0x24a22f[0x0]['result']){const _0x38d39f=_0x24a22f[0x0]['result'];bgLogInfo('checkStatus','نتيجة\x20الفحص:\x20معلق='+_0x38d39f['isPending']+',\x20footer='+_0x38d39f['hasPendingFooter']),_0x2c15ef(_0x38d39f);}else _0x2c15ef({'isPending':![],'isPublic':![]});});});}async function publishToGroup(_0x2b0d43,_0x5d4f89,_0x50bcdf,_0x188103){return new Promise(_0x48b08a=>{if(!_0x188103){_0x48b08a({'success':![],'error':'لم\x20يتم\x20تحديد\x20المجموعة'});return;}const _0x3e089a=_0x50bcdf&&_0x50bcdf['length']>0x0,_0x4c9cae=_0x3e089a?USER_CONFIG['doc_id_post_photo']:USER_CONFIG['doc_id_post_text'];bgLogInfo('publish','نشر\x20في:\x20'+_0x188103+'\x20('+(_0x3e089a?'مع\x20صور':'نص\x20فقط')+')'),chrome['scripting']['executeScript']({'target':{'tabId':_0x2b0d43},'func':(_0x4d132f,_0x1dd120,_0x29668e,_0x2e1828,_0x3ead20)=>{return new Promise(_0x504c13=>{const _0x53b16e=_0x29668e&&_0x29668e['length']>0x0,_0x4a7cda={'input':{'source':'WWW','attachments':_0x53b16e?_0x29668e['map'](_0x4f8588=>({'photo':{'id':_0x4f8588}})):[],'message':{'ranges':[],'text':_0x1dd120||''},'inline_activities':[],'explicit_place_id':'0','tracking':[null],'audience':{'to_id':_0x2e1828},'actor_id':_0x4d132f['userId'],'client_mutation_id':(Date['now']()+Math['floor'](Math['random']()*0xf4240))['toString']()}},_0x3eb40e=new FormData();_0x3eb40e['append']('av',_0x4d132f['userId']),_0x3eb40e['append']('__user',_0x4d132f['userId']),_0x3eb40e['append']('__a','1'),_0x3eb40e['append']('fb_dtsg',_0x4d132f['fb_dtsg']),_0x3eb40e['append']('variables',JSON['stringify'](_0x4a7cda)),_0x3eb40e['append']('doc_id',_0x3ead20),_0x3eb40e['append']('jazoest',_0x4d132f['jazoest']);const _0x21a9ce=Math['floor'](Math['random']()*(0xbb8-0x3e8+0x1))+0x3e8;new Promise(_0x1b75a1=>setTimeout(_0x1b75a1,_0x21a9ce))['then'](()=>fetch('https://www.facebook.com/api/graphql/',{'method':'OPTIONS','credentials':'include','headers':{'Accept':'*/*','Origin':'https://www.facebook.com','Referer':'https://www.facebook.com/groups/'+_0x2e1828+'/'}}))['then'](()=>fetch('https://www.facebook.com/api/graphql/',{'method':'POST','credentials':'include','body':_0x3eb40e,'headers':{'Accept':'*/*','Origin':'https://www.facebook.com','Referer':'https://www.facebook.com/groups/'+_0x2e1828+'/'}}))['then'](_0x2584bf=>_0x2584bf['text']())['then'](_0x14817f=>{let _0x24d44d=null,_0xe64cf4=null,_0x5c6345=null;const _0x5b89ca=_0x14817f['match'](/"legacy_story_hideable_id":"(\d+)"/);_0x5b89ca&&(_0xe64cf4=_0x5b89ca[0x1],_0x5c6345='https://www.facebook.com/groups/'+_0x2e1828+'/posts/'+_0xe64cf4+'/');if(!_0xe64cf4){const _0x193eb9=_0x14817f['match'](/"story_id":"([^"]+)"/);_0x193eb9&&(_0x24d44d=_0x193eb9[0x1],_0x5c6345='https://www.facebook.com/groups/'+_0x2e1828+'/permalink/'+_0x24d44d+'/');}if(!_0xe64cf4&&!_0x24d44d){const _0x2117de=_0x14817f['match'](/"story":\s*\{\s*"id":\s*"([^"]+)"/);_0x2117de&&(_0x24d44d=_0x2117de[0x1],_0x5c6345='https://www.facebook.com/groups/'+_0x2e1828+'/permalink/'+_0x24d44d+'/');}if(!_0x5c6345){const _0x7ec12a=_0x14817f['match'](/"url":"([^"]+)\/posts\/(\d+)\/"/);_0x7ec12a&&(_0x5c6345=_0x7ec12a[0x0]['replace'](/.*"url":"/,'')['replace'](/".*/,''),_0x5c6345=_0x5c6345['replace'](/\\\//g,'/'));}const _0x925c85=_0x14817f['includes']('\x22story_id\x22')||_0x14817f['includes']('\x22story\x22')||_0x14817f['includes']('\x22legacy_story_hideable_id\x22'),_0x234d6c=_0x14817f['includes']('pending_post_footer_title')||_0x14817f['includes']('/pending_posts/');let _0x2a6951=![],_0x20d21b=![];if(_0x5c6345)_0x2a6951=!![],_0x20d21b=![];else{if(_0x925c85)_0x2a6951=!![],_0x20d21b=!![];else _0x234d6c?(_0x2a6951=![],_0x20d21b=!![]):(_0x2a6951=![],_0x20d21b=![]);}_0x504c13({'success':_0x2a6951,'pending':_0x20d21b,'story_id':_0xe64cf4||_0x24d44d,'post_url':_0x5c6345,'raw_response':_0x14817f['substring'](0x0,0x1f4)});})['catch'](_0x31fb6c=>_0x504c13({'success':![],'pending':![],'error':_0x31fb6c['message'],'post_url':null}));});},'args':[USER_CONFIG,_0x5d4f89,_0x50bcdf,_0x188103,_0x4c9cae]},_0x3689f0=>{if(_0x3689f0&&_0x3689f0[0x0])_0x48b08a(_0x3689f0[0x0]['result']);else _0x48b08a({'success':![],'error':'فشل\x20تنفيذ\x20النشر','post_url':null});});});}async function fetchAllGroups(_0x32a1f6){return new Promise(_0x28285d=>{let _0x529030=new Map(),_0x3b9744=null,_0x168e92=0x14,_0x8fe240=0x0,_0x35172b=null;const _0x5a1c1f=()=>{_0x8fe240++;if(_0x8fe240>_0x168e92){const _0x416bed=Array['from'](_0x529030['values']());_0x416bed['sort']((_0x441744,_0x25ecca)=>_0x441744['isAdmin']===_0x25ecca['isAdmin']?0x0:_0x441744['isAdmin']?-0x1:0x1),_0x28285d({'groups':_0x416bed});return;}chrome['scripting']['executeScript']({'target':{'tabId':_0x32a1f6},'func':(_0xf230dc,_0x2c1483,_0x282e32,_0x21314a)=>{return new Promise(_0x2a75c2=>{const _0x997e11=new URLSearchParams();_0x997e11['append']('fb_dtsg',_0xf230dc),_0x997e11['append']('av',_0x2c1483);if(_0x282e32)_0x997e11['append']('lsd',_0x282e32);_0x997e11['append']('__req','1'),_0x997e11['append']('fb_api_caller_class','RelayModern'),_0x997e11['append']('fb_api_req_friendly_name','CometGroupsListQuery'),_0x997e11['append']('variables',JSON['stringify']({'adminGroupsCount':0x5a,'memberGroupsCount':0x1388,'scale':1.5,'count':0x32,'cursor':_0x21314a})),_0x997e11['append']('doc_id','3884641628300421'),fetch('https://www.facebook.com/api/graphql/',{'method':'POST','headers':{'Content-Type':'application/x-www-form-urlencoded'},'credentials':'include','body':_0x997e11['toString']()})['then'](_0x284ad3=>_0x284ad3['json']())['then'](_0x1a4ec8=>{const _0x39ea9e=[],_0x1f2d43=_0x47a6a9=>_0x47a6a9?.['image']?.['uri']||_0x47a6a9?.['profile_picture']?.['uri']||'';_0x1a4ec8['data']?.['adminGroups']?.['groups_tab']?.['tab_groups_list']?.['edges']&&_0x1a4ec8['data']['adminGroups']['groups_tab']['tab_groups_list']['edges']['forEach'](_0x7f0a03=>{const _0x5c938b=_0x7f0a03['node'];if(_0x5c938b&&_0x5c938b['id'])_0x39ea9e['push']({'name':_0x5c938b['name'],'id':_0x5c938b['id'],'image':_0x1f2d43(_0x5c938b),'url':'https://www.facebook.com/groups/'+_0x5c938b['id'],'isAdmin':!![]});});_0x1a4ec8['data']?.['viewer']?.['groups']?.['edges']&&_0x1a4ec8['data']['viewer']['groups']['edges']['forEach'](_0x327e3d=>{const _0x1e6295=_0x327e3d['node'];if(_0x1e6295&&_0x1e6295['id'])_0x39ea9e['push']({'name':_0x1e6295['name'],'id':_0x1e6295['id'],'image':_0x1f2d43(_0x1e6295),'url':'https://www.facebook.com/groups/'+_0x1e6295['id'],'isAdmin':![]});});_0x1a4ec8['data']?.['nonAdminGroups']?.['groups_tab']?.['tab_groups_list']?.['edges']&&_0x1a4ec8['data']['nonAdminGroups']['groups_tab']['tab_groups_list']['edges']['forEach'](_0x1eb408=>{const _0x25bd19=_0x1eb408['node'];if(_0x25bd19&&_0x25bd19['id'])_0x39ea9e['push']({'name':_0x25bd19['name'],'id':_0x25bd19['id'],'image':_0x1f2d43(_0x25bd19),'url':'https://www.facebook.com/groups/'+_0x25bd19['id'],'isAdmin':![]});});let _0x30ca3f=null;if(_0x1a4ec8['data']?.['viewer']?.['groups']?.['page_info']?.['end_cursor'])_0x30ca3f=_0x1a4ec8['data']['viewer']['groups']['page_info']['end_cursor'];if(_0x1a4ec8['data']?.['nonAdminGroups']?.['groups_tab']?.['tab_groups_list']?.['page_info']?.['end_cursor'])_0x30ca3f=_0x1a4ec8['data']['nonAdminGroups']['groups_tab']['tab_groups_list']['page_info']['end_cursor'];if(_0x1a4ec8['data']?.['adminGroups']?.['groups_tab']?.['tab_groups_list']?.['page_info']?.['end_cursor'])_0x30ca3f=_0x1a4ec8['data']['adminGroups']['groups_tab']['tab_groups_list']['page_info']['end_cursor'];_0x2a75c2({'groups':_0x39ea9e,'nextCursor':_0x30ca3f,'hasMore':_0x30ca3f&&_0x30ca3f!==_0x21314a});})['catch'](_0x4a7782=>_0x2a75c2({'error':_0x4a7782['message']}));});},'args':[USER_CONFIG['fb_dtsg'],USER_CONFIG['userId'],USER_CONFIG['lsd']||'',_0x3b9744]},_0x532d1f=>{if(_0x532d1f&&_0x532d1f[0x0]&&_0x532d1f[0x0]['result']){const _0x24465a=_0x532d1f[0x0]['result'];_0x24465a['groups']&&_0x24465a['groups']['forEach'](_0x253a9a=>{if(!_0x529030['has'](_0x253a9a['id']))_0x529030['set'](_0x253a9a['id'],_0x253a9a);});const _0x269641=_0x24465a['hasMore']&&_0x24465a['nextCursor']&&_0x24465a['nextCursor']!==_0x35172b;if(_0x269641&&_0x8fe240<_0x168e92)_0x35172b=_0x3b9744,_0x3b9744=_0x24465a['nextCursor'],setTimeout(()=>_0x5a1c1f(),0x1f4);else{const _0x7d516d=Array['from'](_0x529030['values']());_0x7d516d['sort']((_0x1fca8e,_0x37c3a1)=>_0x1fca8e['isAdmin']===_0x37c3a1['isAdmin']?0x0:_0x1fca8e['isAdmin']?-0x1:0x1),_0x28285d({'groups':_0x7d516d});}}else{const _0x2d71c0=Array['from'](_0x529030['values']());_0x2d71c0['sort']((_0x22d572,_0x545c29)=>_0x22d572['isAdmin']===_0x545c29['isAdmin']?0x0:_0x22d572['isAdmin']?-0x1:0x1),_0x28285d({'groups':_0x2d71c0});}});};_0x5a1c1f();});}async function publishToOneGroup(_0x3bfd86,_0x41c537,_0x283118){return new Promise(async _0x2f0d5e=>{const _0x2bfa89='https://www.facebook.com/groups/'+_0x3bfd86+'/';bgLogInfo('publishOne','فتح\x20تبويب:\x20'+_0x2bfa89),chrome['tabs']['create']({'url':_0x2bfa89,'active':![]},async _0x5180b4=>{const _0x385c90=_0x5180b4['id'];currentPublishTabId=_0x385c90;let _0x8530ba=![],_0x5d6f14=![];const _0x340edd=_0x2b79a8=>{if(_0x2b79a8!==_0x385c90)return;chrome['tabs']['onRemoved']['removeListener'](_0x340edd),_0x8530ba=!![],currentPublishTabId=null,!_0x5d6f14&&(_0x5d6f14=!![],bgLogInfo('publishOne','⚠️\x20تم\x20إغلاق\x20تبويب\x20فيسبوك\x20من\x20قبل\x20المستخدم'),_0x2f0d5e({'success':![],'error':'أغلق\x20المستخدم\x20تبويب\x20فيسبوك','tabClosed':!![],'post_url':null}));};chrome['tabs']['onRemoved']['addListener'](_0x340edd);const _0x4d8e37=async _0x53ca8a=>{const _0x36bcce=0x1f4;let _0x3e3e8a=0x0;while(_0x3e3e8a<_0x53ca8a){if(publishCancelled||_0x8530ba)return;await new Promise(_0x2efa60=>setTimeout(_0x2efa60,Math['min'](_0x36bcce,_0x53ca8a-_0x3e3e8a))),_0x3e3e8a+=_0x36bcce;}},_0x2dca3a=Math['floor'](Math['random']()*(0x4e20-0x1f40+0x1))+0x1f40;bgLogInfo('publishOne','⏳\x20انتظار\x20'+_0x2dca3a/0x3e8+'\x20ثانية\x20قبل\x20بدء\x20النشر...'),await _0x4d8e37(_0x2dca3a);if(_0x8530ba||publishCancelled){chrome['tabs']['onRemoved']['removeListener'](_0x340edd);!publishCancelled&&!_0x5d6f14&&(_0x5d6f14=!![],chrome['tabs']['remove'](_0x385c90,()=>{}),currentPublishTabId=null,_0x2f0d5e({'success':![],'error':'تم\x20الإلغاء','post_url':null}));return;}let _0x453de1=[];if(!publishCancelled&&!_0x8530ba&&_0x283118&&_0x283118['length']>0x0)for(let _0x303a3a=0x0;_0x303a3a<_0x283118['length'];_0x303a3a++){if(publishCancelled||_0x8530ba)break;const _0x55756f=_0x283118[_0x303a3a],_0x7cd524=await uploadImage(_0x385c90,_0x55756f['data'],_0x55756f['name']);_0x7cd524['success']&&_0x7cd524['photoId']&&(_0x453de1['push'](_0x7cd524['photoId']),bgLogInfo('publishOne','✅\x20تم\x20رفع\x20الصورة:\x20'+_0x7cd524['photoId']));if(_0x303a3a<_0x283118['length']-0x1)await _0x4d8e37(0x5dc);}if(_0x8530ba||publishCancelled){chrome['tabs']['onRemoved']['removeListener'](_0x340edd);!_0x5d6f14&&(_0x5d6f14=!![],chrome['tabs']['remove'](_0x385c90,()=>{}),currentPublishTabId=null,_0x2f0d5e({'success':![],'error':'تم\x20الإلغاء','post_url':null}));return;}if(_0x453de1['length']>0x0)await _0x4d8e37(0x7d0);if(_0x8530ba||publishCancelled){chrome['tabs']['onRemoved']['removeListener'](_0x340edd);!_0x5d6f14&&(_0x5d6f14=!![],chrome['tabs']['remove'](_0x385c90,()=>{}),currentPublishTabId=null,_0x2f0d5e({'success':![],'error':'تم\x20الإلغاء','post_url':null}));return;}const _0x4c06d0=await publishToGroup(_0x385c90,_0x41c537,_0x453de1,_0x3bfd86);if(_0x8530ba){chrome['tabs']['onRemoved']['removeListener'](_0x340edd);return;}if(_0x4c06d0['success']&&_0x4c06d0['post_url']){bgLogInfo('publishOne','🔗\x20رابط\x20المنشور:\x20'+_0x4c06d0['post_url']),await _0x4d8e37(0x7d0);if(!_0x8530ba){const _0x4713bf=await checkPostStatus(_0x385c90,_0x4c06d0['post_url']);_0x4713bf['isPending']?(_0x4c06d0['pending']=!![],bgLogInfo('publishOne','🟠\x20المنشور\x20معلق\x20(قيد\x20المراجعة)')):(_0x4c06d0['pending']=![],bgLogInfo('publishOne','✅\x20المنشور\x20منشور\x20فعلاً'));}}chrome['tabs']['onRemoved']['removeListener'](_0x340edd),setTimeout(()=>{chrome['tabs']['remove'](_0x385c90,()=>{});},0xbb8),currentPublishTabId=null,!_0x5d6f14&&(_0x5d6f14=!![],_0x2f0d5e(_0x4c06d0));});});}function isRealAppUrl(_0x19ba5b){if(!_0x19ba5b)return![];try{const _0x5690e5=new URL(_0x19ba5b);return _0x5690e5['pathname']==='/app'||_0x5690e5['pathname']['startsWith']('/app/')||_0x5690e5['pathname']['startsWith']('/app?');}catch{return _0x19ba5b['includes']('/app');}}chrome['runtime']['onMessage']['addListener']((_0x580bda,_0x1f28e2,_0x465786)=>{_0x1f28e2['tab']&&_0x1f28e2['tab']['id']&&(appTabId=_0x1f28e2['tab']['id'],_0x1f28e2['tab']['url']&&isRealAppUrl(_0x1f28e2['tab']['url'])&&(chrome['storage']['local']['set']({'appUrl':_0x1f28e2['tab']['url']}),bgLogInfo('connection','تم\x20حفظ\x20appUrl:\x20'+_0x1f28e2['tab']['url'])),bgLogInfo('connection','تم\x20تحديث\x20appTabId\x20إلى:\x20'+appTabId));if(_0x580bda['action']==='registerAppUrl'){if(_0x580bda['url']&&isRealAppUrl(_0x580bda['url']))chrome['storage']['local']['set']({'appUrl':_0x580bda['url']}),bgLogInfo('registerAppUrl','تم\x20حفظ\x20رابط\x20الأداة:\x20'+_0x580bda['url']);else _0x580bda['url']&&bgLogInfo('registerAppUrl','تم\x20تجاهل\x20رابط\x20صفحة\x20الهبوط:\x20'+_0x580bda['url']);return _0x465786({'success':!![]}),!![];}if(_0x580bda['action']==='getGroups')return((async()=>{bgLogInfo('getGroups','بدء\x20عملية\x20جلب\x20المجموعات\x20التلقائية');appTabId?chrome['tabs']['sendMessage'](appTabId,{'action':'groupsProgress','status':'checking','message':'جاري\x20التحقق\x20من\x20تسجيل\x20الدخول\x20إلى\x20فيسبوك...'})['catch'](()=>{}):chrome['runtime']['sendMessage']({'action':'groupsProgress','status':'checking','message':'جاري\x20التحقق\x20من\x20تسجيل\x20الدخول\x20إلى\x20فيسبوك...'})['catch'](()=>{});const _0x195a12=await ensureFacebookAndCaptureKeys();if(!_0x195a12['success']){const _0x586d69=_0x195a12['error']==='not_logged_in'?{'action':'needFacebookLogin','message':_0x195a12['message']}:{'action':'groupsProgress','status':'error','message':_0x195a12['message']};appTabId?chrome['tabs']['sendMessage'](appTabId,_0x586d69)['catch'](()=>{}):chrome['runtime']['sendMessage'](_0x586d69)['catch'](()=>{});_0x465786({'success':![],'error':_0x195a12['error'],'message':_0x195a12['message']});return;}const _0xaa237f={'action':'groupsProgress','status':'capturing','message':'تم\x20اصطياد\x20المفاتيح\x20بنجاح،\x20جاري\x20جلب\x20المجموعات...'};appTabId?chrome['tabs']['sendMessage'](appTabId,_0xaa237f)['catch'](()=>{}):chrome['runtime']['sendMessage'](_0xaa237f)['catch'](()=>{});const _0x36c92b=await fetchAllGroups(_0x195a12['tabId']);if(_0x36c92b['groups']&&_0x36c92b['groups']['length']>0x0){bgLogInfo('getGroups','تم\x20جلب\x20'+_0x36c92b['groups']['length']+'\x20مجموعة');const _0x384af5={'action':'groupsProgress','status':'complete','message':'تم\x20جلب\x20'+_0x36c92b['groups']['length']+'\x20مجموعة\x20بنجاح'};appTabId?chrome['tabs']['sendMessage'](appTabId,_0x384af5)['catch'](()=>{}):chrome['runtime']['sendMessage'](_0x384af5)['catch'](()=>{}),_0x465786({'success':!![],'groups':_0x36c92b['groups'],'userId':_0x195a12['userId']});}else{const _0x4684e6={'action':'groupsProgress','status':'error','message':'لم\x20يتم\x20العثور\x20على\x20مجموعات'};appTabId?chrome['tabs']['sendMessage'](appTabId,_0x4684e6)['catch'](()=>{}):chrome['runtime']['sendMessage'](_0x4684e6)['catch'](()=>{}),_0x465786({'success':![],'error':'no_groups','message':'لم\x20يتم\x20العثور\x20على\x20مجموعات'});}})()),!![];if(_0x580bda['action']==='openFacebook')return chrome['tabs']['create']({'url':'https://www.facebook.com','active':!![]},()=>{_0x465786({'success':!![]});}),!![];if(_0x580bda['action']==='removePublishImage'){const _0x2d7722=_0x580bda['index'];return typeof _0x2d7722==='number'&&_0x2d7722>=0x0&&_0x2d7722{}),currentPublishTabId=null),_0x465786({'success':!![]}),!![];if(_0x580bda['action']==='getPublishStatus')return _0x465786({'isPublishing':isPublishingNow}),!![];if(_0x580bda['action']==='publishToGroup')return((async()=>{await storageReady;if(!USER_CONFIG['fb_dtsg']||!USER_CONFIG['userId']){_0x465786({'success':![],'error':'الرجاء\x20جلب\x20المجموعات\x20أولاً\x20ليتم\x20التحقق\x20من\x20الحساب\x20تلقائياً'});return;}if(!_0x580bda['groupId']){_0x465786({'success':![],'error':'الرجاء\x20اختيار\x20مجموعة'});return;}publishCancelled=![],isPublishingNow=!![],chrome['storage']['local']['set']({'publishCancelled':![]});const _0xe5a1ad=await publishToOneGroup(_0x580bda['groupId'],_0x580bda['text']||'',_0x580bda['images']||[]);isPublishingNow=![],_0x465786(_0xe5a1ad);})()),!![];if(_0x580bda['action']==='publishToMultipleGroups')return((async()=>{await storageReady;if(isPublishingNow){_0x465786({'success':![],'error':'النشر\x20جارٍ\x20بالفعل،\x20يرجى\x20الانتظار'});return;}if(!USER_CONFIG['fb_dtsg']||!USER_CONFIG['userId']){_0x465786({'success':![],'error':'الرجاء\x20جلب\x20المجموعات\x20أولاً\x20ليتم\x20التحقق\x20من\x20الحساب\x20تلقائياً'});return;}if(!_0x580bda['groupIds']||_0x580bda['groupIds']['length']===0x0){_0x465786({'success':![],'error':'الرجاء\x20اختيار\x20مجموعة\x20واحدة\x20على\x20الأقل'});return;}publishCancelled=![],isPublishingNow=!![],chrome['storage']['local']['set']({'publishCancelled':![]});const _0x16f3b6=_0x580bda['groupIds'],_0x1b00b6=_0x580bda['text']||'';activePublishImages=JSON['parse'](JSON['stringify'](_0x580bda['images']||[])),bgLogInfo('multiPublish','بدء\x20النشر\x20في\x20'+_0x16f3b6['length']+'\x20مجموعة'),_0x465786({'success':!![],'started':!![],'total':_0x16f3b6['length']});const _0x5272ff=_0x56f50b=>{appTabId?chrome['tabs']['sendMessage'](appTabId,_0x56f50b)['catch'](()=>{}):chrome['runtime']['sendMessage'](_0x56f50b)['catch'](()=>{});};for(let _0x454bee=0x0;_0x454bee<_0x16f3b6['length'];_0x454bee++){if(publishCancelled){bgLogInfo('multiPublish','🛑\x20تم\x20إلغاء\x20النشر\x20عند\x20المجموعة\x20'+(_0x454bee+0x1)),_0x5272ff({'action':'publishStopped','doneCount':_0x454bee,'total':_0x16f3b6['length']});break;}const _0x186456=_0x16f3b6[_0x454bee];bgLogInfo('multiPublish','نشر\x20'+(_0x454bee+0x1)+'/'+_0x16f3b6['length']+'\x20في:\x20'+_0x186456),_0x5272ff({'action':'publishProgress','current':_0x454bee+0x1,'total':_0x16f3b6['length'],'groupId':_0x186456,'status':'publishing'});const _0x134701=await publishToOneGroup(_0x186456,_0x1b00b6,[...activePublishImages]);if(publishCancelled){_0x5272ff({'action':'publishStopped','doneCount':_0x454bee+(_0x134701['success']?0x1:0x0),'total':_0x16f3b6['length']});break;}let _0x3f27ed='failed';_0x134701['success']&&(_0x3f27ed=_0x134701['pending']?'pending':'success');_0x5272ff({'action':'publishProgress','current':_0x454bee+0x1,'total':_0x16f3b6['length'],'groupId':_0x186456,'status':_0x3f27ed,'pending':_0x134701['pending']||![],'error':_0x134701['error']||null,'postUrl':_0x134701['post_url']||null});if(_0x454bee<_0x16f3b6['length']-0x1&&!publishCancelled){const _0x591c47=_0x580bda['delayConfig'],_0x5a75d4=_0x591c47&&_0x591c47['mode']==='fixed'&&_0x591c47['seconds']>0x0?Math['max'](0xa,Math['floor'](_0x591c47['seconds'])):randomDelay();bgLogInfo('multiPublish','⏳\x20انتظار\x20'+_0x5a75d4+'\x20ثانية\x20قبل\x20المجموعة\x20التالية');for(let _0x4d1bab=_0x5a75d4;_0x4d1bab>0x0;_0x4d1bab--){if(publishCancelled)break;_0x5272ff({'action':'publishCountdown','seconds':_0x4d1bab,'totalDelay':_0x5a75d4,'nextGroup':_0x454bee+0x2,'total':_0x16f3b6['length']}),await new Promise(_0x32d2e7=>setTimeout(_0x32d2e7,0x3e8));}}}!publishCancelled&&(_0x5272ff({'action':'publishComplete','total':_0x16f3b6['length']}),bgLogInfo('multiPublish','✅\x20اكتمل\x20النشر\x20في\x20'+_0x16f3b6['length']+'\x20مجموعة')),isPublishingNow=![],publishCancelled=![],chrome['storage']['local']['set']({'publishCancelled':![]});})()),!![];}),chrome['action']['onClicked']['addListener'](async()=>{if(appTabId!==null)try{const _0x1f1c4d=await chrome['tabs']['get'](appTabId);await chrome['tabs']['update'](appTabId,{'active':!![]});if(_0x1f1c4d['windowId'])chrome['windows']['update'](_0x1f1c4d['windowId'],{'focused':!![]});bgLogInfo('onClicked','تم\x20التركيز\x20على\x20تبويب\x20الأداة\x20الموجود');return;}catch{appTabId=null;}const _0x1c99f5=await chrome['storage']['local']['get']('appUrl');if(_0x1c99f5['appUrl']&&isRealAppUrl(_0x1c99f5['appUrl'])){const _0x261c04=await chrome['tabs']['query']({'url':_0x1c99f5['appUrl']['replace'](/#.*$/,'')+'*'});if(_0x261c04['length']>0x0&&_0x261c04[0x0]['id']){appTabId=_0x261c04[0x0]['id'],await chrome['tabs']['update'](_0x261c04[0x0]['id'],{'active':!![]});if(_0x261c04[0x0]['windowId'])chrome['windows']['update'](_0x261c04[0x0]['windowId'],{'focused':!![]});bgLogInfo('onClicked','تم\x20التركيز\x20على\x20تبويب\x20موجود\x20عبر\x20appUrl');}else chrome['tabs']['create']({'url':_0x1c99f5['appUrl']}),bgLogInfo('onClicked','تم\x20فتح\x20تبويب\x20جديد\x20بالرابط\x20المحفوظ');return;}const _0x5c625b=await chrome['tabs']['query']({'url':['*://*.replit.app/app','*://*.replit.app/app/*','*://*.replit.dev/app','*://*.replit.dev/app/*','http://localhost/app','http://localhost/app/*']});if(_0x5c625b['length']>0x0&&_0x5c625b[0x0]['id']){appTabId=_0x5c625b[0x0]['id'],await chrome['tabs']['update'](_0x5c625b[0x0]['id'],{'active':!![]});if(_0x5c625b[0x0]['windowId'])chrome['windows']['update'](_0x5c625b[0x0]['windowId'],{'focused':!![]});bgLogInfo('onClicked','تم\x20التركيز\x20على\x20تبويب\x20/app\x20المفتوح');}else bgLogInfo('onClicked','لا\x20يوجد\x20تبويب\x20مفتوح\x20—\x20فتح\x20الرابط\x20الافتراضي:\x20'+DEFAULT_APP_URL),chrome['tabs']['create']({'url':DEFAULT_APP_URL});}); \ No newline at end of file diff --git a/artifacts/fb-publisher/public/extension/bridge.js b/artifacts/fb-publisher/public/extension/bridge.js new file mode 100644 index 0000000000000000000000000000000000000000..6acd4b73f7d1c0177e44351a4c411d82d883ed19 --- /dev/null +++ b/artifacts/fb-publisher/public/extension/bridge.js @@ -0,0 +1 @@ +(function(){const _0x31afb7='fbpub-bridge',_0x1e77ff='fbpub-web';console['log']('[Bridge]\x20Loaded\x20v'+chrome['runtime']['getManifest']()['version']),window['addEventListener']('message',_0x31d291=>{if(_0x31d291['source']!==window)return;const _0xd03a3=_0x31d291['data'];if(!_0xd03a3||_0xd03a3['source']!==_0x1e77ff)return;const {requestId:_0x353843,action:_0x1152cb,payload:_0x4a5f3f}=_0xd03a3;console['log']('[Bridge]\x20Message\x20from\x20web:',_0x1152cb,_0x4a5f3f);if(_0x1152cb==='ping'){window['postMessage']({'source':_0x31afb7,'requestId':_0x353843,'response':{'installed':!![],'version':chrome['runtime']['getManifest']()['version']}},'*');return;}chrome['runtime']['sendMessage']({'action':_0x1152cb,..._0x4a5f3f||{}},_0x4cc6a3=>{console['log']('[Bridge]\x20Response\x20from\x20bg\x20for\x20'+_0x1152cb+':',_0x4cc6a3),window['postMessage']({'source':_0x31afb7,'requestId':_0x353843,'response':_0x4cc6a3??{'success':![],'error':'no\x20response'},'error':chrome['runtime']['lastError']?chrome['runtime']['lastError']['message']:null},'*');});}),chrome['runtime']['onMessage']['addListener'](_0x4d3c36=>{console['log']('[Bridge]\x20Broadcast\x20from\x20bg:',_0x4d3c36),window['postMessage']({'source':_0x31afb7,'broadcast':!![],'message':_0x4d3c36},'*');}),window['postMessage']({'source':_0x31afb7,'event':'ready','version':chrome['runtime']['getManifest']()['version']},'*');const _0x4163b8=window['location']['pathname'];(_0x4163b8==='/app'||_0x4163b8['startsWith']('/app/')||_0x4163b8['startsWith']('/app?'))&&chrome['runtime']['sendMessage']({'action':'registerAppUrl','url':window['location']['href']});}()); \ No newline at end of file diff --git a/artifacts/fb-publisher/public/extension/fb-publisher-bridge.zip b/artifacts/fb-publisher/public/extension/fb-publisher-bridge.zip new file mode 100644 index 0000000000000000000000000000000000000000..fbb2d62d407c6a2c8303219e36b07a58f6e13967 --- /dev/null +++ b/artifacts/fb-publisher/public/extension/fb-publisher-bridge.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e6a381ae0192da7cd4789fd69abf7ee7dac65ee7bd0306e3107e09d787958ad +size 36984 diff --git a/artifacts/fb-publisher/public/extension/icon-128.png b/artifacts/fb-publisher/public/extension/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..98c2c3513729696f53874f230a83652180ccba2c Binary files /dev/null and b/artifacts/fb-publisher/public/extension/icon-128.png differ diff --git a/artifacts/fb-publisher/public/extension/manifest.json b/artifacts/fb-publisher/public/extension/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..ba5b0b4d9e673f2bbbc6d2c3a5cee776e6961c6f --- /dev/null +++ b/artifacts/fb-publisher/public/extension/manifest.json @@ -0,0 +1,43 @@ +{ + "manifest_version": 3, + "name": "FB Group Publisher PRO Bridge", + "version": "1.6.0", + "description": "Bridge extension for FB Group Publisher PRO web app", + "icons": { + "128": "icon-128.png" + }, + "action": { + "default_icon": { + "128": "icon-128.png" + } + }, + "permissions": [ + "tabs", + "storage", + "cookies", + "scripting", + "notifications" + ], + "host_permissions": [ + "https://*.facebook.com/*", + "https://upload.facebook.com/*" + ], + "background": { + "service_worker": "background.js" + }, + "content_scripts": [ + { + "matches": [ + "https://*.replit.app/*", + "https://*.replit.dev/*", + "https://*.repl.co/*", + "http://localhost/*" + ], + "js": [ + "bridge.js" + ], + "run_at": "document_start", + "all_frames": false + } + ] +} diff --git a/artifacts/fb-publisher/public/extension/popup.html b/artifacts/fb-publisher/public/extension/popup.html new file mode 100644 index 0000000000000000000000000000000000000000..ffe063ac40142e601b7d5b2b99e57fcd71132543 --- /dev/null +++ b/artifacts/fb-publisher/public/extension/popup.html @@ -0,0 +1,162 @@ + + + + + FB Group Publisher PRO + + + +
+ icon +
+
FB Group Publisher PRO
+
إضافة المزامنة
+
+
+ +
+
+
+
+ جاهز + لا يوجد نشر نشط حالياً +
+
+ + + +
+ + + + + + diff --git a/artifacts/fb-publisher/public/extension/popup.js b/artifacts/fb-publisher/public/extension/popup.js new file mode 100644 index 0000000000000000000000000000000000000000..3f81723956227a0a533f4939ef60cd26c5a03c24 --- /dev/null +++ b/artifacts/fb-publisher/public/extension/popup.js @@ -0,0 +1,82 @@ +(function () { + const dot = document.getElementById('dot'); + const titleEl = document.getElementById('statusTitle'); + const subEl = document.getElementById('statusSub'); + const btnStop = document.getElementById('btnStop'); + const btnOpen = document.getElementById('btnOpen'); + + let isPublishing = false; + let pollTimer = null; + + function setIdle() { + isPublishing = false; + dot.className = 'dot idle'; + titleEl.textContent = 'جاهز'; + subEl.textContent = 'لا يوجد نشر نشط حالياً'; + btnStop.classList.add('hidden'); + } + + function setActive() { + isPublishing = true; + dot.className = 'dot active'; + titleEl.textContent = 'جارٍ النشر…'; + subEl.textContent = 'اضغط إيقاف لإنهاء العملية'; + btnStop.classList.remove('hidden'); + } + + function setStopped() { + isPublishing = false; + dot.className = 'dot stopped'; + titleEl.textContent = 'تم الإيقاف'; + subEl.textContent = 'تم إيقاف النشر بنجاح'; + btnStop.classList.add('hidden'); + } + + function checkStatus() { + chrome.runtime.sendMessage({ action: 'getPublishStatus' }, (res) => { + if (chrome.runtime.lastError) return; + if (res && res.isPublishing) { + setActive(); + } else if (!isPublishing) { + setIdle(); + } + }); + } + + function stopPublishing() { + chrome.runtime.sendMessage({ action: 'stopPublishing' }, (res) => { + if (chrome.runtime.lastError) return; + if (res && res.success) setStopped(); + }); + } + + btnStop.addEventListener('click', stopPublishing); + + btnOpen.addEventListener('click', () => { + chrome.storage.local.get('appUrl', (data) => { + const url = (data && data.appUrl) || 'https://social-media-bridge-s2555.replit.app/app'; + chrome.tabs.query({ url: url.replace(/#.*$/, '') + '*' }, (tabs) => { + if (tabs && tabs.length > 0) { + chrome.tabs.update(tabs[0].id, { active: true }); + if (tabs[0].windowId) chrome.windows.update(tabs[0].windowId, { focused: true }); + } else { + chrome.tabs.create({ url: url }); + } + }); + }); + window.close(); + }); + + window.addEventListener('pagehide', () => { + if (isPublishing) { + chrome.runtime.sendMessage({ action: 'stopPublishing' }); + } + }); + + checkStatus(); + pollTimer = setInterval(checkStatus, 2000); + + window.addEventListener('unload', () => { + clearInterval(pollTimer); + }); +})(); diff --git a/artifacts/fb-publisher/public/extension/src/.gitignore b/artifacts/fb-publisher/public/extension/src/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..619be26f5e6b47ecd53862f73075c1cfe5f9e223 --- /dev/null +++ b/artifacts/fb-publisher/public/extension/src/.gitignore @@ -0,0 +1,2 @@ +# الكود المصدري الأصلي — لا يُرفع للـ Git +*.source.js diff --git a/artifacts/fb-publisher/public/extension/src/background.source.js b/artifacts/fb-publisher/public/extension/src/background.source.js new file mode 100644 index 0000000000000000000000000000000000000000..9986b415f425eaf6dc980a76678f3dd27131f1df --- /dev/null +++ b/artifacts/fb-publisher/public/extension/src/background.source.js @@ -0,0 +1,678 @@ +// ========== رابط التطبيق الافتراضي (محدّث لـ Hugging Face) ========== +const DEFAULT_APP_URL = 'https://sare26-fb-publisher-backend.hf.space/app'; + +// ========== نطاق التطبيق الموثوق ========== +const APP_ORIGIN = 'https://sare26-fb-publisher-backend.hf.space'; + +// ========== نظام مراقبة الأخطاء ========== +function bgLogError(source, error, details = {}) { + console.error(`❌ [BG][${source}]`, error, details); +} + +function bgLogInfo(source, message, data = {}) { + console.log(`✅ [BG][${source}]`, message, data); +} + +// ========== الإعدادات الثابتة ========== +const USER_CONFIG = { + userId: null, + doc_id_groups: "3884641628300421", + doc_id_post_text: "3559434960802556", + doc_id_post_photo: "25528973250111023", + fb_dtsg: null, + lsd: null, + dyn: null, + jazoest: "25415", + upload_id: "jsc_c_9", + targetGroupId: null +}; + +// ========== حالة النشر المتعدد ========== +let publishCancelled = false; +let isPublishingNow = false; +let activePublishImages = []; +let appTabId = null; +let currentPublishTabId = null; + +// Promise تنتهي عند اكتمال تحميل التخزين المحلي +let resolveStorageReady; +const storageReady = new Promise((resolve) => { resolveStorageReady = resolve; }); + +// تحميل القيم المخزنة +chrome.storage.local.get(['fb_dtsg', 'lsd', 'dyn', 'targetGroupId', 'publishCancelled', 'userId'], (data) => { + if (data.fb_dtsg) USER_CONFIG.fb_dtsg = data.fb_dtsg; + if (data.lsd) USER_CONFIG.lsd = data.lsd; + if (data.dyn) USER_CONFIG.dyn = data.dyn; + if (data.userId) USER_CONFIG.userId = data.userId; + if (data.targetGroupId) USER_CONFIG.targetGroupId = data.targetGroupId; + if (data.publishCancelled) { + publishCancelled = data.publishCancelled; + chrome.storage.local.set({ publishCancelled: false }); + } + bgLogInfo('init', 'تم تحميل البيانات المخزنة'); + resolveStorageReady(); +}); + +// ========== تأخير عشوائي بين 62 و149 ثانية ========== +function randomDelay() { + return Math.floor(Math.random() * (195 - 80 + 1)) + 80; +} + +// ========== توليد نص عشوائي متغير لكل منشور (حماية من الحظر) ========== +function generateRandomText() { + const emojis = ["✨", "🌟", "💫", "🔥", "⚡", "🎯", "💎", "🔮", "🌈", "🎪", "🎭", "🎨", "🎵", "🎶", "🍀", "🌺", "🌸", "🌼", "🌻", "💐", "🦋", "🐝", "🐞", "🕊️", "🦅"]; + const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const numbers = "0123456789"; + + const randomLetter = letters[Math.floor(Math.random() * letters.length)]; + const randomNumber = numbers[Math.floor(Math.random() * numbers.length)]; + const randomEmoji1 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomEmoji2 = emojis[Math.floor(Math.random() * emojis.length)]; + + let randomWord = ""; + const wordLength = Math.floor(Math.random() * 6) + 5; + for (let i = 0; i < wordLength; i++) { + randomWord += letters[Math.floor(Math.random() * letters.length)]; + } + + return `${randomEmoji1} ${randomWord}${randomNumber} ${randomEmoji2}`; +} + +// ========== دالة استخراج معرف الحساب الشخصي من الكوكيز ========== +function getFacebookUserId() { + return new Promise((resolve) => { + chrome.cookies.get({ url: 'https://www.facebook.com', name: 'c_user' }, (cookie) => { + if (cookie && cookie.value) { + bgLogInfo('cookies', `تم العثور على c_user (حساب شخصي): ${cookie.value}`); + resolve(cookie.value); + } else { + bgLogInfo('cookies', 'لم يتم العثور على c_user - قد لا يكون المستخدم مسجل الدخول'); + resolve(null); + } + }); + }); +} + +// ========== دالة استخراج معرف الصفحة من الكوكيز ========== +function getFacebookPageId() { + return new Promise((resolve) => { + chrome.cookies.get({ url: 'https://www.facebook.com', name: 'i_user' }, (cookie) => { + if (cookie && cookie.value) { + bgLogInfo('cookies', `✅ تم العثور على i_user (معرف الصفحة): ${cookie.value}`); + resolve(cookie.value); + } else { + bgLogInfo('cookies', '⚠️ لم يتم العثور على i_user'); + resolve(null); + } + }); + }); +} + +// ========== دالة استخراج fb_dtsg ========== +async function extractFbDtsg(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => { + let fbDtsg = null; + let lsd = null; + + const dtsgInput = document.querySelector('input[name="fb_dtsg"]'); + if (dtsgInput && dtsgInput.value) fbDtsg = dtsgInput.value; + const lsdInput = document.querySelector('input[name="lsd"]'); + if (lsdInput && lsdInput.value) lsd = lsdInput.value; + + const fullText = document.documentElement.innerHTML; + + if (!fbDtsg) { + let m = fullText.match(/DTSGInitialData[^{]*\{[^}]*"token"\s*:\s*"([^"]+)"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + let m = fullText.match(/\["fb_dtsg"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + let m = fullText.match(/"fb_dtsg"\s*:\s*"([A-Za-z0-9_\-:\.]{10,120})"/); + if (m) fbDtsg = m[1]; + } + if (!fbDtsg) { + const scripts = document.querySelectorAll('script'); + for (let script of scripts) { + const content = script.textContent; + if (!content) continue; + let m = content.match(/DTSGInitialData[^}]*token["']\s*:\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/fb_dtsg["']\s*:\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/["']fb_dtsg["']\s*,\s*["']([^"']+)["']/); + if (m && m[1]) { fbDtsg = m[1]; break; } + m = content.match(/DTSGInitializer[^)]*"token"\s*:\s*"([^"]+)"/); + if (m && m[1]) { fbDtsg = m[1]; break; } + } + } + if (!lsd) { + let m = fullText.match(/\["LSD"\s*,\s*\[\]\s*,\s*\{\s*"token"\s*:\s*"([^"]+)"/); + if (m) lsd = m[1]; + } + if (!lsd) { + let m = fullText.match(/["']LSD["']\s*,\s*\[\s*\]\s*,\s*\{\s*["']token["']\s*:\s*["']([^"']+)["']/); + if (m) lsd = m[1]; + } + + return { fb_dtsg: fbDtsg, lsd: lsd }; + } + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ fb_dtsg: null, lsd: null }); + }); + }); +} + +// ========== دالة استخراج __dyn ========== +async function extractDyn(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => { + let dyn = document.querySelector('input[name="__dyn"]')?.value; + if (dyn && dyn.length > 20) return dyn; + + const scripts = document.querySelectorAll('script'); + for (let script of scripts) { + const content = script.textContent; + if (content) { + let match = content.match(/__dyn\s*:\s*"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = content.match(/"__dyn":"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = content.match(/DYN\s*=\s*"([^"]+)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + } + } + + const html = document.documentElement.innerHTML; + let match = html.match(/__dyn":"([^"]+?)"/); + if (match && match[1] && match[1].length > 20) return match[1]; + match = html.match(/__dyn=([^&"\s]+)/); + if (match && match[1] && match[1].length > 20) return match[1]; + + return null; + } + }, (results) => { + const dyn = results?.[0]?.result || null; + if (dyn) bgLogInfo('extractDyn', `✅ تم استخراج __dyn`); + else bgLogInfo('extractDyn', '❌ لم يتم العثور على __dyn'); + resolve(dyn); + }); + }); +} + +// ========== دالة تحديث الجلسة ========== +async function refreshSession(tabId) { + bgLogInfo('session', 'جاري تحديث الجلسة'); + try { + await chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: () => fetch('https://www.facebook.com/help/463972400461409/?_rdr', { credentials: 'include', headers: { 'Accept': 'text/html' } }) + }); + await new Promise(r => setTimeout(r, 2000)); + bgLogInfo('session', 'تم تحديث الجلسة بنجاح'); + } catch(e) { bgLogError('session', e); } +} + +// ========== دالة مدمجة: التحقق من الفيسبوك + اصطياد المفاتيح ========== +async function ensureFacebookAndCaptureKeys() { + return new Promise(async (resolve) => { + bgLogInfo('autoCapture', 'بدء عملية التحقق من فيسبوك واصطياد المفاتيح'); + + const personalUserId = await getFacebookUserId(); + const pageId = await getFacebookPageId(); + const effectiveUserId = pageId || personalUserId; + + if (!effectiveUserId) { + resolve({ success: false, error: "not_logged_in", message: "يجب تسجيل الدخول إلى فيسبوك أولاً" }); + return; + } + + USER_CONFIG.userId = effectiveUserId; + bgLogInfo('autoCapture', `✅ استخدام المعرف: ${effectiveUserId}`); + + const tabs = await chrome.tabs.query({ url: ["*://*.facebook.com/*", "*://*.web.facebook.com/*"] }); + let targetTabId = null; + + if (tabs.length === 0) { + const newTab = await chrome.tabs.create({ url: 'https://www.facebook.com', active: true }); + targetTabId = newTab.id; + await new Promise(r => setTimeout(r, 5000)); + } else { + targetTabId = tabs[0].id; + } + + await refreshSession(targetTabId); + let result = await extractFbDtsg(targetTabId); + + if (!result.fb_dtsg) { + await chrome.tabs.reload(targetTabId); + await new Promise(r => setTimeout(r, 5000)); + const retryResult = await extractFbDtsg(targetTabId); + if (!retryResult.fb_dtsg) { + resolve({ success: false, error: "no_fb_dtsg", message: "لم يتم العثور على مفاتيح فيسبوك" }); + return; + } + result = retryResult; + } + + USER_CONFIG.fb_dtsg = result.fb_dtsg; + USER_CONFIG.lsd = result.lsd; + + const dyn = await extractDyn(targetTabId); + if (dyn) USER_CONFIG.dyn = dyn; + + chrome.storage.local.set({ fb_dtsg: result.fb_dtsg, lsd: result.lsd, dyn: dyn, userId: effectiveUserId }); + bgLogInfo('autoCapture', '✅ تم اصطياد المفاتيح بنجاح'); + resolve({ success: true, userId: effectiveUserId, tabId: targetTabId }); + }); +} + +// ========== دالة رفع صورة ========== +async function uploadImage(tabId, imageBase64, fileName) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (config, imgBase64, name) => { + return new Promise((resolve) => { + try { + const byteString = atob(imgBase64.split(',')[1]); + const mimeType = imgBase64.split(',')[0].split(':')[1].split(';')[0]; + const ab = new ArrayBuffer(byteString.length); + const ia = new Uint8Array(ab); + for (let i = 0; i < byteString.length; i++) ia[i] = byteString.charCodeAt(i); + const blob = new Blob([ab], { type: mimeType }); + const formData = new FormData(); + formData.append('fb_dtsg', config.fb_dtsg); + formData.append('profile_id', config.userId); + formData.append('source', '8'); + formData.append('waterfallxapp', 'comet'); + formData.append('farr', blob, name); + formData.append('upload_id', config.upload_id); + formData.append('jazoest', (25000 + Math.floor(Math.random() * 1000)).toString()); + const uploadUrl = `https://upload.facebook.com/ajax/react_composer/attachments/photo/upload?av=${config.userId}&__user=${config.userId}&__a=1&fb_dtsg=${config.fb_dtsg}`; + fetch(uploadUrl, { method: 'OPTIONS', credentials: 'include' }) + .then(() => fetch(uploadUrl, { method: 'POST', credentials: 'include', body: formData, headers: { 'Accept': '*/*', 'Origin': 'https://upload.facebook.com', 'Referer': 'https://upload.facebook.com/' } })) + .then(async (response) => { + const text = await response.text(); + let photoId = null; + const photoIDMatch = text.match(/"photoID":"(\d+)"/); + if (photoIDMatch) photoId = photoIDMatch[1]; + if (!photoId) { const m2 = text.match(/photoID["']\s*:\s*["'](\d+)["']/); if (m2) photoId = m2[1]; } + if (!photoId) { const m3 = text.match(/fbid["']\s*:\s*["'](\d+)["']/); if (m3) photoId = m3[1]; } + if (photoId) resolve({ success: true, photoId }); + else resolve({ success: false, error: 'لم يتم استخراج photoID' }); + }) + .catch(err => resolve({ success: false, error: err.message })); + } catch (e) { resolve({ success: false, error: e.message }); } + }); + }, + args: [USER_CONFIG, imageBase64, fileName] + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ success: false, error: 'فشل تنفيذ السكربت' }); + }); + }); +} + +// ========== دالة فحص حالة المنشور ========== +async function checkPostStatus(tabId, postUrl) { + return new Promise((resolve) => { + if (!postUrl) { resolve({ isPending: false, isPublic: false }); return; } + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (url) => { + return new Promise((resolve) => { + fetch(url, { credentials: 'include', headers: { 'Accept': 'text/html' } }) + .then(res => res.text()) + .then(html => { + const isPending = html.includes('pending_post') || html.includes('في انتظار موافقة المسؤول') || html.includes('pending approval'); + const hasPendingFooter = html.includes('pending_post_footer_title'); + resolve({ isPending: isPending || hasPendingFooter, isPublic: !isPending && !hasPendingFooter, hasPendingFooter }); + }) + .catch(() => resolve({ isPending: false, isPublic: false })); + }); + }, + args: [postUrl] + }, (results) => { + if (results && results[0] && results[0].result) resolve(results[0].result); + else resolve({ isPending: false, isPublic: false }); + }); + }); +} + +// ========== دالة نشر منشور في مجموعة (مع نص عشوائي للحماية) ========== +async function publishToGroup(tabId, text, photoIds, groupId) { + return new Promise((resolve) => { + if (!groupId) { resolve({ success: false, error: 'لم يتم تحديد المجموعة' }); return; } + const hasPhotos = photoIds && photoIds.length > 0; + const docId = hasPhotos ? USER_CONFIG.doc_id_post_photo : USER_CONFIG.doc_id_post_text; + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (config, postText, imagesIds, targetGroupId, docIdValue) => { + return new Promise((resolve) => { + const hasPhotos = imagesIds && imagesIds.length > 0; + + // ✅ توليد النص العشوائي داخل func - يتغير لكل منشور + const emojis = ["✨", "🌟", "💫", "🔥", "⚡", "🎯", "💎", "🔮", "🌈", "🎪", "🎭", "🎨", "🎵", "🎶", "🍀", "🌺", "🌸", "🌼", "🌻", "💐", "🦋", "🐝", "🐞", "🕊️", "🦅"]; + const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const numbers = "0123456789"; + const randomEmoji1 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomEmoji2 = emojis[Math.floor(Math.random() * emojis.length)]; + const randomNumber = numbers[Math.floor(Math.random() * numbers.length)]; + let randomWord = ""; + const wordLength = Math.floor(Math.random() * 6) + 5; + for (let i = 0; i < wordLength; i++) { + randomWord += letters[Math.floor(Math.random() * letters.length)]; + } + const randomText = `\n​\n​\n​\n​\n​\n${randomEmoji1} ${randomWord}${randomNumber} ${randomEmoji2}`; + + const finalText = (postText || "") + randomText; + + const variables = { + input: { + source: "WWW", + attachments: hasPhotos ? imagesIds.map(id => ({ photo: { id: id } })) : [], + message: { ranges: [], text: finalText }, + inline_activities: [], + explicit_place_id: "0", + tracking: [null], + audience: { to_id: targetGroupId }, + actor_id: config.userId, + client_mutation_id: (Date.now() + Math.floor(Math.random() * 1000000)).toString() + } + }; + const formData = new FormData(); + formData.append('av', config.userId); + formData.append('__user', config.userId); + formData.append('__a', '1'); + formData.append('fb_dtsg', config.fb_dtsg); + formData.append('variables', JSON.stringify(variables)); + formData.append('doc_id', docIdValue); + formData.append('jazoest', config.jazoest); + const prePublishDelay = Math.floor(Math.random() * (3000 - 1000 + 1)) + 1000; + new Promise(r => setTimeout(r, prePublishDelay)) + .then(() => fetch('https://www.facebook.com/api/graphql/', { method: 'OPTIONS', credentials: 'include', headers: { 'Accept': '*/*', 'Origin': 'https://www.facebook.com', 'Referer': `https://www.facebook.com/groups/${targetGroupId}/` } })) + .then(() => fetch('https://www.facebook.com/api/graphql/', { method: 'POST', credentials: 'include', body: formData, headers: { 'Accept': '*/*', 'Origin': 'https://www.facebook.com', 'Referer': `https://www.facebook.com/groups/${targetGroupId}/` } })) + .then(res => res.text()) + .then(rawText => { + let legacyId = null, storyId = null, postUrl = null; + const legacyMatch = rawText.match(/"legacy_story_hideable_id":"(\d+)"/); + if (legacyMatch) { legacyId = legacyMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/posts/${legacyId}/`; } + if (!legacyId) { const storyMatch = rawText.match(/"story_id":"([^"]+)"/); if (storyMatch) { storyId = storyMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/permalink/${storyId}/`; } } + if (!legacyId && !storyId) { const idMatch = rawText.match(/"story":\s*\{\s*"id":\s*"([^"]+)"/); if (idMatch) { storyId = idMatch[1]; postUrl = `https://www.facebook.com/groups/${targetGroupId}/permalink/${storyId}/`; } } + const hasStory = rawText.includes('"story_id"') || rawText.includes('"story"'); + const hasPendingFooter = rawText.includes('pending_post_footer_title'); + let finalSuccess = false, initialPending = false; + if (postUrl) { finalSuccess = true; initialPending = false; } + else if (hasStory) { finalSuccess = true; initialPending = true; } + else if (hasPendingFooter) { finalSuccess = false; initialPending = true; } + resolve({ success: finalSuccess, pending: initialPending, story_id: legacyId || storyId, post_url: postUrl }); + }) + .catch(e => resolve({ success: false, pending: false, error: e.message, post_url: null })); + }); + }, + args: [USER_CONFIG, text, photoIds, groupId, docId] // ✅ بدون randomText هنا + }, (results) => { + if (results && results[0]) resolve(results[0].result); + else resolve({ success: false, error: 'فشل تنفيذ النشر', post_url: null }); + }); + }); +} + +// ========== دالة جلب المجموعات ========== +async function fetchAllGroups(tabId) { + return new Promise((resolve) => { + chrome.scripting.executeScript({ + target: { tabId: tabId }, + func: (fb_dtsg, av, dyn) => { + return new Promise((resolve) => { + const params = new URLSearchParams(); + params.append('fb_dtsg', fb_dtsg); + params.append('av', av); + if (dyn) params.append('__dyn', dyn); + params.append('variables', JSON.stringify({ "adminGroupsCount": 999, "memberGroupsCount": 999, "scale": 1.5, "count": 999, "cursor": null })); + params.append('doc_id', '3884641628300421'); + fetch('https://www.facebook.com/api/graphql/', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, credentials: 'include', body: params.toString() }) + .then(async (res) => { + const text = await res.text(); + try { + const data = JSON.parse(text); + const groups = []; + const getImageUrl = (node) => node?.image?.uri || node?.profile_picture?.uri || ''; + if (data.data?.adminGroups?.groups_tab?.tab_groups_list?.edges) { + data.data.adminGroups.groups_tab.tab_groups_list.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: true }); }); + } + if (data.data?.viewer?.groups?.edges) { + data.data.viewer.groups.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: false }); }); + } + if (data.data?.nonAdminGroups?.groups_tab?.tab_groups_list?.edges) { + data.data.nonAdminGroups.groups_tab.tab_groups_list.edges.forEach(edge => { const node = edge.node; if (node && node.id) groups.push({ name: node.name, id: node.id, image: getImageUrl(node), url: `https://www.facebook.com/groups/${node.id}`, isAdmin: false }); }); + } + resolve({ success: true, groups }); + } catch (parseError) { resolve({ success: false, error: 'Invalid JSON' }); } + }) + .catch(err => resolve({ success: false, error: err.message })); + }); + }, + args: [USER_CONFIG.fb_dtsg, USER_CONFIG.userId, USER_CONFIG.dyn || null] + }, (results) => { + const result = results?.[0]?.result; + if (result?.success && result.groups?.length > 0) { + result.groups.sort((a, b) => (a.isAdmin === b.isAdmin) ? 0 : a.isAdmin ? -1 : 1); + resolve({ groups: result.groups }); + } else resolve({ groups: result?.groups || [] }); + }); + }); +} + +// ========== نشر في مجموعة واحدة ========== +async function publishToOneGroup(groupId, text, images) { + return new Promise(async (resolve) => { + const groupUrl = `https://www.facebook.com/groups/${groupId}/`; + chrome.tabs.create({ url: groupUrl, active: false }, async (groupTab) => { + const tabId = groupTab.id; + currentPublishTabId = tabId; + + let tabClosedByUser = false; + let resolved = false; + + const sendProgress = (payload) => { + if (appTabId) chrome.tabs.sendMessage(appTabId, payload).catch(() => {}); + else chrome.runtime.sendMessage(payload).catch(() => {}); + }; + + const onTabRemoved = (removedTabId) => { + if (removedTabId !== tabId) return; + chrome.tabs.onRemoved.removeListener(onTabRemoved); + tabClosedByUser = true; + currentPublishTabId = null; + publishCancelled = true; + sendProgress({ action: "publishStopped", doneCount: 0, total: 0 }); + if (!resolved) { resolved = true; resolve({ success: false, error: 'أغلق المستخدم تبويب فيسبوك', tabClosed: true, post_url: null }); } + }; + chrome.tabs.onRemoved.addListener(onTabRemoved); + + const waitWithCheck = async (ms) => { + const step = 500; let elapsed = 0; + while (elapsed < ms) { if (publishCancelled || tabClosedByUser) return; await new Promise(r => setTimeout(r, Math.min(step, ms - elapsed))); elapsed += step; } + }; + + const initialWait = Math.floor(Math.random() * (20000 - 8000 + 1)) + 8000; + await waitWithCheck(initialWait); + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + + let photoIds = []; + if (!publishCancelled && !tabClosedByUser && images && images.length > 0) { + for (let i = 0; i < images.length; i++) { + if (publishCancelled || tabClosedByUser) break; + const img = images[i]; + const result = await uploadImage(tabId, img.data, img.name); + if (result.success && result.photoId) photoIds.push(result.photoId); + if (i < images.length - 1) await waitWithCheck(1500); + } + } + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + if (photoIds.length > 0) await waitWithCheck(2000); + if (tabClosedByUser || publishCancelled) { chrome.tabs.onRemoved.removeListener(onTabRemoved); if (!resolved) { resolved = true; chrome.tabs.remove(tabId, () => {}); currentPublishTabId = null; resolve({ success: false, error: 'تم الإلغاء', post_url: null }); } return; } + + const publishResult = await publishToGroup(tabId, text, photoIds, groupId); + if (tabClosedByUser) { chrome.tabs.onRemoved.removeListener(onTabRemoved); return; } + if (publishResult.success && publishResult.post_url) { + await waitWithCheck(2000); + if (!tabClosedByUser) { + const statusCheck = await checkPostStatus(tabId, publishResult.post_url); + publishResult.pending = statusCheck.isPending; + } + } + chrome.tabs.onRemoved.removeListener(onTabRemoved); + setTimeout(() => { chrome.tabs.remove(tabId, () => {}); }, 3000); + currentPublishTabId = null; + if (!resolved) { resolved = true; resolve(publishResult); } + }); + }); +} + +// ========== دوال مساعدة ========== +function isAppOrigin(url) { if (!url) return false; try { return new URL(url).origin === APP_ORIGIN; } catch { return false; } } +function isRealAppUrl(url) { if (!url) return false; try { const p = new URL(url); return p.pathname === '/app' || p.pathname.startsWith('/app/') || p.pathname.startsWith('/app?'); } catch { return url.includes('/app'); } } + +// ========== معالجة الرسائل ========== +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (sender.tab && sender.tab.id && sender.tab.url && isAppOrigin(sender.tab.url)) { + appTabId = sender.tab.id; + if (isRealAppUrl(sender.tab.url)) chrome.storage.local.set({ appUrl: sender.tab.url }); + } + + if (request.action === "registerAppUrl") { sendResponse({ success: true }); return true; } + + if (request.action === "getGroups") { + (async () => { + const sendProgress = (p) => { if (appTabId) chrome.tabs.sendMessage(appTabId, p).catch(() => {}); else chrome.runtime.sendMessage(p).catch(() => {}); }; + sendProgress({ action: "groupsProgress", status: "checking", message: "جاري التحقق..." }); + const captureResult = await ensureFacebookAndCaptureKeys(); + if (!captureResult.success) { sendResponse({ success: false, error: captureResult.error, message: captureResult.message }); return; } + sendProgress({ action: "groupsProgress", status: "fetching", message: "جاري جلب المجموعات..." }); + const groupsResult = await fetchAllGroups(captureResult.tabId); + if (groupsResult.groups && groupsResult.groups.length > 0) { + sendProgress({ action: "groupsProgress", status: "complete", message: `تم جلب ${groupsResult.groups.length} مجموعة` }); + sendResponse({ success: true, groups: groupsResult.groups, userId: captureResult.userId }); + } else { + sendResponse({ success: false, error: "no_groups", message: "لم يتم العثور على مجموعات" }); + } + })(); + return true; + } + + if (request.action === "openFacebook") { chrome.tabs.create({ url: 'https://www.facebook.com', active: true }, () => sendResponse({ success: true })); return true; } + if (request.action === "removePublishImage") { if (typeof request.index === 'number' && request.index >= 0 && request.index < activePublishImages.length) activePublishImages.splice(request.index, 1); sendResponse({ success: true, remaining: activePublishImages.length }); return true; } + + if (request.action === "stopPublishing") { + publishCancelled = true; + isPublishingNow = false; + chrome.storage.local.set({ publishCancelled: true }); + if (currentPublishTabId !== null) { chrome.tabs.remove(currentPublishTabId, () => {}); currentPublishTabId = null; } + sendResponse({ success: true }); + return true; + } + + if (request.action === "getPublishStatus") { sendResponse({ isPublishing: isPublishingNow }); return true; } + + if (request.action === "publishToGroup") { + (async () => { + await storageReady; + if (!USER_CONFIG.fb_dtsg || !USER_CONFIG.userId) { sendResponse({ success: false, error: "الرجاء جلب المجموعات أولاً" }); return; } + publishCancelled = false; isPublishingNow = true; chrome.storage.local.set({ publishCancelled: false }); + const result = await publishToOneGroup(request.groupId, request.text || "", request.images || []); + isPublishingNow = false; sendResponse(result); + })(); + return true; + } + + if (request.action === "publishToMultipleGroups") { + (async () => { + await storageReady; + if (isPublishingNow) { sendResponse({ success: false, error: "النشر جارٍ بالفعل" }); return; } + if (!USER_CONFIG.fb_dtsg || !USER_CONFIG.userId) { sendResponse({ success: false, error: "الرجاء جلب المجموعات أولاً" }); return; } + if (!request.groupIds || request.groupIds.length === 0) { sendResponse({ success: false, error: "الرجاء اختيار مجموعة" }); return; } + + publishCancelled = false; isPublishingNow = true; + chrome.storage.local.set({ publishCancelled: false }); + + const groupIds = request.groupIds; + const text = request.text || ""; + activePublishImages = JSON.parse(JSON.stringify(request.images || [])); + + sendResponse({ success: true, started: true, total: groupIds.length }); + + const sendProgress = (payload) => { + if (appTabId) chrome.tabs.sendMessage(appTabId, payload).catch(() => {}); + else chrome.runtime.sendMessage(payload).catch(() => {}); + }; + + for (let i = 0; i < groupIds.length; i++) { + if (publishCancelled) { + const allProgress = []; + for (let j = i; j < groupIds.length; j++) { + allProgress.push({ groupId: groupIds[j], status: "failed", error: "تم إيقاف النشر - أُغلق تبويب فيسبوك" }); + } + sendProgress({ action: "publishStopped", doneCount: i, total: groupIds.length, failedGroups: allProgress }); + break; + } + + const groupId = groupIds[i]; + sendProgress({ action: "publishProgress", current: i + 1, total: groupIds.length, groupId, status: "publishing" }); + + const result = await publishToOneGroup(groupId, text, [...activePublishImages]); + + if (publishCancelled) { + const allProgress = []; + for (let j = i + 1; j < groupIds.length; j++) { + allProgress.push({ groupId: groupIds[j], status: "failed", error: "تم إيقاف النشر - أُغلق تبويب فيسبوك" }); + } + sendProgress({ action: "publishStopped", doneCount: i + (result.success ? 1 : 0), total: groupIds.length, failedGroups: allProgress }); + break; + } + + let status = result.success ? (result.pending ? "pending" : "success") : "failed"; + sendProgress({ action: "publishProgress", current: i + 1, total: groupIds.length, groupId, status, pending: result.pending || false, error: result.error || null, postUrl: result.post_url || null }); + + if (i < groupIds.length - 1 && !publishCancelled) { + const delaySeconds = request.delayConfig?.mode === 'fixed' && request.delayConfig.seconds > 0 ? Math.max(10, Math.floor(request.delayConfig.seconds)) : randomDelay(); + for (let sec = delaySeconds; sec > 0; sec--) { + if (publishCancelled) break; + sendProgress({ action: "publishCountdown", seconds: sec, totalDelay: delaySeconds, nextGroup: i + 2, total: groupIds.length }); + await new Promise(r => setTimeout(r, 1000)); + } + } + } + + if (!publishCancelled) sendProgress({ action: "publishComplete", total: groupIds.length }); + + isPublishingNow = false; publishCancelled = false; + chrome.storage.local.set({ publishCancelled: false }); + })(); + return true; + } +}); + +// ========== فتح صفحة الأداة ========== +chrome.action.onClicked.addListener(async () => { + if (appTabId !== null) { + try { const tab = await chrome.tabs.get(appTabId); if (tab.url && isAppOrigin(tab.url)) { await chrome.tabs.update(appTabId, { active: true }); return; } } catch { appTabId = null; } + } + const stored = await chrome.storage.local.get("appUrl"); + if (stored.appUrl && isRealAppUrl(stored.appUrl) && isAppOrigin(stored.appUrl)) { + try { const existingTabs = await chrome.tabs.query({ url: stored.appUrl.replace(/#.*$/, '') + '*' }); if (existingTabs.length > 0 && existingTabs[0].id) { appTabId = existingTabs[0].id; await chrome.tabs.update(existingTabs[0].id, { active: true }); return; } } catch { } + chrome.tabs.create({ url: stored.appUrl }); return; + } + try { const appTabs = await chrome.tabs.query({ url: [APP_ORIGIN + "/app", APP_ORIGIN + "/app/*"] }); if (appTabs.length > 0 && appTabs[0].id) { appTabId = appTabs[0].id; await chrome.tabs.update(appTabs[0].id, { active: true }); return; } } catch { } + chrome.tabs.create({ url: DEFAULT_APP_URL }); +}); \ No newline at end of file diff --git a/artifacts/fb-publisher/public/extension/src/bridge.source.js b/artifacts/fb-publisher/public/extension/src/bridge.source.js new file mode 100644 index 0000000000000000000000000000000000000000..3bdbcf3bacb197a82fad63b47ffcd9e30c4acb4a --- /dev/null +++ b/artifacts/fb-publisher/public/extension/src/bridge.source.js @@ -0,0 +1,118 @@ +(function () { + const BRIDGE_TAG = "fbpub-bridge"; + const WEB_TAG = "fbpub-web"; + + console.log("[Bridge] Loaded v" + chrome.runtime.getManifest().version); + + const APP_DOMAIN = "https://sare26-fb-publisher-backend.hf.space"; + + function isTrustedOrigin(origin) { + if (!origin || origin === "null") return false; + try { + const url = new URL(origin); + return url.origin === APP_DOMAIN; + } catch { + return false; + } + } + + window.addEventListener("message", (event) => { + if (!isTrustedOrigin(event.origin)) { + console.warn("[Bridge] رسالة مرفوضة من مصدر غير موثوق:", event.origin); + return; + } + + if (event.source !== window) return; + + const msg = event.data; + if (!msg || msg.source !== WEB_TAG) return; + + const { requestId, action, payload } = msg; + + console.log("[Bridge] رسالة من الويب:", action, payload); + + if (action === "ping") { + window.postMessage( + { + source: BRIDGE_TAG, + requestId, + response: { + installed: true, + version: chrome.runtime.getManifest().version, + }, + }, + APP_DOMAIN + ); + return; + } + + chrome.runtime.sendMessage( + { action, ...(payload || {}) }, + (response) => { + console.log("[Bridge] رد الخلفية على", action, ":", response); + + if (chrome.runtime.lastError) { + console.error( + "[Bridge] خطأ في الاتصال بالخلفية:", + chrome.runtime.lastError.message + ); + window.postMessage( + { + source: BRIDGE_TAG, + requestId, + response: { + success: false, + error: chrome.runtime.lastError.message, + }, + }, + APP_DOMAIN + ); + return; + } + + window.postMessage( + { + source: BRIDGE_TAG, + requestId, + response: response ?? { success: false, error: "no response" }, + }, + APP_DOMAIN + ); + } + ); + }); + + chrome.runtime.onMessage.addListener((message) => { + console.log("[Bridge] بث من الخلفية:", message); + window.postMessage( + { + source: BRIDGE_TAG, + broadcast: true, + message, + }, + APP_DOMAIN + ); + }); + + window.postMessage( + { + source: BRIDGE_TAG, + event: "ready", + version: chrome.runtime.getManifest().version, + }, + APP_DOMAIN + ); + + const currentPath = window.location.pathname; + const isAppPage = + currentPath === "/app" || + currentPath.startsWith("/app/") || + currentPath.startsWith("/app?"); + + if (isAppPage) { + chrome.runtime.sendMessage({ + action: "registerAppUrl", + url: window.location.href, + }); + } +})(); \ No newline at end of file diff --git a/artifacts/fb-publisher/public/favicon.png b/artifacts/fb-publisher/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..98c2c3513729696f53874f230a83652180ccba2c Binary files /dev/null and b/artifacts/fb-publisher/public/favicon.png differ diff --git a/artifacts/fb-publisher/public/favicon.svg b/artifacts/fb-publisher/public/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..4373d3cd2f3dad5ca6f33b5cdcccc61edaef8eb7 --- /dev/null +++ b/artifacts/fb-publisher/public/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/artifacts/fb-publisher/public/logo.png b/artifacts/fb-publisher/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98c2c3513729696f53874f230a83652180ccba2c Binary files /dev/null and b/artifacts/fb-publisher/public/logo.png differ diff --git a/artifacts/fb-publisher/public/logo.svg b/artifacts/fb-publisher/public/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..482d6c0592dbb7155cb53d88d9dd757543b2d420 --- /dev/null +++ b/artifacts/fb-publisher/public/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/artifacts/fb-publisher/public/opengraph.jpg b/artifacts/fb-publisher/public/opengraph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b442e009a1727a44dbcfcf88a165f29c041b877e Binary files /dev/null and b/artifacts/fb-publisher/public/opengraph.jpg differ diff --git a/artifacts/fb-publisher/public/robots.txt b/artifacts/fb-publisher/public/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..c2a49f4fb82f19ffa9089fcf8630e5a2870d3feb --- /dev/null +++ b/artifacts/fb-publisher/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/artifacts/fb-publisher/src/App.tsx b/artifacts/fb-publisher/src/App.tsx new file mode 100644 index 0000000000000000000000000000000000000000..10011c012cc9b2ad0b1f542ed8d0090d219bff87 --- /dev/null +++ b/artifacts/fb-publisher/src/App.tsx @@ -0,0 +1,281 @@ +import { useEffect, useRef, useState } from "react"; +import { + ClerkProvider, + SignIn, + SignUp, + Show, + useClerk, + useAuth, +} from "@clerk/react"; +import { arSA } from "@clerk/localizations"; +import { shadcn } from "@clerk/themes"; +import { setAuthTokenGetter } from "@workspace/api-client-react"; +import { + Switch, + Route, + useLocation, + Router as WouterRouter, + Redirect, +} from "wouter"; +import { QueryClientProvider, useQueryClient } from "@tanstack/react-query"; +import { queryClient } from "./lib/queryClient"; +import { Toaster } from "@/components/ui/toaster"; +import { TooltipProvider } from "@/components/ui/tooltip"; +import Landing from "@/pages/Landing"; +import Publisher from "@/pages/Publisher"; +import Subscription from "@/pages/Subscription"; +import SubscriptionReturn from "@/pages/SubscriptionReturn"; +import InstallExtension from "@/pages/InstallExtension"; +import Admin from "@/pages/Admin"; +import NotFound from "@/pages/not-found"; +import UpdateBanner from "@/components/UpdateBanner"; + +const clerkPubKey = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY as string; +const clerkProxyUrl = import.meta.env.VITE_CLERK_PROXY_URL as string | undefined; +const basePath = import.meta.env.BASE_URL.replace(/\/$/, ""); + +function stripBase(path: string): string { + return basePath && path.startsWith(basePath) + ? path.slice(basePath.length) || "/" + : path; +} + +if (!clerkPubKey) { + throw new Error("Missing VITE_CLERK_PUBLISHABLE_KEY"); +} + +const clerkAppearance = { + theme: shadcn, + cssLayerName: "clerk", + options: { + logoPlacement: "inside" as const, + logoLinkUrl: basePath || "/", + logoImageUrl: `${window.location.origin}${basePath}/logo.svg`, + }, + variables: { + colorPrimary: "#bb86fc", + colorForeground: "#f5f5f7", + colorMutedForeground: "#a8a8b3", + colorDanger: "#ff6b6b", + colorBackground: "#16162a", + colorInput: "#1f1f3a", + colorInputForeground: "#f5f5f7", + colorNeutral: "#3a3a55", + fontFamily: '"Tajawal", "Inter", system-ui, sans-serif', + borderRadius: "12px", + }, + elements: { + rootBox: "w-full", + cardBox: "bg-[#16162a] rounded-2xl w-[440px] max-w-full overflow-hidden border border-[#3a3a55]/40", + card: "!shadow-none !border-0 !bg-transparent !rounded-none", + footer: "!shadow-none !border-0 !bg-transparent !rounded-none", + headerTitle: "text-white", + headerSubtitle: "text-gray-300", + socialButtonsBlockButtonText: "text-white", + formFieldLabel: "text-gray-200", + footerActionLink: "text-[#bb86fc] hover:text-[#d4b3ff]", + footerActionText: "text-gray-300", + dividerText: "text-gray-400", + identityPreviewEditButton: "text-[#bb86fc]", + formFieldSuccessText: "text-green-300", + alertText: "text-gray-200", + logoBox: "mb-2", + logoImage: "h-10 w-10", + socialButtonsBlockButton: "bg-[#1f1f3a] hover:bg-[#2a2a4a] border border-[#3a3a55] text-white", + formButtonPrimary: "btn-primary-grad", + formFieldInput: "bg-[#1f1f3a] border-[#3a3a55] text-white", + footerAction: "text-gray-300", + dividerLine: "bg-[#3a3a55]", + alert: "bg-[#1f1f3a] border-[#3a3a55]", + otpCodeFieldInput: "bg-[#1f1f3a] border-[#3a3a55] text-white", + main: "text-white", + }, +}; + +function SignInPage() { + return ( +
+ +
+ ); +} + +function SignUpPage() { + return ( +
+
+ +
+ ⚠️ تنبيه هام لمكافحة السبام والرسائل المزعجة (Spam):{" "} + التسجيل باستخدام البريد الإلكتروني المؤقت (مثل{" "} + tempumail.art) + ممنوع تمامًا وسيؤدي إلى حظر الحساب فور اكتشافه. يُرجى + استخدام بريد إلكتروني حقيقي ودائم. +
+
+
+ ); +} + +function ProtectedPublisher() { + return ( + <> + + + + + + + + ); +} + +function ProtectedSubscription() { + return ( + <> + + + + + + + + ); +} + +function ProtectedExtension() { + return ( + <> + + + + + + + + ); +} + +function ServerKeepAlive() { + const [waking, setWaking] = useState(false); + + useEffect(() => { + let wakingTimer: ReturnType; + const ping = () => { + wakingTimer = setTimeout(() => setWaking(true), 4000); + fetch("/api/healthz", { cache: "no-store" }) + .then(() => { clearTimeout(wakingTimer); setWaking(false); }) + .catch(() => { clearTimeout(wakingTimer); setWaking(false); }); + }; + ping(); + const interval = setInterval(ping, 10 * 60 * 1000); + return () => { clearInterval(interval); clearTimeout(wakingTimer); }; + }, []); + + if (!waking) return null; + + return ( +
+
+
⚙️
+

جاري تشغيل الخادم…

+

الخادم كان في وضع السكون.
يستغرق الأمر بضع ثوانٍ، شكراً لصبرك.

+
+ {[0, 1, 2].map((i) => ( +
+ ))} +
+
+
+ ); +} + +function ClerkAuthTokenSetter() { + const { getToken } = useAuth(); + useEffect(() => { + setAuthTokenGetter(() => getToken()); + return () => setAuthTokenGetter(null); + }, [getToken]); + return null; +} + +function ClerkQueryClientCacheInvalidator() { + const { addListener } = useClerk(); + const qc = useQueryClient(); + const prevUserIdRef = useRef(undefined); + + useEffect(() => { + const unsubscribe = addListener(({ user }) => { + const userId = user?.id ?? null; + if (prevUserIdRef.current !== undefined && prevUserIdRef.current !== userId) { + qc.clear(); + } + prevUserIdRef.current = userId; + }); + return unsubscribe; + }, [addListener, qc]); + + return null; +} + +function ClerkProviderWithRoutes() { + const [, setLocation] = useLocation(); + + return ( + setLocation(stripBase(to))} + routerReplace={(to) => setLocation(stripBase(to), { replace: true })} + > + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default function App() { + return ( + + + + ); +} \ No newline at end of file diff --git a/artifacts/fb-publisher/src/components/UpdateBanner.tsx b/artifacts/fb-publisher/src/components/UpdateBanner.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f1eec2a4c12de1798f078c39913c4ae9989d8c56 --- /dev/null +++ b/artifacts/fb-publisher/src/components/UpdateBanner.tsx @@ -0,0 +1,125 @@ +import { useEffect, useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { useLocation } from "wouter"; + +interface UpdateStatus { + updateAvailable: boolean; + version: string | null; + message: string | null; +} + +async function fetchUpdateStatus(): Promise { + const res = await fetch("/api/extension-update"); + if (!res.ok) return { updateAvailable: false, version: null, message: null }; + return res.json(); +} + +function compareVersions(installed: string, latest: string): number { + const a = installed.split(".").map(Number); + const b = latest.split(".").map(Number); + for (let i = 0; i < Math.max(a.length, b.length); i++) { + const diff = (a[i] ?? 0) - (b[i] ?? 0); + if (diff !== 0) return diff; + } + return 0; +} + +function pingExtension(): Promise { + return new Promise((resolve) => { + const reqId = `ping-${Date.now()}`; + const timeout = setTimeout(() => { + window.removeEventListener("message", handler); + resolve(null); + }, 2000); + + function handler(e: MessageEvent) { + if (e.source !== window) return; + const d = e.data; + if (!d) return; + if (d.source === "fbpub-bridge" && d.event === "ready") { + clearTimeout(timeout); + window.removeEventListener("message", handler); + resolve(d.version ?? null); + return; + } + if (d.source === "fbpub-bridge" && d.requestId === reqId) { + clearTimeout(timeout); + window.removeEventListener("message", handler); + resolve(d.response?.version ?? null); + } + } + + window.addEventListener("message", handler); + + window.postMessage( + { source: "fbpub-web", requestId: reqId, action: "ping", payload: {} }, + "*" + ); + }); +} + +export default function UpdateBanner() { + const [, setLocation] = useLocation(); + const [installedVersion, setInstalledVersion] = useState(null); + const [checked, setChecked] = useState(false); + + const { data } = useQuery({ + queryKey: ["extension-update"], + queryFn: fetchUpdateStatus, + refetchInterval: 30 * 60 * 1000, + staleTime: 25 * 60 * 1000, + }); + + useEffect(() => { + pingExtension().then((v) => { + setInstalledVersion(v); + setChecked(true); + }); + }, []); + + if (!data?.updateAvailable) return null; + if (!checked) return null; + + if (data.version && installedVersion) { + if (compareVersions(installedVersion, data.version) >= 0) return null; + } + + const label = data.version ? `تحديث جديد v${data.version}` : "تحديث جديد متاح"; + + return ( +
+ + + +
+ ); +} diff --git a/artifacts/fb-publisher/src/components/ui/accordion.tsx b/artifacts/fb-publisher/src/components/ui/accordion.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e1797c93458f3751a2e0f1189ff50d77f20ae3ed --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/accordion.tsx @@ -0,0 +1,55 @@ +import * as React from "react" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import { ChevronDown } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Accordion = AccordionPrimitive.Root + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent } diff --git a/artifacts/fb-publisher/src/components/ui/alert-dialog.tsx b/artifacts/fb-publisher/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fa2b4429f4303210462ad03f9f49280ac5ae07ce --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/alert-dialog.tsx @@ -0,0 +1,139 @@ +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +const AlertDialog = AlertDialogPrimitive.Root + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger + +const AlertDialogPortal = AlertDialogPrimitive.Portal + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)) +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogHeader.displayName = "AlertDialogHeader" + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogFooter.displayName = "AlertDialogFooter" + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/artifacts/fb-publisher/src/components/ui/alert.tsx b/artifacts/fb-publisher/src/components/ui/alert.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5afd41d142c95c74069ebb5460117e74ead3b9df --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/artifacts/fb-publisher/src/components/ui/aspect-ratio.tsx b/artifacts/fb-publisher/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c4abbf37f217c715a0eaade7f45ac78600df419f --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,5 @@ +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" + +const AspectRatio = AspectRatioPrimitive.Root + +export { AspectRatio } diff --git a/artifacts/fb-publisher/src/components/ui/avatar.tsx b/artifacts/fb-publisher/src/components/ui/avatar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..51e507ba9d08bcdbb1fb630498f1cbdf2bf50093 --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/artifacts/fb-publisher/src/components/ui/badge.tsx b/artifacts/fb-publisher/src/components/ui/badge.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3f03665878d609428688f5736ab2300297115e5f --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/badge.tsx @@ -0,0 +1,43 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + // @replit + // Whitespace-nowrap: Badges should never wrap. + "whitespace-nowrap inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2" + + " hover-elevate ", + { + variants: { + variant: { + default: + // @replit shadow-xs instead of shadow, no hover because we use hover-elevate + "border-transparent bg-primary text-primary-foreground shadow-xs", + secondary: + // @replit no hover because we use hover-elevate + "border-transparent bg-secondary text-secondary-foreground", + destructive: + // @replit shadow-xs instead of shadow, no hover because we use hover-elevate + "border-transparent bg-destructive text-destructive-foreground shadow-xs", + // @replit shadow-xs" - use badge outline variable + outline: "text-foreground border [border-color:var(--badge-outline)]", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/artifacts/fb-publisher/src/components/ui/breadcrumb.tsx b/artifacts/fb-publisher/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000000000000000000000000000000000000..60e6c96f72f0350d08b47e4730cab8f3975dc853 --- /dev/null +++ b/artifacts/fb-publisher/src/components/ui/breadcrumb.tsx @@ -0,0 +1,115 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<"nav"> & { + separator?: React.ReactNode + } +>(({ ...props }, ref) =>