修改文件夹位置 及 名称

This commit is contained in:
GGJ
2024-02-28 14:14:45 +08:00
parent 0d166eb582
commit cb78f1402e
23 changed files with 362 additions and 130 deletions

View File

@@ -24,3 +24,19 @@ export function queryEventsAssPage(data: any) {
data,
})
}
// 启动关联分析
export function processEvents(data: any) {
return createAxios({
url: '/advance-boot/process/processEvents',
method: 'get',
params:data,
})
}
// 暂降源定位
export function queryEventDetailByAssId(data: any) {
return createAxios({
url: '/advance-boot/process/queryEventDetailByAssId',
method: 'get',
params:data,
})
}

View File

@@ -6,7 +6,7 @@
import { ref, nextTick } from 'vue'
import Tree from './index.vue'
import { getTerminalTree } from '@/api/Business/index.ts'
import { getTerminalTree } from '@/api/device-boot/Business.ts'
import { useConfig } from '@/stores/config'
defineOptions({
name: 'govern/deviceTree'

View File

@@ -18,7 +18,6 @@
</template>
</TableHeader>
<Table ref="tableRef"></Table>
<el-dialog
:title="dialogTitle"
v-model="dialogFormVisible"
@@ -72,7 +71,7 @@
</template>
<script setup lang="ts">
import { ref, onMounted, provide, reactive, nextTick } from 'vue'
import { addNode, delNode, updateNode } from '@/api/Business'
import { addNode, delNode, updateNode } from '@/api/device-boot/Business.ts'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'

View File

@@ -216,7 +216,7 @@ import TableStore from '@/utils/tableStore'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import TableHeader from '@/components/table/header/index.vue'
import { mainHeight } from '@/utils/layout'
import { getTerminalUpLog } from '@/api/Business'
import { getTerminalUpLog } from '@/api/device-boot/Business.ts'
import XEUtils from 'xe-utils'
import { debounce } from 'lodash-es'
import { useDictData } from '@/stores/dictData'

View File

@@ -206,7 +206,7 @@ import TableStore from '@/utils/tableStore'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import TableHeader from '@/components/table/header/index.vue'
import { mainHeight } from '@/utils/layout'
import { getTerminalUpLog } from '@/api/Business'
import { getTerminalUpLog } from '@/api/device-boot/Business.ts'
import XEUtils from 'xe-utils'
import { debounce } from 'lodash-es'
import { useDictData } from '@/stores/dictData'

View File

@@ -1433,7 +1433,7 @@ import { LocationInformation } from '@element-plus/icons-vue'
import Terminal from '@/components/tree/pms/Terminal.vue'
import { mainHeight } from '@/utils/layout'
import { areaTree } from '@/api/system-boot/dicData'
import { queryTerminal, nodeAllList, delTerminal, updateTerminal, addTerminal } from '@/api/Business'
import { queryTerminal, nodeAllList, delTerminal, updateTerminal, addTerminal } from '@/api/device-boot/Business.ts'
import { useDictData } from '@/stores/dictData'
import { ref, reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'

View File

@@ -2,15 +2,11 @@
<div class="default-main">
<TableHeader area ref="header">
<template v-slot:select>
<!-- <el-form-item label="区域">
<Area ref="area" v-model="tableStore.table.params.deptIndex" />
</el-form-item> -->
<el-form-item label="统计类型">
<el-select
v-model="tableStore.table.params.statisticalType"
value-key="id"
placeholder="请选择统计类型"
size="large"
>
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item" />
</el-select>

View File

@@ -1,7 +1,7 @@
<template>
<div class="default-main">
<TableHeader date-picker area></TableHeader>
<el-tabs v-model="activeName" type="border-card" v-loading="tableStore.table.loading">
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick" v-loading="tableStore.table.loading">
<el-tab-pane label="图形" name="1">
<Echart ref="echarts" />
</el-tab-pane>
@@ -13,8 +13,8 @@
<script setup lang="ts">
import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData'
import Echart from './components/echart.vue'
import Tableabove from './components/Tableabove.vue'
import Echart from '../components/echart.vue'
import Tableabove from '../components/Tableabove.vue'
import TableStore from '@/utils/tableStore'
import { onMounted, reactive, ref, provide } from 'vue'
import { mainHeight } from '@/utils/layout'
@@ -32,11 +32,14 @@ const tableStore = new TableStore({
method: 'POST',
column: [],
loadCallback: () => {
table.value.info(tableStore.table.data,tableStore.table.params.searchBeginTime,tableStore.table.params.searchEndTime)
table.value.info(
tableStore.table.data,
tableStore.table.params.searchBeginTime,
tableStore.table.params.searchEndTime
)
echarts.value.Processing(tableStore.table.data.areaStatistics)
echarts.value.Grade(tableStore.table.data.voltageStatistics)
echarts.value.Relation(JSON.parse(JSON.stringify(tableStore.table.data.monthlyStatistics)))
}
})
provide('tableStore', tableStore)
@@ -48,6 +51,9 @@ tableStore.table.params.serverName = 'event-boot'
onMounted(() => {
tableStore.index()
})
const handleClick = () => {
tableStore.index()
}
const layout = mainHeight(123) as any
</script>

View File

@@ -20,8 +20,8 @@ import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData'
import TableStore from '@/utils/tableStore'
import { onMounted, reactive, ref, provide } from 'vue'
import TypeStatistics from './components/TypeStatistics.vue'
import Compatibility from './components/Compatibility.vue'
import TypeStatistics from '../components/TypeStatistics.vue'
import Compatibility from '../components/Compatibility.vue'
import { mainHeight } from '@/utils/layout'
defineOptions({
name: 'Region/overview'

View File

@@ -1,9 +1,14 @@
<template>
<div class="default-main">
<div v-show="view">
<TableHeader datePicker>
<template #select>
<el-form-item label="筛选">
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="输入关键字筛选" />
<el-input
v-model="tableStore.table.params.searchValue"
clearable
placeholder="输入关键字筛选"
/>
</el-form-item>
</template>
<template #operation>
@@ -30,6 +35,70 @@
</vxe-table>
</el-dialog>
</div>
<div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
<el-row>
<el-col :span="12">
<span v-if="view2" style="font-size: 14px; font-weight: ; line-height: 30px">值类型选择:</span>
<el-select
v-if="view2"
style="min-width: 200px; width: 200px"
@change="changeView"
v-model="value"
placeholder="请选择值类型"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-button
v-if="view2"
@click="backbxlb"
type="primary"
class="el-icon-refresh-right"
icon="el-icon-CloseBold"
style="float: right"
>
返回
</el-button>
</el-col>
</el-row>
<el-tabs v-if="view2" class="default-main" v-model="bxactiveName" @tab-click="bxhandleClick">
<el-tab-pane
label="瞬时波形"
name="ssbx"
class="boxbx pt10 pb10"
:style="'height:' + bxecharts + ';overflow-y: scroll;'"
>
<shushiboxi
v-if="bxactiveName == 'ssbx' && showBoxi"
:value="value"
:boxoList="boxoList"
:wp="wp"
></shushiboxi>
</el-tab-pane>
<el-tab-pane
label="RMS波形"
class="boxbx pt10 pb10"
name="rmsbx"
:style="'height:' + bxecharts + ';overflow-y: scroll;'"
>
<rmsboxi
v-if="bxactiveName == 'rmsbx' && showBoxi"
:value="value"
:boxoList="boxoList"
:wp="wp"
></rmsboxi>
</el-tab-pane>
</el-tabs>
<!-- <xiebofenxi ref="child" :bxshuju="bxshuju" @backfh="back"></xiebofenxi> -->
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide } from 'vue'
@@ -37,13 +106,23 @@ import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import TableHeader from '@/components/table/header/index.vue'
import { queryRelevantLogPage, delRelevantLog } from '@/api/advance-boot/analyse.ts'
import { queryRelevantLogPage, delRelevantLog, processEvents } from '@/api/advance-boot/analyse.ts'
import { ElMessage, ElMessageBox } from 'element-plus'
import { mainHeight } from '@/utils/layout'
import shushiboxi from '@/components/echarts/shushiboxi.vue'
import rmsboxi from '@/components/echarts/rmsboxi.vue'
import { getMonitorEventAnalyseWave } from '@/api/event-boot/transient.ts'
defineOptions({
name: 'govern/log/operation'
})
const dialogAnalysis = ref(false)
const AnalysisData = ref([])
const pageHeight = mainHeight(20)
const bxecharts = mainHeight(95).height as any
const loading = ref(false)
const view = ref(true)
const view2 = ref(false)
const showBoxi = ref(true)
const tableStore = new TableStore({
url: '/advance-boot/process/querySagEventsPage',
method: 'POST',
@@ -109,7 +188,22 @@ const tableStore = new TableStore({
},
icon: 'el-icon-Plus',
render: 'basicButton',
click: row => {}
click: async row => {
row.loading = true
boxoList.value = row
await getMonitorEventAnalyseWave({ id: row.eventId, systemType: 0 })
.then(res => {
row.loading = false
if (res != undefined) {
wp.value = res.data
view.value = false
view2.value = true
}
})
.catch(() => {
row.loading = false
})
}
},
{
name: 'edit',
@@ -133,6 +227,21 @@ const tableStore = new TableStore({
})
}
})
const bxactiveName = ref('ssbx')
const boxoList = ref({})
const wp = ref({})
const value = ref(1)
const options = ref([
{
value: 1,
label: '一次值'
},
{
value: 2,
label: '二次值'
}
])
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
@@ -145,7 +254,18 @@ const analysis = () => {
dialogAnalysis.value = true
}
// 启动关联分析
const firing = () => {}
const firing = () => {
processEvents({
startTime: tableStore.table.params.searchBeginTime,
endTime: tableStore.table.params.searchEndTime
}).then(res => {
ElMessage({
type: 'success',
message: res.message
})
tableStore.index()
})
}
// 删除策略
const details = (row: any) => {
delRelevantLog({ id: row.id }).then((res: any) => {
@@ -158,4 +278,30 @@ const details = (row: any) => {
})
})
}
const nodeClick = async (e: anyObj) => {
if (e.level == 2) {
loading.value = false
tableStore.table.params.deviceId = e.id
tableStore.index()
}
}
const changeView = () => {
showBoxi.value = false
setTimeout(() => {
showBoxi.value = true
}, 0)
}
const bxhandleClick = (tab: any) => {
if (tab.name == 'ssbx') {
bxactiveName.value = 'ssbx'
} else if (tab.name == 'rmsbx') {
bxactiveName.value = 'rmsbx'
}
// console.log(tab, event);
}
const backbxlb = () => {
view.value = true
view2.value = false
}
</script>

View File

@@ -11,23 +11,73 @@
</template>
</TableHeader>
<Table ref="tableRef" />
<!-- 分析记录管理 -->
<el-dialog v-model="dialogAnalysis" title="分析记录管理" width="60%">
<vxe-table height="500" auto-resize :data="AnalysisData" v-bind="defaultAttribute">
<vxe-column field="timeId" title="策略名称"></vxe-column>
<vxe-column field="timeId" title="操作时间"></vxe-column>
<vxe-column field="createName" title="操作人"></vxe-column>
<vxe-column title="操作" width="100">
<!-- 暂降源定位 -->
<el-dialog v-model="dialogAnalysis" title="暂降源定位" width="70%">
<div class="mb10" style="display: flex; justify-content: space-between">
<span>事件关联编号为{{ AssociationNumber }}</span>
<el-button icon="el-icon-Download" type="primary" @click="positioningexport">导出</el-button>
</div>
<vxe-table
height="500"
ref="positioningtableRef"
auto-resize
:data="AnalysisData"
v-bind="defaultAttribute"
>
<vxe-table-column title="序号" width="70" type="seq" align="center">
<template v-slot="row">
<span>{{ (form.pageNum - 1) * form.pageSize + row.rowIndex + 1 }}</span>
</template>
</vxe-table-column>
<vxe-table-column
field="startTime"
title="发生时间"
align="center"
:show-overflow="true"
></vxe-table-column>
<vxe-table-column field="gdName" title="供电公司" align="center"></vxe-table-column>
<vxe-table-column
field="subName"
:show-overflow="true"
title="变电站"
align="center"
></vxe-table-column>
<vxe-table-column field="lineName" title="监测点" align="center"></vxe-table-column>
<vxe-table-column field="voltageId" title="电压等级(kV)" align="center"></vxe-table-column>
<vxe-table-column field="featureAmplitude" title="暂降幅值(%)" align="center" width="140">
<template #default="{ row }">
<el-popconfirm title="是否确认删除策略!" @confirm="details(row)">
<template #reference>
<el-button type="danger" link>删除</el-button>
<span>{{ (row.featureAmplitude * 100).toFixed(2) }}</span>
</template>
</el-popconfirm>
</template>
</vxe-column>
</vxe-table-column>
<vxe-table-column field="duration" title="持续时间(s)" align="center" width="120"></vxe-table-column>
<vxe-table-column
field="advanceType"
title="暂降类型"
align="center"
width="120"
:formatter="formFilter"
></vxe-table-column>
<vxe-table-column
field="advanceReason"
title="暂降原因"
align="center"
width="120"
:formatter="formFilter"
></vxe-table-column>
</vxe-table>
<el-pagination
class="mt10"
:currentPage="form.pageNum"
:page-size="form.pageSize"
:page-sizes="[10, 20, 50, 100]"
background
:layout="'sizes,total, ->, prev, pager, next, jumper'"
:total="total"
@size-change="onTableSizeChange"
@current-change="onTableCurrentChange"
></el-pagination>
</el-dialog>
<!-- 暂降源定位 -->
</div>
</template>
<script setup lang="ts">
@@ -36,16 +86,27 @@ import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import TableHeader from '@/components/table/header/index.vue'
import { queryRelevantLogPage, delRelevantLog } from '@/api/advance-boot/analyse.ts'
import { ElMessage, ElMessageBox } from 'element-plus'
import { queryEventDetailByAssId } from '@/api/advance-boot/analyse.ts'
import { useDictData } from '@/stores/dictData'
import { queryEventsAssPage } from '@/api/advance-boot/analyse.ts'
defineOptions({
name: 'govern/log/operation'
})
const dialogAnalysis = ref(false)
const AnalysisData = ref([])
const AssociationNumber = ref()
const total = ref(0)
const tableRef = ref()
const TableHeaderRef = ref()
const dictData = useDictData()
const positioningtableRef = ref()
const reason = dictData.getBasicData('Event_Reason')
const type = dictData.getBasicData('Event_Type')
const form = ref({
pageSize: 20,
pageNum: 1,
id: ''
})
const tableStore = new TableStore({
url: '/advance-boot/process/queryEventsAssPage',
method: 'POST',
@@ -64,7 +125,6 @@ const tableStore = new TableStore({
field: 'contentDes',
title: '事件关联分析描述'
},
{
title: '操作',
width: '200',
@@ -74,10 +134,13 @@ const tableStore = new TableStore({
name: 'edit',
title: '暂降源定位',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: row => {}
click: row => {
AssociationNumber.value = row.timeId
form.value.id = row.eventAssId
source()
}
},
{
name: 'edit',
@@ -109,31 +172,56 @@ onMounted(() => {
{ label: '周', value: 4 }
])
})
//分析记录管理
const analysis = () => {
queryRelevantLogPage({}).then((res: any) => {
AnalysisData.value = res.data.records
})
dialogAnalysis.value = true
}
// 启动关联分析
const firing = () => {}
// 删除策略
const details = (row: any) => {
delRelevantLog({ id: row.id }).then((res: any) => {
ElMessage({
type: 'success',
message: res.message
})
queryRelevantLogPage({}).then((res: any) => {
// 暂降源定位
const source = () => {
queryEventDetailByAssId(form.value).then(res => {
AnalysisData.value = res.data.records
total.value = res.data.total
dialogAnalysis.value = true
})
}
// 分页
const onTableSizeChange = (val: number) => {
form.value.pageSize = val
source()
}
const onTableCurrentChange = (val: number) => {
form.value.pageNum = val
source()
}
// 数据过滤
const formFilter = (row: any) => {
if (row.column.property == 'advanceType') {
let title = ''
type.forEach(item => {
if (item.id == row.row.advanceType) {
title = item.name
} else if (row.row.advanceType == null || row.row.advanceType == '') {
title = '/'
}
})
return title
} else if (row.column.property == 'advanceReason') {
let title = ''
reason.forEach(item => {
if (item.id == row.row.advanceReason) {
title = item.name
} else if (row.row.advanceReason == null || row.row.advanceReason == '') {
title = '/'
}
})
return title
} else {
return row.row[row.column.property]
}
}
// 导出
const exportEvent = () => {
console.log('🚀 ~ exportEvent ~ tableRef.value:', tableRef.value)
queryEventsAssPage({
searchBeginTime: tableStore.table.params.searchBeginTime,
searchEndTime: tableStore.table.params.searchEndTime,
@@ -153,4 +241,24 @@ const exportEvent = () => {
})
})
}
// 导出暂降源定位
const positioningexport = () => {
positioningtableRef.value.exportData({
filename: '暂降源定位', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: dialogAnalysis.value, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0)
}
})
}
</script>
<style scoped lang="scss">
::v-deep .el-pagination__sizes {
.el-select {
min-width: 128px;
}
}
</style>

View File

@@ -19,5 +19,5 @@
},
"types": ["element-plus/global", "element-plus/lib/locale"]
},
"exclude": ["node_modules"]
"exclude": ["node_modules"],
}

View File

@@ -1,39 +0,0 @@
// vite.config.ts
import { defineConfig } from "file:///Users/zhongchunyang/Documents/canneng/admin-sjzx/node_modules/.pnpm/vite@5.0.10_@types+node@20.10.5_sass@1.69.5/node_modules/vite/dist/node/index.js";
import vue from "file:///Users/zhongchunyang/Documents/canneng/admin-sjzx/node_modules/.pnpm/@vitejs+plugin-vue@4.5.2_vite@5.0.10_vue@3.3.13/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import vueJsx from "file:///Users/zhongchunyang/Documents/canneng/admin-sjzx/node_modules/.pnpm/@vitejs+plugin-vue-jsx@3.1.0_vite@5.0.10_vue@3.3.13/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
import path from "path";
var __vite_injected_original_dirname = "/Users/zhongchunyang/Documents/canneng/admin-sjzx";
var nodeResolve = (dir) => path.resolve(__vite_injected_original_dirname, ".", dir);
var vite_config_default = defineConfig({
plugins: [vue(), vueJsx()],
server: {
host: "0.0.0.0",
proxy: {
"/api": {
target: "http://192.168.1.81:10215",
//数据中心
changeOrigin: true,
rewrite: (path2) => path2.replace(/^\/api/, "")
//路径重写,把'/api'替换为''
},
"/tilesApi": {
target: "http://192.168.1.81:10215",
//数据中心
changeOrigin: true,
rewrite: (path2) => path2.replace(/^\/tilesApi/, "")
//路径重写,把'/api'替换为''
}
}
},
resolve: {
alias: {
"@": nodeResolve("src"),
"~": nodeResolve("public")
}
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvemhvbmdjaHVueWFuZy9Eb2N1bWVudHMvY2FubmVuZy9hZG1pbi1zanp4XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvemhvbmdjaHVueWFuZy9Eb2N1bWVudHMvY2FubmVuZy9hZG1pbi1zanp4L3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy96aG9uZ2NodW55YW5nL0RvY3VtZW50cy9jYW5uZW5nL2FkbWluLXNqengvdml0ZS5jb25maWcudHNcIjtpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXG5pbXBvcnQgdnVlSnN4IGZyb20gJ0B2aXRlanMvcGx1Z2luLXZ1ZS1qc3gnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5jb25zdCBub2RlUmVzb2x2ZSA9IChkaXI6IHN0cmluZykgPT4gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4nLCBkaXIpXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgICBwbHVnaW5zOiBbdnVlKCksIHZ1ZUpzeCgpXSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogJzAuMC4wLjAnLFxuICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgJy9hcGknOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiAnaHR0cDovLzE5Mi4xNjguMS44MToxMDIxNScsIC8vXHU2NTcwXHU2MzZFXHU0RTJEXHU1RkMzXG4gICAgICAgICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJld3JpdGU6IHBhdGggPT4gcGF0aC5yZXBsYWNlKC9eXFwvYXBpLywgJycpIC8vXHU4REVGXHU1Rjg0XHU5MUNEXHU1MTk5XHVGRjBDXHU2MjhBJy9hcGknXHU2NkZGXHU2MzYyXHU0RTNBJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnL3RpbGVzQXBpJzoge1xuICAgICAgICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly8xOTIuMTY4LjEuODE6MTAyMTUnLCAvL1x1NjU3MFx1NjM2RVx1NEUyRFx1NUZDM1xuICAgICAgICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXdyaXRlOiBwYXRoID0+IHBhdGgucmVwbGFjZSgvXlxcL3RpbGVzQXBpLywgJycpIC8vXHU4REVGXHU1Rjg0XHU5MUNEXHU1MTk5XHVGRjBDXHU2MjhBJy9hcGknXHU2NkZGXHU2MzYyXHU0RTNBJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZToge1xuICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJ0AnOiBub2RlUmVzb2x2ZSgnc3JjJyksXG4gICAgICAgICAgICAnfic6IG5vZGVSZXNvbHZlKCdwdWJsaWMnKVxuICAgICAgICB9XG4gICAgfVxufSlcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBcVUsU0FBUyxvQkFBb0I7QUFDbFcsT0FBTyxTQUFTO0FBQ2hCLE9BQU8sWUFBWTtBQUNuQixPQUFPLFVBQVU7QUFIakIsSUFBTSxtQ0FBbUM7QUFLekMsSUFBTSxjQUFjLENBQUMsUUFBZ0IsS0FBSyxRQUFRLGtDQUFXLEtBQUssR0FBRztBQUVyRSxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUN4QixTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUFBLEVBQ3pCLFFBQVE7QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxNQUNILFFBQVE7QUFBQSxRQUNKLFFBQVE7QUFBQTtBQUFBLFFBQ1IsY0FBYztBQUFBLFFBQ2QsU0FBUyxDQUFBQSxVQUFRQSxNQUFLLFFBQVEsVUFBVSxFQUFFO0FBQUE7QUFBQSxNQUM5QztBQUFBLE1BQ0EsYUFBYTtBQUFBLFFBQ1QsUUFBUTtBQUFBO0FBQUEsUUFDUixjQUFjO0FBQUEsUUFDZCxTQUFTLENBQUFBLFVBQVFBLE1BQUssUUFBUSxlQUFlLEVBQUU7QUFBQTtBQUFBLE1BQ25EO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBLFNBQVM7QUFBQSxJQUNMLE9BQU87QUFBQSxNQUNILEtBQUssWUFBWSxLQUFLO0FBQUEsTUFDdEIsS0FBSyxZQUFZLFFBQVE7QUFBQSxJQUM3QjtBQUFBLEVBQ0o7QUFDSixDQUFDOyIsCiAgIm5hbWVzIjogWyJwYXRoIl0KfQo=