From b44563169f87d4747e858c234a3f06a2d0fac117 Mon Sep 17 00:00:00 2001
From: Lucio Zambon <lucio.zambon@elettra.eu>
Date: Fri, 17 May 2024 00:43:06 +0000
Subject: [PATCH] Update bundle_fermi.js

---
 components/bundle_fermi.js | 8146 ++++++++++++++++++------------------
 1 file changed, 4075 insertions(+), 4071 deletions(-)

diff --git a/components/bundle_fermi.js b/components/bundle_fermi.js
index f11fbbb..b699002 100644
--- a/components/bundle_fermi.js
+++ b/components/bundle_fermi.js
@@ -1,4130 +1,4134 @@
 /*jshint esversion: 6 */
-import * as THREE from 'three';
-// import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js';
-import {FontLoader} from 'three/addons/loaders/FontLoader.js';
-import {TextGeometry} from 'three/addons/geometries/TextGeometry.js';
-
-// rack
-export function rack(width=800, height=2000, depth=800, color=0xf0f0f0) {
-	const gunObject = new THREE.Object3D();
-	const gunmaterial = new THREE.MeshLambertMaterial({color: color});
-	const gungeometry = new THREE.BoxGeometry(width, height, depth);
-	const gunmesh = new THREE.Mesh(gungeometry, gunmaterial);
-	gunmesh.position.set(width/2, height/2, depth/2);
-	gunObject.add(gunmesh);
-	return gunObject;
-}
-// transparent wall
-export function wall(param) {
-	const length=3000;
-	const material = new THREE.MeshBasicMaterial({color: 0xff8080, transparent: true, opacity: 0.2, side: THREE.DoubleSide,});
-	const geometry = new THREE.CylinderGeometry(10 /*radiusTop*/, 10 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	const chamberMesh = new THREE.Mesh(geometry, material);
-	chamberMesh.rotateX(Math.PI * 0.5);
-	chamberMesh.scale.setZ(100);
-	chamberMesh.rotatedX = true;
-	return chamberMesh;
-}
-// label
-export function label(param) {
-	const text=param.name, height=-50;
-	const length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -3000;
-	const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: -3000;
-	let size=800;
-	const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const objLabel = new THREE.Object3D();
-	let group, textMesh, textGeo, materials;
-	let textheight = 50;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		objLabel.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
-		textMesh = new THREE.Mesh( textGeo, materialBase );
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+	import * as THREE from 'three';
+	// import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js';
+	import {FontLoader} from 'three/addons/loaders/FontLoader.js';
+	import {TextGeometry} from 'three/addons/geometries/TextGeometry.js';
+
+	// rack
+	export function rack(param) {
+		const width=800, height=2000, depth = param.depth? param.depth: 800, color=0xf0f0f0;
+		const gunObject = new THREE.Object3D();
+		const gunmaterial = new THREE.MeshLambertMaterial({color: color});
+		const gungeometry = new THREE.BoxGeometry(width, height, depth);
+		const gunmesh = new THREE.Mesh(gungeometry, gunmaterial);
+		const rackObject = new THREE.Object3D();
+		rackObject.add(gunmesh);	
+		rackObject.position.set(width/2, height/2, depth/2);
+		gunObject.add(rackObject);
+		return gunObject;
 	}
-	insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, 0]);
-
-	return objLabel;
-}
-export function rack2(width=800, height=2000, depth=600) {return rack(width, height, depth);}
-
-export function rv(param) {
-	const width=800, height=2500, depth=800;
-	const rv = new THREE.Object3D();
-	const rv_rackObject = new THREE.Object3D();
-	const pspump_rackObject = new THREE.Object3D();
-
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const Darkwhitematerial = new THREE.MeshLambertMaterial({color: 0xbababa});
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rv.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
+	// transparent wall
+	export function wall(param) {
+		const length=3000;
+		const material = new THREE.MeshBasicMaterial({color: 0xff8080, transparent: true, opacity: 0.2, side: THREE.DoubleSide,});
+		const geometry = new THREE.CylinderGeometry(10 /*radiusTop*/, 10 /*radiusBottom*/, length /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		const chamberMesh = new THREE.Mesh(geometry, material);
+		chamberMesh.rotateX(Math.PI * 0.5);
+		chamberMesh.scale.setZ(100);
+		chamberMesh.rotatedX = true;
+		return chamberMesh;
 	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
+	// label
+	export function label(param) {
+		const text=param.name, height=-50;
+		const length = param && param.labelReverse && param.labelReverse[1]? param.labelReverse[1]: -3000;
+		const depth = param && param.labelReverse && param.labelReverse[2]? param.labelReverse[2]: -3000;
+		let size=800;
+		const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const objLabel = new THREE.Object3D();
+		let group, textMesh, textGeo, materials;
+		let textheight = 50;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			objLabel.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
+			textMesh = new THREE.Mesh( textGeo, materialBase );
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(size, [length, height, depth], [Math.PI*0.5, Math.PI, 0]);
+
+		return objLabel;
 	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(800, 90, 800);
-		rv.add(group2);				
+	export function rack2(param) {param.depth=600; return rack(param);}
+
+	export function rv(param) {
+		const width=800, height=2500, depth=800;
+		const rv = new THREE.Object3D();
+		const rv_rackObject = new THREE.Object3D();
+		const pspump_rackObject = new THREE.Object3D();
+	
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const Darkwhitematerial = new THREE.MeshLambertMaterial({color: 0xbababa});
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rv.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(800, 90, 800);
+			rv.add(group2);				
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
+	
 		
+		
+		// rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		//rrmesh.position.set( 0, 0 , -810);
+		rv_rackObject.add(rrmesh);
+		
+		//front yellow tag
+		const Ftarget = new THREE.BoxGeometry(2, 90, 600);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -5);
+		rv_rackObject.add(Ftargetmesh);		
+		//Rear yellow tag
+		const Rtarget = new THREE.BoxGeometry(2, 90, 600);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -5);
+		rv_rackObject.add(Rtargetmesh);				
+		
+		//edge lle	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -365);
+		rv_rackObject.add(llemesh);
+		
+		//edge lre		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 380);
+		rv_rackObject.add(lremesh);		
+
+		//edge lue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , 3);
+		rv_rackObject.add(luemesh);		
+
+		//edge lde		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , 3);
+		rv_rackObject.add(ldemesh);				
+		//silverbase		
+		const drawer1geometry = new THREE.BoxGeometry(10, 2450, 750);
+		const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, silvermaterial);
+		drawer1geometrymesh.position.set( -400, 0 , -10);
+		rv_rackObject.add(drawer1geometrymesh);
+		
+		//base PS ionic Pump
+		const baseionicpump = new THREE.BoxGeometry(10, 250, 300);
+		const baseionicpumpmesh = new THREE.Mesh(baseionicpump, Darkwhitematerial);
+		baseionicpumpmesh.position.set( -401, 900 , -150);
+		pspump_rackObject.add(baseionicpumpmesh);		
+
+		//sceen PS ionic Pump
+		const screenionicpump = new THREE.BoxGeometry(10, 60, 180);
+		const screenionicpumpmesh = new THREE.Mesh(screenionicpump, screenmaterial);
+		screenionicpumpmesh.position.set( -402, 950 , -150);
+		pspump_rackObject.add(screenionicpumpmesh);			
+		
+		//button ON OFF PS ionic Pump
+		const buttonionicpump = new THREE.BoxGeometry(10, 50, 30);
+		const buttonionicpumpmesh = new THREE.Mesh(buttonionicpump, materialVeryGreyDark);
+		buttonionicpumpmesh.position.set( -402, 830 , -250);
+		pspump_rackObject.add(buttonionicpumpmesh);	
+		
+		//button ON Details 
+		const I = new THREE.BoxGeometry(3, 12, 3);
+		const IMesh = new THREE.Mesh(I, Darkwhitematerial);
+		IMesh.position.set( -407, 844 , -250);
+		pspump_rackObject.add(IMesh);	
+		
+		//button OFF Details 
+		const OI1 = new THREE.CylinderGeometry(8, 8, 2, 15);
+		const OI1Mesh = new THREE.Mesh(OI1, Darkwhitematerial);
+		OI1Mesh.rotateX(Math.PI * 0.5);
+		OI1Mesh.rotateY(Math.PI * 1);
+		OI1Mesh.rotateZ(Math.PI * 0.5);
+		OI1Mesh.position.set( -407, 817 , -250);		
+		pspump_rackObject.add(OI1Mesh);		
+
+		//button OFF Details 2
+		const OI2 = new THREE.CylinderGeometry(6, 6, 2, 15);
+		const OI2Mesh = new THREE.Mesh(OI2, materialVeryGreyDark);
+		OI2Mesh.rotateX(Math.PI * 0.5);
+		OI2Mesh.rotateY(Math.PI * 1);
+		OI2Mesh.rotateZ(Math.PI * 0.5);
+		OI2Mesh.position.set( -408, 817 , -250);		
+		pspump_rackObject.add(OI2Mesh);	
+		
+		//border up
+		const borderup = new THREE.BoxGeometry(10, 2, 260);
+		const borderupmesh = new THREE.Mesh(borderup, bluematerial);
+		borderupmesh.position.set( -402, 1000 , -150);
+		pspump_rackObject.add(borderupmesh);	
+		
+		//border mid
+		const bordermid = new THREE.BoxGeometry(10, 2, 260);
+		const bordermidmesh = new THREE.Mesh(bordermid, bluematerial);
+		bordermidmesh.position.set( -402, 900 , -150);
+		pspump_rackObject.add(bordermidmesh);
+		
+		//border left
+		const borderleft = new THREE.BoxGeometry(10, 100, 2);
+		const borderleftmesh = new THREE.Mesh(borderleft, bluematerial);
+		borderleftmesh.position.set( -402, 950 , -280);
+		pspump_rackObject.add(borderleftmesh);	
+		
+		//border right
+		const borderright = new THREE.BoxGeometry(10, 100, 2);
+		const borderrightmesh = new THREE.Mesh(borderright, bluematerial);
+		borderrightmesh.position.set( -402, 950 , -20);
+		pspump_rackObject.add(borderrightmesh);		
+		
+		//button1  PS ionic Pump
+		const button1ionicpump = new THREE.BoxGeometry(10, 30, 30);
+		const button1ionicpumpmesh = new THREE.Mesh(button1ionicpump, materialGreyDark);
+		button1ionicpumpmesh.position.set( -402, 830 , -200);
+		pspump_rackObject.add(button1ionicpumpmesh);			
+		
+		//button2 up  PS ionic Pump
+		const button2ionicpump = new THREE.BoxGeometry(10, 30, 30);
+		const button2ionicpumpmesh = new THREE.Mesh(button2ionicpump, materialGreyDark);
+		button2ionicpumpmesh.position.set( -402, 860 , -160);
+		pspump_rackObject.add(button2ionicpumpmesh);
+		
+		//button3 up  PS ionic Pump
+		const button3ionicpump = new THREE.BoxGeometry(10, 30, 30);
+		const button3ionicpumpmesh = new THREE.Mesh(button3ionicpump, materialGreyDark);
+		button3ionicpumpmesh.position.set( -402, 860 , -120);
+		pspump_rackObject.add(button3ionicpumpmesh);
+		
+		//button4 up  PS ionic Pump
+		const button4ionicpump = new THREE.BoxGeometry(10, 30, 30);
+		const button4ionicpumpmesh = new THREE.Mesh(button4ionicpump, materialGreyDark);
+		button4ionicpumpmesh.position.set( -402, 860 , -80);
+		pspump_rackObject.add(button4ionicpumpmesh);
+		
+		//button5 up  PS ionic Pump
+		const button5ionicpump = new THREE.BoxGeometry(10, 30, 30);
+		const button5ionicpumpmesh = new THREE.Mesh(button5ionicpump, materialGreyDark);
+		button5ionicpumpmesh.position.set( -402, 860 , -40);
+		pspump_rackObject.add(button5ionicpumpmesh);	
+
+		rv_rackObject.add(pspump_rackObject);
+		//CLONE PS PUMP
+
+		const pump2 = pspump_rackObject.clone();
+		pump2.position.set( 0, 0 , 310);
+		rv_rackObject.add(pump2);
+		
+		const pump3 = pspump_rackObject.clone();
+		pump3.position.set( 0, -260 , 0);
+		rv_rackObject.add(pump3);	
+		
+		const pump4 = pspump_rackObject.clone();
+		pump4.position.set( 0, -260 , 310);
+		rv_rackObject.add(pump4);
+		
+		const pump5 = pspump_rackObject.clone();
+		pump5.position.set( 0, -520 , 0);
+		rv_rackObject.add(pump5);
+		
+		const pump6 = pspump_rackObject.clone();
+		pump6.position.set( 0, -520 , 310);
+		rv_rackObject.add(pump6);
+
+		rv_rackObject.rotateY(Math.PI);
+		rv_rackObject.position.set(400, 1250, 400);
+		rv.add(rv_rackObject);
+		return rv;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
 
-	
-	
-	// rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	//rrmesh.position.set( 0, 0 , -810);
-	rv_rackObject.add(rrmesh);
-	
-	//front yellow tag
-	const Ftarget = new THREE.BoxGeometry(2, 90, 600);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -5);
-	rv_rackObject.add(Ftargetmesh);		
-	//Rear yellow tag
-	const Rtarget = new THREE.BoxGeometry(2, 90, 600);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -5);
-	rv_rackObject.add(Rtargetmesh);				
-	
-	//edge lle	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -365);
-	rv_rackObject.add(llemesh);
-	
-	//edge lre		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 380);
-	rv_rackObject.add(lremesh);		
-
-	//edge lue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , 3);
-	rv_rackObject.add(luemesh);		
-
-	//edge lde		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , 3);
-	rv_rackObject.add(ldemesh);				
-	//silverbase		
-	const drawer1geometry = new THREE.BoxGeometry(10, 2450, 750);
-	const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, silvermaterial);
-	drawer1geometrymesh.position.set( -400, 0 , -10);
-	rv_rackObject.add(drawer1geometrymesh);
-	
-	//base PS ionic Pump
-	const baseionicpump = new THREE.BoxGeometry(10, 250, 300);
-	const baseionicpumpmesh = new THREE.Mesh(baseionicpump, Darkwhitematerial);
-	baseionicpumpmesh.position.set( -401, 900 , -150);
-	pspump_rackObject.add(baseionicpumpmesh);		
-
-	//sceen PS ionic Pump
-	const screenionicpump = new THREE.BoxGeometry(10, 60, 180);
-	const screenionicpumpmesh = new THREE.Mesh(screenionicpump, screenmaterial);
-	screenionicpumpmesh.position.set( -402, 950 , -150);
-	pspump_rackObject.add(screenionicpumpmesh);			
-	
-	//button ON OFF PS ionic Pump
-	const buttonionicpump = new THREE.BoxGeometry(10, 50, 30);
-	const buttonionicpumpmesh = new THREE.Mesh(buttonionicpump, materialVeryGreyDark);
-	buttonionicpumpmesh.position.set( -402, 830 , -250);
-	pspump_rackObject.add(buttonionicpumpmesh);	
-	
-	//button ON Details 
-	const I = new THREE.BoxGeometry(3, 12, 3);
-	const IMesh = new THREE.Mesh(I, Darkwhitematerial);
-	IMesh.position.set( -407, 844 , -250);
-	pspump_rackObject.add(IMesh);	
-	
-	//button OFF Details 
-	const OI1 = new THREE.CylinderGeometry(8, 8, 2, 15);
-	const OI1Mesh = new THREE.Mesh(OI1, Darkwhitematerial);
-	OI1Mesh.rotateX(Math.PI * 0.5);
-	OI1Mesh.rotateY(Math.PI * 1);
-	OI1Mesh.rotateZ(Math.PI * 0.5);
-	OI1Mesh.position.set( -407, 817 , -250);		
-	pspump_rackObject.add(OI1Mesh);		
-
-	//button OFF Details 2
-	const OI2 = new THREE.CylinderGeometry(6, 6, 2, 15);
-	const OI2Mesh = new THREE.Mesh(OI2, materialVeryGreyDark);
-	OI2Mesh.rotateX(Math.PI * 0.5);
-	OI2Mesh.rotateY(Math.PI * 1);
-	OI2Mesh.rotateZ(Math.PI * 0.5);
-	OI2Mesh.position.set( -408, 817 , -250);		
-	pspump_rackObject.add(OI2Mesh);	
-	
-	//border up
-	const borderup = new THREE.BoxGeometry(10, 2, 260);
-	const borderupmesh = new THREE.Mesh(borderup, bluematerial);
-	borderupmesh.position.set( -402, 1000 , -150);
-	pspump_rackObject.add(borderupmesh);	
-	
-	//border mid
-	const bordermid = new THREE.BoxGeometry(10, 2, 260);
-	const bordermidmesh = new THREE.Mesh(bordermid, bluematerial);
-	bordermidmesh.position.set( -402, 900 , -150);
-	pspump_rackObject.add(bordermidmesh);
-	
-	//border left
-	const borderleft = new THREE.BoxGeometry(10, 100, 2);
-	const borderleftmesh = new THREE.Mesh(borderleft, bluematerial);
-	borderleftmesh.position.set( -402, 950 , -280);
-	pspump_rackObject.add(borderleftmesh);	
-	
-	//border right
-	const borderright = new THREE.BoxGeometry(10, 100, 2);
-	const borderrightmesh = new THREE.Mesh(borderright, bluematerial);
-	borderrightmesh.position.set( -402, 950 , -20);
-	pspump_rackObject.add(borderrightmesh);		
-	
-	//button1  PS ionic Pump
-	const button1ionicpump = new THREE.BoxGeometry(10, 30, 30);
-	const button1ionicpumpmesh = new THREE.Mesh(button1ionicpump, materialGreyDark);
-	button1ionicpumpmesh.position.set( -402, 830 , -200);
-	pspump_rackObject.add(button1ionicpumpmesh);			
-	
-	//button2 up  PS ionic Pump
-	const button2ionicpump = new THREE.BoxGeometry(10, 30, 30);
-	const button2ionicpumpmesh = new THREE.Mesh(button2ionicpump, materialGreyDark);
-	button2ionicpumpmesh.position.set( -402, 860 , -160);
-	pspump_rackObject.add(button2ionicpumpmesh);
-	
-	//button3 up  PS ionic Pump
-	const button3ionicpump = new THREE.BoxGeometry(10, 30, 30);
-	const button3ionicpumpmesh = new THREE.Mesh(button3ionicpump, materialGreyDark);
-	button3ionicpumpmesh.position.set( -402, 860 , -120);
-	pspump_rackObject.add(button3ionicpumpmesh);
-	
-	//button4 up  PS ionic Pump
-	const button4ionicpump = new THREE.BoxGeometry(10, 30, 30);
-	const button4ionicpumpmesh = new THREE.Mesh(button4ionicpump, materialGreyDark);
-	button4ionicpumpmesh.position.set( -402, 860 , -80);
-	pspump_rackObject.add(button4ionicpumpmesh);
-	
-	//button5 up  PS ionic Pump
-	const button5ionicpump = new THREE.BoxGeometry(10, 30, 30);
-	const button5ionicpumpmesh = new THREE.Mesh(button5ionicpump, materialGreyDark);
-	button5ionicpumpmesh.position.set( -402, 860 , -40);
-	pspump_rackObject.add(button5ionicpumpmesh);	
-
-	rv_rackObject.add(pspump_rackObject);
-	//CLONE PS PUMP
-
-	const pump2 = pspump_rackObject.clone();
-	pump2.position.set( 0, 0 , 310);
-	rv_rackObject.add(pump2);
-	
-	const pump3 = pspump_rackObject.clone();
-	pump3.position.set( 0, -260 , 0);
-	rv_rackObject.add(pump3);	
-	
-	const pump4 = pspump_rackObject.clone();
-	pump4.position.set( 0, -260 , 310);
-	rv_rackObject.add(pump4);
-	
-	const pump5 = pspump_rackObject.clone();
-	pump5.position.set( 0, -520 , 0);
-	rv_rackObject.add(pump5);
-	
-	const pump6 = pspump_rackObject.clone();
-	pump6.position.set( 0, -520 , 310);
-	rv_rackObject.add(pump6);
-
-	rv_rackObject.rotateY(Math.PI);
-	rv_rackObject.position.set(400, 1250, 400);
-	rv.add(rv_rackObject);
-	return rv;
-}
-
-// ID rack
-export function rid(param) {
-	const width=800, height=1900, depth=600;
-	const rid = new THREE.Object3D();
-	const id_rackObject = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rid.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(800, 90, 650);
-		rid.add(group2);			
+	// ID rack
+	export function rid(param) {
+		const width=800, height=1900, depth=600;
+		const rid = new THREE.Object3D();
+		const id_rackObject = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rid.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(800, 90, 650);
+			rid.add(group2);			
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850,1730,550], [0, Math.PI / 2, 0]);
+	
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
+		const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
+		const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
+		const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa});
+		const materialviolet = new THREE.MeshLambertMaterial({color: 0xa425b8});
+		const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+
 		
+		
+		//rack
+		const rgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rmesh = new THREE.Mesh(rgeometry, silvermaterial);
+		rmesh.position.set(0 , 0 , 0);
+		id_rackObject.add(rmesh);
+		
+		//screen border	
+		const screenbordergeometry = new THREE.BoxGeometry(10, 250, 350);
+		const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
+		screenbordergeometrymesh.position.set( -400, 500 , 0);
+		id_rackObject.add(screenbordergeometrymesh);
+		
+		//screen 	
+		const screengeometry = new THREE.BoxGeometry(10, 200, 300);
+		const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
+		screengeometrymesh.position.set( -401, 500 , 0);
+		id_rackObject.add(screengeometrymesh);		
+		
+		//wiendow screen 	
+		const screenwindowgeometry = new THREE.BoxGeometry(10, 150, 150);
+		const screenwindowgeometrymesh = new THREE.Mesh(screenwindowgeometry, materialThightblue);
+		screenwindowgeometrymesh.position.set( -402, 500 , -40);
+		id_rackObject.add(screenwindowgeometrymesh);	
+		
+		//window screen green button	
+		const screenwindowgreenbuttongeometry = new THREE.BoxGeometry(10, 25, 35);
+		const screenwindowgreenbuttongeometryymesh = new THREE.Mesh(screenwindowgreenbuttongeometry, greenmaterial);
+		screenwindowgreenbuttongeometryymesh.position.set( -403, 540 , -80);
+		id_rackObject.add(screenwindowgreenbuttongeometryymesh);
+		
+		//window screen violet button	
+		const screenwindowvioletbuttongeometry = new THREE.BoxGeometry(10, 25, 35);
+		const screenwindowvioletbuttongeometryymesh = new THREE.Mesh(screenwindowvioletbuttongeometry, materialviolet);
+		screenwindowvioletbuttongeometryymesh.position.set( -403, 510 , -80);
+		id_rackObject.add(screenwindowvioletbuttongeometryymesh);	
+		
+		//window screen blu button	
+		const screenwindowblubuttongeometry = new THREE.BoxGeometry(10, 25, 35);
+		const screenwindowblubuttongeometryymesh = new THREE.Mesh(screenwindowblubuttongeometry, materialDarkblue);
+		screenwindowblubuttongeometryymesh.position.set( -403, 480 , -80);
+		id_rackObject.add(screenwindowblubuttongeometryymesh);		
+		
+		//key		
+		const keygeometry = new THREE.BoxGeometry(50, 200, 50);
+		const keygeometrymesh = new THREE.Mesh(keygeometry, whitematerial);
+		keygeometrymesh.position.set( -400, -400 , -250);
+		id_rackObject.add(keygeometrymesh);
+		//key2		
+		const key2geometry = new THREE.CylinderGeometry(15, 15, 15, 15);
+		const key2geometrymesh = new THREE.Mesh(key2geometry, materialGreyMedium);
+		key2geometrymesh.rotateX(Math.PI * 0.5);
+		key2geometrymesh.rotateY(Math.PI * 1);
+		key2geometrymesh.rotateZ(Math.PI * 0.5);		
+		key2geometrymesh.position.set(-421, -400 , -250);		
+		id_rackObject.add(key2geometrymesh);	
+	
+		//whitebutton1
+		const whitebutton = new THREE.CylinderGeometry(30, 30, 30, 15);
+		const whitebuttonmesh = new THREE.Mesh(whitebutton, whitematerial);
+		whitebuttonmesh.rotateX(Math.PI * 0.5);
+		whitebuttonmesh.rotateY(Math.PI * 1);
+		whitebuttonmesh.rotateZ(Math.PI * 0.5);		
+		whitebuttonmesh.position.set(-405, 200 , -200);		
+		id_rackObject.add(whitebuttonmesh);			
+
+		//blackbutton1
+		const blackbutton1 = new THREE.CylinderGeometry(30, 30, 30, 15);
+		const blackbutton1mesh = new THREE.Mesh(blackbutton1, materialVeryGreyDark);
+		blackbutton1mesh.rotateX(Math.PI * 0.5);
+		blackbutton1mesh.rotateY(Math.PI * 1);
+		blackbutton1mesh.rotateZ(Math.PI * 0.5);		
+		blackbutton1mesh.position.set(-405, 200 , -100);		
+		id_rackObject.add(blackbutton1mesh);
+		
+		//blackbutton2
+		const blackbutton2 = new THREE.CylinderGeometry(30, 30, 30, 15);
+		const blackbutton2mesh = new THREE.Mesh(blackbutton2, materialVeryGreyDark);
+		blackbutton2mesh.rotateX(Math.PI * 0.5);
+		blackbutton2mesh.rotateY(Math.PI * 1);
+		blackbutton2mesh.rotateZ(Math.PI * 0.5);		
+		blackbutton2mesh.position.set(-405, 200 , 0);		
+		id_rackObject.add(blackbutton2mesh);	
+		
+		//blackbutton3
+		const blackbutton3 = new THREE.CylinderGeometry(30, 30, 30, 15);
+		const blackbutton3mesh = new THREE.Mesh(blackbutton3, materialVeryGreyDark);
+		blackbutton3mesh.rotateX(Math.PI * 0.5);
+		blackbutton3mesh.rotateY(Math.PI * 1);
+		blackbutton3mesh.rotateZ(Math.PI * 0.5);		
+		blackbutton3mesh.position.set(-405, 200 , 100);		
+		id_rackObject.add(blackbutton3mesh);
+		
+		//yellowbutton
+		const yellowbutton = new THREE.CylinderGeometry(30, 30, 30, 15);
+		const yellowbuttonmesh = new THREE.Mesh(yellowbutton, yellowmaterial);
+		yellowbuttonmesh.rotateX(Math.PI * 0.5);
+		yellowbuttonmesh.rotateY(Math.PI * 1);
+		yellowbuttonmesh.rotateZ(Math.PI * 0.5);		
+		yellowbuttonmesh.position.set(-405, 200 , 200);		
+		id_rackObject.add(yellowbuttonmesh);		
+		
+		//emergencybutton yellow 
+		const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15);
+		const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial);
+		emergencybuttonyellowmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonyellowmesh.rotateY(Math.PI * 1);
+		emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5);		
+		emergencybuttonyellowmesh.position.set(-403, 50 , 150);		
+		id_rackObject.add(emergencybuttonyellowmesh);				
+		
+		//emergencybutton red  
+		const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15);
+		const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
+		emergencybuttonmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonmesh.rotateY(Math.PI * 1);
+		emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
+		emergencybuttonmesh.position.set(-405, 50 , 150);		
+		id_rackObject.add(emergencybuttonmesh);	
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 500);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 900 , -15);
+		id_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 500);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 900 , -15);
+		id_rackObject.add(Rtargetmesh);
+
+		id_rackObject.rotateY(Math.PI);
+		id_rackObject.position.set(400, 950, 300);
+		rid.add(id_rackObject);	
+		return rid;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850,1730,550], [0, Math.PI / 2, 0]);
-
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xcfcfcf});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
-	const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
-	const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
-	const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa});
-	const materialviolet = new THREE.MeshLambertMaterial({color: 0xa425b8});
-	const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
 
-	
-	
-	//rack
-	const rgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rmesh = new THREE.Mesh(rgeometry, silvermaterial);
-	rmesh.position.set(0 , 0 , 0);
-	id_rackObject.add(rmesh);
-	
-	//screen border	
-	const screenbordergeometry = new THREE.BoxGeometry(10, 250, 350);
-	const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
-	screenbordergeometrymesh.position.set( -400, 500 , 0);
-	id_rackObject.add(screenbordergeometrymesh);
-	
-	//screen 	
-	const screengeometry = new THREE.BoxGeometry(10, 200, 300);
-	const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
-	screengeometrymesh.position.set( -401, 500 , 0);
-	id_rackObject.add(screengeometrymesh);		
-	
-	//wiendow screen 	
-	const screenwindowgeometry = new THREE.BoxGeometry(10, 150, 150);
-	const screenwindowgeometrymesh = new THREE.Mesh(screenwindowgeometry, materialThightblue);
-	screenwindowgeometrymesh.position.set( -402, 500 , -40);
-	id_rackObject.add(screenwindowgeometrymesh);	
-	
-	//window screen green button	
-	const screenwindowgreenbuttongeometry = new THREE.BoxGeometry(10, 25, 35);
-	const screenwindowgreenbuttongeometryymesh = new THREE.Mesh(screenwindowgreenbuttongeometry, greenmaterial);
-	screenwindowgreenbuttongeometryymesh.position.set( -403, 540 , -80);
-	id_rackObject.add(screenwindowgreenbuttongeometryymesh);
-	
-	//window screen violet button	
-	const screenwindowvioletbuttongeometry = new THREE.BoxGeometry(10, 25, 35);
-	const screenwindowvioletbuttongeometryymesh = new THREE.Mesh(screenwindowvioletbuttongeometry, materialviolet);
-	screenwindowvioletbuttongeometryymesh.position.set( -403, 510 , -80);
-	id_rackObject.add(screenwindowvioletbuttongeometryymesh);	
-	
-	//window screen blu button	
-	const screenwindowblubuttongeometry = new THREE.BoxGeometry(10, 25, 35);
-	const screenwindowblubuttongeometryymesh = new THREE.Mesh(screenwindowblubuttongeometry, materialDarkblue);
-	screenwindowblubuttongeometryymesh.position.set( -403, 480 , -80);
-	id_rackObject.add(screenwindowblubuttongeometryymesh);		
-	
-	//key		
-	const keygeometry = new THREE.BoxGeometry(50, 200, 50);
-	const keygeometrymesh = new THREE.Mesh(keygeometry, whitematerial);
-	keygeometrymesh.position.set( -400, -400 , -250);
-	id_rackObject.add(keygeometrymesh);
-	//key2		
-	const key2geometry = new THREE.CylinderGeometry(15, 15, 15, 15);
-	const key2geometrymesh = new THREE.Mesh(key2geometry, materialGreyMedium);
-	key2geometrymesh.rotateX(Math.PI * 0.5);
-	key2geometrymesh.rotateY(Math.PI * 1);
-	key2geometrymesh.rotateZ(Math.PI * 0.5);		
-	key2geometrymesh.position.set(-421, -400 , -250);		
-	id_rackObject.add(key2geometrymesh);	
-
-	//whitebutton1
-	const whitebutton = new THREE.CylinderGeometry(30, 30, 30, 15);
-	const whitebuttonmesh = new THREE.Mesh(whitebutton, whitematerial);
-	whitebuttonmesh.rotateX(Math.PI * 0.5);
-	whitebuttonmesh.rotateY(Math.PI * 1);
-	whitebuttonmesh.rotateZ(Math.PI * 0.5);		
-	whitebuttonmesh.position.set(-405, 200 , -200);		
-	id_rackObject.add(whitebuttonmesh);			
-
-	//blackbutton1
-	const blackbutton1 = new THREE.CylinderGeometry(30, 30, 30, 15);
-	const blackbutton1mesh = new THREE.Mesh(blackbutton1, materialVeryGreyDark);
-	blackbutton1mesh.rotateX(Math.PI * 0.5);
-	blackbutton1mesh.rotateY(Math.PI * 1);
-	blackbutton1mesh.rotateZ(Math.PI * 0.5);		
-	blackbutton1mesh.position.set(-405, 200 , -100);		
-	id_rackObject.add(blackbutton1mesh);
-	
-	//blackbutton2
-	const blackbutton2 = new THREE.CylinderGeometry(30, 30, 30, 15);
-	const blackbutton2mesh = new THREE.Mesh(blackbutton2, materialVeryGreyDark);
-	blackbutton2mesh.rotateX(Math.PI * 0.5);
-	blackbutton2mesh.rotateY(Math.PI * 1);
-	blackbutton2mesh.rotateZ(Math.PI * 0.5);		
-	blackbutton2mesh.position.set(-405, 200 , 0);		
-	id_rackObject.add(blackbutton2mesh);	
-	
-	//blackbutton3
-	const blackbutton3 = new THREE.CylinderGeometry(30, 30, 30, 15);
-	const blackbutton3mesh = new THREE.Mesh(blackbutton3, materialVeryGreyDark);
-	blackbutton3mesh.rotateX(Math.PI * 0.5);
-	blackbutton3mesh.rotateY(Math.PI * 1);
-	blackbutton3mesh.rotateZ(Math.PI * 0.5);		
-	blackbutton3mesh.position.set(-405, 200 , 100);		
-	id_rackObject.add(blackbutton3mesh);
-	
-	//yellowbutton
-	const yellowbutton = new THREE.CylinderGeometry(30, 30, 30, 15);
-	const yellowbuttonmesh = new THREE.Mesh(yellowbutton, yellowmaterial);
-	yellowbuttonmesh.rotateX(Math.PI * 0.5);
-	yellowbuttonmesh.rotateY(Math.PI * 1);
-	yellowbuttonmesh.rotateZ(Math.PI * 0.5);		
-	yellowbuttonmesh.position.set(-405, 200 , 200);		
-	id_rackObject.add(yellowbuttonmesh);		
-	
-	//emergencybutton yellow 
-	const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15);
-	const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial);
-	emergencybuttonyellowmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonyellowmesh.rotateY(Math.PI * 1);
-	emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5);		
-	emergencybuttonyellowmesh.position.set(-403, 50 , 150);		
-	id_rackObject.add(emergencybuttonyellowmesh);				
-	
-	//emergencybutton red  
-	const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15);
-	const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
-	emergencybuttonmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonmesh.rotateY(Math.PI * 1);
-	emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
-	emergencybuttonmesh.position.set(-405, 50 , 150);		
-	id_rackObject.add(emergencybuttonmesh);	
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 500);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 900 , -15);
-	id_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 500);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 900 , -15);
-	id_rackObject.add(Rtargetmesh);
-
-	id_rackObject.rotateY(Math.PI);
-	id_rackObject.position.set(400, 950, 300);
-	rid.add(id_rackObject);	
-	return rid;
-}
-
-// Low Level RF Rack
-export function rllrf(param) {
-	const width=800, height=1900, depth=600;
-	const rllrf = new THREE.Object3D();
-	const llrf_rackObject = new THREE.Object3D();
-
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0xa6a6a6});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const materialDark= new THREE.MeshLambertMaterial({color: 0x000000});
-	
+	// Low Level RF Rack
+	export function rllrf(param) {
+		const width=800, height=1900, depth=600;
+		const rllrf = new THREE.Object3D();
+		const llrf_rackObject = new THREE.Object3D();
 
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rllrf.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(1200, 90, 400);
-		rllrf.add(group2);				
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0xa6a6a6});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const materialDark= new THREE.MeshLambertMaterial({color: 0x000000});
 		
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [1000,1270,440], [0, Math.PI / 2, 0]);
 
-	
-	
-	// rack llrf
-	const rrgeometry = new THREE.BoxGeometry(800, 1500, 600);
-	const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark);
-	rrmesh.position.set( 0, 0 , -depth+290);
-	llrf_rackObject.add(rrmesh);
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 550);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -405, 640 , -300);
-	llrf_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 550);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 405, 640 , -300);
-	llrf_rackObject.add(Rtargetmesh);			
-	
-	//handle
-	const handlegeometry = new THREE.BoxGeometry(30, 300, 70);
-	const handlegeometrymesh = new THREE.Mesh(handlegeometry, materialDark);
-	handlegeometrymesh.position.set( -401, 0 , -550);
-	llrf_rackObject.add(handlegeometrymesh);
-
-	llrf_rackObject.rotateY(Math.PI);
-	llrf_rackObject.position.set(600, 750, -depth+500);
-	rllrf.add(llrf_rackObject);
-	
-	return rllrf;
-}
-
-// Bending rack
-export function rpsb(param) {
-	const width=1000, height=2100, depth=1000;
-	const rpsb = new THREE.Object3D();
-	const rpsb_rackObject = new THREE.Object3D();
-	
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rpsb.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(790, 90, -850);
-		rpsb.add(group2);				
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [900, 1925, -180], [0, Math.PI / 2, 0]);		
-
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ac76});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
-	const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
-	const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa});
-	const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	
-	//rack
-	const geometry = new THREE.BoxGeometry(width, height, depth);
-	const rackmesh = new THREE.Mesh(geometry, greenmaterial);
-	rackmesh.position.set( 0, 0 ,0);
-	rpsb_rackObject.add(rackmesh);	
-	
-	//emergencybutton yellow 
-	const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15);
-	const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial);
-	emergencybuttonyellowmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonyellowmesh.rotateY(Math.PI * 1);
-	emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5);		
-	emergencybuttonyellowmesh.position.set(-503, 320 , 0);		
-	rpsb_rackObject.add(emergencybuttonyellowmesh);				
-	
-	//emergencybutton red  
-	const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15);
-	const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
-	emergencybuttonmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonmesh.rotateY(Math.PI * 1);
-	emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
-	emergencybuttonmesh.position.set(-505, 320 , 0);		
-	rpsb_rackObject.add(emergencybuttonmesh);	
-	
-	//base border	
-	const screenbordergeometry = new THREE.BoxGeometry(10, 350, 450);
-	const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
-	screenbordergeometrymesh.position.set( -500, 600 , 0);
-	rpsb_rackObject.add(screenbordergeometrymesh);
-	
-	//screen border	
-	const basebordergeometry = new THREE.BoxGeometry(10,  100, 100);
-	const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial);
-	basebordergeometrymesh.position.set( -501, 700 , 0);
-	rpsb_rackObject.add(basebordergeometrymesh);
-	
-	//screen 	
-	const screengeometry = new THREE.BoxGeometry(10, 80, 80);
-	const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
-	screengeometrymesh.position.set( -502, 700 , 0);
-	rpsb_rackObject.add(screengeometrymesh);		
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 600);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -504, 999 , 0);
-	rpsb_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 600);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 504, 999 , 0);
-	rpsb_rackObject.add(Rtargetmesh);		
-	
-	rpsb_rackObject.rotateY(Math.PI);
-	rpsb_rackObject.position.set(400, 1050, -400);
-	rpsb.add(rpsb_rackObject);	
-	return rpsb;
-}
-
-// PS rack
-export function rps(param) {
-	const width=800, height=2500, depth=600;
-	const psObject = new THREE.Object3D();
-	const rps_rackObject = new THREE.Object3D();
-	const rps = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000b0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rps.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 90, 550);
-		rps.add(group2);			
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000c0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rllrf.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(1200, 90, 400);
+			rllrf.add(group2);				
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [1000,1270,440], [0, Math.PI / 2, 0]);
+
 		
+		
+		// rack llrf
+		const rrgeometry = new THREE.BoxGeometry(800, 1500, 600);
+		const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark);
+		rrmesh.position.set( 0, 0 , -depth+290);
+		llrf_rackObject.add(rrmesh);
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 550);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -405, 640 , -300);
+		llrf_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 550);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 405, 640 , -300);
+		llrf_rackObject.add(Rtargetmesh);			
+		
+		//handle
+		const handlegeometry = new THREE.BoxGeometry(30, 300, 70);
+		const handlegeometrymesh = new THREE.Mesh(handlegeometry, materialDark);
+		handlegeometrymesh.position.set( -401, 0 , -550);
+		llrf_rackObject.add(handlegeometrymesh);
+
+		llrf_rackObject.rotateY(Math.PI);
+		llrf_rackObject.position.set(600, 750, -depth+500);
+		rllrf.add(llrf_rackObject);
+		
+		return rllrf;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
-
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	
-	// rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	rrmesh.position.set( 0, 0 , 0);
-	rps_rackObject.add(rrmesh);		
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -285);
-	rps_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 265);
-	rps_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , -7);
-	rps_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , -7);
-	rps_rackObject.add(ldemesh);				
-
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 600);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rps_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 600);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rps_rackObject.add(Rtargetmesh);				
-
-	// START PS base RED 
-	const basered = new THREE.BoxGeometry(10, 30, 110);
-	const baseredmesh = new THREE.Mesh(basered, redmaterial);
-	baseredmesh.position.set( -401, 1100 , -170);
-	psObject.add(baseredmesh);
-	
-	//  PS base BLUE 
-	const baseblue = new THREE.BoxGeometry(10, 180, 110);
-	const basebluemesh = new THREE.Mesh(baseblue, bluematerial);
-	basebluemesh.position.set( -401, 995 , -170);
-	psObject.add(basebluemesh);			
-
-	//  PS base SILVER 
-	const basesilver = new THREE.BoxGeometry(10, 150, 500);
-	const basesilvermesh = new THREE.Mesh(basesilver, silvermaterial);
-	basesilvermesh.position.set( -401, -300 , 0);
-	rps_rackObject.add(basesilvermesh);			
-	
-	rps_rackObject.add(psObject);
-	
-	//CLONE PS 
 
-	const psA2 = psObject.clone();
-	psA2.position.set( 0, 0 , 120);
-	rps_rackObject.add(psA2);
-	
-	const psA3 = psObject.clone();
-	psA3.position.set( 0, 0 , 240);
-	rps_rackObject.add(psA3);	
-	
-	const psB1 = psObject.clone();
-	psB1.position.set( 0, -220 , 0);
-	rps_rackObject.add(psB1);
-	
-	const psB2 = psObject.clone();
-	psB2.position.set( 0, -220 , 120);
-	rps_rackObject.add(psB2);
-	
-	const psB3 = psObject.clone();
-	psB3.position.set( 0, -220 , 240);
-	rps_rackObject.add(psB3);
-	
-	const psC1 = psObject.clone();
-	psC1.position.set( 0, -440 , 0);
-	rps_rackObject.add(psC1);
-	
-	const psC2 = psObject.clone();
-	psC2.position.set( 0, -440 , 120);
-	rps_rackObject.add(psC2);
-	
-	const psC3 = psObject.clone();
-	psC3.position.set( 0, -440 , 240);
-	rps_rackObject.add(psC3);
-	
-	const psD1 = psObject.clone();
-	psD1.position.set( 0, -660 , 0);
-	rps_rackObject.add(psD1);
-	
-	const psD2 = psObject.clone();
-	psD2.position.set( 0, -660 , 120);
-	rps_rackObject.add(psD2);
-	
-	const psD3 = psObject.clone();
-	psD3.position.set( 0, -660 , 240);
-	rps_rackObject.add(psD3);	
-	
-	const psE1 = psObject.clone();
-	psE1.position.set( 0, -880 , 0);
-	rps_rackObject.add(psE1);
-	
-	const psE2 = psObject.clone();
-	psE2.position.set( 0, -880 , 120);
-	rps_rackObject.add(psE2);
-	
-	const psE3 = psObject.clone();
-	psE3.position.set( 0, -880 , 240);
-	rps_rackObject.add(psE3);		
-	
-	rps_rackObject.rotateY(Math.PI);
-	rps_rackObject.position.set(400, 1250, 300);
-	rps.add(rps_rackObject);	
-	return rps;
-}
-
-
-// Control rack
-export function rc(param) {
-	const width=800, height=2500, depth=600;
-	const rc = new THREE.Object3D();
-	const rc_rackObject = new THREE.Object3D();
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rc.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 90, 550);
-		rc.add(group2);			
+	// Bending rack
+	export function rpsb(param) {
+		const width=1000, height=2100, depth=1000;
+		const rpsb = new THREE.Object3D();
+		const rpsb_rackObject = new THREE.Object3D();
 		
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rpsb.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(790, 90, -850);
+			rpsb.add(group2);				
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [900, 1930, -850], [0, Math.PI / 2, 0]);		
+
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ac76});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
+		const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
+		const materialThightblue = new THREE.MeshLambertMaterial({color: 0x96a5fa});
+		const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		
+		//rack
+		const geometry = new THREE.BoxGeometry(width, height, depth);
+		const rackmesh = new THREE.Mesh(geometry, greenmaterial);
+		rackmesh.position.set( 0, 0 ,0);
+		rpsb_rackObject.add(rackmesh);	
+		
+		//emergencybutton yellow 
+		const emergencybuttonyellow = new THREE.CylinderGeometry(70, 70, 5, 15);
+		const emergencybuttonyellowmesh = new THREE.Mesh(emergencybuttonyellow, yellowmaterial);
+		emergencybuttonyellowmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonyellowmesh.rotateY(Math.PI * 1);
+		emergencybuttonyellowmesh.rotateZ(Math.PI * 0.5);		
+		emergencybuttonyellowmesh.position.set(-503, 320 , 0);		
+		rpsb_rackObject.add(emergencybuttonyellowmesh);				
+		
+		//emergencybutton red  
+		const emergencybutton = new THREE.CylinderGeometry(50, 50, 30, 15);
+		const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
+		emergencybuttonmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonmesh.rotateY(Math.PI * 1);
+		emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
+		emergencybuttonmesh.position.set(-505, 320 , 0);		
+		rpsb_rackObject.add(emergencybuttonmesh);	
+		
+		//base border	
+		const screenbordergeometry = new THREE.BoxGeometry(10, 350, 450);
+		const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
+		screenbordergeometrymesh.position.set( -500, 600 , 0);
+		rpsb_rackObject.add(screenbordergeometrymesh);
+		
+		//screen border	
+		const basebordergeometry = new THREE.BoxGeometry(10,  100, 100);
+		const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial);
+		basebordergeometrymesh.position.set( -501, 700 , 0);
+		rpsb_rackObject.add(basebordergeometrymesh);
+		
+		//screen 	
+		const screengeometry = new THREE.BoxGeometry(10, 80, 80);
+		const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
+		screengeometrymesh.position.set( -502, 700 , 0);
+		rpsb_rackObject.add(screengeometrymesh);		
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 600);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -504, 999 , 0);
+		rpsb_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 600);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 504, 999 , 0);
+		rpsb_rackObject.add(Rtargetmesh);		
+		
+		rpsb_rackObject.rotateY(Math.PI);
+		//rpsb_rackObject.position.set(400, 1050, -400);
+		rpsb_rackObject.position.set(width/2, height/2, depth/2);
+		rpsb.add(rpsb_rackObject);	
+		return rpsb;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
 
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	
-	//rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	rrmesh.position.set( 0, 0 , -10);
-	rc_rackObject.add(rrmesh);		
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 500);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rc_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 500);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rc_rackObject.add(Rtargetmesh);				
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -285);
-	rc_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 265);
-	rc_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , -7);
-	rc_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , -7);
-	rc_rackObject.add(ldemesh);				
-
-
-	//borderEC down
-	const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
-	const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
-	borderECgeometrymesh.position.set( -400, -250 , -10);
-	rc_rackObject.add(borderECgeometrymesh);
-	
-	//EC1 down
-	const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
-	EC1geometrymesh.position.set( -402, -250 , -200);
-	rc_rackObject.add(EC1geometrymesh);			
-	//EC2 down
-	const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
-	EC2geometrymesh.position.set( -402, -250 , -150);
-	rc_rackObject.add(EC2geometrymesh);			
-	//EC2 down
-	const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
-	EC3geometrymesh.position.set( -402, -250 , -100);
-	rc_rackObject.add(EC3geometrymesh);		
-	
-	//borderEC up
-	const borderupECgeometry = new THREE.BoxGeometry(10, 400, 600);
-	const borderupECgeometrymesh = new THREE.Mesh(borderupECgeometry, materialGreyDark);
-	borderupECgeometrymesh.position.set( -400, 250 , -10);
-	rc_rackObject.add(borderupECgeometrymesh);
-	
-	//EC1 up
-	const EC1geometryup = new THREE.BoxGeometry(10, 350, 40);
-	const EC1geometryupmesh = new THREE.Mesh(EC1geometryup, materialGreyMedium);
-	EC1geometryupmesh.position.set( -402, 250 , -200);
-	rc_rackObject.add(EC1geometryupmesh);			
-	//EC2 up
-	const EC2geometryup = new THREE.BoxGeometry(10, 350, 40);
-	const EC2geometryupmesh = new THREE.Mesh(EC2geometryup, materialGreyMedium);
-	EC2geometryupmesh.position.set( -402, 250 , -150);
-	rc_rackObject.add(EC2geometryupmesh);			
-	//EC2 up
-	const EC3geometryup = new THREE.BoxGeometry(10, 350, 40);
-	const EC3geometryupmesh = new THREE.Mesh(EC3geometryup, materialGreyMedium);
-	EC3geometryupmesh.position.set( -402, 250 , -100);
-	rc_rackObject.add(EC3geometryupmesh);				
-	
-	rc_rackObject.rotateY(Math.PI);
-	rc_rackObject.position.set(400, 1250, 300);
-	rc.add(rc_rackObject);	
-	return rc;
-}
-
-// diagnostic rack
-export function rd(param) {
-	const width=800, height=2500, depth=600;
-	const rd = new THREE.Object3D();
-	const rd_rackObject = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rd.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 90, 550);
-		rd.add(group2);			
+	// PS rack
+	export function rps(param) {
+		const width=800, height=2500, depth=600;
+		const psObject = new THREE.Object3D();
+		const rps_rackObject = new THREE.Object3D();
+		const rps = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000b0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rps.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 90, 550);
+			rps.add(group2);			
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
+	
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const screenmaterial = new THREE.MeshLambertMaterial({color: 0xdeebff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
 		
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850, 2330, 500], [0, Math.PI / 2, 0]);
-	
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	
-	//rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	rrmesh.position.set( 0, 0 , -10);
-	rd_rackObject.add(rrmesh);		
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 500);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rd_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 500);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rd_rackObject.add(Rtargetmesh);				
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -285);
-	rd_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 265);
-	rd_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , -7);
-	rd_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , -7);
-	rd_rackObject.add(ldemesh);				
-
-
-	//borderEC 
-	const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
-	const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
-	borderECgeometrymesh.position.set( -400, 0 , -10);
-	rd_rackObject.add(borderECgeometrymesh);
-	
-	//EC1 
-	const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
-	EC1geometrymesh.position.set( -402, 0 , -200);
-	rd_rackObject.add(EC1geometrymesh);			
-	//EC2 
-	const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
-	EC2geometrymesh.position.set( -402, 0 , -150);
-	rd_rackObject.add(EC2geometrymesh);			
-	//EC2 
-	const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
-	EC3geometrymesh.position.set( -402, 0 , -100);
-	rd_rackObject.add(EC3geometrymesh);		
-	
-	//libera 1
-	const libera1geometry = new THREE.BoxGeometry(10, 100, 600);
-	const libera1geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera1geometrymesh.position.set( -400, 900 , -10);
-	rd_rackObject.add(libera1geometrymesh);		
-	
-	//libera 2
-	const libera2geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera2geometrymesh.position.set( -400, 750 , -10);
-	rd_rackObject.add(libera2geometrymesh);				
-	
-	//libera 3
-	const libera3geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera3geometrymesh.position.set( -400, 600 , -10);
-	rd_rackObject.add(libera3geometrymesh);			
-	
-	//libera 4
-	const libera4geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera4geometrymesh.position.set( -400, -600 , -10);
-	rd_rackObject.add(libera4geometrymesh);			
-	
-	//libera 5
-	const libera5geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera5geometrymesh.position.set( -400, -750 , -10);
-	rd_rackObject.add(libera5geometrymesh);			
-	
-	//libera 6
-	const libera6geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
-	libera6geometrymesh.position.set( -400, -900 , -10);
-	rd_rackObject.add(libera6geometrymesh);	
-
-	rd_rackObject.rotateY(Math.PI);
-	rd_rackObject.position.set(400, 1250, 300);
-	rd.add(rd_rackObject);	
-	return rd;
-}		
-
-// RRP rack
-export function rrp(param) {
-	const width=800, height=2500, depth=600;
-	const rrp = new THREE.Object3D();
-	const rrp_rackObject = new THREE.Object3D();
-	const blackbaseObject = new THREE.Object3D();
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rrp.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 90, 1200);
-		rrp.add(group2);			
+		// rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		rrmesh.position.set( 0, 0 , 0);
+		rps_rackObject.add(rrmesh);		
 		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -285);
+		rps_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 265);
+		rps_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , -7);
+		rps_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , -7);
+		rps_rackObject.add(ldemesh);				
+
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 600);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rps_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 600);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rps_rackObject.add(Rtargetmesh);				
+	
+		// START PS base RED 
+		const basered = new THREE.BoxGeometry(10, 30, 110);
+		const baseredmesh = new THREE.Mesh(basered, redmaterial);
+		baseredmesh.position.set( -401, 1100 , -170);
+		psObject.add(baseredmesh);
+		
+		//  PS base BLUE 
+		const baseblue = new THREE.BoxGeometry(10, 180, 110);
+		const basebluemesh = new THREE.Mesh(baseblue, bluematerial);
+		basebluemesh.position.set( -401, 995 , -170);
+		psObject.add(basebluemesh);			
+
+		//  PS base SILVER 
+		const basesilver = new THREE.BoxGeometry(10, 150, 500);
+		const basesilvermesh = new THREE.Mesh(basesilver, silvermaterial);
+		basesilvermesh.position.set( -401, -300 , 0);
+		rps_rackObject.add(basesilvermesh);			
+		
+		rps_rackObject.add(psObject);
+		
+		//CLONE PS 
+
+		const psA2 = psObject.clone();
+		psA2.position.set( 0, 0 , 120);
+		rps_rackObject.add(psA2);
+		
+		const psA3 = psObject.clone();
+		psA3.position.set( 0, 0 , 240);
+		rps_rackObject.add(psA3);	
+		
+		const psB1 = psObject.clone();
+		psB1.position.set( 0, -220 , 0);
+		rps_rackObject.add(psB1);
+		
+		const psB2 = psObject.clone();
+		psB2.position.set( 0, -220 , 120);
+		rps_rackObject.add(psB2);
+		
+		const psB3 = psObject.clone();
+		psB3.position.set( 0, -220 , 240);
+		rps_rackObject.add(psB3);
+		
+		const psC1 = psObject.clone();
+		psC1.position.set( 0, -440 , 0);
+		rps_rackObject.add(psC1);
+		
+		const psC2 = psObject.clone();
+		psC2.position.set( 0, -440 , 120);
+		rps_rackObject.add(psC2);
+		
+		const psC3 = psObject.clone();
+		psC3.position.set( 0, -440 , 240);
+		rps_rackObject.add(psC3);
+		
+		const psD1 = psObject.clone();
+		psD1.position.set( 0, -660 , 0);
+		rps_rackObject.add(psD1);
+		
+		const psD2 = psObject.clone();
+		psD2.position.set( 0, -660 , 120);
+		rps_rackObject.add(psD2);
+		
+		const psD3 = psObject.clone();
+		psD3.position.set( 0, -660 , 240);
+		rps_rackObject.add(psD3);	
+		
+		const psE1 = psObject.clone();
+		psE1.position.set( 0, -880 , 0);
+		rps_rackObject.add(psE1);
+		
+		const psE2 = psObject.clone();
+		psE2.position.set( 0, -880 , 120);
+		rps_rackObject.add(psE2);
+		
+		const psE3 = psObject.clone();
+		psE3.position.set( 0, -880 , 240);
+		rps_rackObject.add(psE3);		
+		
+		rps_rackObject.rotateY(Math.PI);
+		rps_rackObject.position.set(400, 1250, 300);
+		rps.add(rps_rackObject);	
+		return rps;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
-	}
-	insertText(50, [850, 2330, 800], [0, Math.PI / 2, 0]);			
-	
-	// rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	rrmesh.position.set( 0, 0 , -10);
-	rrp_rackObject.add(rrmesh);	
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 500);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rrp_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 500);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rrp_rackObject.add(Rtargetmesh);			
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -285);
-	rrp_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 265);
-	rrp_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , -7);
-	rrp_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , -7);
-	rrp_rackObject.add(ldemesh);				
-
-	// blackbase 1
-	const black1geometry = new THREE.BoxGeometry(3, 200, 550);
-	const black1geometrymesh = new THREE.Mesh(black1geometry, blackmaterial);
-	black1geometrymesh.position.set( -402, 1000 , 0);
-	rrp_rackObject.add(black1geometrymesh);			
-	
-	// blackbase 2
-	const black2geometry = new THREE.BoxGeometry(3, 200, 550);
-	const black2geometrymesh = new THREE.Mesh(black2geometry, blackmaterial);
-	black2geometrymesh.position.set( -402, 780 , 0);
-	rrp_rackObject.add(black2geometrymesh);		
-	
-	// blackbase 3
-	const black3geometry = new THREE.BoxGeometry(3, 200, 550);
-	const black3geometrymesh = new THREE.Mesh(black3geometry, blackmaterial);
-	black3geometrymesh.position.set( -402, 560 , 0);
-	rrp_rackObject.add(black3geometrymesh);	
-	
-	// blackbase 4
-	const black4geometry = new THREE.BoxGeometry(3, 200, 550);
-	const black4geometrymesh = new THREE.Mesh(black4geometry, blackmaterial);
-	black4geometrymesh.position.set( -402, 340 , 0);
-	blackbaseObject.add(black4geometrymesh);
-	
-	const square1geometry = new THREE.BoxGeometry(3, 70, 70);
-	const square1geometrymesh = new THREE.Mesh(square1geometry, silvermaterial);
-	square1geometrymesh.position.set( -403, 340 , -100);
-	blackbaseObject.add(square1geometrymesh);		
-	
-	const square2geometry = new THREE.BoxGeometry(3, 70, 70);
-	const square2geometrymesh = new THREE.Mesh(square2geometry, silvermaterial);
-	square2geometrymesh.position.set( -403, 340 , 100);
-	blackbaseObject.add(square2geometrymesh);			
-	 
-	//CLONE PS 
-
-	const psA2 = blackbaseObject.clone();
-	psA2.position.set( 0, -220 , 0);
-	rrp_rackObject.add(psA2);
-	
-	const psA3 = blackbaseObject.clone();
-	psA3.position.set( 0, -440 , 0);
-	rrp_rackObject.add(psA3);			
-	
-	rrp_rackObject.add(blackbaseObject);
-	
-	// silverbase 
-	const silvergeometry = new THREE.BoxGeometry(3, 200, 550);
-	const silvergeometrymesh = new THREE.Mesh(silvergeometry, silvermaterial);
-	silvergeometrymesh.position.set( -402, -320 , 0);
-	rrp_rackObject.add(silvergeometrymesh);
-	
-	//lastblack
-	
-	const black5geometry = new THREE.BoxGeometry(3, 780, 550);
-	const black5geometrymesh = new THREE.Mesh(black5geometry, blackmaterial);
-	black5geometrymesh.position.set( -402, -830 , 0);
-	rrp_rackObject.add(black5geometrymesh);				
+
+
+	// Control rack
+	export function rc(param) {
+		const width=800, height=2500, depth=600;
+		const rc = new THREE.Object3D();
+		const rc_rackObject = new THREE.Object3D();
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rc.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 90, 550);
+			rc.add(group2);			
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 550], [0, Math.PI / 2, 0]);
 	
-	rrp_rackObject.rotateY(Math.PI);
-	rrp_rackObject.position.set(400, 1250, depth);
-	rrp.add(rrp_rackObject);	
-	return rrp;
-}
-
-// RAR 1 - 2 - 3
-export function rar1(param) {
-	const width=800, height=2500, depth=800;
-	const rar = new THREE.Object3D();
-	const kly_rackObject = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rar.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 80, 750);
-		rar.add(group2);
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		
+		//rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		rrmesh.position.set( 0, 0 , -10);
+		rc_rackObject.add(rrmesh);		
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 500);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rc_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 500);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rc_rackObject.add(Rtargetmesh);				
+		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -285);
+		rc_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 265);
+		rc_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , -7);
+		rc_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , -7);
+		rc_rackObject.add(ldemesh);				
+
+	
+		//borderEC down
+		const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
+		const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
+		borderECgeometrymesh.position.set( -400, -250 , -10);
+		rc_rackObject.add(borderECgeometrymesh);
+		
+		//EC1 down
+		const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
+		EC1geometrymesh.position.set( -402, -250 , -200);
+		rc_rackObject.add(EC1geometrymesh);			
+		//EC2 down
+		const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
+		EC2geometrymesh.position.set( -402, -250 , -150);
+		rc_rackObject.add(EC2geometrymesh);			
+		//EC2 down
+		const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
+		EC3geometrymesh.position.set( -402, -250 , -100);
+		rc_rackObject.add(EC3geometrymesh);		
+		
+		//borderEC up
+		const borderupECgeometry = new THREE.BoxGeometry(10, 400, 600);
+		const borderupECgeometrymesh = new THREE.Mesh(borderupECgeometry, materialGreyDark);
+		borderupECgeometrymesh.position.set( -400, 250 , -10);
+		rc_rackObject.add(borderupECgeometrymesh);
+		
+		//EC1 up
+		const EC1geometryup = new THREE.BoxGeometry(10, 350, 40);
+		const EC1geometryupmesh = new THREE.Mesh(EC1geometryup, materialGreyMedium);
+		EC1geometryupmesh.position.set( -402, 250 , -200);
+		rc_rackObject.add(EC1geometryupmesh);			
+		//EC2 up
+		const EC2geometryup = new THREE.BoxGeometry(10, 350, 40);
+		const EC2geometryupmesh = new THREE.Mesh(EC2geometryup, materialGreyMedium);
+		EC2geometryupmesh.position.set( -402, 250 , -150);
+		rc_rackObject.add(EC2geometryupmesh);			
+		//EC2 up
+		const EC3geometryup = new THREE.BoxGeometry(10, 350, 40);
+		const EC3geometryupmesh = new THREE.Mesh(EC3geometryup, materialGreyMedium);
+		EC3geometryupmesh.position.set( -402, 250 , -100);
+		rc_rackObject.add(EC3geometryupmesh);				
+		
+		rc_rackObject.rotateY(Math.PI);
+		rc_rackObject.position.set(400, 1250, 300);
+		rc.add(rc_rackObject);	
+		return rc;
 	}
-	insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
-
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});	
-	
-	//right rack
-	const lrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
-	lrmesh.position.set(0 , 0 , 0);
-	kly_rackObject.add(lrmesh);
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 700);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	kly_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 700);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	kly_rackObject.add(Rtargetmesh);			
-	
-	//edge rle		
-	const rlegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
-	rlemesh.position.set( -425, 0 , -370);
-	kly_rackObject.add(rlemesh);	
-	
-	//edge rre		
-	const rregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
-	rremesh.position.set( -425, 0 , 375);
-	kly_rackObject.add(rremesh);		
-	
-	//edge rue		
-	const ruegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
-	ruemesh.position.set( -425, 1225 , 0);
-	kly_rackObject.add(ruemesh);			
-	
-	//edge rde		
-	const rdegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
-	rdemesh.position.set( -425, -1230 , 0);
-	kly_rackObject.add(rdemesh);
-	
-	//drawer1	rack right	
-	const drawer1rrgeometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer1rrgeometrymesh = new THREE.Mesh(drawer1rrgeometry, materialGreyDark);
-	drawer1rrgeometrymesh.position.set( -400, 1000 , 0);
-	kly_rackObject.add(drawer1rrgeometrymesh);
-	
-	//display right rack		
-	const display1rrgeometry = new THREE.BoxGeometry(50, 50, 150);
-	const display1rrgeometrymesh = new THREE.Mesh(display1rrgeometry, materialVeryGreyDark);
-	display1rrgeometrymesh.position.set( -400, 1000 , 0);
-	kly_rackObject.add(display1rrgeometrymesh);	
-	
-	//GreenLed1  right rack
-	const greenled1rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled1rrmesh = new THREE.Mesh(greenled1rr, greenmaterial);
-	greenled1rrmesh.position.set(-400, 1050 , 200);		
-	kly_rackObject.add(greenled1rrmesh);	
-	
-	//GreenLed2 right rack
-	const greenled2rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled2rrmesh = new THREE.Mesh(greenled2rr, greenmaterial);
-	greenled2rrmesh.position.set(-400, 1000 , 200);		
-	kly_rackObject.add(greenled2rrmesh);
-	
-	//GreenLed3 right rack
-	const greenled3rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled3rrmesh = new THREE.Mesh(greenled3rr, greenmaterial);
-	greenled3rrmesh.position.set(-400, 950 , 200);		
-	kly_rackObject.add(greenled3rrmesh);
-	
-	//drawer2	rack right	
-	const drawer2rrgeometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer2rrgeometrymesh = new THREE.Mesh(drawer2rrgeometry, materialGreyDark);
-	drawer2rrgeometrymesh.position.set( -400, 700 , 0);
-	kly_rackObject.add(drawer2rrgeometrymesh);
-	
-	//blackbutton1  right rack
-	const blackled1rr = new THREE.SphereGeometry(30, 10, 10);
-	const blackled1rrmesh = new THREE.Mesh(blackled1rr, materialVeryGreyDark);
-	blackled1rrmesh.position.set(-400, 750 , -200);		
-	kly_rackObject.add(blackled1rrmesh);		
-
-	//blackbutton2  right rack
-	const blackled2rr = new THREE.SphereGeometry(30, 10, 10);
-	const blackled2rrmesh = new THREE.Mesh(blackled2rr, materialVeryGreyDark);
-	blackled2rrmesh.position.set(-400, 670 , -200);		
-	kly_rackObject.add(blackled2rrmesh);
-	
-	//GreenLED1  right rack
-	const greenled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10);
-	const greenled1rrdrawer2rmesh = new THREE.Mesh(greenled1rrdrawer2, greenmaterial);
-	greenled1rrdrawer2rmesh.position.set(-400, 750 , -50);		
-	kly_rackObject.add(greenled1rrdrawer2rmesh);
-	
-	//yellowLED1  right rack
-	const yellowled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10);
-	const yellowled1rrdrawer2rmesh = new THREE.Mesh(yellowled1rrdrawer2, yellowmaterial);
-	yellowled1rrdrawer2rmesh.position.set(-400, 750 , 30);		
-	kly_rackObject.add(yellowled1rrdrawer2rmesh);
-	
-	//emergencyLED1  right rack
-	const emergencybutton = new THREE.CylinderGeometry(70, 10, 10);
-	const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
-	emergencybuttonmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonmesh.rotateY(Math.PI * 1);
-	emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
-	emergencybuttonmesh.position.set(-405, 700 , 150);		
-	kly_rackObject.add(emergencybuttonmesh);			
-	
-	//drawer3	rack right	
-	const drawer3rrgeometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer3rrgeometrymesh = new THREE.Mesh(drawer3rrgeometry, materialGreyMedium);
-	drawer3rrgeometrymesh.position.set( -400, 400 , 0);
-	kly_rackObject.add(drawer3rrgeometrymesh);		
-	
-	//darkscreen	rack right	
-	const darkscreenrrgeometry = new THREE.BoxGeometry(10, 150, 270);
-	const darkscreenrrgeometrymesh = new THREE.Mesh(darkscreenrrgeometry, materialVeryGreyDark);
-	darkscreenrrgeometrymesh.position.set( -402, 400 , -120);
-	kly_rackObject.add(darkscreenrrgeometrymesh);
-	
-	//drawer4	rack right	
-	const drawer4rrgeometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer4rrgeometrymesh = new THREE.Mesh(drawer4rrgeometry, materialGreyDark);
-	drawer4rrgeometrymesh.position.set( -400, 100 , 0);
-	kly_rackObject.add(drawer4rrgeometrymesh);
-	
-	//drawer4 dark	rack right	
-	const drawer4darkrrgeometry = new THREE.BoxGeometry(10, 220, 500);
-	const drawer4darkrrgeometrymesh = new THREE.Mesh(drawer4darkrrgeometry, materialVeryGreyDark);
-	drawer4darkrrgeometrymesh.position.set( -402, 100 , 50);
-	kly_rackObject.add(drawer4darkrrgeometrymesh);			
-
-	//GreenLed1 drawer4  right rack
-	const greenled1drawer4rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled1drawer4rrmesh = new THREE.Mesh(greenled1drawer4rr, greenmaterial);
-	greenled1drawer4rrmesh.position.set(-400, 150 , -250);		
-	kly_rackObject.add(greenled1drawer4rrmesh);	
-	
-	//GreenLed2 drawer4 right rack
-	const greenled2drawer4rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled2drawer4rrmesh = new THREE.Mesh(greenled2drawer4rr, greenmaterial);
-	greenled2drawer4rrmesh.position.set(-400, 100 , -250);		
-	kly_rackObject.add(greenled2drawer4rrmesh);
-	
-	//GreenLed3 drawer4 right rack
-	const greenled3drawer4rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenled3drawer4rrmesh = new THREE.Mesh(greenled3drawer4rr, greenmaterial);
-	greenled3drawer4rrmesh.position.set(-400, 50 , -250);		
-	kly_rackObject.add(greenled3drawer4rrmesh);
-	
-	//RdLed1 drawer4  right rack
-	const greenred1drawer4rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenred1drawer4rrmesh = new THREE.Mesh(greenred1drawer4rr, redmaterial);
-	greenred1drawer4rrmesh.position.set(-400, 150 , 180);		
-	kly_rackObject.add(greenred1drawer4rrmesh);	
-	
-	//RdLed1 drawer4 right rack
-	const greenred2drawer4rr = new THREE.SphereGeometry(13, 10, 10);
-	const greenred2drawer4rrmesh = new THREE.Mesh(greenred2drawer4rr, redmaterial);
-	greenred2drawer4rrmesh.position.set(-400, 100 , 180);		
-	kly_rackObject.add(greenred2drawer4rrmesh);		
-	
-	//drawer5	rack right	
-	const drawer5rrgeometry = new THREE.BoxGeometry(10, 350, 630);
-	const drawer5rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark);
-	drawer5rrgeometrymesh.position.set( -400, -250 , 0);
-	kly_rackObject.add(drawer5rrgeometrymesh);
-	
-	//display1 drawer5 rack right 		
-	const display1drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display1drawer5rrgeometrymesh = new THREE.Mesh(display1drawer5rrgeometry, materialVeryGreyDark);
-	display1drawer5rrgeometrymesh.position.set( -402, -120 , 0);
-	kly_rackObject.add(display1drawer5rrgeometrymesh);			
-	
-	//display2 drawer5 rack right 		
-	const display2drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display2drawer5rrgeometrymesh = new THREE.Mesh(display2drawer5rrgeometry, materialVeryGreyDark);
-	display2drawer5rrgeometrymesh.position.set( -402, -200 , 0);
-	kly_rackObject.add(display2drawer5rrgeometrymesh);			
-	
-	//display3 drawer5 rack right 		
-	const display3drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display3drawer5rrgeometrymesh = new THREE.Mesh(display3drawer5rrgeometry, materialVeryGreyDark);
-	display3drawer5rrgeometrymesh.position.set( -402, -280 , 0);
-	kly_rackObject.add(display3drawer5rrgeometrymesh);	
-	
-	//display4 drawer5 rack right 		
-	const display4drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display4drawer5rrgeometrymesh = new THREE.Mesh(display4drawer5rrgeometry, materialVeryGreyDark);
-	display4drawer5rrgeometrymesh.position.set( -402, -360 , 0);
-	kly_rackObject.add(display4drawer5rrgeometrymesh);			
-	
-	//drawer6	rack right	
-	const drawer6rrgeometry = new THREE.BoxGeometry(10, 350, 630);
-	const drawer6rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark);
-	drawer6rrgeometrymesh.position.set( -400, -650 , 0);
-	kly_rackObject.add(drawer6rrgeometrymesh);		
-	
-	//display1 drawer6 rack right 		
-	const display1drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display1drawer6rrgeometrymesh = new THREE.Mesh(display1drawer6rrgeometry, materialVeryGreyDark);
-	display1drawer6rrgeometrymesh.position.set( -402, -570 , 0);
-	kly_rackObject.add(display1drawer6rrgeometrymesh);			
-	
-	//display2 drawer6 rack right 		
-	const display2drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150);
-	const display2drawer6rrgeometrymesh = new THREE.Mesh(display2drawer6rrgeometry, materialVeryGreyDark);
-	display2drawer6rrgeometrymesh.position.set( -402, -650 , 0);
-	kly_rackObject.add(display2drawer6rrgeometrymesh);					
-
-	kly_rackObject.rotateY(Math.PI);
-	kly_rackObject.position.set(400, 1250, 400);
-	rar.add(kly_rackObject);	
-	return rar;
-}
-
-// RAR2
-export function rar2(param) {
-	const width=800, height=2500, depth=800;
-	const rar2 = new THREE.Object3D();
-	const kly_rackObject = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rar2.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 80, 750);
-		rar2.add(group2);
+
+	// diagnostic rack
+	export function rd(param) {
+		const width=800, height=2500, depth=600;
+		const rd = new THREE.Object3D();
+		const rd_rackObject = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rd.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 90, 550);
+			rd.add(group2);			
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 500], [0, Math.PI / 2, 0]);
+		
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		
+		//rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		rrmesh.position.set( 0, 0 , -10);
+		rd_rackObject.add(rrmesh);		
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 500);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rd_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 500);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rd_rackObject.add(Rtargetmesh);				
+		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -285);
+		rd_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 265);
+		rd_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , -7);
+		rd_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , -7);
+		rd_rackObject.add(ldemesh);				
+
+	
+		//borderEC 
+		const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
+		const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
+		borderECgeometrymesh.position.set( -400, 0 , -10);
+		rd_rackObject.add(borderECgeometrymesh);
+		
+		//EC1 
+		const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
+		EC1geometrymesh.position.set( -402, 0 , -200);
+		rd_rackObject.add(EC1geometrymesh);			
+		//EC2 
+		const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
+		EC2geometrymesh.position.set( -402, 0 , -150);
+		rd_rackObject.add(EC2geometrymesh);			
+		//EC2 
+		const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
+		EC3geometrymesh.position.set( -402, 0 , -100);
+		rd_rackObject.add(EC3geometrymesh);		
+		
+		//libera 1
+		const libera1geometry = new THREE.BoxGeometry(10, 100, 600);
+		const libera1geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera1geometrymesh.position.set( -400, 900 , -10);
+		rd_rackObject.add(libera1geometrymesh);		
+		
+		//libera 2
+		const libera2geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera2geometrymesh.position.set( -400, 750 , -10);
+		rd_rackObject.add(libera2geometrymesh);				
+		
+		//libera 3
+		const libera3geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera3geometrymesh.position.set( -400, 600 , -10);
+		rd_rackObject.add(libera3geometrymesh);			
+		
+		//libera 4
+		const libera4geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera4geometrymesh.position.set( -400, -600 , -10);
+		rd_rackObject.add(libera4geometrymesh);			
+		
+		//libera 5
+		const libera5geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera5geometrymesh.position.set( -400, -750 , -10);
+		rd_rackObject.add(libera5geometrymesh);			
+		
+		//libera 6
+		const libera6geometrymesh = new THREE.Mesh(libera1geometry, materialGreyMedium);
+		libera6geometrymesh.position.set( -400, -900 , -10);
+		rd_rackObject.add(libera6geometrymesh);	
+
+		rd_rackObject.rotateY(Math.PI);
+		rd_rackObject.position.set(400, 1250, 300);
+		rd.add(rd_rackObject);	
+		return rd;
+	}		
+
+	// RRP rack
+	export function rrp(param) {
+		const width=800, height=2500, depth=600;
+		const rrp = new THREE.Object3D();
+		const rrp_rackObject = new THREE.Object3D();
+		const blackbaseObject = new THREE.Object3D();
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rrp.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 90, 1200);
+			rrp.add(group2);			
+			
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 800], [0, Math.PI / 2, 0]);			
+		
+		// rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		rrmesh.position.set( 0, 0 , -10);
+		rrp_rackObject.add(rrmesh);	
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 500);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rrp_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 500);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rrp_rackObject.add(Rtargetmesh);			
+		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -285);
+		rrp_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 265);
+		rrp_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , -7);
+		rrp_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , -7);
+		rrp_rackObject.add(ldemesh);				
+	
+		// blackbase 1
+		const black1geometry = new THREE.BoxGeometry(3, 200, 550);
+		const black1geometrymesh = new THREE.Mesh(black1geometry, blackmaterial);
+		black1geometrymesh.position.set( -402, 1000 , 0);
+		rrp_rackObject.add(black1geometrymesh);			
+		
+		// blackbase 2
+		const black2geometry = new THREE.BoxGeometry(3, 200, 550);
+		const black2geometrymesh = new THREE.Mesh(black2geometry, blackmaterial);
+		black2geometrymesh.position.set( -402, 780 , 0);
+		rrp_rackObject.add(black2geometrymesh);		
+		
+		// blackbase 3
+		const black3geometry = new THREE.BoxGeometry(3, 200, 550);
+		const black3geometrymesh = new THREE.Mesh(black3geometry, blackmaterial);
+		black3geometrymesh.position.set( -402, 560 , 0);
+		rrp_rackObject.add(black3geometrymesh);	
+		
+		// blackbase 4
+		const black4geometry = new THREE.BoxGeometry(3, 200, 550);
+		const black4geometrymesh = new THREE.Mesh(black4geometry, blackmaterial);
+		black4geometrymesh.position.set( -402, 340 , 0);
+		blackbaseObject.add(black4geometrymesh);
+		
+		const square1geometry = new THREE.BoxGeometry(3, 70, 70);
+		const square1geometrymesh = new THREE.Mesh(square1geometry, silvermaterial);
+		square1geometrymesh.position.set( -403, 340 , -100);
+		blackbaseObject.add(square1geometrymesh);		
+		
+		const square2geometry = new THREE.BoxGeometry(3, 70, 70);
+		const square2geometrymesh = new THREE.Mesh(square2geometry, silvermaterial);
+		square2geometrymesh.position.set( -403, 340 , 100);
+		blackbaseObject.add(square2geometrymesh);			
+		 
+		//CLONE PS 
+
+		const psA2 = blackbaseObject.clone();
+		psA2.position.set( 0, -220 , 0);
+		rrp_rackObject.add(psA2);
+		
+		const psA3 = blackbaseObject.clone();
+		psA3.position.set( 0, -440 , 0);
+		rrp_rackObject.add(psA3);			
+		
+		rrp_rackObject.add(blackbaseObject);
+		
+		// silverbase 
+		const silvergeometry = new THREE.BoxGeometry(3, 200, 550);
+		const silvergeometrymesh = new THREE.Mesh(silvergeometry, silvermaterial);
+		silvergeometrymesh.position.set( -402, -320 , 0);
+		rrp_rackObject.add(silvergeometrymesh);
+		
+		//lastblack
+		
+		const black5geometry = new THREE.BoxGeometry(3, 780, 550);
+		const black5geometrymesh = new THREE.Mesh(black5geometry, blackmaterial);
+		black5geometrymesh.position.set( -402, -830 , 0);
+		rrp_rackObject.add(black5geometrymesh);				
+		
+		rrp_rackObject.rotateY(Math.PI);
+		rrp_rackObject.position.set(400, 1250, depth);
+		rrp.add(rrp_rackObject);	
+		return rrp;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+
+	// RAR 1 - 2 - 3
+	export function rar1(param) {
+		const width=800, height=2500, depth=800;
+		const rar = new THREE.Object3D();
+		const kly_rackObject = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rar.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 80, 750);
+			rar.add(group2);
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
+	
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});	
+		
+		//right rack
+		const lrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
+		lrmesh.position.set(0 , 0 , 0);
+		kly_rackObject.add(lrmesh);
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 700);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		kly_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 700);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		kly_rackObject.add(Rtargetmesh);			
+		
+		//edge rle		
+		const rlegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
+		rlemesh.position.set( -425, 0 , -370);
+		kly_rackObject.add(rlemesh);	
+		
+		//edge rre		
+		const rregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
+		rremesh.position.set( -425, 0 , 375);
+		kly_rackObject.add(rremesh);		
+		
+		//edge rue		
+		const ruegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
+		ruemesh.position.set( -425, 1225 , 0);
+		kly_rackObject.add(ruemesh);			
+		
+		//edge rde		
+		const rdegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
+		rdemesh.position.set( -425, -1230 , 0);
+		kly_rackObject.add(rdemesh);
+		
+		//drawer1	rack right	
+		const drawer1rrgeometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer1rrgeometrymesh = new THREE.Mesh(drawer1rrgeometry, materialGreyDark);
+		drawer1rrgeometrymesh.position.set( -400, 1000 , 0);
+		kly_rackObject.add(drawer1rrgeometrymesh);
+		
+		//display right rack		
+		const display1rrgeometry = new THREE.BoxGeometry(50, 50, 150);
+		const display1rrgeometrymesh = new THREE.Mesh(display1rrgeometry, materialVeryGreyDark);
+		display1rrgeometrymesh.position.set( -400, 1000 , 0);
+		kly_rackObject.add(display1rrgeometrymesh);	
+		
+		//GreenLed1  right rack
+		const greenled1rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled1rrmesh = new THREE.Mesh(greenled1rr, greenmaterial);
+		greenled1rrmesh.position.set(-400, 1050 , 200);		
+		kly_rackObject.add(greenled1rrmesh);	
+		
+		//GreenLed2 right rack
+		const greenled2rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled2rrmesh = new THREE.Mesh(greenled2rr, greenmaterial);
+		greenled2rrmesh.position.set(-400, 1000 , 200);		
+		kly_rackObject.add(greenled2rrmesh);
+		
+		//GreenLed3 right rack
+		const greenled3rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled3rrmesh = new THREE.Mesh(greenled3rr, greenmaterial);
+		greenled3rrmesh.position.set(-400, 950 , 200);		
+		kly_rackObject.add(greenled3rrmesh);
+		
+		//drawer2	rack right	
+		const drawer2rrgeometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer2rrgeometrymesh = new THREE.Mesh(drawer2rrgeometry, materialGreyDark);
+		drawer2rrgeometrymesh.position.set( -400, 700 , 0);
+		kly_rackObject.add(drawer2rrgeometrymesh);
+		
+		//blackbutton1  right rack
+		const blackled1rr = new THREE.SphereGeometry(30, 10, 10);
+		const blackled1rrmesh = new THREE.Mesh(blackled1rr, materialVeryGreyDark);
+		blackled1rrmesh.position.set(-400, 750 , -200);		
+		kly_rackObject.add(blackled1rrmesh);		
+
+		//blackbutton2  right rack
+		const blackled2rr = new THREE.SphereGeometry(30, 10, 10);
+		const blackled2rrmesh = new THREE.Mesh(blackled2rr, materialVeryGreyDark);
+		blackled2rrmesh.position.set(-400, 670 , -200);		
+		kly_rackObject.add(blackled2rrmesh);
+		
+		//GreenLED1  right rack
+		const greenled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10);
+		const greenled1rrdrawer2rmesh = new THREE.Mesh(greenled1rrdrawer2, greenmaterial);
+		greenled1rrdrawer2rmesh.position.set(-400, 750 , -50);		
+		kly_rackObject.add(greenled1rrdrawer2rmesh);
+		
+		//yellowLED1  right rack
+		const yellowled1rrdrawer2 = new THREE.SphereGeometry(25, 10, 10);
+		const yellowled1rrdrawer2rmesh = new THREE.Mesh(yellowled1rrdrawer2, yellowmaterial);
+		yellowled1rrdrawer2rmesh.position.set(-400, 750 , 30);		
+		kly_rackObject.add(yellowled1rrdrawer2rmesh);
+		
+		//emergencyLED1  right rack
+		const emergencybutton = new THREE.CylinderGeometry(70, 10, 10);
+		const emergencybuttonmesh = new THREE.Mesh(emergencybutton, redmaterial);
+		emergencybuttonmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonmesh.rotateY(Math.PI * 1);
+		emergencybuttonmesh.rotateZ(Math.PI * 0.5);		
+		emergencybuttonmesh.position.set(-405, 700 , 150);		
+		kly_rackObject.add(emergencybuttonmesh);			
+		
+		//drawer3	rack right	
+		const drawer3rrgeometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer3rrgeometrymesh = new THREE.Mesh(drawer3rrgeometry, materialGreyMedium);
+		drawer3rrgeometrymesh.position.set( -400, 400 , 0);
+		kly_rackObject.add(drawer3rrgeometrymesh);		
+		
+		//darkscreen	rack right	
+		const darkscreenrrgeometry = new THREE.BoxGeometry(10, 150, 270);
+		const darkscreenrrgeometrymesh = new THREE.Mesh(darkscreenrrgeometry, materialVeryGreyDark);
+		darkscreenrrgeometrymesh.position.set( -402, 400 , -120);
+		kly_rackObject.add(darkscreenrrgeometrymesh);
+		
+		//drawer4	rack right	
+		const drawer4rrgeometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer4rrgeometrymesh = new THREE.Mesh(drawer4rrgeometry, materialGreyDark);
+		drawer4rrgeometrymesh.position.set( -400, 100 , 0);
+		kly_rackObject.add(drawer4rrgeometrymesh);
+		
+		//drawer4 dark	rack right	
+		const drawer4darkrrgeometry = new THREE.BoxGeometry(10, 220, 500);
+		const drawer4darkrrgeometrymesh = new THREE.Mesh(drawer4darkrrgeometry, materialVeryGreyDark);
+		drawer4darkrrgeometrymesh.position.set( -402, 100 , 50);
+		kly_rackObject.add(drawer4darkrrgeometrymesh);			
+
+		//GreenLed1 drawer4  right rack
+		const greenled1drawer4rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled1drawer4rrmesh = new THREE.Mesh(greenled1drawer4rr, greenmaterial);
+		greenled1drawer4rrmesh.position.set(-400, 150 , -250);		
+		kly_rackObject.add(greenled1drawer4rrmesh);	
+		
+		//GreenLed2 drawer4 right rack
+		const greenled2drawer4rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled2drawer4rrmesh = new THREE.Mesh(greenled2drawer4rr, greenmaterial);
+		greenled2drawer4rrmesh.position.set(-400, 100 , -250);		
+		kly_rackObject.add(greenled2drawer4rrmesh);
+		
+		//GreenLed3 drawer4 right rack
+		const greenled3drawer4rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenled3drawer4rrmesh = new THREE.Mesh(greenled3drawer4rr, greenmaterial);
+		greenled3drawer4rrmesh.position.set(-400, 50 , -250);		
+		kly_rackObject.add(greenled3drawer4rrmesh);
+		
+		//RdLed1 drawer4  right rack
+		const greenred1drawer4rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenred1drawer4rrmesh = new THREE.Mesh(greenred1drawer4rr, redmaterial);
+		greenred1drawer4rrmesh.position.set(-400, 150 , 180);		
+		kly_rackObject.add(greenred1drawer4rrmesh);	
+		
+		//RdLed1 drawer4 right rack
+		const greenred2drawer4rr = new THREE.SphereGeometry(13, 10, 10);
+		const greenred2drawer4rrmesh = new THREE.Mesh(greenred2drawer4rr, redmaterial);
+		greenred2drawer4rrmesh.position.set(-400, 100 , 180);		
+		kly_rackObject.add(greenred2drawer4rrmesh);		
+		
+		//drawer5	rack right	
+		const drawer5rrgeometry = new THREE.BoxGeometry(10, 350, 630);
+		const drawer5rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark);
+		drawer5rrgeometrymesh.position.set( -400, -250 , 0);
+		kly_rackObject.add(drawer5rrgeometrymesh);
+		
+		//display1 drawer5 rack right 		
+		const display1drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display1drawer5rrgeometrymesh = new THREE.Mesh(display1drawer5rrgeometry, materialVeryGreyDark);
+		display1drawer5rrgeometrymesh.position.set( -402, -120 , 0);
+		kly_rackObject.add(display1drawer5rrgeometrymesh);			
+		
+		//display2 drawer5 rack right 		
+		const display2drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display2drawer5rrgeometrymesh = new THREE.Mesh(display2drawer5rrgeometry, materialVeryGreyDark);
+		display2drawer5rrgeometrymesh.position.set( -402, -200 , 0);
+		kly_rackObject.add(display2drawer5rrgeometrymesh);			
+		
+		//display3 drawer5 rack right 		
+		const display3drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display3drawer5rrgeometrymesh = new THREE.Mesh(display3drawer5rrgeometry, materialVeryGreyDark);
+		display3drawer5rrgeometrymesh.position.set( -402, -280 , 0);
+		kly_rackObject.add(display3drawer5rrgeometrymesh);	
+		
+		//display4 drawer5 rack right 		
+		const display4drawer5rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display4drawer5rrgeometrymesh = new THREE.Mesh(display4drawer5rrgeometry, materialVeryGreyDark);
+		display4drawer5rrgeometrymesh.position.set( -402, -360 , 0);
+		kly_rackObject.add(display4drawer5rrgeometrymesh);			
+		
+		//drawer6	rack right	
+		const drawer6rrgeometry = new THREE.BoxGeometry(10, 350, 630);
+		const drawer6rrgeometrymesh = new THREE.Mesh(drawer5rrgeometry, materialGreyDark);
+		drawer6rrgeometrymesh.position.set( -400, -650 , 0);
+		kly_rackObject.add(drawer6rrgeometrymesh);		
+		
+		//display1 drawer6 rack right 		
+		const display1drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display1drawer6rrgeometrymesh = new THREE.Mesh(display1drawer6rrgeometry, materialVeryGreyDark);
+		display1drawer6rrgeometrymesh.position.set( -402, -570 , 0);
+		kly_rackObject.add(display1drawer6rrgeometrymesh);			
+		
+		//display2 drawer6 rack right 		
+		const display2drawer6rrgeometry = new THREE.BoxGeometry(30, 70, 150);
+		const display2drawer6rrgeometrymesh = new THREE.Mesh(display2drawer6rrgeometry, materialVeryGreyDark);
+		display2drawer6rrgeometrymesh.position.set( -402, -650 , 0);
+		kly_rackObject.add(display2drawer6rrgeometrymesh);					
+
+		kly_rackObject.rotateY(Math.PI);
+		kly_rackObject.position.set(400, 1250, 400);
+		rar.add(kly_rackObject);	
+		return rar;
 	}
-	insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
-
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	
-	//rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
-	rrmesh.position.set( 0, 0 , -810);
-	kly_rackObject.add(rrmesh);	
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 700);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -815);
-	kly_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 700);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -815);
-	kly_rackObject.add(Rtargetmesh);			
-	
-	//edge 	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
-	llemesh.position.set( -425, 0 , -1185);
-	kly_rackObject.add(llemesh);
-	
-	//edge lre		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
-	lremesh.position.set( -425, 0 , -430);
-	kly_rackObject.add(lremesh);		
-
-	//edge lue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
-	luemesh.position.set( -425, 1225 , -807);
-	kly_rackObject.add(luemesh);		
-
-	//edge lde		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
-	ldemesh.position.set( -425, -1230 , -807);
-	kly_rackObject.add(ldemesh);				
-
-	//drawer1		
-	const drawer1geometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, materialGreyDark);
-	drawer1geometrymesh.position.set( -400, 1000 , -810);
-	kly_rackObject.add(drawer1geometrymesh);
-	
-	//display1 left		
-	const display1leftgeometry = new THREE.BoxGeometry(50, 50, 150);
-	const display1leftgeometrygeometrymesh = new THREE.Mesh(display1leftgeometry, materialVeryGreyDark);
-	display1leftgeometrygeometrymesh.position.set( -400, 1050 , -1000);
-	kly_rackObject.add(display1leftgeometrygeometrymesh);			
-	
-	//display1 right		
-	const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150);
-	const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark);
-	displayupgeometrymesh2.position.set( -400, 1050 , -820);
-	kly_rackObject.add(displayupgeometrymesh2);
-	
-	//selector1		
-	const selector1geometry = new THREE.BoxGeometry(20, 70, 20);
-	const selector1geometrymesh = new THREE.Mesh(selector1geometry, materialVeryGreyDark);
-	selector1geometrymesh.position.set( -400, 940 , -1030);
-	selector1geometrymesh.rotateX(Math.PI * 1.75);
-	selector1geometrymesh.rotateY(Math.PI * 1.50);
-	selector1geometrymesh.rotateZ(Math.PI * 1.50);
-	kly_rackObject.add(selector1geometrymesh);
-	
-	//sfere selector1
-	const sphereselector1drawer1 = new THREE.SphereGeometry(20, 10, 10);
-	const sphereselector1drawer1mesh = new THREE.Mesh(sphereselector1drawer1, materialVeryGreyDark);
-	sphereselector1drawer1mesh.position.set(-400, 940 , -1030);		
-	kly_rackObject.add(sphereselector1drawer1mesh);
-	
-	//sfere drawer1 button1 
-	const spherebutton1drawer1 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton1drawer1mesh = new THREE.Mesh(spherebutton1drawer1, materialVeryGreyDark);
-	spherebutton1drawer1mesh.position.set(-400, 990 , -630);		
-	kly_rackObject.add(spherebutton1drawer1mesh);	
-	
-	//sfere drawer1 button2 
-	const spherebutton2drawer1 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton2drawer1mesh = new THREE.Mesh(spherebutton2drawer1, materialVeryGreyDark);
-	spherebutton2drawer1mesh.position.set(-400, 990 , -550);		
-	kly_rackObject.add(spherebutton2drawer1mesh);				
-
-	//drawer2		
-	const drawer2geometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer2geometrymesh = new THREE.Mesh(drawer2geometry, materialGreyDark);
-	drawer2geometrymesh.position.set( -400, 700 , -810);
-	kly_rackObject.add(drawer2geometrymesh);
-	
-	//display2 left		
-	const display1leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150);
-	const display1leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display1leftgeometrydrawer2, materialVeryGreyDark);
-	display1leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -1000);
-	kly_rackObject.add(display1leftgeometrygeometrydrawer2mesh);			
-	
-	//display2 right		
-	const display2leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150);
-	const display2leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display2leftgeometrydrawer2, materialVeryGreyDark);
-	display2leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -820);
-	kly_rackObject.add(display2leftgeometrygeometrydrawer2mesh);
-	
-	//selector2		
-	const selector1geometrydrawer2 = new THREE.BoxGeometry(20, 70, 20);
-	const selector1geometrydrawer2mesh = new THREE.Mesh(selector1geometrydrawer2, materialVeryGreyDark);
-	selector1geometrydrawer2mesh.position.set( -400, 640 , -1030);
-	selector1geometrydrawer2mesh.rotateX(Math.PI * 1.75);
-	selector1geometrydrawer2mesh.rotateY(Math.PI * 1.50);
-	selector1geometrydrawer2mesh.rotateZ(Math.PI * 1.50);
-	kly_rackObject.add(selector1geometrydrawer2mesh);
-	
-	//sfere selector2
-	const sphereselector1drawer2 = new THREE.SphereGeometry(20, 10, 10);
-	const sphereselector1drawer2mesh = new THREE.Mesh(sphereselector1drawer2, materialVeryGreyDark);
-	sphereselector1drawer2mesh.position.set(-400, 640 , -1030);		
-	kly_rackObject.add(sphereselector1drawer2mesh);
-	
-	//sfere drawer2 button1 
-	const spherebutton1drawer2 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton1drawer2mesh = new THREE.Mesh(spherebutton1drawer2, materialVeryGreyDark);
-	spherebutton1drawer2mesh.position.set(-400, 690 , -630);		
-	kly_rackObject.add(spherebutton1drawer2mesh);	
-	
-	//sfere drawer2 button2 
-	const spherebutton2drawer2 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton2drawer2mesh = new THREE.Mesh(spherebutton2drawer2, materialVeryGreyDark);
-	spherebutton2drawer2mesh.position.set(-400, 690 , -550);		
-	kly_rackObject.add(spherebutton2drawer2mesh);	
-	
-	//drawer3		
-	const drawer3geometry = new THREE.BoxGeometry(10, 250, 630);
-	const drawer3geometrymesh = new THREE.Mesh(drawer3geometry, materialGreyDark);
-	drawer3geometrymesh.position.set( -400, 400 , -810);
-	kly_rackObject.add(drawer3geometrymesh);
-	
-	//display2 left		
-	const display1leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150);
-	const display1leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display1leftgeometrydrawer3, materialVeryGreyDark);
-	display1leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -1000);
-	kly_rackObject.add(display1leftgeometrygeometrydrawer3mesh);			
-	
-	//display2 right		
-	const display2leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150);
-	const display2leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display2leftgeometrydrawer3, materialVeryGreyDark);
-	display2leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -820);
-	kly_rackObject.add(display2leftgeometrygeometrydrawer3mesh);
-	
-	//selector2		
-	const selector1geometrydrawer3 = new THREE.BoxGeometry(20, 70, 20);
-	const selector1geometrydrawer3mesh = new THREE.Mesh(selector1geometrydrawer3, materialVeryGreyDark);
-	selector1geometrydrawer3mesh.position.set( -400, 340 , -1030);
-	selector1geometrydrawer3mesh.rotateX(Math.PI * 1.75);
-	selector1geometrydrawer3mesh.rotateY(Math.PI * 1.50);
-	selector1geometrydrawer3mesh.rotateZ(Math.PI * 1.50);
-	kly_rackObject.add(selector1geometrydrawer3mesh);
-	
-	//sfere selector2
-	const sphereselector1drawer3 = new THREE.SphereGeometry(20, 10, 10);
-	const sphereselector1drawer3mesh = new THREE.Mesh(sphereselector1drawer3, materialVeryGreyDark);
-	sphereselector1drawer3mesh.position.set(-400, 340 , -1030);		
-	kly_rackObject.add(sphereselector1drawer3mesh);
-	
-	//sfere drawer2 button1 
-	const spherebutton1drawer3 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton1drawer3mesh = new THREE.Mesh(spherebutton1drawer3, materialVeryGreyDark);
-	spherebutton1drawer3mesh.position.set(-400, 390 , -630);		
-	kly_rackObject.add(spherebutton1drawer3mesh);	
-	
-	//sfere drawer2 button2 
-	const spherebutton2drawer3 = new THREE.SphereGeometry(20, 10, 10);
-	const spherebutton2drawer3mesh = new THREE.Mesh(spherebutton2drawer3, materialVeryGreyDark);
-	spherebutton2drawer3mesh.position.set(-400, 390 , -550);		
-	kly_rackObject.add(spherebutton2drawer3mesh);	
-	
-	//borderscreen	
-	const borderscreengeometry = new THREE.BoxGeometry(10, 400, 500);
-	const borderscreengeometrymesh = new THREE.Mesh(borderscreengeometry, materialGreyDark);
-	borderscreengeometrymesh.position.set( -400, 0 , -810);
-	kly_rackObject.add(borderscreengeometrymesh);
-	
-	//screen	
-	const screengeometry = new THREE.BoxGeometry(10, 300, 400);
-	const screengeometrymesh = new THREE.Mesh(screengeometry, materialVeryGreyDark);
-	screengeometrymesh.position.set( -402, 0 , -810);
-	kly_rackObject.add(screengeometrymesh);	
-	
-	//GreenLed1
-	const greenled1 = new THREE.SphereGeometry(13, 10, 10);
-	const greenled1mesh = new THREE.Mesh(greenled1, greenmaterial);
-	greenled1mesh.position.set(-400, 175 , -750);		
-	kly_rackObject.add(greenled1mesh);	
-	
-	//GreenLed2
-	const greenled2 = new THREE.SphereGeometry(13, 10, 10);
-	const greenled2mesh = new THREE.Mesh(greenled2, greenmaterial);
-	greenled2mesh.position.set(-400, 175 , -700);		
-	kly_rackObject.add(greenled2mesh);
-	
 
-	//borderEC
-	const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
-	const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
-	borderECgeometrymesh.position.set( -400, -650 , -810);
-	kly_rackObject.add(borderECgeometrymesh);
-	
-	//EC1
-	const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
-	EC1geometrymesh.position.set( -402, -650 , -1000);
-	kly_rackObject.add(EC1geometrymesh);			
-	//EC2
-	const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
-	EC2geometrymesh.position.set( -402, -650 , -950);
-	kly_rackObject.add(EC2geometrymesh);			
-	//EC2
-	const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
-	const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
-	EC3geometrymesh.position.set( -402, -650 , -900);
-	kly_rackObject.add(EC3geometrymesh);	
+	// RAR2
+	export function rar2(param) {
+		const width=800, height=2500, depth=800;
+		const rar2 = new THREE.Object3D();
+		const kly_rackObject = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rar2.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 80, 750);
+			rar2.add(group2);
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
+	
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		
+		//rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
+		rrmesh.position.set( 0, 0 , -810);
+		kly_rackObject.add(rrmesh);	
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 700);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -815);
+		kly_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 700);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -815);
+		kly_rackObject.add(Rtargetmesh);			
+		
+		//edge 	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
+		llemesh.position.set( -425, 0 , -1185);
+		kly_rackObject.add(llemesh);
+		
+		//edge lre		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
+		lremesh.position.set( -425, 0 , -430);
+		kly_rackObject.add(lremesh);		
+
+		//edge lue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
+		luemesh.position.set( -425, 1225 , -807);
+		kly_rackObject.add(luemesh);		
+
+		//edge lde		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
+		ldemesh.position.set( -425, -1230 , -807);
+		kly_rackObject.add(ldemesh);				
+
+		//drawer1		
+		const drawer1geometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer1geometrymesh = new THREE.Mesh(drawer1geometry, materialGreyDark);
+		drawer1geometrymesh.position.set( -400, 1000 , -810);
+		kly_rackObject.add(drawer1geometrymesh);
+		
+		//display1 left		
+		const display1leftgeometry = new THREE.BoxGeometry(50, 50, 150);
+		const display1leftgeometrygeometrymesh = new THREE.Mesh(display1leftgeometry, materialVeryGreyDark);
+		display1leftgeometrygeometrymesh.position.set( -400, 1050 , -1000);
+		kly_rackObject.add(display1leftgeometrygeometrymesh);			
+		
+		//display1 right		
+		const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150);
+		const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark);
+		displayupgeometrymesh2.position.set( -400, 1050 , -820);
+		kly_rackObject.add(displayupgeometrymesh2);
+		
+		//selector1		
+		const selector1geometry = new THREE.BoxGeometry(20, 70, 20);
+		const selector1geometrymesh = new THREE.Mesh(selector1geometry, materialVeryGreyDark);
+		selector1geometrymesh.position.set( -400, 940 , -1030);
+		selector1geometrymesh.rotateX(Math.PI * 1.75);
+		selector1geometrymesh.rotateY(Math.PI * 1.50);
+		selector1geometrymesh.rotateZ(Math.PI * 1.50);
+		kly_rackObject.add(selector1geometrymesh);
+		
+		//sfere selector1
+		const sphereselector1drawer1 = new THREE.SphereGeometry(20, 10, 10);
+		const sphereselector1drawer1mesh = new THREE.Mesh(sphereselector1drawer1, materialVeryGreyDark);
+		sphereselector1drawer1mesh.position.set(-400, 940 , -1030);		
+		kly_rackObject.add(sphereselector1drawer1mesh);
+		
+		//sfere drawer1 button1 
+		const spherebutton1drawer1 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton1drawer1mesh = new THREE.Mesh(spherebutton1drawer1, materialVeryGreyDark);
+		spherebutton1drawer1mesh.position.set(-400, 990 , -630);		
+		kly_rackObject.add(spherebutton1drawer1mesh);	
+		
+		//sfere drawer1 button2 
+		const spherebutton2drawer1 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton2drawer1mesh = new THREE.Mesh(spherebutton2drawer1, materialVeryGreyDark);
+		spherebutton2drawer1mesh.position.set(-400, 990 , -550);		
+		kly_rackObject.add(spherebutton2drawer1mesh);				
+	
+		//drawer2		
+		const drawer2geometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer2geometrymesh = new THREE.Mesh(drawer2geometry, materialGreyDark);
+		drawer2geometrymesh.position.set( -400, 700 , -810);
+		kly_rackObject.add(drawer2geometrymesh);
+		
+		//display2 left		
+		const display1leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150);
+		const display1leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display1leftgeometrydrawer2, materialVeryGreyDark);
+		display1leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -1000);
+		kly_rackObject.add(display1leftgeometrygeometrydrawer2mesh);			
+		
+		//display2 right		
+		const display2leftgeometrydrawer2 = new THREE.BoxGeometry(50, 50, 150);
+		const display2leftgeometrygeometrydrawer2mesh = new THREE.Mesh(display2leftgeometrydrawer2, materialVeryGreyDark);
+		display2leftgeometrygeometrydrawer2mesh.position.set( -400, 750 , -820);
+		kly_rackObject.add(display2leftgeometrygeometrydrawer2mesh);
+		
+		//selector2		
+		const selector1geometrydrawer2 = new THREE.BoxGeometry(20, 70, 20);
+		const selector1geometrydrawer2mesh = new THREE.Mesh(selector1geometrydrawer2, materialVeryGreyDark);
+		selector1geometrydrawer2mesh.position.set( -400, 640 , -1030);
+		selector1geometrydrawer2mesh.rotateX(Math.PI * 1.75);
+		selector1geometrydrawer2mesh.rotateY(Math.PI * 1.50);
+		selector1geometrydrawer2mesh.rotateZ(Math.PI * 1.50);
+		kly_rackObject.add(selector1geometrydrawer2mesh);
+		
+		//sfere selector2
+		const sphereselector1drawer2 = new THREE.SphereGeometry(20, 10, 10);
+		const sphereselector1drawer2mesh = new THREE.Mesh(sphereselector1drawer2, materialVeryGreyDark);
+		sphereselector1drawer2mesh.position.set(-400, 640 , -1030);		
+		kly_rackObject.add(sphereselector1drawer2mesh);
+		
+		//sfere drawer2 button1 
+		const spherebutton1drawer2 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton1drawer2mesh = new THREE.Mesh(spherebutton1drawer2, materialVeryGreyDark);
+		spherebutton1drawer2mesh.position.set(-400, 690 , -630);		
+		kly_rackObject.add(spherebutton1drawer2mesh);	
+		
+		//sfere drawer2 button2 
+		const spherebutton2drawer2 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton2drawer2mesh = new THREE.Mesh(spherebutton2drawer2, materialVeryGreyDark);
+		spherebutton2drawer2mesh.position.set(-400, 690 , -550);		
+		kly_rackObject.add(spherebutton2drawer2mesh);	
+		
+		//drawer3		
+		const drawer3geometry = new THREE.BoxGeometry(10, 250, 630);
+		const drawer3geometrymesh = new THREE.Mesh(drawer3geometry, materialGreyDark);
+		drawer3geometrymesh.position.set( -400, 400 , -810);
+		kly_rackObject.add(drawer3geometrymesh);
+		
+		//display2 left		
+		const display1leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150);
+		const display1leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display1leftgeometrydrawer3, materialVeryGreyDark);
+		display1leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -1000);
+		kly_rackObject.add(display1leftgeometrygeometrydrawer3mesh);			
+		
+		//display2 right		
+		const display2leftgeometrydrawer3 = new THREE.BoxGeometry(50, 50, 150);
+		const display2leftgeometrygeometrydrawer3mesh = new THREE.Mesh(display2leftgeometrydrawer3, materialVeryGreyDark);
+		display2leftgeometrygeometrydrawer3mesh.position.set( -400, 450 , -820);
+		kly_rackObject.add(display2leftgeometrygeometrydrawer3mesh);
+		
+		//selector2		
+		const selector1geometrydrawer3 = new THREE.BoxGeometry(20, 70, 20);
+		const selector1geometrydrawer3mesh = new THREE.Mesh(selector1geometrydrawer3, materialVeryGreyDark);
+		selector1geometrydrawer3mesh.position.set( -400, 340 , -1030);
+		selector1geometrydrawer3mesh.rotateX(Math.PI * 1.75);
+		selector1geometrydrawer3mesh.rotateY(Math.PI * 1.50);
+		selector1geometrydrawer3mesh.rotateZ(Math.PI * 1.50);
+		kly_rackObject.add(selector1geometrydrawer3mesh);
+		
+		//sfere selector2
+		const sphereselector1drawer3 = new THREE.SphereGeometry(20, 10, 10);
+		const sphereselector1drawer3mesh = new THREE.Mesh(sphereselector1drawer3, materialVeryGreyDark);
+		sphereselector1drawer3mesh.position.set(-400, 340 , -1030);		
+		kly_rackObject.add(sphereselector1drawer3mesh);
+		
+		//sfere drawer2 button1 
+		const spherebutton1drawer3 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton1drawer3mesh = new THREE.Mesh(spherebutton1drawer3, materialVeryGreyDark);
+		spherebutton1drawer3mesh.position.set(-400, 390 , -630);		
+		kly_rackObject.add(spherebutton1drawer3mesh);	
+		
+		//sfere drawer2 button2 
+		const spherebutton2drawer3 = new THREE.SphereGeometry(20, 10, 10);
+		const spherebutton2drawer3mesh = new THREE.Mesh(spherebutton2drawer3, materialVeryGreyDark);
+		spherebutton2drawer3mesh.position.set(-400, 390 , -550);		
+		kly_rackObject.add(spherebutton2drawer3mesh);	
+		
+		//borderscreen	
+		const borderscreengeometry = new THREE.BoxGeometry(10, 400, 500);
+		const borderscreengeometrymesh = new THREE.Mesh(borderscreengeometry, materialGreyDark);
+		borderscreengeometrymesh.position.set( -400, 0 , -810);
+		kly_rackObject.add(borderscreengeometrymesh);
+		
+		//screen	
+		const screengeometry = new THREE.BoxGeometry(10, 300, 400);
+		const screengeometrymesh = new THREE.Mesh(screengeometry, materialVeryGreyDark);
+		screengeometrymesh.position.set( -402, 0 , -810);
+		kly_rackObject.add(screengeometrymesh);	
+		
+		//GreenLed1
+		const greenled1 = new THREE.SphereGeometry(13, 10, 10);
+		const greenled1mesh = new THREE.Mesh(greenled1, greenmaterial);
+		greenled1mesh.position.set(-400, 175 , -750);		
+		kly_rackObject.add(greenled1mesh);	
+		
+		//GreenLed2
+		const greenled2 = new THREE.SphereGeometry(13, 10, 10);
+		const greenled2mesh = new THREE.Mesh(greenled2, greenmaterial);
+		greenled2mesh.position.set(-400, 175 , -700);		
+		kly_rackObject.add(greenled2mesh);
+		
 	
-	kly_rackObject.rotateY(Math.PI);
-	kly_rackObject.position.set(400, 1250, -400);
-	rar2.add(kly_rackObject);	
-	return rar2;
-}
-
-// RAR3
-export function rar3(param) {
-	const width=800, height=2500, depth=800;
-	const rar3 = new THREE.Object3D();
-	const rar3_rackObject = new THREE.Object3D();
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rar3.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
-	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 80, 750);
-		rar3.add(group2);
-	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+		//borderEC
+		const borderECgeometry = new THREE.BoxGeometry(10, 400, 600);
+		const borderECgeometrymesh = new THREE.Mesh(borderECgeometry, materialGreyDark);
+		borderECgeometrymesh.position.set( -400, -650 , -810);
+		kly_rackObject.add(borderECgeometrymesh);
+		
+		//EC1
+		const EC1geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC1geometrymesh = new THREE.Mesh(EC1geometry, materialGreyMedium);
+		EC1geometrymesh.position.set( -402, -650 , -1000);
+		kly_rackObject.add(EC1geometrymesh);			
+		//EC2
+		const EC2geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC2geometrymesh = new THREE.Mesh(EC2geometry, materialGreyMedium);
+		EC2geometrymesh.position.set( -402, -650 , -950);
+		kly_rackObject.add(EC2geometrymesh);			
+		//EC2
+		const EC3geometry = new THREE.BoxGeometry(10, 350, 40);
+		const EC3geometrymesh = new THREE.Mesh(EC3geometry, materialGreyMedium);
+		EC3geometrymesh.position.set( -402, -650 , -900);
+		kly_rackObject.add(EC3geometrymesh);	
+		
+		kly_rackObject.rotateY(Math.PI);
+		kly_rackObject.position.set(400, 1250, -400);
+		rar2.add(kly_rackObject);	
+		return rar2;
 	}
-	insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
-
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});	
-	
-	//rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
-	rrmesh.position.set( 0, 0 , -10);
-	rar3_rackObject.add(rrmesh);		
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 700);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rar3_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 700);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rar3_rackObject.add(Rtargetmesh);				
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
-	llemesh.position.set( -425, 0 , -370);
-	rar3_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
-	const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
-	lremesh.position.set( -425, 0 , 375);
-	rar3_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
-	luemesh.position.set( -425, 1225 , 0);
-	rar3_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
-	ldemesh.position.set( -425, -1230 , 0);
-	rar3_rackObject.add(ldemesh);				
 
-	
-	//drawer 1
-	const d1geometry = new THREE.BoxGeometry(10, 200, 600);
-	const d1geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d1geometrymesh.position.set( -400, 900 , -10);
-	rar3_rackObject.add(d1geometrymesh);		
-	
-	//drawer 2
-	const d2geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d2geometrymesh.position.set( -400, 600 , -10);
-	rar3_rackObject.add(d2geometrymesh);				
-	
-	//drawer 3
-	const d3geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d3geometrymesh.position.set( -400, 300 , -10);
-	rar3_rackObject.add(d3geometrymesh);			
-	
-	//drawer 4
-	const d4geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d4geometrymesh.position.set( -400, 0 , -10);
-	rar3_rackObject.add(d4geometrymesh);			
-	
-	//drawer 5
-	const d5geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d5geometrymesh.position.set( -400, -300 , -10);
-	rar3_rackObject.add(d5geometrymesh);			
-	
-	//drawer 6
-	const d6geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
-	d6geometrymesh.position.set( -400, -600 , -10);
-	rar3_rackObject.add(d6geometrymesh);		
-	
-	rar3_rackObject.rotateY(Math.PI);
-	rar3_rackObject.position.set(400, 1250, 400);
-	rar3.add(rar3_rackObject);	
-	return rar3;
-}
-
-
-
-// rack Terafermi
-export function rtf(param) {
-	const width=800, height=2500, depth=600;
-	const rtf = new THREE.Object3D();
-	const rtf_rackObject = new THREE.Object3D();
-
-	const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
-	const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
-	const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
-	const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
-
-	const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
-	const text = param.name;
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		rtf.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
+	// RAR3
+	export function rar3(param) {
+		const width=800, height=2500, depth=800;
+		const rar3 = new THREE.Object3D();
+		const rar3_rackObject = new THREE.Object3D();
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rar3.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 80, 750);
+			rar3.add(group2);
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);
+	
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});	
+		
+		//rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
+		rrmesh.position.set( 0, 0 , -10);
+		rar3_rackObject.add(rrmesh);		
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 700);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rar3_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 700);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rar3_rackObject.add(Rtargetmesh);				
+		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
+		llemesh.position.set( -425, 0 , -370);
+		rar3_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-750);
+		const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
+		lremesh.position.set( -425, 0 , 375);
+		rar3_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
+		luemesh.position.set( -425, 1225 , 0);
+		rar3_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
+		ldemesh.position.set( -425, -1230 , 0);
+		rar3_rackObject.add(ldemesh);				
+
+		
+		//drawer 1
+		const d1geometry = new THREE.BoxGeometry(10, 200, 600);
+		const d1geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d1geometrymesh.position.set( -400, 900 , -10);
+		rar3_rackObject.add(d1geometrymesh);		
+		
+		//drawer 2
+		const d2geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d2geometrymesh.position.set( -400, 600 , -10);
+		rar3_rackObject.add(d2geometrymesh);				
+		
+		//drawer 3
+		const d3geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d3geometrymesh.position.set( -400, 300 , -10);
+		rar3_rackObject.add(d3geometrymesh);			
+		
+		//drawer 4
+		const d4geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d4geometrymesh.position.set( -400, 0 , -10);
+		rar3_rackObject.add(d4geometrymesh);			
+		
+		//drawer 5
+		const d5geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d5geometrymesh.position.set( -400, -300 , -10);
+		rar3_rackObject.add(d5geometrymesh);			
+		
+		//drawer 6
+		const d6geometrymesh = new THREE.Mesh(d1geometry, materialGreyMedium);
+		d6geometrymesh.position.set( -400, -600 , -10);
+		rar3_rackObject.add(d6geometrymesh);		
+		
+		rar3_rackObject.rotateY(Math.PI);
+		rar3_rackObject.position.set(400, 1250, 400);
+		rar3.add(rar3_rackObject);	
+		return rar3;
 	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
+
+
+
+	// rack Terafermi
+	export function rtf(param) {
+		const width=800, height=2500, depth=600;
+		const rtf = new THREE.Object3D();
+		const rtf_rackObject = new THREE.Object3D();
+	
+		const bluematerial = new THREE.MeshLambertMaterial({color: 0x0053d9});
+		const softbluematerial = new THREE.MeshLambertMaterial({color: 0x2b7cff});
+		const target = new THREE.MeshLambertMaterial({color: 0xfbe928});
+		const materialDarkblue = new THREE.MeshLambertMaterial({color: 0x021061});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const whitematerial = new THREE.MeshLambertMaterial({color: 0xffffff});
+
+		const materialBase = new THREE.MeshLambertMaterial({color: 0x0000d0});
+		const text = param.name;
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			rtf.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		function createText() {
+			textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
+			textMesh = new THREE.Mesh(textGeo, materialBase);
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+			const group2 = group.clone();
+			group2.rotateY(Math.PI);
+			group2.position.set(850, 90, 850);
+			rtf.add(group2);
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);			
+		
+		
+		// rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
+		rrmesh.position.set( 0, 0 , -10);
+		rtf_rackObject.add(rrmesh);		
+		
+		//front yellow target
+		const Ftarget = new THREE.BoxGeometry(2, 90, 500);
+		const Ftargetmesh = new THREE.Mesh(Ftarget, target);
+		Ftargetmesh.position.set( -451, 1200 , -15);
+		rtf_rackObject.add(Ftargetmesh);		
+		//Rear yellow target
+		const Rtarget = new THREE.BoxGeometry(2, 90, 500);
+		const Rtargetmesh = new THREE.Mesh(Rtarget, target);
+		Rtargetmesh.position.set( 401, 1200 , -15);
+		rtf_rackObject.add(Rtargetmesh);				
+		
+		//edge le	
+		const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const llemesh = new THREE.Mesh(llegeometry, bluematerial);
+		llemesh.position.set( -425, 0 , -285);
+		rtf_rackObject.add(llemesh);
+		
+		//edge re		
+		const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
+		const lremesh = new THREE.Mesh(lregeometry, bluematerial);
+		lremesh.position.set( -425, 0 , 265);
+		rtf_rackObject.add(lremesh);		
+
+		//edge ue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const luemesh = new THREE.Mesh(luegeometry, bluematerial);
+		luemesh.position.set( -425, 1225 , -7);
+		rtf_rackObject.add(luemesh);		
+
+		//edge de		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
+		const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
+		ldemesh.position.set( -425, -1230 , -7);
+		rtf_rackObject.add(ldemesh);		
+		
+		//base border	
+		const screenbordergeometry = new THREE.BoxGeometry(10, 350, 550);
+		const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
+		screenbordergeometrymesh.position.set( -400, 400 , 0);
+		rtf_rackObject.add(screenbordergeometrymesh);
+		
+		//screen border	
+		const basebordergeometry = new THREE.BoxGeometry(10,  150, 200);
+		const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial);
+		basebordergeometrymesh.position.set( -401, 450 , 0);
+		rtf_rackObject.add(basebordergeometrymesh);
+		
+		//screen 	
+		const screengeometry = new THREE.BoxGeometry(10, 140, 180);
+		const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
+		screengeometrymesh.position.set( -402, 450 , 0);
+		rtf_rackObject.add(screengeometrymesh);			
+
+		//base border2	
+		const baseborder2geometry = new THREE.BoxGeometry(10, 450, 550);
+		const baseborder2geometrymesh = new THREE.Mesh(baseborder2geometry, whitematerial);
+		baseborder2geometrymesh.position.set( -400, -800 , 0);
+		rtf_rackObject.add(baseborder2geometrymesh);	
+		
+		rtf_rackObject.rotateY(Math.PI);
+		rtf_rackObject.position.set(400, 1250, 400);
+		rtf.add(rtf_rackObject);	
+		return rtf;
 	}
-	function createText() {
-		textGeo = new TextGeometry(text, {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = -0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
-		textMesh = new THREE.Mesh(textGeo, materialBase);
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
-		const group2 = group.clone();
-		group2.rotateY(Math.PI);
-		group2.position.set(850, 90, 850);
-		rtf.add(group2);
+
+
+
+	// camod rack
+	export function camod(param) {
+		const width=800, height=2500, depth=800;
+		const camod = new THREE.Object3D();
+		const camod_rackObject = new THREE.Object3D();
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xFBE928});
+		const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});	
+
+		//right rack
+		const lrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const lrmesh = new THREE.Mesh(lrgeometry, materialGreyDark);
+		lrmesh.position.set(0 , 0 , 0);
+		camod_rackObject.add(lrmesh);
+
+		//left rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark);
+		rrmesh.position.set( 0, 0 , -810);
+		camod_rackObject.add(rrmesh);		
+
+		//edge lle
+		const llegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
+		const llemesh = new THREE.Mesh(llegeometry, blackmaterial);
+		llemesh.position.set( -377, 0 , -1155);
+		camod_rackObject.add(llemesh);
+
+		//edge lre		
+		const lregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
+		const lremesh = new THREE.Mesh(lregeometry, blackmaterial);
+		lremesh.position.set( -377, 0 , -470);
+		camod_rackObject.add(lremesh);		
+
+		//edge rle		
+		const rlegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
+		const rlemesh = new THREE.Mesh(rlegeometry, blackmaterial);
+		rlemesh.position.set( -377, 0 , -340);
+		camod_rackObject.add(rlemesh);	
+
+		//edge rre		
+		const rregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
+		const rremesh = new THREE.Mesh(rregeometry, blackmaterial);
+		rremesh.position.set( -377, 0 , 345);
+		camod_rackObject.add(rremesh);		
+
+		//edge lue		
+		const luegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
+		const luemesh = new THREE.Mesh(luegeometry, blackmaterial);
+		luemesh.position.set( -377, 1200 , -813);
+		camod_rackObject.add(luemesh);		
+
+		//edge lde		
+		const ldegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
+		const ldemesh = new THREE.Mesh(ldegeometry, blackmaterial);
+		ldemesh.position.set( -377, -1200 , -807);
+		camod_rackObject.add(ldemesh);				
+
+		//edge rue		
+		const ruegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
+		const ruemesh = new THREE.Mesh(ruegeometry, blackmaterial);
+		ruemesh.position.set( -377, 1200 , 0);
+		camod_rackObject.add(ruemesh);			
+		
+		//edge rde		
+		const rdegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
+		const rdemesh = new THREE.Mesh(rdegeometry, blackmaterial);
+		rdemesh.position.set( -377, -1200 , 0);
+		camod_rackObject.add(rdemesh);
+		
+		//triangle warning1
+		const trianglewarning = new THREE.CylinderGeometry(200, 200, 1, 3);
+		const trianglewarningmesh = new THREE.Mesh(trianglewarning, yellowmaterial);
+		trianglewarningmesh.rotateX(Math.PI * 0.5);
+		trianglewarningmesh.rotateY(Math.PI * 1);
+		trianglewarningmesh.rotateZ(Math.PI * 0.5);		
+		trianglewarningmesh.position.set(-401, 700 , 0);		
+		camod_rackObject.add(trianglewarningmesh);
+		
+		//triangle warning black
+		const trianglewarning2 = new THREE.CylinderGeometry(180, 180, 1, 3);
+		const trianglewarning2mesh = new THREE.Mesh(trianglewarning2, blackmaterial);
+		trianglewarning2mesh.rotateX(Math.PI * 0.5);
+		trianglewarning2mesh.rotateY(Math.PI * 1);
+		trianglewarning2mesh.rotateZ(Math.PI * 0.5);		
+		trianglewarning2mesh.position.set(-402, 700 , 0);		
+		camod_rackObject.add(trianglewarning2mesh);		
+		
+		//triangle warning yellow2
+		const trianglewarning3 = new THREE.CylinderGeometry(150, 150, 1, 3);
+		const trianglewarning3mesh = new THREE.Mesh(trianglewarning3, yellowmaterial);
+		trianglewarning3mesh.rotateX(Math.PI * 0.5);
+		trianglewarning3mesh.rotateY(Math.PI * 1);
+		trianglewarning3mesh.rotateZ(Math.PI * 0.5);		
+		trianglewarning3mesh.position.set(-403, 700 , 0);		
+		camod_rackObject.add(trianglewarning3mesh);
+		
+		//ZOT1
+		const zot1geometry = new THREE.BoxGeometry(10, 110, 10);
+		const zot1geometrymesh = new THREE.Mesh(zot1geometry, blackmaterial);
+		zot1geometrymesh.position.set( -404, 750 , -20);
+		zot1geometrymesh.rotateX(Math.PI * 1.65);
+		zot1geometrymesh.rotateY(Math.PI * 1.50);
+		zot1geometrymesh.rotateZ(Math.PI * 1.50);		
+		camod_rackObject.add(zot1geometrymesh);	
+		
+		//ZOT2
+		const zot2geometry = new THREE.BoxGeometry(10, 70, 10);
+		const zot2geometrymesh = new THREE.Mesh(zot2geometry, blackmaterial);
+		zot2geometrymesh.position.set( -404, 715 , -16);
+		zot2geometrymesh.rotateX(Math.PI * 1.85);
+		zot2geometrymesh.rotateY(Math.PI * 1.50);
+		zot2geometrymesh.rotateZ(Math.PI * 1.50);		
+		camod_rackObject.add(zot2geometrymesh);	
+		
+		//ZOT3
+		const zot3geometry = new THREE.BoxGeometry(10, 80, 10);
+		const zot3geometrymesh = new THREE.Mesh(zot3geometry, blackmaterial);
+		zot3geometrymesh.position.set( -404, 697 , -1);
+		zot3geometrymesh.rotateX(Math.PI * 1.65);
+		zot3geometrymesh.rotateY(Math.PI * 1.50);
+		zot3geometrymesh.rotateZ(Math.PI * 1.50);		
+		camod_rackObject.add(zot3geometrymesh);	
+
+		//ZOT TRIANGLE
+		const zottrianglegeometry = new THREE.CylinderGeometry(22, 22, 1, 3);
+		const zottrianglegeometrymesh = new THREE.Mesh(zottrianglegeometry, blackmaterial);
+		zottrianglegeometrymesh.rotateX(Math.PI * 0.95);
+		zottrianglegeometrymesh.rotateY(Math.PI * 1);
+		zottrianglegeometrymesh.rotateZ(Math.PI * 0.5);		
+		zottrianglegeometrymesh.position.set(-405, 660 , -19);		
+		camod_rackObject.add(zottrianglegeometrymesh);		
+
+		//handle1
+		const handle1geometry = new THREE.BoxGeometry(10, 250, 80);
+		const handle1geometrymesh = new THREE.Mesh(handle1geometry, materialVeryGreyDark);
+		handle1geometrymesh.position.set( -401, 100 , -550);
+		camod_rackObject.add(handle1geometrymesh);	
+			
+		//handle2
+		const handle2geometry = new THREE.BoxGeometry(10, 250, 80);
+		const handle2geometrymesh = new THREE.Mesh(handle2geometry, materialVeryGreyDark);
+		handle2geometrymesh.position.set( -401, 100 , -260);
+		camod_rackObject.add(handle2geometrymesh);
+		camod_rackObject.rotateY(Math.PI);
+		camod_rackObject.position.set(400, 1250, 340);
+		camod_rackObject.scale.set(1, 1, 0.94);
+		camod.add(camod_rackObject);	
+		return camod;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+
+	// base mod
+	export function klystron(param) {
+		const text = param.name;
+		const myscale=0.625;
+		console.log('klystron(), text:',text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'));
+		const width=1500, height=1500, depth=1500;
+		const ModK = new THREE.Object3D();
+		const ModContainer = new THREE.Object3D();
+		const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const klystron = new THREE.Object3D();
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			klystron.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		materials = [
+			new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front
+			new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side
+		];
+		function createText() {
+			textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'), {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
+			textMesh = new THREE.Mesh( textGeo, materials );
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(75, [940,730,560], [0, Math.PI / 2, 0]);
+		
+		const basegeometry = new THREE.BoxGeometry(width, height, depth);
+		const d1mesh = new THREE.Mesh(basegeometry, materialBase);
+		ModContainer.add(d1mesh);
+
+		// cover
+		const d2geometry = new THREE.BoxGeometry(width+100, 100, depth+100);
+		const dmaterial2= new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const d2mesh = new THREE.Mesh(d2geometry, dmaterial2);
+		d2mesh.position.set(0, 800, 0);		
+		ModContainer.add(d2mesh);	
+		
+  		// base
+		const d3geometry = new THREE.BoxGeometry(width+100, 100, depth+100);
+		const d3mesh = new THREE.Mesh(d3geometry, materialBase);
+		d3mesh.position.set(0, -800, 0);		
+		ModContainer.add(d3mesh);	
+	
+		// big cylinder
+		const d4geometry = new THREE.CylinderGeometry(400, 400, 1200, 50);
+		const textureLoader = new THREE.TextureLoader();
+		const texture = textureLoader.load('./components/mod_texture.png');	
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(5, 5);		
+		const material = new THREE.MeshBasicMaterial({ map: texture });		
+		const d4mesh = new THREE.Mesh(d4geometry, material);
+		d4mesh.rotateX(Math.PI * 1);
+		d4mesh.rotateY(Math.PI * 1);
+		d4mesh.rotateZ(Math.PI * 1);
+		d4mesh.position.set(0, 970 , 300);			
+		ModContainer.add(d4mesh);	
+
+		// small cylinder
+		const d5geometry = new THREE.CylinderGeometry(200, 200, 1200, 50);
+		const textureLoader2 = new THREE.TextureLoader();
+		const texture2 = textureLoader.load('./components/mod_texture.png');	
+		texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
+		texture2.repeat.set(3, 3);		
+		const material2 = new THREE.MeshBasicMaterial({ map: texture2 });		
+		const d5mesh = new THREE.Mesh(d5geometry, material2);
+		d5mesh.rotateX(Math.PI * 1);
+		d5mesh.rotateY(Math.PI * 1);
+		d5mesh.rotateZ(Math.PI * 1);
+		d5mesh.position.set(0, 1670 , 300);			
+		ModContainer.add(d5mesh);	
+		
+		// high cover
+		const d6geometry = new THREE.CylinderGeometry(220, 220, 90, 50);
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const d6mesh = new THREE.Mesh(d6geometry, materialGreyDark);
+		d6mesh.rotateX(Math.PI * 1);
+		d6mesh.rotateY(Math.PI * 1);
+		d6mesh.rotateZ(Math.PI * 1);
+		d6mesh.position.set(0, 2300 , 300);			
+		ModContainer.add(d6mesh);	
+		
+		// right arm
+		const Bracciodx = new THREE.BoxGeometry( 600, 100, 200 );
+		const d7mesh = new THREE.Mesh(Bracciodx, materialBase);
+		d7mesh.rotateX(Math.PI * 1);
+		d7mesh.rotateY(Math.PI * 1.25);
+		d7mesh.rotateZ(Math.PI * 1);		
+		d7mesh.position.set(300, 1300 , 600);			
+		ModContainer.add(d7mesh);	
+
+		// left arm
+		const Bracciosx = new THREE.BoxGeometry( 600, 100, 200 );
+		const d8mesh = new THREE.Mesh(Bracciosx, materialBase);
+		d8mesh.rotateX(Math.PI * 1);
+		d8mesh.rotateY(Math.PI * 1.75);
+		d8mesh.rotateZ(Math.PI * 1);		
+		d8mesh.position.set(300, 1300 , 0);			
+		ModContainer.add(d8mesh);	
+
+		// right arm continue
+		const PBracciodx = new THREE.BoxGeometry( 600, 100, 190 );
+		const d9mesh = new THREE.Mesh(PBracciodx, materialBase);
+		d9mesh.rotateX(Math.PI * 1);
+		d9mesh.rotateY(Math.PI * 1);
+		d9mesh.rotateZ(Math.PI * 1);		
+		d9mesh.position.set(743, 1300 , 790);			
+		ModContainer.add(d9mesh);			
+		
+		//prolung braccia sx
+		const PBracciosx = new THREE.BoxGeometry( 600, 100, 190 );
+		const d10mesh = new THREE.Mesh(PBracciosx, materialBase);
+		d10mesh.rotateX(Math.PI * 1);
+		d10mesh.rotateY(Math.PI * 1);
+		d10mesh.rotateZ(Math.PI * 1);		
+		d10mesh.position.set(743, 1300 , -190);			
+		ModContainer.add(d10mesh);	
+		
+		//trave 1 base
+		const trave1 = new THREE.BoxGeometry( 80, 1500, 190 );
+		const materialtrave= new THREE.MeshLambertMaterial({color: 0xd80000});
+		const d12mesh = new THREE.Mesh(trave1, materialtrave);
+		d12mesh.rotateX(Math.PI * 1);
+		d12mesh.rotateY(Math.PI * 1);
+		d12mesh.rotateZ(Math.PI * 1);		
+		d12mesh.position.set(-760, 0 , -300);			
+		ModContainer.add(d12mesh);	
+		
+		//trave 2 base
+		const trave2 = new THREE.BoxGeometry( 80, 1500, 190 );
+		const d13mesh = new THREE.Mesh(trave1, materialtrave);
+		d13mesh.rotateX(Math.PI * 1);
+		d13mesh.rotateY(Math.PI * 1);
+		d13mesh.rotateZ(Math.PI * 1);		
+		d13mesh.position.set(-760, 0 , 300);			
+		ModContainer.add(d13mesh);	
+
+		//targhetta
+		const targhetta = new THREE.BoxGeometry( 10, 300, 300 );
+		const d14mesh = new THREE.Mesh(targhetta, dmaterial2);
+		d14mesh.position.set(-750, 550 , 0);
+		ModContainer.add(d14mesh);	
+		
+		//Torus basso sx
+		const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark );
+		d15mesh.rotateX(Math.PI * 1);
+		d15mesh.rotateY(Math.PI * 1.5);
+		d15mesh.rotateZ(Math.PI * 1);	
+		d15mesh.position.set(-700, 900 , -600);
+		ModContainer.add(d15mesh);	
+	
+		//Torus basso dx
+		const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark );
+		d16mesh.rotateX(Math.PI * 1);
+		d16mesh.rotateY(Math.PI * 1.5);
+		d16mesh.rotateZ(Math.PI * 1);	
+		d16mesh.position.set(-700, 900 , 600);
+		ModContainer.add(d16mesh);	
+	
+		//Torus alto sx
+		const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d17mesh = new THREE.Mesh( torus_as, materialGreyDark );
+		d17mesh.rotateX(Math.PI * 1);
+		d17mesh.rotateY(Math.PI * 1.5);
+		d17mesh.rotateZ(Math.PI * 1);	
+		d17mesh.position.set(700, 900 , -600);
+		ModContainer.add(d17mesh);	
+
+		//Torus alto dx
+		const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark );
+		d18mesh.rotateX(Math.PI * 1);
+		d18mesh.rotateY(Math.PI * 1.5);
+		d18mesh.rotateZ(Math.PI * 1);	
+		d18mesh.position.set(700, 900 , 600);
+		ModContainer.add(d18mesh);
+		ModContainer.rotateY(Math.PI);
+		ModContainer.scale.set(myscale, myscale, myscale);
+		ModContainer.position.set(width*myscale/2, height*myscale/2+50, depth*myscale/2);
+		klystron.add(ModContainer);
+		return klystron;
 	}
-	insertText(50, [850, 2330, 600], [0, Math.PI / 2, 0]);			
-	
-	
-	// rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, softbluematerial);
-	rrmesh.position.set( 0, 0 , -10);
-	rtf_rackObject.add(rrmesh);		
-	
-	//front yellow target
-	const Ftarget = new THREE.BoxGeometry(2, 90, 500);
-	const Ftargetmesh = new THREE.Mesh(Ftarget, target);
-	Ftargetmesh.position.set( -451, 1200 , -15);
-	rtf_rackObject.add(Ftargetmesh);		
-	//Rear yellow target
-	const Rtarget = new THREE.BoxGeometry(2, 90, 500);
-	const Rtargetmesh = new THREE.Mesh(Rtarget, target);
-	Rtargetmesh.position.set( 401, 1200 , -15);
-	rtf_rackObject.add(Rtargetmesh);				
-	
-	//edge le	
-	const llegeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const llemesh = new THREE.Mesh(llegeometry, bluematerial);
-	llemesh.position.set( -425, 0 , -285);
-	rtf_rackObject.add(llemesh);
-	
-	//edge re		
-	const lregeometry = new THREE.BoxGeometry(width-750, height, depth-550);
-	const lremesh = new THREE.Mesh(lregeometry, bluematerial);
-	lremesh.position.set( -425, 0 , 265);
-	rtf_rackObject.add(lremesh);		
-
-	//edge ue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const luemesh = new THREE.Mesh(luegeometry, bluematerial);
-	luemesh.position.set( -425, 1225 , -7);
-	rtf_rackObject.add(luemesh);		
-
-	//edge de		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2450, depth-50);
-	const ldemesh = new THREE.Mesh(ldegeometry, bluematerial);
-	ldemesh.position.set( -425, -1230 , -7);
-	rtf_rackObject.add(ldemesh);		
-	
-	//base border	
-	const screenbordergeometry = new THREE.BoxGeometry(10, 350, 550);
-	const screenbordergeometrymesh = new THREE.Mesh(screenbordergeometry, whitematerial);
-	screenbordergeometrymesh.position.set( -400, 400 , 0);
-	rtf_rackObject.add(screenbordergeometrymesh);
-	
-	//screen border	
-	const basebordergeometry = new THREE.BoxGeometry(10,  150, 200);
-	const basebordergeometrymesh = new THREE.Mesh(basebordergeometry, silvermaterial);
-	basebordergeometrymesh.position.set( -401, 450 , 0);
-	rtf_rackObject.add(basebordergeometrymesh);
-	
-	//screen 	
-	const screengeometry = new THREE.BoxGeometry(10, 140, 180);
-	const screengeometrymesh = new THREE.Mesh(screengeometry, materialDarkblue);
-	screengeometrymesh.position.set( -402, 450 , 0);
-	rtf_rackObject.add(screengeometrymesh);			
-
-	//base border2	
-	const baseborder2geometry = new THREE.BoxGeometry(10, 450, 550);
-	const baseborder2geometrymesh = new THREE.Mesh(baseborder2geometry, whitematerial);
-	baseborder2geometrymesh.position.set( -400, -800 , 0);
-	rtf_rackObject.add(baseborder2geometrymesh);	
-	
-	rtf_rackObject.rotateY(Math.PI);
-	rtf_rackObject.position.set(400, 1250, 400);
-	rtf.add(rtf_rackObject);	
-	return rtf;
-}
-
-
-
-// camod rack
-export function camod(param) {
-	const width=800, height=2500, depth=800;
-	const camod = new THREE.Object3D();
-	const camod_rackObject = new THREE.Object3D();
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialGreyMedium= new THREE.MeshLambertMaterial({color: 0x636363});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x17fc03});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xFBE928});
-	const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});	
-
-	//right rack
-	const lrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const lrmesh = new THREE.Mesh(lrgeometry, materialGreyDark);
-	lrmesh.position.set(0 , 0 , 0);
-	camod_rackObject.add(lrmesh);
-
-	//left rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, materialGreyDark);
-	rrmesh.position.set( 0, 0 , -810);
-	camod_rackObject.add(rrmesh);		
-
-	//edge lle
-	const llegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
-	const llemesh = new THREE.Mesh(llegeometry, blackmaterial);
-	llemesh.position.set( -377, 0 , -1155);
-	camod_rackObject.add(llemesh);
-
-	//edge lre		
-	const lregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
-	const lremesh = new THREE.Mesh(lregeometry, blackmaterial);
-	lremesh.position.set( -377, 0 , -470);
-	camod_rackObject.add(lremesh);		
-
-	//edge rle		
-	const rlegeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
-	const rlemesh = new THREE.Mesh(rlegeometry, blackmaterial);
-	rlemesh.position.set( -377, 0 , -340);
-	camod_rackObject.add(rlemesh);	
-
-	//edge rre		
-	const rregeometry = new THREE.BoxGeometry(width-750, height-100, depth-790);
-	const rremesh = new THREE.Mesh(rregeometry, blackmaterial);
-	rremesh.position.set( -377, 0 , 345);
-	camod_rackObject.add(rremesh);		
-
-	//edge lue		
-	const luegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
-	const luemesh = new THREE.Mesh(luegeometry, blackmaterial);
-	luemesh.position.set( -377, 1200 , -813);
-	camod_rackObject.add(luemesh);		
-
-	//edge lde		
-	const ldegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
-	const ldemesh = new THREE.Mesh(ldegeometry, blackmaterial);
-	ldemesh.position.set( -377, -1200 , -807);
-	camod_rackObject.add(ldemesh);				
-
-	//edge rue		
-	const ruegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
-	const ruemesh = new THREE.Mesh(ruegeometry, blackmaterial);
-	ruemesh.position.set( -377, 1200 , 0);
-	camod_rackObject.add(ruemesh);			
-	
-	//edge rde		
-	const rdegeometry = new THREE.BoxGeometry(width-750, height-2490, depth-105);
-	const rdemesh = new THREE.Mesh(rdegeometry, blackmaterial);
-	rdemesh.position.set( -377, -1200 , 0);
-	camod_rackObject.add(rdemesh);
-	
-	//triangle warning1
-	const trianglewarning = new THREE.CylinderGeometry(200, 200, 1, 3);
-	const trianglewarningmesh = new THREE.Mesh(trianglewarning, yellowmaterial);
-	trianglewarningmesh.rotateX(Math.PI * 0.5);
-	trianglewarningmesh.rotateY(Math.PI * 1);
-	trianglewarningmesh.rotateZ(Math.PI * 0.5);		
-	trianglewarningmesh.position.set(-401, 700 , 0);		
-	camod_rackObject.add(trianglewarningmesh);
-	
-	//triangle warning black
-	const trianglewarning2 = new THREE.CylinderGeometry(180, 180, 1, 3);
-	const trianglewarning2mesh = new THREE.Mesh(trianglewarning2, blackmaterial);
-	trianglewarning2mesh.rotateX(Math.PI * 0.5);
-	trianglewarning2mesh.rotateY(Math.PI * 1);
-	trianglewarning2mesh.rotateZ(Math.PI * 0.5);		
-	trianglewarning2mesh.position.set(-402, 700 , 0);		
-	camod_rackObject.add(trianglewarning2mesh);		
-	
-	//triangle warning yellow2
-	const trianglewarning3 = new THREE.CylinderGeometry(150, 150, 1, 3);
-	const trianglewarning3mesh = new THREE.Mesh(trianglewarning3, yellowmaterial);
-	trianglewarning3mesh.rotateX(Math.PI * 0.5);
-	trianglewarning3mesh.rotateY(Math.PI * 1);
-	trianglewarning3mesh.rotateZ(Math.PI * 0.5);		
-	trianglewarning3mesh.position.set(-403, 700 , 0);		
-	camod_rackObject.add(trianglewarning3mesh);
-	
-	//ZOT1
-	const zot1geometry = new THREE.BoxGeometry(10, 110, 10);
-	const zot1geometrymesh = new THREE.Mesh(zot1geometry, blackmaterial);
-	zot1geometrymesh.position.set( -404, 750 , -20);
-	zot1geometrymesh.rotateX(Math.PI * 1.65);
-	zot1geometrymesh.rotateY(Math.PI * 1.50);
-	zot1geometrymesh.rotateZ(Math.PI * 1.50);		
-	camod_rackObject.add(zot1geometrymesh);	
-	
-	//ZOT2
-	const zot2geometry = new THREE.BoxGeometry(10, 70, 10);
-	const zot2geometrymesh = new THREE.Mesh(zot2geometry, blackmaterial);
-	zot2geometrymesh.position.set( -404, 715 , -16);
-	zot2geometrymesh.rotateX(Math.PI * 1.85);
-	zot2geometrymesh.rotateY(Math.PI * 1.50);
-	zot2geometrymesh.rotateZ(Math.PI * 1.50);		
-	camod_rackObject.add(zot2geometrymesh);	
-	
-	//ZOT3
-	const zot3geometry = new THREE.BoxGeometry(10, 80, 10);
-	const zot3geometrymesh = new THREE.Mesh(zot3geometry, blackmaterial);
-	zot3geometrymesh.position.set( -404, 697 , -1);
-	zot3geometrymesh.rotateX(Math.PI * 1.65);
-	zot3geometrymesh.rotateY(Math.PI * 1.50);
-	zot3geometrymesh.rotateZ(Math.PI * 1.50);		
-	camod_rackObject.add(zot3geometrymesh);	
-
-	//ZOT TRIANGLE
-	const zottrianglegeometry = new THREE.CylinderGeometry(22, 22, 1, 3);
-	const zottrianglegeometrymesh = new THREE.Mesh(zottrianglegeometry, blackmaterial);
-	zottrianglegeometrymesh.rotateX(Math.PI * 0.95);
-	zottrianglegeometrymesh.rotateY(Math.PI * 1);
-	zottrianglegeometrymesh.rotateZ(Math.PI * 0.5);		
-	zottrianglegeometrymesh.position.set(-405, 660 , -19);		
-	camod_rackObject.add(zottrianglegeometrymesh);		
-
-	//handle1
-	const handle1geometry = new THREE.BoxGeometry(10, 250, 80);
-	const handle1geometrymesh = new THREE.Mesh(handle1geometry, materialVeryGreyDark);
-	handle1geometrymesh.position.set( -401, 100 , -550);
-	camod_rackObject.add(handle1geometrymesh);	
-		
-	//handle2
-	const handle2geometry = new THREE.BoxGeometry(10, 250, 80);
-	const handle2geometrymesh = new THREE.Mesh(handle2geometry, materialVeryGreyDark);
-	handle2geometrymesh.position.set( -401, 100 , -260);
-	camod_rackObject.add(handle2geometrymesh);
-	camod_rackObject.rotateY(Math.PI);
-	camod_rackObject.position.set(400, 1250, 340);
-	camod_rackObject.scale.set(1, 1, 0.94);
-	camod.add(camod_rackObject);	
-	return camod;
-}
-
-// base mod
-export function klystron(param) {
-	const text = param.name;
-	const myscale=0.625;
-	console.log('klystron(), text:',text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'));
-	const width=1500, height=1500, depth=1500;
-	const ModK = new THREE.Object3D();
-	const ModContainer = new THREE.Object3D();
-	const materialBase = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const klystron = new THREE.Object3D();
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		klystron.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
+
+	// base KXS
+	export function klystronx(param) {
+		const text = param.name;
+		const myscale=0.625;
+		const width=1200, height=1200, depth=1200;
+		const ModK = new THREE.Object3D();
+		const ModContainer = new THREE.Object3D();
+		const materialBase = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const klystron = new THREE.Object3D();
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			klystron.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		materials = [
+			new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front
+			new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side
+		];
+		function createText() {
+			textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
+			textMesh = new THREE.Mesh( textGeo, materials );
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(75, [760,600,840], [0, Math.PI / 2, 0]);
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const basegeometry = new THREE.BoxGeometry(width, height+200, depth);
+		const d1mesh = new THREE.Mesh(basegeometry, materialBase);
+		d1mesh.position.set(0, 100, -900);	
+		ModContainer.add(d1mesh);
+
+		// redcube
+		const d2geometry = new THREE.BoxGeometry(width-400, height, depth);
+		const dmaterial2= new THREE.MeshLambertMaterial({color: 0xe02900});
+		const d2mesh = new THREE.Mesh(d2geometry, dmaterial2);
+		d2mesh.position.set(200, 1400, -900);		
+		ModContainer.add(d2mesh);	
+		
+  		// base
+		const d3geometry = new THREE.BoxGeometry(width, height, depth);
+		const d3mesh = new THREE.Mesh(d3geometry, materialBase);
+		d3mesh.position.set(0, 0, 300);		
+		ModContainer.add(d3mesh);	
+	
+		// big red cylinder
+		const d4geometry = new THREE.CylinderGeometry(450, 450, 1200, 50);
+		const material = new THREE.MeshLambertMaterial({color: 0xfc0303});	
+		const d4mesh = new THREE.Mesh(d4geometry, material);
+		d4mesh.rotateX(Math.PI * 1);
+		d4mesh.rotateY(Math.PI * 1);
+		d4mesh.rotateZ(Math.PI * 1);
+		d4mesh.position.set(0, 800 , 300);			
+		ModContainer.add(d4mesh);	
+
+		// yellow 1 cylinder
+		const d5geometry = new THREE.CylinderGeometry(300, 370, 200, 50);
+		const material2 = new THREE.MeshLambertMaterial({color: 0xecfc03});			
+		const d5mesh = new THREE.Mesh(d5geometry, material2);
+		d5mesh.rotateX(Math.PI * 1);
+		d5mesh.rotateY(Math.PI * 1);
+		d5mesh.rotateZ(Math.PI * 1);
+		d5mesh.position.set(0, 1450 , 300);			
+		ModContainer.add(d5mesh);	
+		
+		//  yellow 2 cylinder
+		const d6geometry = new THREE.CylinderGeometry(150, 150, 250, 50);
+		const material3= new THREE.MeshLambertMaterial({color: 0xecfc03});
+		const d6mesh = new THREE.Mesh(d6geometry, material3);
+		d6mesh.rotateX(Math.PI * 1);
+		d6mesh.rotateY(Math.PI * 1);
+		d6mesh.rotateZ(Math.PI * 1);
+		d6mesh.position.set(0, 1680 , 300);			
+		ModContainer.add(d6mesh);	
+
+		//  yellow 3 cylinder
+		const d7geometry = new THREE.CylinderGeometry(200, 200, 100, 50);
+		const d7mesh = new THREE.Mesh(d7geometry, material3);
+		d7mesh.rotateX(Math.PI * 1);
+		d7mesh.rotateY(Math.PI * 1);
+		d7mesh.rotateZ(Math.PI * 1);
+		d7mesh.position.set(0, 1780 , 300);			
+		ModContainer.add(d7mesh);			
+		
+		// tag
+		const targhetta = new THREE.BoxGeometry( 10, 200, 300 );
+		const materialwhite= new THREE.MeshLambertMaterial({color: 0xeffffff});
+		const d14mesh = new THREE.Mesh(targhetta, materialwhite);
+		d14mesh.position.set(-610, 600 , -600);
+		ModContainer.add(d14mesh);	
+		
+		// torus red1 
+		const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark );
+		d15mesh.rotateX(Math.PI * 1);
+		d15mesh.rotateY(Math.PI * 1.5);
+		d15mesh.rotateZ(Math.PI * 1);	
+		d15mesh.position.set(550, 2050 , -1400);
+		ModContainer.add(d15mesh);	
+	
+		// torus red2
+		const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark );
+		d16mesh.rotateX(Math.PI * 1);
+		d16mesh.rotateY(Math.PI * 1.5);
+		d16mesh.rotateZ(Math.PI * 1);	
+		d16mesh.position.set(-150, 2050 , -400);
+		ModContainer.add(d16mesh);	
+	
+		// torus 1 white
+		const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d17mesh = new THREE.Mesh( torus_as, materialGreyDark );
+		d17mesh.rotateX(Math.PI * 1);
+		d17mesh.rotateY(Math.PI * 1.5);
+		d17mesh.rotateZ(Math.PI * 1);	
+		d17mesh.position.set(-400, 850 , -500);
+		ModContainer.add(d17mesh);	
+
+		// torus 2 white
+		const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
+		const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark );
+		d18mesh.rotateX(Math.PI * 1);
+		d18mesh.rotateY(Math.PI * 1.5);
+		d18mesh.rotateZ(Math.PI * 1);	
+		d18mesh.position.set(-400, 850 , -1300);
+		ModContainer.add(d18mesh);
+		
+		// line1
+		const line1 = new THREE.BoxGeometry(10, 10, 1150);
+		const d19mesh = new THREE.Mesh(line1, dmaterial2);
+		d19mesh.position.set(-610, 750, -900);		
+		ModContainer.add(d19mesh);		
+	
+		// line2
+		const line2 = new THREE.BoxGeometry(10, 10, 1150);
+		const d20mesh = new THREE.Mesh(line2, dmaterial2);
+		d20mesh.position.set(-610, 550, 300);		
+		ModContainer.add(d20mesh);			
+
+		ModContainer.rotateY(Math.PI);
+		ModContainer.scale.set(myscale, myscale, myscale);
+		ModContainer.position.set(width*myscale/2, height*myscale/2, depth*myscale/2);
+		klystron.add(ModContainer);
+		return klystron;
 	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
+
+	// cavity for linac
+	export function cavitylinac(param) {
+		const length = param.length? param.length: 1100;
+		const cavitylinacMaster = new THREE.Object3D();
+		const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const d1geometry = new THREE.CylinderGeometry(75, 75, length, 25);
+		const d1mesh = new THREE.Mesh(d1geometry, dmaterial);
+		d1mesh.position.set(0, length/2+350, 0);
+		cavitylinacMaster.add(d1mesh);				
+		cavitylinacMaster.rotateX(Math.PI * 0.5);
+		cavitylinacMaster.rotatedX = true;
+		return cavitylinacMaster;
+	}
+	// Current Monitor	
+	export function cm(param) {
+		const cmContiner = new THREE.Object3D();
+		const cmObject = new THREE.Object3D();
+		
+		//cylinder mid
+		const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20);
+		const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff});
+		const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
+		cylmesh.rotateX(Math.PI * 1);
+		cylmesh.rotateY(Math.PI * 1.0);
+		cylmesh.rotateZ(Math.PI * 1.5);
+		cylmesh.position.set(0, 0 , 0);			
+		cmObject.add(cylmesh);			
+		
+		//cylinder center
+		const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20);
+		const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70});
+		const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material);
+		cyl2mesh.rotateX(Math.PI * 1);
+		cyl2mesh.rotateY(Math.PI * 1.0);
+		cyl2mesh.rotateZ(Math.PI * 1.5);
+		cyl2mesh.position.set(0, 0 , 0);			
+		cmObject.add(cyl2mesh);			
+		
+			
+		cmObject.scale.setX(1);
+		cmObject.scale.setY(1);
+		cmObject.scale.setZ(1);
+		cmObject.position.set(0, 0, 0);
+		cmContiner.add(cmObject);
+		cmContiner.rotateY(Math.PI * -0.5);		
+		
+		
+		return cmContiner;
 	}
-	materials = [
-		new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front
-		new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side
-	];
-	function createText() {
-		textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01','').replace('KSP','KS').replace('K0','K'), {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
-		textMesh = new THREE.Mesh( textGeo, materials );
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
+	// flsc
+	export function flsc(param) {
+		const length=700;
+		const flscSR = new THREE.Object3D();
+		const flscContiner = new THREE.Object3D();
+		
+		const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const materialDarkGrey = new THREE.MeshLambertMaterial({color: 0x8c8c8c});
+		const materialOrange= new THREE.MeshLambertMaterial({color: 0xfc9403});
+		const materialBlack= new THREE.MeshLambertMaterial({color: 0x000000});
+		
+		//cil center
+		const d1geometry = new THREE.CylinderGeometry(25, 25, 400, 25);
+		const d1mesh = new THREE.Mesh(d1geometry, materialGrey);
+		d1mesh.position.set(0, 200 , 0);
+		flscContiner.add(d1mesh);
+		flscContiner.rotateX(Math.PI * 1);
+			
+		// esagono
+		const d2geometry = new THREE.CylinderGeometry(70, 70, 70, 6);
+		const d2mesh = new THREE.Mesh(d2geometry, materialGrey);
+		d2mesh.position.set(0, 290, 0);
+		d2mesh.rotateX(Math.PI * 1);
+		d2mesh.rotateY(Math.PI * 1);
+		d2mesh.rotateZ(Math.PI * 1.5);		
+		flscContiner.add(d2mesh);
+		
+		// box orange down
+		const orangegeometry = new THREE.CylinderGeometry(90, 90, 250, 15);
+		const orangegeometrymesh = new THREE.Mesh(orangegeometry, materialOrange);
+		orangegeometrymesh.position.set(0, 550, 0);		
+		flscContiner.add(orangegeometrymesh);
+		
+		// box black down
+		const blackgeometry = new THREE.CylinderGeometry(90, 90, 25, 15);
+		const blackgeometrymesh = new THREE.Mesh(blackgeometry, materialBlack);
+		blackgeometrymesh.position.set(0, 412, 0);		
+		flscContiner.add(blackgeometrymesh);			
+		
+		// base zigrinatura
+		const d3geometry = new THREE.CylinderGeometry(90, 90, 50, 15);
+		const d3mesh = new THREE.Mesh(d3geometry, materialGrey);
+		d3mesh.rotateX(Math.PI * 1);
+		d3mesh.rotateY(Math.PI * 1);
+		d3mesh.rotateZ(Math.PI * 1);
+		d3mesh.position.set(0, 170 , 0);			
+		flscContiner.add(d3mesh);		
+		
+		// zigrinatura
+		const d4geometry = new THREE.CylinderGeometry(60, 60, 170, 15);
+		const textureLoader = new THREE.TextureLoader();
+		const texture = textureLoader.load('./components/flsc_texture.png');	
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(5, 40);		
+		const material = new THREE.MeshBasicMaterial({ map: texture });		
+		const d4mesh = new THREE.Mesh(d4geometry, material);
+		d4mesh.rotateX(Math.PI * 1);
+		d4mesh.rotateY(Math.PI * 1);
+		d4mesh.rotateZ(Math.PI * 1);
+		d4mesh.position.set(0, 60 , 0);			
+		flscContiner.add(d4mesh);		
+		
+		// tetto zigrinatura
+		const d5geometry = new THREE.CylinderGeometry(90, 90, 50, 15);
+		const d5mesh = new THREE.Mesh(d5geometry, materialGrey);
+		d5mesh.rotateX(Math.PI * 1);
+		d5mesh.rotateY(Math.PI * 1);
+		d5mesh.rotateZ(Math.PI * 1);
+		d5mesh.position.set(0, -50 , 0);			
+		flscContiner.add(d5mesh);	
+		
+		//half sphere down1
+		const down1geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const down1geometrymesh = new THREE.Mesh(down1geometry, materialGrey);
+		down1geometrymesh.position.set(-75, 170, -75);
+		flscContiner.add(down1geometrymesh);			
+		
+		//half sphere up1
+		const up1geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const up1geometrymesh = new THREE.Mesh(up1geometry, materialGrey);
+		up1geometrymesh.position.set(-75, -50, -75);
+		flscContiner.add(up1geometrymesh);	
+		
+		//half sphere down2
+		const down2geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const down2geometrymesh = new THREE.Mesh(down2geometry, materialGrey);
+		down2geometrymesh.position.set(75, 170, -75);
+		flscContiner.add(down2geometrymesh);			
+		
+		//half sphere up2
+		const up2geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const up2geometrymesh = new THREE.Mesh(up2geometry, materialGrey);
+		up2geometrymesh.position.set(75, -50, -75);
+		flscContiner.add(up2geometrymesh);	
+		
+		//half sphere down3
+		const down3geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const down3geometrymesh = new THREE.Mesh(down2geometry, materialGrey);
+		down3geometrymesh.position.set(0, 170, 100);
+		flscContiner.add(down3geometrymesh);			
+		
+		//half sphere up3
+		const up3geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
+		const up3geometrymesh = new THREE.Mesh(up3geometry, materialGrey);
+		up3geometrymesh.position.set(0, -50, 100);
+		flscContiner.add(up3geometrymesh);			
+				
+		//cil support1
+		const d11geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
+		const d11mesh = new THREE.Mesh(d11geometry, materialGrey);
+		d11mesh.position.set(-75, 20, -75);
+		flscContiner.add(d11mesh);	
+		
+		//cil support2
+		const d12geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
+		const d12mesh = new THREE.Mesh(d12geometry, materialGrey);
+		d12mesh.position.set(75, 20, -75);
+		flscContiner.add(d12mesh);				
+		
+		//cil support3
+		const d13geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
+		const d13mesh = new THREE.Mesh(d13geometry, materialGrey);
+		d13mesh.position.set(0, 20, 100);
+		flscContiner.add(d13mesh);				
+	
+		// blocco supporto
+		const d15geometry = new THREE.CylinderGeometry(120, 120, 20, 25);
+		const d15mesh = new THREE.Mesh(d15geometry, materialGrey);
+		d15mesh.position.set(0, -130, 0);
+		d15mesh.rotateX(Math.PI * 1);
+		flscContiner.add(d15mesh);	
+		
+		//internal block
+		const d16geometry = new THREE.CylinderGeometry(20, 20, 60, 15);
+		const d16mesh = new THREE.Mesh(d16geometry, materialGrey);
+		d16mesh.position.set(0, -100, 0);
+		d16mesh.rotateX(Math.PI * 1);
+		flscContiner.add(d16mesh);			
+		
+		// high box1 
+		const d7geometry = new THREE.BoxGeometry(40, 90, 100);
+		const d7mesh = new THREE.Mesh(d7geometry, materialDarkGrey);
+		d7mesh.position.set(-20, -180, 0);		
+		flscContiner.add(d7mesh);				
+		
+		// high box2
+		const d8geometry = new THREE.BoxGeometry(40, 60, 100);
+		const d8mesh = new THREE.Mesh(d8geometry, materialDarkGrey);
+		d8mesh.position.set(20, -170, 0);		
+		flscContiner.add(d8mesh);			
+
+		flscContiner.position.set(0, 235, 0);
+		flscContiner.scale.setX(0.8);
+		flscContiner.scale.setY(0.8);
+		flscContiner.scale.setZ(0.8);
+		flscSR.add(flscContiner);
+		flscSR.rotateY(Math.PI * -0.5);
+		return flscSR;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+    //SIP
+	export function sip(param) {
+		const sipContiner = new THREE.Object3D();
+		const sipObject = new THREE.Object3D();
+		
+		//cylinder
+		const cylgeometry = new THREE.CylinderGeometry(35, 35, 50, 15);
+		const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
+		const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
+		cylmesh.rotateX(Math.PI * 1);
+		cylmesh.rotateY(Math.PI * 1.0);
+		cylmesh.rotateZ(Math.PI * 1.5);
+		cylmesh.position.set(0, 0 , 0);			
+		sipObject.add(cylmesh);			
+		
+		// connect
+		const vlvgeometry = new THREE.BoxGeometry(30, 90, 30 );
+		const vlv1mesh = new THREE.Mesh(vlvgeometry, cylmaterial);
+		vlv1mesh.position.set(0, -50, 0);
+		sipObject.add(vlv1mesh);		
+		
+		// box
+		const boxmaterial = new THREE.MeshLambertMaterial({color: 0xb6b6b6});
+		const boxgeometry = new THREE.BoxGeometry(60, 80, 120 );
+		const boxmesh = new THREE.Mesh(boxgeometry, boxmaterial);
+		boxmesh.position.set(0, -120, 0);
+		sipObject.add(boxmesh);	
+		
+		// blackbox1
+		const bb1material = new THREE.MeshLambertMaterial({color: 0x000000});
+		const bb1geometry = new THREE.BoxGeometry(60, 80, 10 );
+		const bb1mesh = new THREE.Mesh(bb1geometry, bb1material);
+		bb1mesh.position.set(0, -120, -65);
+		sipObject.add(bb1mesh);
+		
+		// blackbox2
+		const bb2geometry = new THREE.BoxGeometry(60, 80, 10 );
+		const bb2mesh = new THREE.Mesh(bb2geometry, bb1material);
+		bb2mesh.position.set(0, -120, 65);
+		sipObject.add(bb2mesh);
+		
+		// border
+		const bordergeometry = new THREE.BoxGeometry(61, 81, 1 );
+		const bordermesh = new THREE.Mesh(bordergeometry, bb1material);
+		bordermesh.position.set(0, -120, 0);
+		sipObject.add(bordermesh);		
+	
+		sipObject.scale.setX(1);
+		sipObject.scale.setY(1);
+		sipObject.scale.setZ(1);
+		sipObject.position.set(0, 0, 0);
+		sipContiner.add(sipObject);
+		sipContiner.rotateY(Math.PI * 0.5);		
+		
+		return sipContiner;
 	}
-	insertText(75, [940,730,560], [0, Math.PI / 2, 0]);
-	
-	const basegeometry = new THREE.BoxGeometry(width, height, depth);
-	const d1mesh = new THREE.Mesh(basegeometry, materialBase);
-	ModContainer.add(d1mesh);
-
-	// cover
-	const d2geometry = new THREE.BoxGeometry(width+100, 100, depth+100);
-	const dmaterial2= new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const d2mesh = new THREE.Mesh(d2geometry, dmaterial2);
-	d2mesh.position.set(0, 800, 0);		
-	ModContainer.add(d2mesh);	
-	
-	  // base
-	const d3geometry = new THREE.BoxGeometry(width+100, 100, depth+100);
-	const d3mesh = new THREE.Mesh(d3geometry, materialBase);
-	d3mesh.position.set(0, -800, 0);		
-	ModContainer.add(d3mesh);	
-
-	// big cylinder
-	const d4geometry = new THREE.CylinderGeometry(400, 400, 1200, 50);
-	const textureLoader = new THREE.TextureLoader();
-	const texture = textureLoader.load('./components/mod_texture.png');	
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(5, 5);		
-	const material = new THREE.MeshBasicMaterial({ map: texture });		
-	const d4mesh = new THREE.Mesh(d4geometry, material);
-	d4mesh.rotateX(Math.PI * 1);
-	d4mesh.rotateY(Math.PI * 1);
-	d4mesh.rotateZ(Math.PI * 1);
-	d4mesh.position.set(0, 970 , 300);			
-	ModContainer.add(d4mesh);	
-
-	// small cylinder
-	const d5geometry = new THREE.CylinderGeometry(200, 200, 1200, 50);
-	const textureLoader2 = new THREE.TextureLoader();
-	const texture2 = textureLoader.load('./components/mod_texture.png');	
-	texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
-	texture2.repeat.set(3, 3);		
-	const material2 = new THREE.MeshBasicMaterial({ map: texture2 });		
-	const d5mesh = new THREE.Mesh(d5geometry, material2);
-	d5mesh.rotateX(Math.PI * 1);
-	d5mesh.rotateY(Math.PI * 1);
-	d5mesh.rotateZ(Math.PI * 1);
-	d5mesh.position.set(0, 1670 , 300);			
-	ModContainer.add(d5mesh);	
-	
-	// high cover
-	const d6geometry = new THREE.CylinderGeometry(220, 220, 90, 50);
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const d6mesh = new THREE.Mesh(d6geometry, materialGreyDark);
-	d6mesh.rotateX(Math.PI * 1);
-	d6mesh.rotateY(Math.PI * 1);
-	d6mesh.rotateZ(Math.PI * 1);
-	d6mesh.position.set(0, 2300 , 300);			
-	ModContainer.add(d6mesh);	
-	
-	// right arm
-	const Bracciodx = new THREE.BoxGeometry( 600, 100, 200 );
-	const d7mesh = new THREE.Mesh(Bracciodx, materialBase);
-	d7mesh.rotateX(Math.PI * 1);
-	d7mesh.rotateY(Math.PI * 1.25);
-	d7mesh.rotateZ(Math.PI * 1);		
-	d7mesh.position.set(300, 1300 , 600);			
-	ModContainer.add(d7mesh);	
-
-	// left arm
-	const Bracciosx = new THREE.BoxGeometry( 600, 100, 200 );
-	const d8mesh = new THREE.Mesh(Bracciosx, materialBase);
-	d8mesh.rotateX(Math.PI * 1);
-	d8mesh.rotateY(Math.PI * 1.75);
-	d8mesh.rotateZ(Math.PI * 1);		
-	d8mesh.position.set(300, 1300 , 0);			
-	ModContainer.add(d8mesh);	
-
-	// right arm continue
-	const PBracciodx = new THREE.BoxGeometry( 600, 100, 190 );
-	const d9mesh = new THREE.Mesh(PBracciodx, materialBase);
-	d9mesh.rotateX(Math.PI * 1);
-	d9mesh.rotateY(Math.PI * 1);
-	d9mesh.rotateZ(Math.PI * 1);		
-	d9mesh.position.set(743, 1300 , 790);			
-	ModContainer.add(d9mesh);			
-	
-	//prolung braccia sx
-	const PBracciosx = new THREE.BoxGeometry( 600, 100, 190 );
-	const d10mesh = new THREE.Mesh(PBracciosx, materialBase);
-	d10mesh.rotateX(Math.PI * 1);
-	d10mesh.rotateY(Math.PI * 1);
-	d10mesh.rotateZ(Math.PI * 1);		
-	d10mesh.position.set(743, 1300 , -190);			
-	ModContainer.add(d10mesh);	
-	
-	//trave 1 base
-	const trave1 = new THREE.BoxGeometry( 80, 1500, 190 );
-	const materialtrave= new THREE.MeshLambertMaterial({color: 0xd80000});
-	const d12mesh = new THREE.Mesh(trave1, materialtrave);
-	d12mesh.rotateX(Math.PI * 1);
-	d12mesh.rotateY(Math.PI * 1);
-	d12mesh.rotateZ(Math.PI * 1);		
-	d12mesh.position.set(-760, 0 , -300);			
-	ModContainer.add(d12mesh);	
-	
-	//trave 2 base
-	const trave2 = new THREE.BoxGeometry( 80, 1500, 190 );
-	const d13mesh = new THREE.Mesh(trave1, materialtrave);
-	d13mesh.rotateX(Math.PI * 1);
-	d13mesh.rotateY(Math.PI * 1);
-	d13mesh.rotateZ(Math.PI * 1);		
-	d13mesh.position.set(-760, 0 , 300);			
-	ModContainer.add(d13mesh);	
-
-	//targhetta
-	const targhetta = new THREE.BoxGeometry( 10, 300, 300 );
-	const d14mesh = new THREE.Mesh(targhetta, dmaterial2);
-	d14mesh.position.set(-750, 550 , 0);
-	ModContainer.add(d14mesh);	
+
+	// FuG PS
+	export function fug(width=800, height=1700, depth=600) {
+		const text = 'Fug';
+		const fugObject = new THREE.Object3D();
+		let group, textMesh, textGeo, materials;
+		let size = 60;
+		let textheight = 10;
+		let pos = [];
+		let rot = [];
+		const hover = 30;
+		const curveSegments = 8;
+		let font;
+		function insertText(isize, ipos, irot) {
+			group = new THREE.Group();
+			group.position.y = 100;
+			fugObject.add( group );
+			size = isize;
+			pos = ipos;
+			rot = irot;
+			loadFont();
+		}
+		function loadFont() {
+			const loader = new FontLoader();
+			// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
+			loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
+				font = response;
+				refreshText();
+			} );
+		}
+		materials = [
+			new THREE.MeshPhongMaterial( { color: 0x272c7d  , flatShading: true } ), // front
+			new THREE.MeshPhongMaterial( { color: 0x272c7d  } ) // side
+		];
+		function createText() {
+			textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments});
+			textGeo.computeBoundingBox();
+			const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
+			textMesh = new THREE.Mesh( textGeo, materials );
+			textMesh.position.x = pos[0];
+			textMesh.position.y = pos[1];
+			textMesh.position.z = pos[2];
+			textMesh.rotation.x = rot[0];
+			textMesh.rotation.y = rot[1];
+			textMesh.rotation.z = rot[2];
+			group.add( textMesh );
+		}
+		function refreshText() {
+			group.remove( textMesh );
+			if ( ! text ) return;
+			createText();
+		}
+		insertText(270, [-650,-1500,-720], [0, -Math.PI / 2, 0]);
 	
-	//Torus basso sx
-	const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark );
-	d15mesh.rotateX(Math.PI * 1);
-	d15mesh.rotateY(Math.PI * 1.5);
-	d15mesh.rotateZ(Math.PI * 1);	
-	d15mesh.position.set(-700, 900 , -600);
-	ModContainer.add(d15mesh);	
-
-	//Torus basso dx
-	const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark );
-	d16mesh.rotateX(Math.PI * 1);
-	d16mesh.rotateY(Math.PI * 1.5);
-	d16mesh.rotateZ(Math.PI * 1);	
-	d16mesh.position.set(-700, 900 , 600);
-	ModContainer.add(d16mesh);	
-
-	//Torus alto sx
-	const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d17mesh = new THREE.Mesh( torus_as, materialGreyDark );
-	d17mesh.rotateX(Math.PI * 1);
-	d17mesh.rotateY(Math.PI * 1.5);
-	d17mesh.rotateZ(Math.PI * 1);	
-	d17mesh.position.set(700, 900 , -600);
-	ModContainer.add(d17mesh);	
-
-	//Torus alto dx
-	const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark );
-	d18mesh.rotateX(Math.PI * 1);
-	d18mesh.rotateY(Math.PI * 1.5);
-	d18mesh.rotateZ(Math.PI * 1);	
-	d18mesh.position.set(700, 900 , 600);
-	ModContainer.add(d18mesh);
-	ModContainer.rotateY(Math.PI);
-	ModContainer.scale.set(myscale, myscale, myscale);
-	ModContainer.position.set(width*myscale/2, height*myscale/2+50, depth*myscale/2);
-	klystron.add(ModContainer);
-	return klystron;
-}
-
-// base KXS
-export function klystronx(param) {
-	const text = param.name;
-	const myscale=0.625;
-	const width=1200, height=1200, depth=1200;
-	const ModK = new THREE.Object3D();
-	const ModContainer = new THREE.Object3D();
-	const materialBase = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const klystron = new THREE.Object3D();
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		klystron.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
-	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
+		
+		
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const testmaterial = new THREE.MeshLambertMaterial({color: 0x00ff00});
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x095c23});
+		const greenmaterial2 = new THREE.MeshLambertMaterial({color: 0x0f993b});
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xab0000});
+		const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
+		const emergencymaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
+		const blumaterial = new THREE.MeshLambertMaterial({color: 0x272c7d});
+		const whiteaterial = new THREE.MeshLambertMaterial({color: 0xdfdfe8});
+
+		//fix FUG logo
+		const fugfixgeometry = new THREE.BoxGeometry(10, 50, 460);
+		const fugfixgeometrymesh = new THREE.Mesh(fugfixgeometry, blumaterial);
+		fugfixgeometrymesh.position.set(-655,-1157,-310);
+		fugObject.add(fugfixgeometrymesh);	
+		
+		//left rack
+		const lrgeometry = new THREE.BoxGeometry(800, 1700, 600);
+		const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
+		lrmesh.position.set(0 , 0 , -100);
+		fugObject.add(lrmesh);
+		
+		//right rack
+		const rrgeometry = new THREE.BoxGeometry(800, 1700, 600);
+		const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
+		rrmesh.position.set( 0, 0 , -710);
+		fugObject.add(rrmesh);		
+		
+		//basefug
+		const basegeometry = new THREE.BoxGeometry(1050, 900, 1200);
+		const basemesh = new THREE.Mesh(basegeometry, silvermaterial);
+		basemesh.position.set( -130, -1320 , -400);
+		fugObject.add(basemesh);			
+		
+		//edge lle		
+		const llegeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
+		llemesh.position.set( -425, 0 , -985);
+		fugObject.add(llemesh);
+		
+		//edge lre		
+		const lregeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
+		lremesh.position.set( -425, 0 , -430);
+		fugObject.add(lremesh);		
+
+		//edge rle		
+		const rlegeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
+		rlemesh.position.set( -425, 0 , -370);
+		fugObject.add(rlemesh);	
+		
+		//edge rre		
+		const rregeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
+		rremesh.position.set( -425, 0 , 175);
+		fugObject.add(rremesh);		
+		
+		//edge lue		
+		const luegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
+		luemesh.position.set( -425, 825 , -707);
+		fugObject.add(luemesh);		
+
+		//edge lde		
+		const ldegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
+		ldemesh.position.set( -425, -830 , -707);
+		fugObject.add(ldemesh);				
+
+		//edge rue		
+		const ruegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
+		ruemesh.position.set( -425, 825 , -100);
+		fugObject.add(ruemesh);			
+		
+		//edge rde		
+		const rdegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
+		rdemesh.position.set( -425, -825 , -100);
+		fugObject.add(rdemesh);	
+		
+		//GreenButton
+		const greenbutton = new THREE.CylinderGeometry(55, 55, 40, 15);
+		const greenbuttonmesh = new THREE.Mesh(greenbutton, greenmaterial);
+		greenbuttonmesh.rotateX(Math.PI * 0.5);
+		greenbuttonmesh.rotateY(Math.PI * 1);
+		greenbuttonmesh.rotateZ(Math.PI * 0.5);
+		greenbuttonmesh.position.set(-400, 600 , -670);		
+		fugObject.add(greenbuttonmesh);		
+		
+		//GreenLed
+		const greenled = new THREE.CylinderGeometry(40, 40, 40, 15);
+		const greenledmesh = new THREE.Mesh(greenled, greenmaterial2);
+		greenledmesh.rotateX(Math.PI * 0.5);
+		greenledmesh.rotateY(Math.PI * 1);
+		greenledmesh.rotateZ(Math.PI * 0.5);
+		greenledmesh.position.set(-400, 600 , -550);		
+		fugObject.add(greenledmesh);			
+
+		//RedButton
+		const redbutton = new THREE.CylinderGeometry(55, 55, 40, 15);
+		const redbuttonmesh = new THREE.Mesh(redbutton, redmaterial);
+		redbuttonmesh.rotateX(Math.PI * 0.5);
+		redbuttonmesh.rotateY(Math.PI * 1);
+		redbuttonmesh.rotateZ(Math.PI * 0.5);
+		redbuttonmesh.position.set(-400, 450 , -670);		
+		fugObject.add(redbuttonmesh);			
+
+		//YelloyLed
+		const yellowled = new THREE.CylinderGeometry(40, 40, 40, 15);
+		const yellowledmesh = new THREE.Mesh(yellowled, yellowmaterial);
+		yellowledmesh.rotateX(Math.PI * 0.5);
+		yellowledmesh.rotateY(Math.PI * 1);
+		yellowledmesh.rotateZ(Math.PI * 0.5);
+		yellowledmesh.position.set(-400, 450 , -550);		
+		fugObject.add(yellowledmesh);	
+		
+		//EmergenctButton
+		const emergencybutton = new THREE.CylinderGeometry(80, 80, 40, 15);
+		const emergencybuttonmesh = new THREE.Mesh(emergencybutton, emergencymaterial);
+		emergencybuttonmesh.rotateX(Math.PI * 0.5);
+		emergencybuttonmesh.rotateY(Math.PI * 1);
+		emergencybuttonmesh.rotateZ(Math.PI * 0.5);
+		emergencybuttonmesh.position.set(-400, 270 , -620);		
+		fugObject.add(emergencybuttonmesh);	
+		
+		//display up		
+		const displayupgeometry = new THREE.BoxGeometry(50, 50, 150);
+		const displayupgeometrymesh = new THREE.Mesh(displayupgeometry, materialVeryGreyDark);
+		displayupgeometrymesh.position.set( -400, 600 , -850);
+		fugObject.add(displayupgeometrymesh);			
+		
+		//display2 down		
+		const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150);
+		const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark);
+		displayupgeometrymesh2.position.set( -400, 500 , -850);
+		fugObject.add(displayupgeometrymesh2);	
+		
+		//switch		
+		const switchgeometry = new THREE.BoxGeometry(10, 350, 200);
+		const switchgeometrymesh = new THREE.Mesh(switchgeometry, materialVeryGreyDark);
+		switchgeometrymesh.position.set( -400, -50 , -850);
+		fugObject.add(switchgeometrymesh);	
+		
+		
+		//Lgrid2 down	
+		const grid2geometry = new THREE.BoxGeometry(10, 200, 520);
+		const textureLoader2 = new THREE.TextureLoader();
+		const texture2 = textureLoader2.load('./components/grid_texture.png');	
+		texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
+		texture2.repeat.set(50, 1);		
+		const material2 = new THREE.MeshBasicMaterial({ map: texture2 });		
+		const grid2geometrymesh = new THREE.Mesh(grid2geometry, material2);
+		grid2geometrymesh.rotateX(Math.PI * 1);
+		grid2geometrymesh.rotateY(Math.PI * 1);
+		grid2geometrymesh.rotateZ(Math.PI * 1);
+		grid2geometrymesh.position.set( -400, -650 , -710);
+		fugObject.add(grid2geometrymesh);	
+
+		
+		//Rgrid2 down	
+		const grid4geometry = new THREE.BoxGeometry(10, 200, 520);
+		const textureLoader4 = new THREE.TextureLoader();
+		const texture4 = textureLoader4.load('./components/grid_texture.png');	
+		texture4.wrapS = texture4.wrapT = THREE.RepeatWrapping;
+		texture4.repeat.set(50, 1);		
+		const material4 = new THREE.MeshBasicMaterial({ map: texture2 });		
+		const grid4geometrymesh = new THREE.Mesh(grid4geometry, material2);
+		grid4geometrymesh.rotateX(Math.PI * 1);
+		grid4geometrymesh.rotateY(Math.PI * 1);
+		grid4geometrymesh.rotateZ(Math.PI * 1);
+		grid4geometrymesh.position.set( -400, -650 , -130);
+		fugObject.add(grid4geometrymesh);	
+		
+		//drawer1		
+		const drawer1geometry = new THREE.BoxGeometry(10, 220, 500);
+		const drawer1geometrytrymesh = new THREE.Mesh(drawer1geometry, whiteaterial);
+		drawer1geometrytrymesh.position.set( -400, 650 , -100);
+		fugObject.add(drawer1geometrytrymesh);			
+		
+		//drawer2		
+		const drawer2geometry = new THREE.BoxGeometry(10, 220, 500);
+		const drawer2geometrytrymesh = new THREE.Mesh(drawer2geometry, whiteaterial);
+		drawer2geometrytrymesh.position.set( -400, 400 , -100);
+		fugObject.add(drawer2geometrytrymesh);	
+		
+		fugObject.rotateY(Math.PI);
+		fugObject.position.set(400, 1750, 300);
+		const fug = new THREE.Object3D();
+		fug.add(fugObject);
+		return fug;
 	}
-	materials = [
-		new THREE.MeshPhongMaterial( { color: 0x333333, flatShading: true } ), // front
-		new THREE.MeshPhongMaterial( { color: 0x333333 } ) // side
-	];
-	function createText() {
-		textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
-		textMesh = new THREE.Mesh( textGeo, materials );
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
+/*
+	export function fug(param) {
+		const width=800, height=1700, depth=600;
+		const fug = new THREE.Object3D();
+		const fugObject = new THREE.Object3D();
+		
+		const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
+		const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
+		const basematerial = new THREE.MeshLambertMaterial({color: 0xc4b2a8});
+		
+		//right rack
+		const lrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
+		lrmesh.position.set(0 , 0 , -100);
+		fugObject.add(lrmesh);
+		
+		
+		//left rack
+		const rrgeometry = new THREE.BoxGeometry(width, height, depth);
+		const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
+		rrmesh.position.set( 0, 0 , -710);
+		fugObject.add(rrmesh);		
+		
+		//basefug
+		const basegeometry = new THREE.BoxGeometry(width+250, height-800, depth+600);
+		const basemesh = new THREE.Mesh(basegeometry, silvermaterial);
+		basemesh.position.set( -130, -1320 , -400);
+		fugObject.add(basemesh);			
+		
+		//edge lle		
+		const llegeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
+		llemesh.position.set( -425, 0 , -985);
+		fugObject.add(llemesh);
+		
+		//edge lre		
+		const lregeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
+		lremesh.position.set( -425, 0 , -430);
+		fugObject.add(lremesh);		
+
+		//edge rle		
+		const rlegeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
+		rlemesh.position.set( -425, 0 , -370);
+		fugObject.add(rlemesh);	
+		
+		//edge rre		
+		const rregeometry = new THREE.BoxGeometry(50, 1700, 50);
+		const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
+		rremesh.position.set( -425, 0 , 175);
+		fugObject.add(rremesh);		
+		
+		//edge lue		
+		const luegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
+		luemesh.position.set( -425, 825 , -707);
+		fugObject.add(luemesh);		
+
+		//edge lde		
+		const ldegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
+		ldemesh.position.set( -425, -830 , -707);
+		fugObject.add(ldemesh);				
+
+		//edge rue		
+		const ruegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
+		ruemesh.position.set( -425, 825 , -100);
+		fugObject.add(ruemesh);			
+		
+		//edge rde		
+		const rdegeometry = new THREE.BoxGeometry(50, 50, 505);
+		const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
+		rdemesh.position.set( -425, -825 , -100);
+		fugObject.add(rdemesh);	
+				
+		//base1 left and texture
+   		const drawer1geometry = new THREE.BoxGeometry(10, 1600, 500);
+		const textureLoader = new THREE.TextureLoader();
+		const texture = textureLoader.load('./components/fug1screenfoto.jpg');
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(1, 1);
+		const material = new THREE.MeshBasicMaterial({ map: texture });
+		const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material);
+		gridgeometrymesh.rotateX(Math.PI * 1);
+		gridgeometrymesh.rotateY(Math.PI * 1);
+		gridgeometrymesh.rotateZ(Math.PI * 1);
+		gridgeometrymesh.position.set( -400, 0 , -707);
+		fugObject.add(gridgeometrymesh);		
+		
+		//base2 right and texture
+   		const drawer2geometry = new THREE.BoxGeometry(10, 1600, 500);
+		const textureLoader2 = new THREE.TextureLoader();
+		const texture2 = textureLoader2.load('./components/fug2screenfoto.jpg');
+		texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
+		texture2.repeat.set(1, 1);
+		const material2 = new THREE.MeshBasicMaterial({ map: texture2 });
+		const gridgeometry2mesh = new THREE.Mesh(drawer2geometry, material2);
+		gridgeometry2mesh.rotateX(Math.PI * 1);
+		gridgeometry2mesh.rotateY(Math.PI * 1);
+		gridgeometry2mesh.rotateZ(Math.PI * 1);
+		gridgeometry2mesh.position.set( -400, 0 , -100);
+		fugObject.add(gridgeometry2mesh);	
+		
+		//base3 FUG write and texture
+   		const drawer0geometry = new THREE.BoxGeometry(1, 900, 1200);
+		const textureLoader0 = new THREE.TextureLoader();
+		const texture0 = textureLoader0.load('./components/fug0screenfoto.jpg');
+		texture0.wrapS = texture0.wrapT = THREE.RepeatWrapping;
+		texture0.repeat.set(1, 1);
+		const material0 = new THREE.MeshBasicMaterial({ map: texture0 });
+		const gridgeometry0mesh = new THREE.Mesh(drawer0geometry, material0);
+		gridgeometry0mesh.rotateX(Math.PI * 1);
+		gridgeometry0mesh.rotateY(Math.PI * 1);
+		gridgeometry0mesh.rotateZ(Math.PI * 1);
+		gridgeometry0mesh.position.set( -655, -1320 , -400);
+		fugObject.add(gridgeometry0mesh);			
+
+		fugObject.rotateY(Math.PI);
+		fugObject.position.set(400, 1750, 300);
+		fug.add(fugObject);
+		return fug;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+*/
+	export function gun(param) {
+		const sphereRadius=400, sphereFactor=0.3;
+		const cavityObject = new THREE.Object3D();
+		const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0});
+		const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32);
+		const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial);
+		cavitymesh.scale.setZ(sphereFactor);
+		cavityObject.add(cavitymesh);
+		/*const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius,  cylinderHeight, 20, 2, false, 0, Math.PI * 2);
+		const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial);
+		// rfMesh.rotateX(Math.PI * 0.5);
+		rfMesh.position.set(0, sphereRadius, 0);
+		cavityObject.add(rfMesh);*/
+		return cavityObject;
 	}
-	insertText(75, [760,600,840], [0, Math.PI / 2, 0]);
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const basegeometry = new THREE.BoxGeometry(width, height+200, depth);
-	const d1mesh = new THREE.Mesh(basegeometry, materialBase);
-	d1mesh.position.set(0, 100, -900);	
-	ModContainer.add(d1mesh);
-
-	// redcube
-	const d2geometry = new THREE.BoxGeometry(width-400, height, depth);
-	const dmaterial2= new THREE.MeshLambertMaterial({color: 0xe02900});
-	const d2mesh = new THREE.Mesh(d2geometry, dmaterial2);
-	d2mesh.position.set(200, 1400, -900);		
-	ModContainer.add(d2mesh);	
-	
-	  // base
-	const d3geometry = new THREE.BoxGeometry(width, height, depth);
-	const d3mesh = new THREE.Mesh(d3geometry, materialBase);
-	d3mesh.position.set(0, 0, 300);		
-	ModContainer.add(d3mesh);	
-
-	// big red cylinder
-	const d4geometry = new THREE.CylinderGeometry(450, 450, 1200, 50);
-	const material = new THREE.MeshLambertMaterial({color: 0xfc0303});	
-	const d4mesh = new THREE.Mesh(d4geometry, material);
-	d4mesh.rotateX(Math.PI * 1);
-	d4mesh.rotateY(Math.PI * 1);
-	d4mesh.rotateZ(Math.PI * 1);
-	d4mesh.position.set(0, 800 , 300);			
-	ModContainer.add(d4mesh);	
-
-	// yellow 1 cylinder
-	const d5geometry = new THREE.CylinderGeometry(300, 370, 200, 50);
-	const material2 = new THREE.MeshLambertMaterial({color: 0xecfc03});			
-	const d5mesh = new THREE.Mesh(d5geometry, material2);
-	d5mesh.rotateX(Math.PI * 1);
-	d5mesh.rotateY(Math.PI * 1);
-	d5mesh.rotateZ(Math.PI * 1);
-	d5mesh.position.set(0, 1450 , 300);			
-	ModContainer.add(d5mesh);	
-	
-	//  yellow 2 cylinder
-	const d6geometry = new THREE.CylinderGeometry(150, 150, 250, 50);
-	const material3= new THREE.MeshLambertMaterial({color: 0xecfc03});
-	const d6mesh = new THREE.Mesh(d6geometry, material3);
-	d6mesh.rotateX(Math.PI * 1);
-	d6mesh.rotateY(Math.PI * 1);
-	d6mesh.rotateZ(Math.PI * 1);
-	d6mesh.position.set(0, 1680 , 300);			
-	ModContainer.add(d6mesh);	
-
-	//  yellow 3 cylinder
-	const d7geometry = new THREE.CylinderGeometry(200, 200, 100, 50);
-	const d7mesh = new THREE.Mesh(d7geometry, material3);
-	d7mesh.rotateX(Math.PI * 1);
-	d7mesh.rotateY(Math.PI * 1);
-	d7mesh.rotateZ(Math.PI * 1);
-	d7mesh.position.set(0, 1780 , 300);			
-	ModContainer.add(d7mesh);			
-	
-	// tag
-	const targhetta = new THREE.BoxGeometry( 10, 200, 300 );
-	const materialwhite= new THREE.MeshLambertMaterial({color: 0xeffffff});
-	const d14mesh = new THREE.Mesh(targhetta, materialwhite);
-	d14mesh.position.set(-610, 600 , -600);
-	ModContainer.add(d14mesh);	
-	
-	// torus red1 
-	const torus_bs = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d15mesh = new THREE.Mesh( torus_bs, materialGreyDark );
-	d15mesh.rotateX(Math.PI * 1);
-	d15mesh.rotateY(Math.PI * 1.5);
-	d15mesh.rotateZ(Math.PI * 1);	
-	d15mesh.position.set(550, 2050 , -1400);
-	ModContainer.add(d15mesh);	
-
-	// torus red2
-	const torus_bd = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d16mesh = new THREE.Mesh( torus_bd, materialGreyDark );
-	d16mesh.rotateX(Math.PI * 1);
-	d16mesh.rotateY(Math.PI * 1.5);
-	d16mesh.rotateZ(Math.PI * 1);	
-	d16mesh.position.set(-150, 2050 , -400);
-	ModContainer.add(d16mesh);	
-
-	// torus 1 white
-	const torus_as = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d17mesh = new THREE.Mesh( torus_as, materialGreyDark );
-	d17mesh.rotateX(Math.PI * 1);
-	d17mesh.rotateY(Math.PI * 1.5);
-	d17mesh.rotateZ(Math.PI * 1);	
-	d17mesh.position.set(-400, 850 , -500);
-	ModContainer.add(d17mesh);	
-
-	// torus 2 white
-	const torus_ad = new THREE.TorusGeometry( 60, 15, 20, 20, 7); 
-	const d18mesh = new THREE.Mesh( torus_ad, materialGreyDark );
-	d18mesh.rotateX(Math.PI * 1);
-	d18mesh.rotateY(Math.PI * 1.5);
-	d18mesh.rotateZ(Math.PI * 1);	
-	d18mesh.position.set(-400, 850 , -1300);
-	ModContainer.add(d18mesh);
-	
-	// line1
-	const line1 = new THREE.BoxGeometry(10, 10, 1150);
-	const d19mesh = new THREE.Mesh(line1, dmaterial2);
-	d19mesh.position.set(-610, 750, -900);		
-	ModContainer.add(d19mesh);		
-
-	// line2
-	const line2 = new THREE.BoxGeometry(10, 10, 1150);
-	const d20mesh = new THREE.Mesh(line2, dmaterial2);
-	d20mesh.position.set(-610, 550, 300);		
-	ModContainer.add(d20mesh);			
-
-	ModContainer.rotateY(Math.PI);
-	ModContainer.scale.set(myscale, myscale, myscale);
-	ModContainer.position.set(width*myscale/2, height*myscale/2, depth*myscale/2);
-	klystron.add(ModContainer);
-	return klystron;
-}
-
-// cavity for linac
-export function cavitylinac(param) {
-	const length = param.length? param.length: 1100;
-	const cavitylinacMaster = new THREE.Object3D();
-	const dmaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const d1geometry = new THREE.CylinderGeometry(75, 75, length, 25);
-	const d1mesh = new THREE.Mesh(d1geometry, dmaterial);
-	d1mesh.position.set(0, length/2+350, 0);
-	cavitylinacMaster.add(d1mesh);				
-	cavitylinacMaster.rotateX(Math.PI * 0.5);
-	cavitylinacMaster.rotatedX = true;
-	return cavitylinacMaster;
-}
-// Current Monitor	
-export function cm(param) {
-	const cmContiner = new THREE.Object3D();
-	const cmObject = new THREE.Object3D();
-	
-	//cylinder mid
-	const cylgeometry = new THREE.CylinderGeometry(115, 115, 30, 20);
-	const cylmaterial = new THREE.MeshLambertMaterial({color: 0x00d0ff});
-	const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
-	cylmesh.rotateX(Math.PI * 1);
-	cylmesh.rotateY(Math.PI * 1.0);
-	cylmesh.rotateZ(Math.PI * 1.5);
-	cylmesh.position.set(0, 0 , 0);			
-	cmObject.add(cylmesh);			
-	
-	//cylinder center
-	const cyl2geometry = new THREE.CylinderGeometry(75, 75, 31, 20);
-	const cyl2material = new THREE.MeshLambertMaterial({color: 0x2d2b70});
-	const cyl2mesh = new THREE.Mesh(cyl2geometry, cyl2material);
-	cyl2mesh.rotateX(Math.PI * 1);
-	cyl2mesh.rotateY(Math.PI * 1.0);
-	cyl2mesh.rotateZ(Math.PI * 1.5);
-	cyl2mesh.position.set(0, 0 , 0);			
-	cmObject.add(cyl2mesh);			
-	
+
+	// corrector fermi
+	export function correctorfermi() {
+		const length=400;
+		const CorrectorContiner = new THREE.Object3D();
+		const CorrectorMaster = new THREE.Object3D();
 		
-	cmObject.scale.setX(1);
-	cmObject.scale.setY(1);
-	cmObject.scale.setZ(1);
-	cmObject.position.set(0, 0, 0);
-	cmContiner.add(cmObject);
-	cmContiner.rotateY(Math.PI * -0.5);		
-	
-	
-	return cmContiner;
-}
-// flsc
-export function flsc(param) {
-	const length=700;
-	const flscSR = new THREE.Object3D();
-	const flscContiner = new THREE.Object3D();
-	
-	const materialGrey = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const materialDarkGrey = new THREE.MeshLambertMaterial({color: 0x8c8c8c});
-	const materialOrange= new THREE.MeshLambertMaterial({color: 0xfc9403});
-	const materialBlack= new THREE.MeshLambertMaterial({color: 0x000000});
-	
-	//cil center
-	const d1geometry = new THREE.CylinderGeometry(25, 25, 400, 25);
-	const d1mesh = new THREE.Mesh(d1geometry, materialGrey);
-	d1mesh.position.set(0, 200 , 0);
-	flscContiner.add(d1mesh);
-	flscContiner.rotateX(Math.PI * 1);
-		
-	// esagono
-	const d2geometry = new THREE.CylinderGeometry(70, 70, 70, 6);
-	const d2mesh = new THREE.Mesh(d2geometry, materialGrey);
-	d2mesh.position.set(0, 290, 0);
-	d2mesh.rotateX(Math.PI * 1);
-	d2mesh.rotateY(Math.PI * 1);
-	d2mesh.rotateZ(Math.PI * 1.5);		
-	flscContiner.add(d2mesh);
-	
-	// box orange down
-	const orangegeometry = new THREE.CylinderGeometry(90, 90, 250, 15);
-	const orangegeometrymesh = new THREE.Mesh(orangegeometry, materialOrange);
-	orangegeometrymesh.position.set(0, 550, 0);		
-	flscContiner.add(orangegeometrymesh);
-	
-	// box black down
-	const blackgeometry = new THREE.CylinderGeometry(90, 90, 25, 15);
-	const blackgeometrymesh = new THREE.Mesh(blackgeometry, materialBlack);
-	blackgeometrymesh.position.set(0, 412, 0);		
-	flscContiner.add(blackgeometrymesh);			
-	
-	// base zigrinatura
-	const d3geometry = new THREE.CylinderGeometry(90, 90, 50, 15);
-	const d3mesh = new THREE.Mesh(d3geometry, materialGrey);
-	d3mesh.rotateX(Math.PI * 1);
-	d3mesh.rotateY(Math.PI * 1);
-	d3mesh.rotateZ(Math.PI * 1);
-	d3mesh.position.set(0, 170 , 0);			
-	flscContiner.add(d3mesh);		
-	
-	// zigrinatura
-	const d4geometry = new THREE.CylinderGeometry(60, 60, 170, 15);
-	const textureLoader = new THREE.TextureLoader();
-	const texture = textureLoader.load('./components/flsc_texture.png');	
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(5, 40);		
-	const material = new THREE.MeshBasicMaterial({ map: texture });		
-	const d4mesh = new THREE.Mesh(d4geometry, material);
-	d4mesh.rotateX(Math.PI * 1);
-	d4mesh.rotateY(Math.PI * 1);
-	d4mesh.rotateZ(Math.PI * 1);
-	d4mesh.position.set(0, 60 , 0);			
-	flscContiner.add(d4mesh);		
-	
-	// tetto zigrinatura
-	const d5geometry = new THREE.CylinderGeometry(90, 90, 50, 15);
-	const d5mesh = new THREE.Mesh(d5geometry, materialGrey);
-	d5mesh.rotateX(Math.PI * 1);
-	d5mesh.rotateY(Math.PI * 1);
-	d5mesh.rotateZ(Math.PI * 1);
-	d5mesh.position.set(0, -50 , 0);			
-	flscContiner.add(d5mesh);	
-	
-	//half sphere down1
-	const down1geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const down1geometrymesh = new THREE.Mesh(down1geometry, materialGrey);
-	down1geometrymesh.position.set(-75, 170, -75);
-	flscContiner.add(down1geometrymesh);			
-	
-	//half sphere up1
-	const up1geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const up1geometrymesh = new THREE.Mesh(up1geometry, materialGrey);
-	up1geometrymesh.position.set(-75, -50, -75);
-	flscContiner.add(up1geometrymesh);	
-	
-	//half sphere down2
-	const down2geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const down2geometrymesh = new THREE.Mesh(down2geometry, materialGrey);
-	down2geometrymesh.position.set(75, 170, -75);
-	flscContiner.add(down2geometrymesh);			
-	
-	//half sphere up2
-	const up2geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const up2geometrymesh = new THREE.Mesh(up2geometry, materialGrey);
-	up2geometrymesh.position.set(75, -50, -75);
-	flscContiner.add(up2geometrymesh);	
-	
-	//half sphere down3
-	const down3geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const down3geometrymesh = new THREE.Mesh(down2geometry, materialGrey);
-	down3geometrymesh.position.set(0, 170, 100);
-	flscContiner.add(down3geometrymesh);			
-	
-	//half sphere up3
-	const up3geometry = new THREE.CylinderGeometry(30, 30, 15, 25);
-	const up3geometrymesh = new THREE.Mesh(up3geometry, materialGrey);
-	up3geometrymesh.position.set(0, -50, 100);
-	flscContiner.add(up3geometrymesh);			
-			
-	//cil support1
-	const d11geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
-	const d11mesh = new THREE.Mesh(d11geometry, materialGrey);
-	d11mesh.position.set(-75, 20, -75);
-	flscContiner.add(d11mesh);	
-	
-	//cil support2
-	const d12geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
-	const d12mesh = new THREE.Mesh(d12geometry, materialGrey);
-	d12mesh.position.set(75, 20, -75);
-	flscContiner.add(d12mesh);				
-	
-	//cil support3
-	const d13geometry = new THREE.CylinderGeometry(10, 10, 300, 25);
-	const d13mesh = new THREE.Mesh(d13geometry, materialGrey);
-	d13mesh.position.set(0, 20, 100);
-	flscContiner.add(d13mesh);				
-
-	// blocco supporto
-	const d15geometry = new THREE.CylinderGeometry(120, 120, 20, 25);
-	const d15mesh = new THREE.Mesh(d15geometry, materialGrey);
-	d15mesh.position.set(0, -130, 0);
-	d15mesh.rotateX(Math.PI * 1);
-	flscContiner.add(d15mesh);	
-	
-	//internal block
-	const d16geometry = new THREE.CylinderGeometry(20, 20, 60, 15);
-	const d16mesh = new THREE.Mesh(d16geometry, materialGrey);
-	d16mesh.position.set(0, -100, 0);
-	d16mesh.rotateX(Math.PI * 1);
-	flscContiner.add(d16mesh);			
-	
-	// high box1 
-	const d7geometry = new THREE.BoxGeometry(40, 90, 100);
-	const d7mesh = new THREE.Mesh(d7geometry, materialDarkGrey);
-	d7mesh.position.set(-20, -180, 0);		
-	flscContiner.add(d7mesh);				
-	
-	// high box2
-	const d8geometry = new THREE.BoxGeometry(40, 60, 100);
-	const d8mesh = new THREE.Mesh(d8geometry, materialDarkGrey);
-	d8mesh.position.set(20, -170, 0);		
-	flscContiner.add(d8mesh);			
-
-	flscContiner.position.set(0, 235, 0);
-	flscContiner.scale.setX(0.8);
-	flscContiner.scale.setY(0.8);
-	flscContiner.scale.setZ(0.8);
-	flscSR.add(flscContiner);
-	flscSR.rotateY(Math.PI * -0.5);
-	return flscSR;
-}
-//SIP
-export function sip(param) {
-	const sipContiner = new THREE.Object3D();
-	const sipObject = new THREE.Object3D();
-	
-	//cylinder
-	const cylgeometry = new THREE.CylinderGeometry(35, 35, 50, 15);
-	const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
-	const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
-	cylmesh.rotateX(Math.PI * 1);
-	cylmesh.rotateY(Math.PI * 1.0);
-	cylmesh.rotateZ(Math.PI * 1.5);
-	cylmesh.position.set(0, 0 , 0);			
-	sipObject.add(cylmesh);			
-	
-	// connect
-	const vlvgeometry = new THREE.BoxGeometry(30, 90, 30 );
-	const vlv1mesh = new THREE.Mesh(vlvgeometry, cylmaterial);
-	vlv1mesh.position.set(0, -50, 0);
-	sipObject.add(vlv1mesh);		
-	
-	// box
-	const boxmaterial = new THREE.MeshLambertMaterial({color: 0xb6b6b6});
-	const boxgeometry = new THREE.BoxGeometry(60, 80, 120 );
-	const boxmesh = new THREE.Mesh(boxgeometry, boxmaterial);
-	boxmesh.position.set(0, -120, 0);
-	sipObject.add(boxmesh);	
-	
-	// blackbox1
-	const bb1material = new THREE.MeshLambertMaterial({color: 0x000000});
-	const bb1geometry = new THREE.BoxGeometry(60, 80, 10 );
-	const bb1mesh = new THREE.Mesh(bb1geometry, bb1material);
-	bb1mesh.position.set(0, -120, -65);
-	sipObject.add(bb1mesh);
-	
-	// blackbox2
-	const bb2geometry = new THREE.BoxGeometry(60, 80, 10 );
-	const bb2mesh = new THREE.Mesh(bb2geometry, bb1material);
-	bb2mesh.position.set(0, -120, 65);
-	sipObject.add(bb2mesh);
-	
-	// border
-	const bordergeometry = new THREE.BoxGeometry(61, 81, 1 );
-	const bordermesh = new THREE.Mesh(bordergeometry, bb1material);
-	bordermesh.position.set(0, -120, 0);
-	sipObject.add(bordermesh);		
-
-	sipObject.scale.setX(1);
-	sipObject.scale.setY(1);
-	sipObject.scale.setZ(1);
-	sipObject.position.set(0, 0, 0);
-	sipContiner.add(sipObject);
-	sipContiner.rotateY(Math.PI * 0.5);		
-	
-	return sipContiner;
-}
-
-// FuG PS
-export function fug(width=800, height=1700, depth=600) {
-	const text = 'Fug';
-	const fugObject = new THREE.Object3D();
-	let group, textMesh, textGeo, materials;
-	let size = 60;
-	let textheight = 10;
-	let pos = [];
-	let rot = [];
-	const hover = 30;
-	const curveSegments = 8;
-	let font;
-	function insertText(isize, ipos, irot) {
-		group = new THREE.Group();
-		group.position.y = 100;
-		fugObject.add( group );
-		size = isize;
-		pos = ipos;
-		rot = irot;
-		loadFont();
+		// coil settings
+		const loader = new THREE.TextureLoader();
+		const texture = loader.load('./components/coil_texture_fermi.png');
+		const textureTop = texture.clone();
+		const textureSide = texture.clone();
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(2, 20);
+		textureTop.center.set(0.5, 0.5);
+		textureTop.rotation = THREE.MathUtils.degToRad(90);
+		textureSide.offset.set(0, 0.8);
+		const dmaterial = new THREE.MeshLambertMaterial({map: texture});
+		const face = new THREE.MeshBasicMaterial({map: texture});
+		const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
+		const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
+		const materials = [face,face,faceTop,faceSide,faceSide,faceSide];
+		const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		const d1mesh = new THREE.Mesh(d1geometry, materials);
+		d1mesh.position.set(0, 0, 0);
+		d1mesh.rotateX(Math.PI * 1.25);
+		d1mesh.rotateY(Math.PI * 1);
+		d1mesh.rotateZ(Math.PI * 1.5);	
+		CorrectorMaster.add(d1mesh);	
+
+		//spessore esterno plastica bianca
+		const redmaterialp = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide});
+		const geometry_1p = new THREE.CylinderGeometry(501 /*radiusTop*/, 501 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		const dmesh_1p = new THREE.Mesh(geometry_1p, redmaterialp);
+		dmesh_1p.position.set(0, 0, 0);
+		dmesh_1p.rotateX(Math.PI * 1.25);
+		dmesh_1p.rotateY(Math.PI * 1);
+		dmesh_1p.rotateZ(Math.PI * 1.5);	
+		CorrectorMaster.add(dmesh_1p); 
+		
+		//spessore alto centro
+		const redmaterial_5 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2});
+		const geometry_1_5 = new THREE.BoxGeometry(length, 150, 700);
+		const dmesh_1_5 = new THREE.Mesh(geometry_1_5, redmaterial_5);
+		dmesh_1_5.position.set(0, 277, 0);
+		CorrectorMaster.add(dmesh_1_5);
+		
+		//spessore basso
+		const dmesh_2 = new THREE.Mesh(geometry_1_5, redmaterial_5);
+		dmesh_2.position.set(0, -277, 0);
+		CorrectorMaster.add(dmesh_2);
+		
+		//spessore destro
+		const geometry_3 = new THREE.BoxGeometry(length, 600, 150);
+		const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial_5);
+		dmesh_3.position.set(0, 0, -275);
+		CorrectorMaster.add(dmesh_3);	
+		
+		//spessore sinistro
+		const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial_5);
+		dmesh_4.position.set(0, 0, 275);
+		CorrectorMaster.add(dmesh_4);	
+		
+		//cubo al centro
+		const loader_2 = new THREE.TextureLoader();
+		const texture_2 = loader.load('./components/coil_texture_fermi.png');
+		texture_2.wrapS = texture_2.wrapT = THREE.RepeatWrapping;
+		texture_2.repeat.set(20, 20);
+		const textureTop_2 = texture.clone();
+		const textureSide_2 = texture.clone();
+		const dmaterial_2 = new THREE.MeshLambertMaterial({map: texture_2});
+		const geometry_2 = new THREE.BoxGeometry(390, 390, 390);
+		const dmesh_5 = new THREE.Mesh(geometry_2, dmaterial_2);
+		dmesh_5.position.set(0, 0, 0);		
+		CorrectorMaster.add(dmesh_5);
+		
+		//spessore interno plastica bianca
+		const redmaterial_6 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide});
+		const geometry_6 = new THREE.CylinderGeometry(280 /*radiusTop*/, 280 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		const dmesh_6 = new THREE.Mesh(geometry_6, redmaterial_6);
+		dmesh_6.position.set(0, 0, 0);
+		dmesh_6.rotateX(Math.PI * 1);
+		dmesh_6.rotateY(Math.PI * 1.25);
+		dmesh_6.rotateZ(Math.PI * 1);	
+		CorrectorMaster.add(dmesh_6); 
+				
+		CorrectorMaster.position.set(0, 0, 0);
+		CorrectorContiner.add(CorrectorMaster);
+		CorrectorContiner.rotateY(Math.PI * 1);
+		CorrectorContiner.scale.setX(0.25);
+		CorrectorContiner.scale.setY(0.125);
+		CorrectorContiner.scale.setZ(0.25);
+		
+		return CorrectorContiner;
 	}
-	function loadFont() {
-		const loader = new FontLoader();
-		// https://threejs.org/examples/fonts/droid_sans_bold.typeface.json
-		loader.load( './fonts/droid_sans_bold.typeface.json', function ( response ) {
-			font = response;
-			refreshText();
-		} );
+
+
+	// BPM (beam position monitor)
+	export function bpm(param) {
+		const width=300, height=300, depth=50, transverse=100;
+		const bpmObject = new THREE.Object3D();
+		const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff});
+		const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth);
+		const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial);
+		bpmObject.add(bpmmeshh);
+		const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth);
+		const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial);
+		bpmObject.add(bpmmeshv);
+		return bpmObject;
 	}
-	materials = [
-		new THREE.MeshPhongMaterial( { color: 0x272c7d  , flatShading: true } ), // front
-		new THREE.MeshPhongMaterial( { color: 0x272c7d  } ) // side
-	];
-	function createText() {
-		textGeo = new TextGeometry(text.replace('TKLY_KG','K').replace('.01',''), {font: font, size: size, height: textheight, curveSegments: curveSegments});
-		textGeo.computeBoundingBox();
-		const centerOffset = - 0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
-		textMesh = new THREE.Mesh( textGeo, materials );
-		textMesh.position.x = pos[0];
-		textMesh.position.y = pos[1];
-		textMesh.position.z = pos[2];
-		textMesh.rotation.x = rot[0];
-		textMesh.rotation.y = rot[1];
-		textMesh.rotation.z = rot[2];
-		group.add( textMesh );
+
+
+	// quadrupole fermi
+	export function quadrupolefermi(param) {
+		const length=200;
+		const QuadrupolContiner = new THREE.Object3D();
+		const QuadrupoleMaster = new THREE.Object3D();
+		
+		const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040, side: THREE.DoubleSide});
+		const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		const d1mesh = new THREE.Mesh(d1geometry, dmaterial);
+		d1mesh.position.set(0, 0, 0);
+		d1mesh.rotateX(Math.PI * 1.25);
+		d1mesh.rotateY(Math.PI * 1);
+		d1mesh.rotateZ(Math.PI * 1.5);	
+		QuadrupoleMaster.add(d1mesh);	
+		
+		// coil settings
+		const coilmaterial = new THREE.MeshLambertMaterial({color: 0xcd7f32, side: THREE.DoubleSide});
+		const textureLoader = new THREE.TextureLoader();
+		const texture = textureLoader.load('./components/coil_texture.png');
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(5, 5);
+		const coiltexture = new THREE.MeshBasicMaterial({ map: texture });
+		const coilmaterials = [coiltexture, coilmaterial, coilmaterial];
+		const coilgeometry = new THREE.CylinderGeometry(110 /*radiusTop*/, 110 /*radiusBottom*/, 120 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
+		
+		//spessore alto
+		const redmaterial = new THREE.MeshLambertMaterial({color: 0xe05040});
+		const geometry_1 = new THREE.BoxGeometry(200, 100, 705);
+		const dmesh_1 = new THREE.Mesh(geometry_1, redmaterial);
+		dmesh_1.position.set(0, 300, 0);
+		QuadrupoleMaster.add(dmesh_1);
+		
+		//spessore basso
+		const dmesh_2 = new THREE.Mesh(geometry_1, redmaterial);
+		dmesh_2.position.set(0, -300, 0);
+		QuadrupoleMaster.add(dmesh_2);
+		
+		//spessore destro
+		const geometry_3 = new THREE.BoxGeometry(200, 500, 100);
+		const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial);
+		dmesh_3.position.set(0, 0, -300);
+		QuadrupoleMaster.add(dmesh_3);	
+		
+		//spessore sinistro
+		const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial);
+		dmesh_4.position.set(0, 0, 300);
+		QuadrupoleMaster.add(dmesh_4);			
+
+		const geometry_5 = new THREE.BoxGeometry(200, 115, 280);
+		const dmesh_5 = new THREE.Mesh(geometry_5, redmaterial);
+		dmesh_5.rotateX(Math.PI * 0.25);
+		dmesh_5.position.set(0, 210, 210);
+		QuadrupoleMaster.add(dmesh_5);			
+		const dmesh_6 = new THREE.Mesh(geometry_5, redmaterial);
+		dmesh_6.rotateX(Math.PI * 0.75);
+		dmesh_6.position.set(0, 210, -210);
+		QuadrupoleMaster.add(dmesh_6);			
+		const dmesh_7 = new THREE.Mesh(geometry_5, redmaterial);
+		dmesh_7.rotateX(Math.PI * 0.75);
+		dmesh_7.position.set(0, -210, 210);
+		QuadrupoleMaster.add(dmesh_7);			
+		const dmesh_8 = new THREE.Mesh(geometry_5, redmaterial);
+		dmesh_8.rotateX(Math.PI * 0.25);
+		dmesh_8.position.set(0, -210, -210);
+		QuadrupoleMaster.add(dmesh_8);			
+		
+		// coil basso destra 
+		const d2mesh = new THREE.Mesh(coilgeometry, coilmaterials);
+		d2mesh.position.set(0, -130, 120);
+		d2mesh.rotateX(Math.PI * 1.25);
+		d2mesh.rotateY(Math.PI * 1.50);
+		d2mesh.rotateZ(Math.PI * 1.50);
+		QuadrupoleMaster.add(d2mesh);
+
+		// coil basso sinistra 
+		const d3mesh = new THREE.Mesh(coilgeometry, coilmaterials);
+		d3mesh.position.set(0, -130, -120);
+		d3mesh.rotateX(Math.PI * 1.75);
+		d3mesh.rotateY(Math.PI * 1.50);
+		d3mesh.rotateZ(Math.PI * 1.50);
+		QuadrupoleMaster.add(d3mesh);
+		
+		// coil alto destra 
+		const d4mesh = new THREE.Mesh(coilgeometry, coilmaterials);
+		d4mesh.position.set(0, 130, 120);
+		d4mesh.rotateX(Math.PI * 0.75);
+		d4mesh.rotateY(Math.PI * 1.50);
+		d4mesh.rotateZ(Math.PI * 1.50);
+		QuadrupoleMaster.add(d4mesh);
+
+		// coil alto destra 
+		const d5mesh = new THREE.Mesh(coilgeometry, coilmaterials);
+		d5mesh.position.set(0, 130, -120);
+		d5mesh.rotateX(Math.PI * 1.25);
+		d5mesh.rotateY(Math.PI * 1.50);
+		d5mesh.rotateZ(Math.PI * 1.50);
+		QuadrupoleMaster.add(d5mesh);
+		
+		QuadrupoleMaster.position.set(0, 0, 0);
+		QuadrupolContiner.add(QuadrupoleMaster);
+		QuadrupolContiner.rotateY(Math.PI * -0.5);
+		QuadrupolContiner.scale.setX(0.5);
+		QuadrupolContiner.scale.setY(0.5);
+		QuadrupolContiner.scale.setZ(0.5);				
+		
+		return QuadrupolContiner;
 	}
-	function refreshText() {
-		group.remove( textMesh );
-		if ( ! text ) return;
-		createText();
+
+	// Bending Dipole
+	export function dipolefermi(length = 500) {
+		const dipoleContainer = new THREE.Object3D();
+		const dipoleMaster = new THREE.Object3D();
+
+		//texture
+		const loader = new THREE.TextureLoader();
+		const texture = loader.load('./components/dipole.png');
+		const textureTop = texture.clone();
+		const textureSide = texture.clone();
+		textureTop.center.set(0.5, 0.5);
+		textureTop.rotation = THREE.MathUtils.degToRad(90);
+		textureSide.offset.set(0, 0.8);
+		const dmaterial = new THREE.MeshLambertMaterial({map: texture});
+		const face = new THREE.MeshBasicMaterial({map: texture});
+		const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
+		const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
+		const materials = [face,face,faceTop,faceSide,faceSide,faceSide];
+		const d1geometry = new THREE.BoxGeometry(550, 400, length);
+		const d1mesh = new THREE.Mesh(d1geometry, materials);
+		d1mesh.position.set(-100, 100, 0);
+		dipoleMaster.add(d1mesh);	
+
+		//Coil
+		const dipoleCoil = new THREE.Object3D();
+		const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000});
+		const d4geometry = new THREE.BoxGeometry(100, 100, length);
+		const d4mesh = new THREE.Mesh(d4geometry, coilmaterial);
+		d4mesh.position.set(-200, 0, 0);
+		dipoleCoil.add(d4mesh);
+		const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/);
+		const d2mesh = new THREE.Mesh(d2geometry, coilmaterial);
+		d2mesh.position.set(-100, 0, length/2);
+		dipoleCoil.add(d2mesh);
+		const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/);
+		const d3mesh = new THREE.Mesh(d3geometry, coilmaterial);
+		d3mesh.position.set(-100, 0, -length/2);
+		dipoleCoil.add(d3mesh);
+		dipoleCoil.position.set(0, 0, 0);
+		dipoleMaster.add(dipoleCoil);
+		const dipoleCoil2 = dipoleCoil.clone();
+		dipoleCoil2.position.set(0, 200, 0);
+		dipoleMaster.add(dipoleCoil2);
+
+		dipoleMaster.position.set(100, 0, 0);
+		dipoleMaster.scale.setX(0.7);
+		dipoleMaster.scale.setY(0.7);
+		dipoleMaster.scale.setZ(0.7);		
+		
+		dipoleContainer.add(dipoleMaster);
+
+		return dipoleContainer;
 	}
-	insertText(270, [-650,-1500,-720], [0, -Math.PI / 2, 0]);
 
-	
-	
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const testmaterial = new THREE.MeshLambertMaterial({color: 0x00ff00});
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x095c23});
-	const greenmaterial2 = new THREE.MeshLambertMaterial({color: 0x0f993b});
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xab0000});
-	const yellowmaterial = new THREE.MeshLambertMaterial({color: 0xcc9d02});
-	const emergencymaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
-	const blumaterial = new THREE.MeshLambertMaterial({color: 0x272c7d});
-	const whiteaterial = new THREE.MeshLambertMaterial({color: 0xdfdfe8});
-
-	//fix FUG logo
-	const fugfixgeometry = new THREE.BoxGeometry(10, 50, 460);
-	const fugfixgeometrymesh = new THREE.Mesh(fugfixgeometry, blumaterial);
-	fugfixgeometrymesh.position.set(-655,-1157,-310);
-	fugObject.add(fugfixgeometrymesh);	
-	
-	//left rack
-	const lrgeometry = new THREE.BoxGeometry(800, 1700, 600);
-	const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
-	lrmesh.position.set(0 , 0 , -100);
-	fugObject.add(lrmesh);
-	
-	//right rack
-	const rrgeometry = new THREE.BoxGeometry(800, 1700, 600);
-	const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
-	rrmesh.position.set( 0, 0 , -710);
-	fugObject.add(rrmesh);		
-	
-	//basefug
-	const basegeometry = new THREE.BoxGeometry(1050, 900, 1200);
-	const basemesh = new THREE.Mesh(basegeometry, silvermaterial);
-	basemesh.position.set( -130, -1320 , -400);
-	fugObject.add(basemesh);			
-	
-	//edge lle		
-	const llegeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
-	llemesh.position.set( -425, 0 , -985);
-	fugObject.add(llemesh);
-	
-	//edge lre		
-	const lregeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
-	lremesh.position.set( -425, 0 , -430);
-	fugObject.add(lremesh);		
-
-	//edge rle		
-	const rlegeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
-	rlemesh.position.set( -425, 0 , -370);
-	fugObject.add(rlemesh);	
-	
-	//edge rre		
-	const rregeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
-	rremesh.position.set( -425, 0 , 175);
-	fugObject.add(rremesh);		
-	
-	//edge lue		
-	const luegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
-	luemesh.position.set( -425, 825 , -707);
-	fugObject.add(luemesh);		
-
-	//edge lde		
-	const ldegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
-	ldemesh.position.set( -425, -830 , -707);
-	fugObject.add(ldemesh);				
-
-	//edge rue		
-	const ruegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
-	ruemesh.position.set( -425, 825 , -100);
-	fugObject.add(ruemesh);			
-	
-	//edge rde		
-	const rdegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
-	rdemesh.position.set( -425, -825 , -100);
-	fugObject.add(rdemesh);	
-	
-	//GreenButton
-	const greenbutton = new THREE.CylinderGeometry(55, 55, 40, 15);
-	const greenbuttonmesh = new THREE.Mesh(greenbutton, greenmaterial);
-	greenbuttonmesh.rotateX(Math.PI * 0.5);
-	greenbuttonmesh.rotateY(Math.PI * 1);
-	greenbuttonmesh.rotateZ(Math.PI * 0.5);
-	greenbuttonmesh.position.set(-400, 600 , -670);		
-	fugObject.add(greenbuttonmesh);		
-	
-	//GreenLed
-	const greenled = new THREE.CylinderGeometry(40, 40, 40, 15);
-	const greenledmesh = new THREE.Mesh(greenled, greenmaterial2);
-	greenledmesh.rotateX(Math.PI * 0.5);
-	greenledmesh.rotateY(Math.PI * 1);
-	greenledmesh.rotateZ(Math.PI * 0.5);
-	greenledmesh.position.set(-400, 600 , -550);		
-	fugObject.add(greenledmesh);			
-
-	//RedButton
-	const redbutton = new THREE.CylinderGeometry(55, 55, 40, 15);
-	const redbuttonmesh = new THREE.Mesh(redbutton, redmaterial);
-	redbuttonmesh.rotateX(Math.PI * 0.5);
-	redbuttonmesh.rotateY(Math.PI * 1);
-	redbuttonmesh.rotateZ(Math.PI * 0.5);
-	redbuttonmesh.position.set(-400, 450 , -670);		
-	fugObject.add(redbuttonmesh);			
-
-	//YelloyLed
-	const yellowled = new THREE.CylinderGeometry(40, 40, 40, 15);
-	const yellowledmesh = new THREE.Mesh(yellowled, yellowmaterial);
-	yellowledmesh.rotateX(Math.PI * 0.5);
-	yellowledmesh.rotateY(Math.PI * 1);
-	yellowledmesh.rotateZ(Math.PI * 0.5);
-	yellowledmesh.position.set(-400, 450 , -550);		
-	fugObject.add(yellowledmesh);	
-	
-	//EmergenctButton
-	const emergencybutton = new THREE.CylinderGeometry(80, 80, 40, 15);
-	const emergencybuttonmesh = new THREE.Mesh(emergencybutton, emergencymaterial);
-	emergencybuttonmesh.rotateX(Math.PI * 0.5);
-	emergencybuttonmesh.rotateY(Math.PI * 1);
-	emergencybuttonmesh.rotateZ(Math.PI * 0.5);
-	emergencybuttonmesh.position.set(-400, 270 , -620);		
-	fugObject.add(emergencybuttonmesh);	
-	
-	//display up		
-	const displayupgeometry = new THREE.BoxGeometry(50, 50, 150);
-	const displayupgeometrymesh = new THREE.Mesh(displayupgeometry, materialVeryGreyDark);
-	displayupgeometrymesh.position.set( -400, 600 , -850);
-	fugObject.add(displayupgeometrymesh);			
-	
-	//display2 down		
-	const displayupgeometry2 = new THREE.BoxGeometry(50, 50, 150);
-	const displayupgeometrymesh2 = new THREE.Mesh(displayupgeometry2, materialVeryGreyDark);
-	displayupgeometrymesh2.position.set( -400, 500 , -850);
-	fugObject.add(displayupgeometrymesh2);	
-	
-	//switch		
-	const switchgeometry = new THREE.BoxGeometry(10, 350, 200);
-	const switchgeometrymesh = new THREE.Mesh(switchgeometry, materialVeryGreyDark);
-	switchgeometrymesh.position.set( -400, -50 , -850);
-	fugObject.add(switchgeometrymesh);	
-	
-	
-	//Lgrid2 down	
-	const grid2geometry = new THREE.BoxGeometry(10, 200, 520);
-	const textureLoader2 = new THREE.TextureLoader();
-	const texture2 = textureLoader2.load('./components/grid_texture.png');	
-	texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
-	texture2.repeat.set(50, 1);		
-	const material2 = new THREE.MeshBasicMaterial({ map: texture2 });		
-	const grid2geometrymesh = new THREE.Mesh(grid2geometry, material2);
-	grid2geometrymesh.rotateX(Math.PI * 1);
-	grid2geometrymesh.rotateY(Math.PI * 1);
-	grid2geometrymesh.rotateZ(Math.PI * 1);
-	grid2geometrymesh.position.set( -400, -650 , -710);
-	fugObject.add(grid2geometrymesh);	
+	// undulator
+	export function undulator(param) {
+		const length=1000;
+		const undulatorMaster = new THREE.Object3D();
+		const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0});
+		const loader = new THREE.TextureLoader();
+		const texture = loader.load('./components/undulator.png');
+		const textureTop = texture.clone();
+		const textureSide = texture.clone();
+		textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping;
+		textureTop.repeat.set(30, 1);
+		textureSide.offset.set(0.95, 0.95);
+		const face = new THREE.MeshBasicMaterial({map: texture});
+		const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
+		const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
+		const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial];
+		const ugeometry = new THREE.BoxGeometry(400, 400, length);
+		const umesh = new THREE.Mesh(ugeometry, materials);
+		undulatorMaster.add(umesh);				
+		const qedges = new THREE.EdgesGeometry(ugeometry);
+		const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000});
+		lineMaterial.linewidth = 4;
+		const qline = new THREE.LineSegments(qedges, lineMaterial);
+		undulatorMaster.add(qline);
+		return undulatorMaster;
+	}
+	// valve
+	export function vlv(param) {
+		const vlvContiner = new THREE.Object3D();
+		const vlvObject = new THREE.Object3D();
+		
+		//cylinder
+		const cylgeometry = new THREE.CylinderGeometry(25, 25, 50, 15);
+		const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
+		const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
+		cylmesh.rotateX(Math.PI * 1);
+		cylmesh.rotateY(Math.PI * 1.0);
+		cylmesh.rotateZ(Math.PI * 1.5);
+		cylmesh.position.set(0, 0 , 0);			
+		vlvObject.add(cylmesh);			
+		
+		// base1
+		const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 );
+		const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});		
+		const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial);
+		vlv1mesh.position.set(0, 50, 0);
+		vlv1mesh.colorable = true;
+		vlvObject.add(vlv1mesh);		
+		
+		// hat1
+		const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
+		const hatgeometry = new THREE.BoxGeometry(50, 20, 100 );
+		const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial);
+		hatmesh.colorable = true;
+		hatmesh.position.set(0, 120, 0);
+		vlvObject.add(hatmesh);	
+		
+		// blackbox
+		const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363});
+		const blackboxgeometry = new THREE.BoxGeometry(40, 70, 70 );
+		const blackboxmesh = new THREE.Mesh(blackboxgeometry, blackboxmaterial);
+		blackboxmesh.position.set(0, 165, 15);
+		vlvObject.add(blackboxmesh);
+		
+		// blackbox2
+		const blackbox2material = new THREE.MeshLambertMaterial({color: 0x000000});
+		const blackbox2geometry = new THREE.BoxGeometry(40, 40, 20 );
+		const blackbo2xmesh = new THREE.Mesh(blackbox2geometry, blackbox2material);
+		blackbo2xmesh.position.set(0, 165, -30);
+		vlvObject.add(blackbo2xmesh);			
+		vlvObject.scale.setX(1.5);
+		vlvObject.scale.setY(1.5);
+		vlvObject.scale.setZ(1.5);	
+		
+		//TRIANGLE1
+		const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3);
+		const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackbox2material);
+		trianglegeometrymesh.rotateX(Math.PI * 0);
+		trianglegeometrymesh.rotateY(Math.PI * 0);
+		trianglegeometrymesh.rotateZ(Math.PI * 0.5);		
+		trianglegeometrymesh.position.set(0, 60 , -17);		
+		vlvObject.add(trianglegeometrymesh);	
+		
+		//TRIANGLE2
+		const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3);
+		const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackbox2material);
+		triangle2geometrymesh.rotateX(Math.PI * 0);
+		triangle2geometrymesh.rotateY(Math.PI * 1);
+		triangle2geometrymesh.rotateZ(Math.PI * 0.5);		
+		triangle2geometrymesh.position.set(0, 60 ,17);		
+		vlvObject.add(triangle2geometrymesh);		
+		
+		vlvObject.position.set(0, 0, 0);
+		vlvObject.rotateY(Math.PI * -0.5);
+		vlvContiner.add(vlvObject);
 
-	
-	//Rgrid2 down	
-	const grid4geometry = new THREE.BoxGeometry(10, 200, 520);
-	const textureLoader4 = new THREE.TextureLoader();
-	const texture4 = textureLoader4.load('./components/grid_texture.png');	
-	texture4.wrapS = texture4.wrapT = THREE.RepeatWrapping;
-	texture4.repeat.set(50, 1);		
-	const material4 = new THREE.MeshBasicMaterial({ map: texture2 });		
-	const grid4geometrymesh = new THREE.Mesh(grid4geometry, material2);
-	grid4geometrymesh.rotateX(Math.PI * 1);
-	grid4geometrymesh.rotateY(Math.PI * 1);
-	grid4geometrymesh.rotateZ(Math.PI * 1);
-	grid4geometrymesh.position.set( -400, -650 , -130);
-	fugObject.add(grid4geometrymesh);	
-	
-	//drawer1		
-	const drawer1geometry = new THREE.BoxGeometry(10, 220, 500);
-	const drawer1geometrytrymesh = new THREE.Mesh(drawer1geometry, whiteaterial);
-	drawer1geometrytrymesh.position.set( -400, 650 , -100);
-	fugObject.add(drawer1geometrytrymesh);			
-	
-	//drawer2		
-	const drawer2geometry = new THREE.BoxGeometry(10, 220, 500);
-	const drawer2geometrytrymesh = new THREE.Mesh(drawer2geometry, whiteaterial);
-	drawer2geometrytrymesh.position.set( -400, 400 , -100);
-	fugObject.add(drawer2geometrytrymesh);	
-	
-	fugObject.rotateY(Math.PI);
-	fugObject.position.set(400, 1750, 300);
-	const fug = new THREE.Object3D();
-	fug.add(fugObject);
-	return fug;
-}
-/*
-export function fug(param) {
-	const width=800, height=1700, depth=600;
-	const fug = new THREE.Object3D();
-	const fugObject = new THREE.Object3D();
-	
-	const materialGreyDark= new THREE.MeshLambertMaterial({color: 0x9d9d9d});
-	const materialVeryGreyDark= new THREE.MeshLambertMaterial({color: 0x242424});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xf0f0f0});
-	const basematerial = new THREE.MeshLambertMaterial({color: 0xc4b2a8});
-	
-	//right rack
-	const lrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const lrmesh = new THREE.Mesh(lrgeometry, silvermaterial);
-	lrmesh.position.set(0 , 0 , -100);
-	fugObject.add(lrmesh);
-	
-	
-	//left rack
-	const rrgeometry = new THREE.BoxGeometry(width, height, depth);
-	const rrmesh = new THREE.Mesh(rrgeometry, silvermaterial);
-	rrmesh.position.set( 0, 0 , -710);
-	fugObject.add(rrmesh);		
-	
-	//basefug
-	const basegeometry = new THREE.BoxGeometry(width+250, height-800, depth+600);
-	const basemesh = new THREE.Mesh(basegeometry, silvermaterial);
-	basemesh.position.set( -130, -1320 , -400);
-	fugObject.add(basemesh);			
-	
-	//edge lle		
-	const llegeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const llemesh = new THREE.Mesh(llegeometry, materialGreyDark);
-	llemesh.position.set( -425, 0 , -985);
-	fugObject.add(llemesh);
-	
-	//edge lre		
-	const lregeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const lremesh = new THREE.Mesh(lregeometry, materialGreyDark);
-	lremesh.position.set( -425, 0 , -430);
-	fugObject.add(lremesh);		
-
-	//edge rle		
-	const rlegeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const rlemesh = new THREE.Mesh(rlegeometry, materialGreyDark);
-	rlemesh.position.set( -425, 0 , -370);
-	fugObject.add(rlemesh);	
-	
-	//edge rre		
-	const rregeometry = new THREE.BoxGeometry(50, 1700, 50);
-	const rremesh = new THREE.Mesh(rregeometry, materialGreyDark);
-	rremesh.position.set( -425, 0 , 175);
-	fugObject.add(rremesh);		
-	
-	//edge lue		
-	const luegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const luemesh = new THREE.Mesh(luegeometry, materialGreyDark);
-	luemesh.position.set( -425, 825 , -707);
-	fugObject.add(luemesh);		
-
-	//edge lde		
-	const ldegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const ldemesh = new THREE.Mesh(ldegeometry, materialGreyDark);
-	ldemesh.position.set( -425, -830 , -707);
-	fugObject.add(ldemesh);				
-
-	//edge rue		
-	const ruegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const ruemesh = new THREE.Mesh(ruegeometry, materialGreyDark);
-	ruemesh.position.set( -425, 825 , -100);
-	fugObject.add(ruemesh);			
-	
-	//edge rde		
-	const rdegeometry = new THREE.BoxGeometry(50, 50, 505);
-	const rdemesh = new THREE.Mesh(rdegeometry, materialGreyDark);
-	rdemesh.position.set( -425, -825 , -100);
-	fugObject.add(rdemesh);	
-			
-	//base1 left and texture
-	   const drawer1geometry = new THREE.BoxGeometry(10, 1600, 500);
-	const textureLoader = new THREE.TextureLoader();
-	const texture = textureLoader.load('./components/fug1screenfoto.jpg');
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(1, 1);
-	const material = new THREE.MeshBasicMaterial({ map: texture });
-	const gridgeometrymesh = new THREE.Mesh(drawer1geometry, material);
-	gridgeometrymesh.rotateX(Math.PI * 1);
-	gridgeometrymesh.rotateY(Math.PI * 1);
-	gridgeometrymesh.rotateZ(Math.PI * 1);
-	gridgeometrymesh.position.set( -400, 0 , -707);
-	fugObject.add(gridgeometrymesh);		
-	
-	//base2 right and texture
-	   const drawer2geometry = new THREE.BoxGeometry(10, 1600, 500);
-	const textureLoader2 = new THREE.TextureLoader();
-	const texture2 = textureLoader2.load('./components/fug2screenfoto.jpg');
-	texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping;
-	texture2.repeat.set(1, 1);
-	const material2 = new THREE.MeshBasicMaterial({ map: texture2 });
-	const gridgeometry2mesh = new THREE.Mesh(drawer2geometry, material2);
-	gridgeometry2mesh.rotateX(Math.PI * 1);
-	gridgeometry2mesh.rotateY(Math.PI * 1);
-	gridgeometry2mesh.rotateZ(Math.PI * 1);
-	gridgeometry2mesh.position.set( -400, 0 , -100);
-	fugObject.add(gridgeometry2mesh);	
-	
-	//base3 FUG write and texture
-	   const drawer0geometry = new THREE.BoxGeometry(1, 900, 1200);
-	const textureLoader0 = new THREE.TextureLoader();
-	const texture0 = textureLoader0.load('./components/fug0screenfoto.jpg');
-	texture0.wrapS = texture0.wrapT = THREE.RepeatWrapping;
-	texture0.repeat.set(1, 1);
-	const material0 = new THREE.MeshBasicMaterial({ map: texture0 });
-	const gridgeometry0mesh = new THREE.Mesh(drawer0geometry, material0);
-	gridgeometry0mesh.rotateX(Math.PI * 1);
-	gridgeometry0mesh.rotateY(Math.PI * 1);
-	gridgeometry0mesh.rotateZ(Math.PI * 1);
-	gridgeometry0mesh.position.set( -655, -1320 , -400);
-	fugObject.add(gridgeometry0mesh);			
-
-	fugObject.rotateY(Math.PI);
-	fugObject.position.set(400, 1750, 300);
-	fug.add(fugObject);
-	return fug;
-}
-*/
-export function gun(param) {
-	const sphereRadius=400, sphereFactor=0.3;
-	const cavityObject = new THREE.Object3D();
-	const cavitymaterial = new THREE.MeshLambertMaterial({color: 0xb0b0b0});
-	const cavitygeometry = new THREE.SphereGeometry(sphereRadius, 32, 32);
-	const cavitymesh = new THREE.Mesh(cavitygeometry, cavitymaterial);
-	cavitymesh.scale.setZ(sphereFactor);
-	cavityObject.add(cavitymesh);
-	/*const rfGeometry = new THREE.CylinderGeometry(cylinderRadius, cylinderRadius,  cylinderHeight, 20, 2, false, 0, Math.PI * 2);
-	const rfMesh = new THREE.Mesh(rfGeometry, cavitymaterial);
-	// rfMesh.rotateX(Math.PI * 0.5);
-	rfMesh.position.set(0, sphereRadius, 0);
-	cavityObject.add(rfMesh);*/
-	return cavityObject;
-}
-
-// corrector fermi
-export function correctorfermi() {
-	const length=400;
-	const CorrectorContiner = new THREE.Object3D();
-	const CorrectorMaster = new THREE.Object3D();
-	
-	// coil settings
-	const loader = new THREE.TextureLoader();
-	const texture = loader.load('./components/coil_texture_fermi.png');
-	const textureTop = texture.clone();
-	const textureSide = texture.clone();
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(2, 20);
-	textureTop.center.set(0.5, 0.5);
-	textureTop.rotation = THREE.MathUtils.degToRad(90);
-	textureSide.offset.set(0, 0.8);
-	const dmaterial = new THREE.MeshLambertMaterial({map: texture});
-	const face = new THREE.MeshBasicMaterial({map: texture});
-	const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
-	const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
-	const materials = [face,face,faceTop,faceSide,faceSide,faceSide];
-	const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	const d1mesh = new THREE.Mesh(d1geometry, materials);
-	d1mesh.position.set(0, 0, 0);
-	d1mesh.rotateX(Math.PI * 1.25);
-	d1mesh.rotateY(Math.PI * 1);
-	d1mesh.rotateZ(Math.PI * 1.5);	
-	CorrectorMaster.add(d1mesh);	
-
-	//spessore esterno plastica bianca
-	const redmaterialp = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide});
-	const geometry_1p = new THREE.CylinderGeometry(501 /*radiusTop*/, 501 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	const dmesh_1p = new THREE.Mesh(geometry_1p, redmaterialp);
-	dmesh_1p.position.set(0, 0, 0);
-	dmesh_1p.rotateX(Math.PI * 1.25);
-	dmesh_1p.rotateY(Math.PI * 1);
-	dmesh_1p.rotateZ(Math.PI * 1.5);	
-	CorrectorMaster.add(dmesh_1p); 
-	
-	//spessore alto centro
-	const redmaterial_5 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2});
-	const geometry_1_5 = new THREE.BoxGeometry(length, 150, 700);
-	const dmesh_1_5 = new THREE.Mesh(geometry_1_5, redmaterial_5);
-	dmesh_1_5.position.set(0, 277, 0);
-	CorrectorMaster.add(dmesh_1_5);
-	
-	//spessore basso
-	const dmesh_2 = new THREE.Mesh(geometry_1_5, redmaterial_5);
-	dmesh_2.position.set(0, -277, 0);
-	CorrectorMaster.add(dmesh_2);
-	
-	//spessore destro
-	const geometry_3 = new THREE.BoxGeometry(length, 600, 150);
-	const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial_5);
-	dmesh_3.position.set(0, 0, -275);
-	CorrectorMaster.add(dmesh_3);	
-	
-	//spessore sinistro
-	const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial_5);
-	dmesh_4.position.set(0, 0, 275);
-	CorrectorMaster.add(dmesh_4);	
-	
-	//cubo al centro
-	const loader_2 = new THREE.TextureLoader();
-	const texture_2 = loader.load('./components/coil_texture_fermi.png');
-	texture_2.wrapS = texture_2.wrapT = THREE.RepeatWrapping;
-	texture_2.repeat.set(20, 20);
-	const textureTop_2 = texture.clone();
-	const textureSide_2 = texture.clone();
-	const dmaterial_2 = new THREE.MeshLambertMaterial({map: texture_2});
-	const geometry_2 = new THREE.BoxGeometry(390, 390, 390);
-	const dmesh_5 = new THREE.Mesh(geometry_2, dmaterial_2);
-	dmesh_5.position.set(0, 0, 0);		
-	CorrectorMaster.add(dmesh_5);
-	
-	//spessore interno plastica bianca
-	const redmaterial_6 = new THREE.MeshLambertMaterial({color: 0xeD2D2D2, side:THREE.DoubleSide});
-	const geometry_6 = new THREE.CylinderGeometry(280 /*radiusTop*/, 280 /*radiusBottom*/, 90 /*height*/, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	const dmesh_6 = new THREE.Mesh(geometry_6, redmaterial_6);
-	dmesh_6.position.set(0, 0, 0);
-	dmesh_6.rotateX(Math.PI * 1);
-	dmesh_6.rotateY(Math.PI * 1.25);
-	dmesh_6.rotateZ(Math.PI * 1);	
-	CorrectorMaster.add(dmesh_6); 
-			
-	CorrectorMaster.position.set(0, 0, 0);
-	CorrectorContiner.add(CorrectorMaster);
-	CorrectorContiner.rotateY(Math.PI * 1);
-	CorrectorContiner.scale.setX(0.25);
-	CorrectorContiner.scale.setY(0.125);
-	CorrectorContiner.scale.setZ(0.25);
-	
-	return CorrectorContiner;
-}
-
-
-// BPM (beam position monitor)
-export function bpm(param) {
-	const width=300, height=300, depth=50, transverse=100;
-	const bpmObject = new THREE.Object3D();
-	const bpmmaterial = new THREE.MeshLambertMaterial({color: 0x8000ff});
-	const bpmgeometryh = new THREE.BoxGeometry(width, transverse, depth);
-	const bpmmeshh = new THREE.Mesh(bpmgeometryh, bpmmaterial);
-	bpmObject.add(bpmmeshh);
-	const bpmgeometryv = new THREE.BoxGeometry(transverse, height, depth);
-	const bpmmeshv = new THREE.Mesh(bpmgeometryv, bpmmaterial);
-	bpmObject.add(bpmmeshv);
-	return bpmObject;
-}
-
-
-// quadrupole fermi
-export function quadrupolefermi(param) {
-	const length=200;
-	const QuadrupolContiner = new THREE.Object3D();
-	const QuadrupoleMaster = new THREE.Object3D();
-	
-	const dmaterial = new THREE.MeshLambertMaterial({color: 0xe05040, side: THREE.DoubleSide});
-	const d1geometry = new THREE.CylinderGeometry(500, 500, length, 4 /*radialSegments*/, 2 /*heightSegments*/, true /*openEnded*/,0 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	const d1mesh = new THREE.Mesh(d1geometry, dmaterial);
-	d1mesh.position.set(0, 0, 0);
-	d1mesh.rotateX(Math.PI * 1.25);
-	d1mesh.rotateY(Math.PI * 1);
-	d1mesh.rotateZ(Math.PI * 1.5);	
-	QuadrupoleMaster.add(d1mesh);	
-	
-	// coil settings
-	const coilmaterial = new THREE.MeshLambertMaterial({color: 0xcd7f32, side: THREE.DoubleSide});
-	const textureLoader = new THREE.TextureLoader();
-	const texture = textureLoader.load('./components/coil_texture.png');
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(5, 5);
-	const coiltexture = new THREE.MeshBasicMaterial({ map: texture });
-	const coilmaterials = [coiltexture, coilmaterial, coilmaterial];
-	const coilgeometry = new THREE.CylinderGeometry(110 /*radiusTop*/, 110 /*radiusBottom*/, 120 /*height*/, 25 /*radialSegments*/, 4 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 2 /*thetaLength*/);
-	
-	//spessore alto
-	const redmaterial = new THREE.MeshLambertMaterial({color: 0xe05040});
-	const geometry_1 = new THREE.BoxGeometry(200, 100, 705);
-	const dmesh_1 = new THREE.Mesh(geometry_1, redmaterial);
-	dmesh_1.position.set(0, 300, 0);
-	QuadrupoleMaster.add(dmesh_1);
-	
-	//spessore basso
-	const dmesh_2 = new THREE.Mesh(geometry_1, redmaterial);
-	dmesh_2.position.set(0, -300, 0);
-	QuadrupoleMaster.add(dmesh_2);
-	
-	//spessore destro
-	const geometry_3 = new THREE.BoxGeometry(200, 500, 100);
-	const dmesh_3 = new THREE.Mesh(geometry_3, redmaterial);
-	dmesh_3.position.set(0, 0, -300);
-	QuadrupoleMaster.add(dmesh_3);	
-	
-	//spessore sinistro
-	const dmesh_4 = new THREE.Mesh(geometry_3, redmaterial);
-	dmesh_4.position.set(0, 0, 300);
-	QuadrupoleMaster.add(dmesh_4);			
-
-	const geometry_5 = new THREE.BoxGeometry(200, 115, 280);
-	const dmesh_5 = new THREE.Mesh(geometry_5, redmaterial);
-	dmesh_5.rotateX(Math.PI * 0.25);
-	dmesh_5.position.set(0, 210, 210);
-	QuadrupoleMaster.add(dmesh_5);			
-	const dmesh_6 = new THREE.Mesh(geometry_5, redmaterial);
-	dmesh_6.rotateX(Math.PI * 0.75);
-	dmesh_6.position.set(0, 210, -210);
-	QuadrupoleMaster.add(dmesh_6);			
-	const dmesh_7 = new THREE.Mesh(geometry_5, redmaterial);
-	dmesh_7.rotateX(Math.PI * 0.75);
-	dmesh_7.position.set(0, -210, 210);
-	QuadrupoleMaster.add(dmesh_7);			
-	const dmesh_8 = new THREE.Mesh(geometry_5, redmaterial);
-	dmesh_8.rotateX(Math.PI * 0.25);
-	dmesh_8.position.set(0, -210, -210);
-	QuadrupoleMaster.add(dmesh_8);			
-	
-	// coil basso destra 
-	const d2mesh = new THREE.Mesh(coilgeometry, coilmaterials);
-	d2mesh.position.set(0, -130, 120);
-	d2mesh.rotateX(Math.PI * 1.25);
-	d2mesh.rotateY(Math.PI * 1.50);
-	d2mesh.rotateZ(Math.PI * 1.50);
-	QuadrupoleMaster.add(d2mesh);
-
-	// coil basso sinistra 
-	const d3mesh = new THREE.Mesh(coilgeometry, coilmaterials);
-	d3mesh.position.set(0, -130, -120);
-	d3mesh.rotateX(Math.PI * 1.75);
-	d3mesh.rotateY(Math.PI * 1.50);
-	d3mesh.rotateZ(Math.PI * 1.50);
-	QuadrupoleMaster.add(d3mesh);
-	
-	// coil alto destra 
-	const d4mesh = new THREE.Mesh(coilgeometry, coilmaterials);
-	d4mesh.position.set(0, 130, 120);
-	d4mesh.rotateX(Math.PI * 0.75);
-	d4mesh.rotateY(Math.PI * 1.50);
-	d4mesh.rotateZ(Math.PI * 1.50);
-	QuadrupoleMaster.add(d4mesh);
-
-	// coil alto destra 
-	const d5mesh = new THREE.Mesh(coilgeometry, coilmaterials);
-	d5mesh.position.set(0, 130, -120);
-	d5mesh.rotateX(Math.PI * 1.25);
-	d5mesh.rotateY(Math.PI * 1.50);
-	d5mesh.rotateZ(Math.PI * 1.50);
-	QuadrupoleMaster.add(d5mesh);
-	
-	QuadrupoleMaster.position.set(0, 0, 0);
-	QuadrupolContiner.add(QuadrupoleMaster);
-	QuadrupolContiner.rotateY(Math.PI * -0.5);
-	QuadrupolContiner.scale.setX(0.5);
-	QuadrupolContiner.scale.setY(0.5);
-	QuadrupolContiner.scale.setZ(0.5);				
-	
-	return QuadrupolContiner;
-}
-
-// Bending Dipole
-export function dipolefermi(length = 500) {
-	const dipoleContainer = new THREE.Object3D();
-	const dipoleMaster = new THREE.Object3D();
-
-	//texture
-	const loader = new THREE.TextureLoader();
-	const texture = loader.load('./components/dipole.png');
-	const textureTop = texture.clone();
-	const textureSide = texture.clone();
-	textureTop.center.set(0.5, 0.5);
-	textureTop.rotation = THREE.MathUtils.degToRad(90);
-	textureSide.offset.set(0, 0.8);
-	const dmaterial = new THREE.MeshLambertMaterial({map: texture});
-	const face = new THREE.MeshBasicMaterial({map: texture});
-	const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
-	const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
-	const materials = [face,face,faceTop,faceSide,faceSide,faceSide];
-	const d1geometry = new THREE.BoxGeometry(550, 400, length);
-	const d1mesh = new THREE.Mesh(d1geometry, materials);
-	d1mesh.position.set(-100, 100, 0);
-	dipoleMaster.add(d1mesh);	
-
-	//Coil
-	const dipoleCoil = new THREE.Object3D();
-	const coilmaterial = new THREE.MeshLambertMaterial({color: 0xc08000});
-	const d4geometry = new THREE.BoxGeometry(100, 100, length);
-	const d4mesh = new THREE.Mesh(d4geometry, coilmaterial);
-	d4mesh.position.set(-200, 0, 0);
-	dipoleCoil.add(d4mesh);
-	const d2geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 1.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/);
-	const d2mesh = new THREE.Mesh(d2geometry, coilmaterial);
-	d2mesh.position.set(-100, 0, length/2);
-	dipoleCoil.add(d2mesh);
-	const d3geometry = new THREE.CylinderGeometry(150 /*radiusTop*/, 150 /*radiusBottom*/, 100 /*height*/, 20 /*radialSegments*/, 2 /*heightSegments*/, false /*openEnded*/,Math.PI * 0.5 /*thetaStart*/, Math.PI * 1 /*thetaLength*/);
-	const d3mesh = new THREE.Mesh(d3geometry, coilmaterial);
-	d3mesh.position.set(-100, 0, -length/2);
-	dipoleCoil.add(d3mesh);
-	dipoleCoil.position.set(0, 0, 0);
-	dipoleMaster.add(dipoleCoil);
-	const dipoleCoil2 = dipoleCoil.clone();
-	dipoleCoil2.position.set(0, 200, 0);
-	dipoleMaster.add(dipoleCoil2);
-
-	dipoleMaster.position.set(100, 0, 0);
-	dipoleMaster.scale.setX(0.7);
-	dipoleMaster.scale.setY(0.7);
-	dipoleMaster.scale.setZ(0.7);		
-	
-	dipoleContainer.add(dipoleMaster);
-
-	return dipoleContainer;
-}
-
-// undulator
-export function undulator(param) {
-	const length=1000;
-	const undulatorMaster = new THREE.Object3D();
-	const chamberMaterial = new THREE.MeshLambertMaterial({color: 0xc0c0c0});
-	const loader = new THREE.TextureLoader();
-	const texture = loader.load('./components/undulator.png');
-	const textureTop = texture.clone();
-	const textureSide = texture.clone();
-	textureTop.wrapS = textureTop.wrapT = THREE.RepeatWrapping;
-	textureTop.repeat.set(30, 1);
-	textureSide.offset.set(0.95, 0.95);
-	const face = new THREE.MeshBasicMaterial({map: texture});
-	const faceTop = new THREE.MeshBasicMaterial({map: textureTop});
-	const faceSide = new THREE.MeshBasicMaterial({map: textureSide});
-	const materials = [faceTop,faceTop,chamberMaterial,chamberMaterial,chamberMaterial,chamberMaterial];
-	const ugeometry = new THREE.BoxGeometry(400, 400, length);
-	const umesh = new THREE.Mesh(ugeometry, materials);
-	undulatorMaster.add(umesh);				
-	const qedges = new THREE.EdgesGeometry(ugeometry);
-	const lineMaterial = new THREE.LineBasicMaterial({color: 0x000000});
-	lineMaterial.linewidth = 4;
-	const qline = new THREE.LineSegments(qedges, lineMaterial);
-	undulatorMaster.add(qline);
-	return undulatorMaster;
-}
-// valve
-export function vlv(param) {
-	const vlvContiner = new THREE.Object3D();
-	const vlvObject = new THREE.Object3D();
-	
-	//cylinder
-	const cylgeometry = new THREE.CylinderGeometry(25, 25, 50, 15);
-	const cylmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
-	const cylmesh = new THREE.Mesh(cylgeometry, cylmaterial);
-	cylmesh.rotateX(Math.PI * 1);
-	cylmesh.rotateY(Math.PI * 1.0);
-	cylmesh.rotateZ(Math.PI * 1.5);
-	cylmesh.position.set(0, 0 , 0);			
-	vlvObject.add(cylmesh);			
-	
-	// base1
-	const vlvgeometry = new THREE.BoxGeometry(30, 160, 60 );
-	const vlvmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});		
-	const vlv1mesh = new THREE.Mesh(vlvgeometry, vlvmaterial);
-	vlv1mesh.position.set(0, 50, 0);
-	vlv1mesh.colorable = true;
-	vlvObject.add(vlv1mesh);		
-	
-	// hat1
-	const hatmaterial = new THREE.MeshLambertMaterial({color: 0xc7c7c7});
-	const hatgeometry = new THREE.BoxGeometry(50, 20, 100 );
-	const hatmesh = new THREE.Mesh(hatgeometry, hatmaterial);
-	hatmesh.colorable = true;
-	hatmesh.position.set(0, 120, 0);
-	vlvObject.add(hatmesh);	
-	
-	// blackbox
-	const blackboxmaterial = new THREE.MeshLambertMaterial({color: 0x636363});
-	const blackboxgeometry = new THREE.BoxGeometry(40, 70, 70 );
-	const blackboxmesh = new THREE.Mesh(blackboxgeometry, blackboxmaterial);
-	blackboxmesh.position.set(0, 165, 15);
-	vlvObject.add(blackboxmesh);
-	
-	// blackbox2
-	const blackbox2material = new THREE.MeshLambertMaterial({color: 0x000000});
-	const blackbox2geometry = new THREE.BoxGeometry(40, 40, 20 );
-	const blackbo2xmesh = new THREE.Mesh(blackbox2geometry, blackbox2material);
-	blackbo2xmesh.position.set(0, 165, -30);
-	vlvObject.add(blackbo2xmesh);			
-	vlvObject.scale.setX(1.5);
-	vlvObject.scale.setY(1.5);
-	vlvObject.scale.setZ(1.5);	
-	
-	//TRIANGLE1
-	const trianglegeometry = new THREE.CylinderGeometry(18, 18, 32, 3);
-	const trianglegeometrymesh = new THREE.Mesh(trianglegeometry, blackbox2material);
-	trianglegeometrymesh.rotateX(Math.PI * 0);
-	trianglegeometrymesh.rotateY(Math.PI * 0);
-	trianglegeometrymesh.rotateZ(Math.PI * 0.5);		
-	trianglegeometrymesh.position.set(0, 60 , -17);		
-	vlvObject.add(trianglegeometrymesh);	
-	
-	//TRIANGLE2
-	const trianglegeometry2 = new THREE.CylinderGeometry(18, 18, 32, 3);
-	const triangle2geometrymesh = new THREE.Mesh(trianglegeometry2, blackbox2material);
-	triangle2geometrymesh.rotateX(Math.PI * 0);
-	triangle2geometrymesh.rotateY(Math.PI * 1);
-	triangle2geometrymesh.rotateZ(Math.PI * 0.5);		
-	triangle2geometrymesh.position.set(0, 60 ,17);		
-	vlvObject.add(triangle2geometrymesh);		
-	
-	vlvObject.position.set(0, 0, 0);
-	vlvObject.rotateY(Math.PI * -0.5);
-	vlvContiner.add(vlvObject);
-
-	return vlvContiner;
-}
-export function vlvUpdate(c, color) {
-	const vlv = c.children[0].children;
-	for (let i=0; i<vlv.length; i++) {
-		if (vlv[i].colorable) {
-			vlv[i].material.dispose();
-			vlv[i].material = new THREE.MeshLambertMaterial({color: color});
+		return vlvContiner;
+	}
+	export function vlvUpdate(c, color) {
+		const vlv = c.children[0].children;
+		for (let i=0; i<vlv.length; i++) {
+			if (vlv[i].colorable) {
+				vlv[i].material.dispose();
+				vlv[i].material = new THREE.MeshLambertMaterial({color: color});
+			}
 		}
 	}
-}
-
-// Beam Loss Monitor
-export function blm(param) {
-	const length=10, dcolor='white', width=50;
-	const cMaster = new THREE.Object3D();
-	const d1geometry = new THREE.BoxGeometry(length, width, width);
-	const material = new THREE.MeshLambertMaterial({color: dcolor});
-	const d1mesh = new THREE.Mesh(d1geometry, material);
-	d1mesh.position.set(-length/2, 0, 0);
-	cMaster.add(d1mesh);
-	return cMaster;
-}
-function blmColor(val) {
-	if (document.location.search.indexOf('demo')>-1) {
-		if (val < 0) return 'white';
-		else if (val < 1) return 'yellow';
-		else if (val < 2) return 'orange';
-		else if (val < 3) return 'red';
+
+	// Beam Loss Monitor
+	export function blm(param) {
+		const length=10, dcolor='white', width=50;
+		const cMaster = new THREE.Object3D();
+		const d1geometry = new THREE.BoxGeometry(length, width, width);
+		const material = new THREE.MeshLambertMaterial({color: dcolor});
+		const d1mesh = new THREE.Mesh(d1geometry, material);
+		d1mesh.position.set(-length/2, 0, 0);
+		cMaster.add(d1mesh);
+		return cMaster;
+	}
+	function blmColor(val) {
+		if (document.location.search.indexOf('demo')>-1) {
+			if (val < 0) return 'white';
+			else if (val < 1) return 'yellow';
+			else if (val < 2) return 'orange';
+			else if (val < 3) return 'red';
+			else return 'violet';
+		}
+		if (val < 20) return 'white';
+		else if (val < 50) return 'yellow';
+		else if (val < 100) return 'orange';
+		else if (val < 200) return 'red';
 		else return 'violet';
 	}
-	if (val < 20) return 'white';
-	else if (val < 50) return 'yellow';
-	else if (val < 100) return 'orange';
-	else if (val < 200) return 'red';
-	else return 'violet';
-}
-export function blmUpdate(c, val, direction, width=100, histogramFactor=50) {
-	if (typeof val !== 'number') val = 0; else val = Math.abs(val);
-	const blm = c.children[0];
-	blm.material.dispose();
-	blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)});
-	blm.geometry.dispose();
-	blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width);
-	blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0);
-	blm.geometry.computeVertexNormals();
-	blm.geometry.normalsNeedUpdate = true;
-	blm.geometry.verticesNeedUpdate = true;
-	blm.geometry.dynamic = true;
-}
-
-// PLC
-export function plc(param) {
-	const plcObject = new THREE.Object3D();
-	const cardsObject = new THREE.Object3D();
+	export function blmUpdate(c, val, direction, width=100, histogramFactor=50) {
+		if (typeof val !== 'number') val = 0; else val = Math.abs(val);
+		const blm = c.children[0];
+		blm.material.dispose();
+		blm.material = new THREE.MeshLambertMaterial({color: blmColor(val)});
+		blm.geometry.dispose();
+		blm.geometry = new THREE.BoxGeometry(width+val*histogramFactor, width, width);
+		blm.position.set(direction*(width+val*histogramFactor)/2, 0, 0);
+		blm.geometry.computeVertexNormals();
+		blm.geometry.normalsNeedUpdate = true;
+		blm.geometry.verticesNeedUpdate = true;
+		blm.geometry.dynamic = true;
+	}
+
+	// PLC
+	export function plc(param) {
+		const plcObject = new THREE.Object3D();
+		const cardsObject = new THREE.Object3D();
+		
 	
+		const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11});
+		const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11});
+		const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757});
+		const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d});
+		const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6});
+		const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
 
-	const greenmaterial = new THREE.MeshLambertMaterial({color: 0x00ff11});
-	const greenDarkmaterial = new THREE.MeshLambertMaterial({color: 0x0b5e11});
-	const graymaterial = new THREE.MeshLambertMaterial({color: 0x575757});
-	const graymaterial2 = new THREE.MeshLambertMaterial({color: 0x7d7d7d});
-	const silvermaterial = new THREE.MeshLambertMaterial({color: 0xa6a6a6});
-	const blackmaterial = new THREE.MeshLambertMaterial({color: 0x000000});
+		
+		// base
+		const basegeometry = new THREE.BoxGeometry(500, 300, 600);
+		const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial);
+		basegeometrymesh.position.set( 0, 0 ,0);
+		plcObject.add(basegeometrymesh);	
+		
+		// card
+		const cardgeometry = new THREE.BoxGeometry(502, 270, 50);
+		const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial);
+		cardgeometrymesh.position.set( 0, 0 , -200);
+		cardsObject.add(cardgeometrymesh);
+		
+		//led1
+		const led1green = new THREE.BoxGeometry(504, 20, 20);
+		const led1greenmesh = new THREE.Mesh(led1green, greenmaterial);
+		led1greenmesh.position.set( 0, 120 , -200);
+		cardsObject.add(led1greenmesh);		
+		//led2
+		const led2green = new THREE.BoxGeometry(504, 20, 20);
+		const led2greenmesh = new THREE.Mesh(led2green, greenmaterial);
+		led2greenmesh.position.set( 0, 90 , -200);
+		cardsObject.add(led2greenmesh);
+		//led3
+		const led3green = new THREE.BoxGeometry(504, 20, 20);
+		const led3greenmesh = new THREE.Mesh(led3green, greenmaterial);
+		led3greenmesh.position.set( 0, 60 , -200);
+		cardsObject.add(led3greenmesh);
+		//led4
+		const led4green = new THREE.BoxGeometry(504, 20, 20);
+		const led4greenmesh = new THREE.Mesh(led4green, greenmaterial);
+		led4greenmesh.position.set( 0, 30 , -200);
+		cardsObject.add(led4greenmesh);
+		//led5
+		const led5green = new THREE.BoxGeometry(504, 20, 20);
+		const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial);
+		led5greenmesh.position.set( 0, 0 , -200);
+		cardsObject.add(led5greenmesh);			
+		//led6
+		const led6green = new THREE.BoxGeometry(504, 20, 20);
+		const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial);
+		led6greenmesh.position.set( 0, -30 , -200);
+		cardsObject.add(led6greenmesh);
+		//led7
+		const led7green = new THREE.BoxGeometry(504, 20, 20);
+		const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial);
+		led7greenmesh.position.set( 0, -60 , -200);
+		cardsObject.add(led7greenmesh);		
+		//led8
+		const led8green = new THREE.BoxGeometry(504, 20, 20);
+		const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial);
+		led8greenmesh.position.set( 0, -90 , -200);
+		cardsObject.add(led8greenmesh);
+		//led9
+		const led9green = new THREE.BoxGeometry(504, 20, 20);
+		const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial);
+		led9greenmesh.position.set( 0, -120 , -200);
+		cardsObject.add(led9greenmesh);		
+		
+		//CLONE Cards
 
-	
-	// base
-	const basegeometry = new THREE.BoxGeometry(500, 300, 600);
-	const basegeometrymesh = new THREE.Mesh(basegeometry, silvermaterial);
-	basegeometrymesh.position.set( 0, 0 ,0);
-	plcObject.add(basegeometrymesh);	
-	
-	// card
-	const cardgeometry = new THREE.BoxGeometry(502, 270, 50);
-	const cardgeometrymesh = new THREE.Mesh(cardgeometry, blackmaterial);
-	cardgeometrymesh.position.set( 0, 0 , -200);
-	cardsObject.add(cardgeometrymesh);
-	
-	//led1
-	const led1green = new THREE.BoxGeometry(504, 20, 20);
-	const led1greenmesh = new THREE.Mesh(led1green, greenmaterial);
-	led1greenmesh.position.set( 0, 120 , -200);
-	cardsObject.add(led1greenmesh);		
-	//led2
-	const led2green = new THREE.BoxGeometry(504, 20, 20);
-	const led2greenmesh = new THREE.Mesh(led2green, greenmaterial);
-	led2greenmesh.position.set( 0, 90 , -200);
-	cardsObject.add(led2greenmesh);
-	//led3
-	const led3green = new THREE.BoxGeometry(504, 20, 20);
-	const led3greenmesh = new THREE.Mesh(led3green, greenmaterial);
-	led3greenmesh.position.set( 0, 60 , -200);
-	cardsObject.add(led3greenmesh);
-	//led4
-	const led4green = new THREE.BoxGeometry(504, 20, 20);
-	const led4greenmesh = new THREE.Mesh(led4green, greenmaterial);
-	led4greenmesh.position.set( 0, 30 , -200);
-	cardsObject.add(led4greenmesh);
-	//led5
-	const led5green = new THREE.BoxGeometry(504, 20, 20);
-	const led5greenmesh = new THREE.Mesh(led5green, greenDarkmaterial);
-	led5greenmesh.position.set( 0, 0 , -200);
-	cardsObject.add(led5greenmesh);			
-	//led6
-	const led6green = new THREE.BoxGeometry(504, 20, 20);
-	const led6greenmesh = new THREE.Mesh(led6green, greenDarkmaterial);
-	led6greenmesh.position.set( 0, -30 , -200);
-	cardsObject.add(led6greenmesh);
-	//led7
-	const led7green = new THREE.BoxGeometry(504, 20, 20);
-	const led7greenmesh = new THREE.Mesh(led7green, greenDarkmaterial);
-	led7greenmesh.position.set( 0, -60 , -200);
-	cardsObject.add(led7greenmesh);		
-	//led8
-	const led8green = new THREE.BoxGeometry(504, 20, 20);
-	const led8greenmesh = new THREE.Mesh(led8green, greenDarkmaterial);
-	led8greenmesh.position.set( 0, -90 , -200);
-	cardsObject.add(led8greenmesh);
-	//led9
-	const led9green = new THREE.BoxGeometry(504, 20, 20);
-	const led9greenmesh = new THREE.Mesh(led9green, greenDarkmaterial);
-	led9greenmesh.position.set( 0, -120 , -200);
-	cardsObject.add(led9greenmesh);		
-	
-	//CLONE Cards
+		const card2 = cardsObject.clone();
+		card2.position.set( 0, 0 , 50);
+		plcObject.add(card2);
+		
+		const card3 = cardsObject.clone();
+		card3.position.set( 0, 0 , 100);
+		plcObject.add(card3);
+		
+		const card4 = cardsObject.clone();
+		card4.position.set( 0, 0 , 150);
+		plcObject.add(card4);	
+		
+		const card5 = cardsObject.clone();
+		card5.position.set( 0, 0 , 200);
+		plcObject.add(card5);
+		
+		// baseScreen
+		const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200);
+		const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial);
+		baseScreengeometrymesh.position.set( 0, 0 , 120);
+		plcObject.add(baseScreengeometrymesh);	
+		
+		// 1livel
+		const livel1geometry = new THREE.BoxGeometry(550, 150, 150);
+		const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial);
+		livel1geometrymesh.position.set( 0, 0 , 120);
+		plcObject.add(livel1geometrymesh);
+		// 2livel
+		const livel2geometry = new THREE.BoxGeometry(590, 100, 149);
+		const livel2geometrymesh = new THREE.Mesh(livel2geometry, graymaterial2);
+		livel2geometrymesh.position.set( 0, 0 , 120);
+		plcObject.add(livel2geometrymesh);			
+
+		plcObject.add(cardsObject);
+		
+		plcObject.scale.setX(0.7);
+		plcObject.scale.setY(0.7);
+		plcObject.scale.setZ(0.7);		
 
-	const card2 = cardsObject.clone();
-	card2.position.set( 0, 0 , 50);
-	plcObject.add(card2);
-	
-	const card3 = cardsObject.clone();
-	card3.position.set( 0, 0 , 100);
-	plcObject.add(card3);
-	
-	const card4 = cardsObject.clone();
-	card4.position.set( 0, 0 , 150);
-	plcObject.add(card4);	
-	
-	const card5 = cardsObject.clone();
-	card5.position.set( 0, 0 , 200);
-	plcObject.add(card5);
-	
-	// baseScreen
-	const baseScreengeometry = new THREE.BoxGeometry(502, 270, 200);
-	const baseScreengeometrymesh = new THREE.Mesh(baseScreengeometry, blackmaterial);
-	baseScreengeometrymesh.position.set( 0, 0 , 120);
-	plcObject.add(baseScreengeometrymesh);	
-	
-	// 1livel
-	const livel1geometry = new THREE.BoxGeometry(550, 150, 150);
-	const livel1geometrymesh = new THREE.Mesh(livel1geometry, graymaterial);
-	livel1geometrymesh.position.set( 0, 0 , 120);
-	plcObject.add(livel1geometrymesh);
-	// 2livel
-	const livel2geometry = new THREE.BoxGeometry(590, 100, 149);
-	const livel2geometrymesh = new THREE.Mesh(livel2geometry, graymaterial2);
-	livel2geometrymesh.position.set( 0, 0 , 120);
-	plcObject.add(livel2geometrymesh);			
-
-	plcObject.add(cardsObject);
-	
-	plcObject.scale.setX(0.7);
-	plcObject.scale.setY(0.7);
-	plcObject.scale.setZ(0.7);		
-
-	return plcObject;
-}
-// bst
-export function bst(param) {
-	const bstObject = new THREE.Object3D();
-	const bstContiner = new THREE.Object3D();
-	const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0});
-
-	const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25);
-	const d1mesh = new THREE.Mesh(d1geometry, materialGrey);
-	d1mesh.position.set(0, 190, 0);
-	bstObject.add(d1mesh);				
-	bstObject.rotateX(Math.PI * 1);
-
-	// circ base
-	const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15);
-	const d2mesh = new THREE.Mesh(d2geometry, materialGrey);
-	d2mesh.position.set(0, 290, 0);
-	d2mesh.rotateX(Math.PI * 1);
-	d2mesh.rotateY(Math.PI * 1);
-	d2mesh.rotateZ(Math.PI * 1.5);
-	bstObject.add(d2mesh);
-
-	// zigrinatura
-	const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15);
-	const textureLoader = new THREE.TextureLoader();
-	const texture = textureLoader.load('./components/flsc_texture.png');
-	texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
-	texture.repeat.set(5, 40);
-	const material = new THREE.MeshBasicMaterial({ map: texture });
-	const d4mesh = new THREE.Mesh(d4geometry, material);
-	d4mesh.rotateX(Math.PI * 1);
-	d4mesh.rotateY(Math.PI * 1);
-	d4mesh.rotateZ(Math.PI * 1);
-	d4mesh.position.set(0, 120 , 0);
-	bstObject.add(d4mesh);
-
-	// cil Major
-	const d5geometry = new THREE.CylinderGeometry(90, 90, 20, 15);
-	const d5mesh = new THREE.Mesh(d5geometry, materialGrey);
-	d5mesh.rotateX(Math.PI * 1);
-	d5mesh.rotateY(Math.PI * 1);
-	d5mesh.rotateZ(Math.PI * 1);
-	d5mesh.position.set(0, 50 , 0);		
-	d5mesh.colorable = true;
-	bstObject.add(d5mesh);						
-
-	// cil Med
-	const d6geometry = new THREE.CylinderGeometry(70, 70, 80, 15);
-	const d6mesh = new THREE.Mesh(d6geometry, materialGrey);
-	d6mesh.rotateX(Math.PI * 1);
-	d6mesh.rotateY(Math.PI * 1);
-	d6mesh.rotateZ(Math.PI * 1);
-	d6mesh.position.set(0, 0 , 0);
-	d6mesh.colorable = true;
-	bstObject.add(d6mesh);
-
-	// cil low
-	const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15);
-	const d7mesh = new THREE.Mesh(d7geometry, materialGrey);
-	d7mesh.rotateX(Math.PI * 1);
-	d7mesh.rotateY(Math.PI * 1);
-	d7mesh.rotateZ(Math.PI * 1);
-	d7mesh.position.set(0, -100 , 0);
-	d7mesh.colorable = true;
-	bstObject.add(d7mesh);
-
-	const d8geometry = new THREE.CylinderGeometry(60, 60, 20, 15);
-	const d8mesh = new THREE.Mesh(d8geometry, materialGrey);
-	d8mesh.rotateX(Math.PI * 1);
-	d8mesh.rotateY(Math.PI * 1);
-	d8mesh.rotateZ(Math.PI * 1);
-	d8mesh.position.set(0, -170 , 0);
-	bstObject.add(d8mesh);
-
-	bstObject.position.set(0, 290, 0);
-	bstContiner.add(bstObject);
-	bstContiner.rotateY(Math.PI * -0.5);
-	return bstContiner;
-}
-export function bstUpdate(c, color) {
-	const vlv = c.children[0].children;
-	for (let i=0; i<vlv.length; i++) {
-		if (vlv[i].colorable) {
-			vlv[i].material.dispose();
-			vlv[i].material = new THREE.MeshLambertMaterial({color: color});
+		return plcObject;
+	}
+	// bst
+	export function bst(param) {
+		const bstObject = new THREE.Object3D();
+		const bstContiner = new THREE.Object3D();
+		const materialGrey = new THREE.MeshLambertMaterial({color: 0xc0c0c0});
+
+		const d1geometry = new THREE.CylinderGeometry(25, 25, 200, 25);
+		const d1mesh = new THREE.Mesh(d1geometry, materialGrey);
+		d1mesh.position.set(0, 190, 0);
+		bstObject.add(d1mesh);				
+		bstObject.rotateX(Math.PI * 1);
+
+		// circ base
+		const d2geometry = new THREE.CylinderGeometry(50, 50, 80, 15);
+		const d2mesh = new THREE.Mesh(d2geometry, materialGrey);
+		d2mesh.position.set(0, 290, 0);
+		d2mesh.rotateX(Math.PI * 1);
+		d2mesh.rotateY(Math.PI * 1);
+		d2mesh.rotateZ(Math.PI * 1.5);
+		bstObject.add(d2mesh);
+
+		// zigrinatura
+		const d4geometry = new THREE.CylinderGeometry(40, 40, 120, 15);
+		const textureLoader = new THREE.TextureLoader();
+		const texture = textureLoader.load('./components/flsc_texture.png');
+		texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
+		texture.repeat.set(5, 40);
+		const material = new THREE.MeshBasicMaterial({ map: texture });
+		const d4mesh = new THREE.Mesh(d4geometry, material);
+		d4mesh.rotateX(Math.PI * 1);
+		d4mesh.rotateY(Math.PI * 1);
+		d4mesh.rotateZ(Math.PI * 1);
+		d4mesh.position.set(0, 120 , 0);
+		bstObject.add(d4mesh);
+
+		// cil Major
+		const d5geometry = new THREE.CylinderGeometry(90, 90, 20, 15);
+		const d5mesh = new THREE.Mesh(d5geometry, materialGrey);
+		d5mesh.rotateX(Math.PI * 1);
+		d5mesh.rotateY(Math.PI * 1);
+		d5mesh.rotateZ(Math.PI * 1);
+		d5mesh.position.set(0, 50 , 0);		
+		d5mesh.colorable = true;
+		bstObject.add(d5mesh);						
+
+		// cil Med
+		const d6geometry = new THREE.CylinderGeometry(70, 70, 80, 15);
+		const d6mesh = new THREE.Mesh(d6geometry, materialGrey);
+		d6mesh.rotateX(Math.PI * 1);
+		d6mesh.rotateY(Math.PI * 1);
+		d6mesh.rotateZ(Math.PI * 1);
+		d6mesh.position.set(0, 0 , 0);
+		d6mesh.colorable = true;
+		bstObject.add(d6mesh);
+
+		// cil low
+		const d7geometry = new THREE.CylinderGeometry(50, 50, 120, 15);
+		const d7mesh = new THREE.Mesh(d7geometry, materialGrey);
+		d7mesh.rotateX(Math.PI * 1);
+		d7mesh.rotateY(Math.PI * 1);
+		d7mesh.rotateZ(Math.PI * 1);
+		d7mesh.position.set(0, -100 , 0);
+		d7mesh.colorable = true;
+		bstObject.add(d7mesh);
+
+		const d8geometry = new THREE.CylinderGeometry(60, 60, 20, 15);
+		const d8mesh = new THREE.Mesh(d8geometry, materialGrey);
+		d8mesh.rotateX(Math.PI * 1);
+		d8mesh.rotateY(Math.PI * 1);
+		d8mesh.rotateZ(Math.PI * 1);
+		d8mesh.position.set(0, -170 , 0);
+		bstObject.add(d8mesh);
+
+		bstObject.position.set(0, 290, 0);
+		bstContiner.add(bstObject);
+		bstContiner.rotateY(Math.PI * -0.5);
+		return bstContiner;
+	}
+	export function bstUpdate(c, color) {
+		const vlv = c.children[0].children;
+		for (let i=0; i<vlv.length; i++) {
+			if (vlv[i].colorable) {
+				vlv[i].material.dispose();
+				vlv[i].material = new THREE.MeshLambertMaterial({color: color});
+			}
 		}
 	}
-}
-- 
GitLab