import java.io.ByteArrayInputStream;
			import java.io.IOException;
			import java.io.InputStream;
			import java.io.PrintWriter;
			import java.util.*;
			import java.io.*;
			import java.math.*;
			public class Main {
			InputStream is;
				PrintWriter out;
				String INPUT = ""; 
			//classin Declaration
			

			static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			}
			
	
long mod = (long)1e9 + 7;			
void print(Object o){
	System.out.println(o);
}


void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
}
boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
}

long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
}
long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
}

	void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			}
				
				
		public static void main(String[] args) throws Exception { new Main().run(); }
				
			//output methods
			private void pn(Object o)
			{
				out.println(o);
			}
			private void p(Object o)
			{
				out.print(o);
			}
 
 
 
			//input methods
					private byte[] inbuf = new byte[1024];
				public int lenbuf = 0, ptrbuf = 0;
				
 
				private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				}
				
				
				
				
				private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
				private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
				
				private double nd() { return Double.parseDouble(ns()); }
				private char nc() { return (char)skip(); }
				
				private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				}
				
				private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				}
					
				private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				}
				
				private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				}
				
				private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); }
			} import java.io.ByteArrayInputStream; ByteArrayInputStream java.io import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.io.PrintWriter; PrintWriter java.io import java.util.*; util.* java import java.io.*; io.* java import java.math.*; math.* java public class Main {
			InputStream is;
				PrintWriter out;
				String INPUT = ""; 
			//classin Declaration
			

			static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			}
			
	
long mod = (long)1e9 + 7;			
void print(Object o){
	System.out.println(o);
}


void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
}
boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
}

long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
}
long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
}

	void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			}
				
				
		public static void main(String[] args) throws Exception { new Main().run(); }
				
			//output methods
			private void pn(Object o)
			{
				out.println(o);
			}
			private void p(Object o)
			{
				out.print(o);
			}
 
 
 
			//input methods
					private byte[] inbuf = new byte[1024];
				public int lenbuf = 0, ptrbuf = 0;
				
 
				private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				}
				
				
				
				
				private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
				private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
				
				private double nd() { return Double.parseDouble(ns()); }
				private char nc() { return (char)skip(); }
				
				private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				}
				
				private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				}
					
				private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				}
				
				private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				}
				
				private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); }
			} Main InputStream is; is PrintWriter out; out String INPUT = ""; INPUT "" long mod = (long)1e9 + 7; mod (long)1e9 + 7 (long)1e9 7 //input methods
					private byte[] inbuf = new byte[1024]; inbuf new byte[1024] 1024 public int lenbuf = 0 lenbuf 0 ptrbuf = 0; ptrbuf 0 void print(Object o){
	System.out.println(o);
} print {
	System.out.println(o);
} System.out.println(o) System.out.println System.out System System.out o Object o o void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
} solve {
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
} String s = ns(); s ns() ns int n= s.length(); n s.length() s.length s boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n)); ans isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n)) isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n)) isPal(s) isPal s isPal(s.substring(0,(n-1)/2)) isPal s.substring(0,(n-1)/2) s.substring s 0 (n-1)/2 (n-1) n 1 2 isPal(s.substring((n+3)/2-1,n)) isPal s.substring((n+3)/2-1,n) s.substring s (n+3)/2-1 (n+3)/2 (n+3) n 3 2 1 n pn(ans?"Yes":"No") pn ans?"Yes":"No" ans "Yes" "No" boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
} isPal {
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
} char[]  str = test.toCharArray(); str test.toCharArray() test.toCharArray test int n= str.length; n str.length str str.length for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	} int i=0; int i=0; i 0 i<n/2 i n/2 n 2 ++i ++i i {
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	} {
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	} if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		} str[i]==str[n-i-1] str[i] str i str[n-i-1] str n-i-1 n-i-1 n i 1 continue; {
			return false;	
		} return false; false return true; true String test test long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
} gcd {
	if(b==0) return a;
	return gcd(b,a%b);
} if(b==0) return a; b==0 b 0 return a; a return gcd(b,a%b); gcd(b,a%b) gcd b a%b a b long a a long b b long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
} pow {
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
} long result = 1; result 1 while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	} b>0 b 0 {
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	} if(b%2==1) result = (result * a) % mod; b%2==1 b%2 b 2 1 result = (result * a) % mod result (result * a) % mod (result * a) result a mod b/=2 b 2 a=(a*a)%mod a (a*a)%mod (a*a) a a mod return result; result long a a long b b void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			} run {
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			} is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes()) is INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes()) INPUT.isEmpty() INPUT.isEmpty INPUT System.in System System.in new ByteArrayInputStream(INPUT.getBytes()) out = new PrintWriter(System.out) out new PrintWriter(System.out) long s = System.currentTimeMillis(); s System.currentTimeMillis() System.currentTimeMillis System solve() solve out.flush() out.flush out if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms"); !INPUT.isEmpty() INPUT.isEmpty() INPUT.isEmpty INPUT tr(System.currentTimeMillis()-s+"ms") tr System.currentTimeMillis()-s+"ms" System.currentTimeMillis()-s System.currentTimeMillis() System.currentTimeMillis System s "ms" public static void main(String[] args) throws Exception { new Main().run(); } main { new Main().run(); } new Main().run() new Main().run new Main() String[] args args //output methods
			private void pn(Object o)
			{
				out.println(o);
			} pn {
				out.println(o);
			} out.println(o) out.println out o Object o o private void p(Object o)
			{
				out.print(o);
			} p {
				out.print(o);
			} out.print(o) out.print out o Object o o private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				} readByte {
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				} if(lenbuf == -1)throw new InputMismatchException(); lenbuf == -1 lenbuf -1 1 throw new InputMismatchException(); new InputMismatchException() if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					} ptrbuf >= lenbuf ptrbuf lenbuf {
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					} ptrbuf = 0 ptrbuf 0 try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); } catch (IOException e) { throw new InputMismatchException(); } IOException e { throw new InputMismatchException(); } throw new InputMismatchException(); new InputMismatchException() { lenbuf = is.read(inbuf); } lenbuf = is.read(inbuf) lenbuf is.read(inbuf) is.read is inbuf if(lenbuf <= 0)return -1; lenbuf <= 0 lenbuf 0 return -1; -1 1 return inbuf[ptrbuf++]; inbuf[ptrbuf++] inbuf ptrbuf++ ptrbuf private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); } isSpaceChar { return !(c >= 33 && c <= 126); } return !(c >= 33 && c <= 126); !(c >= 33 && c <= 126) (c >= 33 && c <= 126) c >= 33 c 33 c <= 126 c 126 int c c private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; } skip { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; } int b; b while((b = readByte()) != -1 && isSpaceChar(b)); (b = readByte()) != -1 && isSpaceChar(b) (b = readByte()) != -1 (b = readByte()) b readByte() readByte -1 1 isSpaceChar(b) isSpaceChar b return b; b private double nd() { return Double.parseDouble(ns()); } nd { return Double.parseDouble(ns()); } return Double.parseDouble(ns()); Double.parseDouble(ns()) Double.parseDouble Double ns() ns private char nc() { return (char)skip(); } nc { return (char)skip(); } return (char)skip(); (char)skip() skip private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				} ns {
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				} int b = skip(); b skip() skip StringBuilder sb = new StringBuilder(); sb new StringBuilder() while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					} !(isSpaceChar(b)) (isSpaceChar(b)) isSpaceChar b { // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					} sb.appendCodePoint(b) sb.appendCodePoint sb b b = readByte() b readByte() readByte return sb.toString(); sb.toString() sb.toString sb private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				} ns {
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				} char[] buf = new char[n]; buf new char[n] n int b = skip() b skip() skip p = 0; p 0 while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					} p < n && !(isSpaceChar(b)) p < n p n !(isSpaceChar(b)) (isSpaceChar(b)) isSpaceChar b {
						buf[p++] = (char)b;
						b = readByte();
					} buf[p++] = (char)b buf[p++] buf p++ p (char)b b = readByte() b readByte() readByte return n == p ? buf : Arrays.copyOf(buf, p); n == p ? buf : Arrays.copyOf(buf, p) n == p n p buf Arrays.copyOf(buf, p) Arrays.copyOf Arrays buf p int n n private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				} nm {
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				} char[][] map = new char[n][]; map new char[n][] n for(int i = 0;i < n;i++)map[i] = ns(m); int i = 0; int i = 0; i 0 i < n i n i++ i++ i map[i] = ns(m); map[i] = ns(m) map[i] map i ns(m) ns m return map; map int n n int m m private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				} na {
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				} int[] a = new int[n]; a new int[n] n for(int i = 0;i < n;i++)a[i] = ni(); int i = 0; int i = 0; i 0 i < n i n i++ i++ i a[i] = ni(); a[i] = ni() a[i] a i ni() ni return a; a int n n private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				} ni {
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				} int num = 0 num 0 b; b boolean minus = false; minus false while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')); (b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-') (b = readByte()) != -1 (b = readByte()) b readByte() readByte -1 1 !((b >= '0' && b <= '9') || b == '-') ((b >= '0' && b <= '9') || b == '-') (b >= '0' && b <= '9') b >= '0' b '0' b <= '9' b '9' b == '-' b '-' if(b == '-'){
						minus = true;
						b = readByte();
					} b == '-' b '-' {
						minus = true;
						b = readByte();
					} minus = true minus true b = readByte() b readByte() readByte while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					} true {
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					} if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						} b >= '0' && b <= '9' b >= '0' b '0' b <= '9' b '9' {
							num = num * 10 + (b - '0');
						} num = num * 10 + (b - '0') num num * 10 + (b - '0') num * 10 num 10 (b - '0') b '0' {
							return minus ? -num : num;
						} return minus ? -num : num; minus ? -num : num minus -num num num b = readByte() b readByte() readByte private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				} nl {
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				} long num = 0; num 0 int b; b boolean minus = false; minus false while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-')); (b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-') (b = readByte()) != -1 (b = readByte()) b readByte() readByte -1 1 !((b >= '0' && b <= '9') || b == '-') ((b >= '0' && b <= '9') || b == '-') (b >= '0' && b <= '9') b >= '0' b '0' b <= '9' b '9' b == '-' b '-' if(b == '-'){
						minus = true;
						b = readByte();
					} b == '-' b '-' {
						minus = true;
						b = readByte();
					} minus = true minus true b = readByte() b readByte() readByte while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					} true {
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					} if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						} b >= '0' && b <= '9' b >= '0' b '0' b <= '9' b '9' {
							num = num * 10 + (b - '0');
						} num = num * 10 + (b - '0') num num * 10 + (b - '0') num * 10 num 10 (b - '0') b '0' {
							return minus ? -num : num;
						} return minus ? -num : num; minus ? -num : num minus -num num num b = readByte() b readByte() readByte private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); } tr { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); } if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); INPUT.length() > 0 INPUT.length() INPUT.length INPUT 0 System.out.println(Arrays.deepToString(o)) System.out.println System.out System System.out Arrays.deepToString(o) Arrays.deepToString Arrays o Object... o o static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			} pair int x x y; y pair (int i,int j)
				{ x=i; y=j; 
					
				} pair { x=i; y=j; 
					
				} x=i x i y=j y j int i i int j j public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				} compareTo {
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				} if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;} this.x!=p.x this.x this this.x p.x p p.x { return this.x-p.x;} return this.x-p.x; this.x-p.x this.x this this.x p.x p p.x { return this.y-p.y;} return this.y-p.y; this.y-p.y this.y this this.y p.y p p.y pair p p public int hashCode() { return (x+" "+y).hashCode();} hashCode { return (x+" "+y).hashCode();} return (x+" "+y).hashCode(); (x+" "+y).hashCode() (x+" "+y).hashCode (x+" "+y) x+" "+y x " " y public String toString(){ return x+" "+y;} toString { return x+" "+y;} return x+" "+y; x+" "+y x+" "+y x " " y public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);} equals { 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);} pair x = (pair) o ; x (pair) o return (x.x==this.x&&x.y==this.y); (x.x==this.x&&x.y==this.y) x.x==this.x x.x x x.x this.x this this.x x.y==this.y x.y x x.y this.y this this.y Object o o Comparable public class Main {
			InputStream is;
				PrintWriter out;
				String INPUT = ""; 
			//classin Declaration
			

			static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			}
			
	
long mod = (long)1e9 + 7;			
void print(Object o){
	System.out.println(o);
}


void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
}
boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
}

long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
}
long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
}

	void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			}
				
				
		public static void main(String[] args) throws Exception { new Main().run(); }
				
			//output methods
			private void pn(Object o)
			{
				out.println(o);
			}
			private void p(Object o)
			{
				out.print(o);
			}
 
 
 
			//input methods
					private byte[] inbuf = new byte[1024];
				public int lenbuf = 0, ptrbuf = 0;
				
 
				private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				}
				
				
				
				
				private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
				private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
				
				private double nd() { return Double.parseDouble(ns()); }
				private char nc() { return (char)skip(); }
				
				private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				}
				
				private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				}
					
				private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				}
				
				private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				}
				
				private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); }
			} public class Main {
			InputStream is;
				PrintWriter out;
				String INPUT = ""; 
			//classin Declaration
			

			static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			}
			
	
long mod = (long)1e9 + 7;			
void print(Object o){
	System.out.println(o);
}


void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
}
boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
}

long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
}
long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
}

	void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			}
				
				
		public static void main(String[] args) throws Exception { new Main().run(); }
				
			//output methods
			private void pn(Object o)
			{
				out.println(o);
			}
			private void p(Object o)
			{
				out.print(o);
			}
 
 
 
			//input methods
					private byte[] inbuf = new byte[1024];
				public int lenbuf = 0, ptrbuf = 0;
				
 
				private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				}
				
				
				
				
				private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
				private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
				
				private double nd() { return Double.parseDouble(ns()); }
				private char nc() { return (char)skip(); }
				
				private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				}
				
				private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				}
					
				private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				}
				
				private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				}
				
				private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); }
			} Main
import java.io.ByteArrayInputStream;
			import java.io.IOException;
			import java.io.InputStream;
			import java.io.PrintWriter;
			import java.util.*;
			import java.io.*;
			import java.math.*;
			public class Main {
			InputStream is;
				PrintWriter out;
				String INPUT = ""; 
			//classin Declaration
			

			static class pair implements Comparable<pair>{
				int x,y;
				
				pair (int i,int j)
				{ x=i; y=j; 
					
				}
				public int compareTo(pair p){
					if(this.x!=p.x) { return this.x-p.x;}
					else { return this.y-p.y;}
				}
				public int hashCode() { return (x+" "+y).hashCode();}
				public String toString(){ return x+" "+y;} 
				public boolean equals(Object o){ 
					pair x = (pair) o ;
					return (x.x==this.x&&x.y==this.y);}
			}
			
	
long mod = (long)1e9 + 7;			
void print(Object o){
	System.out.println(o);
}


void solve() throws Exception{
		String s = ns();
		int n= s.length();
		//print((n+3)/2-1);
		//print(isPal(s));
		//print(s.substring(0,(n-1)/2));
		//print(s.substring((n+3)/2-1,n));
		boolean ans = isPal(s) && isPal(s.substring(0,(n-1)/2)) && isPal(s.substring((n+3)/2-1,n));
		pn(ans?"Yes":"No");
		
}
boolean isPal(String test ){
	char[]  str = test.toCharArray();
	int n= str.length;
	for(int i=0;i<n/2;++i){
		if(str[i]==str[n-i-1]) continue;
		else{
			return false;	
		}
	}
	return true;
}

long gcd(long a,long b){
	if(b==0) return a;
	return gcd(b,a%b);
}
long pow(long a,long b){
	long result = 1;
	while(b>0){
	if(b%2==1) result = (result * a) % mod;
		b/=2;
		a=(a*a)%mod;
	}
	return result;
}

	void run() throws Exception
			{
					is = INPUT.isEmpty() ? System.in : new ByteArrayInputStream(INPUT.getBytes());
			 out = new PrintWriter(System.out);
					
					long s = System.currentTimeMillis();
					solve();
					out.flush();
					if(!INPUT.isEmpty())tr(System.currentTimeMillis()-s+"ms");
					//long time = System.currentTimeMillis()-s;
					//System.out.println("tn :"+time);
			}
				
				
		public static void main(String[] args) throws Exception { new Main().run(); }
				
			//output methods
			private void pn(Object o)
			{
				out.println(o);
			}
			private void p(Object o)
			{
				out.print(o);
			}
 
 
 
			//input methods
					private byte[] inbuf = new byte[1024];
				public int lenbuf = 0, ptrbuf = 0;
				
 
				private int readByte()
				{
					if(lenbuf == -1)throw new InputMismatchException();
					if(ptrbuf >= lenbuf){
						ptrbuf = 0;
						try { lenbuf = is.read(inbuf); } catch (IOException e) { throw new InputMismatchException(); }
						if(lenbuf <= 0)return -1;
					}
					return inbuf[ptrbuf++];
				}
				
				
				
				
				private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
				private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
				
				private double nd() { return Double.parseDouble(ns()); }
				private char nc() { return (char)skip(); }
				
				private String ns()
				{
					int b = skip();
					StringBuilder sb = new StringBuilder();
					while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
						sb.appendCodePoint(b);
						b = readByte();
					}
					return sb.toString();
				}
				
				private char[] ns(int n)
				{
					char[] buf = new char[n];
					int b = skip(), p = 0;
					while(p < n && !(isSpaceChar(b))){
						buf[p++] = (char)b;
						b = readByte();
					}
					return n == p ? buf : Arrays.copyOf(buf, p);
				}
					
				private char[][] nm(int n, int m)
				{
					char[][] map = new char[n][];
					for(int i = 0;i < n;i++)map[i] = ns(m);
					return map;
				}
				
				private int[] na(int n)
				{
					int[] a = new int[n];
					for(int i = 0;i < n;i++)a[i] = ni();
					return a;
				}
				
				private int ni()
				{
					int num = 0, b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private long nl()
				{
					long num = 0;
					int b;
					boolean minus = false;
					while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
					if(b == '-'){
						minus = true;
						b = readByte();
					}
					
					while(true){
						if(b >= '0' && b <= '9'){
							num = num * 10 + (b - '0');
						}else{
							return minus ? -num : num;
						}
						b = readByte();
					}
				}
				
				private void tr(Object... o) { if(INPUT.length() > 0)System.out.println(Arrays.deepToString(o)); }
			}