Merge branch 'test' of https://git.code.tencent.com/lian-cbtc/jl-client into test
@ -3,7 +3,7 @@ export default {
|
||||
|
||||
designhomePage: '公共地图',
|
||||
designUserPage: '个人地图',
|
||||
newDesignUserPage: '新版地图',
|
||||
newDesignUserPage: '地图绘制',
|
||||
|
||||
mapManage: '地图管理',
|
||||
skinManage: '皮肤管理',
|
||||
|
@ -902,7 +902,7 @@ export function SectionList() {
|
||||
|
||||
// console.log(sectiondata[i]);
|
||||
// console.log(testmesh2);
|
||||
console.log(newsection);
|
||||
// console.log(newsection);
|
||||
testmesh2.geometry = newrail;
|
||||
testmesh2.geometry.attributes.position.needsUpdate = true;
|
||||
testmesh2.geometry.attributes.uv.needsUpdate = true;
|
||||
|
@ -181,6 +181,7 @@ export function StationStandList() {
|
||||
if(jlmapstanddata[j].inside == true){
|
||||
newstationmesh = assetloader.modellist[num].mesh.clone(true);
|
||||
}else{
|
||||
console.log(jlmapstanddata[j]);
|
||||
newstationmesh = assetloader.modellist[num2].mesh.clone(true);
|
||||
}
|
||||
// console.log(jlmapstanddata[j]);
|
||||
@ -190,7 +191,6 @@ export function StationStandList() {
|
||||
newstationstand.direction1.name = standsdata[i].direction1.name;
|
||||
newstationstand.direction2.code = standsdata[i].direction2.code;
|
||||
newstationstand.direction2.name = standsdata[i].direction2.name;
|
||||
console.log(standsdata[i]);
|
||||
// console.log(standsdata[i]);
|
||||
newstationmesh.position.x = standsdata[i].position.x;
|
||||
newstationmesh.position.y = standsdata[i].position.y;
|
||||
|
@ -1,13 +1,13 @@
|
||||
export function Signallightload(lights) {
|
||||
|
||||
|
||||
settexture(lights, "red", 'https://test.joylink.club/oss/wx/signal/1.jpg');
|
||||
settexture(lights, "red", '../../static/model/device/signal/1.jpg');
|
||||
|
||||
settexture(lights, "yellow", 'https://test.joylink.club/oss/wx/signal/2.jpg');
|
||||
settexture(lights, "yellow", '../../static/model/device/signal/2.jpg');
|
||||
|
||||
settexture(lights, "green", 'https://test.joylink.club/oss/wx/signal/3.jpg');
|
||||
settexture(lights, "green", '../../static/model/device/signal/3.jpg');
|
||||
|
||||
settexture(lights, "black", 'https://test.joylink.club/oss/wx/signal/4.jpg');
|
||||
settexture(lights, "black", '../../static/model/device/signal/4.jpg');
|
||||
}
|
||||
|
||||
function settexture(lights, name, textureurl) {
|
||||
|
@ -5,7 +5,7 @@ var Staticmodel = {
|
||||
deviceType: "Switch",
|
||||
type: "fuzhou",
|
||||
picUrl: "",
|
||||
assetUrl: "https://joylink.club/oss/wx/switch/switch.FBX"
|
||||
assetUrl: "./../static/model/device/switch/switch.FBX"
|
||||
},//"https://joylink.club/oss/wx/switch/switch.FBX"
|
||||
//../../static/model/device/switch.FBX
|
||||
Signal: {
|
||||
@ -14,7 +14,7 @@ var Staticmodel = {
|
||||
deviceType: "Signal",
|
||||
type: "low",
|
||||
picUrl: "",
|
||||
assetUrl: "https://joylink.club/oss/wx/signal/signal.FBX"
|
||||
assetUrl: "../../static/model/device/signal/signal.FBX"
|
||||
},
|
||||
stationstand: {
|
||||
id: "3",
|
||||
@ -22,7 +22,7 @@ var Staticmodel = {
|
||||
deviceType: "stationstand",
|
||||
type: "low",
|
||||
picUrl: "",
|
||||
assetUrl: "../../static/model/device/stationstand.FBX"
|
||||
assetUrl: "../../static/model/device/stationstand/stationstand.FBX"
|
||||
//https://joylink.club/oss/wx/stationstand/stationstand.FBX
|
||||
//../../static/model/device/stationstand.FBX
|
||||
|
||||
|
@ -178,6 +178,7 @@ export function Jl3ddeviceNew(dom,group,token) {
|
||||
} else if (data.normalPosition == "1") {
|
||||
scope.modelmanager.switchmodel.normalPosition = "1";
|
||||
scope.modelmanager.switchmodel.action.reset();
|
||||
|
||||
scope.modelmanager.switchmodel.action.time = scope.modelmanager.switchmodel.action._clip.duration;
|
||||
scope.modelmanager.switchmodel.action.timeScale = 1;
|
||||
scope.modelmanager.switchmodel.action.play();
|
||||
@ -201,20 +202,19 @@ export function Jl3ddeviceNew(dom,group,token) {
|
||||
}
|
||||
|
||||
this.updateaction = function (data) {
|
||||
|
||||
if (data.type == "SWITCH") {
|
||||
if (data.normal == "0") {
|
||||
scope.modelmanager.switchmodel.normalPosition = "0";
|
||||
scope.modelmanager.switchmodel.action.reset();
|
||||
scope.modelmanager.switchmodel.action.time = 0;
|
||||
scope.modelmanager.switchmodel.action.timeScale = -1;
|
||||
scope.modelmanager.switchmodel.action.timeScale = 1;
|
||||
scope.modelmanager.switchmodel.action.play();
|
||||
|
||||
} else if (data.normal == "1") {
|
||||
scope.modelmanager.switchmodel.normalPosition = "1";
|
||||
scope.modelmanager.switchmodel.action.reset();
|
||||
scope.modelmanager.switchmodel.action.time = scope.modelmanager.switchmodel.action._clip.duration;
|
||||
scope.modelmanager.switchmodel.action.timeScale = 1;
|
||||
scope.modelmanager.switchmodel.action.timeScale = -1;
|
||||
scope.modelmanager.switchmodel.action.play();
|
||||
|
||||
}
|
||||
@ -271,19 +271,19 @@ export function Jl3ddeviceNew(dom,group,token) {
|
||||
}
|
||||
|
||||
function initstatus(data) {
|
||||
|
||||
if (data._type == "Switch") {
|
||||
if (data.normalPosition == "0") {
|
||||
scope.modelmanager.switchmodel.normalPosition = "0";
|
||||
scope.modelmanager.switchmodel.action.reset();
|
||||
scope.modelmanager.switchmodel.action.time = 0;
|
||||
scope.modelmanager.switchmodel.action.timeScale = -1;
|
||||
scope.modelmanager.switchmodel.action.time = scope.modelmanager.switchmodel.action._clip.duration;
|
||||
scope.modelmanager.switchmodel.action.timeScale = 1;
|
||||
|
||||
scope.modelmanager.switchmodel.action.play();
|
||||
} else if (data.normalPosition == "1") {
|
||||
scope.modelmanager.switchmodel.normalPosition = "1";
|
||||
scope.modelmanager.switchmodel.action.reset();
|
||||
scope.modelmanager.switchmodel.action.time = scope.modelmanager.switchmodel.action._clip.duration;
|
||||
scope.modelmanager.switchmodel.action.timeScale = 1;
|
||||
scope.modelmanager.switchmodel.action.time = 0;
|
||||
scope.modelmanager.switchmodel.action.timeScale = -1;
|
||||
scope.modelmanager.switchmodel.action.play();
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ export function Jl3dDrivingNew(mixers,updatemmi,sound,translation,routegroup,sta
|
||||
return;
|
||||
}
|
||||
if(data.type == "Train_Hmi_3D"){
|
||||
console.log(data.body);
|
||||
// console.log(data.body);
|
||||
trainhmi(data.body);
|
||||
return;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ var views = [
|
||||
width: 0.5,
|
||||
height: 0.5,
|
||||
background: new THREE.Color( 0.5, 0.5, 0.7 ),
|
||||
eye: [ 3.7, 17, 26 ],
|
||||
eye: [ 3.7, 16, 26 ],
|
||||
up: [3.7, 10 ,16 ],
|
||||
fov: 30
|
||||
},
|
||||
@ -100,7 +100,7 @@ var views = [
|
||||
width: 0.5,
|
||||
height: 0.5,
|
||||
background: new THREE.Color( 0.5, 0.5, 0.7 ),
|
||||
eye: [ 3.7,30,-4 ],
|
||||
eye: [ 3.7,17,-4 ],
|
||||
up: [ 3.7, 10 ,16],
|
||||
fov: 30
|
||||
},
|
||||
@ -120,8 +120,8 @@ var views = [
|
||||
width: 0.5,
|
||||
height: 0.5,
|
||||
background: new THREE.Color( 0.5, 0.7, 0.7 ),
|
||||
eye: [ -1,12,0],
|
||||
up: [-1, 11, 8],
|
||||
eye: [ -7,17,2],
|
||||
up: [-7, 10, 8],
|
||||
fov: 60
|
||||
}
|
||||
];
|
||||
@ -229,6 +229,9 @@ export function Jl3dpassflow(dom) {
|
||||
originhuman1.remove(originhuman1.children[2]);
|
||||
scene.add(rungroup);
|
||||
loadingInstance.close();
|
||||
|
||||
scope.switchrender(false);
|
||||
|
||||
animate();
|
||||
})
|
||||
|
||||
|
@ -77,7 +77,7 @@ export function Jlmap3dSubscribeNew(jlmap3d,routegroup,jsonwebwork) {
|
||||
// }
|
||||
if (event.data.type== 'SIGNAL' && signallist) {
|
||||
signalupdate(event.data);
|
||||
console.log(event.data);
|
||||
// console.log(event.data);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,7 @@ export function DriverLoadNew(data,scope,netdata,mapdata,sectionlist,signallist,
|
||||
backdata.loaderdata(sectionlist,linklist,signallist,stationstandlist,trainlisttest,realsectionlist,rails);
|
||||
scope.Subscribe.updatamap(sectionlist,linklist,signallist,stationstandlist,trainlisttest,realsectionlist,rails,scope.materiallist,scope.actions,scope.sceneload);
|
||||
scope.webwork.postMessage("on");
|
||||
// console.log(stationstandlist);
|
||||
console.log(scene);
|
||||
// updatemenulist(stationstandlist.list,trainlisttest.list);
|
||||
loadingInstance.close();
|
||||
});
|
||||
|
@ -369,7 +369,7 @@ export const asyncRouter = [
|
||||
redirect: '/design/userlist/home',
|
||||
component: Layout,
|
||||
meta: {
|
||||
roles: [admin, user]
|
||||
roles: [admin]
|
||||
},
|
||||
children: [
|
||||
{
|
||||
@ -855,7 +855,7 @@ export const asyncRouter = [
|
||||
redirect: '/design/usermap/home',
|
||||
component: Layout,
|
||||
meta: {
|
||||
roles: [admin]
|
||||
roles: [admin, user]
|
||||
},
|
||||
children: [
|
||||
{
|
||||
|
@ -3,45 +3,48 @@
|
||||
<div id="jl3d" class="jl3ddraw">
|
||||
|
||||
</div>
|
||||
<div class="menutop">
|
||||
<!-- <div class="menutop">
|
||||
<el-button-group>
|
||||
<el-button type="primary" @click="switchrender">{{rendermode}}</el-button>
|
||||
</el-button-group>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="menudown">
|
||||
<el-button-group>
|
||||
<el-button type="primary" @click="back">退出</el-button>
|
||||
</el-button-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script>
|
||||
import Vue from 'vue';
|
||||
import { Jl3dpassflow } from '@/jlmap3d/jl3dpassflow/jl3dpassflow.js';
|
||||
|
||||
import { ProjectIcon } from '@/scripts/ConstDic';
|
||||
|
||||
export default {
|
||||
name: 'passflow',
|
||||
name: 'Passflow',
|
||||
components: {
|
||||
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
jl3d: null,
|
||||
rendermode:"监控视角",
|
||||
renderswitch:true,
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
||||
rendermode:'监控视角',
|
||||
renderswitch:true
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
code() {
|
||||
return this.$route.query.code;
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
watch: {
|
||||
|
||||
},
|
||||
created() {
|
||||
document.querySelector("link[rel*='icon']").href = ProjectIcon[this.$route.query.project];
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
},
|
||||
|
||||
@ -50,25 +53,25 @@
|
||||
methods: {
|
||||
init: function () {
|
||||
// let mapdata = this.$store.state.socket.device;
|
||||
let dom = document.getElementById('jl3d');
|
||||
const dom = document.getElementById('jl3d');
|
||||
this.jl3d = new Jl3dpassflow(dom);
|
||||
},
|
||||
switchrender() {
|
||||
if (this.renderswitch == true) {
|
||||
this.rendermode = "退出监控";
|
||||
this.rendermode = '退出监控';
|
||||
this.renderswitch = false;
|
||||
this.jl3d.switchrender(this.renderswitch);
|
||||
} else {
|
||||
this.rendermode = "监控视角";
|
||||
this.rendermode = '监控视角';
|
||||
this.renderswitch = true;
|
||||
this.jl3d.switchrender(this.renderswitch);
|
||||
}
|
||||
},
|
||||
back() {
|
||||
window.close();
|
||||
},
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
/* #jl3d {
|
||||
|
@ -13,8 +13,6 @@
|
||||
<el-button type="primary" @click="back">{{ $t('global.exit') }}</el-button>
|
||||
</el-button-group>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<Jlmap3d-Menu :trainlist="trainlist" :stationlist="stationlist" @sstation="sstation" @strain="strain" />
|
||||
@ -49,6 +47,7 @@ import { JLmap3d } from '@/jlmap3d/jl3dsimulation/jlmap3d.js';
|
||||
import Jlmap3dMenu from '@/views/jlmap3d/simulation/show/menu';
|
||||
|
||||
import Jlmap3dConfig from '@/views/jlmap3d/simulation/show/configmenu';
|
||||
import { ProjectIcon } from '@/scripts/ConstDic';
|
||||
|
||||
// import Jlmap3dMsg from '@/views/jlmap3d/show/msg';
|
||||
|
||||
@ -92,7 +91,9 @@ export default {
|
||||
// this.$destroy();
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
document.querySelector("link[rel*='icon']").href = ProjectIcon[this.$route.query.project];
|
||||
},
|
||||
mounted() {
|
||||
window.updatemenulist = this.updatemenulist;
|
||||
this.getParams();
|
||||
@ -101,7 +102,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
getParams:function() {
|
||||
var routerParams = this.$route.query.group
|
||||
var routerParams = this.$route.query.group;
|
||||
this.mapid = this.$route.query.mapid;
|
||||
this.group = this.$route.query.group;
|
||||
this.token = this.$route.query.token;
|
||||
@ -120,16 +121,15 @@ export default {
|
||||
init: function (skinCode, group) {
|
||||
const mapdata = this.$store.getters['map/map'];
|
||||
const dom = document.getElementById('app');
|
||||
let project = this.$route.query.project;
|
||||
const project = this.$route.query.project;
|
||||
// console.log(project);
|
||||
|
||||
|
||||
if (project) {
|
||||
|
||||
this.jlmap3d = new JLmap3d(dom, mapdata, skinCode, this.$store, group, project);
|
||||
} else {
|
||||
|
||||
this.jlmap3d = new JLmap3d(dom, mapdata, skinCode,this.$store,group,"");
|
||||
this.jlmap3d = new JLmap3d(dom, mapdata, skinCode, this.$store, group, '');
|
||||
}
|
||||
this.jlmap3d.eventon();
|
||||
},
|
||||
@ -158,12 +158,12 @@ export default {
|
||||
this.jlmap3d.showtrainmsg(showtype);
|
||||
},
|
||||
updatemenulist(stationlist, trainlist) {
|
||||
let stations = [];
|
||||
for (let k in stationlist) {
|
||||
const stations = [];
|
||||
for (const k in stationlist) {
|
||||
stations.push(stationlist[k]);
|
||||
}
|
||||
let trains = [];
|
||||
for (let k in trainlist) {
|
||||
const trains = [];
|
||||
for (const k in trainlist) {
|
||||
trains.push(trainlist[k]);
|
||||
}
|
||||
this.stationlist = stations;
|
||||
|
@ -190,6 +190,9 @@ export default {
|
||||
},
|
||||
isShowScheduling() {
|
||||
return this.$route.query.prdType == '05';
|
||||
},
|
||||
project() {
|
||||
return getSessionStorage('project');
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@ -508,7 +511,7 @@ export default {
|
||||
mapid:this.mapId,
|
||||
group:this.group,
|
||||
token:getToken(),
|
||||
project:getSessionStorage('project')
|
||||
project: this.project
|
||||
}
|
||||
});
|
||||
window.open(routeData.href, '_blank', 'noopener noreferrer');
|
||||
@ -518,7 +521,8 @@ export default {
|
||||
const routeData = this.$router.resolve({
|
||||
path:'/jlmap3d/passengerflow',
|
||||
query:{
|
||||
mapid:this.mapId
|
||||
mapid:this.mapId,
|
||||
project: this.project
|
||||
}
|
||||
});
|
||||
window.open(routeData.href, '_blank', 'noopener noreferrer');
|
||||
|
@ -20,6 +20,7 @@ import MapPublish from './publish';
|
||||
import MapPublish3d from './publish3d';
|
||||
import { mapGetters } from 'vuex';
|
||||
import { saveMap } from '@/api/jmap/mapdraft';
|
||||
import { superAdmin, admin } from '@/router/index_APP_TARGET';
|
||||
|
||||
export default {
|
||||
name: 'MapOperateMenu',
|
||||
@ -46,32 +47,6 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
menuMap: [
|
||||
{
|
||||
label: this.$t('map.updateObj'),
|
||||
handler: this.updateObj
|
||||
},
|
||||
{
|
||||
label: this.$t('map.updateObjAxis'),
|
||||
handler: this.updateObjAxis
|
||||
},
|
||||
{
|
||||
label: this.$t('map.saveAs'),
|
||||
handler: this.saveAs
|
||||
},
|
||||
{
|
||||
label: this.$t('map.deleteObj'),
|
||||
handler: this.deleteObj
|
||||
},
|
||||
{
|
||||
label: this.$t('map.jlmap3d'),
|
||||
handler: this.jlmap3d
|
||||
},
|
||||
{
|
||||
label: this.$t('map.publish3d'),
|
||||
handler: this.publish3d
|
||||
}
|
||||
],
|
||||
publishMapMenu: {
|
||||
label: this.$t('map.publish'),
|
||||
handler: this.publish
|
||||
@ -95,15 +70,68 @@ export default {
|
||||
hasRelease() {
|
||||
return this.$store.state.user.roles.includes('04') ||
|
||||
this.$store.state.user.roles.includes('05');
|
||||
},
|
||||
menuMap() {
|
||||
if (this.$store.state.user.roles.includes(superAdmin) || this.$store.state.user.roles.includes(admin)) {
|
||||
return [
|
||||
{
|
||||
label: this.$t('map.updateObj'),
|
||||
handler: this.updateObj
|
||||
},
|
||||
{
|
||||
label: this.$t('map.updateObjAxis'),
|
||||
handler: this.updateObjAxis
|
||||
},
|
||||
{
|
||||
label: this.$t('map.saveAs'),
|
||||
handler: this.saveAs
|
||||
},
|
||||
{
|
||||
label: this.$t('map.deleteObj'),
|
||||
handler: this.deleteObj
|
||||
},
|
||||
{
|
||||
label: this.$t('map.jlmap3d'),
|
||||
handler: this.jlmap3d
|
||||
},
|
||||
{
|
||||
label: this.$t('map.publish3d'),
|
||||
handler: this.publish3d
|
||||
},
|
||||
{
|
||||
label: this.$t('map.publish'),
|
||||
handler: this.publish
|
||||
}
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
{
|
||||
label: this.$t('map.updateObj'),
|
||||
handler: this.updateObj
|
||||
},
|
||||
{
|
||||
label: this.$t('map.updateObjAxis'),
|
||||
handler: this.updateObjAxis
|
||||
},
|
||||
{
|
||||
label: this.$t('map.saveAs'),
|
||||
handler: this.saveAs
|
||||
},
|
||||
{
|
||||
label: this.$t('map.deleteObj'),
|
||||
handler: this.deleteObj
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'$store.state.menuOperation.menuCount': function (val) {
|
||||
if (this.$store.getters['menuOperation/checkDialogIsOpen'](DeviceMenu.Map)) {
|
||||
this.menu = [...this.menuMap];
|
||||
if (this.hasRelease) {
|
||||
this.menu.push(this.publishMapMenu);
|
||||
}
|
||||
// if (this.hasRelease) {
|
||||
// this.menu.push(this.publishMapMenu);
|
||||
// }
|
||||
this.doShow(this.$store.state.menuOperation.menuPosition);
|
||||
} else if (this.$store.getters['menuOperation/checkDialogIsOpen'](DeviceMenu.Cancel)) {
|
||||
this.initCancelMenu();
|
||||
|
BIN
static/model/device/signal/1.jpg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
static/model/device/signal/2.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
static/model/device/signal/3.jpg
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
static/model/device/signal/4.jpg
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
static/model/device/signal/5.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
static/model/device/signal/signal.FBX
Normal file
BIN
static/model/device/stationstand/stationstand.bak.FBX
Normal file
BIN
static/model/device/stationstand/zt001.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
static/model/device/stationstand/zt005.png
Normal file
After Width: | Height: | Size: 375 KiB |
BIN
static/model/device/stationstand/zt007.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
static/model/device/stationstand/zt008.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
static/model/device/switch/011.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
static/model/device/switch/012.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
static/model/device/switch/013.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
static/model/device/switch/014.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
static/model/device/switch/015.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
static/model/device/switch/016.jpg
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
static/model/device/switch/017.jpg
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
static/model/device/switch/020.jpg
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
static/model/device/switch/021.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
static/model/device/switch/022.jpg
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
static/model/device/switch/024.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
static/model/device/switch/switch.bak.FBX
Normal file
BIN
static/model/device/switch/z025.jpg
Normal file
After Width: | Height: | Size: 24 KiB |