1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.ArrayList;
20cfd74d65d832137e20e193c960802afba73b5d38sm
21cfd74d65d832137e20e193c960802afba73b5d38smimport org.xmlpull.v1.XmlPullParser;
22cfd74d65d832137e20e193c960802afba73b5d38sm
23cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Context;
24cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.res.XmlResourceParser;
25cfd74d65d832137e20e193c960802afba73b5d38sm
26cfd74d65d832137e20e193c960802afba73b5d38smpublic final class LevelTree {
27cfd74d65d832137e20e193c960802afba73b5d38sm	public static class LevelGroup {
28cfd74d65d832137e20e193c960802afba73b5d38sm		public ArrayList<Level> levels = new ArrayList<Level>();
29cfd74d65d832137e20e193c960802afba73b5d38sm	}
30cfd74d65d832137e20e193c960802afba73b5d38sm
31cfd74d65d832137e20e193c960802afba73b5d38sm    public static class Level {
32cfd74d65d832137e20e193c960802afba73b5d38sm    	public int resource;
33cfd74d65d832137e20e193c960802afba73b5d38sm        public DialogEntry dialogResources;
34cfd74d65d832137e20e193c960802afba73b5d38sm        public String name;
35cfd74d65d832137e20e193c960802afba73b5d38sm        public String timeStamp;
36cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean completed;
37cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean inThePast;
38cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean diaryCollected;
39cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean restartable;
40cfd74d65d832137e20e193c960802afba73b5d38sm        public boolean showWaitMessage;
41cfd74d65d832137e20e193c960802afba73b5d38sm
42cfd74d65d832137e20e193c960802afba73b5d38sm        public Level(int level, DialogEntry dialogs, String title, String time,
43cfd74d65d832137e20e193c960802afba73b5d38sm        		boolean pastEvent, boolean restartOnDeath, boolean waitMessage) {
44cfd74d65d832137e20e193c960802afba73b5d38sm            resource = level;
45cfd74d65d832137e20e193c960802afba73b5d38sm            dialogResources = dialogs;
46cfd74d65d832137e20e193c960802afba73b5d38sm            name = title;
47cfd74d65d832137e20e193c960802afba73b5d38sm            timeStamp = time;
48cfd74d65d832137e20e193c960802afba73b5d38sm            completed = false;
49cfd74d65d832137e20e193c960802afba73b5d38sm            inThePast = pastEvent;
50cfd74d65d832137e20e193c960802afba73b5d38sm            diaryCollected = false;
51cfd74d65d832137e20e193c960802afba73b5d38sm            restartable = restartOnDeath;
52cfd74d65d832137e20e193c960802afba73b5d38sm            showWaitMessage = waitMessage;
53cfd74d65d832137e20e193c960802afba73b5d38sm        }
54cfd74d65d832137e20e193c960802afba73b5d38sm
55cfd74d65d832137e20e193c960802afba73b5d38sm    }
56cfd74d65d832137e20e193c960802afba73b5d38sm
57cfd74d65d832137e20e193c960802afba73b5d38sm    public static class DialogEntry {
58cfd74d65d832137e20e193c960802afba73b5d38sm        public int diaryEntry = 0;
59cfd74d65d832137e20e193c960802afba73b5d38sm        public int character1Entry = 0;
60cfd74d65d832137e20e193c960802afba73b5d38sm        public int character2Entry = 0;
61cfd74d65d832137e20e193c960802afba73b5d38sm        public ArrayList<ConversationUtils.Conversation> character1Conversations;
62cfd74d65d832137e20e193c960802afba73b5d38sm        public ArrayList<ConversationUtils.Conversation> character2Conversations;
63cfd74d65d832137e20e193c960802afba73b5d38sm    }
64cfd74d65d832137e20e193c960802afba73b5d38sm    public final static ArrayList<LevelGroup> levels = new ArrayList<LevelGroup>();
65cfd74d65d832137e20e193c960802afba73b5d38sm    private static boolean mLoaded = false;
662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private static int mLoadedResource = 0;
67cfd74d65d832137e20e193c960802afba73b5d38sm
68cfd74d65d832137e20e193c960802afba73b5d38sm    public static final Level get(int row, int index) {
69cfd74d65d832137e20e193c960802afba73b5d38sm    	return levels.get(row).levels.get(index);
70cfd74d65d832137e20e193c960802afba73b5d38sm    }
71cfd74d65d832137e20e193c960802afba73b5d38sm
722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    public static final boolean isLoaded(int resource) {
732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    	return mLoaded && mLoadedResource == resource;
74cfd74d65d832137e20e193c960802afba73b5d38sm    }
75cfd74d65d832137e20e193c960802afba73b5d38sm
76cfd74d65d832137e20e193c960802afba73b5d38sm    public static final void loadLevelTree(int resource, Context context) {
772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        if (levels.size() > 0 && mLoadedResource == resource) {
78cfd74d65d832137e20e193c960802afba73b5d38sm        	// already loaded
79cfd74d65d832137e20e193c960802afba73b5d38sm        	return;
80cfd74d65d832137e20e193c960802afba73b5d38sm        }
81cfd74d65d832137e20e193c960802afba73b5d38sm
82cfd74d65d832137e20e193c960802afba73b5d38sm    	XmlResourceParser parser = context.getResources().getXml(resource);
83cfd74d65d832137e20e193c960802afba73b5d38sm
84cfd74d65d832137e20e193c960802afba73b5d38sm        levels.clear();
85cfd74d65d832137e20e193c960802afba73b5d38sm
86cfd74d65d832137e20e193c960802afba73b5d38sm        LevelGroup currentGroup = null;
87cfd74d65d832137e20e193c960802afba73b5d38sm        Level currentLevel = null;
88cfd74d65d832137e20e193c960802afba73b5d38sm        DialogEntry currentDialog = null;
89cfd74d65d832137e20e193c960802afba73b5d38sm
90cfd74d65d832137e20e193c960802afba73b5d38sm        try {
91cfd74d65d832137e20e193c960802afba73b5d38sm            int eventType = parser.getEventType();
92cfd74d65d832137e20e193c960802afba73b5d38sm            while (eventType != XmlPullParser.END_DOCUMENT) {
93cfd74d65d832137e20e193c960802afba73b5d38sm                if(eventType == XmlPullParser.START_TAG) {
94cfd74d65d832137e20e193c960802afba73b5d38sm                	if (parser.getName().equals("group")) {
95cfd74d65d832137e20e193c960802afba73b5d38sm                		currentGroup = new LevelGroup();
96cfd74d65d832137e20e193c960802afba73b5d38sm                		levels.add(currentGroup);
97cfd74d65d832137e20e193c960802afba73b5d38sm                		currentLevel = null;
98cfd74d65d832137e20e193c960802afba73b5d38sm                		currentDialog = null;
99cfd74d65d832137e20e193c960802afba73b5d38sm                	}
100cfd74d65d832137e20e193c960802afba73b5d38sm
101cfd74d65d832137e20e193c960802afba73b5d38sm                    if (parser.getName().equals("level") && currentGroup != null) {
102cfd74d65d832137e20e193c960802afba73b5d38sm                    	int levelResource = 0;
103cfd74d65d832137e20e193c960802afba73b5d38sm                    	String titleString = null;
104cfd74d65d832137e20e193c960802afba73b5d38sm                    	String timeStamp = null;
105cfd74d65d832137e20e193c960802afba73b5d38sm                    	boolean inThePast = false;
106cfd74d65d832137e20e193c960802afba73b5d38sm                    	boolean restartable = true;
107cfd74d65d832137e20e193c960802afba73b5d38sm                    	boolean showWaitMessage = false;
108cfd74d65d832137e20e193c960802afba73b5d38sm                        for(int i=0; i < parser.getAttributeCount(); i++) {
109cfd74d65d832137e20e193c960802afba73b5d38sm                    		if (parser.getAttributeName(i).equals("past")) {
110cfd74d65d832137e20e193c960802afba73b5d38sm                    			if (parser.getAttributeValue(i).equals("true")) {
111cfd74d65d832137e20e193c960802afba73b5d38sm                    				inThePast = true;
112cfd74d65d832137e20e193c960802afba73b5d38sm                    			}
113cfd74d65d832137e20e193c960802afba73b5d38sm                    		} else if (parser.getAttributeName(i).equals("restartable")) {
114cfd74d65d832137e20e193c960802afba73b5d38sm                    			if (parser.getAttributeValue(i).equals("false")) {
115cfd74d65d832137e20e193c960802afba73b5d38sm                    				restartable = false;
116cfd74d65d832137e20e193c960802afba73b5d38sm                    			}
117cfd74d65d832137e20e193c960802afba73b5d38sm                    		} else if (parser.getAttributeName(i).equals("waitmessage")) {
118cfd74d65d832137e20e193c960802afba73b5d38sm                    			if (parser.getAttributeValue(i).equals("true")) {
119cfd74d65d832137e20e193c960802afba73b5d38sm                    				showWaitMessage = true;
120cfd74d65d832137e20e193c960802afba73b5d38sm                    			}
121cfd74d65d832137e20e193c960802afba73b5d38sm                    		} else {
122cfd74d65d832137e20e193c960802afba73b5d38sm                                final int value = parser.getAttributeResourceValue(i, -1);
123cfd74d65d832137e20e193c960802afba73b5d38sm                                if (value != -1) {
124cfd74d65d832137e20e193c960802afba73b5d38sm                                    if (parser.getAttributeName(i).equals("resource")) {
125cfd74d65d832137e20e193c960802afba73b5d38sm                                        levelResource = value;
126cfd74d65d832137e20e193c960802afba73b5d38sm                                    }
127cfd74d65d832137e20e193c960802afba73b5d38sm                                    if (parser.getAttributeName(i).equals("title")) {
128cfd74d65d832137e20e193c960802afba73b5d38sm                                        titleString = context.getString(value);
129cfd74d65d832137e20e193c960802afba73b5d38sm                                    } else if (parser.getAttributeName(i).equals("time")) {
130cfd74d65d832137e20e193c960802afba73b5d38sm                                        timeStamp = context.getString(value);
131cfd74d65d832137e20e193c960802afba73b5d38sm                                    }
132cfd74d65d832137e20e193c960802afba73b5d38sm                                }
133cfd74d65d832137e20e193c960802afba73b5d38sm                    		}
134cfd74d65d832137e20e193c960802afba73b5d38sm
135cfd74d65d832137e20e193c960802afba73b5d38sm                        }
136cfd74d65d832137e20e193c960802afba73b5d38sm                        currentDialog = null;
137cfd74d65d832137e20e193c960802afba73b5d38sm                        currentLevel = new Level(levelResource, null, titleString, timeStamp, inThePast, restartable, showWaitMessage);
138cfd74d65d832137e20e193c960802afba73b5d38sm                        currentGroup.levels.add(currentLevel);
139cfd74d65d832137e20e193c960802afba73b5d38sm                    }
140cfd74d65d832137e20e193c960802afba73b5d38sm
141cfd74d65d832137e20e193c960802afba73b5d38sm                    if (parser.getName().equals("dialog") && currentLevel != null) {
142cfd74d65d832137e20e193c960802afba73b5d38sm                    	currentDialog = new DialogEntry();
143cfd74d65d832137e20e193c960802afba73b5d38sm                    	currentLevel.dialogResources = currentDialog;
144cfd74d65d832137e20e193c960802afba73b5d38sm                    }
145cfd74d65d832137e20e193c960802afba73b5d38sm
146cfd74d65d832137e20e193c960802afba73b5d38sm                    if (parser.getName().equals("diary") && currentDialog != null) {
147cfd74d65d832137e20e193c960802afba73b5d38sm
148cfd74d65d832137e20e193c960802afba73b5d38sm                    	for(int i=0; i < parser.getAttributeCount(); i++) {
149cfd74d65d832137e20e193c960802afba73b5d38sm                            final int value = parser.getAttributeResourceValue(i, -1);
150cfd74d65d832137e20e193c960802afba73b5d38sm                            if (value != -1) {
151cfd74d65d832137e20e193c960802afba73b5d38sm                                if (parser.getAttributeName(i).equals("resource")) {
152cfd74d65d832137e20e193c960802afba73b5d38sm                                	currentDialog.diaryEntry = value;
153cfd74d65d832137e20e193c960802afba73b5d38sm                                }
154cfd74d65d832137e20e193c960802afba73b5d38sm
155cfd74d65d832137e20e193c960802afba73b5d38sm                            }
156cfd74d65d832137e20e193c960802afba73b5d38sm                    	}
157cfd74d65d832137e20e193c960802afba73b5d38sm                    }
158cfd74d65d832137e20e193c960802afba73b5d38sm
159cfd74d65d832137e20e193c960802afba73b5d38sm                    if (parser.getName().equals("character1") && currentDialog != null) {
160cfd74d65d832137e20e193c960802afba73b5d38sm                    	for(int i=0; i < parser.getAttributeCount(); i++) {
161cfd74d65d832137e20e193c960802afba73b5d38sm                            final int value = parser.getAttributeResourceValue(i, -1);
162cfd74d65d832137e20e193c960802afba73b5d38sm                            if (value != -1) {
163cfd74d65d832137e20e193c960802afba73b5d38sm                                if (parser.getAttributeName(i).equals("resource")) {
164cfd74d65d832137e20e193c960802afba73b5d38sm                                	currentDialog.character1Entry = value;
165cfd74d65d832137e20e193c960802afba73b5d38sm                                }
166cfd74d65d832137e20e193c960802afba73b5d38sm
167cfd74d65d832137e20e193c960802afba73b5d38sm                            }
168cfd74d65d832137e20e193c960802afba73b5d38sm                    	}
169cfd74d65d832137e20e193c960802afba73b5d38sm                    }
170cfd74d65d832137e20e193c960802afba73b5d38sm
171cfd74d65d832137e20e193c960802afba73b5d38sm                    if (parser.getName().equals("character2") && currentDialog != null) {
172cfd74d65d832137e20e193c960802afba73b5d38sm
173cfd74d65d832137e20e193c960802afba73b5d38sm                    	for(int i=0; i < parser.getAttributeCount(); i++) {
174cfd74d65d832137e20e193c960802afba73b5d38sm                            final int value = parser.getAttributeResourceValue(i, -1);
175cfd74d65d832137e20e193c960802afba73b5d38sm                            if (value != -1) {
176cfd74d65d832137e20e193c960802afba73b5d38sm                                if (parser.getAttributeName(i).equals("resource")) {
177cfd74d65d832137e20e193c960802afba73b5d38sm                                	currentDialog.character2Entry = value;
178cfd74d65d832137e20e193c960802afba73b5d38sm                                }
179cfd74d65d832137e20e193c960802afba73b5d38sm
180cfd74d65d832137e20e193c960802afba73b5d38sm                            }
181cfd74d65d832137e20e193c960802afba73b5d38sm                    	}
182cfd74d65d832137e20e193c960802afba73b5d38sm                    }
183cfd74d65d832137e20e193c960802afba73b5d38sm
184cfd74d65d832137e20e193c960802afba73b5d38sm                }
185cfd74d65d832137e20e193c960802afba73b5d38sm                eventType = parser.next();
186cfd74d65d832137e20e193c960802afba73b5d38sm            }
187cfd74d65d832137e20e193c960802afba73b5d38sm        } catch(Exception e) {
188cfd74d65d832137e20e193c960802afba73b5d38sm                DebugLog.e("LevelTree", e.getStackTrace().toString());
189cfd74d65d832137e20e193c960802afba73b5d38sm        } finally {
190cfd74d65d832137e20e193c960802afba73b5d38sm            parser.close();
191cfd74d65d832137e20e193c960802afba73b5d38sm        }
192cfd74d65d832137e20e193c960802afba73b5d38sm        mLoaded = true;
1932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm        mLoadedResource = resource;
194cfd74d65d832137e20e193c960802afba73b5d38sm    }
195cfd74d65d832137e20e193c960802afba73b5d38sm
196cfd74d65d832137e20e193c960802afba73b5d38sm    public final static void loadAllDialog(Context context) {
197cfd74d65d832137e20e193c960802afba73b5d38sm    	final int levelGroupCount = levels.size();
198cfd74d65d832137e20e193c960802afba73b5d38sm    	for (int x = 0; x < levelGroupCount; x++) {
199cfd74d65d832137e20e193c960802afba73b5d38sm    		final ArrayList<Level> row = levels.get(x).levels;
200cfd74d65d832137e20e193c960802afba73b5d38sm    		final int levelCount = row.size();
201cfd74d65d832137e20e193c960802afba73b5d38sm    		for (int y = 0; y < levelCount; y++) {
202cfd74d65d832137e20e193c960802afba73b5d38sm    			final Level level = row.get(y);
203cfd74d65d832137e20e193c960802afba73b5d38sm    			if (level != null && level.dialogResources != null) {
204cfd74d65d832137e20e193c960802afba73b5d38sm    				DialogEntry dialog = level.dialogResources;
205cfd74d65d832137e20e193c960802afba73b5d38sm    				if (dialog.character1Entry != 0) {
206cfd74d65d832137e20e193c960802afba73b5d38sm    					dialog.character1Conversations = ConversationUtils.loadDialog(dialog.character1Entry, context);
207cfd74d65d832137e20e193c960802afba73b5d38sm    				}
208cfd74d65d832137e20e193c960802afba73b5d38sm
209cfd74d65d832137e20e193c960802afba73b5d38sm    				if (dialog.character2Entry != 0) {
210cfd74d65d832137e20e193c960802afba73b5d38sm    					dialog.character2Conversations = ConversationUtils.loadDialog(dialog.character2Entry, context);
211cfd74d65d832137e20e193c960802afba73b5d38sm    				}
212cfd74d65d832137e20e193c960802afba73b5d38sm    			}
213cfd74d65d832137e20e193c960802afba73b5d38sm    		}
214cfd74d65d832137e20e193c960802afba73b5d38sm
215cfd74d65d832137e20e193c960802afba73b5d38sm    	}
216cfd74d65d832137e20e193c960802afba73b5d38sm    }
217cfd74d65d832137e20e193c960802afba73b5d38sm
218cfd74d65d832137e20e193c960802afba73b5d38sm	public final static void updateCompletedState(int levelRow, int completedLevels) {
219cfd74d65d832137e20e193c960802afba73b5d38sm		final int rowCount = levels.size();
220cfd74d65d832137e20e193c960802afba73b5d38sm		for (int x = 0; x < rowCount; x++) {
221cfd74d65d832137e20e193c960802afba73b5d38sm			final LevelGroup group = levels.get(x);
222cfd74d65d832137e20e193c960802afba73b5d38sm			final int levelCount = group.levels.size();
223cfd74d65d832137e20e193c960802afba73b5d38sm			for (int y = 0; y < levelCount; y++) {
224cfd74d65d832137e20e193c960802afba73b5d38sm				final Level level = group.levels.get(y);
225cfd74d65d832137e20e193c960802afba73b5d38sm				if (x < levelRow) {
226cfd74d65d832137e20e193c960802afba73b5d38sm					level.completed = true;
227cfd74d65d832137e20e193c960802afba73b5d38sm				} else if (x == levelRow) {
228cfd74d65d832137e20e193c960802afba73b5d38sm					if ((completedLevels & (1 << y)) != 0) {
229cfd74d65d832137e20e193c960802afba73b5d38sm						level.completed = true;
230cfd74d65d832137e20e193c960802afba73b5d38sm					}
231cfd74d65d832137e20e193c960802afba73b5d38sm				} else {
232cfd74d65d832137e20e193c960802afba73b5d38sm					level.completed = false;
233cfd74d65d832137e20e193c960802afba73b5d38sm				}
234cfd74d65d832137e20e193c960802afba73b5d38sm			}
235cfd74d65d832137e20e193c960802afba73b5d38sm		}
236cfd74d65d832137e20e193c960802afba73b5d38sm
237cfd74d65d832137e20e193c960802afba73b5d38sm	}
238cfd74d65d832137e20e193c960802afba73b5d38sm
239cfd74d65d832137e20e193c960802afba73b5d38sm	public final static int packCompletedLevels(int levelRow) {
240cfd74d65d832137e20e193c960802afba73b5d38sm		int completed = 0;
241cfd74d65d832137e20e193c960802afba73b5d38sm		final LevelGroup group = levels.get(levelRow);
242cfd74d65d832137e20e193c960802afba73b5d38sm		final int levelCount = group.levels.size();
243cfd74d65d832137e20e193c960802afba73b5d38sm		for (int y = 0; y < levelCount; y++) {
244cfd74d65d832137e20e193c960802afba73b5d38sm			final Level level = group.levels.get(y);
245cfd74d65d832137e20e193c960802afba73b5d38sm			if (level.completed) {
246cfd74d65d832137e20e193c960802afba73b5d38sm				completed |= 1 << y;
247cfd74d65d832137e20e193c960802afba73b5d38sm			}
248cfd74d65d832137e20e193c960802afba73b5d38sm		}
249cfd74d65d832137e20e193c960802afba73b5d38sm		return completed;
250cfd74d65d832137e20e193c960802afba73b5d38sm	}
251cfd74d65d832137e20e193c960802afba73b5d38sm
252cfd74d65d832137e20e193c960802afba73b5d38sm	public static boolean levelIsValid(int row, int index) {
253cfd74d65d832137e20e193c960802afba73b5d38sm		boolean valid = false;
254cfd74d65d832137e20e193c960802afba73b5d38sm		if (row >= 0 && row < levels.size()) {
255cfd74d65d832137e20e193c960802afba73b5d38sm			final LevelGroup group = levels.get(row);
256cfd74d65d832137e20e193c960802afba73b5d38sm			if (index >=0 && index < group.levels.size()) {
257cfd74d65d832137e20e193c960802afba73b5d38sm				valid = true;
258cfd74d65d832137e20e193c960802afba73b5d38sm			}
259cfd74d65d832137e20e193c960802afba73b5d38sm		}
260cfd74d65d832137e20e193c960802afba73b5d38sm
261cfd74d65d832137e20e193c960802afba73b5d38sm		return valid;
262cfd74d65d832137e20e193c960802afba73b5d38sm	}
263cfd74d65d832137e20e193c960802afba73b5d38sm
264cfd74d65d832137e20e193c960802afba73b5d38sm	public static boolean rowIsValid(int row) {
265cfd74d65d832137e20e193c960802afba73b5d38sm		boolean valid = false;
266cfd74d65d832137e20e193c960802afba73b5d38sm		if (row >= 0 && row < levels.size()) {
267cfd74d65d832137e20e193c960802afba73b5d38sm			valid = true;
268cfd74d65d832137e20e193c960802afba73b5d38sm		}
269cfd74d65d832137e20e193c960802afba73b5d38sm
270cfd74d65d832137e20e193c960802afba73b5d38sm		return valid;
271cfd74d65d832137e20e193c960802afba73b5d38sm	}
272cfd74d65d832137e20e193c960802afba73b5d38sm
273cfd74d65d832137e20e193c960802afba73b5d38sm}
274