diff --git a/.cz-config.js b/.cz-config.js
index 729abbc..503d873 100644
--- a/.cz-config.js
+++ b/.cz-config.js
@@ -22,7 +22,7 @@ module.exports = {
{ value: '⚡️性能', name: '性能: 提升性能' },
{ value: '✅测试', name: '测试: 添加一个测试' },
{ value: '🔧工具', name: '工具: 开发工具变动(构建、脚手架工具等)' },
- { value: '⏪回滚', name: '回滚: 代码回退' },
+ { value: '⏪回滚', name: '回滚: 代码回退' }
],
// scope 类型(定义之后,可通过上下键选择)
@@ -36,11 +36,11 @@ module.exports = {
['auth', '对 auth 修改'],
['other', '其他修改'],
// 如果选择 custom,后面会让你再输入一个自定义的 scope。也可以不设置此项,把后面的 allowCustomScopes 设置为 true
- ['custom', '以上都不是?我要自定义'],
+ ['custom', '以上都不是?我要自定义']
].map(([value, description]) => {
return {
value,
- name: `${value.padEnd(30)} (${description})`,
+ name: `${value.padEnd(30)} (${description})`
}
}),
@@ -76,7 +76,7 @@ module.exports = {
'填写更加详细的变更描述(可选)。使用 "|" 换行:\n',
breaking: '列举非兼容性重大的变更(可选):\n',
footer: '列举出所有变更的 ISSUES CLOSED(可选)。 例如: #31, #34:\n',
- confirmCommit: '确认提交?',
+ confirmCommit: '确认提交?'
},
// 设置只有 type 选择了 feat 或 fix,才询问 breaking message
@@ -87,7 +87,7 @@ module.exports = {
// subject 限制长度
subjectLimit: 100,
- breaklineChar: '|', // 支持 body 和 footer
+ breaklineChar: '|' // 支持 body 和 footer
// footerPrefix : 'ISSUES CLOSED:'
// askForBreakingChangeFirst : true,
}
diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 11e5e4c..05fd05d 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -288,6 +288,18 @@
"watchThrottled": true,
"watchTriggerable": true,
"watchWithFilter": true,
- "whenever": true
+ "whenever": true,
+ "acceptHMRUpdate": true,
+ "createPinia": true,
+ "defineStore": true,
+ "getActivePinia": true,
+ "mapActions": true,
+ "mapGetters": true,
+ "mapState": true,
+ "mapStores": true,
+ "mapWritableState": true,
+ "setActivePinia": true,
+ "setMapStoreSuffix": true,
+ "storeToRefs": true
}
}
diff --git a/auto-import.d.ts b/auto-import.d.ts
index 610dfb1..db76c43 100644
--- a/auto-import.d.ts
+++ b/auto-import.d.ts
@@ -6,6 +6,7 @@
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
+ const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
const computed: typeof import('vue')['computed']
@@ -19,6 +20,7 @@ declare global {
const createEventHook: typeof import('@vueuse/core')['createEventHook']
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
+ const createPinia: typeof import('pinia')['createPinia']
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate']
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
@@ -29,9 +31,11 @@ declare global {
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
+ const defineStore: typeof import('pinia')['defineStore']
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
const effectScope: typeof import('vue')['effectScope']
const extendRef: typeof import('@vueuse/core')['extendRef']
+ const getActivePinia: typeof import('pinia')['getActivePinia']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
@@ -44,6 +48,11 @@ declare global {
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
+ const mapActions: typeof import('pinia')['mapActions']
+ const mapGetters: typeof import('pinia')['mapGetters']
+ const mapState: typeof import('pinia')['mapState']
+ const mapStores: typeof import('pinia')['mapStores']
+ const mapWritableState: typeof import('pinia')['mapWritableState']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
@@ -84,9 +93,12 @@ declare global {
const resolveComponent: typeof import('vue')['resolveComponent']
const resolveRef: typeof import('@vueuse/core')['resolveRef']
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
+ const setActivePinia: typeof import('pinia')['setActivePinia']
+ const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
+ const storeToRefs: typeof import('pinia')['storeToRefs']
const syncRef: typeof import('@vueuse/core')['syncRef']
const syncRefs: typeof import('@vueuse/core')['syncRefs']
const templateRef: typeof import('@vueuse/core')['templateRef']
diff --git a/components.d.ts b/components.d.ts
index f536da0..6e274ae 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -7,9 +7,13 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
+ AButton: typeof import('ant-design-vue/es')['Button']
ECharts: typeof import('./src/components/echarts/ECharts.vue')['default']
+ LoginPage: typeof import('./src/views/login/LoginPage.vue')['default']
+ Photo: typeof import('./src/components/photo/photo.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
SvgIcon: typeof import('./src/components/svgIcon/SvgIcon.vue')['default']
+ Tip: typeof import('./src/components/tip/tip.vue')['default']
}
}
diff --git a/src/views/login/LoginPage.vue b/src/views/login/LoginPage.vue
index 7d683af..f401d5f 100644
--- a/src/views/login/LoginPage.vue
+++ b/src/views/login/LoginPage.vue
@@ -14,6 +14,7 @@ export default defineComponent({
Login
测试页面,看到这个,那么项目就成功跑起来了
+ Loading
diff --git a/tsconfig.json b/tsconfig.json
index 7c8129d..03f1565 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -42,7 +42,9 @@
"src/**/*.tsx",
"src/**/*.d.ts",
"src/**/*.vue",
- "auto-import.d.ts"
+ "./auto-imports.d.ts",
+ "./components.d.ts",
+ "./.eslintrc-auto-import.json"
],
"references": [
{
diff --git a/vite.config.mts b/vite.config.mts
index 98e7e42..cd2188c 100644
--- a/vite.config.mts
+++ b/vite.config.mts
@@ -57,6 +57,17 @@ export default defineConfig(({ mode, command }) => {
},
plugins: [
vue(),
+ AutoImport({
+ //安装两行后你会发现在组件中不用再导入ref,reactive等
+ imports: ['vue', 'vue-router','@vueuse/core','pinia'],
+ dts: 'auto-import.d.ts',
+ //ant-design-vue
+ resolvers: [AntDesignVueResolver()],
+ eslintrc: {
+ enabled: true // 1、改为true用于生成eslint配置。2、生成后改回false,避免重复生成消耗
+
+ }
+ }),
createHtmlPlugin({
minify: true,
/**
@@ -123,22 +134,13 @@ export default defineConfig(({ mode, command }) => {
targets: ['chrome 52'], // 需要兼容的目标列表
additionalLegacyPolyfills: ['regenerator-runtime/runtime'] // 面向IE11时需要此插件
}),
- AutoImport({
- //安装两行后你会发现在组件中不用再导入ref,reactive等
- imports: ['vue', 'vue-router','@vueuse/core'],
- dts: 'auto-import.d.ts',
- //ant-design-vue
- resolvers: [AntDesignVueResolver()],
- eslintrc: {
- enabled: true // 1、改为true用于生成eslint配置。2、生成后改回false,避免重复生成消耗
- }
- }),
Components({
+ dts: true,
// 指定自动导入的组件位置,默认是 src/components
- dirs: ['src/components'],
+ dirs: ['src/components','src/views'],
//ant-design-vue
- resolvers: [AntDesignVueResolver({ importStyle: true, resolveIcons: true })]
+ resolvers: [AntDesignVueResolver({ importStyle: "less", resolveIcons: true })]
})
],
optimizeDeps: {
diff --git a/vite.config.mts.timestamp-1711172711463-e712dd6497908.mjs b/vite.config.mts.timestamp-1711172711463-e712dd6497908.mjs
deleted file mode 100644
index 1ce44f1..0000000
--- a/vite.config.mts.timestamp-1711172711463-e712dd6497908.mjs
+++ /dev/null
@@ -1,223 +0,0 @@
-// vite.config.mts
-import { defineConfig, loadEnv } from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/vite@5.2.2_@types+node@20.11.30_less@4.2.0_terser@5.29.2/node_modules/vite/dist/node/index.js";
-import vue from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/@vitejs+plugin-vue@5.0.4_vite@5.2.2_vue@3.4.21/node_modules/@vitejs/plugin-vue/dist/index.mjs";
-import * as path from "path";
-import legacy from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/@vitejs+plugin-legacy@5.3.2_terser@5.29.2_vite@5.2.2/node_modules/@vitejs/plugin-legacy/dist/index.mjs";
-import AutoImport from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/unplugin-auto-import@0.17.5_@vueuse+core@10.9.0/node_modules/unplugin-auto-import/dist/vite.js";
-import Components from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/unplugin-vue-components@0.26.0_vue@3.4.21/node_modules/unplugin-vue-components/dist/vite.js";
-import { AntDesignVueResolver } from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/unplugin-vue-components@0.26.0_vue@3.4.21/node_modules/unplugin-vue-components/dist/resolvers.js";
-import { createSvgIconsPlugin } from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.2.2/node_modules/vite-plugin-svg-icons/dist/index.mjs";
-import autoprefixer from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/autoprefixer@10.4.19_postcss@8.4.38/node_modules/autoprefixer/lib/autoprefixer.js";
-import viteCompression from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/vite-plugin-compression@0.5.1_vite@5.2.2/node_modules/vite-plugin-compression/dist/index.mjs";
-import imagemin from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/unplugin-imagemin@0.5.18/node_modules/unplugin-imagemin/dist/vite.mjs";
-import { createHtmlPlugin } from "file:///E:/vue-projects/schisandra-cloud-album-front/node_modules/.pnpm/vite-plugin-html@3.2.2_vite@5.2.2/node_modules/vite-plugin-html/dist/index.mjs";
-var __vite_injected_original_dirname = "E:\\vue-projects\\schisandra-cloud-album-front";
-var vite_config_default = defineConfig(({ mode, command }) => {
- const env = loadEnv(mode, process.cwd());
- return {
- resolve: {
- //设置别名
- alias: {
- "@": path.resolve(__vite_injected_original_dirname, "src")
- }
- },
- css: {
- // CSS 预处理器
- preprocessorOptions: {
- //define global less variable
- less: {
- javascriptEnabled: true,
- charset: false,
- //禁用字符集声明(charset 选项用于控制是否在生成的 CSS 文件的头部添加 @charset "UTF-8";)
- additionalData: '@import "./src/assets/styles/variables.less";'
- }
- },
- postcss: {
- plugins: [
- autoprefixer({
- overrideBrowserslist: ["Chrome > 40", "ff > 31", "ie 11"]
- })
- ]
- }
- },
- esbuild: {
- // configure this value when the browser version of the development environment is lower
- // minimum support es2015
- // https://esbuild.github.io/api/#target
- target: "es2015",
- include: /\.(ts|jsx|tsx)$/
- },
- plugins: [
- vue(),
- createHtmlPlugin({
- minify: true,
- /**
- * 在这里写entry后,你将不需要在`index.html`内添加 script 标签,原有标签需要删除
- * @default src/main.ts
- */
- entry: "src/main.ts",
- filename: "index.html",
- /**
- * 如果你想将 `index.html`存放在指定文件夹,可以修改它,否则不需要配置
- * @default index.html
- */
- template: "index.html",
- /**
- * 需要注入 index.html ejs 模版的数据
- */
- inject: {
- data: {
- title: env.VITE_TITLE_NAME
- }
- }
- }),
- imagemin({
- // Default mode sharp. support squoosh and sharp
- mode: "sharp",
- beforeBundle: true,
- // Default configuration options for compressing different pictures
- compress: {
- jpg: {
- quality: 10
- },
- jpeg: {
- quality: 10
- },
- png: {
- quality: 10
- },
- webp: {
- quality: 10
- }
- },
- conversion: [
- { from: "jpeg", to: "webp" },
- { from: "png", to: "webp" },
- { from: "JPG", to: "jpeg" }
- ]
- }),
- viteCompression({
- verbose: true,
- // 是否在控制台中输出压缩结果
- disable: false,
- threshold: 10240,
- // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反
- algorithm: "gzip",
- // 压缩算法,可选['gzip',' brotliccompress ','deflate ','deflateRaw']
- ext: ".gz",
- deleteOriginFile: true
- // 源文件压缩后是否删除
- }),
- // 修改 icons 相关配置
- createSvgIconsPlugin({
- // 指定需要缓存的图标文件夹
- iconDirs: [path.resolve(__vite_injected_original_dirname, "./src/assets/icons")]
- }),
- legacy({
- renderLegacyChunks: true,
- modernPolyfills: true,
- targets: ["chrome 52"],
- // 需要兼容的目标列表
- additionalLegacyPolyfills: ["regenerator-runtime/runtime"]
- // 面向IE11时需要此插件
- }),
- AutoImport({
- //安装两行后你会发现在组件中不用再导入ref,reactive等
- imports: ["vue", "vue-router", "@vueuse/core"],
- dts: "auto-import.d.ts",
- //ant-design-vue
- resolvers: [AntDesignVueResolver()],
- eslintrc: {
- enabled: true
- // 1、改为true用于生成eslint配置。2、生成后改回false,避免重复生成消耗
- }
- }),
- Components({
- // 指定自动导入的组件位置,默认是 src/components
- dirs: ["src/components"],
- //ant-design-vue
- resolvers: [AntDesignVueResolver({ importStyle: true, resolveIcons: true })]
- })
- ],
- optimizeDeps: {
- include: ["core-js"]
- },
- server: {
- proxy: {
- "/api": {
- //target是代理的目标路径
- target: env.VITE_API_BASE_URL,
- changeOrigin: true,
- //必须要开启跨域
- rewrite: (path2) => path2.replace(/\/api/, "")
- // 路径重写
- }
- }
- },
- build: {
- // target: ['es2015'], // 设置最终构建的浏览器兼容目标
- moduleResolution: "node",
- // 决定如何处理模块。
- outDir: "dist",
- // 指定输出路径
- assetsDir: "assets",
- // 指定生成静态文件目录
- assetsInlineLimit: "4096",
- // 小于此阈值的导入或引用资源将内联为 base64 编码
- cssCodeSplit: true,
- // 启用 CSS 代码拆分
- // cssTarget: '', // 允许用户为 CSS 的压缩设置一个不同的浏览器 target 与 build.target 一致
- sourcemap: false,
- // 构建后是否生成 source map 文件
- // lib: {}, // 构建为库
- manifest: false,
- // 当设置为 true,构建后将会生成 manifest.json 文件
- ssrManifest: false,
- // 构建不生成 SSR 的 manifest 文件
- ssr: void 0,
- // 生成面向 SSR 的构建
- minify: "terser",
- // 指定使用哪种混淆器
- // 传递给 Terser 的更多 minify 选项
- terserOptions: {
- compress: {
- drop_console: true,
- drop_debugger: true
- }
- },
- write: true,
- // 启用将构建后的文件写入磁盘
- emptyOutDir: true,
- // 构建时清空该目录
- brotliSize: true,
- // 启用 brotli 压缩大小报告
- chunkSizeWarningLimit: 2e3,
- // chunk 大小警告的限制
- watch: null,
- // 设置为 {} 则会启用 rollup 的监听器
- rollupOptions: {
- // 自定义底层的 Rollup 打包配置
- output: {
- chunkFileNames: "js/[name]-[hash].js",
- // 引入文件名的名称
- entryFileNames: "js/[name]-[hash].js",
- // 包的入口文件名称
- assetFileNames: "[ext]/[name]-[hash].[ext]"
- // 资源文件像 字体,图片等
- }
- }
- },
- output: {
- // 最小化拆分包
- manualChunks(id) {
- if (id.includes("node_modules")) {
- return id.toString().split("node_modules/")[1].split("/")[0].toString();
- }
- }
- }
- };
-});
-export {
- vite_config_default as default
-};
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcubXRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcdnVlLXByb2plY3RzXFxcXHNjaGlzYW5kcmEtY2xvdWQtYWxidW0tZnJvbnRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXHZ1ZS1wcm9qZWN0c1xcXFxzY2hpc2FuZHJhLWNsb3VkLWFsYnVtLWZyb250XFxcXHZpdGUuY29uZmlnLm10c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovdnVlLXByb2plY3RzL3NjaGlzYW5kcmEtY2xvdWQtYWxidW0tZnJvbnQvdml0ZS5jb25maWcubXRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnLCBsb2FkRW52IH0gZnJvbSAndml0ZSdcclxuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGxlZ2FjeSBmcm9tICdAdml0ZWpzL3BsdWdpbi1sZWdhY3knXHJcblxyXG4vLyBcdTgxRUFcdTUyQThcdTVCRkNcdTUxNjV2dWVcdTRFMkRob29rIHJlYWN0aXZlIHJlZlx1N0I0OVxyXG5pbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJ1xyXG4vL1x1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NXVpLVx1N0VDNFx1NEVGNiBcdTZCRDRcdTU5ODJcdThCRjRhbnQtZGVzaWduLXZ1ZSAgZWxlbWVudC1wbHVzXHU3QjQ5XHJcbmltcG9ydCBDb21wb25lbnRzIGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGUnXHJcbi8vYW50LWRlc2lnbi12dWVcclxuaW1wb3J0IHsgQW50RGVzaWduVnVlUmVzb2x2ZXIgfSBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy9yZXNvbHZlcnMnXHJcblxyXG4vLyBpY29ucyBwbHVnaW5cclxuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1zdmctaWNvbnMnXHJcblxyXG5pbXBvcnQgYXV0b3ByZWZpeGVyIGZyb20gJ2F1dG9wcmVmaXhlcidcclxuXHJcbmltcG9ydCB2aXRlQ29tcHJlc3Npb24gZnJvbSAndml0ZS1wbHVnaW4tY29tcHJlc3Npb24nXHJcbmltcG9ydCBpbWFnZW1pbiBmcm9tICd1bnBsdWdpbi1pbWFnZW1pbi92aXRlJ1xyXG5cclxuXHJcbmltcG9ydCB7IGNyZWF0ZUh0bWxQbHVnaW4gfSBmcm9tICd2aXRlLXBsdWdpbi1odG1sJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKCh7IG1vZGUsIGNvbW1hbmQgfSkgPT4ge1xyXG5cdGNvbnN0IGVudiA9IGxvYWRFbnYobW9kZSwgcHJvY2Vzcy5jd2QoKSlcclxuXHRyZXR1cm4ge1xyXG5cdFx0cmVzb2x2ZToge1xyXG5cdFx0XHQvL1x1OEJCRVx1N0Y2RVx1NTIyQlx1NTQwRFxyXG5cdFx0XHRhbGlhczoge1xyXG5cdFx0XHRcdCdAJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NyYycpXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRjc3M6IHtcclxuXHRcdFx0Ly8gQ1NTIFx1OTg4NFx1NTkwNFx1NzQwNlx1NTY2OFxyXG5cdFx0XHRwcmVwcm9jZXNzb3JPcHRpb25zOiB7XHJcblx0XHRcdFx0Ly9kZWZpbmUgZ2xvYmFsIGxlc3MgdmFyaWFibGVcclxuXHRcdFx0XHRsZXNzOiB7XHJcblx0XHRcdFx0XHRqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdGNoYXJzZXQ6IGZhbHNlLCAvL1x1Nzk4MVx1NzUyOFx1NUI1N1x1N0IyNlx1OTZDNlx1NThGMFx1NjYwRShjaGFyc2V0IFx1OTAwOVx1OTg3OVx1NzUyOFx1NEU4RVx1NjNBN1x1NTIzNlx1NjYyRlx1NTQyNlx1NTcyOFx1NzUxRlx1NjIxMFx1NzY4NCBDU1MgXHU2NTg3XHU0RUY2XHU3Njg0XHU1OTM0XHU5MEU4XHU2REZCXHU1MkEwIEBjaGFyc2V0IFwiVVRGLThcIjspXHJcblx0XHRcdFx0XHRhZGRpdGlvbmFsRGF0YTogJ0BpbXBvcnQgXCIuL3NyYy9hc3NldHMvc3R5bGVzL3ZhcmlhYmxlcy5sZXNzXCI7J1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0cG9zdGNzczoge1xyXG5cdFx0XHRcdHBsdWdpbnM6IFtcclxuXHRcdFx0XHRcdGF1dG9wcmVmaXhlcih7XHJcblx0XHRcdFx0XHRcdG92ZXJyaWRlQnJvd3NlcnNsaXN0OiBbJ0Nocm9tZSA+IDQwJywgJ2ZmID4gMzEnLCAnaWUgMTEnXVxyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRdXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRlc2J1aWxkOiB7XHJcblx0XHRcdC8vIGNvbmZpZ3VyZSB0aGlzIHZhbHVlIHdoZW4gdGhlIGJyb3dzZXIgdmVyc2lvbiBvZiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaXMgbG93ZXJcclxuXHRcdFx0Ly8gbWluaW11bSBzdXBwb3J0IGVzMjAxNVxyXG5cdFx0XHQvLyBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2FwaS8jdGFyZ2V0XHJcblx0XHRcdHRhcmdldDogJ2VzMjAxNScsXHJcblx0XHRcdGluY2x1ZGU6IC9cXC4odHN8anN4fHRzeCkkL1xyXG5cdFx0fSxcclxuXHRcdHBsdWdpbnM6IFtcclxuXHRcdFx0dnVlKCksXHJcblx0XHRcdGNyZWF0ZUh0bWxQbHVnaW4oe1xyXG5cdFx0XHRcdG1pbmlmeTogdHJ1ZSxcclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiBcdTU3MjhcdThGRDlcdTkxQ0NcdTUxOTllbnRyeVx1NTQwRVx1RkYwQ1x1NEY2MFx1NUMwNlx1NEUwRFx1OTcwMFx1ODk4MVx1NTcyOGBpbmRleC5odG1sYFx1NTE4NVx1NkRGQlx1NTJBMCBzY3JpcHQgXHU2ODA3XHU3QjdFXHVGRjBDXHU1MzlGXHU2NzA5XHU2ODA3XHU3QjdFXHU5NzAwXHU4OTgxXHU1MjIwXHU5NjY0XHJcblx0XHRcdFx0ICogQGRlZmF1bHQgc3JjL21haW4udHNcclxuXHRcdFx0XHQgKi9cclxuXHRcdFx0XHRlbnRyeTogJ3NyYy9tYWluLnRzJyxcclxuXHRcdFx0XHRmaWxlbmFtZTogJ2luZGV4Lmh0bWwnLFxyXG5cdFx0XHRcdC8qKlxyXG5cdFx0XHRcdCAqIFx1NTk4Mlx1Njc5Q1x1NEY2MFx1NjBGM1x1NUMwNiBgaW5kZXguaHRtbGBcdTVCNThcdTY1M0VcdTU3MjhcdTYzMDdcdTVCOUFcdTY1ODdcdTRFRjZcdTU5MzlcdUZGMENcdTUzRUZcdTRFRTVcdTRGRUVcdTY1MzlcdTVCODNcdUZGMENcdTU0MjZcdTUyMTlcdTRFMERcdTk3MDBcdTg5ODFcdTkxNERcdTdGNkVcclxuXHRcdFx0XHQgKiBAZGVmYXVsdCBpbmRleC5odG1sXHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0dGVtcGxhdGU6ICdpbmRleC5odG1sJyxcclxuXHRcdFx0XHQvKipcclxuXHRcdFx0XHQgKiBcdTk3MDBcdTg5ODFcdTZDRThcdTUxNjUgaW5kZXguaHRtbCBlanMgXHU2QTIxXHU3MjQ4XHU3Njg0XHU2NTcwXHU2MzZFXHJcblx0XHRcdFx0ICovXHJcblx0XHRcdFx0aW5qZWN0OiB7XHJcblx0XHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRcdHRpdGxlOiBlbnYuVklURV9USVRMRV9OQU1FLFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSksXHJcblx0XHRcdGltYWdlbWluKHtcclxuXHRcdFx0XHQvLyBEZWZhdWx0IG1vZGUgc2hhcnAuIHN1cHBvcnQgc3F1b29zaCBhbmQgc2hhcnBcclxuXHRcdFx0XHRtb2RlOiAnc2hhcnAnLFxyXG5cdFx0XHRcdGJlZm9yZUJ1bmRsZTogdHJ1ZSxcclxuXHRcdFx0XHQvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY29tcHJlc3NpbmcgZGlmZmVyZW50IHBpY3R1cmVzXHJcblx0XHRcdFx0Y29tcHJlc3M6IHtcclxuXHRcdFx0XHRcdGpwZzoge1xyXG5cdFx0XHRcdFx0XHRxdWFsaXR5OiAxMFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdGpwZWc6IHtcclxuXHRcdFx0XHRcdFx0cXVhbGl0eTogMTBcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRwbmc6IHtcclxuXHRcdFx0XHRcdFx0cXVhbGl0eTogMTBcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHR3ZWJwOiB7XHJcblx0XHRcdFx0XHRcdHF1YWxpdHk6IDEwXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRjb252ZXJzaW9uOiBbXHJcblx0XHRcdFx0XHR7IGZyb206ICdqcGVnJywgdG86ICd3ZWJwJyB9LFxyXG5cdFx0XHRcdFx0eyBmcm9tOiAncG5nJywgdG86ICd3ZWJwJyB9LFxyXG5cdFx0XHRcdFx0eyBmcm9tOiAnSlBHJywgdG86ICdqcGVnJyB9XHJcblx0XHRcdFx0XVxyXG5cdFx0XHR9KSxcclxuXHRcdFx0dml0ZUNvbXByZXNzaW9uKHtcclxuXHRcdFx0XHR2ZXJib3NlOiB0cnVlLCAvLyBcdTY2MkZcdTU0MjZcdTU3MjhcdTYzQTdcdTUyMzZcdTUzRjBcdTRFMkRcdThGOTNcdTUxRkFcdTUzOEJcdTdGMjlcdTdFRDNcdTY3OUNcclxuXHRcdFx0XHRkaXNhYmxlOiBmYWxzZSxcclxuXHRcdFx0XHR0aHJlc2hvbGQ6IDEwMjQwLCAvLyBcdTU5ODJcdTY3OUNcdTRGNTNcdTc5RUZcdTU5MjdcdTRFOEVcdTk2MDhcdTUwM0NcdUZGMENcdTVDMDZcdTg4QUJcdTUzOEJcdTdGMjlcdUZGMENcdTUzNTVcdTRGNERcdTRFM0FiXHVGRjBDXHU0RjUzXHU3OUVGXHU4RkM3XHU1QzBGXHU2NUY2XHU4QkY3XHU0RTBEXHU4OTgxXHU1MzhCXHU3RjI5XHVGRjBDXHU0RUU1XHU1MTREXHU5MDAyXHU1Rjk3XHU1MTc2XHU1M0NEXHJcblx0XHRcdFx0YWxnb3JpdGhtOiAnZ3ppcCcsIC8vIFx1NTM4Qlx1N0YyOVx1N0I5N1x1NkNENVx1RkYwQ1x1NTNFRlx1OTAwOVsnZ3ppcCdcdUZGMEMnIGJyb3RsaWNjb21wcmVzcyAnXHVGRjBDJ2RlZmxhdGUgJ1x1RkYwQydkZWZsYXRlUmF3J11cclxuXHRcdFx0XHRleHQ6ICcuZ3onLFxyXG5cdFx0XHRcdGRlbGV0ZU9yaWdpbkZpbGU6IHRydWUgLy8gXHU2RTkwXHU2NTg3XHU0RUY2XHU1MzhCXHU3RjI5XHU1NDBFXHU2NjJGXHU1NDI2XHU1MjIwXHU5NjY0XHJcblx0XHRcdH0pLFxyXG5cdFx0XHQvLyBcdTRGRUVcdTY1MzkgaWNvbnMgXHU3NkY4XHU1MTczXHU5MTREXHU3RjZFXHJcblx0XHRcdGNyZWF0ZVN2Z0ljb25zUGx1Z2luKHtcclxuXHRcdFx0XHQvLyBcdTYzMDdcdTVCOUFcdTk3MDBcdTg5ODFcdTdGMTNcdTVCNThcdTc2ODRcdTU2RkVcdTY4MDdcdTY1ODdcdTRFRjZcdTU5MzlcclxuXHRcdFx0XHRpY29uRGlyczogW3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3NyYy9hc3NldHMvaWNvbnMnKV1cclxuXHRcdFx0fSksXHJcblx0XHRcdGxlZ2FjeSh7XHJcblx0XHRcdFx0cmVuZGVyTGVnYWN5Q2h1bmtzOiB0cnVlLFxyXG5cdFx0XHRcdG1vZGVyblBvbHlmaWxsczogdHJ1ZSxcclxuXHRcdFx0XHR0YXJnZXRzOiBbJ2Nocm9tZSA1MiddLCAvLyBcdTk3MDBcdTg5ODFcdTUxN0NcdTVCQjlcdTc2ODRcdTc2RUVcdTY4MDdcdTUyMTdcdTg4NjhcclxuXHRcdFx0XHRhZGRpdGlvbmFsTGVnYWN5UG9seWZpbGxzOiBbJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSddIC8vIFx1OTc2Mlx1NTQxMUlFMTFcdTY1RjZcdTk3MDBcdTg5ODFcdTZCNjRcdTYzRDJcdTRFRjZcclxuXHRcdFx0fSksXHJcblx0XHRcdEF1dG9JbXBvcnQoe1xyXG5cdFx0XHRcdC8vXHU1Qjg5XHU4OEM1XHU0RTI0XHU4ODRDXHU1NDBFXHU0RjYwXHU0RjFBXHU1M0QxXHU3M0IwXHU1NzI4XHU3RUM0XHU0RUY2XHU0RTJEXHU0RTBEXHU3NTI4XHU1MThEXHU1QkZDXHU1MTY1cmVmXHVGRjBDcmVhY3RpdmVcdTdCNDlcclxuXHRcdFx0XHRpbXBvcnRzOiBbJ3Z1ZScsICd2dWUtcm91dGVyJywnQHZ1ZXVzZS9jb3JlJ10sXHJcblx0XHRcdFx0ZHRzOiAnYXV0by1pbXBvcnQuZC50cycsXHJcblx0XHRcdFx0Ly9hbnQtZGVzaWduLXZ1ZVxyXG5cdFx0XHRcdHJlc29sdmVyczogW0FudERlc2lnblZ1ZVJlc29sdmVyKCldLFxyXG5cdFx0XHRcdGVzbGludHJjOiB7XHJcblx0XHRcdFx0XHRlbmFibGVkOiB0cnVlIC8vIDFcdTMwMDFcdTY1MzlcdTRFM0F0cnVlXHU3NTI4XHU0RThFXHU3NTFGXHU2MjEwZXNsaW50XHU5MTREXHU3RjZFXHUzMDAyMlx1MzAwMVx1NzUxRlx1NjIxMFx1NTQwRVx1NjUzOVx1NTZERWZhbHNlXHVGRjBDXHU5MDdGXHU1MTREXHU5MUNEXHU1OTBEXHU3NTFGXHU2MjEwXHU2RDg4XHU4MDE3XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSksXHJcblx0XHRcdENvbXBvbmVudHMoe1xyXG5cdFx0XHRcdC8vIFx1NjMwN1x1NUI5QVx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NVx1NzY4NFx1N0VDNFx1NEVGNlx1NEY0RFx1N0Y2RVx1RkYwQ1x1OUVEOFx1OEJBNFx1NjYyRiBzcmMvY29tcG9uZW50c1xyXG5cdFx0XHRcdGRpcnM6IFsnc3JjL2NvbXBvbmVudHMnXSxcclxuXHRcdFx0XHQvL2FudC1kZXNpZ24tdnVlXHJcblx0XHRcdFx0cmVzb2x2ZXJzOiBbQW50RGVzaWduVnVlUmVzb2x2ZXIoeyBpbXBvcnRTdHlsZTogdHJ1ZSwgcmVzb2x2ZUljb25zOiB0cnVlIH0pXVxyXG5cdFx0XHR9KVxyXG5cdFx0XSxcclxuXHRcdG9wdGltaXplRGVwczoge1xyXG5cdFx0XHRpbmNsdWRlOiBbJ2NvcmUtanMnXVxyXG5cdFx0fSxcclxuXHRcdHNlcnZlcjoge1xyXG5cdFx0XHRwcm94eToge1xyXG5cdFx0XHRcdCcvYXBpJzoge1xyXG5cdFx0XHRcdFx0Ly90YXJnZXRcdTY2MkZcdTRFRTNcdTc0MDZcdTc2ODRcdTc2RUVcdTY4MDdcdThERUZcdTVGODRcclxuXHRcdFx0XHRcdHRhcmdldDogZW52LlZJVEVfQVBJX0JBU0VfVVJMLFxyXG5cdFx0XHRcdFx0Y2hhbmdlT3JpZ2luOiB0cnVlLCAvL1x1NUZDNVx1OTg3Qlx1ODk4MVx1NUYwMFx1NTQyRlx1OERFOFx1NTdERlxyXG5cdFx0XHRcdFx0cmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZSgvXFwvYXBpLywgJycpIC8vIFx1OERFRlx1NUY4NFx1OTFDRFx1NTE5OVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGJ1aWxkOiB7XHJcblx0XHRcdC8vIHRhcmdldDogWydlczIwMTUnXSwgLy8gXHU4QkJFXHU3RjZFXHU2NzAwXHU3RUM4XHU2Nzg0XHU1RUZBXHU3Njg0XHU2RDRGXHU4OUM4XHU1NjY4XHU1MTdDXHU1QkI5XHU3NkVFXHU2ODA3XHJcblx0XHRcdG1vZHVsZVJlc29sdXRpb246ICdub2RlJywgLy8gXHU1MUIzXHU1QjlBXHU1OTgyXHU0RjU1XHU1OTA0XHU3NDA2XHU2QTIxXHU1NzU3XHUzMDAyXHJcblx0XHRcdG91dERpcjogJ2Rpc3QnLCAvLyBcdTYzMDdcdTVCOUFcdThGOTNcdTUxRkFcdThERUZcdTVGODRcclxuXHRcdFx0YXNzZXRzRGlyOiAnYXNzZXRzJywgLy8gXHU2MzA3XHU1QjlBXHU3NTFGXHU2MjEwXHU5NzU5XHU2MDAxXHU2NTg3XHU0RUY2XHU3NkVFXHU1RjU1XHJcblx0XHRcdGFzc2V0c0lubGluZUxpbWl0OiAnNDA5NicsIC8vIFx1NUMwRlx1NEU4RVx1NkI2NFx1OTYwOFx1NTAzQ1x1NzY4NFx1NUJGQ1x1NTE2NVx1NjIxNlx1NUYxNVx1NzUyOFx1OEQ0NFx1NkU5MFx1NUMwNlx1NTE4NVx1ODA1NFx1NEUzQSBiYXNlNjQgXHU3RjE2XHU3ODAxXHJcblx0XHRcdGNzc0NvZGVTcGxpdDogdHJ1ZSwgLy8gXHU1NDJGXHU3NTI4IENTUyBcdTRFRTNcdTc4MDFcdTYyQzZcdTUyMDZcclxuXHRcdFx0Ly8gY3NzVGFyZ2V0OiAnJywgLy8gXHU1MTQxXHU4QkI4XHU3NTI4XHU2MjM3XHU0RTNBIENTUyBcdTc2ODRcdTUzOEJcdTdGMjlcdThCQkVcdTdGNkVcdTRFMDBcdTRFMkFcdTRFMERcdTU0MENcdTc2ODRcdTZENEZcdTg5QzhcdTU2NjggdGFyZ2V0IFx1NEUwRSBidWlsZC50YXJnZXQgXHU0RTAwXHU4MUY0XHJcblx0XHRcdHNvdXJjZW1hcDogZmFsc2UsIC8vIFx1Njc4NFx1NUVGQVx1NTQwRVx1NjYyRlx1NTQyNlx1NzUxRlx1NjIxMCBzb3VyY2UgbWFwIFx1NjU4N1x1NEVGNlxyXG5cclxuXHRcdFx0Ly8gbGliOiB7fSwgLy8gXHU2Nzg0XHU1RUZBXHU0RTNBXHU1RTkzXHJcblx0XHRcdG1hbmlmZXN0OiBmYWxzZSwgLy8gXHU1RjUzXHU4QkJFXHU3RjZFXHU0RTNBIHRydWVcdUZGMENcdTY3ODRcdTVFRkFcdTU0MEVcdTVDMDZcdTRGMUFcdTc1MUZcdTYyMTAgbWFuaWZlc3QuanNvbiBcdTY1ODdcdTRFRjZcclxuXHRcdFx0c3NyTWFuaWZlc3Q6IGZhbHNlLCAvLyBcdTY3ODRcdTVFRkFcdTRFMERcdTc1MUZcdTYyMTAgU1NSIFx1NzY4NCBtYW5pZmVzdCBcdTY1ODdcdTRFRjZcclxuXHRcdFx0c3NyOiB1bmRlZmluZWQsIC8vIFx1NzUxRlx1NjIxMFx1OTc2Mlx1NTQxMSBTU1IgXHU3Njg0XHU2Nzg0XHU1RUZBXHJcblx0XHRcdG1pbmlmeTogJ3RlcnNlcicsIC8vIFx1NjMwN1x1NUI5QVx1NEY3Rlx1NzUyOFx1NTRFQVx1NzlDRFx1NkRGN1x1NkRDNlx1NTY2OFxyXG5cdFx0XHQvLyBcdTRGMjBcdTkwMTJcdTdFRDkgVGVyc2VyIFx1NzY4NFx1NjZGNFx1NTkxQSBtaW5pZnkgXHU5MDA5XHU5ODc5XHJcblx0XHRcdHRlcnNlck9wdGlvbnM6IHtcclxuXHRcdFx0XHRjb21wcmVzczoge1xyXG5cdFx0XHRcdFx0ZHJvcF9jb25zb2xlOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZHJvcF9kZWJ1Z2dlcjogdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0d3JpdGU6IHRydWUsIC8vIFx1NTQyRlx1NzUyOFx1NUMwNlx1Njc4NFx1NUVGQVx1NTQwRVx1NzY4NFx1NjU4N1x1NEVGNlx1NTE5OVx1NTE2NVx1NzhDMVx1NzZEOFxyXG5cdFx0XHRlbXB0eU91dERpcjogdHJ1ZSwgLy8gXHU2Nzg0XHU1RUZBXHU2NUY2XHU2RTA1XHU3QTdBXHU4QkU1XHU3NkVFXHU1RjU1XHJcblx0XHRcdGJyb3RsaVNpemU6IHRydWUsIC8vIFx1NTQyRlx1NzUyOCBicm90bGkgXHU1MzhCXHU3RjI5XHU1OTI3XHU1QzBGXHU2MkE1XHU1NDRBXHJcblx0XHRcdGNodW5rU2l6ZVdhcm5pbmdMaW1pdDogMjAwMCwgLy8gY2h1bmsgXHU1OTI3XHU1QzBGXHU4QjY2XHU1NDRBXHU3Njg0XHU5NjUwXHU1MjM2XHJcblx0XHRcdHdhdGNoOiBudWxsLCAvLyBcdThCQkVcdTdGNkVcdTRFM0Ege30gXHU1MjE5XHU0RjFBXHU1NDJGXHU3NTI4IHJvbGx1cCBcdTc2ODRcdTc2RDFcdTU0MkNcdTU2NjhcclxuXHRcdFx0cm9sbHVwT3B0aW9uczogeyAgLy8gXHU4MUVBXHU1QjlBXHU0RTQ5XHU1RTk1XHU1QzQyXHU3Njg0IFJvbGx1cCBcdTYyNTNcdTUzMDVcdTkxNERcdTdGNkVcclxuXHRcdFx0XHRvdXRwdXQ6IHtcclxuXHRcdFx0XHRcdGNodW5rRmlsZU5hbWVzOiAnanMvW25hbWVdLVtoYXNoXS5qcycsIC8vIFx1NUYxNVx1NTE2NVx1NjU4N1x1NEVGNlx1NTQwRFx1NzY4NFx1NTQwRFx1NzlGMFxyXG5cdFx0XHRcdFx0ZW50cnlGaWxlTmFtZXM6ICdqcy9bbmFtZV0tW2hhc2hdLmpzJywgLy8gXHU1MzA1XHU3Njg0XHU1MTY1XHU1M0UzXHU2NTg3XHU0RUY2XHU1NDBEXHU3OUYwXHJcblx0XHRcdFx0XHRhc3NldEZpbGVOYW1lczogJ1tleHRdL1tuYW1lXS1baGFzaF0uW2V4dF0nIC8vIFx1OEQ0NFx1NkU5MFx1NjU4N1x1NEVGNlx1NTBDRiBcdTVCNTdcdTRGNTNcdUZGMENcdTU2RkVcdTcyNDdcdTdCNDlcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRvdXRwdXQ6IHtcclxuXHRcdFx0Ly8gXHU2NzAwXHU1QzBGXHU1MzE2XHU2MkM2XHU1MjA2XHU1MzA1XHJcblx0XHRcdG1hbnVhbENodW5rcyhpZCkge1xyXG5cdFx0XHRcdGlmIChpZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcclxuXHRcdFx0XHRcdHJldHVybiBpZC50b1N0cmluZygpLnNwbGl0KCdub2RlX21vZHVsZXMvJylbMV0uc3BsaXQoJy8nKVswXS50b1N0cmluZygpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KVxyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQThULFNBQVMsY0FBYyxlQUFlO0FBQ3BXLE9BQU8sU0FBUztBQUNoQixZQUFZLFVBQVU7QUFDdEIsT0FBTyxZQUFZO0FBR25CLE9BQU8sZ0JBQWdCO0FBRXZCLE9BQU8sZ0JBQWdCO0FBRXZCLFNBQVMsNEJBQTRCO0FBR3JDLFNBQVMsNEJBQTRCO0FBRXJDLE9BQU8sa0JBQWtCO0FBRXpCLE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sY0FBYztBQUdyQixTQUFTLHdCQUF3QjtBQXJCakMsSUFBTSxtQ0FBbUM7QUF1QnpDLElBQU8sc0JBQVEsYUFBYSxDQUFDLEVBQUUsTUFBTSxRQUFRLE1BQU07QUFDbEQsUUFBTSxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksQ0FBQztBQUN2QyxTQUFPO0FBQUEsSUFDTixTQUFTO0FBQUE7QUFBQSxNQUVSLE9BQU87QUFB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