@strands.gg/accui 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/accui.css +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/nuxt/module.cjs.js +1 -1
- package/dist/nuxt/module.cjs.js.map +1 -1
- package/dist/nuxt/module.d.ts.map +1 -1
- package/dist/nuxt/module.es.js +18 -18
- package/dist/nuxt/module.es.js.map +1 -1
- package/dist/strands-auth-ui.cjs.js +1 -1
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +1007 -867
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/types/index.d.ts +45 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +14 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/vue/components/SignedIn.vue.d.ts +3 -2
- package/dist/vue/components/SignedIn.vue.d.ts.map +1 -1
- package/dist/vue/components/SignedOut.vue.d.ts +3 -2
- package/dist/vue/components/SignedOut.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsMFASetup.vue.d.ts +9 -1
- package/dist/vue/components/StrandsMFASetup.vue.d.ts.map +1 -1
- package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
- package/dist/vue/components/SvgIcon.vue.d.ts +17 -0
- package/dist/vue/components/SvgIcon.vue.d.ts.map +1 -0
- package/dist/vue/components/index.d.ts +1 -0
- package/dist/vue/components/index.d.ts.map +1 -1
- package/dist/vue/composables/useOAuthProviders.d.ts.map +1 -1
- package/dist/vue/composables/useStrandsAuth.d.ts +12 -46
- package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strands-auth-ui.es.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVgAAAJ1CAYAAAAsb5u3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAKYmSURBVHgB7P1Nc1RZfu99/3ZKQuqqapfwqVJVux1RyRVxtwd2BOIM7IF9B8kZ3J74CsQZVMEI8QoQrwDxCoBXgBgJGNyIOJ74GtwkET4De3CjirAH9om4yIpwn+oS3UbVDRR6yNzX+ufeCULoIR/23rnW3t9PhFqCokHK3E/rt/7rvyKhMN9rtT4p1eP0I1L0Vfqf6umHImnW/bfZQ/6K1v7PseLvaoo2pXg91sTmnL5eFwBgaHatrqk2H6njrsW10+76atfkupJrc+/6XBcAAAAAjFdr/2dyovGIhMy90MPZbW03aootSHWDc7mBejdUnVUx7ORZd//mt7FqTU4mADjYhh5YkNoY07UaAAAAAIrwNiey4PVzXWoKmSJgzcC+AXpDnlU2uTd5M05OpEcErgCq7LlWG+6qOO+uiefdNXGeMBUAAABA1ZATZY+AdQjJUv9ooaPobE1xI8ABesu99Wvu4y4nEYAysxUFu3rjgtSaC1TjRQJVAAAAAPhAy300Y0WPvtA3a8LACFj7ZFVPNkCX4gWVq/dey/1MN6bciXRSl1oCgBLoXbMJVQEAAACgf2l165obS92llUD/CFiPUMEB+gonEIBQJdWq21fdpNESoSoAAAAAjKxFUV5/CFj3SfqpxucrPkBvup//7pwurQgAPJdMhkWX3Q1tgWAVAAAAAHKxMuXCVoLWgxGwqlf1tGVVqi5Y7W5ShUSrpujaZ/TfAOChNFi9Lq7bAAAAAFCUZuSCVlY/v6/SAesLrdZ3VbvMctJjMUsBwBsEqwAAAAAwdk2XFV0hK0pUMmBlcD6cSNHypE7cPqkLmwKAgtmk2I6iO+LaDQAAAAC+oChPFQtYCVYz0YrcDAWl4ACK0tu8Kla8LAAAAACAd6pelFeJgHVDq4vuR73qvpwXMmEnzuf65oYAIEc/6P6Cm9S56b6sCwAAAADgs5YU36jipumlDljTilVbTloX8tCaUnyOfhsAspZWrd6JFS8IAAAAABCSyrUNKGXASiuAQrXca33tC32zJgDIgFWt1hTfYfNBAAAAAAhWq0rVrKUKWF/owfyOOraUtCEUipYBAEaVVq1ejxUvCQAAAAAQPJcX3ZrUiRtl781aioCVQbkf7KRxIes1AcCAXmi1vqPosWjpAgAAAABlU/oWk8EHrL/Tg6sddZZZSuqNlSlNX6vqrnEABvdb3b/sJshucR0HAAAAgNJyOVF8rawtA4INWGkH4LV1F7KeI2QFcJznum+rD5YFAAAAACi9sraYDC5gTdsBXGVA7j1CVgCHsmv5jrZskmxRAAAAAIAqWZnTxSsqkaAC1udabcSK7ogefaEgZAXwgTRctX6r8wIAAAAAVJHLjOILZenLWlMgkmWkbIASmPm0Qg0AupLNrLaeinAVAAAAAKps3jY6tjGiSsD7CtZ0Z+mHYjAerEjRrc/1zTUBqLT0es5EGQAAAACgpzWl+FzolaxeV7D+Tg+u7iqi0ilwseIlq0AWgMoiXAUAAAAAHKBehkpWLytY042sbGfpJaE0YkUXvtA3awJQKYSrAAAAAIBjBF3J6l3AykC81DbdyXKmLA2MARyPazoAAAAAoE8uZJ0+E+Jm6V61CHiu1UbaEqAulNFsUvb9cFYAKiHtoV0XAAAAAABHs02Rg8yNvAlYrUdn7MK32IVwQpnVrf2DAJTehu7dET20AQAAAAD9m3ch600FxouA1QbhseJloRKst+5vdf+yAJRWurHdogAAAAAAGMxiaJulj7UHq5X8WumvqHCqIvqxAiW1odVFd3u5IwAAAAAAhlRTtPiZvrmrAIytgjXZ+GTL+q0SrlaT9WMlgAFKxq7tkaLglnMAAAAAAPzSUXzLxpgKwFgCVnaVRqrxG91bEoBSSFYl0EsbAAAAAJCJYDZLLzxgfaEH87uKrHK1LlSeOwCvh7g7HIAPpRvY1QUAAAAAQDaC2Cy90IA1CVc7VDdhr9kQd4cD8D7ru2ob2AkAAAAAgAzZWPMH3V+Qxwrb5IpwFUeJFJ/7XJeaAhAc2r68r1b/WFPzn7rPn2jy9KxqsycUzU51P+zrzua24s2d7p/dXX+h9nevu5931zff/v4gJudnNdWY6/5bE+7fPuzf2f12UzvN52q3Xgk4zCDHrx1LdlyNcvza3zu98Mv0+P2k+2s7jnt/v7G/d/vJhjt+N7r/DgAAACpp0z05njqpC14+EBYSsBKuog/NOV08JwDB2dA927BuURVlgZCFnNPnf+mCoj/tBlTDsgBp69Gvtb32676C0D+685eaXjylQbxe/he9uvGvypr93BP1jwR1g+xQ2PE7444hCzhP2PHrfj0sO37f3H3Wd5D/yc0z+tnSrzSIn279u15ee6ph9MLbaISfcRjDHg+9a0uROq3XA0/CjOt1HUbb/XydACaZQnpN8zbMMXkYO598fE3tuIz3TF4Bvh6r+4VwTR3XaznKtWsc3/OwE+XjECta+0LfXJCHcg9YCVfRv/jKnC6tCEAwrDWAu5XcUQXZ4Hfmcl0zS382Uih1mF5Y9WaldeB/Hyac6nnlAqrXLqjKgr0OP3dBr1XRImEP1G9u/3tmr3HW7KHd3q+Prv4qt/ftzcozvXZB/mGDi1GO3z9c+adDz4vDWJXsJ3f+Kpdz9Tj2Gtg5t+UmTvo1zORJVmyC5/fuNe5noPUzdwx9tPwXY3ldR9FxP1un9bI7AN759sXb6mgfBpd2X/n41n8N7jXNk1XJ//7C/xwhrDipP3r412+r431mP6sdh/Z554kdlz+y8qRCQjpW9/Lxmmqv4aePz431tRzkfmrG+f77/uy6nwtZL7iQdU2eyTVgZdkoBtSa08XxjCYADMw2qNvRVuU2LbSHno+u/3m36q8I9sDz+sa/fBAonXz6t0NXt9nf+Z+n/l5ZsHB1ZpFL90E2zz3uDjJ8YcGqhap5TQrsZwOKn2792wcV0/Z9fPbiv2tY249+rR8X/rHvP+/DIMtei9+d+h99DbI+dtcXCy3H6ZW75rxePrrS3V7PP372dyoTO1+tHcWWu96OI9Sy13TWXdsJVz9k741dU4dhx2logdVedix2j81H/6Ht5nMqXUss9GN1v0FXZmXJl9eyn/tpjw/fs40PApnUaU1p+oxvrQJy2+SKcBVDqP9G99gkBwjErravqmLXeKvWssFvkYFiUiH6V90gc+9D1yhLh7N6eOstL8fBphf+RL6wY/ePn/2fhVYbdgNd9+/N7gs3rZfrSD4d7Pu3Kt1xD1gGOVemPTinPrr6Z8f/GRcEl40dKx9f/4vuIPfk0/+Pe8/qKpL9+4SrB7PXZpglsycWfhl8YNVdMeOuC3/08P/dnZxKVo18LpRLGY7V/ey8tRUrdk21Z4Girql2fvjyWvZzPzW+vP/TBd/3RlDf1hvvsqNcAlbCVQzLHZDXrSpOALxm1/lY8bIqoltV5B4MP7l1ZmyDXxtcWRWeLR/yRdH9IUMTfTpikJgBO14sKBrnsWsDrHFWkPoSRFif2+Ps3eRrnLqbmh3zfZQtCNjPzh2b3LJgoKhQ4MR5fyZlfDTM/a+M9yl7Hph9/N8KPTaRv7I/U9mzQO+aam178uTTs3LST/3478eX93/Ko9fuOJGi6zYmlUdyCVhduPpQhKsYzuyWthYFwGvuOn9dFWEPRRYO+dBj1AINC8s+GrJ3Zdai2fEHiD6rjTmAsqpVO158GGiMc5n+xFd+BIH9HA8+DbCnjvlexn18F6W3isBCgbzvAzWuqZkr80TA3mOToDV8ZZ+06rGf848e/k23EjuvjZx8uz/1swmsL+//xOmwgv4dz/YCyTxgfa77N92neeFIkbTpEve1jnTbfX2tpuhCW/Ep+5jTxeigD/tvkeJz9mdjxTfcX9O0v0cl4w7KqwLgrXSmcFEV0AtXfXvo/fjmGfmAMMBPNmDpVVz7JBlU/XVld0YPbvB8zPtUlTCgp7eS4eMcWyMwaYVh9IJW681etfOyTKJPq3VvtErsvI5Z71qt9PH9+DIZHKDGc6025IlJZciFq9dd8EcPzYM1XZj67aSi5h90onlqiGa8v9CllvvUSn/5dsc0O6Dc373oAtuzKkflcN1+ps91qSkA3vFtpjAvvXCVfngIiQ8bOh3FzquPrhe7gVNVKi1RDOsrbL3ybMOlrDcbqurkQ56qFFpYBbxVs75e/pcPNheE/6o4ad17Zvn9hf+p3fUXwviFOEkTJysrm/JAZgHrD7q/UKV+fMexytLYhaA1RY+GDVT7lQaR9qENrS4qOcDqCphPJwmAd2zyw13bGiq5XqUd4SpC4nu42pN37zUgb0lv47/VizP/wI7unutsbqtqbBLAjtHfX/knjk94r7c6wK6ngexeD/80fCnQy6RFgC0XjRTfVMVZqJos+Y/Pfa6LJ+d08cpn+mYtz3B1vzldWnH/7qm0hUDIvCr1BpCIK9J7NYSQCtgrlHB1HDqeDNiCGzgeE8x0Kh7c9EKBLKtOCcOyF/9YzdfUqqxpGRCW9nfVDRftOvppxtfT0Pjy/ocacvsyRs0kYN1R9FjV3tSqaaHqS02f+lIXl3xIzr/QpWXr2ap3LQWC01a0IADeSHuvNlRy1l+PAUl/qlgZ5CPC1aOFdJx2Wq/li+MC1Jjzv1sl+HGGLS/arZcCssK9ASHpHq8P/0ZZ8G0C0Kd7+7HCnejzokBv5IDV+q6qguFq0gIgvvFK01apes5C1SIrVfthPVtdyHrOfbmuALmD8/ILPQxrGzugxHYqUL1qD3e2tA79aa+Xbp/FIFk7CwbQh2t/58fApv3t8f3lfAqDj+uHR7+8xM+WfqWP3EcWfDlWy2S34vcpQtZwVP1YNVONuUzaCPn2fNrPShpf3v+QK6ljRZc1ZiMFrEkvvmr1Xe0Fq1atalWivoWq+1nIOqXpUEPW2S1tLQrA2KXVq4squY9y3B26jGwZUdWXCY+bVVxbFR0Ot732a/lgp/n82D9jS8R3mhsaNxucHrdcffdbwoAe27gti6WtPrz3ZUNo9S5kZRM1v3GsJj6+eUaj8ulaauFqO6CAdWvtPxSwhXEX6A0dsNpgO67ITtKplnvsvWK9VUMIVvc66b7XUENWd4CeF4Cx26nIxlYzi6eEwby+8S/CeNjxSsX18WygNe4+rPbvb/UZ9Pqw+/fr2/927J/56da/e9PfdtwsuPpZBlWsNhnAa5otO/8JrrNdfo18cKwmkufxukbRHuCem7dXfT4n+/D+2/2nn8lgj81u682SxijSkDZ0z8LVRZWcVay2pRtf6uItBe57F4pPBNgv14XDJ08GFGgDZeSu+c9U8nYwP7/zl7kErNv2wPTkefehyZbU7q8Ks4H5RP0T1eof6UTjc02cPuk+zylvz6P7yoq9btOX60cuQazNnqhc9Yy99z+ee6w8jGvZpx2/vWXs41pyOszrmrT/+HNNuvNr73GY1XF5VHXK9qP/cGHk/xpo44jjzqksvu+972VPd1B695nerLT6+jsOe12Vw/frO3s9f3fqf4y8UVW/r2kVl3xvuvN+mADCXsdPbp3hOHVeL/+LF5M4OFi/x6op8zXAzvPNEZ+f7PWzSegTZ+c+eC2zfO0Oupcau59uP/p1dzKyX0e9/3l/z/Zs9ZO7NoS6ydUem3O6OLalXUMFrBtaXVTJq1ctWO0ovv1aM7dCqlY9zoYezLu5CbtaBdPbtCNdK0PADYQqaQcT5ZMSeeSPn/1dpg8vNgv8+yv/PNRg0L4P60Nly79rOT1AZxmw9sMCIwuxR/XTyjMVZTJ9H4aVZ8Ca14TAXsng4D/cz/G8u3TtoMo6GwBYi4LJ+VmdOP/LQiYHsnxdp9ykxuzj/6ZR/e7U3xdaefjzFff+Xx7t/c/z+Nwvq9fZKpIG6VPbC8zssx2jebNKpdfLxYRXs26CZWrE861bWV1gxdS0+35HuacNG7D2K4vzqt/XtPe8MTV/svBQN+/XEcXI4rm1O/k/wL2rd00t4rj97cn/78gTVofJ4vrZk0UYfJysJ9X/0z2zlCBIPZRtQD+ujecnNSDrabCjrVJvdBIpWttV55r1L1XJzOnr9d/o3o2adFOBSNsEELACY+JDw/C82eA/y3D1zd2WXi79/4d+MLSHnvaKVZE96z4AfnLzTCHhQAheutC6KN1QqDF6KJS1vNtZ2HFnx3A/A/Bez1D7sCqNXvXdqCEFcJCX156OFGTb9dSupR9d/VUuk1dWKfVa4VQHWshe5DU1sgCzXu5rg4VVg76mdt2ccMelbe5jx1BeE6s9NkFnAQvw091n2upzxcJ+3aA13ZQqj3u+PecMUv05iD+4c3T26d+6wHj0kNheA9vo8HVO36uxPSKyGqe8KkeV6pHaihbcp6bGYOAerLvatnC1rnJqJWn3NxfKGK72pNWgTYWjMe5mxUDFLajkTiz8qbJiA9Y/LP5TZrPuFly9OPMP3YdBevPBZFEJfBA7dm3Q/YchK6+NPbT/YfGfu38Pxyt805sI+F16nGd9jE418g/HUD7d1QJrv+5eO3vH5naOFaa9iTBgFPac2ztu7Z7/5m62K4wmT+c3/LdzLss9BGyjw7xaNljQnNWkut3zrE1I2bmQ8/K48qOBAtZkY6t4rE1j89KRbr/S9JlxlRIXra34ivsUTOuDHb0pfcAD+Oi3um/nXuknOKxiJAudISpX+mVVhbYEyZem/RgPq6qdymEZvlU02HLxrKoa7O+x45WQFb6ya6qFWa9vZ1t1ZNVcwCjs2LTrcZ4Tqx9d/bPK9UVHfnqTq1n2953KueWQTbZl1Sqj2zv15hllrTsZcj27yZDNc6Xv+NYzu6s38xqDgQLWXdWCWVY+gG7V6pe6uFSmXqvHsQpdF5bfVjCiswJQuI7i86qArJbfW8VJnstu7O/+/YV/ZIOKCvv4+l8oa9YrOI+KBkJWhODV0tNuS4ys5Fl1hWqxoPU/z/xD5pWBxgKhny39SkCW7Fkiq0KAIjbx6k5iZLTi7ISbXMs6FKY1wPDSNgGF6ztgtY2tXCBXqipC9/PcrVLV6n4nNGOtAloKAxWswHg0VHJZ9jb96fb/UhHYBbia7FjN+uHdelpu5bhxWDvd7A3wmfXMzmqQbZu/AFmxZdhZVwb2UMWKPLxyzxVZybvlStatAqyFU1bnFK0BRmNtAjQGA1SwRqXZ2CqSNm1n+i90abFKVav7nez+7PENhWH2e63WBaAwG3pgSyvqKrksBxe76y9UFELW6vnZ1Wyrjez4+SnHTRl6bAle1suwgSxZiPXT7X9TFujBijzkcc+nihV5sNByJ8cewlnLslWAVZtmsdLIzk1aA4xs9rlWGypYXwGrVa+qPIPsVqzauXSjp8qb06UVBVLFGo2pzBuoqkidhiogmj2hLIxj2Y0NuLJc2gp/2UN7VpUMpuhqBvu3sqoQBPKQ1WSDDYypCkQe8rjnWxUrkLWdb7OpYZsoaMLq5bV1ZcUmLUZdbfRxhptm/eQmuKvUGmCvtqLC+7D2WcFamurVprUEmNPX2Z1BpRBGFas7WE8LQGFiqRL9V2sZBazj0l3aOuCDEz0xw5N1a4Ciqxm6uw0/+g8BvrJjNKtBaBT4fQX+GuaefxSbDMh7MyFUT2jPmbYC7VXGrQKGZcFqVpXl9j68qlhrgL1qYxjLHhuwlqV6tSPdntPFc1VuCXCYKc2suU8hvC4NASjSWHZfDJUFteOoWrJQYNAel9sBLd1CYuZyXVmxjVPGUc3wZqUlwGdZhQKhT9zBX8Pc84+T5f0FMHFGK1aKfFZ5vfyvLmjNrvL2o+Xhlvh/+vicsmLXirjaq4cKH8tOHv9Hwq9ejRXf+FKXloUDWS/WH7R6O/L/va6/0MPZk4Tkx7LXaUc7dXfs1yN1ZuN0ksS9x1/1/kzsoqBIcW93n9a734+/S/6sWlG3pcbEppvbbvG6V4v1rHHHDVshD8DC1emFX44lRLLeUbYTaj8z5t2l4fRuDYo9qGdZYTSu97/IHsXAMNrfvVIW02S0CECe7J5vH1ndF6YX/rS74WHFgxhkKKtrYLy5rSLZeTCbUcBpy/y33JhgkJD44+t/nllrAJtMD6kXbk5mbU+RIlewHxmwlqF61cLVLwhXj3VCM7d2tOV9mL6rNzYL0RS6bOOvCcmCsHoans67ULTu3stuMBYp+d/ogP9vZAvAD/z9d386+RMdub/PBW73Nt2v3cUpch+db92Qf512G2VWfM+aMvjk5n91DzPPx1QdmDxI/Wzp/6WJ0yffe0CzQdOOC7fa3252/xyDqIL8mM3rPDGf3VyHVS+PqxdXbwn2BJsAwVPRpwSjCINteDWbUcBqYdjk/EnCGGQmi83+7Jmh6OfV3qacH2W0qagVPvTbkimpeh19gyxDMcU7nWRPET8CVne5vaygxVe+SDZxwjGsOnFD95ryfBl+2qi4qQqyqtRtbTdc/HnWHdsWpM73Kgz3Bqix8pH+Ww33VSP5FztvQ1f3q0fu99c/16WmUApxhXoet1svlRUbpJx8+rfuoeZf9PpW8bumW3j1col5j6yMulQsq1YM0+d/qaxs3X2mcbIqVgJW+Cqrpf1MYh1s1MkdquDfyb6K9U8IWJGZE2dHPy53xnS+22ZyM+65K4uQ2M7Pj5Z+1deYIMvWANZPtqobW+1X9D4+h/ZgfaHVuoLueRlfmSNcHUgSkvmtShtdWaBqy7Q3dP+mC7+f7mjrRaT4oTu2l5RUrY59+XYvdHWfb8aKHrvv85n7uPOD7i8IQYsq1H+103qtLFnI+vHNM/rjZ3+nmcU6S0UD1q38HXLAadUD22u/VhassigrVmE9TvGPBE/w10RG51qn4GWtobDlsp0hw2er2CS4ft+buy1lZfJ0dvcZVJtNok5msPJm+1E2z1CDyrrP8UfX/+LYieWfXf1Vpq0B6Hn/nkLHtIcGrDsB9161tgCEq4Ob1PSK/FdXiSWh6r0lF1I+3tXWMwst00A1lLCr7j4WLQh2P8cLC1stJBaCE1coYLUZ3k4OgzZ7UPr5nb/SZy/+uz59+DfdsHVyfuzzIhjQjxf+0Q1i+6/6tAfzn27/W3dJWBbVA8nSzWyOm3G2B+ihogK+svOsltGEWGg7aBfFzv8f3bVxkNfHqlatL+LrCu+EfZittf/I7PnFKu2YEEYW+tkPoB9ZTVIPo9cqIAt2Xh31mtAaIHd1FeioFgENBYieq8OzNgEuFFv3PFipq2QsVHVh6qJ73c/vaKvR+/28lvoXJa1udT9XtOiC1paY+AiGNQO3FhBV0nYDuFqGmwjtd2Lhl90PY4Mh+/ds0LjzxAKv15ntWorsWWD6h8V/1sulp91KUnsQrtU/+uDP2Ie9j1kvYc0ylLfjDcDBfpZRz7021/Mj2TXyd6f+vnsttf7S9nl/sGcrS6wK2K6phNWHi9PniayeXybqn9CGASOxTZqyaFth1avjnpDNulWAbYS7dUBo/JF7zbKa3KM1wIFmbd+aX+hSSwU4MGANdXMrFwfc/pJwdSQuFHsiAtZCJLu0R9dduDpfgd3a627+7o4LWq9HilYm1bl7sqCLHAYXqT0bH7g1WnltP9nIdJf2o9hDlA2G7N/72dKfvf39nbS6cPfbJKQb91JuvK/XLqDoBaplag9gsmjJQeCCrFnIN7N4SlnYIaDqi93vCAJGt+WCqKyeXybmPyVgxVDsGmrtsaYXsukZb5Pa49ZrFTCbUW9Ue31sJdHeVid238nq3kNrgMO5kZflWy0V4JAK1iA3t1r/UheXhBHF6/I8WClyBiJrSbXq9lVb9t8LVUOvVB1QPVa8vKNo8bnuE7R6K6pMe4CebvA05sY4NkDaP39tgV6v0nV3/UcGoxWUZQWrDwNnW9JqFS7DVoSw/A1Zs+rJLDcXGVffQFRTlitgptz9ZktAf3otjGwjzunF/yOzKkwLCn153u21CvgogxUO3RD6+l90W570fm3Vq1ng2ehoHXUKK2b7IGC1za12wmsP0GorviCMrC01J+S3yaSKtaWAJH1Ia1d3tMXmT4m3QeuGVmkd4JmO4tmoYhWsSZC56V2P1Kl9la72wGnf6/aj/6hs4Ppfnv2dRtVbemoPo76/hhNfZbPpQa+NwbjZ92D9aT+585c6MUDVlf3/3tz9v/XTrf/FRAMyYwPcP3r415ltLmK2A9qJ/cTCn+q/ZFD9aOek9aqmeqp4WU6cWYsAVMvM+T8d6PrXeyax5+UsV9j0WFDYCyB90W0VcPlUJgHyz5Z+1a06t2d5C1ezuvfQGuBonQKLhz4IWAMMV10oGJ8LtaLRN/Y6buieTYV6u2Q9DqhNQK8NQNw9rypWq9qfeq91wJQ7j6lm9UZdFbTlQkvfN6Hq9qzbs5zIHtBsUGsVuFV5sMqiF1ZNH3cHBtMuXLCwz+clkbWMHr59Wrbc2+gm6Wf78YF9bU2evW1RbVZ5ZRVJM27yqpbhxj5WeRXSTvfdnz2Dn9/OY5sMtBDCrqkoTrcPq7umZhHUTJxmI86q2btHwLhZuGrXD9+uod1e/Ff+qbthbRZsw6ufbv87rQEKVJM+VUEOaBEQVnsA29SKcDVbkdSq0g7ieXg/WEUf6juKnj3X/VuTOnHDNlwTxiZS9JUq6Kdb/66f2Qx1hpVMeetVuJruA1YatqI/FrJ8cnPe60Agq+oGH/uW9nowhhNHIVTdAHD+U/f5k+5y1rx6bld9iWbvnrQTUBVvGdgEVBb3itrsCQHjYM8oP174n94WC2yv/bq7QVUWPWbtXP3k5hllwcJfWgP0pa6CvBewBtgeoPUFm1plrqP428jjHow+V7ASrI7GTZgsWRsFdy2imhWFy7qZfdF6jfLtIdCWV7FUqD95LHHLSpRhZV37O44HhO/koNdnFxhlWaF6FJ/6Bo7T9MKfELAWLP4xm2mqqKBzBdirV7nq+/XzlXu2tgmkmkfnCa0B+lZYeX5t7y9Caw9grQGEzLlwlerBAVmwuqF7j124amVQDWEUvWrWMW85VGl1VVSvmX3IbKnXHz/7u+4SpImAqnHHxQaUvlYtZ1lNFNKyZeAwtbStRN8fBQ2E2WDkHfp4Fi/LgCWkVTwIny2V/88z/xBESNjuXuf/Rb6wft+2+g59GU/A6oYZZxUIWgPkx722XgesLsT0pkHQCz2cdUHgTYLV7NkmWD/o/kN7jQUU6NXS00x35R0Xq2a1nbHzWgpbJr4G0Qf1JR2WbewFIB+sGngnq4350D8m0BAaCwetavWle+YO6fi1QNOXCv2XV/5Z8M++gDWYgIjWADmyHqzyWJFNio/yOz24uqutZ7asXchFpHhhR1tPrX2JUKS6Km7z3P+vFCGrBYfW8uDj638uAED2Xt34125vPqRYZl64LAMq+rAibzYZtXX3mZe94fvxBxdsdsYcCtt9h0m9gdRVkLcB64YezCuYQXV8Q8CYvHDnirUDaKtzKy6w3LzCrGXA4/QaBRTCBitlCVnNR8t/QchacZ3WawHIllWuvl72Z8koMCr6sCJvNvn/8zt/1W1nZUUAM4t1hWTcrQK6LWm473jrbcAaqdNQGFpzurQiYAysL+iOOk9FO4Ci1d3t5LH1uhVQEAtZX5z5h+4scRkQsgJANpJJuMf0vwOAEVgbq17YGlLQOs5WAXbvgb/2tAgIpf8q1at5izzqceoLW6K+oXtPrS+oMC6z1uv2t7p/WUCBbJa4uxyoBEtxLGT9aOlXAgAMx9oB/O7U//CmD5936AcKYEB7q1pD2aB1HK0CaA3gv7cBqwuOQlh+S/VqATqKvQ5Y3bH6nQqU9FqNrGqVJeoecMfnCiErivZm5Vl3l1N7sAk9aP345hk2vtqnChuE1Fj2CYyktynL7y/8I5sKHaHNhnoAhmThqoWsIay4KrpVAK0BwtANWNNduuvyX1MoQl3onhfPdf8hvVb940LWW/RkRdFsQG0PNjbADj1o/fmdv6TP2h676y9UerzfwMDsum8Vq3bd/9F9ULV6vPa3FbielhiTB/CBrbj65OYZ+c5aBRS1XwOtAcLQDVh39SaIoKJNe4BCRIq+ksdiRblfxWwjK9u9Pla8IPho1nqyErLmpiUcqp3OIP/u1N93lwdtBzjgtgqBn9EqoMvn94+BLlA8O+9+WnnWvb5bKwCrWCVY7V9ZNocMSa3+kbLSoQIZnrDnVCsI8J3dK/JGa4CRtVSQbsDaCWPDnuYvdKklFMHr0KrmHn2VI1t+vuvCO1HJ6zsLWR9af1wBY2KtA6yq6T/TsPXN3WfBVLZ+dPXPqGJ1ttx75qssA9ZQepoB42YV7btPNrrXdyY5BmP3vzcrLaFY0ewJZSUmYIVHZhZPed8uwO4Zr3JsFUBrgLDUkv+pnZbnXAj8SMhdWhHo9XL4KMcZiOe6f916fNISIBj1HUUP0zYnyIg7xyg/GVC7O6h8pj8s/nO3snVv4OprNY+Fq1WuYrX37OW1p16HAVlWEtGDFehPb1frTx/+DRMTfbIgutejFsWb+Cq7ClYmFeAbaxfg+94B1iogrwILrquZaKkgk8mnuC7PxYrXhNxF6jRi+S3WRC5pxYbu3XHH2aIQGmvncNN9viJkIiZgHZmFd20XuFroaizMnJw/6R4QP9fU2TlNua99qB61KtbXy/+qkDyP7qsqbKBrO9RmEY5O1D8RgP6dWPilPp2f1Ss3EWN9WMvoTdoKAWGrZVTByhLk6rFrwM6T5xpGrzVF7auPu5NRJ3IMQa1VgBUv+Mqe137vrqWzj88pSz/d/nfOy8B0A9bY/93RW7QHKIY7Fs7Lc1OaailDVv3oArqHCqNVBg62+Bvd+/ZLXbwljMxNNHwXWR0rMmMPXtbDL+njlwSaFrjaw+m0G8RPnj7pfl18IbaFvFYVQH/BwdjrZksyJw7oe9duvc60iqG7XDOLgPU0hf7AoCw0+KOHf9Ptw1rWkNUHNfc617rX1fevdXbvtHCBqsqjTbjniSwQ5FTP9pMNbWW4kseeKWcW65q5fEpZsmux/b0+rzqyZ+nXLhD96Go2q8PsWfIVrQGy0lJBJr8Po39hU8id9bLc8T9k3DypC5lV16XhqtXds1lS4GrS9Q09aM7p63VhJFEBG8kh3bnefWyng/Zelev0wp9o6uwXhQWu9u8RsB7Pqo9twHBi4U+PrSi1qtNd95rapgTd93kE9v/PYpkyS52B4VnLgN31fyCAyojd7yyEsDDGwsHjrqndvrjrm3rNRi8fsNcysxYwPxJkYzS9YgJbHfXR8p9nGrT+7Oqfed/j2Xqlzpz/ZXfSaFRWEcvkUjaseEgFmZyU6r4vCXcvyRMhdzuKrst/mYVnSaC8xWZW5ZFuevXwTJYhfDXF66KCtXDvV7kmgZgNPq25fy3HcOyEC3NxNHsPrAdYv2ywa8uL7WPUyrf2d6+VFQvwRw18gXGyHtf7K8TfVZR//LYNS9ZLVe3f+KOHf93thceAdzT2Pn36+NxAkz527Ura7MzpxZl/4D3YI8velDvcH5ARmwixfQlsVU9Wm1RZ4YHvq67s2vTT3WfuZ+7/mfEg9vpR/JCduMDioVocRLg0QUVaztKd2BfluY70rTKQhKsR4Wr51He1HcJEgddqqlU6oE4qSWeTJU7phw3ai+6Z2ts463fphll5Nc+fcD+rD/1gfWXv/SDh6n4fjfqQneEmafazAGXT7VWcDkataupHF4Jarz7bZDBLFvCNOmiGXRP/fOiK+mSZcLZLj0OXZcDa9nRTToTLKjpt2XxWbNUVMKiJbvFQMUIIWDdZ8pu/NGwMQUsjStoCEK6WVax46blWG8LQ3FC1ktdcG7hZc/rPXvx3nXz6t90lob2P2cf/rfv7swNW3WSlF7TakvM8sAHS4UYdvE6OGGBnWXF6wvNdeIGs9KqnXl572m3ZkZWfLf2qG7RieNZmZRST9JN+z4mzGQasrexWTAA9FrJmdR1m1RWGkdcm6QepRe6xX34jXM3Zc923ir+6AjDq7MOenqt1obRiRTeFoaWbClaqjKG3ZPG4MM3+u4Wv4xpg20PqizP/V6aBgZmY/1Q4WBaBejTCDs8WFGX1ftvSaaqVUSU/3fr3bkVrltfMT27Stn8UNa5BmbH7U1b92q0SnBYyyEN32fztf1MWWHWFYRRZsGkB61fyWEf6UciNhaux4mUF4nNdamoEu9q+Iza0qoL5H7S6LAwtKnC3RR9ML9b7DtLswW6cA2wbAL269lRZqo0QACJf3V20Mxr09jZSwzudjCq2iq5sjz5lgNkvu2ZaL+Ss2ETb9MIvBYzbiQyPQ/qvIk9bGW5OFfHMisEUWrBZc+Ga1xWsUYH9EqomtHDVaWoE7ue96X7eBaES3OTRVatYFobSUZxJv+NQDLrk0AbYU2Ncbm0tA7LsLzhR/0jw1/aT7DY6yGqzCbyvVvA5xKTIYKw/68sMJ6Y+vnmGKiqM3c+u/kpZ2X40/GaMwHEyXY0zz/AOAyk2YJXnqlZFVZQ0bFxWQEbZ4CoNk5eEKrF2ELQKGFJNUaUmt4YJK35+5y/HOsB+k2U1wKeENT7baT5XVmxigGAoe0VXsE5kUImc18Z5vrJ2AVntymzvt/VjBcbFNvvK8rqT5X0GOEi8ua1M8AyDAWS1SXq/LGCty2MErNmyzX82dO9piGHjhOI1DeF3enA1tDAZmVnc0ANaQgwhVq0pHGncA2wLCrLuxQo/Zf1eEwy9084oZJwqsPWC9VzMoo9l/GNGg92A/OHKP2d2Ln109c+YrMDYfJThagSbbKH/KoAymih4Rbz3FazIxgut1l2weidWZBs8hRg4bQ7Tf9V+7o46y0KFdahiHULaDLxSG10N4+PrfzHWnpZtBkSVkWVLCAuGiq649FkWIevU2eJahmR1zaniBI2911lttmLhKpMVGAdr9ZLlNXzr0X8IAEpoc9Q9fAblfQXrbkkrWDe0ulhEf0irWH2u+w93FNnIbFGB6khPNCALV93P/TiWaNRSbQ07D4Rh0AO7D3/08K+pYkLuttey64+XbNR2RkjEGQSN9poW1Zd55nJdWWivV3MOzVoFUMWKUFmw+tHyXyhLP936XwLyxsQuxqDwsSwVrGPwW91fcI/id3a09WJD9x7bbucWAGURuNrf8YP7+zd0/+Zz3XsRdwPG8Dd2qg3RHmBXNatcrAuV586D68LAIumRcCx7YAw9rKriUuHQZN0mwHafziqoy8tU43NNL/xJ7oOy3W+zqQQvYgMxey2yCnLbrdeqIgvUX9/4F2WBKlYUyY63Tx+fU5a23b2lXbF+zCie3c8zQ3ss9KkzhrHspFC4juLze37ZiBQ1Yum6C1zlAtd0WW60Hin+rqOoVXNDKvuDsSY222pvTmhiNlJ7tqOa+9yZdf/fuvs7vrK/y/0d7utErPKY0sxAAWu6qVXwwTIy07BerOmyd/TNetZEwvFsswnrYfbqxr+qSBMsFa4UW9psbSmy8smt/6qdJ8+9GlxbgPDR1V9pZunP3uszalWHWe4Cv9euVXJe1sgs+LSPrDZSOkhWfRctZKxyz0U7nuw4q2UQ3lsVq/19MddR5MiujbMuXM16wmkrw/YzwGFmLp9SVnhmRb9qY9hTxPuA9Re61FL5HBX8pf1RYwtdXbQRW/Vd+p86muh+3en+XqTkT1Qg/lg5qQt9r2NLWgOwqRXe11Fn0X0KbnO3cbKeNW7Sx8492mz0obdkr6iQ1aoBahktTa3qUuHQWIjzs6t/ltn73quG+vHc47GHrIcFqz1WJWh/xjYpylqWgahVsW7mFLDaOW+TOVnYoX9z91r98zt/qVHZcWkTH3lNAAC9cDXrnu82MfxmpSUgTzYpkNW9y1BxjT61xlFcRYuAgqW9IAkrBuCC5Lv9/llrkbCTbOQFvMdd7C4X0fe4hPo+/5CErEUsEzZUA1SPVchltUFPjw18Ps2hKqpfSTj15/rjZ/9n9/w5Kjy2AdrMYl1ZswrWrM4Bq2DNo2WIvT8/v/NXysr2o+x6+oZqa+0/MnvfbQKgqB68qBabWDn59G9z2VDzVUatMoDDZN3Wwp6DOgSs6E9TY+B9wPq9VusqkVhRBovQKqU1yM5vu9q2Xpt1Ya9WpMhaLKzEim+4o/BK78OF1+fefa1rHel2+mfLuJR+dltvqGAdUDRE/+Oqs5Do04d/k2tgZQOtLKsB8lzSjGxluUFPjx2rNoD/qMBekhYaWEXWZy/++7HB6l6f3PyvuWwqtJ3hLtoWtmU50ZJHCL7TfK6qy3rCwqph2fAKWeltRjj7+L/l8jxB9Sry1nu2yPTexeoL9KmmaCx7idCDtXgNYQAWCPZnQ6uLLkCseoDWUne2Jn7ibmvrrzTVOjVAe4W9nunh7Cd6M+9C10UXup5VCYJr93NcdZ+Whb5NamZ9R1u0CRiQbSD06fxsdyOVrAcw9qD6Rw//WlnZJlwNSi8UyrIXq+lWkrrB/PTlU/r9hX/MZQled9Oq87/U9OL/MXSbA/s+bXLBguYs2XmaZVW4hcZW0WgtDUZ5LX929VcDBdD9sGClyv1X98qy7UZvw8M82ligOrqtQNy16MTCn2Z63u9H9SryclzLn1HsPOGZFX3Z/EzfjKVIyAJWBs4FsfYAMdWVg9hs91nanfRdrd5O8ZF7jdwxtW67ve8qXsuyZ3EazDbTj/T47b7GDYVr1n6OQaqiq876H2/onrUJuCoMpLekd+rsnAvE/j3ZSGdE0y64/cT9nVk+sPKwGp5uKOQG4LUcqpom3cTAHz/7u25V85u7z7S19uuhN++x7++Eu+LaOZBlWGAhbdYBq/28Vhmc5bllAau9lm9WnrnJln/tO2i1wam9Dxai57HsnGDlnawnLMa14SHCZNfIifpH3VUpk6dncw9Ve+yaRPUqsmLH8dT8p+7zJ937c57tUlh9gT6NbQWm9wHrhCZKE/7SHmBgfQeGu6q58Ceuqzqa7ue9+1Iza8NWqA4qDSWbadB6R4FOFqTnYVPom7UJiJPqXwwh6Rt56m1gZQ+Hg1a0WUVLXmHL9tr/VhYsFLJQ+bAlspOnP1UW/osLrAo1e0K+sVDo91f+ubvEPi92rNnHz+8k4aNVPLa/e31g5aMFApF7nbphwVcfd8NBG2jlFRTY92XHWda7tudRGWx61wB77ey1POh1TM6dEzrhwuhJ9/PlGbLkMUDtBUWHyap/5JQ7tjqH/Dt2PNi1ddDjwsL6LN93qziedu+3rWDYe623SbZBvrfjXtMog2uTBXr/pUK9Y497Te36NaoT7vU89j5l18sxtZOwCYDXTAB477hj1WRxDbC2O58Me/0r+Di2Y7eollbHPdMeJYvriLFn/2G0W68r36d2kD18Mv+3N3TvmTwOSmqKLoyrvDdrvr/WvmkrPtVPwJpWrz5TyVm1akfx7deauVVUqHqUH7S6HIVZNbw5pelTJz14DUPirl+WBpR2tYMFVUVuUGLhig22d7/ddA9BL9/rqdkLq6yaZcKFVHmGLW33PfznmX/QKOzh0yp1rboWB/vdqb/P5WH341tnusvwquj3V/5JWxlXYNmxbJttjSv4KIJVrmW5hH3mct0dh//Vq9fs9fK/DFxB+vOVv8y0RcRhLBw4rm2EhdHWBmZcG8/5bphjOFlR8pdsROZsnntM33WPcawe7g/uvp935XV3U66HfxP862/3mN9f+J9VbQfUmtPF/G/oh5hMlxh7q6NOKQb0tAcY2Eq/1asuXH2scmtZL9oiq1X78YUuLf9G9zZr0k2FZXZHbxbc5xWhb7EL9wMN1L3UXQ6Yw47Ag3qdwQYvVvlFuDoeFiTNnP9lLq0CfGeVjFvKVl79bX2SZeVaNwhY+Sv5xipI298NtoHP6+V/LSRgTarC/7Ibch2k12ObcDVbWW8SFyqbeCBc9RvH6sGS6tX82wNYH+0yhNu9e8mLM/+Q+Wof//W/h08eanHSIsBbHTePoBKgPcBAWu0+Twzb2ErlDa5bkeJzNgMzp0srPoWrPV/q4i13dF9RcDgfB3VCM+699vt+gcFktYPwz5aqWUHpA3totqCmU7mHZ3Wru/Ngy8XLurTu1QB9YPsx4/G5P2hYaq+LtXApgg3eD5sUsf9GuJItW2bLa6puL3iblIO/bINUjtWD/XS3lcvmm3v1NtEsCzuWfCjmKFp7zK0AXcAafye/1VUODaEvHel2v60BVMKKuqQVgK5ZsBrCZkwW/tr3q7DMv9BDNvcbgLVUcPeLR0JpZLHRzbD9oZAdG3DYsrnK+TSfJem9/rZl0+27mHG4MnXa39voMIPKl0tPC5usOOzaeeL8nwjZYqm13ORBq3t8w2/WvxwfyuP+dZAyvv7TC5W7p6xkuen3MGqRIt8rkuoKnLUHEO0B+tVKqiKPt5OEq3WViIXLLzV9qt/XwBfp93tb4Zhta7shDKRGW4XS2LYNtzKoXo083ACqirbXfq2X16o1eG5/m19fMVtC+/r2v6tMDluSPgqfW1NYJdKg31+vRUQRDqtSq3FNzVzVKwItXP3DYgUn4QJE9eqHeit1ipDXyphxij6t1j2lPeb2AMYqWL0OWN2A/rQCR3uA/kV9LjdPqle1qPLotgNwQeWSj60A+jGl6WX3aV2B6Cg+LwwkrahuCkGzh9WXGVXoEQb4w5a2D7qxT8i21v638mTVMrYRXRlY+J7H0krfw4Bhrk9FtYg4bJdpJq2QJbsnEK6GI/q0vBssDstW6LQLattTq3+ksqlYj/7muKtXTS3qbqDjtbrC1xCOZdWb/S6J3ylRawD7uV9p+kwI7QCOcrIbDNdC6se6IAws8mBmEKMp8mEVxbJQ8A8lXN6+n/USzHujlm6rgAv/GHw/VgtYLDSsIqtiHZS9738YYzX4MN8zjnZYmF1m3YlUdxzTczUsTFq/z9r1bK39WkA/fBmj1mqqeT89/31SrRgk2gP0rfVTUgF5rLJUr1qv1dCrVveb09dWwRpKq4DZDT2YFwZCFWvYLGzhYbXc3qw804sz/1dpN2qycLWoXoI2EdHdRCzQ19LOdwKWwVnLjbK1iKiyzua2qmR3/UV35/CqTqwgfL1e6FsrxWw8iFJo+lKsVttRx/slvRMBV4DGiqiS60PbBY39hoy7qt1U+Fq7ioOvWj1I2iogiMC4o05DGBhVrB+yAY3vqGapDjseLRjMu8qzSNY32H6mojdq6YWsobULKCJcLWpDqGHFI3x/9trlGazHPx4c+sWev6Yhin+sxmvaq1q1CTZWqYSp/R3vW2+CYBzhKtffcLX7bDNZhJoPfQqO01EUcpUZfR6PEbuwpt/j0CqC3Z8PPbRuWkuAEM69YaS7zYdSxdoQBkYV64deXlv3tv9lb6lzHtUsVasMCkkvGAy5L2tv06H/PPX3+nGMgbG9ljbgC6GqsbchSBGTKbHn5/8o16fe65hXyHpYOO37awr/JNfJf9fvTv0PqlYRLDuO7XllnBMEpQxYqzHBtOJTrlJLP7fksVA3ukqXH9eFo6x8oUvL/f7hOPDeqy54vDuni+fK0hLgMCc0c0sBVLG6a8tZYSg+zRT6otf/0qflxFb1160EyKktQFmXoWdtnK+THZcWUL65G85SO6tgsYGWBQYvl9a9qcZ6tfTUu3N8LzvP7XwvKoj2+fy3gfKo31+eLSLah1REU8F2vMOqfw9Tls3q9usFUsl18inVdyVQ1mP1KHuP43GvsgphNdqgdkr4M+3X9mxlZTdgjRT53iYg0ArWzqJwFPfIOn2t3z+c9l5tKFAWrroweVEVkGx4pbvy32zIPZ7HyWYK4xK1CsiqEtP6X9qAfNxhVm+poFX95RlO2WDA92XC49b2YMBkx8AfFv+5e2xue9o2oFetat+jVbDYQMvHwKB3jvtUGdxrn2CV6kWG0dtP/G1BkdWgsheyZn1NPyxIqWLAMqhBX6MyvaZ2TbTz3SZ6eoEUwWp5VOn8t+N4b7Dqw3Fs1/uyPdPuNJ+rzAZZCV2UbsDqvrHv5LdQQxDaAxyuNUjfVbMTcPVqlcLVnkjxmgIQco/ncUsrlVsqgd1vR3uo3Tvr3QuzxlE1uLcSoKilghaK4XCvPXp9rLLRQncfJgFMN1RNA8tetWoIfWPtHN9bGTyuSs5esDqu9gl2jfF1MLqV4fHdu6ZbqJXFBIWF9IcF4fbfWBlwOHttBg0M7NwIuR+1HSt2n/3RTaDYddLOdztOCFbLJ/Rj9Si9yQGb/P9d2vbHtwmC3kRvWSTXy3IeT6nW62Qs6pXI/ue57i3FktcbB3Wka1/qoncv4GGS9gCdYndiCIQ76DZtg6dBZhusetUFrKFuJbg+p4tnVEEbuvdYngeY7tpy211bloSh/Fb3FzqKHypw0eyU/vjp36pW/1iDOm5X8wn3d360/Oc6cXZuqL//OPZAaNVar12wOq4HqY+W/0LT53+pyflZ4d17YiHPm5WWfGXH5lRjTtOX6zrhPuet97rsPHleuoHkzOIpnXDngL2Odj3Ji4Utb+62vHn9JudP6uOb85pyn/P8uftlA/jtR7/OdYKpd97Y+21f20c/P7u9d9uP/kOvlv/1yFDB/r6Pb57J/VgKSfe1c+/tT+4+N0yVdu8+PH3+T717TXs/j33ufv3jtpu0/bFbzdhuvSRIrRifj9WjdNuybG53PyeVoNtqf7v5NlgNaeIo9Gfa3rPWSzcpWO4N7+Irc7q0Is+kAattHBQ9lt9WXEgVTM+/H7S6HAXeLzQPFq7Gqp2b09cDtaVwQd0d92lR4bE2CGfK3nP1MIGcB03riysM7bnuPyzB5nNvH2pnLp/q68/bA4xtejNIzygblE81PteUC1uHDSR6D07tb12At/a/u9WzDMAwKjsWu6GROz4nTp8cOTDrhQV2nPbCgjL2NztIFud5j71uyfm+2e2xSnUjAACoOG+zwW7A+kIPZ3e05ftT76Z7EU8qEM9172kcbO/YfAwbrgZcvdptg+BbX5AiWWuPCf/fu6CuLT5K7yH2PpemfNECEgtca/WP3vt9CzLtI6uwqJZWP/UqoA4KYjqt191KAPtMNQuKZMfjZBoQ1mZPfHA+9NixaXqhapxWsSBhr99E/ZP088d9v46EqQAAAO/xOmOJel9s6J4NjuvyWu3MoOHcOAS+nD0Xw4arZkOri+5vuKPAxIoufKFvguhDmqcQri3uIn2qykF4FsrSKgAAAAAA4CM/WwP01HpfRIq8Dy476jQUgF1FwS+VzVjLeq4OH46H12rBdrQjXH3rkTw3pRrV5iP6LDnebwsAAAAAgAzZ3ik+h6um9u7L+Ik8577Z8wrDZaFnfZQSbusPLO8rqz/Q+kKXloWumqKmPOcmb9iZJwNTml52n1oCAAAAACAbrZ+SsabX9gas3lewOg3r9SePWXsAeq8mYsV3X2l6pP4YsaLgwmoLlIW3JnSiKc91FHHOZuCkLmymx38lN3UDAAAAAGTH2k3aGDOEjcPfBqyTmgkhYNWO3ni9/J72AImOdO0LXVoc5SSwsNp9WlRArDUAvTzfdzI5BlrymLsQfipkIjn+42sCAAAAAGAELmO5FkrG8jZgDSEESfhd0RiH08YgLy3bjOxLXbylEe1IDYWF1gCHiP1vQUIFa4asN45NNggAAAAAgCHYmNL3vqt71fb92vvNaJx5X9sEpBWXDVWUNR1+pekRNrN6X6ToqgJCa4AjteQ3erBmzCYbrE2IAAAAAAAYgI0lQytg2xewBtGHdXZLW4vyUIAVl1lpRS5c/FIXl7LqixFgL9sVWgMcLvI/YK0LmTuhmSX3KYj2MwAAAAAAL6xby0kF5r2AdUozawpAzdtl+OFtyDQKazaclGxfPPW5LjWVoR1FSwpIm+XQx5jwPmT7PqlAR4as9cyUpq2yuyUAAAAAAI7WcvnKBQXovYA1nD6savjWJqBq7QGsHcBLTZ/KsWQ7mF62bGx1vClNtYRKsvtK2j6jJQAAAAAADmbh6rlQ85XaAb8XQh9WbeuNVxWOFWoPsOIO+FNZtgPYb0MPrDVAXWFoubB5RThSOnmTy/GSlUnaBOTGbpCErAAAAACAQwQdrpoPAtZIcRBtAvzbAKm87QGsFYBVrFqwOqeLV/I/4DuLCoQ1XqZ6tW9eB6yRamx0lSNCVgAAAADAAYIPV80HAeukZqxXotdBSGr2uVYb8kCJ2wO0bPm7tQKwitUCD/ZQ2gNQvTqYljzWUYeANWeErAAAAACAPUoRrpoPAtZ0KW8Quz7Hiq7LH6XYKbtXrRq5A9w2r7Ieq3m1AjhIYO0BmlSv9i9SFMLEDXK2J2QtxTUTAAAAADCU9VeaPlOWXOWgHqwWsgXRh1WebHZ10h0MLow8Y0voXex7xQVJa1EYVcBde0PVXrXq57rU1BhE6jQUCPd+3xD61lHnR3mso4gK1oL8Ir1mWosNAQAAAAAqxcaCLlw9V2RBX94mD/rNXcVrE4puKgDpZlfL8kCauq+kH0paGETzsXTehZj22YsAxwJV972sJ0F6vD6uMPUgcTjtAVaoXi0XN8FAwFqwL3Rp8QettiK/ViMAAAAAAHJirShttbRKJjrsP2zo3mOF0Vd0c0rTp04GkHrb8vea4roLsBs16bSSwHVeOUrDVOsV+sT92+vSxPqcvvZyaa5VI+9o64WCUDvj6+voKxekrUQebwZX1ot8CDa0uqhkUo+QGwAAAABKKMmn4mtzurSiEpo87D+4H/qJC0Ma8t+sT1WsR0kDOftY2/v7FrxGas+6ILSefESzE4q+it9V1M3q4ODBQuVN623p/qwt8/9xItmYatOC1FeaaoVUbt3WdkNh8DakBkJkN9jvtdp01z2b2KsLAAAAAFAmrd2SbGZ1mEMDVtsd3YV1QSzbdAHjVQUQsB6GsC7RURxIe4D4tgBkym60L/TwzI62lt0vrwoAAAAAEDzb8+cnTS+Xqd/qQWqH/Yc0VW4qDLPJElMErqEAtMM5L4CgWKuXOV1css0C3S9bAgAAAAAEKWkJEF2wjdTLHq6a2lH/0doEKBhskhKyF1qtK4ylwWxuBeTMWga0FZ+znSUFAAAAAAhKpGjtpaZPfaFv1lQRRwasJzRzS+GoU8Uarp1Aqldrih4JQ6mp9qk8FlEx6RWbyPhClxapZgUAAACAYLSsavVzfXOhClWrex0ZsJ5MXoymgkEVa6gi1ULov9r6rEKzL1nbs2kb0DerZp3S9Bl3/NwQAAAAAMBLNmZ75cZuVapa3at23B+IpJAq9qhiDZQ7Eeflv6YwNHctIWDFUGyy7wtdWm4rPkXbAAAAAADwStPGajZmq1rV6l7HBqyTml5xnwJ6gahiDU0o/VdpDzCa2PP3mBYB/uu1DbCbt5jwAAAAAIBxakaKz83p4jn2qukjYE3bBIRUMVT/QavLQjDaqoVQvbpJe4CRUcGKTNjN227idjMXQSsAAAAAFOltsPq5LjWFrmMDVuNeuKCCpUjR1Rd6SJgTiI7ihjzXkZ4IQ/s+qVL22i4VrMGxm7nd1GkdAAAAAAD5iZKV7SsEq4frK2BNX7imwjG7rTdLQihOy3O1wCYZfDMZQAuIGc1UtldM6N5vHRBfEWE5AAAAAIzMglXbvOqlpk+5YPUKwerhJvv9g7bZVSw1FIikinV15SR9IELgfYuANsuQRxR5/x6frHAz7rJI+/6s2MdzrTY60mJN0fmY9hQAAAAA0BcLVV0GcndC8RqBav/6Dlhts6sdbdkGUqEMVGe3VbvpPl8QvLWhBy546/h+TK3TsHk0vm9w5awLpbJ35cVvdX+hrc6Cm3g7qwCqqQEAAACgSHtD1ZeaWT9FAdLA+g5YrbprQ/esx91VBSJSvGBVTCTu/qoprnfkPcK30fneBoKbR4mlG9R123zYpE6kTsOF/ufdQ8Q81a0AAAAAqiZZ+q91W60uxevkZqPrO2BN1FakTjABq4kV3XGfTgleCmGDq5qiR8KofG8R0BIqYU5f24SJfdyyX9sknLWwcNciF7xGNhHgfTsLAAAAAOhXGqa2lASq38aqNT9PxkXI0EABqw1MN3SvqYB6sTr1H7S6/IUuLQs+8n6Dqx11uPCMIIQ2ELHi74RKOmgTx6TKtT2bBq+zLnj9Su9aC+z/DAAAAADj0ko/b6YfrY70Y03xek21TcszaHlYjAErWLvL7m/EihoKCBteec33ajEuRiNrz3fnzDw2oRohOt6aezeb2xQAAAAAAMeoaUAHVfsEYHYnaRUAj7zQQ6tq9Lqy0c38UNk4oki18/JcR1FLAAAAAAAAQxg4YE3+T9FthafxG91bEryxqzch9DpsCiOJFXv/Ps/RfwYAAAAAAAxpqIA13ZG5pcC4H/b6C63WBU9E3gdvE4oJ3kaQbCDkfa9K3mMAAAAAADC0oQLWRHxD4aFVgEfiADaJSVtiYEixogV5jjYQAAAAAABgFEMHrHO6tKJkh7LQ0CrAH6flNyobR+d9/9WIKmUAAAAAADCCESpYu70VQ+zFSqsAT0RscFVqgbQHsOtBUwAAAAAAAEMaKWA9oZlbCrAXq2gV4IVY8r0Ha1MYWqzosgIwqRkqWAEAAAAAwNBGClhP6sJmoL1YDa0Cxuj7ACqI2eBqeGmF+KL8t55cxwAAAAAAAIYzUsBq0l6sLQXI/fA302XMKNhkAEvHY00QvA1pV7UgqldFn10AAAAAADCikQPWRLBVrLaM+c4LPfS6F2gZRap5/5rP6WvCtyHFihcVhPiJAAAAAAAARpBJwJpWsTYVpvqOth4KhWqr43v/VcLVIT3X/esKoELZtOmzCwAAAAAARpRRBatVJIZbxeo00lAIBYkUeV3B2pG+EwZmvVfDqV7V+i90qSUAAAAAAIARZBawfq5LTQVcDeZCoWX6sRbHBaxfyW8tYWC7ql1VINWrLkSnPQAAAAAAABhZZgGraSu+ooDFih6+CGB3+zJwgbbvPVhbwkDS6tUlBWJC8ZoAAAAAAABGlGnAmi63va1wze50Q1Y2vSpAXR6bVNQSBuLOnTsKx2ZadQ8AAAAAADCSTANWM6XpZfdpU+Ga39HWTSFvdXksVifkY7hwG1pddJ8aCgfVqwAAAAAAIBOZB6wndWGzI4W84ZVZZNOratulRUDfrDVApCioSYmaokcCAAAAAADIQKScbOjeY4VV0fYBFxRf+1IXbwmZ+t4FchOKnsljc7qY27lRNu5cf+o+zSscm+79PSkAAAAAAIAMZF7B2hMpDr2K1V6cm8+12hAyNen/LvO0B+hTWukdUrhqaA8AAAAAAAAyk1vAmm4gE/KGV11xd9Or1bpQJS3hWDb5ECteVmDc5M9dAQAAAAAAZCS3gNWUYMMrM7uj6DEha3Yi1WblNypYj2Hng5t8uKPwtNLJHwAAAAAAgEzkGrDahlc1RVcUvjoha3Y66ngdsHakH4VDvdDD7qSD/G/1cIDwW5cAAAAAAAC/5Bqwms/0jfU7bCp8acj60PfqS+9Firx+DWuWIeJQu9q2ytW6AtQux7UIAAAAAAB4JPeA1bQVWxVrGZZdu5B1i5B1RB3FXr9+seLvhAM91/2b7vVZUJhWfqFLLQEAAAAAAGSokIDVQo2OVJalufOErKgiF65ed+HqkgLVpj0AAAAAAADIQSEBq/lSF2+pPMtzCVlH4HuLgFgRm1ztk4arywpXk+pVAAAAAACQh8ICVlOiVgGGkHVIsectAmqKCVj3KEG46kJ9qlcBAAAAAEA+Cg1YS9YqwBCyotTKEK46zc91qSkAAAAAAIAcFBqwGmsVEClaU3lYyPr0hVbrAkqkJOEq1asAAAAAACBXhQesZlInrFVAS+VR31H0mJC1PzXVPpXHonIdm0PZ0L07ZQhXRfUqAAAAAADI2VgC1pO6sBkl/VjLhJC1T773YK0ya3fhwtXH7stFlUC7fNcZAAAAAADgmbEErCatKrutcumGrBt6MC8gMDY5YO0u3JcNlcOK9X0WAAAAAABAjsYWsJo5XVxyn9ZVLnWp8/Q3urckIBDPtdqwyQF1j99yaNN7FQAAAAAAFGCsAatxIcgF92lTJeNe2Ju2SZAAz/1OD67GJQtXYxeuUr0KAAAAAACKMPaA1UKQmqJS9km0TYJcyHpTgIfSfqt32urcUrm0vtClZQEAAAAAABRg7AGr+UzfrKl8/Vi7XMi65EKsZ2x+BZ+80IP5tN/qokqH1gAAAAAAAKA4XgSsJu3H2lQ5sfkVvGEtAXbUsXC1rvJZmdOlFQEAAAAAABTEm4DVtBVbq4CWyqlum1/RlxXjYlXUG7r3uIQtAXpabGwFAAAAAACK5lXAmmxKUyvlplc91pfV+l5WuWWAew2+EwplVau7iqxqtaHSYmMrAAAAAABQPK8CVjOnr9c7Utmr0BZpGeCvuERL5/dWrbqfa1blRWsAAAAAAAAwFt4FrOZLXXRhUOmX+tZpGYC8vNDDWTu2yl+12kVrAAAAAAAAMDZeBqzmC11ajhStqeTSlgHPqtwyANl6rtXGjrae2rFV8qrVrkjxFVoDAAAAAACAcfE2YDWTOlHmTa/2qu8oelaValYXnHvdY7ejKMhQstcOIFb0WCVqc3AUq3T/XJeaAgAAAAAAGBOvA9aTurDZVnxO1QhZK1PN6n5OrwPWSHFQAWvaDuCmhfQqfzuAvZpW6S4AAAAAAIAx8jpgNcnS39oF96XXoVyGetWsN2kbgKO867O69cyF1kuqFuu7ekUAAAAAAABj5n3Aaub09XpNUaXCFAvMXND6eEOriyqZmuctAiJFX8lj+4LVSvRZ3c8q2+m7CgAAAAAAfBBEwGo+0zdrHemaqqXu4r47G7r3tEzVrL63CPAVwWrCrgOEqwAAAAAAwBfBBKzmS128ZZvaqHrmrW2AC1rv0DYgfx1r/+sRgtV37Py364AAAAAAAAA8EVTAamxTm4qGrGaxDEFr5PmmZe6k8KJFgL3HG7p/k2A14V6Du2xqBQAAAAAAfBNcwGrSkPWuqivooDXWhO8tAsYaZD7XasO9t4/tPXav1lLVg9XU+mvNVG0jLwAAAAAAEIBIAftBqyuRosvCypTiGycD6Uv5vQuFJ7rhobc253Sx0DYB1gZgV9tX3cTBorq9d7FHi02tAAAAAACAr4IOWA0h63uasaLbX+ibNXnMwsQdbb2Qx1zAWsi5YdWq7j277v6xeSpVD0S4CgAAACA3yfj0zYJUOy3Fs258Nhu5zyoB97NsWos+9/N85361/rkuNQUgF8EHrGZD9566T/NCT8tdPG9MucDV16pW957F8pgL9U7lFepZqOpu3mdZ/n8swlUAAAAAueitIqzYuKxlWcGcLq0IQKZKEbCmFZGPRch6kBU3a/XIt6pWF7Bai4C6vFU7M6ev15URa4swqdrlWHHD/bIhHIdwFQAAAEAuqp4hRIqWP9c3Vd08HMhFKQJWQ8h6rJb7aEaK7/qwLMD3gLWm6MJnI4bSvUpVQtWBEa4CAAAAyI1tGO0+LarCOtK1L3XxlgBkojQBq0lL/O+4QGtBOEpLYw5b3Q3NwvCGvBVfGXTZRHL8vZmPVTvvXttFlv8PhXAVAAAAQG5eaLW+4/emy0XZnNL0qZO6sCkAI5tUiaQXhgtsfHWsuvtwAWC06ILOlpLNsR6d0IlmURdXF4J/F3mc78d9Vtdu6MF8pE7D/fnzu9qat4bo3Z9OGALhKgAAAIBcuXD1umC6BULuc1MARlaqgLXnC11adCGrCFn7Uncfi1ZxuaMtqyxtStG6Cw0f5Vnd6t4br2fJ3Pf31UG/nyz7j+Y7is7WFLtgtTPbC1MJVUdCuAoAAACgCA2hq63IVv82BWBkpWoRsJ8LWZcjZqdG1bTA1YWHT06os34yowDsue7ZTo035a91F/hdmOjefGunXXw6706WeZb954JwFQAAAEDu0r1bXghdHenRl7pIi0UgA6WsYO35QpeW00pWQtbhNVy42HDh4tKOeyVdMLrpQkYXuMZPXPC47l7b1py+XteA3P9/0/N8f37ibV+eeM//ImPrrzR97hR9fwAAAADkLFkSX+o6s4HUpE8FIBOlDlgNIWu20gpOF7hGjSRyjK2tgP0nF7pGLXerch/xd+733a8nNg8PXyfWu/NlqCwXst99rZklwlUAAAAAReh3r40KqQtAJkofsBoLWTe02nIzVbYknSXe+Zh3wao1yE4rPW1WsNMNX91XVvXacr9hQZr7bP1XO0wbVpgLV2/YeSkAAAAAKIgFrAxEAeShEgGrmdOllQ09sKrJh2KWplBp1ev8e7+DyupI177UpVsCAAAAgAJFiii4ApCLmirElqvbZjpKqikBFKvlLjlnvtRFwlUAAAAAhYsVE7ACyEWlAlZjO5WnIWtTAIrSndwYZkM0AAAAAAAAn1UuYDUWss7p4jnrAykAuepIt935dsbOOwEAAAAAAJRMZXqwHsQ22fmN7m26lPmmAGQq2dwstn6rKyqhF3o4+0ZvZic0MRupPdtRzX3ufLDkKNrTkmTXfU3QDAAAAABAuVQ6YDXWD3JDD5psfgVkan1X8YWyhInPtdpwUel8LJ12v5x3oWl9R1suXLU9SDuKrV1+d/O2D/ck3bul24T72NA9+9JaJVgA/cRN8DQ/16WmAAAAAABAkCKh63ut1l1YYiHrvAAMzVoC/KTp5VO6sKmAWagaq3beBaeLLiTNtRl+Uu2rtSnFN05S4QoAAADk4getrkSKLgs91j7xlACMrJI9WA+S9mU9Q19WYGgtF0ae+1IXl0IOV1+4yZYN3XscK3osxUt5h6sm/TcWdxQ9e6771wUAAAAAAIJBwLqP9WV1cccV7embCOBobhZ47ZWmz4S+1N3C1Z1usKqGxsRN8iwTsgIAAAAAEA4C1gPM6dJKW/E5JX0SARwiWdoeXfhc31wIvSWAScPVusYsCVmt7ysAAACADLUEADkgYD0ELQOAo1nV6ktNn/pC36ypBDa0uiiPNrprK1oQAAAAgMzUFAVfFALATwSsx7CWAW3F1vS5JQCm22u1LFWrPS4wviqPuIvzeQEAAADIjHvmbwkAckDA2gerZp3S9Bn35W0BFdZx50AZeq3u90IPZ2NpXn6pCwAAAEBmdtShDSCAXBCw9umkLmzO6eISG2ChoppWtfqlOwfKVLXa80ZvZuUhC34FAAAAIBNWPOU+0SYAQOYIWAdkG2BRzYqqiLoPH/EVN7lwrmxVqyHwNfgFAAAAAkYVK4DMEbAO4V01a82C1paAkrFg1TZ4s02sbFJBAAAAAFACERtZA8gBAesI5vT1ugtaT8VcoFEuK7uKz9gGb2VsBwAAAACgutKVeU0BQIYIWDNgQVRbsQWtdwWEq9tn1U0aXEl7EwEAAABA6bSTvVUoJgGQGQLWjFgg5YLWRTbBQoB6wSp9VgEAAACUno3fXchKyz8AmZkUMpX2q1zZ0OqiFF13X9cF+MmC1RuEqgAAAACqJl21d+q5VhttRQs16XT6n+rKQSTNxu5DAEqJgDUnFrR+r9XmhKIl98urAvxBsAoAAAAAKq4na1qEdUcASokWATmyGbE5XVyiPys8QSsAAAAAAACAjBGwFqDXn5WgFWOyQrAKAAAAAACQDwLWAhG0oiiRtOmOsRuvNH3SBatXCFYBAAAAAADyQcA6BgStyFHThavXXmr6lDvGlk/pwqYAAAAAAACQGza5GqN018LF77W67JLuxUjRZeW0YyHKy6pV29LdCcVrVKoCAAAAAAAUi4DVA2nQumwf6c6C10XQiuNZteqjl5peoVIVAAAAAABgPAhYPTOnSyvu08pzrTY676pagS6qVQEAAAAAAPxCwOqpNDxrWvuACalBVWt1JRtWaS1SfJdQFQAAAAAAwC8ErJ5L2wes6P2q1rMibC21NFRdjxXdfqUTTVoAAAAAAAAA+ImANSC9qlb7+re6v9BWZ6Gm6LwL4maF4PUqVaX4yUvNrBGqAgAAAAAA+I+ANVCf6RsXxFkYR9gauFZHemQ9VV2ouk6oCgAAAAAAEBYC1hI4KGyljYCfekv/3edHsWrNOX29LgAAAAAAAASLgLVk9oatG3owH6nTcIHeeXU3ysKYrHekJ1SpAgAAAAAAlA8Ba4ml1ZH2ceuZHs5+ojfzbUULNcmqW+eFvDRdoPrtpKLmH8QGVQAAAAAAAGVGwFoRacjXTD+0L3A9HbnAlf6tQ2lFitZtYyr3sU6FKgAAAAAAQLUQsFbU/sDVWEsBqT3fUTRP6NqXlTldvCIAAAAAAABUFgEr3trTUuAtC11riuttddzn2unYfS3aC/QsvNDDayepWAUAAAAAAKgsAlYcaU/ourb395MNtNqzUjTfUTybhq9W7VpPP6pgdldvLGxuCgAAAAAAAJVEwIqhpMGraR7037/Xan0yDVpj9zlOv44UfZX+kXr6eVbvtyGoKyCxousiYAUAAAAAAKgsAlbk4he61HKfWhrBhu69kP89YOdf6OEsbQIAAAAAAACqqSbAU7HiR/Lf7Ja2FgUAAAAAAIBKImCFt6JAlt67k+i8AAAAAAAAUEm0CIC3pjSztqOtO/JfgzYBAFBu1lu897X1GN9N2+CkLXFQIXbPf6M3H7QwmtDErG0AuntAiySOE+CdvddTO2/sc1vt7nP0jGY2eabGIPYeT2bvPdpw/UWI9h/XBz1jhH693P88Ndndu2dis3c/MKGdvwSs8JZdLDZ0r+m+bMhz23qz5D4tCwAQtA09mHdDffdROy3FDSW9wOt7/0wse9Dt/fl7tuJi0/1eK1bUqil+4v7E+ue61BSCYIOYJORpz0eKZjuKZ21TTvd+us/x3ve/+9lN/rr3Pzrgb+rY5pdvj4297Dgx6bFiAwc7Xjbd3+9+HX/nfr9lHzZwIgxAGdh5VVPNXUs78+kmt+5zd+PbfZMTne7/9s4pO7/S86Wl9Dxxf+Zbd01eP6HO+knOj0qxAGZHO/U992U7ftzXctdnzcYH7Nex9x5tetdfxzZpdsdTtO6uvd/ZvXpSM+sE+iiaHde7ejOfbAT+9riu28dhx/VBzxh7rpempbfPFvZMkRzjFlju2aB8LJIN0KMF93O5nzU5f91Hff/zVNz93857v7f/OdvuBzWp6eu5Gwnw2HPdW3In0035rzWni6eEICWD6+iZPNNWfIqBNpCvZPD2ZsE9Ep11D0ULcbabKzbd4+LdKfeZUGB89g7Q4+7gJQl7dEB47pH1vYE9IQB8t/daqqQ4oq582CDbBWSdR1xby2dfENNQMddoC5/smvvohE4087zWbmh10Z0jvq3QZBybo16Y6oLUs246ad7d1xtxwRt5pwHluk0uJBNWE+t5h67Jz7191U0iLyqn89ids2s1dW77VNRAwAqv+Rp8HcTNEp2jYilMBKxA9TzXqnvAja67B6H5gh50mxa2zunSipCLd4OYyL2nFqLG8wW+v0VYTz7iJwRL8MGeUPWyxrfirMlEVrjeVfJFl3OY5BxWM69jioC1GuwZ0wLVOFkJ1ZCfcpusSp+x7TivqxjNKcVXfLgHELDCexu691gBtAlwVtzN6YoQHAJWjEvvAazTXToZzyssVuFhy5ufRJpYG/fyo370ZtPdwGlpjIO4lvv3bxC0jub9MLXQSiefWDVK033cDeH880ky+KudV3LdrctvLas6csf5ky/0zZo88MI9N+2qdnnM19KDrLh76m3OB/+lzz92P254Pgm24p7P7mZVREPAWl69+4o7XhYDndh1YavuTipeGyWo/EH3F9xr8FDFa7lryoVxX/8JWOG9H7S6HCm6Lv9tTmn6FEv4wkPAiqKlQd91F04uqSRsmc4Jda75WEHkSbC6X4ugtX/JddpC1Le9cUObkMhbyz3Wr02pc5sqvsNZMLiThBsNhak1zutGr/Jf/r9+TTfAv8HKMr94ei/uVyuLc4+AtVz2LINfULmeS2y1zO1BK1vTe6wVx9U1Hi2Xx5wZZx5DwArvhdQmwF1cb3yhS8tCUAhYUbQN3XuqcgZE7sEmPudTwPM7PbjaUWfZ48GcbURwhSDgfe+WHncDVRu41IV+NWlH8SEPBn6ZiRQtf65vbqgg6WtnweqiwrLi7kk3mHQYrzSYtzYSiwpfa5SglYC1HHrHtEdtLfLUdxW3D8f3uPMYAlYEIaA2AevuBnVGCAoBK4r0XPetcnVZ5dV018FzGrMx9H8aVeWDgEB6loWkRZX0O+5Z0q4HiyqJInr/B15x+FbRgTQSJagYP0prmOsrAWvYAqriz0PruGPek8xmrHkMASuCEFCbADa7ChABK4qSDjaCqMgfxTivg4G3X6hUNeu7zU2C7lkWglbVg9aSXntzncwKcJLqON6tsCirMrZBOsJAk6MErGEq+WTBoFqHPVO4gDWWB6Y0fXJcbQJqAgLQ6TatD0McSBAMoHg7FXkwS5cCFs4CgR1tPQ14UFd3r91jq3JWidn7ZNWEu9p6FneXbIddHReAug3o3Wv+zAaJqqCdcj6bNSzIUg7cNehmXJJ2Cnt0Q/ayX1/HzdryJNf2SoSrZtEdV09/o3tV+Xkrxa6xdj1MJ+gagqn3nimSCYNEXvejYbzRm7F9LwSsCEJaxddUGBpVHcAAOM54gscxaKhgZQoErIVEupy5NJJQ9f7N57r3In2fqFgtXi9guunTQKgIUUk3RbMKcGXInl+tR3iZwzG7vlbxHMhbeuw8bqtzq4LX9lkXqty0n58xYHmUYNI+b/U0aO0e9+MMNX1CwIpguIfjRwrEliIuxAAOUpWdz+sqSIkDgcUyhKy96g8qVf1h54oNGqsSBNgxGJf02htneK39QfcXdhWVdQPG96TnAGFYRpKq1e6x01C1NXa6q1CsnzhC9f5zCxts9sGO+2eTqt0UCFgRjklNrygQ7sS6zMw4gL3Sa0JlrgvfFzBwtUFMyQOBRXvIV6CSnmVUf3iqW81ahWWtWVd5+iSrgNWWzUeKH1ZsAmTewjBC1uHZc02Fq1YPU4lWP2WVPrc85rllcO41WxBcZgUEwhoVu5t4U2HMjs5u641dmJeFIyWN8LcWO4rOuod7GwTVhS7beMsd8yqrSNqMu43Ste7e+7tl39gnGeSzt2RWrGLGBnUqOXvId0Hyo9DOj3RDCKo/PGfLWl0Q8GmZd1iPVJuN5cW+G15KKrUqGybU05CVza8G9EIPXEC99VBc4w+UtqKYddfWa0IQ7JjeVceeW5gswNCoYEVg4rsKRKToKlWsR3vXCF83o2TWqy5URlrtYKH6os3223JoKknQD6sMqUK42hP7t+PwsdJNheqC98rY83cv9/PVhQPZ+06lVi9k5Zm9X7/V/ctpEFUXDmXn1g+6/5Bjy392TO+o85RKbIyKgBVBmdLMmvu0qTD0qlhxgF5Awo0MeyyWeZATMxDJRBoILKta6u7hP5ilVxt60J04EUJSip6/B+ko5jljn97SbnGe9tTTakwcw57f3Tm1wvN7f6yAJOn3S8jqKwtX7ZgWkAECVgTF2gS4T0FVsQofsMF3BQMS9McGOTRJxweqHgi4h/+A7icd7n1hKm3IinfsWmqBj9iQaL9GyD2vi5C2k1gWBjVPyOonwlVkjYAVwXEzgWsKhwsEVheFfTo8wOIoi2kFXKlQwTo8AoGuRiiDs6gCu5CXWNAbqx2iLry1q20L0TlHD5Au6WajlgPQTmJk3ZA1UkTI6gk71wlXkTUCVgTHNvpwg7d1BSNiF8k90h6bDQFHiNVmgIOuPeFq5QOBtrYb8py9XzHvVdAsRPmN7hGklFAaknF/PUKkmH7w+6SV7YvCqOY7Eis8PGDneM2d6wIyRsCKILnZpkcKR50q1nd2CFfRBzfDf16oPMLV9+0GsFnPG72hOqcE3ADh5nOtNoTSsN6ZIiTrh7vvhLexYF4IV7MVUVE/dhau2p4P9BFGHghYEaQTmrHdo0PZ7EpWxUrfnZ7orIDjzXPOIO3HS7iaitisBwWKXchEJV85WLhK78yBNJhgIJRHOe2qZs+WdQE5IGBFkGyzq0hRU+Gob+sNy+0SdQF92NFOXaistA/kovCWu+99JaA4dSr5wmdBIeHq4JIJhupO9BLKo4x+pwdXaZOCPBGwImCd2wqIGxhfpSKvi2o09KldqmMlklpCX9KBHZNS+3SkH+W5Gc0EtLoEfWiUoB9rSxVlFcgxIfmwKlsckYZQywJKxK6HHXWWBeSIgBXBss2u3KemwjFb9SrWNGAmZEZfOuy0WkkM7A4XKfY+vLQVJgqqhQ+O4wYLtDkKlPUZFCuHhlbF4ghCKJSVux5ep+8q8kbAiqBFUkibXVW+ipXNTzCgukqkphqh0zFsYNdW55ZwoICqoNeFMpnd1fZ1BaqqqwfSNit1YRSVKo5g8x+UVbrh9KKAnBGwImiTml5RWJUyQQ9SRjXJgz4G4G5Qn6pEOopawqF6AzvhUAEFRd8KpWItOzb0gBY/gbAwgTYr2ahScYRV+IlndZRSVNnxN4pFwIqg2VJE9wAZVC9WBilANU1pqiUcyg3sHoqB3ZEmNRNEZWgtrE0o0bfOTQVpolIV1TZZRZiQqdktbS2q5Kw9j6jwQwml1at1AQUgYEXwTmgmwOWkoQ5SAAyL3pSHs02txAZ4x2mmx5D3JnSiKZRRw3akV2CqNrm1k2xqVRcy4wbM51Vi9F1FuUWXBRSEgBXBswFnpGhNYQlykAIUrK6Siajs+8APur/AplbH6wS07D4NgptC6XRUu6rApMdjSxWQViE2hKyV+rmdzX9QVklFP9dEFIeAFSXRCapNgIkV3WFXXqBq4ifCW/bgGymmor8PE4qDmkiMOdZLyZ2vCyE+u7jj8a5KjirEfLUVLaiE2PwHZbZDuxQUjIAVpfC5LjUVXrVMvUo7kwKD6kg/qmQC3JgvV7uqsct1f1rpfS4Y7vxdEUopxGeXMNtJDcZaA1CFmB83aC7dMmP69aICGiqHlpKsY+Wwj3RFbzP9aEWMN8ZiUkBJRIpvxIoaCkiyM+nqykldagnAe2r27F8ytlT1N7p3w/1sla/atKWsbXVKWRGUg6YC8wt3X9vQvaZYmlc69uziPi0rIHbtdcejrXYKrsVBP9IqxIaQp1lrExDaZNdRdrstP+K6gBKy8zUOcBLfgtG2dLemeN19bv5ixJzgezeR4kK/eqTarHvunq+pdjpWbJNxDSFzBKwoDXvgCXAwN5tuRnBOFRBrYrNb1wRU2Je6eOsHrc5HFW66b1UzuyxlHUAtuDY4xg0SHsU8wJdRkEHTlKaXd7R1ViXbUM+upyyDLUYnuZ41VQLJcROzkg6lFYfX1mMlUnw363trGtC20l++125qQw/c/bA9b89qblxyWmw4OzJaBKBUrIpV4WnYJi+qgLbaLFVA38rYIqDnC11ajJPrVUsVxFLWgazP6et1BYiWGOUVYj9Kq2J1IatNaN8u09LJNFytC7lzAcRZlQShPCrgtMLQbCs+NaeLV4qeuLTnyzldWrFxifv3z9j34aLpK9a3nBYDw4kElMxz3Xsahzf7Yg/9p9KdbkvLNsbY0Vbpln0jHxZAuhv+skou2Zk4mm+7AbKb9fxU2WhozANue0g7aFlT2hqg9P0QsxNfsYdfBWpD9+y9Dn1ZduuQzwepp59n3UN2vcQTCZtuMHZSgXrmnkc+0Zt5q0iMFc2OeO21sHlc7/OKPNqgyAbkcXJ+7J8Uqit5jUKvjirF83pa9fxMJZYei/Y+tbTvmu2C8tl0iXTZr9P9arnr+SmVjHv+iOWxtBXADVvZJk/ZGMXdJxdris6HdJ4cNgYpAi0CUDruhnlbybL7kMzuattmkq+pxNIeaPawQ+UajhVVpLozj036ftCqNbuvyzPJoK7DksT+tUIOV417yL01kfTs9NbeUMg9Q3yXXHsm1m3VRRYP6L3+Z3smUqyqpqGwBd2P8lQSkDWVwbXXPdfUNb73c1FjlJ47LkyN7/bbK9COG6uAdufBeYVXeeue199YSNxUwMpYvTpK38q9Ey5plXJDCFraf9VbybWzdu5Lz1co7R2jJL2+u+3NGsKhCFhROjYYdQ+7wS2XcoO6JXczeFSm5vmHIGBFX6oSsFYJS1kH4wZ7QfZe3csGuS7wv+tRz+GW+2i668u37ntqucB/Pe8qhz39z5p7f79XGZIO6OsKTJn6UWIwFg50FN9+pZlbpwas5twzYF9KB+xB3RdcOBx0wJpMdPpT9TyKXqg6oXhtlPHT/gkXC1x/rm0L6C678Vkl2riVjW3o5N47+cp9b9dCa/+UTviv2KSxmyBbrvJeEkchYEVJWW/D4KpYrRn3nRd6eKbMrQLcDeWJj5V18M+kZoLsO4mDpbtcLwr9arnr5ZpK4IRmlna0ZdVqhU6uJf3Doqa78zxxH+sv3TXllEf3172VIUmrkNrVkAbzZepHif6MEqwepDdgd5MwNlgPoqqyFk5fxwOVoXo16+Nwv/TvtPvvWrICIVqIk1Y3dSEIbXVsM1l5aiXk1UnppPGiOzeWCVo/xCZXKKX0ohViOFNPWwWUVk0RoRn6sV72nsTVw4Yag4lvjKt/VNbsXO5IuW9CmW7IsOI+X7P+W5/r4snP9c0F9/mWhZk+hav72fdn32uywUQw1fuh99PEYJq7is9Yb/SszyX7O+NwNqoN9ri36lUFPtFpKzteavpUHsfhQew+bPeQpEdpfEWsrgpCTTWPJ0Jqwa9OMnZu2OZY7uc5I86LtwhYUVqR4iD7maatAhoqqVi1poDjEcSXyHPdpzXAYILvvbqfbeJgu9IqQxaoRorW9gaqyS68F2+FGk7b920D+UDCptkNPSBkrQAXal1zx+W5PM+rgELWugK1E3bvxJYb251z95KlcU2W2X3Z3WvOZX0vQ/bSTcx8tB5aa4Dj2M9jzy2dZC+ZyhfHELCitPLYOKYosaKbKqn0ptIUcISIh9fSsIoZ96C7KPTNBnAqIWsVoNEnT1pWwWQD7b0VqmWp9u0JJWzqqNMQSiuZxOiGWrdUADvubdJEfpt9oYeB7iUQ5koSOyZeafqMD/tU9Kr2ouQ+3RK8FHm634d7fvlOJWX3Cff8atWslS6SIWBFqUXhLDfab976Uam0CM9wpGYFNnurDI83tmopXU5eU3TBljhZFaQbxFkVZNT7SJZs187Yn7E/mw7+c3t4jEvUGmA/axXgXtMzQwSHzV6VqlVJWAVTFa4RIYSsofejxJFa1hKg6HNtVx3vq6B2tFNXYNLVcXUFxq6BNpHmW4sXOy9sMjSACYFKij0NWF02UerwMV2FcyaQ1Qi58LbzL5CVDd17rGCXxNTOlG0ZQY8LkFdoio0DtOyBtawBU1F8OL8sDJtRN2B9Jg9YJVbc3bQifvJKM2ujDtZs44sJd2+JVDvv/s5GFg/zVplp4aEqYM8utLZRUn3vf0vfq3X3+dFLTa/43Du1CM91/6HHm1/Z0sAzqrCwnzMPNdZ7se+bXtmE22f6JqhgzR2ntvnvogJiIY1NNMlzIW3SdohW0mO2PNzxbs+edXkmlGM6CzapEyebjtdVMBuDjOv+NSmg5KyK1Z3cDQWpYxelUg5cbHmNeyBpBf5AgmytuxviBcLV8vBkt+JmHkFdepyu2MczPZz9WG9cANYNtRsagvV0+1KXKhGumt4utPa19fGM1O4G1LtuoMc14H2TOnFlR1sN+VmRUxfKZuwTnSc0c8sd87Zru6fLfDtBtQiwlgbu9fR1kuZAIQVR9n26MY0Y0+A47hj5ShVhVd5uMv3chCKbhKyrQDOaGdvEPC0CUHp2cgfcjLzUrQLsgcRmmKxqS0m1UuUbY1dQS91l2vE5q4IiWCmPiSRoXNT4NNPjynp13sqzCvJUd+n7pRX7t2zlwaD3HLsGJjuxVpOt1LB7tX1wDfiQtVZwx5Svuw4H3I8SB/BiFUl6zD+Sp+LAJhZ2uhOAfobVB0nvicsKSECbtGG8Fqp0z7R7SbqvQJErctdPjnHlExWsqAR3o152g/3zCujhosdmQzf0YK2srQLSh/ixVm0lS339WMa81ziXNwCjG1slhwWrN8bVozO9Vi+668rypGo3j1rabZNKHUVXvgxsqSmK53NFX9qPstKbWpSBXY92PWrRU3OTry7IpJVUBqyVTWyxcBhaobbKsZB1Q/fsGn1VwMFmd7Vtz8fXVBF2T3Gh8jn3c98pqN3RWJ9HqGBFJdiJ7XH1Rx+6rQIAICR1FSgJK3UtqVj1Y6dh25jDJkrSqpamkoc++3DBQXThpaZPfUG4ij6k1RiersZpzwvBc9epaz5N6k5qxq6VXq5sctfvoAo23HvbUADsPp5WuwVrLgmHmwIO4c7Hpd/qfqUmj+wZxp6Ji1hV3B5zJTkVrKiMtPrDLmZ1hWf+N7q35GZ0bwkA8B7bxfelTlzxcTOkNLBYFjCiSPGaC3a8q4zqBBY24UNpv8sVecQG5Bu6ZyFrQ56pSZ8qEC7IWegoDuIcbUs3yrByywU8V8bRdxLvacnj19+dkytubH+yamN7a4flruvWh7ahHNi9bNzXECpYURlJ9Ue4vXHcyXr9hVbrAgB09apWbVa86jvNo/zSij7vRIGENzhUy9d+l26w/EQYiQtyzisMrbKETRbwuOviFWFs3LXjO3nOje1vurDxTtXG91OazqWS1cYDPtzLCFhRKXPJ7HxTYZrdUUSrAABItGLVzlHZj6pI2wS05Jkq7YpcRj4vyZ5Qjd6+I3ITkUG08ChbIJm2Kgq4PV3Y3H0plEn3RTe+f2ZB63OtNlQB9iyTbOzaPeebGoEVWsSK1myDWV/GA7QIQAXVrrk5jqcKU4NWAQCgdRcKXPiFvm4JqBA3aFyPFdcFZMCH5ZRH2VFnfcKG0BiKVcbthBGwrvjQOz1rU5peTtvTUeVfsKg7CR+URRcU2vL5lpLNWu+W8ZzYKy18W0k2m1ajo2i+Jp12v1d3799s/OF503Ifm+45qOXGAN9NKmr+QSeavq1gI2BF5dgOz+7iZTOKQe7wmLYKWDvJ7vIAKsiWFb3WzBItAVBFPi577FhBCkLkbWuAHgt/3TO7MJy2avN21fBdVMDGN+NglXo/aPW2C4SuC4WyEC4O4Ng/QF3vwlb7dVPdiVU9sZ/JcgyVTDrJt6KSIGBFJQU+o9hrFRD0LpsAMCgLV5NlRUA1uXPAqjfkk5A2/ME7Ae3W3hKbBQ0lkP6rzTJX6gW+yXKwSlT93nB3/ob7SZbsCSANXV3gGrXcGf5trdsKIXa/ntgsY/gaIgJWVJLNKP5W96+4B4+HClPD+rSUfekAAPQQrgJAZlZC2a096bGHYVj/Vf9fu3JWr/bYmHNDqzfEPhqFSqvfbaVTGdszzEeK590xtZCc3xYkd3rha0vd9gjRprVJcH/uu44LY2vqbBLCFoOAFZX1mb5ZcxeiprozQ+FxF847L/TwzEmWyQIouUjR2pwuLgo4hvXyqqnmBh8d699V37MBU13vVxDV1Z/W/q+TgUvs7r2RG7B0fkx6vdU2bQCz676e0cwm92b4rK34hgLhzmPOpSHF/vdf3ZzSzJpKzn7GHW3dFL1YC+Xu/003Ob+gaqmr++yTRK/2v/Z1vCeETSet1veGsFTBZoeAFZXmHjCvTCiyDa9CvOHVt/VmyX1eFgCUV+ulTpRqd2GMzk0wzu7qjVVwWIWWbYrQeLcpQjKkyGhxYH3/19Hbvm7x23+lN4CZkC1N3NJz3bMBTEtJONRKeqfW1i2EndTMOgEsxiiY6lVj545vbTFCYCvdAqj8XavCtZBerOMSP3H/U7WA9Vjp5lGNvSHsQVWw1vu1VwFb1v6veSBgRaXZA2bINzz7vl9odYUNrwCUlO0Ueo4NrWCB6o7euIFSzYWp8YILMevaF7r4FCakA5i31WNJQJSEsHsD2F4fNcJXFCWk6lWMIvK9elVpAFYJaS9WAtYCxao1u9swYlD15CNu9Cpg9/Z/VXfiONl4i+eWDxGwovJsB1V3wbAm8AE8iHyIDa8AlFftwi/0dUuoJFvuP5n0GDvvBqYNpSFlGfQC2F4ftb3hq3smWd8bvFI5ggwFVb2K4cUBbKpUhfYAPUkv1nBb04XI7pvuNW8pgHMhIGlekmy8tf+5pdadNInXqxy6ErAC6s7MXHMXhccKExteASgdFzfd+IJQqXKSpf9bixaqul+GsMQ1D+8Fr/aRVrza+UAPPwyN6tVKOS2/NasWwLhA6lFMwFoo2yCV1gyF6D63xN2WDO9CV3X74OrJCZ2ozPleEwCl4eRtBSpmZ0oA5bJiqwuEytjQg/kN3b/pwtVn7mHcNgNpCG/1eqYp0NU28EKT6tXqiDyfjOlI36piJjW9IhTKhV1NYVzc80q85ILXhy5wfeEC18dusnjJnvdUYgSsQGpK08t6f7fgkNR/4y5YAoDwtaiyqg5bgWEP3W64/dQexGMqNIGcxHeFyog9n4yZVNRUxaQVfC2hMGkRVVPwQSOZQO88dc99z2xSvYxhKwErkLKbnpthCXanancyX7ellQKAoMU3qLIqvxdarVuwmrbnaQhAnlpzurQiVIL1r5bnOt0+05X0SChUxKS9j+o2qf4ubF1dfBHAdasfBKzAHoG3Cpjd1huqWAEEy4Vta4QA5WYTgc91//qOomciWAWK0hQqY9L/TX02q7txX0xv+YKl4/uW4Ku6i8Hv2HOhC1vvhB60ErAC+4TcKiBSdJUqVgCh6qhzTSgtawewo62nseJlAShMRHuASolU830sUOGQcYKAdSyoYg3EYhq0PrZnRgWIgBXYJ/BWAVSxAghSR7pNa4Dyeq77N9N2AHUBKFIrreBCRbhJrLo85u73P6qiqlu5O17p6qimEIqGPTNa0BpaRSsBK3CAkFsFUMUKIEAtNyC8JZRO2mvVqlaZ/APGoylUSkex1+OAiGXyLaFw9GINUiO01gEErMAhAm4VQBUrgKC48O0u1avl80IP5neSqtXS7RILhIL2ANUTKfI6YI0VbarC3PtDFesYBL7XStVZ64DHthmWPEfAChwi5FYBVLECCEirI60IpfJb3b+8qw4tAYDx2qQ9QPXEnlew1hRXOmDtqFPZFgnjFvJeK0g2w/K9mpWAFThCwDNds1vaWhQAeI7q1fKxcLWjeCV29yIBGCcq5Sqoptqn8lhEwNUSxsIKqNqKz7kvKx3yB65bzepryErAChwj1Jkud3KfFwB4jurVcumFqwIwdu76+kioHN8rWIFxSib142tCyOrWm/U3uuddW0QCVuAYAbcKaDzXakMA4K8VqlfLw3quEq4C/phgMyF4KNZExXuwUsE6bnO6tBKz6VXwXJh587nuX5dHCFiBPlirgEjRmgITK/LqggMA76ux2UBJ2FKtHXUeCoA36L8KH7XVZnk2xu4LXVomZA2few+XfQpZCViBPk3qhFWxhvZA0GCzKwCeWp/T11RXlYDdZ6wfltjQCvAJ11cAOAIhazn4FLISsAJ9slYBHSm4C/C23njXmwQA3OMQ1aslsatte6itC4A33DPrdwIAHImQtRx8CVkJWIEBfKmLt9ynpgISKTorAPBMO7BrKQ62odVF91DLRB7gn6YAAMeykLWm6ILCW62KPSxktc1WNUYErMCA2uFteMVmVwB802Rzq7Kg1zfgIza4gq8mNFHp9mWRItq3eegzfbPmxvlnxCZkQesovrWhB/MaEwJWYEAWCoS2jKDjQlYBgCfcNemRELx0KVZdALxT9Z3a4a9I7UoHjC4AImD1lI3zpzRtISttrMLlzq/Ow3HtQ0PACgzhhGasVUAwD65upnSspfIAsFdNtaYQtBdardtSLAHwEpsIVpe7NnvdfzdSjQpWeMv2XZnTxaVI8TlRzRqqero/QOEIWIEh2IXXPb5cUzjq37vBsABg/FoM/MO3Q2sAwGdUr8JbHXWqHrB+JXjvc11quqD1FBtghcn2BxhHm0QCVmBIc7q0ooA2EHAn+6IAYPyaQtBeJBN2CwLgKyaxKswFeF4H7J2KV3DGtAgIim2A1VZsQetdISjxGIoBCFiBEUQBzWi5h62zAoCxi58IQdtJ+nozQAQAD7kgyPcK5rqqrS4ExXqzuqB1kaA1OIVv9k3ACozAlg4onGqsxriaPQPAOxNUVgWP9gCA51pCZUX+v/91VVQ6FqsLQSJoDU/RVawErMCIQqpibWu7IQAYn036r4ZtQw/mxeAQ8FpH+lGorJpqXlewugDitCpqV2/mheDtDVpdhHdFTGr5rJE+uxaCgBUYUUhVrLuKGwKA8SFcDV5nUQC8Fvm/RBw56ihqyW91VVZEwFoiFrTaviy2GZa77p6zqtaITQa9E6td2L4BkwIwMqtijRU15Dk3o0IfVgBj05G+FYLmBg5nY5WHDYTiZDDUSn+r9eGfiWb3bUoyq3c9aOsCAI+01d6csKubx77Xat3CKVVMXOHq3bLrFV0908PZj/Vmwb3XjZqi8zE968fOPcdddZ+WVQACViADdkHd0D0boPl+AZ233j8ndYGZNQDj0BKC9cINiHfcfUSBSqpKoqZttOYetls76qxnNcC3sGBCE7OR2u6jNttRx4Wyqrt/5yslIaz7fdUZaAHIm13XfB+XTCSbJa6oehpCqZ1Kxtkr6Ydsk6W2ooW00IkK5vGYtfchDcFzRcAaOHugr6k2X1PsHtrtIT7uNc62DxtMzB7yMN/68HO0GSn+zpaV1NTZnNTMOkFc/2LFt6MANv5Ie/80BQAFm1BMi4CAtd3zRrf+JjDu+WjNPdfczvPBut+gNqls2albEGtLRdvueS3tR2jPagy8AGTF64C1U8Gl8kkfyE5dqJS97QTtGeATNxbvuKDd5QZnXVYzz8RrMTrJ5EZTOSNgDYhVHibhWO2sC/Ma707IOB3ufDjoOWIYVN/3Wb2/J+p+jrSjLTfjcs+WzrkBcbRu4av7M+sErwc7oZlb7jXzPmBtJw80TQFAwWJNcO8IWCewPt7uYfr2T5pePuXRM0v6vfQmGpr7/7sNwG3S3Hqmp8FrXbQhADAgF96suxFdXZ5y17fz7tOSKiRSp1GmFjsYXPoM0NSe+38vdE3680Zn0/OWCdeMWaCtAhCwes5C1R29WXCHxOVdbblANZrVoXFq9tIZlYb7Kr0hJMHrhu613PfiBgidb90NsknoKtnP716Xpjxf+lHlnTsBjNecvqaCNWyh3D9a7m534csAj7f0HLGPtd7v7R18uWexy2LgBeAYcbcwxmv1qvVhjZNQGXjPvtD1Vu/3exOubXXc59pp6wVPxetICnl2ImD1lPWIcAHmdQtV1Q1VvVuUV4+6syuRNXC+noau6aAgfjLlLhAnK9i43P3sd+X/ZlcNAUDxqF4NXwjB3vorTZ/zqWp1VHsHXz9o1Q2w2IUawHGsJY/fG125a9mC9gRKZZb2MG8I6NNBE66mN+lq/d4JXwcya6F13sUeBKweSVoAbC1adUKcDmICW0Ywn3xEi+4G8rbKNVLnUVUC1ynNrLmw+Y78VmejqzDYhikCyqMlBCtZUbPl+zWpdOEqAAyj7cZeE/Jb2iagEgHrTgD7dCAMeyZdzdr+/24hovV5j5ONNetpAFtno03TtryKgLUKnuu+Vasuleygf1vl2gtc1b0YlLfCNZQ2ATvaqSvniwtGV0t68PA+oSwIvQKW9ID3uhqq1VZ8gXAVAJKN99yYxOuNrpxGhYo+GgIKcFSF5t6WQ7bJ5oSir6rU87WIzfUIWMcsbQVwx+cm5Bmqu4/FPRWutnSlaRWuee7sWzQ3/HwUe38TzX/2BqPrqEMFK0qjI/0oBMuWosVer6uJb1Splx8A9MGe9Rvy2LbeLLlPyyqxDa0uis0K4YGDNtnqOaDna10lC15r0qfKGQHrmCR9WCxYrfRsljthY9u4a8mFrfbrZtLDdGI97I1Q/O951En7+iKRzvLLNx367KFEanbrQ7A8nwhuzenSigAAe30rz8eakSLbuG9ZpUZ7AN9YkVu6caRt3mnjLethOnvAauKW+9h0eUWrt7l3mQrD9jqs52vScqDTcK/X2XTj85BzhLpyRsA6Br/Tg6u76iyLJsT7NZINojpv2wm4i9mjEzrRDGnpiF10fV+SUwtnJ+iqqwsAPNDpbqDg7eRhUwCA99QUNd21+6r8Vrewq6yhlbUBrMhKVe8l+91su/MhPrAt4yFrdOr2P5Hi+d7m3r2cYkrxjSrsMbMneL1lv7bztSMtuuvL+QDD1rpyVhMKYye1u8g+bKtziwbDx6q7j0V3MXu4o60X7kL2+LnuLdkMigIQeb6ZS8faxeItOzflIYJwADhe1F39AgDYa0InmgpAXNIKT1ux6sLVZWHskgK3rWf2fmSQw9Tdx+KOomcWoKtibDLkC11a/FwXXZ4QXxGb2L6HgLUgSUuArafupF4QhmHl6DddNPjUha3P3MedH3R/wddgzH2vT+QxgruEzcBt6P5Nu+HKT3Vfj3EAlVOXpyY1Q09xANjn5Pu7jfuskfYpLZUdWgN4wULQvArcLLC1XEIVZe2Z5nTxVEe6pjA2s60rZwSsBfit7l/eVfRULPfNSl2eV7f6XsGqCldQp5XktrzDzWJGjw9bJuKLHb1hUgYADrdZkR2oAWBgLgDyuujjneh6mYoKrGJS3c2dMU4FVREvVrGSda8vdfFWW/EZUc1KD9a82cXVZkyEPDWSzcL86d0aKWr5vduyZu0hpiqD0qTnztaie0fOu1C+oYBUYaOr793Dz2TS18gqq+vpb7ds2W9Ze3IByExlwlW7l7l72HkBQJ9q3XGRQgh/6rvatu/zmgJnoV663wrGzDYVVwEsxP2t7rc+0zeVbVlkm0a7Md25iW4BU3ULC6lgzVGvHF0oUl37qlttCXiyU2BxdtTxfrniG70pdRWrDURtuZEdA3YsJC0m/N5J9SDuIn25jG0C9r4/7kb8LH1/FpW8R/axaBXGVmlsD6oCgAp7oQfz1mpKyW7HvqGVDeCpdKI6iIkoF1ItFT1my1oyERY9Zr+V8UvHTw0VpKN4JZT9YvJiIWuU9GWtLALWnKQ7Bi4L49ZIloBH1kagsHYCvwhgR8EJTZQytEve3yRUVTJr2VDYZnf1pjQ3616LhqTvbV/vT909qD61nssCME4tYSxsNZSbuPW51RRBAuC3YKrq3JjtTsgT62788VC0BfTCeMZPncdVD1nTSZ2mKooWATkgXPVTOpP4tp2AC+I2O4qaNcVPYtWac/o666rTljy+wUZql2JAlMx01866c64R2vL/fqW7qzYVMHuf3Hl2Pm3VMOixN2tV6S5kvfCFvlkTALxT2nAvbQnwsK1OQ34jYAU85p6h1tyz5FWFwSbWLaQ8o8Ckmx01BC/E4xmHz6Yh67kcsoWQfKuKngtUsGaMcDUccRLaLCRLkztPrcLVBTgPrQIyi+UpkefLceJAZ1ffLS231g/3XsTdZTjdc66h8mqEumTKvm+rKM5iQzF3vgZd1QCEzOPNG2e/L+F1war2k0r/IO5tpXwPgLIIqU1Aaj60ndnT73dRQBqyVnv1XexruNxSzqhgzZCdRISr4doTuC7YUNIqXN3X7uIQrUfqPJrUzPpgm0JFLfe3VnqJQBaSDarezFv1o72eSZWqG+rL823EMuYCSutRGsRsfvKebV8dNVA9wGzarP6cACAVKbJBTCl63iebo9RuxsnzSDAmkiB4RQB8ZW0CQqliNdanX3O66HU/x3SlgW3qw5gPe3VX3z3X/eXP9c0NVYx7Lpv19Bkm94kmAtaMJA/E8Z0qBT5l12sp4L5quHBryd08bXZy3X3dsrYCNjNz1A7nHXV+jLpBIAZhDyrb2m64V+7s/kC14ubdTfqmu0l7u7tq0gYgup5zq4bGb3Rv6UtdZANBoFAT63Zn81FNchNw4Qes1mvVdp524WpwS+47iggXAI8F1iagx+uQNd18kJ6rOJQV37nx2+ykTtwYrFArbB33HONpDkLAGoI9M1f0oCq/efeAMt+rcrWbvvNe6Dp4pet4+NAioFed6l5Le01Pu9+yPqp1YumD2e6qP+j+E5/6kOZYrXooF6Zcd//uSpUeVIBxa6u9OeHvpGG3jcpRk54+SyenbrbVCTakdNfly+66vMx1GfCTXR/duKWp8FpqWcg6P6X4wkmPNhHuTYiJ8T+OYeM3N75deKHVcz4dw3ly4epZ+amlnBGwZsCdMLZ0ty5U1Xuha1rp2nLDUF9L48fC+rPVVJt3QXR9b5gqqnwHYn1IN/SgNc7G6e/aNuRerXqY2W29WXKflwWgEL9wgwJ3b7PwzMvBZIibAfaq/uNy9BDnugx4zj1xPwr0ejO/o+jxhlZvzOnSisaod90OYPNB+MU2b3tWhZYBtrJ7x9PrjAu7v1POCFhHZJvtiIbW+FC9iuFqUs29U5fa82nvFQtS3dfd12O2an1Tc2KN05/+RveuFb1MPnmorJ3f1daie7gca8jijq+r7ni7RbUUUBzb6Cr2t89cMO1DShasvpVcl1dXqlKhA4RmUtMrbmLcJqNCrLqsu6vMHTfRd3ZK8Y2irzNlvW6jWNYywB3Di+6rsU8W5GVXtcu+tvabUC33AiUC1hEk6Xy3YgIoPQtP3+jN7GQSltaTADX6SkmvuG6I6h7a0ge26L3LKqFq9mrSTXeDPp3nQ+beDcbcO7roWUg+u+WCXpVkYxsgBB3F30Ye99q06+Jvdf/FZ/rmrjxUgQG6bUT40N07zjH5BfjHzssftHo7Cnv8uuiuM9Y2YKWIoJVgFTmop5MFl9346kao7Y0Oku5LtCRPdbqbkOeLgHUEabhaFxAg643iHrKW9/z6qz3/ua5kdrs3w23hqSb2BKfxnv99/ysUKPOHzA09cGF5xz1MyipV55NKVT8rj8uysQ0QipqidXctuCyPuRB45bnu131ZgpdMVFnVv85XZIBum748rVKvOSAkJzRzy52jttlV6L1De8/ATfecendKamZ1zemt2HpXXADkwsL7hh3DZQhaA9iXaLOIFnsErEOiNQBKoOFC1YZQBm8fMl0U+sQFj83jNluznrgTmpi1dg4uNjntHk6tCtkFqp3Z90N0rwW9sQ0QGjfgbFqE6TtbgveD7s+fUOfaOEK+dxs41q66cLVRwQF6t9ecTf65QeNdrtGAP0pSxbpXQ248syMbn1vY2p0IfOJ+vtaUplpHPQv3VudNdP+Ovc/CtDVDoXpBa8taB2Q5WVCUZGV3N1yty1+F7F/C7jJDcifAM1G9CsB/rQN+r66ScI+/N77QpWUFolcVkbTZiOvKKXhJN9nzKtRx39Om+55CWjbccg+87vvtfHtCoq9kyj3/vFBYgWEhIZ9NWk0qWugoOltTXMVQ9Tito/6bnWvudXsyqXit6HOtt3LD3rthrsuBXm9b6Z9cdz/7o6JD8EHuhSW6n3WPc3u9xx2gpJVmNpatynWqtf83fDyuxqylwdk5sOnLcb1fUhAX3VGA3Gu6lrymM2u+t9z5nR5c7aiz7Pv51JEK2b+EgHUIIZ+sAFAym3O6eFKee+EG8Dvq2H3D2/6VONbKODbW8M0PWnWBZeR1m4BDtNxH0w1aHlll0yjLxN5VqEbz6WaODTHpnqVCzrXkfdy+4ybqFoSWe83PFdTP0u6FdVWcuw7d+lzfXNOYWJuwElWxwhPumFr2pUVPiTKbpgvtHtkqoiKWuPcjmaR54+6d3efBhoJQO1PE60fAOgSqVwHAH5EbFPq8BNXC1V11HlMpUQouhJg+U+UNfMoyYEkr0FpKKnBaLmT77uA/V/vUNnO0ftRWaRclGz1yLucv13Mt3ajW9+WMRdt0IeuZvELWH3R/wZ1DD4W9XGBy8ZzGoIJVrCiILyFrGYvi7Nmlo6hpKz7cs8n6cS3hsmTXjG1tN9z3cDbA/sRuYv3iKRWAHqwDSnuv1gUA8EInmTltykPJIL5jA0oGMOVQdw+X9rB+QRVly9XcoDz4AUs6MHhbUR4dWnMQp/99/9aOyFl9V9tWXZdLhR8b1R7IBW7dMCLzwC+5F8Y3hf0av9G9pSKWre5noYz7t2/UJN4XZMr6oD/X6hP6b2fPnl3c88iC+2zVo7JNqJ/rnk0YryctX+LvXADbqqmzuetCxV8MMWG2d58O92w021up4/6tevTu+wiKGys+UkGoYB0Q1asA4J2xVYAcxwZODF7KqJhlRr5yz0JW+dcQkK/NKU2fyro6J61efSYcKI9VIe6aYcHtonCQsbY6cu/NU9G+CNkb+7M5bR3f0zruD5S5L3Fb8alfFNTiqyb0jepVAPCStwMDd5O9KpROrHaleza6AMaL/moovdktbS0qYzv0nTxSnE+P5YZwmFnrTasxcdfzsfWBRanN25JywRf14z5K3P6o+YsC908gYB0ID2QA4KFZ2wVankm/p7pQOpGis6qwtLqtsn1oURw3UDmvjEVU6x0n0wmkNDysC4dqKxrbpF16Pb8tIFuzbW03BIxdfFcFImDtEw8HAOCvmuK6vNNmEF9ejapXZsSKGZCjCJleR+28jQlYj5PxpGXE630MNyAf66TdlKaX1ccSYmAQu4obAsarNadLKyoQAWufclouAwDIQEcdD8MuBpVltqOduirshGZsUxaqWJG3WdtwQxnZ1Ruuy33JboIwpkClH2M9Lq3PcaT4ioBs1QWMVfEtrQhY+1fpfmsAgMFEir4SSqzaFco2IKeKFUWYUi2zcy1SjZ6Afcg4FD0tHCvLiYRhWKuAmP7aYxElk5UrKpka5z7Gq/DqVUPA2off6r6FqzyQAYCnaqp5V0nnBircN0qMqiyqWFGMLFcoxF62k/FPlhOEEWOovkx6cE/5QpeW3aemUKi2dMNdm75T+XDuY4zGM2FEwNqHjuLMG+wDALITq+NdyMOgstxiRZV/f62KteMGhgJylOVkRoeJr7507PTOSIl3ps6UL5N27aRVQEsoysqXunhL5cS5j3FZGUf1qiFg7Q/tAQDAX610F1yvMKgsN/cA9amgdGC4LiAAERMjfcn4+sZrHpBf6FLLHQEXxOqEIrTaJW/LMO7WF6iksZ5XBKzHeK7VhngwAACfNQVgjGpsjoLcZLlcndYtfcvydeI170PHo/B/Tl+7SbP4mpArFwKdSwJtANmJb4zzvCJgPUZHaggA4CufZ/8ZVKISbDDunpcYjAPlwf2rYJFn4b8tr+W6nh97bQlXgWy58+r2uFoD9EwKR3Kz5mcVGNuJsC3drSl2s48T66801TqlC+8t87By/QlNzEZqu5t5NO/+fD3d6c9u7pXeGRlAGOxaF6t24Rf6uiU/MUBFZVirgA3ds571DWEsbGAxqajZUfxQADAiu67/oFU3XoyuC5mJFd/4UpfK2ncVGJd1d81a0pgRsB6voUBY2OAeqm+/0syt/YHqfvtmzJp7/9szPZz9RG/mLXh1H2fdTcAC17oAwBNpuHouWcbmLbsOE7KiMqY0fWFHW0/FM0Oh0on1G72NUlzQ3RRBN4AMfKFLyy5kFSFrNmwizIWrywKQJVvReEEeIGA9gvVfjRWM1m5GfVzScLaZfnQf1q3idUq1efdvNGqSVfVS5QpgXJruWnTF48rVHgJWVMpJ9/zgnhfOTSh6LELWoqy76+GFvc9/keIbsaKGgOG1hEK5c9bbTaUIWbMRK77rwtWxV9gBJdPyqZ8xPViPFAURIiaVC/keVPZ3f6Zv1qzsek4Xz7zS9Mmaogs2Cyd2DwZQjKYLDs65axCbAgCeYgfq4tgyU3sm2389/FyXmjaQV0m4n+U7ZSTyOMQqMV7zPtQUe/06Wcgal3zH+5ytv9YM4SqQLa/CVUPAeoQ4kOoLWxZW9EFlVa57A1d3YJ9yr9iV9IG+JQDIzttg1YIDAR5wE4w/CgdKWnfUzolgJS/2+p754ohlpieSgXxLeE/seYhVUrzmfaip5v3rZNccK7AR7+lAbHz8StPnjmvhV0YURCBH3oWrhoD1aKflv1av59Y42YFtO7a5G++iC0FO2YN/lOw82RQADCf0YLUllFZEUHOkPSFrS8hE0ns6qVo9rv+0tWtwx+gVlUCU4TFUo4K1Xy1lJCKM60usThCvkxXYuFDjjLi298XCVRsfVzFcFec+8rPuY7hqCFiPFkCLAD+XatiD/+cu+LVgpNdOgOpWlBhtMrJViorVLJe1wj8R97Nj2bOAPQCL1yoL1nv6yKrV/dJWAcEv6c3yXKOCtT/Z3r+ilnCsWBPBHJsWaqTX9qZwKLv+Wriq6moJyFivItzX6mgC1kO80EPbmMT3zUm6VaPyXK+dANWtKJmWPTjZBIJVE9GXajRphctKmVoB0Ouv3AhY+9MbiLvzYU0YRmuU3tNl6JuYbfA0wYRoHyZUy+x16qhDO5U+HFeV7ptk9eLFczz/fsieaTturDvIhFgZnynca0ChATKz57zyuiKcgPUQO9qpy39NBYjqVoQqvbDfTge7p+zBqXeBTx6iussxCdUG0Fvy+lLTp9xreqVcPVZjBvIlNqkZ3t8+2UD8c31zgYF4/3rXRvecdGbU62LgIetmlsHTlKZawrE6GVaduud8rpXHC/Y1sutLshcH47hUK1btnA8t/MYt4jl4P16P4a2Hcl4RsB4iUtv36lW7aAW/QyzVrQhE08JTCwFtY7fDBrtWUU5fqr41e6/p3qC6XKiUKrH1k9XspzYSBuLH2zvplOW1MeCQNdPraHretoSjbGZbTUnI0oegXyObRJtyk0FVn0RLly6fGe78Kd8zY43x/D7xbXsGikuQ4RRlkN7zvoiEA21oddG9PHfkMXeglf79e67VRlvRgrtAn1UQPXFRIk13gj1yg9yVYQa4P2h1OVJ0XXjLbpJt6e6E4rVyVaoebkP3Xsj/djMYkFWy22SLMDSuke9LVkjEt19r5laeE072XBUnz7d1BSG+knU7LHddtgqYq8JhVmxFiTLEvfBotjKqLM9F32u1PqHosYK5xowuuX5HV77QNyO1winZedJKiqfGx7c8Z+95bueJyzfsOeiycCBrLbWrzjVfe60ehgrWQ8T+3xQqMRtsFyEbxNqsRVL1El+xk40dSZGT5p6+queslcWwA91epVbEchBjYfW14yqAy8gdT7eF0nHva+WX/o2qd42seiVHXhWrh7Hrr/XEDeV1b+dQAeUGuSOFIGVXU/RIGeNeeKRWmZ6L0t6sp9K2WS2V30py/f5m5OuKO08yP/fGqKkx862v7d5+4nae2AreiB71B2kmYfQ3F0ILVw0VrIfwvbKiIz1yQcWCKsyqMNwhPO/C8PPulw0BwxmpUrUf6QyqXU/qqg7bBOyuu1athHhzzIptmLijraeq1ntfdplXd1VdeFWVmeheI/OuWD1KABU0uZ1rz3X/oXv9K/0cfYhcqs7Se+EzUcV6gOyrtH1S4mdgC4FuZBmOp/fCxwqcTRzuKj4z7ud/z647R15bqWjtyvycGgcC1kP4vnyI5Ykf2tNO4LQIXHGIpFpI63mHqgepQNDaDQys51KVqlSPU5YHZnS1rPqvypMGeUrPFbtGNlRe3g0gkiW99ppH9tzrSzumlvUyzOsezeTXh/IORX6r+wsdxQ+FvZq2YkoVUKJn4Fyv4WVon2M7vfuyGZF7PVd8CC37fU3SoHUx/Z7rKrle+7iaaiuh9Fg9DgHrIXw5GQ9jy8mSXctxkGfuwfnn2m64B8UG/VvhtKzq23p/vtTM+rg3VEofMu360lD4rK3CE0LVo1WxJ1kJ2dLqK4Sr+dtTyWH377rC1xzHpN4wemFrpNp597TpAu+xVP6suHD1Wt6vFRVD7ynk+lbRavUPFNVz2UcWtLvryuUAK8gLmxxLxwk+TXj1JatetFlKn79tMm2cVaxDrQyw66Ubvy7WFJ2Py1f978aPkbsGnmiW7RpIwHoI3wNWn2aGQmCB6yd6M0+FazUkPXqjphscPnEh+5qvgYjd9CfdMWkPmgrkIWrvaxtCWOCbDT2Yj9RpuNlaG9h/KgJXL7n7v/XFdAMF/VhTvP5KM2sc6+Nhg/G2OgsBDjC6oarP96B+9J6fbG8C+3Dnxlf2++7zrDtHRn4/fDjXeqGyCwbmK3RdtonnH93P3RrHMdpr82X3Qhd+fJXFseQz7ikf2lM5723Bwbg3Zw3g2tSy/3Gv07duXLDua6GFPXu79MSq5+sq3rqbvBqpl6jdhz/WGxsvNkINW9MVpGs2fiz79Y+A9RC+B6xl79dThN7Dnfs46x56LNyqC0Hau+zf5xv8UfaErV71FN4bqMaqNcuyfANAeDxvBdRdKUF4AgCD8aRyvmvcoSryUfSKhV6Veh4rjkNoi1iGsfmwCFgPQQVr9diFd0q1+bStwGl3csyXsBy/FHqzYDZjWtbQb98EQF3FVLi23HXPZlq/s5DAdm9mOTQAH/UqK8dwnTRvr5VuYqz5B5VviRsAjEtvtU9B1/bu9ZxCgmrIswXRuPb5GNOYcS/Gj3sQsB6CHqwwdoN3F4o6oev49G5WblLh26pftHvHo908D1hi3v3sXq/ZA47R1r6v3y4NtCVr0sT6K021CAgAhC4ZmLdnbbDRUTybLmmvp/95Vu+uj/UD/u+t9PNm+sG1EgA8sP8ZeE9riUOv6+kYone9bim9ptt4wv23lg/7MmB8esVVbXXm9zwrDHU8+fZ8cMyzUPfzQWPGfT+jafU+288auWehqBuoWnsZtSjE+RAB6yE2dM+qQ6/KU+4Av/2lLi4Jhevd4O1iXFPttLu5N0TomgnCVAAAAAAAEJpJ4UBxN533On+uC2ORLh2xj7UXbuZrR9EzYSBpkNpSsoziW3eutXbUWSdMBQAAAAAAoSFgPUStu9ujv9KmxhizXdWuWhyPA7WULDFYdxMW30XdX7O8EgAAAAAAlAsB6yGSXlt+V7C+0MPZkwRVY+WOkwVVT8t9WIV3tyfd3v509GMBAAAAAABVQ8B6iJpqLjjyuzJxt7t7rprCWGxodVGBtGqIFa1F3UmDbij83UF/Jqnajt8G9lHa1Ho3/UxoCgAAAAAA8CEC1kNYP8gJz/cAayuy6smmUDirHt7R1nWFYfMLfXNBAAAAAAAAyFxNONCMZrxfeu/evMvCWOxq+6rC2WhsTQAAAAAAAMgFAesh0t6mLflt9re6X8UeoGP1Qqt1KV5SIGqKHgkAAAAAAAC5IGA9QqRoXZ7rKL4pFGpH0fXYhdsKxIRONAUAAAAAAIBcELAe4bDNgDxT/43uBVNNGbq0YnhRgehIj9JqbAAAAAAAAOSAgPVIsfcVrMa9ideTZevIk21sFVrFcE0x/VcBAAAAAAByRMB6pIkgAlZndkfRYwsAhdzsavu6wtnYymzO6dKKAAAAAAAAkBsC1iPM6WsLWENZXl3f1vYdIRcbWl2MA9rYKkX1KgAAAAAAQM4IWI8XShWrIsULG7pHyJoxa78QKQpuMzF3PNwVAAAAAAAAckXAeoxIeqSwLD7X/eDCQF9ZuGrtF2IptPYLrc91qSkAAAAAAADkioD1WGFsdLWXLWW3SlZ6so7GXj8Xrj5UWH1XU/ENAQAAAAAAIHcErMdIqwBD6cO61+KOth5bBeb/0979JEdxn3Ec/rYEgSWuSoRZeXSCiBNEOoGtTSytLE6AfALECcAnsFgNeAOcgPEJrJyAyYqySBWTqjgBw0ynWxoCIjiRBs2fnnmeqmYGlTYatTafevv9hZFUn189CbyWBuonnQAAAAAwdgLr6TR1l+Va/Xj7YX5oZCScpuEu25000/61bHcDAAAAwNgJrKdQpGzyaeytZPDT8zy4Ff6vei1AFVefpLlxNX3rAQAAAAAmpginUkW3F2neQUcf6l5MufGZ6caPGh5oVe9cbfLEb2clWxsBAAAAYCJMsJ5eU9cEvK8OiE/raVYHYJ30PO31ep1Cmh1X62lr06sAAAAAEySwnlLD1wScUKbce51XPx2mvROquPrgTnkcV1tptu7wUDYAAAAAJsSKgDMY7uZcz3zpVsn19kq297Ng6qnVKqzeScOnVt8pbyzi7xEAAABgmgTWMxgGuSeZT91FCa31eoQ3+fVWmXI386O7kq3VAAAAADBRAusZHeb+0zT/UfL/pVuH1otJZ94OwxqG1ZvVz7dbNv/Asg+YXgUAAACYBoH1jI73lhbfZzHslykeX83Xjd4/O99h9UhnJVsbAQAAAGDiBNYRLMAU64e61dUpUt5r0iFKw5UOtzJ/e3NP6KdcvTZn08YAAAAATSGwjmDBplhPqG6Y3iBFFVsHj2dtjcDxpOrLtTJLX1YxeGdOp1U/tL+SrRsBAAAAYCoE1hEd5n592NV66JYpDpZS/piUB5OccH0bVKvbuIqqqaJq1hYkqh6pY/eblNdNrwIAAABMj8A6ouHj50/CxxxUn003GfylusG69fWmukYNgc/Sbi1nuQqn/TqgtooUX+Q4breywMqUt69mey8AAAAATI3A+gkOc/9u9XIznFo9dVlF0l7eXR9zJe8mUVvhY7or2VoNAAAAAFN1IYzsYi7tvc6rLyMCnlp5Mp4yon7KjQAAAAAwdUthZJ9ls1ekdMAQE1WvBrB3FQAAAGA2WBFwDqwKYIKsBgAAAACYISZYz0G9KqB66QbGzGoAAAAAgNkisJ6DelXAMHz1AmNiNQAAAADA7LEi4Bwdpr1TfaTfB85fZyVbplcBAAAAZowJ1nO0ku39esowcL66fYepAQAAAMwkE6xj8HPa+0WKbwLnYun6Sv58EAAAAABmjgnWMfhdLu9WL4IYn2yQfCuuAgAAAMwugXUMhodebVZvu4ER1esmPs/W3QAAAAAws6wIGKNnabeWUzyp3rYCZ1DF1XtXs70TAAAAAGaawDpmIisjOFjJ1vUAAAAAMPOsCBiza9muT4DfiHUBnE73l1zaCAAAAACNILBOgMjKKR3dJ6vZ7AUAAACARrAiYIJe5OGV13lVrwtYC5x0FFfrGB8AAAAAGkNgnYLD3K9Phr8ZOCauAgAAADSUFQFTsJKt3TLl7UBy8EsuXRdXAQAAAJpJYJ2Sq9neW0qxGXtZF1aR4lF9oJWdqwAAAADNZUXAlD1Lu7Wcot7L2goLY5B893m2dgMAAABAowmsM+LntPeKFLfC3Kvi6rdVXL0bAAAAABpPYJ0hf8uDrwYp78Q067zqFilv/CHbnQAAAAAwF+xgnSG/z9eP6tPky5T3wrzp1L9bcRUAAABgvphgnVGHae/keGVAKzSafasAAAAA80tgnWEv8vDKr3m5azdrY1kJAAAAADDnBNYGeJZ260KW7pQpvwqNUE+t/iuX9laz2QsAAAAAc0tgbRBrAxrB1CoAAADAAhFYG0honT3VH1JvkPK7f+byXVOrAAAAAItDYG0woXVm7PdT3r6W7W4AAAAAWCgC6xwQWqemU1Rh1ToAAAAAgMUlsM6RYWj9pnq7HsZJWAUAAADgiMA6h56l3VpK9orj2Mr5EVYBAAAAOEFgnWN1aF0+mmYtblb/XQtn9vbwqkGyb8cqAAAAAB8SWBfEe1Otf4pdrafRqf44Hv8jl/ZXs9kLAAAAAHyEwLqAnqe9Pkh2xNb/0i1T3jOtCgAAAMBpCawL7jA/rJXpfzWMretZPEdRdSnp2K0KAAAAwFkJrPxHvUbgYpbW+hnUwfWPmcO9rfVO1TI5qB//f5PykUlVAAAAAD6FwMpvehtcqxC5vpTUwXU9DVMH1erfTlL+WF0HplQBAAAAOE8CK2dSrxRYStl6L7peyexMunaLFAf9lH+9UEXV1xkcmFAFAAAAYJwEVs7F2/BaVlc/aS2n+KJ6X8fXK9VNVn39KMSObPhof696262vQfL35eOg2hVSAQAAAJgWgZWJeZqHVy7n5VFovVBF19/6vjLLvX76dUzNy1zurWazFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYbf8G0BTJndBUESgAAAAASUVORK5CYII=\"","<template>\n <div class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>","import { ref, computed, inject, provide } from 'vue'\n\nexport interface StrandsAuthConfig {\n baseUrl: string\n endpoints?: {\n signIn?: string\n signUp?: string\n signOut?: string\n refresh?: string\n passwordReset?: string\n passwordResetConfirm?: string\n profile?: string\n verifyEmail?: string\n oauthProviders?: string\n oauthProvider?: string\n }\n}\n\nexport interface StrandsAuthEndpoints {\n signIn: string\n signUp: string\n signOut: string\n refresh: string\n passwordReset: string\n passwordResetConfirm: string\n profile: string\n verifyEmail: string\n oauthProviders: string\n oauthProvider: string\n}\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n provide(STRANDS_CONFIG_KEY, config)\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Use injected config, then global config, then fallback\n const activeConfig = computed(() => {\n const config = injectedConfig || globalConfig.value || fallbackConfig\n \n if (!config || !config.baseUrl) {\n throw new Error(\n 'StrandsAuth configuration is required. Please provide a baseUrl using provideStrandsConfig() or pass it as a prop.'\n )\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n \n return `${baseUrl}${path}`\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const response = await fetch(getUrl('oauthProviders'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n console.error('OAuth providers fetch error:', err)\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <!-- Email -->\n <UiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string) {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign in failed')\n }\n\n return result.data\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign up failed')\n }\n\n return result.data\n },\n\n async requestPasswordReset(email: string) {\n // TODO: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <UiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK to send magic link\n console.log('Magic link sign up attempt:', { email: form.email })\n emit('success', {\n email: form.email\n })\n } catch (err) {\n error.value = 'Failed to send magic link'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-neutral-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\">\n {{ getInitials(user?.firstName, user?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"handleImageUpload\"\n >\n <svg class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200\"\n @click=\"handleImageUpload\"\n >\n Change photo\n </button>\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\n\ninterface Props {\n user?: User\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst showPasswordChange = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([\n { id: '1', device: 'Chrome on Mac', location: 'San Francisco, CA', lastActive: '2 minutes ago', current: true },\n { id: '2', device: 'Safari on iPhone', location: 'San Francisco, CA', lastActive: '1 hour ago', current: false },\n])\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst hasChanges = computed(() => {\n if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.user.phone || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Initialize form with user data\nwatch(() => props.user, (user) => {\n if (user) {\n form.firstName = user.firstName\n form.lastName = user.lastName\n form.email = user.email\n form.phone = user.phone || ''\n }\n}, { immediate: true })\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Profile update:', form)\n \n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Password change:', { current: '***', new: '***' })\n \n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleImageUpload = () => {\n // TODO: Implement image upload\n console.log('Image upload clicked')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.user.phone || ''\n }\n clearMessages()\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n}\n</script>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <UiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-4\">\n <p class=\"text-gray-500\">MFA setup functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement MFA setup functionality\n</script>","import { ref, computed } from 'vue'\n\n// Mock user interface\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\n\n// Mock session interface\ninterface Session {\n accessToken: string\n refreshToken: string\n expiresAt: Date\n}\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(false)\nconst isInitialized = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: { email: string; password: string }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign in with:', credentials)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign in\n currentUser.value = {\n id: '1',\n email: credentials.email,\n firstName: 'John',\n lastName: 'Doe',\n mfaEnabled: false,\n createdAt: '2024-01-15T10:30:00Z',\n updatedAt: '2024-01-20T14:45:00Z'\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: {\n email: string\n password: string\n firstName: string\n lastName: string\n }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign up with:', userData)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign up\n currentUser.value = {\n id: '1',\n email: userData.email,\n firstName: userData.firstName,\n lastName: userData.lastName,\n mfaEnabled: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign out')\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Refresh token')\n \n // Mock token refresh\n currentSession.value.expiresAt = new Date(Date.now() + 5 * 60 * 1000)\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Update profile:', profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isLoading.value = true\n try {\n // TODO: Check for existing session/token in localStorage, etc.\n console.log('Initializing auth state')\n \n // Mock initialization delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n // For demo purposes, we'll assume no existing session\n // In real implementation, you'd check for stored tokens here\n \n isInitialized.value = true\n } catch (error) {\n console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value),\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n initialize,\n }\n}","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_5","title","_renderSlot","_ctx","message","dismissible","_hoisted_6","$emit","buttonClasses","sizeClasses","widthClasses","type","disabled","loading","_cache","$event","loadingText","cardClasses","paddingClasses","shadowClasses","$slots","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","handleInput","event","target","togglePasswordVisibility","label","required","_hoisted_4","modelValue","placeholder","autocomplete","_hoisted_7","_hoisted_8","error","_hoisted_9","_toDisplayString","helpText","_hoisted_10","tag","linkProps","baseProps","linkClasses","handleClick","_createBlock","_resolveDynamicComponent","_mergeProps","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","toRefs","watch","_Fragment","_renderList","tabs","_normalizeClass","_unref","_imports_0","DEFAULT_ENDPOINTS","STRANDS_CONFIG_KEY","globalConfig","provideStrandsConfig","config","provide","useStrandsConfig","fallbackConfig","injectedConfig","inject","activeConfig","endpoints","customEndpoints","endpoint","endpointPath","baseUrl","path","setStrandsConfig","useOAuthProviders","options","getUrl","providers","enabledProviders","provider","fetchProviders","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isFormValid","handleAuth","handleOAuthAuth","newMode","_createVNode","UiCard","_Transition","UiTabs","UiButton","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","UiInput","_hoisted_16","_hoisted_17","UiLink","UiAlert","_hoisted_18","StrandsSecuredFooter","handleSignIn","handleOAuthSignIn","handleSignUp","handleOAuthSignUp","showPasswordChange","successMessage","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","key","handleUpdateProfile","resolve","updatedUser","handlePasswordChange","handleImageUpload","handleMFAToggle","handleCancel","_vModelText","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","isSubmitted","handlePasswordReset","currentUser","currentSession","isLoading","isInitialized","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData","initialize","showFallback","args","class"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.es.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"data:image/png;base64,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\"","<template>\n <div class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>","import { ref, computed, inject, provide } from 'vue'\n\nexport interface StrandsAuthConfig {\n baseUrl: string\n endpoints?: {\n signIn?: string\n signUp?: string\n signOut?: string\n refresh?: string\n passwordReset?: string\n passwordResetConfirm?: string\n profile?: string\n verifyEmail?: string\n oauthProviders?: string\n oauthProvider?: string\n }\n}\n\nexport interface StrandsAuthEndpoints {\n signIn: string\n signUp: string\n signOut: string\n refresh: string\n passwordReset: string\n passwordResetConfirm: string\n profile: string\n verifyEmail: string\n oauthProviders: string\n oauthProvider: string\n}\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n provide(STRANDS_CONFIG_KEY, config)\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Use injected config, then global config, then fallback\n const activeConfig = computed(() => {\n const config = injectedConfig || globalConfig.value || fallbackConfig\n \n if (!config || !config.baseUrl) {\n throw new Error(\n 'StrandsAuth configuration is required. Please provide a baseUrl using provideStrandsConfig() or pass it as a prop.'\n )\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n \n return `${baseUrl}${path}`\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const response = await fetch(getUrl('oauthProviders'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <!-- Email -->\n <UiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string) {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign in failed')\n }\n\n return result.data\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Sign up failed')\n }\n\n return result.data\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual auth SDK call\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <UiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </UiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <UiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <UiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual magic link API call\n console.log('Magic link sign up attempt:', { email: form.email })\n emit('success', {\n email: form.email\n })\n } catch (err) {\n error.value = 'Failed to send magic link'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-neutral-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\">\n {{ getInitials(user?.firstName, user?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"handleImageUpload\"\n >\n <svg class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200\"\n @click=\"handleImageUpload\"\n >\n Change photo\n </button>\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\n\ninterface Props {\n user?: User\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst showPasswordChange = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([\n { id: '1', device: 'Chrome on Mac', location: 'San Francisco, CA', lastActive: '2 minutes ago', current: true },\n { id: '2', device: 'Safari on iPhone', location: 'San Francisco, CA', lastActive: '1 hour ago', current: false },\n])\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst hasChanges = computed(() => {\n if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.user.phone || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Initialize form with user data\nwatch(() => props.user, (user) => {\n if (user) {\n form.firstName = user.firstName\n form.lastName = user.lastName\n form.email = user.email\n form.phone = user.phone || ''\n }\n}, { immediate: true })\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual profile update call\n // Example: await authSDK.updateProfile(form)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleImageUpload = () => {\n // Integration point: Implement image upload functionality\n // Example: Open file picker, upload to storage, update user avatar\n emit('error', 'Image upload functionality not yet implemented')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.user.phone || ''\n }\n clearMessages()\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n}\n</script>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <UiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <UiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </UiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-6\">\n <!-- QR Code Section -->\n <div class=\"text-center\">\n <div class=\"w-48 h-48 bg-gray-100 rounded-lg mx-auto mb-4 flex items-center justify-center\">\n <div class=\"text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h.01M12 12v4.01\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\">Scan this QR code with your authenticator app</p>\n </div>\n\n <!-- Setup Key -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Setup Key (manual entry)</label>\n <div class=\"p-3 bg-gray-50 rounded border text-sm font-mono break-all\">\n XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX\n </div>\n </div>\n\n <!-- Verification Code Input -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Verification Code</label>\n <input \n type=\"text\" \n placeholder=\"Enter 6-digit code\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-strands-500 focus:border-strands-500\"\n maxlength=\"6\"\n />\n <p class=\"text-xs text-gray-500 mt-1\">Enter the 6-digit code from your authenticator app</p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 pt-4\">\n <button \n type=\"button\"\n class=\"flex-1 bg-strands-500 text-white py-2 px-4 rounded-md hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-colors\"\n >\n Enable 2FA\n </button>\n <button \n type=\"button\"\n class=\"flex-1 bg-gray-200 text-gray-800 py-2 px-4 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors\"\n @click=\"$emit('back')\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'back'): void\n}\n\ndefineEmits<Emits>()\n</script>","import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData } from '../../types'\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(false)\nconst isInitialized = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isLoading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signIn(credentials)\n \n // For now, throw an error to indicate this needs implementation\n throw new Error('Sign in not implemented - please integrate with auth SDK')\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isLoading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signUp(userData)\n \n throw new Error('Sign up not implemented - please integrate with auth SDK')\n } finally {\n isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: await authSDK.signOut()\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const newSession = await authSDK.refreshToken(currentSession.value.refreshToken)\n // currentSession.value = newSession\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const updatedUser = await authSDK.updateProfile(profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isLoading.value = true\n try {\n // Integration point: Check for existing session/token in localStorage, etc.\n // Example: const storedSession = localStorage.getItem('auth_session')\n // if (storedSession) { /* restore session */ }\n \n isInitialized.value = true\n } catch (error) {\n console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value),\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n initialize,\n }\n}","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"/>\n </svg>\n </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => h('g', [\n h('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n h('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => h('g', { fill: 'currentColor' }, [\n h('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n h('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n h('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n h('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : h('path', { d: '' })\n})\n</script>\n","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n// Phone validation (basic)\nexport const isValidPhone = (phone: string): boolean => {\n const phoneRegex = /^[\\+]?[1-9][\\d]{0,15}$/\n return phoneRegex.test(phone.replace(/[\\s\\-\\(\\)]/g, ''))\n}\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_5","title","_renderSlot","_ctx","message","dismissible","_hoisted_6","$emit","buttonClasses","sizeClasses","widthClasses","type","disabled","loading","_cache","$event","loadingText","cardClasses","paddingClasses","shadowClasses","$slots","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","handleInput","event","target","togglePasswordVisibility","label","required","_hoisted_4","modelValue","placeholder","autocomplete","_hoisted_7","_hoisted_8","error","_hoisted_9","_toDisplayString","helpText","_hoisted_10","tag","linkProps","baseProps","linkClasses","handleClick","_createBlock","_resolveDynamicComponent","_mergeProps","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","toRefs","watch","_Fragment","_renderList","tabs","_normalizeClass","_unref","_imports_0","DEFAULT_ENDPOINTS","STRANDS_CONFIG_KEY","globalConfig","provideStrandsConfig","config","provide","useStrandsConfig","fallbackConfig","injectedConfig","inject","activeConfig","endpoints","customEndpoints","endpoint","endpointPath","baseUrl","path","setStrandsConfig","useOAuthProviders","options","getUrl","providers","enabledProviders","provider","fetchProviders","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isFormValid","handleAuth","handleOAuthAuth","newMode","_createVNode","UiCard","_Transition","UiTabs","UiButton","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","UiInput","_hoisted_16","_hoisted_17","UiLink","UiAlert","_hoisted_18","StrandsSecuredFooter","handleSignIn","handleOAuthSignIn","handleSignUp","handleOAuthSignUp","showPasswordChange","successMessage","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","key","handleUpdateProfile","resolve","updatedUser","handlePasswordChange","handleImageUpload","handleMFAToggle","handleCancel","_vModelText","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","isSubmitted","handlePasswordReset","currentUser","currentSession","isLoading","isInitialized","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData","initialize","showFallback","args","class","iconClass","viewBox","icons","h","iconComponent","icon","fill","stroke","ariaHidden","isValidEmail","validatePassword","score","isValid","strength","isValidName","name","isValidPhone","phone","isRequired","passwordsMatch","confirmation","first","last","formatDate","date","debounce","func","wait","timeout"],"mappings":";;;;;;;;;;;;;;;;;;;AAwCA,UAAMA,IAAQC,GASRC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAAc,CAAC,uBAAuB,GAEtCC,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAGR,aAAO;AAAA,QACL,GAAGD;AAAA,QACHC,EAAeL,EAAM,OAAO;AAAA,MAAA,EAC5B,KAAK,GAAG;AAAA,IACZ,CAAC,GAEKM,IAAeH,EAAS,MAQrB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKO,IAAiBJ,EAAS,MAQvB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKQ,IAAiBL,EAAS,MAQvB;AAAA,MACL;AAAA,MARqB;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,EAKSH,EAAM,OAAO;AAAA,IAAA,EAC5B,KAAK,GAAG,CACX,GAEKS,IAAWN,EAAS,OACV;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,GAGKH,EAAM,OAAO,CAC3B;2BAnHCU,EA0BM,OAAA;AAAA,MA1BA,SAAOR,EAAA,KAAY;AAAA,MAAE,MAAK;AAAA,IAAA;MAC9BS,EAwBM,OAxBNC,IAwBM;AAAA,QAvBJD,EAIM,OAJNE,IAIM;AAAA,WAHJC,KAAAJ,EAEM,OAFNK,IAEM;AAAA,YADJJ,EAA8D,QAAA;AAAA,cAAxD,aAAU;AAAA,cAAW,GAAGF,EAAA;AAAA,cAAU,aAAU;AAAA,YAAA;;;QAItDE,EAKM,OALNK,IAKM;AAAA,UAJMC,EAAAA,cAAVP,EAAuD,MAAA;AAAA;YAArC,SAAOJ,EAAA,KAAY;AAAA,UAAA,KAAKW,EAAAA,KAAK,GAAA,CAAA;UAC/CN,EAEM,OAAA;AAAA,YAFA,SAAOJ,EAAA,KAAc;AAAA,UAAA;YACzBW,EAA0BC,yBAA1B,MAA0B;AAAA,kBAAjBC,EAAAA,OAAO,GAAA,CAAA;AAAA,YAAA;;;QAITC,EAAAA,eAAXP,EAAA,GAAAJ,EASM,OATNY,IASM;AAAA,UARJX,EAOS,UAAA;AAAA,YAPD,MAAK;AAAA,YAAU,SAAOH,EAAA,KAAc;AAAA,YAAG,gCAAOe,EAAAA,MAAK,SAAA;AAAA,UAAA;YACzDZ,EAAoC,QAAA,EAA9B,OAAM,UAAA,GAAU,WAAO,EAAA;AAAA,YAC7BA,EAIM,OAAA;AAAA,cAJD,OAAM;AAAA,cAAU,MAAK;AAAA,cAAe,SAAQ;AAAA,YAAA;cAC/CA,EAEwB,QAAA;AAAA,gBAFlB,aAAU;AAAA,gBACd,GAAE;AAAA,gBACF,aAAU;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACQxB,UAAMX,IAAQC,GAaRuB,IAAgBrB,EAAS,MAAM;AACnC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIqB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIApB,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,GAILqB,IAAe1B,EAAM,YAAY,WAAW;AAElD,aAAO;AAAA,QACL,GAAGI;AAAA,QACHqB,EAAYzB,EAAM,IAAI;AAAA,QACtBK,EAAeL,EAAM,OAAO;AAAA,QAC5B0B;AAAA,MAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC;2BAvEChB,EAaS,UAAA;AAAA,MAbA,MAAMiB,EAAAA;AAAAA,MAAO,UAAUC,EAAAA,YAAYC,EAAAA;AAAAA,MAAU,SAAOL,EAAA,KAAa;AAAA,MAAG,SAAKM,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAER,EAAAA,MAAK,SAAUQ,CAAM;AAAA,IAAA;MAC3FF,EAAAA,WAAZf,EAAA,GAAAJ,EAOO,QAPPG,IAOO;AAAA,wBANLF,EAIM,OAAA;AAAA,UAJD,OAAM;AAAA,UAAuB,MAAK;AAAA,UAAO,SAAQ;AAAA,QAAA;UACpDA,EAA2F,UAAA;AAAA,YAAnF,OAAM;AAAA,YAAa,IAAG;AAAA,YAAK,IAAG;AAAA,YAAK,GAAE;AAAA,YAAK,QAAO;AAAA,YAAe,gBAAa;AAAA,UAAA;UACrFA,EAC4H,QAAA;AAAA,YADtH,OAAM;AAAA,YAAa,MAAK;AAAA,YAC5B,GAAE;AAAA,UAAA;;QAENA,EAA8C,gBAArCqB,EAAAA,eAAW,YAAA,GAAA,CAAA;AAAA,MAAA,OAEtBlB,EAAA,GAAAJ,EAGO,QAHPK,IAGO;AAAA,QAFLG,EAAoBC,EAAA,QAAA,MAAA;AAAA,QACpBD,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;ACad,UAAMnB,IAAQC,GAMRgC,IAAc9B,EAAS,MAAM;AACjC,YAAMC,IAAc,CAAC,iCAAiC,GAGhDC,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,MAAA,GAIL6B,IAAiB;AAAA,QACrB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAC,IAAgB;AAAA,QACpB,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAGN,aAAO;AAAA,QACL,GAAG/B;AAAA,QACHC,EAAeL,EAAM,OAAO;AAAA,QAC5BkC,EAAelC,EAAM,OAAO;AAAA,QAC5BmC,EAAcnC,EAAM,MAAM;AAAA,MAAA,EAC1B,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC;2BA7DCU,EAYM,OAAA;AAAA,MAZA,SAAOuB,EAAA,KAAW;AAAA,IAAA;MACXG,EAAAA,OAAM,UAAjBtB,KAAAJ,EAEM,OAFNE,IAEM;AAAA,QADJM,EAAsBC,EAAA,QAAA,QAAA;AAAA,MAAA;MAGxBR,EAEM,OAFNE,IAEM;AAAA,QADJK,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;MAGCiB,EAAAA,OAAM,UAAjBtB,KAAAJ,EAEM,OAFNK,IAEM;AAAA,QADJG,EAAsBC,EAAA,QAAA,QAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4C5B,UAAMnB,IAAQC,GAKRoC,IAAOC,GAMPC,IAAQC,GAAA,GACRC,IAAeC,EAAI,EAAK,GACxBC,IAAUD,EAAI,SAAS,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,GAEhEE,IAAezC,EAAS,MACxBH,EAAM,SAAS,aACVyC,EAAa,QAAQ,SAAS,aAEhCzC,EAAM,IACd,GAEK6C,IAAe1C,EAAS,MAAM;AAClC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIqB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIAqB,IAAe9C,EAAM,QACvB,2EACA,IAGE+C,IAAcR,EAAM,OAAU,UAAU,IACxCS,IAAkBhD,EAAM,SAAS,aAAa,UAAU;AAE9D,aAAO;AAAA,QACL,GAAGI;AAAA,QACHqB,EAAYzB,EAAM,IAAI;AAAA,QACtB8C;AAAA,QACAC;AAAA,QACAC;AAAA,MAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC,GAEKC,IAAc,CAACC,MAAiB;AACpC,YAAMC,IAASD,EAAM;AACrB,MAAAb,EAAK,qBAAqBc,EAAO,KAAK;AAAA,IACxC,GAEMC,IAA2B,MAAM;AACrC,MAAAX,EAAa,QAAQ,CAACA,EAAa;AAAA,IACrC;sBAjHE3B,EAAA,GAAAJ,EAmCM,OAnCNE,IAmCM;AAAA,MAlCSyC,EAAAA,cAAb3C,EAGQ,SAAA;AAAA;QAHa,KAAKiC,EAAA;AAAA,QAAS,OAAM;AAAA,MAAA;QACpCU,EAAAA,EAAAA,EAAAA,KAAK,IAAG,KACX,CAAA;AAAA,QAAYC,EAAAA,iBAAZ5C,EAAmD,QAAnDK,IAA2C,GAAC;;MAG9CJ,EAwBM,OAxBN4C,IAwBM;AAAA,QAvBJ5C,EAEkE,SAAA;AAAA,UAF1D,IAAIgC,EAAA;AAAA,UAAU,MAAMC,EAAA;AAAA,UAAe,OAAOY,EAAAA;AAAAA,UAAa,aAAaC,EAAAA;AAAAA,UAAc,UAAU7B,EAAAA;AAAAA,UACjG,UAAU0B,EAAAA;AAAAA,UAAW,cAAcI,EAAAA;AAAAA,UAAe,SAAOb,EAAA,KAAY;AAAA,UAAG,SAAOI;AAAA,UAC/E,QAAInB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAER,EAAAA,MAAK,QAASQ,CAAM;AAAA,UAAI,SAAKD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAER,EAAAA,MAAK,SAAUQ,CAAM;AAAA,QAAA;QAG/CJ,EAAAA,SAAI,mBAAlBjB,EAYS,UAAA;AAAA;UAZ0B,MAAK;AAAA,UACtC,OAAM;AAAA,UACL,SAAO0C;AAAA,QAAA;UACGX,EAAA,SAAX3B,EAAA,GAAAJ,EAGM,OAHNY,IAGMQ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAFJnB,EAC4L,QAAA;AAAA,cADtL,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAChE,GAAE;AAAA,YAAA;kBAENG,KAAAJ,EAIM,OAJNiD,IAIM7B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YAHJnB,EAA6G,QAAA;AAAA,cAAvG,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAAI,GAAE;AAAA,YAAA;YACxEA,EACgI,QAAA;AAAA,cAD1H,kBAAe;AAAA,cAAQ,mBAAgB;AAAA,cAAQ,gBAAa;AAAA,cAChE,GAAE;AAAA,YAAA;;;QAKGyB,EAAAA,OAAM,QAAjBtB,KAAAJ,EAEM,OAFNkD,IAEM;AAAA,UADJ1C,EAAoBC,EAAA,QAAA,MAAA;AAAA,QAAA;;MAKf0C,EAAAA,cAATnD,EAA4D,KAA5DoD,IAA4DC,EAAZF,EAAAA,KAAK,GAAA,CAAA,KACvCG,EAAAA,iBAAdtD,EAAwE,KAAxEuD,IAAwEF,EAAfC,EAAAA,QAAQ,GAAA,CAAA;;;;;;;;;;;;;;;ACjBrE,UAAMhE,IAAQC,GAORoC,IAAOC,GAIP4B,IAAM/D,EAAS,MACfH,EAAM,KAAW,gBACjBA,EAAM,OAAa,MAChB,QACR,GAEKmE,IAAYhE,EAAS,MAAM;AAC/B,YAAMiE,IAAiC,CAAA;AAEvC,aAAIpE,EAAM,KACRoE,EAAU,KAAQpE,EAAM,KACfA,EAAM,QACfoE,EAAU,OAAUpE,EAAM,MACtBA,EAAM,aACRoE,EAAU,SAAY,UACtBA,EAAU,MAAS,0BAGrBA,EAAU,OAAU,UAGlBpE,EAAM,aACRoE,EAAU,WAAc,IACxBA,EAAU,eAAe,IAAI,KAGxBA;AAAA,IACT,CAAC,GAEKC,IAAclE,EAAS,MAAM;AACjC,YAAMC,IAAc;AAAA,QAClB;AAAA,MAAA,GAIIqB,IAAc;AAAA,QAClB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA,GAIApB,IAAiB;AAAA,QACrB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAGb,aAAO;AAAA,QACL,GAAGD;AAAA,QACHqB,EAAYzB,EAAM,IAAI;AAAA,QACtBK,EAAeL,EAAM,OAAO;AAAA,MAAA,EAC5B,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC5B,CAAC,GAEKsE,IAAc,CAACpB,MAAsB;AACzC,MAAKlD,EAAM,YACTqC,EAAK,SAASa,CAAK;AAAA,IAEvB;sBAxFEpC,KAAAyD,EAEYC,GAFIN,EAAA,KAAG,GAAnBO,GAEY,EAFU,OAAOJ,EAAA,MAAA,GAAqBF,EAAA,OAAS,EAAG,SAAOG,EAAA,CAAW,GAAA;AAAA,iBAC9E,MAAQ;AAAA,QAARpD,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;;;;;;;;;;;ACuCZ,UAAMnB,IAAQC,GACRoC,IAAOC,GAEPoC,IAAahC,EAAmB,EAAE,GAClCiC,IAAiBjC,EAAI;AAAA,MACzB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA,CACV;AAED,QAAIkC,IAAkB,IAClBC,IAAc;AAElB,UAAMC,IAAiB,OAAOC,GAAeC,MAAkB;AAC7D,MAAIH,MAEJxC,EAAK,qBAAqB0C,CAAK,GAC/B,MAAME,GAAA,GACNC,EAAwBF,CAAK;AAAA,IAC/B,GAEME,IAA0B,OAAOC,MAAqB;AAC1D,UAAI,CAACT,EAAW,MAAMS,CAAQ,KAAKA,MAAaP,EAAiB;AAEjE,MAAAC,IAAc;AACd,YAAMO,IAASV,EAAW,MAAMS,CAAQ,GAClCE,IAAYD,EAAO;AAEzB,UAAI,CAACC,EAAW;AAEhB,YAAMC,IAAUF,EAAO,sBAAA,GACjBG,IAAgBF,EAAU,sBAAA,GAC1BG,IAAUF,EAAQ,OAAOC,EAAc,MACvCE,IAAWH,EAAQ;AAEzB,UAAIV,MAAoB,IAAI;AAE1B,QAAAD,EAAe,QAAQ;AAAA,UACrB,OAAO,GAAGc,CAAQ;AAAA,UAClB,MAAM,GAAGD,CAAO;AAAA,UAChB,SAAS;AAAA,QAAA,GAEXZ,IAAkBO,GAClBN,IAAc;AACd;AAAA,MACF;AAGA,YAAMa,IADahB,EAAW,MAAME,CAAe,EACpB,sBAAA,GACzBe,IAAcD,EAAY,OAAOH,EAAc,MAC/CK,IAAeF,EAAY,OAG3BG,IAAgBV,IAAWP,GAC3BkB,IAAcD,IAAgBF,IAAcH,GAC5CO,IAAeF,IAChBL,IAAUC,IAAYE,IACtBA,IAAcC,IAAgBJ;AAGnC,MAAAb,EAAe,QAAQ;AAAA,QACrB,OAAO,GAAGoB,CAAY;AAAA,QACtB,MAAM,GAAGD,CAAW;AAAA,QACpB,SAAS;AAAA,MAAA,GAIX,WAAW,MAAM;AACf,QAAAnB,EAAe,QAAQ;AAAA,UACrB,OAAO,GAAGc,CAAQ;AAAA,UAClB,MAAM,GAAGD,CAAO;AAAA,UAChB,SAAS;AAAA,QAAA,GAEXZ,IAAkBO,GAClB,WAAW,MAAM;AACf,UAAAN,IAAc;AAAA,QAChB,GAAG,GAAG;AAAA,MACR,GAAG,GAAG;AAAA,IACR;AAGA,IAAAmB,GAAU,YAAY;AACpB,YAAMf,GAAA;AACN,YAAMgB,IAAcjG,EAAM,KAAK,UAAU,OAAOkG,EAAI,UAAUlG,EAAM,UAAU;AAC9E,MAAIiG,MAAgB,MAClBf,EAAwBe,CAAW;AAAA,IAEvC,CAAC,GAGsB9F;AAAA,MAAS,MAC9BH,EAAM,KAAK,UAAU,OAAOkG,EAAI,UAAUlG,EAAM,UAAU;AAAA,IAAA;AAI5D,UAAM,EAAE,YAAAwD,EAAA,IAAe2C,GAAOnG,CAAK;AACnC,WAAAoG,GAAM5C,GAAY,YAAY;AAC5B,YAAMyB,GAAA;AACN,YAAMgB,IAAcjG,EAAM,KAAK,UAAU,OAAOkG,EAAI,UAAUlG,EAAM,UAAU;AAC9E,MAAIiG,MAAgB,MAClBf,EAAwBe,CAAW;AAAA,IAEvC,CAAC,cA9ICnF,EAAA,GAAAJ,EAoBM,OApBNE,IAoBM;AAAA,MAlBJD,EAiBM,OAjBNE,IAiBM;AAAA,SAhBJC,EAAA,EAAA,GAAAJ,EAUS2F,IAAA,MAAAC,GAVsBC,EAAAA,MAAI,CAAnBL,GAAKlB,YAArBtE,EAUS,UAAA;AAAA,UAV6B,KAAKwF,EAAI;AAAA;mBAAW;AAAA,UAAJ,KAAIxB;AAAA,UAAc,OAAK8B,EAAA;AAAA;;;YAA4RC,EAAAjD,CAAA,MAAe0C,EAAI;;UAOxX,iBAAeO,EAAAjD,CAAA,MAAe0C,EAAI;AAAA,UAAQ,iBAAa,YAAcA,EAAI,KAAK;AAAA,UAAK,IAAE,OAASA,EAAI,KAAK;AAAA,UACzG,MAAK;AAAA,UAAO,gBAAOpB,EAAeoB,EAAI,OAAOlB,CAAK;AAAA,QAAA,GAC/CjB,EAAAmC,EAAI,KAAK,GAAA,IAAAnF,EAAA;QAIdJ,EAE4B,OAAA;AAAA,UAD1B,OAAM;AAAA,UACL,UAAOgE,EAAA,KAAc;AAAA,QAAA;;;;ICnB9B+B,KAAe;;;;;YCCR9F,KAAA,EAAA,OAAM,qFAAoF;;AAA/F,SAAAE,EAAA,GAAAJ,EAEM,OAFNE,IAEMkB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,IADJnB,EAAyE,OAAA;AAAA,MAApE,KAAA+F;AAAA,MAA8C,OAAM;AAAA;;;qDC6BvDC,IAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AACjB,GAEMC,KAAqB,OAAO,gBAAgB,GAG5CC,KAAenE,EAA8B,IAAI;AAEhD,SAASoE,GAAqBC,GAA2B;AAC9D,EAAAF,GAAa,QAAQE,GACrBC,GAAQJ,IAAoBG,CAAM;AACpC;AAEO,SAASE,GAAiBC,GAA6C;AAE5E,QAAMC,IAAiBC,GAAiCR,IAAoB,IAAI,GAG1ES,IAAelH,EAAS,MAAM;AAClC,UAAM4G,IAASI,KAAkBN,GAAa,SAASK;AAEvD,QAAI,CAACH,KAAU,CAACA,EAAO;AACrB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAIJ,WAAOA;AAAA,EACT,CAAC,GAEKO,IAAYnH,EAA+B,MAAM;AAErD,UAAMoH,IADSF,EAAa,MACG,aAAa,CAAA;AAE5C,WAAO;AAAA,MACL,QAAQE,EAAgB,UAAUZ,EAAkB;AAAA,MACpD,QAAQY,EAAgB,UAAUZ,EAAkB;AAAA,MACpD,SAASY,EAAgB,WAAWZ,EAAkB;AAAA,MACtD,SAASY,EAAgB,WAAWZ,EAAkB;AAAA,MACtD,eAAeY,EAAgB,iBAAiBZ,EAAkB;AAAA,MAClE,sBAAsBY,EAAgB,wBAAwBZ,EAAkB;AAAA,MAChF,SAASY,EAAgB,WAAWZ,EAAkB;AAAA,MACtD,aAAaY,EAAgB,eAAeZ,EAAkB;AAAA,MAC9D,gBAAgBY,EAAgB,kBAAkBZ,EAAkB;AAAA,MACpE,eAAeY,EAAgB,iBAAiBZ,EAAkB;AAAA,IAAA;AAAA,EAEtE,CAAC;AA2BD,SAAO;AAAA,IACL,QAAQU;AAAA,IACR,WAAAC;AAAA,IACA,QA5Ba,CAACE,MAAkD;AAChE,YAAMT,IAASM,EAAa;AAC5B,UAAI,CAACN,EAAO;AACV,cAAM,IAAI,MAAM,uCAAuC;AAIzD,UAAIU;AACJ,MAAI,OAAOD,KAAa,YAAYA,KAAYF,EAAU,QACxDG,IAAeH,EAAU,MAAME,CAAsC,IAC5D,OAAOA,KAAa,WAE7BC,IAAeD,IAGfC,IAAeH,EAAU,MAAME,CAAQ;AAIzC,YAAME,IAAUX,EAAO,QAAQ,QAAQ,OAAO,EAAE,GAC1CY,IAAOF,EAAa,WAAW,GAAG,IAAIA,IAAe,IAAIA,CAAY;AAE3E,aAAO,GAAGC,CAAO,GAAGC,CAAI;AAAA,IAC1B;AAAA,EAKE;AAEJ;AAGO,SAASC,GAAiBb,GAA2B;AAC1D,EAAAF,GAAa,QAAQE;AACvB;AClFO,SAASc,GAAkBC,IAAoC,IAAI;AACxE,QAAM,EAAE,QAAAC,EAAA,IAAWd,GAAA,GAEbe,IAAYtF,EAAqB,EAAE,GACnCb,IAAUa,EAAI,EAAK,GACnBmB,IAAQnB,EAAmB,IAAI,GAE/BuF,IAAmB9H;AAAA,IAAS,MAChC6H,EAAU,MAAM,OAAO,CAAAE,MAAYA,EAAS,OAAO;AAAA,EAAA,GAG/CC,IAAiB,YAAY;AACjC,IAAAtG,EAAQ,QAAQ,IAChBgC,EAAM,QAAQ;AAEd,QAAI;AACF,YAAMuE,IAAW,MAAM,MAAML,EAAO,gBAAgB,GAAG;AAAA,QACrD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,MAClB,CACD;AAED,UAAI,CAACK,EAAS,IAAI;AAChB,cAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,cAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,MAC/F;AAEA,YAAME,IAAiC,MAAMF,EAAS,KAAA;AAEtD,UAAI,CAACE,EAAO;AACV,cAAM,IAAI,MAAMA,EAAO,OAAO,WAAW,iCAAiC;AAG5E,MAAAN,EAAU,QAAQM,EAAO,QAAQ,CAAA;AAAA,IACnC,SAASC,GAAK;AACZ,YAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,MAAA1E,EAAM,QAAQ2E;AAAA,IAChB,UAAA;AACE,MAAA3G,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,GAEM4G,IAAqB,OACzBC,GACAC,MACoB;AACpB,UAAMC,IAAgB,EAAE,GAAGd,GAAS,GAAGa,EAAA,GAGjCE,IAAS,IAAI,gBAAA;AAEnB,IAAID,EAAc,eAChBC,EAAO,OAAO,gBAAgBD,EAAc,WAAW,GAGrDA,EAAc,UAAUA,EAAc,OAAO,SAAS,KACxDC,EAAO,OAAO,UAAUD,EAAc,OAAO,KAAK,GAAG,CAAC;AAGxD,UAAME,IAAcD,EAAO,SAAA,GACrBE,IAAchB,EAAO,eAAe,EAAE,QAAQ,iBAAiBW,CAAU,GACzEM,IAAUF,IAAc,GAAGC,CAAW,IAAID,CAAW,KAAKC;AAEhE,QAAI;AACF,YAAMX,IAAW,MAAM,MAAMY,GAAS;AAAA,QACpC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,MAClB,CACD;AAED,UAAI,CAACZ,EAAS,IAAI;AAChB,cAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,cAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,MAC/F;AAEA,YAAME,IAAuC,MAAMF,EAAS,KAAA;AAE5D,UAAI,CAACE,EAAO;AACV,cAAM,IAAI,MAAMA,EAAO,OAAO,WAAW,8BAA8B;AAGzE,aAAOA,EAAO,KAAK;AAAA,IACrB,SAASC,GAAK;AACZ,YAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,YAAM,IAAI,MAAMC,CAAY;AAAA,IAC9B;AAAA,EACF,GAEMS,IAAqB,OACzBP,GACAC,MACG;AACH,QAAI;AACF,YAAMO,IAAU,MAAMT,EAAmBC,GAAYC,CAAa;AAClE,aAAO,SAAS,OAAOO;AAAA,IACzB,SAASX,GAAK;AACZ,YAAA1E,EAAM,QAAQ0E,aAAe,QAAQA,EAAI,UAAU,wCAC7CA;AAAA,IACR;AAAA,EACF,GAEMY,IAAkB,CAACT,MAChBV,EAAU,MAAM,KAAK,CAAAE,MAAYA,EAAS,OAAOQ,CAAU,GAG9DU,IAAkB,CAAClB,MAAoC;AAE3D,QAAIA,EAAS;AACX,aAAOA,EAAS;AAIlB,YAAQA,EAAS,GAAG,YAAA,GAAY;AAAA,MAC9B,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AAEE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,SAAO;AAAA,IACL,WAAW/H,EAAS,MAAM6H,EAAU,KAAK;AAAA,IACzC,kBAAAC;AAAA,IACA,SAAS9H,EAAS,MAAM0B,EAAQ,KAAK;AAAA,IACrC,OAAO1B,EAAS,MAAM0D,EAAM,KAAK;AAAA,IACjC,gBAAAsE;AAAA,IACA,oBAAAM;AAAA,IACA,oBAAAQ;AAAA,IACA,iBAAAE;AAAA,IACA,iBAAAC;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACdA,UAAMpJ,IAAQC,GAKRoC,IAAOC,GAGP,EAAE,QAAAyF,EAAA,IAAWd,GAAiBjH,EAAM,MAAM,GAG1C;AAAA,MACJ,kBAAAiI;AAAA,MACA,SAASoB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAAnB;AAAA,MACA,oBAAAc;AAAA,MACA,iBAAAG;AAAA,IAAA,IACEvB,GAAkB;AAAA,MACpB,aAAa7H,EAAM;AAAA,IAAA,CACpB;AAGD,IAAAgG,GAAU,MAAM;AACd,MAAAmC,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAGD,UAAMgB,IAAmBpJ,EAAS,MAEzB8H,EAAiB,KACzB,GAGKuB,IAAU;AAAA,MACd,MAAM,OAAOC,GAAeC,GAAkB;AAC5C,cAAMtB,IAAW,MAAM,MAAML,EAAO,QAAQ,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU,EAAE,OAAA0B,GAAO,UAAAC,GAAU;AAAA,QAAA,CACzC;AAED,YAAI,CAACtB,EAAS,IAAI;AAChB,gBAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,gBAAM,IAAI,MAAMC,EAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,QAC/F;AAEA,cAAME,IAAS,MAAMF,EAAS,KAAA;AAC9B,YAAI,CAACE,EAAO;AACV,gBAAM,IAAI,MAAMA,EAAO,OAAO,WAAW,gBAAgB;AAG3D,eAAOA,EAAO;AAAA,MAChB;AAAA,MAEA,MAAM,OAAOmB,GAAeC,GAAkBC,GAAmBC,GAAkB;AACjF,cAAMxB,IAAW,MAAM,MAAML,EAAO,QAAQ,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAAA;AAAA,UAElB,MAAM,KAAK,UAAU,EAAE,OAAA0B,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAC,GAAU;AAAA,QAAA,CAC9D;AAED,YAAI,CAACxB,EAAS,IAAI;AAChB,gBAAMC,KAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AACxD,gBAAM,IAAI,MAAMC,GAAU,OAAO,WAAW,QAAQD,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,QAC/F;AAEA,cAAME,KAAS,MAAMF,EAAS,KAAA;AAC9B,YAAI,CAACE,GAAO;AACV,gBAAM,IAAI,MAAMA,GAAO,OAAO,WAAW,gBAAgB;AAG3D,eAAOA,GAAO;AAAA,MAChB;AAAA,MAEA,MAAM,qBAAqBmB,GAAe;AAGxC,cAAM,IAAI,MAAM,yFAAyF;AAAA,MAuB3G;AAAA,IAAA,GAGII,IAAcnH,EAAI1C,EAAM,IAAI,GAC5B6B,IAAUa,EAAI,EAAK,GACnBmB,IAAQnB,EAAI,EAAE,GACdoH,IAA2BpH,EAAI,EAAK,GAEpCqH,IAAOC,EAAS;AAAA,MACpB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,iBAAiB;AAAA,IAAA,CAClB,GAEKC,IAAW9J,EAAS,MAAM0J,EAAY,UAAU,QAAQ,GACxDK,IAAkB/J,EAAS,MAAM0J,EAAY,UAAU,gBAAgB;AAErD,IAAA1J,EAAS,MACxB4J,EAAK,aAAaA,EAAK,eAC/B;AAED,UAAMI,IAAchK,EAAS,MACvB+J,EAAgB,QACXH,EAAK,MAAM,KAAA,KAAU,CAACD,EAAyB,QAGpDG,EAAS,QACJF,EAAK,MAAM,KAAA,IAGbA,EAAK,MAAM,KAAA,KAAUA,EAAK,QAClC,GA4CKK,IAAa,YAAY;AAC7B,MAAAvI,EAAQ,QAAQ,IAChBgC,EAAM,QAAQ;AAEd,UAAI;AACF,YAAIqG,EAAgB;AAElB,gBAAMV,EAAQ,qBAAqBO,EAAK,KAAK,GAC7CD,EAAyB,QAAQ,IACjCzH,EAAK,uBAAuB0H,EAAK,KAAK;AAAA,iBAC7BE,EAAS,OAAO;AAEzB,gBAAM7B,IAAW,MAAMoB,EAAQ;AAAA,YAC7BO,EAAK;AAAA,YACLA,EAAK;AAAA,YACLA,EAAK;AAAA,YACLA,EAAK;AAAA,UAAA;AAEP,UAAA1H,EAAK,WAAW+F,EAAS,IAAI;AAAA,QAC/B,OAAO;AAEL,gBAAMA,IAAW,MAAMoB,EAAQ,OAAOO,EAAK,OAAOA,EAAK,QAAQ;AAC/D,UAAA1H,EAAK,WAAW+F,EAAS,IAAI;AAAA,QAC/B;AAAA,MACF,SAASG,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU;AAC1D,QAAA1E,EAAM,QAAQ2E,GACdnG,EAAK,SAASmG,CAAY;AAAA,MAC5B,UAAA;AACE,QAAA3G,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,GAEMwI,IAAkB,OAAO3B,MAAuB;AACpD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAa1I,EAAM;AAAA,QAAA,CACpB;AAAA,MACH,SAASuI,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,aAAa0B,EAAS,QAAQ,YAAY,SAAS,SAASvB,CAAU;AAChI,QAAA7E,EAAM,QAAQ2E,GACdnG,EAAK,SAASmG,CAAY;AAAA,MAC5B;AAAA,IACF;AAGA,WAAApC,GAAM,MAAMpG,EAAM,MAAM,CAACsK,MAAY;AACnC,MAAAT,EAAY,QAAQS;AAAA,IACtB,CAAC,GAGDlE,GAAMyD,GAAa,CAACS,MAAY;AAC9B,MAAAzG,EAAM,QAAQ,IACdiG,EAAyB,QAAQ,IAEjCC,EAAK,YAAY,IACjBA,EAAK,WAAW,IAChBA,EAAK,QAAQ,IACbA,EAAK,WAAW,IAChBA,EAAK,kBAAkB,IACvB1H,EAAK,gBAAgBiI,CAAO;AAAA,IAC9B,CAAC,cA7ZCxJ,EAAA,GAAAJ,EA+IM,OA/INE,IA+IM;AAAA,MA9IJ2J,EA6IS9D,EAAA+D,EAAA,GAAA,EA7ID,SAAQ,YAAQ;AAAA,mBAEtB,MAaM;AAAA,UAbN7J,EAaM,OAbNE,IAaM;AAAA,YAZJ0J,EAIaE,GAAA;AAAA,cAJD,MAAK;AAAA,cAAO,MAAK;AAAA,YAAA;yBAC3B,MAEK;AAAA,sBAFL/J,EAEK,MAAA;AAAA,kBAFA,KAAKmJ,EAAA;AAAA,kBAAa,OAAM;AAAA,gBAAA,GACxB9F,EAAAmG,EAAA,2BAAqCD,EAAA,QAAQ,mBAAA,cAAA,GAAA,CAAA;AAAA,cAAA;;;YAGpDM,EAMaE,GAAA;AAAA,cAND,MAAK;AAAA,cAAO,MAAK;AAAA,YAAA;yBAC3B,MAII;AAAA,sBAJJ/J,EAII,KAAA;AAAA,kBAJA,KAAKmJ,EAAA;AAAA,kBAAa,OAAM;AAAA,gBAAA,GACvB9F,EAAAmG,EAAA,sFAAiGD,EAAA;;;;;UAQ1GM,EAOaE,GAAA;AAAA,YAPD,MAAK;AAAA,YAAc,MAAK;AAAA,UAAA;uBAClC,MAKM;AAAA,cALMP,EAAA,qBAAZpJ,KAAAJ,EAKM,OALNK,IAKM;AAAA,gBAJJwJ,EAGK9D,EAAAiE,EAAA,GAAA;AAAA,8BAHYb,EAAA;AAAA,gEAAAA,EAAW,QAAA9H;AAAA,kBAAG,MAAM;AAAA;;;gBAGpC;;;;;UAKLwI,EAyCaE,GAAA;AAAA,YAzCD,MAAK;AAAA,YAAc,MAAK;AAAA,UAAA;uBAClC,MAuCM;AAAA,eAvCMP,EAAA,SAAmBX,EAAA,OAAkB,UAAjDzI,KAAAJ,EAuCM,OAvCN6C,IAuCM;AAAA,wBAtCJ7C,EAqCW2F,IAAA,MAAAC,GApCUiD,EAAA,OAAgB,CAA5BrB,YADT3D,EAqCWkC,EAAAkE,CAAA,GAAA;AAAA,kBAnCR,KAAKzC,EAAS;AAAA,kBACf,SAAQ;AAAA,kBACR,cAAA;AAAA,kBACC,UAAUzB,EAAA4C,CAAA;AAAA,kBACV,SAAK,CAAAtH,MAAEsI,EAAgBnC,EAAS,EAAE;AAAA,kBACnC,OAAM;AAAA,gBAAA;6BAEN,MAwBM;AAAA,oBAxBNvH,EAwBM,OAxBNK,IAwBM;AAAA,sBAtBOkH,EAAS,WAApBpH,EAAA,GAAAJ,EAEM,OAFNY,IAEM;AAAA,wBADJX,EAAsG,OAAA;AAAA,0BAAhG,KAAKuH,EAAS;AAAA,0BAAU,QAAQA,EAAS,eAAeA,EAAS,IAAI;AAAA,0BAAS,OAAM;AAAA,wBAAA;4BAG5EA,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EASM,OATNkD,IASM9B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBARJnB,EACgI,QAAA;AAAA,0BAD1H,MAAK;AAAA,0BACT,GAAE;AAAA,wBAAA;wBACJA,EAC8I,QAAA;AAAA,0BADxI,MAAK;AAAA,0BACT,GAAE;AAAA,wBAAA;wBACJA,EACsI,QAAA;AAAA,0BADhI,MAAK;AAAA,0BACT,GAAE;AAAA,wBAAA;wBACJA,EAC4I,QAAA;AAAA,0BADtI,MAAK;AAAA,0BACT,GAAE;AAAA,wBAAA;6BAEUuH,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EAGM,OAHNoD,IAGMhC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAFJnB,EACktB,QAAA,EAAhtB,GAAE,4sBAAA,GAA2sB,MAAA,EAAA;AAAA,sBAAA,QAGjtBG,EAAA,GAAAJ,EAEM,OAFNuD,IAEM;AAAA,wBADJtD,EAAiI,QAAjIiK,IAAiI7G,GAAxEmE,EAAS,eAAeA,EAAS,MAAM,UAAU,YAAA,CAAW,GAAA,CAAA;AAAA,sBAAA;;oBAGzHvH,EAEO,QAFPkK,IAA0B,sBACP3C,EAAS,eAAeA,EAAS,KAAK,OAAM,CAAA,EAAI,YAAA,IAAgBA,EAAS,KAAK,MAAK,CAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;UAO5GqC,EAIaE,GAAA;AAAA,YAJD,MAAK;AAAA,YAAc,MAAK;AAAA,UAAA;uBAClC,MAEM;AAAA,eAFMP,EAAA,SAAmBX,EAAA,OAAkB,UAAjDzI,KAAAJ,EAEM,OAFNoK,IAEM;AAAA,gBADJnK,EAA6F,QAA7FoK,IAA2B,QAAGhH,EAAGkG,EAAA,wCAA0C,eAAW,CAAA;AAAA,cAAA;;;;UAK1FtJ,EAmCO,QAAA;AAAA,YAnCA,aAAgByJ,GAAU,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;YACvCzJ,EAqBM,OArBNqK,IAqBM;AAAA,cAnBJT,EACkF9D,EAAAwE,CAAA,GAAA;AAAA,gBADhE,YAAAlB,EAAK;AAAA,gBAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,gBAAE,MAAK;AAAA,gBAAQ,OAAM;AAAA,gBAAgB,aAAY;AAAA,gBAAmB,UAAA;AAAA,gBAC9F,cAAa;AAAA,gBAAS,OAAO8B,EAAA,SAAK,CAAKkG,EAAK,QAAK,sBAAA;AAAA,cAAA;cAGnDQ,EAcaE,GAAA;AAAA,gBAdD,MAAK;AAAA,gBAAc,MAAK;AAAA,cAAA;2BAClC,MAYM;AAAA,kBAZM,CAAAP,EAAA,UAAoBD,EAAA,SAAhCnJ,KAAAJ,EAYM,OAZNwK,IAYM;AAAA,oBAXJvK,EAKM,OALNwK,IAKM;AAAA,sBAJJrJ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAnB,EAA+D,QAAA,EAAzD,OAAM,oCAAA,GAAoC,YAAQ,EAAA;AAAA,sBACxD4J,EAES9D,EAAA2E,EAAA,GAAA;AAAA,wBAFD,SAAQ;AAAA,wBAAU,MAAK;AAAA,wBAAM,gCAAOvB,EAAA,QAAW;AAAA,sBAAA;mCAAqB,MAE5E/H,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,4BAF4E,sBAE5E,EAAA;AAAA,wBAAA;;;;;oBAGFyI,EAGmE9D,EAAAwE,CAAA,GAAA;AAAA,sBAHjD,YAAAlB,EAAK;AAAA,sBAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,WAAQhI;AAAA,sBAAE,MAAK;AAAA,sBACpC,aAAY;AAAA,sBAAsB,UAAA;AAAA,sBAClC,cAAa;AAAA,sBACZ,OAAO8B,EAAA,SAAK,CAAKkG,EAAK,WAAQ,yBAAA;AAAA,oBAAA;;;;;;YAKvCQ,EAUW9D,EAAAkE,CAAA,GAAA;AAAA,cAVD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAU9I,EAAA,SAAO,CAAKsI,EAAA;AAAA,cAAc,SAAStI,EAAA;AAAA,cAChG,gBAAcqI,EAAA,QAAe,oBAAuBD,EAAA,QAAQ,0BAAA;AAAA,YAAA;yBAC7D,MAOE;AAAA,oBAPCC,EAAA,QAA+BJ,EAAA,2CAAuGG,EAAA;;;;;UAY7IM,EAIaE,GAAA;AAAA,YAJD,MAAK;AAAA,YAAS,MAAK;AAAA,UAAA;uBAC7B,MAEiC;AAAA,cAFlBP,EAAA,SAAmBJ,EAAA,cAAlCvF,EAEiCkC,EAAA4E,EAAA,GAAA;AAAA,gBAF2B,KAAI;AAAA,gBAAgB,SAAQ;AAAA,gBACrF,SAAO,0DAA4DtB,EAAK,KAAK;AAAA,gBAC9E,OAAM;AAAA,cAAA;;;;UAIVQ,EASaE,GAAA;AAAA,YATD,MAAK;AAAA,YAAc,MAAK;AAAA,UAAA;uBAClC,MAOM;AAAA,cAPKP,EAAA,SAAXpJ,EAAA,GAAAJ,EAOM,OAPN4K,IAOM;AAAA,gBANJf,EAKS9D,EAAA2E,EAAA,GAAA;AAAA,kBALA,gCAAOvB,EAAA,QAAW;AAAA,kBAAa,OAAM;AAAA,gBAAA;6BAC5C,MAEM/H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,oBAFNnB,EAEM,OAAA;AAAA,sBAFD,OAAM;AAAA,sBAAU,MAAK;AAAA,sBAAO,QAAO;AAAA,sBAAe,SAAQ;AAAA,oBAAA;sBAC7DA,EAA4F,QAAA;AAAA,wBAAtF,kBAAe;AAAA,wBAAQ,mBAAgB;AAAA,wBAAQ,gBAAa;AAAA,wBAAI,GAAE;AAAA,sBAAA;;sBACpE,qBAER,EAAA;AAAA,kBAAA;;;;;;;;UAKWkD,EAAA,cAAfU,EAC0BkC,EAAA4E,EAAA,GAAA;AAAA;YADJ,SAAQ;AAAA,YAAS,SAASxH,EAAA;AAAA,YAAO,OAAM;AAAA,YAAuB,aAAA;AAAA,YACjF,kCAASA,EAAA,QAAK;AAAA,UAAA;UAGjB0G,EAAwBgB,EAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9B9B,UAAMvL,IAAQC,GAKRoC,IAAOC,GAGP,EAAE,QAAAyF,EAAA,IAAWd,GAAiBjH,EAAM,MAAM,GAG1C;AAAA,MACJ,kBAAAiI;AAAA,MACA,SAASoB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAAnB;AAAA,MACA,oBAAAc;AAAA,IAAA,IACEpB,GAAkB;AAAA,MACpB,aAAa7H,EAAM;AAAA,MACnB,QAAQA,EAAM;AAAA,IAAA,CACf;AAGD,IAAAgG,GAAU,MAAM;AACd,MAAAmC,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,UAAM1G,IAAUa,EAAI,EAAK,GACnBmB,IAAQnB,EAAI,EAAE,GAEdqH,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACX,GAEKwB,IAAe,YAAY;AAC/B,MAAA3J,EAAQ,QAAQ,IAChBgC,EAAM,QAAQ;AAEd,UAAI;AAEF,gBAAQ,IAAI,oBAAoBkG,CAAI,GACpC1H,EAAK,WAAW,EAAE,OAAO0H,EAAK,OAAO;AAAA,MACvC,QAAc;AACZ,QAAAlG,EAAM,QAAQ,6BACdxB,EAAK,SAASwB,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAhC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,GAEM4J,IAAoB,OAAO/C,MAAuB;AACtD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAa1I,EAAM;AAAA,UACnB,QAAQA,EAAM;AAAA,QAAA,CACf;AAAA,MACH,SAASuI,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,0BAA0BG,CAAU;AAC9F,QAAA7E,EAAM,QAAQ2E,GACdnG,EAAK,SAASmG,CAAY;AAAA,MAC5B;AAAA,IACF;sBA/KE1H,EAAA,GAAAJ,EAwFM,OAxFNE,IAwFM;AAAA,MAvFJ2J,EAsFS9D,EAAA+D,EAAA,GAAA,EAtFD,SAAQ,YAAQ;AAAA,mBAEtB,MAGM;AAAA,4BAHN7J,EAGM,OAAA,EAHD,OAAM,sBAAkB;AAAA,YAC3BA,EAAmE,MAAA,EAA/D,OAAM,wCAAA,GAAwC,cAAY;AAAA,YAC9DA,EAAmE,KAAA,EAAhE,OAAM,mBAAA,GAAmB,qCAAmC;AAAA,UAAA;UAItD8F,EAAAwB,CAAA,GAAkB,UAA7BnH,KAAAJ,EA8BM,OA9BNG,IA8BM;AAAA,oBA7BJH,EA4BW2F,IAAA,MAAAC,GA5BkBG,EAAAwB,CAAA,GAAgB,CAA5BC,YAAjB3D,EA4BWkC,EAAAkE,CAAA,GAAA;AAAA,cA5BqC,KAAKzC,EAAS;AAAA,cAAI,SAAQ;AAAA,cAAU,cAAA;AAAA,cACjF,UAAUzB,EAAA4C,CAAA;AAAA,cACV,SAAK,CAAAtH,MAAE0J,EAAkBvD,EAAS,EAAE;AAAA,cAAG,OAAM;AAAA,YAAA;yBAC9C,MAuBM;AAAA,gBAvBNvH,EAuBM,OAvBNI,IAuBM;AAAA,kBArBOmH,EAAS,WAApBpH,EAAA,GAAAJ,EAEM,OAFN6C,IAEM;AAAA,oBADJ5C,EAAsG,OAAA;AAAA,sBAAhG,KAAKuH,EAAS;AAAA,sBAAU,QAAQA,EAAS,eAAeA,EAAS,IAAI;AAAA,sBAAS,OAAM;AAAA,oBAAA;wBAG5EA,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EASM,OATNY,IASMQ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBARJnB,EACgI,QAAA;AAAA,sBAD1H,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EAC8I,QAAA;AAAA,sBADxI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EACsI,QAAA;AAAA,sBADhI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EAC4I,QAAA;AAAA,sBADtI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;yBAEUuH,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EAGM,OAHNiD,IAGM7B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFJnB,EACktB,QAAA,EAAhtB,GAAE,4sBAAA,GAA2sB,MAAA,EAAA;AAAA,kBAAA,QAEjtBG,EAAA,GAAAJ,EAEM,OAFNkD,IAEM;AAAA,oBADJjD,EAAiI,QAAjImD,IAAiIC,GAAxEmE,EAAS,eAAeA,EAAS,MAAM,UAAU,YAAA,CAAW,GAAA,CAAA;AAAA,kBAAA;;gBAGzHvH,EAA0F,QAA1FsD,IAA0B,mBAAcF,EAAGmE,EAAS,eAAeA,EAAS,IAAI,GAAA,CAAA;AAAA,cAAA;;;;UAKzEzB,EAAAwB,CAAA,GAAkB,UAA7BnH,KAAAJ,EAEM,OAFNkK,IAEM9I,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YADJnB,EAAuD,QAAA,EAAjD,OAAM,eAAA,GAAe,yBAAqB,EAAA;AAAA,UAAA;UAIlDA,EAsBO,QAAA;AAAA,YAtBA,aAAgB6K,GAAY,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;YACzC7K,EAeM,OAfNkK,IAeM;AAAA,cAdJN,EAE6D9D,EAAAwE,CAAA,GAAA;AAAA,gBAFpD,IAAG;AAAA,gBAAiB,YAAAlB,EAAK;AAAA,gBAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,gBAAE,MAAK;AAAA,gBAAQ,OAAM;AAAA,gBAC1D,aAAY;AAAA,gBAA2B,cAAa;AAAA,gBAAQ,UAAA;AAAA,gBAC3D,OAAO8B,EAAA,QAAK,8BAAiC;AAAA,cAAA;cAEhDlD,EASM,OAAA,MAAA;AAAA,gBARJA,EAKM,OALNmK,IAKM;AAAA,kBAJJhJ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAnB,EAAkE,QAAA,EAA5D,OAAM,uCAAA,GAAuC,YAAQ,EAAA;AAAA,kBAC3D4J,EAES9D,EAAA2E,EAAA,GAAA;AAAA,oBAFA,gCAAO7J,EAAAA,MAAK,iBAAA;AAAA,oBAAqB,OAAM;AAAA,kBAAA;+BAAU,MAE1DO,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAF0D,sBAE1D,EAAA;AAAA,oBAAA;;;;;gBAEFyI,EACsG9D,EAAAwE,CAAA,GAAA;AAAA,kBAD7F,IAAG;AAAA,kBAAoB,YAAAlB,EAAK;AAAA,kBAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,WAAQhI;AAAA,kBAAE,MAAK;AAAA,kBAAW,aAAY;AAAA,kBACzE,cAAa;AAAA,kBAAmB,UAAA;AAAA,kBAAU,OAAO8B,EAAA,QAAK,8BAAiC;AAAA,gBAAA;;;YAI7F0G,EAGW9D,EAAAkE,CAAA,GAAA;AAAA,cAHD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAU9I,WAAO,CAAKkI,EAAK,SAAK,CAAKA,EAAK;AAAA,cAC7F,SAASlI,EAAA;AAAA,cAAU,gBAAc;AAAA,YAAA;yBAAiB,MAErDC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,kBAFqD,aAErD,EAAA;AAAA,cAAA;;;;;UAIa+B,EAAA,cAAfU,EAC0BkC,EAAA4E,EAAA,GAAA;AAAA;YADJ,SAAQ;AAAA,YAAS,SAASxH,EAAA;AAAA,YAAO,OAAM;AAAA,YAAuB,aAAA;AAAA,YACjF,kCAASA,EAAA,QAAK;AAAA,UAAA;UAGjBlD,EAOM,OAPNoK,IAOM;AAAA,YANJpK,EAKI,KALJqK,IAKI;AAAA,kCALgC,4BAElC,EAAA;AAAA,cAAAT,EAES9D,EAAA2E,EAAA,GAAA;AAAA,gBAFA,gCAAO7J,EAAAA,MAAK,kBAAA;AAAA,cAAA;2BAAsB,MAE3CO,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,oBAF2C,aAE3C,EAAA;AAAA,gBAAA;;;;;;UAKJyI,EAAwBgB,EAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6C9B,UAAMvL,IAAQC,GAKRoC,IAAOC,GAGP,EAAE,QAAAyF,EAAA,IAAWd,GAAiBjH,EAAM,MAAM,GAG1C;AAAA,MACJ,kBAAAiI;AAAA,MACA,SAASoB;AAAA,MACT,OAAOC;AAAA,MACP,gBAAAnB;AAAA,MACA,oBAAAc;AAAA,IAAA,IACEpB,GAAkB;AAAA,MACpB,aAAa7H,EAAM;AAAA,MACnB,QAAQA,EAAM;AAAA,IAAA,CACf;AAGD,IAAAgG,GAAU,MAAM;AACd,MAAAmC,EAAA,EAAiB,MAAM,CAAAI,MAAO;AAC5B,gBAAQ,KAAK,oCAAoCA,CAAG;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,UAAM1G,IAAUa,EAAI,EAAK,GACnBmB,IAAQnB,EAAI,EAAE,GAEdqH,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR;AAEmB,IAAA7J,EAAS,MACpB4J,EAAK,MAAM,KAAA,KAAUA,EAAK,MAAM,SAAS,GAAG,CACpD;AAED,UAAM2B,IAAe,YAAY;AAC/B,MAAA7J,EAAQ,QAAQ,IAChBgC,EAAM,QAAQ;AAEd,UAAI;AAEF,gBAAQ,IAAI,+BAA+B,EAAE,OAAOkG,EAAK,OAAO,GAChE1H,EAAK,WAAW;AAAA,UACd,OAAO0H,EAAK;AAAA,QAAA,CACb;AAAA,MACH,QAAc;AACZ,QAAAlG,EAAM,QAAQ,6BACdxB,EAAK,SAASwB,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAhC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,GAEM8J,IAAoB,OAAOjD,MAAuB;AACtD,UAAI;AACF,cAAMO,EAAmBP,GAAY;AAAA,UACnC,aAAa1I,EAAM;AAAA,UACnB,QAAQA,EAAM;AAAA,QAAA,CACf;AAAA,MACH,SAASuI,GAAK;AACZ,cAAMC,IAAeD,aAAe,QAAQA,EAAI,UAAU,0BAA0BG,CAAU;AAC9F,QAAA7E,EAAM,QAAQ2E,GACdnG,EAAK,SAASmG,CAAY;AAAA,MAC5B;AAAA,IACF;sBAxME1H,EAAA,GAAAJ,EA6GM,OA7GNE,IA6GM;AAAA,MA5GJ2J,EA2GS9D,EAAA+D,EAAA,GAAA,EA3GD,SAAQ,YAAQ;AAAA,mBAEtB,MAGM;AAAA,0BAHN7J,EAGM,OAAA,EAHD,OAAM,sBAAkB;AAAA,YAC3BA,EAAqE,MAAA,EAAjE,OAAM,wCAAA,GAAwC,gBAAc;AAAA,YAChEA,EAA0E,KAAA,EAAvE,OAAM,mBAAA,GAAmB,4CAA0C;AAAA,UAAA;UAI7D8F,EAAAwB,CAAA,GAAkB,UAA7BnH,KAAAJ,EAoCM,OApCNG,IAoCM;AAAA,oBAnCJH,EAkCW2F,IAAA,MAAAC,GAjCUG,EAAAwB,CAAA,GAAgB,CAA5BC,YADT3D,EAkCWkC,EAAAkE,CAAA,GAAA;AAAA,cAhCR,KAAKzC,EAAS;AAAA,cACf,SAAQ;AAAA,cACR,cAAA;AAAA,cACC,UAAUzB,EAAA4C,CAAA;AAAA,cACV,SAAK,CAAAtH,MAAE4J,EAAkBzD,EAAS,EAAE;AAAA,cACrC,OAAM;AAAA,YAAA;yBAEN,MAuBM;AAAA,gBAvBNvH,EAuBM,OAvBNI,IAuBM;AAAA,kBArBOmH,EAAS,WAApBpH,EAAA,GAAAJ,EAEM,OAFN6C,IAEM;AAAA,oBADJ5C,EAAsG,OAAA;AAAA,sBAAhG,KAAKuH,EAAS;AAAA,sBAAU,QAAQA,EAAS,eAAeA,EAAS,IAAI;AAAA,sBAAS,OAAM;AAAA,oBAAA;wBAG5EA,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EASM,OATNY,IASMQ,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBARJnB,EACgI,QAAA;AAAA,sBAD1H,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EAC8I,QAAA;AAAA,sBADxI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EACsI,QAAA;AAAA,sBADhI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;oBACJA,EAC4I,QAAA;AAAA,sBADtI,MAAK;AAAA,sBACT,GAAE;AAAA,oBAAA;yBAEUuH,EAAS,OAAE,YAA3BpH,EAAA,GAAAJ,EAGM,OAHNiD,IAGM7B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAFJnB,EACktB,QAAA,EAAhtB,GAAE,4sBAAA,GAA2sB,MAAA,EAAA;AAAA,kBAAA,QAEjtBG,EAAA,GAAAJ,EAEM,OAFNkD,IAEM;AAAA,oBADJjD,EAAiI,QAAjImD,IAAiIC,GAAxEmE,EAAS,eAAeA,EAAS,MAAM,UAAU,YAAA,CAAW,GAAA,CAAA;AAAA,kBAAA;;gBAGzHvH,EAA0F,QAA1FsD,IAA0B,mBAAcF,EAAGmE,EAAS,eAAeA,EAAS,IAAI,GAAA,CAAA;AAAA,cAAA;;;;UAKzEzB,EAAAwB,CAAA,GAAkB,UAA7BnH,KAAAJ,EAEM,OAFNkK,IAEM9I,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,YADJnB,EAA8D,QAAA,EAAxD,OAAM,eAAA,GAAe,gCAA4B,EAAA;AAAA,UAAA;UAIzDA,EAyBO,QAAA;AAAA,YAzBA,aAAgB+K,GAAY,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;YAEzC/K,EAWM,OAAA,MAAA;AAAA,cAVJ4J,EASE9D,EAAAwE,CAAA,GAAA;AAAA,gBARA,IAAG;AAAA,gBACM,YAAAlB,EAAK;AAAA,gBAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,gBACnB,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,aAAY;AAAA,gBACZ,cAAa;AAAA,gBACb,UAAA;AAAA,gBACC,OAAO8B,EAAA;AAAA,cAAA;;YAIZ0G,EASW9D,EAAAkE,CAAA,GAAA;AAAA,cART,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,cAAA;AAAA,cACC,UAAU9I,EAAA;AAAA,cACV,SAASA,EAAA;AAAA,cACV,gBAAa;AAAA,YAAA;yBACd,MAEDC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAFC,qBAED,EAAA;AAAA,cAAA;;;;;UAIS+B,EAAA,SAAX/C,EAAA,GAAAJ,EAWM,OAXNmK,IAWM;AAAA,YAVJlK,EASM,OATNmK,IASM;AAAA,cARJnK,EAOM,OAPNoK,IAOM;AAAA,gCANJpK,EAIM,OAAA;AAAA,kBAJD,OAAM;AAAA,kBAA+B,MAAK;AAAA,kBAAe,SAAQ;AAAA,gBAAA;kBACpEA,EAEwB,QAAA;AAAA,oBAFlB,aAAU;AAAA,oBACd,GAAE;AAAA,oBACF,aAAU;AAAA,kBAAA;;gBAEdA,EAAsC,KAAtCqK,IAAsCjH,EAAZF,EAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;UAMrClD,EASM,OATNuK,IASM;AAAA,YARJvK,EAOI,KAPJwK,IAOI;AAAA,gCAPgC,8BAElC,EAAA;AAAA,cAAAxK,EAIS,UAAA;AAAA,gBAJD,MAAK;AAAA,gBACX,OAAM;AAAA,gBACL,gCAAOY,EAAAA,MAAK,kBAAA;AAAA,cAAA,GAAsB,WAErC;AAAA,YAAA;;UAKJgJ,EAAwBgB,EAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACyL9B,UAAMvL,IAAQC,GACRoC,IAAOC,GAEPT,IAAUa,EAAI,EAAK,GACnBkJ,IAAqBlJ,EAAI,EAAK,GAC9BmJ,IAAiBnJ,EAAI,EAAE,GACvB8F,IAAe9F,EAAI,EAAE,GACrBoJ,IAAiBpJ,EAAI;AAAA,MACzB,EAAE,IAAI,KAAK,QAAQ,iBAAiB,UAAU,qBAAqB,YAAY,iBAAiB,SAAS,GAAA;AAAA,MACzG,EAAE,IAAI,KAAK,QAAQ,oBAAoB,UAAU,qBAAqB,YAAY,cAAc,SAAS,GAAA;AAAA,IAAM,CAChH,GAEKqH,IAAOC,EAAS;AAAA,MACpB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR,GAEK+B,IAAe/B,EAAS;AAAA,MAC5B,SAAS;AAAA,MACT,KAAK;AAAA,MACL,SAAS;AAAA,IAAA,CACV,GAEKgC,IAAShC,EAAS;AAAA,MACtB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR,GAEKiC,IAAa9L,EAAS,MACrBH,EAAM,OAET+J,EAAK,cAAc/J,EAAM,KAAK,aAC9B+J,EAAK,aAAa/J,EAAM,KAAK,YAC7B+J,EAAK,UAAU/J,EAAM,KAAK,SAC1B+J,EAAK,WAAW/J,EAAM,KAAK,SAAS,MALd,EAOzB,GAEKkM,IAAsB/L,EAAS,MAEjC4L,EAAa,WACbA,EAAa,OACbA,EAAa,WACbA,EAAa,QAAQA,EAAa,WAClCA,EAAa,IAAI,UAAU,CAE9B,GAEKI,IAAc,CAACxC,GAAoBC,MACnC,CAACD,KAAa,CAACC,IAAiB,MAC7B,GAAGD,IAAY,CAAC,KAAK,EAAE,GAAGC,IAAW,CAAC,KAAK,EAAE,GAAG,YAAA;AAIzD,IAAAxD,GAAM,MAAMpG,EAAM,MAAM,CAACoM,MAAS;AAChC,MAAIA,MACFrC,EAAK,YAAYqC,EAAK,WACtBrC,EAAK,WAAWqC,EAAK,UACrBrC,EAAK,QAAQqC,EAAK,OAClBrC,EAAK,QAAQqC,EAAK,SAAS;AAAA,IAE/B,GAAG,EAAE,WAAW,IAAM;AAEtB,UAAMC,IAAgB,MAAM;AAC1B,MAAAR,EAAe,QAAQ,IACvBrD,EAAa,QAAQ,IACrB,OAAO,KAAKwD,CAAM,EAAE,QAAQ,CAAAM,MAAO;AACjC,QAAAN,EAAOM,CAA0B,IAAI;AAAA,MACvC,CAAC;AAAA,IACH,GAEMC,IAAsB,YAAY;AACtC,MAAAF,EAAA,GACAxK,EAAQ,QAAQ;AAEhB,UAAI;AAKF,cAAM,IAAI,QAAQ,CAAA2K,MAAW,WAAWA,GAAS,GAAI,CAAC;AAEtD,cAAMC,IAAc;AAAA,UAClB,GAAGzM,EAAM;AAAA,UACT,GAAG+J;AAAA,QAAA;AAGL,QAAA8B,EAAe,QAAQ,gCACvBxJ,EAAK,mBAAmBoK,CAAW;AAAA,MACrC,QAAc;AACZ,QAAAjE,EAAa,QAAQ,4BACrBnG,EAAK,SAASmG,EAAa,KAAK;AAAA,MAClC,UAAA;AACE,QAAA3G,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,GAEM6K,IAAuB,YAAY;AACvC,UAAKR,EAAoB,OAEzB;AAAA,QAAAG,EAAA,GACAxK,EAAQ,QAAQ;AAEhB,YAAI;AAKF,gBAAM,IAAI,QAAQ,CAAA2K,MAAW,WAAWA,GAAS,GAAI,CAAC,GAEtDX,EAAe,QAAQ,iCACvBD,EAAmB,QAAQ,IAC3BG,EAAa,UAAU,IACvBA,EAAa,MAAM,IACnBA,EAAa,UAAU;AAAA,QACzB,QAAc;AACZ,UAAAvD,EAAa,QAAQ;AAAA,QACvB,UAAA;AACE,UAAA3G,EAAQ,QAAQ;AAAA,QAClB;AAAA;AAAA,IACF,GAEM8K,IAAoB,MAAM;AAG9B,MAAAtK,EAAK,SAAS,gDAAgD;AAAA,IAChE,GAEMuK,IAAkB,MAAM;AAC5B,MAAAvK,EAAK,cAAc,CAACrC,EAAM,MAAM,UAAU;AAAA,IAC5C,GAEM6M,IAAe,MAAM;AACzB,MAAI7M,EAAM,SACR+J,EAAK,YAAY/J,EAAM,KAAK,WAC5B+J,EAAK,WAAW/J,EAAM,KAAK,UAC3B+J,EAAK,QAAQ/J,EAAM,KAAK,OACxB+J,EAAK,QAAQ/J,EAAM,KAAK,SAAS,KAEnCqM,EAAA,GACAT,EAAmB,QAAQ,IAC3BG,EAAa,UAAU,IACvBA,EAAa,MAAM,IACnBA,EAAa,UAAU;AAAA,IACzB;sBAxbEjL,EAAA,GAAAJ,EAsQM,OAtQNE,IAsQM;AAAA,MArQJD,EAoQM,OApQNE,IAoQM;AAAA,0BAlQJF,EAGM,OAAA,EAHD,OAAM,sBAAkB;AAAA,UAC3BA,EAAuE,MAAA,EAAnE,OAAM,wCAAA,GAAwC,kBAAgB;AAAA,UAClEA,EAA+E,KAAA,EAA5E,OAAM,mBAAA,GAAmB,iDAA+C;AAAA,QAAA;QAI7EA,EAqBM,OArBNI,IAqBM;AAAA,UApBJJ,EAaM,OAbN4C,IAaM;AAAA,YAZJ5C,EAEM,OAFNK,IAEM+C,EADDoI,EAAYC,EAAAA,MAAM,WAAWA,EAAAA,MAAM,QAAQ,CAAA,GAAA,CAAA;AAAA,YAEhDzL,EAQS,UAAA;AAAA,cAPP,OAAM;AAAA,cACL,SAAOgM;AAAA,YAAA;cAERhM,EAGM,OAAA;AAAA,gBAHD,OAAM;AAAA,gBAAqB,MAAK;AAAA,gBAAO,QAAO;AAAA,gBAAe,SAAQ;AAAA,cAAA;gBACxEA,EAA6O,QAAA;AAAA,kBAAvO,kBAAe;AAAA,kBAAQ,mBAAgB;AAAA,kBAAQ,gBAAa;AAAA,kBAAI,GAAE;AAAA,gBAAA;gBACxEA,EAA6G,QAAA;AAAA,kBAAvG,kBAAe;AAAA,kBAAQ,mBAAgB;AAAA,kBAAQ,gBAAa;AAAA,kBAAI,GAAE;AAAA,gBAAA;;;;UAI9EA,EAKS,UAAA;AAAA,YAJP,OAAM;AAAA,YACL,SAAOgM;AAAA,UAAA,GACT,gBAED;AAAA,QAAA;QAIFhM,EAyMO,QAAA;AAAA,UAzMA,aAAgB4L,GAAmB,CAAA,SAAA,CAAA;AAAA,UAAE,OAAM;AAAA,QAAA;UAChD5L,EA4KM,OA5KNW,IA4KM;AAAA,YA1KJX,EA4EM,OA5ENgD,IA4EM;AAAA,cA3EJ7B,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAnB,EAAiF,MAAA,EAA7E,OAAM,8CAAA,GAA8C,wBAAoB,EAAA;AAAA,cAE5EA,EAgBM,OAAA,MAAA;AAAA,kCAfJA,EAA8D,SAAA;AAAA,kBAAvD,KAAI;AAAA,kBAAY,OAAM;AAAA,gBAAA,GAAe,cAAU,EAAA;AAAA,kBACtDA,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBACM,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,YAAShI;AAAA,kBACvB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKyE,EAAA;AAAA;oBAAwDwF,EAAO,aAAS;AAAA,kBAAA;kBAI9E,aAAY;AAAA,kBACX,UAAUnK,EAAA;AAAA,gBAAA;kBATF,CAAAiL,GAAA/C,EAAK,SAAS;AAAA,gBAAA;gBAWhBiC,EAAO,aAAhBlL,EAAA,GAAAJ,EAAuF,KAAvFoD,IAAuFC,EAAvBiI,EAAO,SAAS,GAAA,CAAA;;cAGlFrL,EAgBM,OAAA,MAAA;AAAA,kCAfJA,EAA4D,SAAA;AAAA,kBAArD,KAAI;AAAA,kBAAW,OAAM;AAAA,gBAAA,GAAe,aAAS,EAAA;AAAA,kBACpDA,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBACM,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,WAAQhI;AAAA,kBACtB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKyE,EAAA;AAAA;oBAAwDwF,EAAO,YAAQ;AAAA,kBAAA;kBAI7E,aAAY;AAAA,kBACX,UAAUnK,EAAA;AAAA,gBAAA;kBATF,CAAAiL,GAAA/C,EAAK,QAAQ;AAAA,gBAAA;gBAWfiC,EAAO,YAAhBlL,EAAA,GAAAJ,EAAqF,KAArFkK,IAAqF7G,EAAtBiI,EAAO,QAAQ,GAAA,CAAA;;cAGhFrL,EAmBM,OAAA,MAAA;AAAA,kCAlBJA,EAA6D,SAAA;AAAA,kBAAtD,KAAI;AAAA,kBAAQ,OAAM;AAAA,gBAAA,GAAe,iBAAa,EAAA;AAAA,kBACrDA,EAYE,SAAA;AAAA,kBAXA,IAAG;AAAA,kBACM,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,kBACnB,MAAK;AAAA,kBACL,UAAA;AAAA,kBACA,cAAa;AAAA,kBACZ,OAAKyE,EAAA;AAAA;oBAAwDwF,EAAO,SAAK;AAAA,kBAAA;kBAI1E,aAAY;AAAA,kBACX,UAAUnK,EAAA;AAAA,gBAAA;kBATF,CAAAiL,GAAA/C,EAAK,KAAK;AAAA,gBAAA;gBAWZiC,EAAO,SAAhBlL,EAAA,GAAAJ,EAA+E,KAA/EoK,IAA+E/G,EAAnBiI,EAAO,KAAK,GAAA,CAAA;gBAC/DjC,EAAK,UAAUqC,EAAAA,MAAM,cAA9B1L,EAEI,KAFJqK,IAA0E,iDAE1E;;cAGFpK,EAeM,OAAA,MAAA;AAAA,kCAdJA,EAA4D,SAAA;AAAA,kBAArD,KAAI;AAAA,kBAAQ,OAAM;AAAA,gBAAA,GAAe,gBAAY,EAAA;AAAA,kBACpDA,EAWE,SAAA;AAAA,kBAVA,IAAG;AAAA,kBACM,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,kBACnB,MAAK;AAAA,kBACL,cAAa;AAAA,kBACZ,OAAKyE,EAAA;AAAA;oBAAwDwF,EAAO,SAAK;AAAA,kBAAA;kBAI1E,aAAY;AAAA,kBACX,UAAUnK,EAAA;AAAA,gBAAA;kBARF,CAAAiL,GAAA/C,EAAK,KAAK;AAAA,gBAAA;gBAUZiC,EAAO,SAAhBlL,EAAA,GAAAJ,EAA+E,KAA/EwK,IAA+EnH,EAAnBiI,EAAO,KAAK,GAAA,CAAA;;;YAK5ErL,EA0FM,OA1FNwK,IA0FM;AAAA,cAzFJrJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAnB,EAA8E,MAAA,EAA1E,OAAM,8CAAA,GAA8C,qBAAiB,EAAA;AAAA,cAGzEA,EA8CM,OA9CN2K,IA8CM;AAAA,gBA7CJ3K,EAYM,OAZNoM,IAYM;AAAA,oCAXJpM,EAGM,OAAA,MAAA;AAAA,oBAFJA,EAAsD,MAAA,EAAlD,OAAM,+BAAA,GAA+B,UAAQ;AAAA,oBACjDA,EAAgE,KAAA,EAA7D,OAAM,2BAAA,GAA2B,0BAAwB;AAAA,kBAAA;kBAE9DA,EAMS,UAAA;AAAA,oBALP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,SAAKmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAE6J,EAAA,QAAkB,CAAIA,EAAA;AAAA,kBAAA,KAE3BA,EAAA,QAAkB,WAAA,QAAA,GAAA,CAAA;AAAA,gBAAA;gBAIdA,EAAA,SAAX9K,EAAA,GAAAJ,EA8BM,OA9BNsM,IA8BM;AAAA,oBA7BJrM,EAME,SAAA;AAAA,oBALS,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgK,EAAa,UAAOhK;AAAA,oBAC7B,MAAK;AAAA,oBACL,aAAY;AAAA,oBACZ,OAAM;AAAA,oBACN,cAAa;AAAA,kBAAA;oBAJJ,CAAA+K,GAAAf,EAAa,OAAO;AAAA,kBAAA;oBAM/BpL,EAME,SAAA;AAAA,oBALS,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgK,EAAa,MAAGhK;AAAA,oBACzB,MAAK;AAAA,oBACL,aAAY;AAAA,oBACZ,OAAM;AAAA,oBACN,cAAa;AAAA,kBAAA;oBAJJ,CAAA+K,GAAAf,EAAa,GAAG;AAAA,kBAAA;oBAM3BpL,EAME,SAAA;AAAA,oBALS,uBAAAmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgK,EAAa,UAAOhK;AAAA,oBAC7B,MAAK;AAAA,oBACL,aAAY;AAAA,oBACZ,OAAM;AAAA,oBACN,cAAa;AAAA,kBAAA;oBAJJ,CAAA+K,GAAAf,EAAa,OAAO;AAAA,kBAAA;kBAM/BpL,EAOS,UAAA;AAAA,oBANP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,SAAO+L;AAAA,oBACP,WAAWR,EAAA;AAAA,kBAAA,GACb,qBAED,GAAAe,EAAA;AAAA,gBAAA;;cAKJtM,EAmBM,OAnBNuM,IAmBM;AAAA,gBAlBJvM,EAiBM,OAjBNwM,IAiBM;AAAA,kBAhBJxM,EAKM,OAAA,MAAA;AAAA,oBAJJmB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAnB,EAAuE,MAAA,EAAnE,OAAM,+BAAA,GAA+B,6BAAyB,EAAA;AAAA,oBAClEA,EAEI,KAFJyM,IAEIrJ,EADCqI,EAAAA,MAAM,aAAU,YAAA,oCAAA,GAAA,CAAA;AAAA,kBAAA;kBAGvBzL,EASS,UAAA;AAAA,oBARP,MAAK;AAAA,oBACJ,OAAK6F,EAAA;AAAA,sBAAwB4F,EAAAA,MAAM,aAAU,kBAAA;AAAA;;oBAI7C,SAAOQ;AAAA,kBAAA,GAELR,EAAAA,EAAAA,MAAM,aAAU,YAAA,QAAA,GAAA,CAAA;AAAA,gBAAA;;cAMzBzL,EAcM,OAdN0M,IAcM;AAAA,gBAbJ1M,EAYM,OAZN2M,IAYM;AAAA,kBAXJ3M,EAGM,OAAA,MAAA;AAAA,oBAFJmB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAnB,EAA6D,MAAA,EAAzD,OAAM,+BAAA,GAA+B,mBAAe,EAAA;AAAA,oBACxDA,EAAoF,KAApF4M,IAAoFxJ,EAA7C+H,QAAe,MAAM,IAAG,qBAAiB,CAAA;AAAA,kBAAA;kBAElFnL,EAMS,UAAA;AAAA,oBALP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,gCAAOY,EAAAA,MAAK,iBAAA;AAAA,kBAAA,GACd,UAED;AAAA,gBAAA;;;;UAORZ,EAwBM,OAxBN6M,IAwBM;AAAA,YAvBJ7M,EAaS,UAAA;AAAA,cAZP,MAAK;AAAA,cACJ,UAAUkB,EAAA,SAAO,CAAKoK,EAAA;AAAA,cACvB,OAAM;AAAA,YAAA;cAEMpK,EAAA,SAAZf,EAAA,GAAAJ,EAMO,QANP+M,IAMO3L,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gBALLnB,EAGM,OAAA;AAAA,kBAHD,OAAM;AAAA,kBAAuB,MAAK;AAAA,kBAAO,SAAQ;AAAA,gBAAA;kBACpDA,EAA0F,UAAA;AAAA,oBAAlF,OAAM;AAAA,oBAAa,IAAG;AAAA,oBAAK,IAAG;AAAA,oBAAK,GAAE;AAAA,oBAAK,QAAO;AAAA,oBAAe,gBAAa;AAAA,kBAAA;kBACrFA,EAAsK,QAAA;AAAA,oBAAhK,OAAM;AAAA,oBAAa,MAAK;AAAA,oBAAe,GAAE;AAAA,kBAAA;;kBAC3C,uBAER,EAAA;AAAA,cAAA,QACAG,EAAA,GAAAJ,EAAgC,YAAnB,cAAY;AAAA,YAAA;YAG3BC,EAOS,UAAA;AAAA,cANP,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAOkM;AAAA,cACP,UAAUhL,EAAA;AAAA,YAAA,GACZ,YAED,GAAA6L,EAAA;AAAA,UAAA;;QAKO7B,EAAA,SAAX/K,EAAA,GAAAJ,EASM,OATNiN,IASM;AAAA,UARJhN,EAOM,OAPNiN,IAOM;AAAA,YANJjN,EAKM,OALNkN,IAKM;AAAA,gCAJJlN,EAEM,OAAA;AAAA,gBAFD,OAAM;AAAA,gBAA+B,MAAK;AAAA,gBAAe,SAAQ;AAAA,cAAA;gBACpEA,EAA6M,QAAA;AAAA,kBAAvM,aAAU;AAAA,kBAAU,GAAE;AAAA,kBAA2J,aAAU;AAAA,gBAAA;;cAEnMA,EAA+C,KAA/CmN,IAA+C/J,EAArB8H,EAAA,KAAc,GAAA,CAAA;AAAA,YAAA;;;QAKnCrD,EAAA,SAAX1H,EAAA,GAAAJ,EASM,OATNqN,IASM;AAAA,UARJpN,EAOM,OAPNqN,IAOM;AAAA,YANJrN,EAKM,OALNsN,IAKM;AAAA,gCAJJtN,EAEM,OAAA;AAAA,gBAFD,OAAM;AAAA,gBAA+B,MAAK;AAAA,gBAAe,SAAQ;AAAA,cAAA;gBACpEA,EAAkQ,QAAA;AAAA,kBAA5P,aAAU;AAAA,kBAAU,GAAE;AAAA,kBAAgN,aAAU;AAAA,gBAAA;;cAExPA,EAA6C,KAA7CuN,IAA6CnK,EAAnByE,EAAA,KAAY,GAAA,CAAA;AAAA,YAAA;;;QAM5C+B,EAAwBgB,EAAA;AAAA,MAAA;;;;;;;AC5M9B,UAAMlJ,IAAOC,GAEPT,IAAUa,EAAI,EAAK,GACnBmB,IAAQnB,EAAI,EAAE,GACdyL,IAAczL,EAAI,EAAK,GAEvBqH,IAAOC,EAAS;AAAA,MACpB,OAAO;AAAA,IAAA,CACR,GAEKoE,IAAsB,YAAY;AACtC,MAAAvM,EAAQ,QAAQ,IAChBgC,EAAM,QAAQ;AAEd,UAAI;AAEF,gBAAQ,IAAI,2BAA2B,EAAE,OAAOkG,EAAK,OAAO,GAG5D,MAAM,IAAI,QAAQ,CAAAyC,MAAW,WAAWA,GAAS,GAAI,CAAC,GAEtD2B,EAAY,QAAQ,IACpB9L,EAAK,WAAW0H,EAAK,KAAK;AAAA,MAC5B,QAAc;AACZ,QAAAlG,EAAM,QAAQ,0DACdxB,EAAK,SAASwB,EAAM,KAAK;AAAA,MAC3B,UAAA;AACE,QAAAhC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;sBArFEf,EAAA,GAAAJ,EA0CM,OA1CNE,IA0CM;AAAA,MAzCJ2J,EAwCS9D,EAAA+D,EAAA,GAAA,EAxCD,SAAQ,YAAQ;AAAA,mBAEtB,MAGM;AAAA,0BAHN7J,EAGM,OAAA,EAHD,OAAM,sBAAkB;AAAA,YAC3BA,EAAqE,MAAA,EAAjE,OAAM,wCAAA,GAAwC,gBAAc;AAAA,YAChEA,EAAyG,KAAA,EAAtG,OAAM,mBAAA,GAAmB,2EAAyE;AAAA,UAAA;UAIvGA,EASO,QAAA;AAAA,YATA,aAAgByN,GAAmB,CAAA,SAAA,CAAA;AAAA,YAAE,OAAM;AAAA,UAAA;YAChD7D,EAE2D9D,EAAAwE,CAAA,GAAA;AAAA,cAFlD,IAAG;AAAA,cAAiB,YAAAlB,EAAK;AAAA,cAAL,uBAAAjI,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAAgI,EAAK,QAAKhI;AAAA,cAAE,MAAK;AAAA,cAAQ,OAAM;AAAA,cAC1D,aAAY;AAAA,cAA2B,cAAa;AAAA,cAAQ,UAAA;AAAA,cAAU,UAAUF,EAAA,SAAWsM,EAAA;AAAA,cAC1F,OAAOtK,EAAA,QAAK,4BAA+B;AAAA,YAAA;YAE9C0G,EAGW9D,EAAAkE,CAAA,GAAA;AAAA,cAHD,MAAK;AAAA,cAAS,SAAQ;AAAA,cAAU,cAAA;AAAA,cAAY,UAAU9I,WAAO,CAAKkI,EAAK,MAAM,KAAA,KAAUoE,EAAA;AAAA,cAC9F,SAAStM,EAAA;AAAA,cAAU,gBAAc;AAAA,YAAA;yBAClC,MAAoD;AAAA,oBAAjDsM,EAAA,QAAW,eAAA,iBAAA,GAAA,CAAA;AAAA,cAAA;;;;UAKHA,EAAA,cAAf5J,EAEiCkC,EAAA4E,EAAA,GAAA;AAAA;YAFL,SAAQ;AAAA,YACjC,SAAO,0DAA4DtB,EAAK,KAAK;AAAA,YAC9E,OAAM;AAAA,UAAA;UAGOlG,EAAA,cAAfU,EAC0BkC,EAAA4E,EAAA,GAAA;AAAA;YADJ,SAAQ;AAAA,YAAS,SAASxH,EAAA;AAAA,YAAO,OAAM;AAAA,YAAuB,aAAA;AAAA,YACjF,kCAASA,EAAA,QAAK;AAAA,UAAA;UAGjBlD,EAOM,OAPNE,IAOM;AAAA,YANJ0J,EAKS9D,EAAA2E,EAAA,GAAA;AAAA,cALA,gCAAO7J,EAAAA,MAAK,gBAAA;AAAA,cAAoB,OAAM;AAAA,YAAA;yBAC7C,MAEMO,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,gBAFNnB,EAEM,OAAA;AAAA,kBAFD,OAAM;AAAA,kBAAU,MAAK;AAAA,kBAAO,QAAO;AAAA,kBAAe,SAAQ;AAAA,gBAAA;kBAC7DA,EAA4F,QAAA;AAAA,oBAAtF,kBAAe;AAAA,oBAAQ,mBAAgB;AAAA,oBAAQ,gBAAa;AAAA,oBAAI,GAAE;AAAA,kBAAA;;kBACpE,qBAER,EAAA;AAAA,cAAA;;;;;UAIF4J,EAAwBgB,EAAA;AAAA,QAAA;;;;;;;;;;sBCxC5BzK,EAAA,GAAAJ,EAwDM,OAxDNE,IAwDM;AAAA,sBAvDJD,EAGM,OAAA,EAHD,OAAM,sBAAkB;AAAA,QAC3BA,EAA2E,MAAA,EAAvE,OAAM,mCAAA,GAAmC,2BAAyB;AAAA,QACtEA,EAA8D,KAAA,EAA3D,OAAM,qBAAA,GAAqB,8BAA4B;AAAA,MAAA;MAG5DA,EAiDM,OAjDNE,IAiDM;AAAA;QAfJF,EAcM,OAdNI,IAcM;AAAA,0BAbJJ,EAKS,UAAA;AAAA,YAJP,MAAK;AAAA,YACL,OAAM;AAAA,UAAA,GACP,gBAED,EAAA;AAAA,UACAA,EAMS,UAAA;AAAA,YALP,MAAK;AAAA,YACL,OAAM;AAAA,YACL,gCAAOY,EAAAA,MAAK,MAAA;AAAA,UAAA,GACd,UAED;AAAA,QAAA;;;;ICnDF8M,IAAc3L,EAAiB,IAAI,GACnC4L,KAAiB5L,EAAoB,IAAI,GACzCb,IAAUa,EAAI,EAAK,GACnB6L,IAAY7L,EAAI,EAAK,GACrB8L,KAAgB9L,EAAI,EAAK;AAExB,SAAS+L,KAAiB;AAC/B,QAAMC,IAAkBvO,EAAS,MAAMkO,EAAY,UAAU,IAAI,GAEzDM,IAAS,OAAOC,MAAmC;AACzD,IAAAL,EAAU,QAAQ;AAClB,QAAI;AAKF,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E,UAAA;AACE,MAAAA,EAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAEMM,IAAS,OAAOC,MAAyB;AAC7C,IAAAP,EAAU,QAAQ;AAClB,QAAI;AAIF,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E,UAAA;AACE,MAAAA,EAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAEMQ,IAAU,YAAY;AAC1B,IAAAR,EAAU,QAAQ;AAClB,QAAI;AAIF,MAAAF,EAAY,QAAQ,MACpBC,GAAe,QAAQ;AAAA,IACzB,UAAA;AACE,MAAAC,EAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAEMS,IAAe,YAAY;AAC/B,IAAKV,GAAe,UAEpBzM,EAAQ,QAAQ,IAMdA,EAAQ,QAAQ;AAAA,EAEpB,GAEMoN,IAAgB,OAAOC,MAA+B;AAC1D,IAAArN,EAAQ,QAAQ;AAChB,QAAI;AAIF,MAAIwM,EAAY,SACd,OAAO,OAAOA,EAAY,OAAOa,CAAW;AAAA,IAEhD,UAAA;AACE,MAAArN,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,GAEMsN,IAAa,YAAY;AAC7B,QAAI,CAAAX,GAAc,OAElB;AAAA,MAAAD,EAAU,QAAQ;AAClB,UAAI;AAKF,QAAAC,GAAc,QAAQ;AAAA,MACxB,SAAS3K,GAAO;AACd,gBAAQ,MAAM,8BAA8BA,CAAK;AAAA,MACnD,UAAA;AACE,QAAA0K,EAAU,QAAQ;AAAA,MACpB;AAAA;AAAA,EACF;AAGA,SAAKC,GAAc,SACjBW,EAAA,GAGK;AAAA;AAAA,IAEL,MAAMhP,EAAS,MAAMkO,EAAY,KAAK;AAAA,IACtC,aAAalO,EAAS,MAAMkO,EAAY,KAAK;AAAA,IAC7C,gBAAgBlO,EAAS,MAAMmO,GAAe,KAAK;AAAA,IACnD,iBAAAI;AAAA,IACA,WAAWvO,EAAS,MAAMoO,EAAU,KAAK;AAAA,IACzC,SAASpO,EAAS,MAAM0B,EAAQ,KAAK;AAAA;AAAA,IAGrC,QAAA8M;AAAA,IACA,QAAAE;AAAA,IACA,SAAAE;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,YAAAE;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;AC1EA,UAAM9M,IAAOC,GAEP,EAAE,iBAAAoM,GAAiB,MAAAtC,GAAM,SAAA2C,EAAA,IAAYN,GAAA,GAErCE,IAAS,MAAM;AACnB,MAAAtM,EAAK,kBAAkB;AAAA,IACzB;qBA/CaoE,EAAAiI,CAAA,KAAX5N,KAAAJ,EAEM,OAFNE,IAEM;AAAA,MADJM,EAAwCC,EAAA,QAAA,WAAA;AAAA,QAAjC,MAAMsF,EAAA2F,CAAA;AAAA,QAAO,SAAS3F,EAAAsI,CAAA;AAAA,MAAA;UAEfK,EAAAA,gBAAhBtO,KAAAJ,EAmBM,OAnBNG,IAmBM;AAAA,MAlBJK,EAiBOC,EAAA,QAAA,YAAA,EAjBgB,QAAAwN,EAAA,GAAvB,MAiBO;AAAA,QAfLhO,EAcM,OAAA,EAdD,OAAM,sBAAkB;AAAA;UAQ3BA,EAKS,UAAA;AAAA,YAJN,SAAOgO;AAAA,YACR,OAAM;AAAA,UAAA,GACP,WAED;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;ACoCR,UAAMtM,IAAOC,GAEP,EAAE,iBAAAoM,GAAiB,WAAAH,GAAW,MAAAnC,GAAM,SAAA2C,EAAA,IAAYN,GAAA,GAEhDE,IAAS,MAAM;AACnB,MAAAtM,EAAK,iBAAiB;AAAA,IACxB,GAEMwM,IAAS,MAAM;AACnB,MAAAxM,EAAK,iBAAiB;AAAA,IACxB;qBAjEc,CAAAoE,EAAAiI,CAAA,MAAoBjI,EAAA8H,CAAA,KAAhCzN,EAAA,GAAAJ,EAEM,OAFNE,IAEM;AAAA,MADJM,EAA0CC,EAAA,QAAA,WAAA;AAAA,QAAnC,QAAAwN;AAAA,QAAiB,QAAAE;AAAA,MAAA;UAEVO,EAAAA,gBAAgB3I,EAAAiI,CAAA,KAAhC5N,KAAAJ,EAmBM,OAnBNG,IAmBM;AAAA,MAlBJK,EAiBOC,EAAA,QAAA,YAAA;AAAA,QAjBgB,MAAMsF,EAAA2F,CAAA;AAAA,QAAO,SAAS3F,EAAAsI,CAAA;AAAA,MAAA,GAA7C,MAiBO;AAAA,QAfLpO,EAcM,OAdNI,IAcM;AAAA,0BAbJJ,EAIM,OAAA,EAJD,OAAM,yFAAqF;AAAA,YAC9FA,EAEM,OAAA;AAAA,cAFD,OAAM;AAAA,cAA2B,MAAK;AAAA,cAAO,QAAO;AAAA,cAAe,SAAQ;AAAA,YAAA;cAC9EA,EAAgJ,QAAA;AAAA,gBAA1I,kBAAe;AAAA,gBAAQ,mBAAgB;AAAA,gBAAQ,gBAAa;AAAA,gBAAI,GAAE;AAAA,cAAA;;;UAG5EmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAnB,EAA8E,MAAA,EAA1E,OAAM,8CAAA,GAA8C,qBAAiB,EAAA;AAAA,UACzEA,EAAqF,KAArF4C,IAAiC,qCAAiCkD,EAAA2F,CAAA,GAAM,KAAK,IAAG,KAAC,CAAA;AAAA,UACjFzL,EAKS,UAAA;AAAA,YAJN,SAAKmB,EAAA,CAAA,MAAAA,EAAA,CAAA;AAAA,sBAAE2E,EAAAsI,CAAA,KAAAtI,EAAAsI,CAAA,EAAA,GAAAM,CAAA;AAAA,YACR,OAAM;AAAA,UAAA,GACP,YAED;AAAA,QAAA;;UAIU5I,EAAA8H,CAAA,KAAhBzN,EAAA,GAAAJ,EAaM,OAbNM,IAaM;AAAA,MAZJE,EAWOC,yBAXP,MAWO;AAAA;;;;;;;;;;2BCnCTT,EAsBM,OAAA;AAAA,MArBJ,SAAQ;AAAA,MACR,OAAM;AAAA,MACL,SAAO4O,EAAAA,KAAK;AAAA,MACb,MAAK;AAAA,MACL,cAAW;AAAA,IAAA;MAEX3O,EAQI,KAAA,MAAA;AAAA,QAPFA,EAMO,QAAA;AAAA,UALL,GAAE;AAAA,UACF,GAAE;AAAA,UACF,OAAA,EAAA,eAAA,mDAAA,eAAA,OAAA,aAAA,aAAA,MAAA,eAAA;AAAA,QAAA,GACD,UAED;AAAA,MAAA;MAEFA,EAKI,KAAA,MAAA;AAAA,QAJFA,EAGE,QAAA;AAAA,UAFA,GAAE;AAAA,UACF,OAAA,EAAA,MAAA,gBAAA,aAAA,UAAA;AAAA,QAAA;;;;;;;;;;ACRR,UAAMX,IAAQC;AAGd,WAAA+F,GAAU,MAAM;AACd,MAAAc,GAAqB9G,EAAM,MAAM;AAAA,IACnC,CAAC,GAGD8G,GAAqB9G,EAAM,MAAM,aAnB/BkB,EAAQC,EAAA,QAAA,SAAA;AAAA;;;;;;;;;;;;ACiBV,UAAMnB,IAAQC,GAQRwB,IAAc;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAGA8N,IAAYpP,EAAS,MAAM,GAAGsB,EAAYzB,EAAM,IAAI,CAAC,IAAIA,EAAM,KAAK,EAAE,GACtEwP,IAAUrP,EAAS,MAAM,WAAW,GAEpCsP,IAAQ;AAAA,MACZ,KAAO,MAAMC,EAAE,KAAK;AAAA,QAClBA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,aAAa,MAAMA,EAAE,KAAK;AAAA,QACxBA,EAAE,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,UAChB,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,QAAU,MAAMA,EAAE,QAAQ;AAAA,QACxB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,gBAAgB,MAAMA,EAAE,QAAQ;AAAA,QAC9B,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,SAAW,MAAMA,EAAE,KAAK;AAAA,QACtBA,EAAE,UAAU;AAAA,UACV,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,gBAAgB,MAAMA,EAAE,QAAQ;AAAA,QAC9B,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,MACD,YAAY,MAAMA,EAAE,QAAQ;AAAA,QAC1B,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,MACD,MAAQ,MAAMA,EAAE,QAAQ;AAAA,QACtB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,MAAQ,MAAMA,EAAE,QAAQ;AAAA,QACtB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,gBAAgB;AAAA,QAChB,GAAG;AAAA,MAAA,CACJ;AAAA,MACD,QAAU,MAAMA,EAAE,KAAK,EAAE,MAAM,kBAAkB;AAAA,QAC/CA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,QACDA,EAAE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA,CACF;AAAA,MACD,QAAU,MAAMA,EAAE,QAAQ;AAAA,QACxB,aAAa;AAAA,QACb,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,IAAA,GAGGC,IAAgBxP,EAAS,MAAM;AACnC,YAAMyP,IAAOH,EAAMzP,EAAM,IAA0B;AACnD,aAAO4P,IAAOA,MAASF,EAAE,QAAQ,EAAE,GAAG,IAAI;AAAA,IAC5C,CAAC;2BAxIChP,EAEM,OAAA;AAAA,MAFA,SAAO6O,EAAA,KAAS;AAAA,MAAG,MAAMM,EAAAA;AAAAA,MAAO,QAAQC,EAAAA;AAAAA,MAAS,SAASN,EAAA;AAAA,MAAU,eAAaO,EAAAA;AAAAA,IAAAA;OACrFjP,KAAAyD,EAAiCC,GAAjBmL,EAAA,KAAa,CAAA;AAAA,IAAA;;ICDpBK,KAAe,CAACvG,MACR,6BACD,KAAKA,CAAK,GAIjBwG,KAAmB,CAACvG,MAI5B;AACH,QAAMsC,IAAmB,CAAA;AACzB,MAAIkE,IAAQ;AAEZ,EAAIxG,EAAS,SAAS,IACpBsC,EAAO,KAAK,6CAA6C,IAEzDkE,KAAS,GAGN,QAAQ,KAAKxG,CAAQ,IAGxBwG,KAAS,IAFTlE,EAAO,KAAK,qDAAqD,GAK9D,QAAQ,KAAKtC,CAAQ,IAGxBwG,KAAS,IAFTlE,EAAO,KAAK,qDAAqD,GAK9D,KAAK,KAAKtC,CAAQ,IAGrBwG,KAAS,IAFTlE,EAAO,KAAK,2CAA2C,GAKpD,yBAAyB,KAAKtC,CAAQ,IAGzCwG,KAAS,IAFTlE,EAAO,KAAK,sDAAsD;AAKpE,QAAMmE,IAAUnE,EAAO,WAAW;AAClC,MAAIoE,IAAyC;AAE7C,SAAIF,KAAS,IACXE,IAAW,WACFF,KAAS,MAClBE,IAAW,WAGN,EAAE,SAAAD,GAAS,UAAAC,GAAU,QAAApE,EAAA;AAC9B,GAGaqE,KAAc,CAACC,MACnBA,EAAK,OAAO,UAAU,GAIlBC,KAAe,CAACC,MACR,yBACD,KAAKA,EAAM,QAAQ,eAAe,EAAE,CAAC,GAI5CC,KAAa,CAAC1L,MAClBA,EAAM,OAAO,SAAS,GAIlB2L,KAAiB,CAAChH,GAAkBiH,MACxCjH,MAAaiH,GAITxE,KAAc,CAACxC,GAAoBC,MAA8B;AAC5E,QAAMgH,IAAQjH,GAAW,OAAO,CAAC,EAAE,iBAAiB,IAC9CkH,IAAOjH,GAAU,OAAO,CAAC,EAAE,iBAAiB;AAClD,SAAOgH,IAAQC,KAAQ;AACzB,GAGaC,KAAa,CAACC,OACf,OAAOA,KAAS,WAAW,IAAI,KAAKA,CAAI,IAAIA,GAC7C,mBAAmB,SAAS;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,CACN,GAIUC,KAAW,CACtBC,GACAC,MACuC;AACvC,MAAIC;AACJ,SAAO,IAAI9B,MAAwB;AACjC,iBAAa8B,CAAO,GACpBA,IAAU,WAAW,MAAMF,EAAK,GAAG5B,CAAI,GAAG6B,CAAI;AAAA,EAChD;AACF;"}
|