From bede5976228c838105338a30934a66d2ef77300f Mon Sep 17 00:00:00 2001 From: Sebastien Dionne Date: Mon, 30 Jan 2012 20:29:57 -0500 Subject: [PATCH 1/2] merge with 0.9 --- extras/pom.xml | 1 + extras/socketio/jsonp-ahc.txt | 81 + extras/socketio/jsonp-localhost.txt | 137 + extras/socketio/netexport-jsonp.txt | 1260 +++ extras/socketio/netexport-websocket.txt | 74 + extras/socketio/netexport.txt | 1412 +++ extras/socketio/netexport2.txt | 1219 +++ extras/socketio/pom.xml | 62 + .../protocol/socketio/ConnectionState.java | 28 + .../socketio/HeartBeatSessionMonitor.java | 27 + .../socketio/SocketIOAtmosphereHandler.java | 56 + .../socketio/SocketIOClosedException.java | 23 + .../socketio/SocketIOCometSupport.java | 315 + .../protocol/socketio/SocketIOException.java | 23 + .../protocol/socketio/SocketIOOutbound.java | 58 + .../protocol/socketio/SocketIOPacket.java | 7 + .../protocol/socketio/SocketIOSession.java | 73 + .../SocketIOSessionActivityMonitor.java | 47 + .../socketio/SocketIOSessionFactory.java | 13 + .../socketio/SocketIOSessionManager.java | 14 + .../socketio/SocketIOSessionOutbound.java | 19 + .../socketio/SocketIOWebSocketProcessor.java | 32 + .../socketio/SocketIOWebSocketProtocol.java | 131 + .../SocketIOWebSocketSessionWrapper.java | 22 + .../socketio/TimeoutSessionMonitor.java | 27 + .../cache/SocketIOBroadcasterCache.java | 109 + .../transport/AbstractTransport.java | 138 + .../transport/FlashSocketTransport.java | 192 + .../transport/HTMLFileTransport.java | 71 + .../transport/JSONPPollingTransport.java | 106 + .../transport/SocketIOPacketImpl.java | 216 + .../transport/SocketIOSessionManagerImpl.java | 365 + .../SocketIOWebSocketEventListener.java | 153 + .../transport/WebSocketTransport.java | 261 + .../transport/XHRPollingTransport.java | 65 + .../protocol1/transport/XHRTransport.java | 462 + .../socketio/transport/DisconnectReason.java | 37 + .../socketio/transport/Transport.java | 26 + .../SocketIOExcludeSessionBroadcaster.java | 163 + .../protocol/socketio/ResponseListener.java | 10 + .../socketio/SocketIOJSONPollingTest.java | 275 + .../protocol/socketio/SocketIOTest.java | 505 + .../socketio/SocketIOWebSocketTest.java | 332 + .../socketio/SocketIOXHRPollingTest.java | 284 + .../socketio/WebSocketResponseListener.java | 29 + .../protocol/socketio/WebSocketWrapper.java | 24 + extras/socketio/test.log | 1033 ++ modules/cpr/pom.xml | 10 + .../cache/BroadcasterCacheBase.java | 4 +- .../container/BlockingIOCometSupport.java | 2 +- .../container/GlassFishWebSocketSupport.java | 4 +- .../container/JettyCometSupport.java | 2 +- .../JettyCometSupportWithWebSocket.java | 6 +- .../container/JettyWebSocketHandler.java | 4 +- .../container/JettyWebSocketUtil.java | 6 +- .../Servlet30CometSupportWithWebSocket.java | 5 +- .../container/Tomcat7CometSupport.java | 2 +- .../container/version/Jetty8WebSocket.java | 4 +- .../org/atmosphere/cpr/ApplicationConfig.java | 1 + .../atmosphere/cpr/AsynchronousProcessor.java | 128 +- .../org/atmosphere/cpr/AtmosphereServlet.java | 304 +- .../org/atmosphere/cpr/BroadcasterCache.java | 6 +- .../org/atmosphere/cpr/BroadcasterConfig.java | 13 +- .../atmosphere/cpr/BroadcasterFactory.java | 6 +- .../atmosphere/cpr/DefaultBroadcaster.java | 13 +- .../cpr/DefaultBroadcasterFactory.java | 7 +- .../util/AbstractBroadcasterProxy.java | 3 +- .../util/ExcludeSessionBroadcaster.java | 3 +- .../atmosphere/util/SimpleBroadcaster.java | 5 +- .../websocket/WebSocketProtocol.java | 5 +- .../websocket/protocol/EchoProtocol.java | 3 +- .../protocol/SimpleHttpProtocol.java | 3 +- .../atmosphere/jersey/JerseyBroadcaster.java | 4 +- .../jersey/util/JerseySimpleBroadcaster.java | 3 +- .../jersey/tests/BuilderResponseTest.java | 5 +- .../jersey/tests/RecyclableBroadcaster.java | 3 +- pom.xml | 6 +- samples/pom.xml | 1 + samples/socketio-chat/bin/pom.xml | 37 + .../bin/src/main/resources/log4j.properties | 5 + .../bin/src/main/webapp/.#webclasspath | 80 + .../bin/src/main/webapp/META-INF/MANIFEST.MF | 3 + .../bin/src/main/webapp/WEB-INF/web.xml | 195 + .../bin/src/main/webapp/WebSocketMain.swf | Bin 0 -> 175830 bytes .../src/main/webapp/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../bin/src/main/webapp/chat.html | 110 + .../bin/src/main/webapp/chat2.html | 110 + .../bin/src/main/webapp/chat8.html | 118 + .../bin/src/main/webapp/chatFlash.html | 112 + .../bin/src/main/webapp/chatSocketIO.html | 92 + .../bin/src/main/webapp/chatWebSocket.html | 112 + .../bin/src/main/webapp/css/style.css | 191 + .../src/main/webapp/dist/WebSocketMain.swf | Bin 0 -> 175830 bytes .../webapp/dist/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../bin/src/main/webapp/dist/jquery-1.7.js | 9300 +++++++++++++++++ .../bin/src/main/webapp/dist/socket.io.js | 3752 +++++++ .../bin/src/main/webapp/dist/socket.io.min.js | 2 + .../main/webapp/images/body-background.png | Bin 0 -> 2381 bytes .../main/webapp/images/header-background.png | Bin 0 -> 20847 bytes .../main/webapp/images/main-background.png | Bin 0 -> 8026 bytes .../bin/src/main/webapp/index.html | 99 + .../bin/src/main/webapp/jquery-1.6.1.min.js | 18 + .../socketio-chat/bin/src/main/webapp/json.js | 18 + .../bin/src/main/webapp/logged.html | 65 + .../bin/src/main/webapp/mini-socket.io.js | 1337 +++ .../bin/src/main/webapp/notlogged.html | 92 + .../bin/src/main/webapp/socket.io.js | 1337 +++ .../bin/src/main/webapp/socket.io.js_bak | 2184 ++++ .../socket.io/flashsocket/WebSocketMain.swf | Bin 0 -> 175830 bytes .../flashsocket/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../src/main/webapp/socket.io/socket.io.js | 2184 ++++ .../src/main/webapp/stylesheets/default.css | 64 + samples/socketio-chat/pom.xml | 37 + .../samples/chat/ChatAtmosphereHandler.java | 262 + .../samples/chat/ChatJSONObject.java | 37 + .../src/main/resources/log4j.properties | 5 + .../src/main/webapp/.#webclasspath | 80 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/WEB-INF/atmosphere.xml | 207 + .../src/main/webapp/WEB-INF/web.xml | 201 + .../src/main/webapp/WebSocketMain.swf | Bin 0 -> 175830 bytes .../src/main/webapp/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../socketio-chat/src/main/webapp/chat.html | 110 + .../socketio-chat/src/main/webapp/chat2.html | 110 + .../socketio-chat/src/main/webapp/chat8.html | 118 + .../src/main/webapp/chatFlash.html | 112 + .../src/main/webapp/chatSocketIO.html | 92 + .../src/main/webapp/chatWebSocket.html | 112 + .../src/main/webapp/css/style.css | 212 + .../src/main/webapp/dist/WebSocketMain.swf | Bin 0 -> 175830 bytes .../webapp/dist/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../src/main/webapp/dist/jquery-1.7.js | 9300 +++++++++++++++++ .../src/main/webapp/dist/socket.io.js | 3754 +++++++ .../src/main/webapp/dist/socket.io.min.js | 2 + .../main/webapp/images/body-background.png | Bin 0 -> 2381 bytes .../main/webapp/images/header-background.png | Bin 0 -> 20847 bytes .../main/webapp/images/main-background.png | Bin 0 -> 8026 bytes .../socketio-chat/src/main/webapp/index.html | 170 + .../src/main/webapp/jquery-1.6.1.min.js | 18 + samples/socketio-chat/src/main/webapp/json.js | 18 + .../socketio-chat/src/main/webapp/logged.html | 65 + .../src/main/webapp/mini-socket.io.js | 1337 +++ .../src/main/webapp/notlogged.html | 92 + .../src/main/webapp/socket.io.js | 1337 +++ .../src/main/webapp/socket.io.js_bak | 2184 ++++ .../socket.io/flashsocket/WebSocketMain.swf | Bin 0 -> 175830 bytes .../flashsocket/WebSocketMainInsecure.swf | Bin 0 -> 175953 bytes .../src/main/webapp/socket.io/socket.io.js | 2184 ++++ .../src/main/webapp/stylesheets/default.css | 64 + 149 files changed, 54169 insertions(+), 259 deletions(-) create mode 100755 extras/socketio/jsonp-ahc.txt create mode 100755 extras/socketio/jsonp-localhost.txt create mode 100755 extras/socketio/netexport-jsonp.txt create mode 100755 extras/socketio/netexport-websocket.txt create mode 100755 extras/socketio/netexport.txt create mode 100755 extras/socketio/netexport2.txt create mode 100755 extras/socketio/pom.xml create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/ConnectionState.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/HeartBeatSessionMonitor.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOAtmosphereHandler.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOClosedException.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOCometSupport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOException.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOOutbound.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOPacket.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOSession.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOSessionActivityMonitor.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOSessionFactory.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOSessionManager.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOSessionOutbound.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOWebSocketProcessor.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOWebSocketProtocol.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/SocketIOWebSocketSessionWrapper.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/TimeoutSessionMonitor.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/cache/SocketIOBroadcasterCache.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/AbstractTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/FlashSocketTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/HTMLFileTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/JSONPPollingTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/SocketIOPacketImpl.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/SocketIOSessionManagerImpl.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/SocketIOWebSocketEventListener.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/WebSocketTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/XHRPollingTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/protocol1/transport/XHRTransport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/transport/DisconnectReason.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/transport/Transport.java create mode 100755 extras/socketio/src/main/java/org/atmosphere/protocol/socketio/util/SocketIOExcludeSessionBroadcaster.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/ResponseListener.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/SocketIOJSONPollingTest.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/SocketIOTest.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/SocketIOWebSocketTest.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/SocketIOXHRPollingTest.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/WebSocketResponseListener.java create mode 100755 extras/socketio/src/test/java/org/atmosphere/protocol/socketio/WebSocketWrapper.java create mode 100755 extras/socketio/test.log create mode 100755 samples/socketio-chat/bin/pom.xml create mode 100755 samples/socketio-chat/bin/src/main/resources/log4j.properties create mode 100755 samples/socketio-chat/bin/src/main/webapp/.#webclasspath create mode 100755 samples/socketio-chat/bin/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 samples/socketio-chat/bin/src/main/webapp/WEB-INF/web.xml create mode 100755 samples/socketio-chat/bin/src/main/webapp/WebSocketMain.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/chat.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/chat2.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/chat8.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/chatFlash.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/chatSocketIO.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/chatWebSocket.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/css/style.css create mode 100755 samples/socketio-chat/bin/src/main/webapp/dist/WebSocketMain.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/dist/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/dist/jquery-1.7.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/dist/socket.io.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/dist/socket.io.min.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/images/body-background.png create mode 100755 samples/socketio-chat/bin/src/main/webapp/images/header-background.png create mode 100755 samples/socketio-chat/bin/src/main/webapp/images/main-background.png create mode 100755 samples/socketio-chat/bin/src/main/webapp/index.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/jquery-1.6.1.min.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/json.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/logged.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/mini-socket.io.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/notlogged.html create mode 100755 samples/socketio-chat/bin/src/main/webapp/socket.io.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/socket.io.js_bak create mode 100755 samples/socketio-chat/bin/src/main/webapp/socket.io/flashsocket/WebSocketMain.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/socket.io/flashsocket/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/bin/src/main/webapp/socket.io/socket.io.js create mode 100755 samples/socketio-chat/bin/src/main/webapp/stylesheets/default.css create mode 100755 samples/socketio-chat/pom.xml create mode 100755 samples/socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatAtmosphereHandler.java create mode 100755 samples/socketio-chat/src/main/java/org/atmosphere/samples/chat/ChatJSONObject.java create mode 100755 samples/socketio-chat/src/main/resources/log4j.properties create mode 100755 samples/socketio-chat/src/main/webapp/.#webclasspath create mode 100755 samples/socketio-chat/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 samples/socketio-chat/src/main/webapp/WEB-INF/atmosphere.xml create mode 100755 samples/socketio-chat/src/main/webapp/WEB-INF/web.xml create mode 100755 samples/socketio-chat/src/main/webapp/WebSocketMain.swf create mode 100755 samples/socketio-chat/src/main/webapp/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/src/main/webapp/chat.html create mode 100755 samples/socketio-chat/src/main/webapp/chat2.html create mode 100755 samples/socketio-chat/src/main/webapp/chat8.html create mode 100755 samples/socketio-chat/src/main/webapp/chatFlash.html create mode 100755 samples/socketio-chat/src/main/webapp/chatSocketIO.html create mode 100755 samples/socketio-chat/src/main/webapp/chatWebSocket.html create mode 100755 samples/socketio-chat/src/main/webapp/css/style.css create mode 100755 samples/socketio-chat/src/main/webapp/dist/WebSocketMain.swf create mode 100755 samples/socketio-chat/src/main/webapp/dist/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/src/main/webapp/dist/jquery-1.7.js create mode 100755 samples/socketio-chat/src/main/webapp/dist/socket.io.js create mode 100755 samples/socketio-chat/src/main/webapp/dist/socket.io.min.js create mode 100755 samples/socketio-chat/src/main/webapp/images/body-background.png create mode 100755 samples/socketio-chat/src/main/webapp/images/header-background.png create mode 100755 samples/socketio-chat/src/main/webapp/images/main-background.png create mode 100755 samples/socketio-chat/src/main/webapp/index.html create mode 100755 samples/socketio-chat/src/main/webapp/jquery-1.6.1.min.js create mode 100755 samples/socketio-chat/src/main/webapp/json.js create mode 100755 samples/socketio-chat/src/main/webapp/logged.html create mode 100755 samples/socketio-chat/src/main/webapp/mini-socket.io.js create mode 100755 samples/socketio-chat/src/main/webapp/notlogged.html create mode 100755 samples/socketio-chat/src/main/webapp/socket.io.js create mode 100755 samples/socketio-chat/src/main/webapp/socket.io.js_bak create mode 100755 samples/socketio-chat/src/main/webapp/socket.io/flashsocket/WebSocketMain.swf create mode 100755 samples/socketio-chat/src/main/webapp/socket.io/flashsocket/WebSocketMainInsecure.swf create mode 100755 samples/socketio-chat/src/main/webapp/socket.io/socket.io.js create mode 100755 samples/socketio-chat/src/main/webapp/stylesheets/default.css diff --git a/extras/pom.xml b/extras/pom.xml index 1df95a8b5fb..3bc31ff9d91 100755 --- a/extras/pom.xml +++ b/extras/pom.xml @@ -22,5 +22,6 @@ redis xmpp hazelcast + socketio diff --git a/extras/socketio/jsonp-ahc.txt b/extras/socketio/jsonp-ahc.txt new file mode 100755 index 00000000000..41b4b7d5e8f --- /dev/null +++ b/extras/socketio/jsonp-ahc.txt @@ -0,0 +1,81 @@ +T 192.168.10.1:57908 -> 192.168.10.141:3000 [AP] +GET /socket.io/1/ HTTP/1.1. +Host: 192.168.10.141:3000. +Connection: keep-alive. +Accept: */*. +User-Agent: NING/1.0. +. + +## +T 192.168.10.141:3000 -> 192.168.10.1:57908 [AP] +HTTP/1.1 200 OK. +Content-Type: text/plain. +Connection: keep-alive. +Transfer-Encoding: chunked. +. +27. +1897756582168726773:15:25:jsonp-polling. +0. +. + +# +T 192.168.10.1:57908 -> 192.168.10.141:3000 [AP] +GET /socket.io/1/jsonp-polling/1897756582168726773?i=0 HTTP/1.1. +Host: 192.168.10.141:3000. +Connection: keep-alive. +Accept: */*. +User-Agent: NING/1.0. +. + +# +T 192.168.10.141:3000 -> 192.168.10.1:57908 [AP] +HTTP/1.1 200 OK. +Content-Type: text/javascript; charset=UTF-8. +Content-Length: 15. +Connection: Keep-Alive. +X-XSS-Protection: 0. +. +io.j[0]("1::"); +## +T 192.168.10.1:57909 -> 192.168.10.141:3000 [AP] +GET /socket.io/1/jsonp-polling/1897756582168726773?i=0 HTTP/1.1. +Host: 192.168.10.141:3000. +Connection: keep-alive. +Accept: */*. +User-Agent: NING/1.0. +. + +## +T 192.168.10.1:57908 -> 192.168.10.141:3000 [AP] +POST /socket.io/1/jsonp-polling/1897756582168726773?i=0 HTTP/1.1. +Host: 192.168.10.141:3000. +Connection: keep-alive. +Accept: */*. +User-Agent: NING/1.0. +Content-Length: 65. +. +"5:1+::{\"name\":\"nickname\",\"args\":[\"test_1324996401409\"]}" +# +T 192.168.10.141:3000 -> 192.168.10.1:57908 [AP] +HTTP/1.1 200 OK. +Content-Length: 1. +Connection: keep-alive. +. +1 +## +T 192.168.10.1:57908 -> 192.168.10.141:3000 [A] +...... +## +T 192.168.10.1:57909 -> 192.168.10.141:3000 [A] +...... +# +T 192.168.10.1:57908 -> 192.168.10.141:3000 [AF] +...... +## +T 192.168.10.1:57909 -> 192.168.10.141:3000 [AF] +...... + + +^Cexit +48 received, 0 dropped +demo@ubuntu:~$ diff --git a/extras/socketio/jsonp-localhost.txt b/extras/socketio/jsonp-localhost.txt new file mode 100755 index 00000000000..8446dade871 --- /dev/null +++ b/extras/socketio/jsonp-localhost.txt @@ -0,0 +1,137 @@ +T 127.0.0.1:51522 -> 127.0.0.1:3000 [AP] +GET /socket.io/1/?t=1324996291023 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +. + +# +T 127.0.0.1:3000 -> 127.0.0.1:51522 [AP] +HTTP/1.1 200 OK. +Content-Type: text/plain. +Connection: keep-alive. +Transfer-Encoding: chunked. +. +26. +833896438529527150:15:25:jsonp-polling. +0. +. + +## +T 127.0.0.1:51522 -> 127.0.0.1:3000 [AP] +GET /socket.io/1/jsonp-polling/833896438529527150?t=1324996291205&i=0 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: */*. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +. + +# +T 127.0.0.1:3000 -> 127.0.0.1:51522 [AP] +HTTP/1.1 200 OK. +Content-Type: text/javascript; charset=UTF-8. +Content-Length: 15. +Connection: Keep-Alive. +X-XSS-Protection: 0. +. +io.j[0]("1::"); +## +T 127.0.0.1:51522 -> 127.0.0.1:3000 [AP] +GET /socket.io/1/jsonp-polling/833896438529527150?t=1324996291235&i=0 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: */*. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +. + +##### +T 127.0.0.1:51523 -> 127.0.0.1:3000 [AP] +POST /socket.io/1/jsonp-polling/833896438529527150?t=1324996294032&i=0 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +Content-Type: application/x-www-form-urlencoded. +Content-Length: 111. +. +d=%225%3A1%2B%3A%3A%7B%5C%22name%5C%22%3A%5C%22nickname%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22test%5C%22%5D%7D%22 +## +T 127.0.0.1:3000 -> 127.0.0.1:51523 [AP] +HTTP/1.1 200 OK. +Content-Length: 1. +Connection: keep-alive. +. +1 +# +T 127.0.0.1:3000 -> 127.0.0.1:51522 [AP] +HTTP/1.1 200 OK. +Content-Type: text/javascript; charset=UTF-8. +Content-Length: 25. +Connection: Keep-Alive. +X-XSS-Protection: 0. +. +io.j[0]("6:::1+[false]"); +### +T 127.0.0.1:51522 -> 127.0.0.1:3000 [AP] +GET /socket.io/1/jsonp-polling/833896438529527150?t=1324996294089&i=0 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: */*. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +. + +## +T 127.0.0.1:3000 -> 127.0.0.1:51522 [AP] +HTTP/1.1 200 OK. +Content-Type: text/javascript; charset=UTF-8. +Content-Length: 71. +Connection: Keep-Alive. +X-XSS-Protection: 0. +. +io.j[0]("5:::{\"name\":\"nicknames\",\"args\":[{\"test\":\"test\"}]}"); +## +T 127.0.0.1:51522 -> 127.0.0.1:3000 [AP] +GET /socket.io/1/jsonp-polling/833896438529527150?t=1324996294278&i=0 HTTP/1.1. +Host: localhost:3000. +User-Agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0. +Accept: */*. +Accept-Language: en-us,en;q=0.5. +Accept-Encoding: gzip, deflate. +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7. +Connection: keep-alive. +Referer: http://localhost:3000/. +. + +### +T 127.0.0.1:3000 -> 127.0.0.1:51522 [AP] +HTTP/1.1 200 OK. +Connection: keep-alive. +Transfer-Encoding: chunked. +. +0. +. + +#^Cexit +90 received, 0 dropped +demo@ubuntu:~$ diff --git a/extras/socketio/netexport-jsonp.txt b/extras/socketio/netexport-jsonp.txt new file mode 100755 index 00000000000..23bdb854c37 --- /dev/null +++ b/extras/socketio/netexport-jsonp.txt @@ -0,0 +1,1260 @@ +{ + "log": { + "version": "1.1", + "creator": { + "name": "Firebug", + "version": "1.8" + }, + "browser": { + "name": "Firefox", + "version": "8.0" + }, + "pages": [ + { + "startedDateTime": "2011-12-22T19:05:35.554-08:00", + "id": "page_62465", + "title": "http://localhost:3000/", + "pageTimings": { + "onContentLoad": 3871, + "onLoad": 4077 + } + } + ], + "entries": [ + { + "pageref": "page_62465", + "startedDateTime": "2011-12-22T19:05:35.554-08:00", + "time": 295, + "request": { + "method": "GET", + "url": "http://localhost:3000/", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Host", + "value": "localhost:3000" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0" + }, + { + "name": "Accept", + "value": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + }, + { + "name": "Accept-Language", + "value": "en-us,en;q=0.5" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate" + }, + { + "name": "Accept-Charset", + "value": "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + } + ], + "queryString": [], + "headersSize": 381, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "X-Powered-By", + "value": "Express" + }, + { + "name": "Content-Type", + "value": "text/html; charset=utf-8" + }, + { + "name": "Content-Length", + "value": "2178" + }, + { + "name": "Connection", + "value": "keep-alive" + } + ], + "content": { + "mimeType": "text/html", + "size": 2178, + "text": "

Please type in your nickname and press enter.

Nickname already in use

Connecting to socket.io server
" + }, + "redirectURL": "", + "headersSize": 128, + "bodySize": 2178 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 60, + "send": 1, + "wait": 234, + "receive": 0 + }, + "serverIPAddress": "127.0.0.1", + "connection": "3000" + }, + { + "pageref": "page_62465", + "startedDateTime": "2011-12-22T19:05:35.925-08:00", + "time": 2994, + "request": { + "method": "GET", + "url": "http://localhost:3000/stylesheets/style.css", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Host", + "value": "localhost:3000" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0" + }, + { + "name": "Accept", + "value": "text/css,*/*;q=0.1" + }, + { + "name": "Accept-Language", + "value": "en-us,en;q=0.5" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate" + }, + { + "name": "Accept-Charset", + "value": "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Referer", + "value": "http://localhost:3000/" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + } + ], + "queryString": [], + "headersSize": 390, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "X-Powered-By", + "value": "Express" + }, + { + "name": "Date", + "value": "Fri, 23 Dec 2011 03:05:38 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=0" + }, + { + "name": "Last-Modified", + "value": "Fri, 23 Dec 2011 03:05:38 GMT" + }, + { + "name": "Etag", + "value": "\"4146-1324609538000\"" + }, + { + "name": "Content-Type", + "value": "text/css; charset=UTF-8" + }, + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Content-Length", + "value": "4146" + }, + { + "name": "Connection", + "value": "keep-alive" + } + ], + "content": { + "mimeType": "text/css", + "size": 4146, + "text": "#chat,\n#nickname,\n#messages {\n width: 600px;\n}\n#chat {\n position: relative;\n border: 1px solid #ccc;\n}\n#nickname,\n#connecting {\n position: absolute;\n height: 410px;\n z-index: 100;\n left: 0;\n top: 0;\n background: #fff;\n text-align: center;\n width: 600px;\n font: 15px Georgia;\n color: #666;\n display: block;\n}\n#nickname .wrap,\n#connecting .wrap {\n padding-top: 150px;\n}\n#nickname input {\n border: 1px solid #ccc;\n padding: 10px;\n}\n#nickname input:focus {\n border-color: #999;\n outline: 0;\n}\n#nickname #nickname-err {\n color: #8b0000;\n font-size: 12px;\n visibility: hidden;\n}\n.connected #connecting {\n display: none;\n}\n.nickname-set #nickname {\n display: none;\n}\n#messages {\n height: 380px;\n background: #eee;\n}\n#messages em {\n text-shadow: 0 1px 0 #fff;\n color: #999;\n}\n#messages p {\n padding: 0;\n margin: 0;\n font: 12px Helvetica, Arial;\n padding: 5px 10px;\n}\n#messages p b {\n display: inline-block;\n padding-right: 10px;\n}\n#messages p:nth-child(even) {\n background: #fafafa;\n}\n#messages #nicknames {\n background: #ccc;\n padding: 2px 4px 4px;\n font: 11px Helvetica;\n}\n#messages #nicknames span {\n color: #000;\n}\n#messages #nicknames b {\n display: inline-block;\n color: #fff;\n background: #999;\n padding: 3px 6px;\n margin-right: 5px;\n -webkit-border-radius: 10px;\n -moz-border-radius: 10px;\n border-radius: 10px;\n text-shadow: 0 1px 0 #666;\n}\n#messages #lines {\n height: 355px;\n overflow: auto;\n overflow-x: hidden;\n overflow-y: auto;\n}\n#messages #lines::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n}\n#messages #lines::-webkit-scrollbar-button:start:decrement,\n#messages #lines ::-webkit-scrollbar-button:end:increment {\n display: block;\n height: 10px;\n}\n#messages #lines::-webkit-scrollbar-button:vertical:increment {\n background-color: #fff;\n}\n#messages #lines::-webkit-scrollbar-track-piece {\n background-color: #fff;\n -webkit-border-radius: 3px;\n}\n#messages #lines::-webkit-scrollbar-thumb:vertical {\n height: 50px;\n background-color: #ccc;\n -webkit-border-radius: 3px;\n}\n#messages #lines::-webkit-scrollbar-thumb:horizontal {\n width: 50px;\n background-color: #fff;\n -webkit-border-radius: 3px;\n}\n#send-message {\n background: #fff;\n position: relative;\n}\n#send-message input {\n border: none;\n height: 30px;\n padding: 0 10px;\n line-height: 30px;\n vertical-align: middle;\n width: 580px;\n}\n#send-message input:focus {\n outline: 0;\n}\n#send-message button {\n position: absolute;\n top: 5px;\n right: 5px;\n}\nbutton {\n margin: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n display: inline-block;\n text-decoration: none;\n background: #43a1f7;\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #43a1f7), color-stop(1, #377ad0));\n background: -webkit-linear-gradient(top, #43a1f7 0%, #377ad0 100%);\n background: -moz-linear-gradient(top, #43a1f7 0%, #377ad0 100%);\n background: linear-gradient(top, #43a1f7 0%, #377ad0 100%);\n border: 1px solid #2e70c4;\n -webkit-border-radius: 16px;\n -moz-border-radius: 16px;\n border-radius: 16px;\n color: #fff;\n font-family: \"lucida grande\", sans-serif;\n font-size: 11px;\n font-weight: normal;\n line-height: 1;\n padding: 3px 10px 5px 10px;\n text-align: center;\n text-shadow: 0 -1px 1px #2d6dc0;\n}\nbutton:hover,\nbutton.hover {\n background: darker;\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #43a1f7), color-stop(1, #2e70c4));\n background: -webkit-linear-gradient(top, #43a1f7 0%, #2e70c4 100%);\n background: -moz-linear-gradient(top, #43a1f7 0%, #2e70c4 100%);\n background: linear-gradient(top, #43a1f7 0%, #2e70c4 100%);\n border: 1px solid #2e70c4;\n cursor: pointer;\n text-shadow: 0 -1px 1px #2c6bbb;\n}\nbutton:active,\nbutton.active {\n background: #2e70c4;\n border: 1px solid #2e70c4;\n border-bottom: 1px solid #2861aa;\n text-shadow: 0 -1px 1px #2b67b5;\n}\nbutton:focus,\nbutton.focus {\n outline: none;\n -webkit-box-shadow: 0 1px 0 0 rgba(255,255,255,0.40), 0 0 4px 0 #377ad0;\n -moz-box-shadow: 0 1px 0 0 rgba(255,255,255,0.40), 0 0 4px 0 #377ad0;\n box-shadow: 0 1px 0 0 rgba(255,255,255,0.40), 0 0 4px 0 #377ad0;\n}\n" + }, + "redirectURL": "", + "headersSize": 294, + "bodySize": 4146 + }, + "cache": {}, + "timings": { + "blocked": 14, + "dns": 0, + "connect": 0, + "send": 0, + "wait": 2979, + "receive": 1 + }, + "serverIPAddress": "127.0.0.1", + "connection": "3000" + }, + { + "pageref": "page_62465", + "startedDateTime": "2011-12-22T19:05:35.939-08:00", + "time": 117, + "request": { + "method": "GET", + "url": "http://code.jquery.com/jquery-1.6.1.min.js", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Host", + "value": "code.jquery.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "en-us,en;q=0.5" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate" + }, + { + "name": "Accept-Charset", + "value": "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Referer", + "value": "http://localhost:3000/" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + } + ], + "queryString": [], + "headersSize": 374, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Type", + "value": "application/x-javascript; charset=utf-8" + }, + { + "name": "Date", + "value": "Fri, 23 Dec 2011 03:05:35 GMT" + }, + { + "name": "Etag", + "value": "\"9e68c36-164ce-dcfdb640+gzip\"" + }, + { + "name": "Last-Modified", + "value": "Thu, 12 May 2011 19:04:49 GMT" + }, + { + "name": "Server", + "value": "ECS (dca/53FD)" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "X-Cache", + "value": "HIT" + }, + { + "name": "Content-Length", + "value": "31988" + } + ], + "content": { + "mimeType": "application/x-javascript", + "size": 91341, + "text": "/*!\n * jQuery JavaScript Library v1.6.1\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Thu May 12 15:04:36 2011 -0400\n */\n(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f(\"<\"+a+\">\").appendTo(\"body\"),d=b.css(\"display\");b.remove();if(d===\"none\"||d===\"\"){ck||(ck=c.createElement(\"iframe\"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write(\"\");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,\"display\"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!==\"*\"?a+\".\":\"\")+b.replace(A,\"`\").replace(B,\"&\")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,\"events\");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type===\"click\")){a.namespace&&(n=new RegExp(\"(^|\\\\.)\"+a.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function L(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function F(){return!0}function E(){return!1}function m(a,c,d){var e=c+\"defer\",g=c+\"queue\",h=c+\"mark\",i=f.data(a,e,b,!0);i&&(d===\"queue\"||!f.data(a,g,b,!0))&&(d===\"mark\"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!==\"toJSON\")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replace(j,\"$1-$2\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/\\d/,n=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,o=/^[\\],:{}\\s]*$/,p=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,r=/(?:^|:|,)(?:\\s*\\[)+/g,s=/(webkit)[ \\/]([\\w.]+)/,t=/(opera)(?:.*version)?[ \\/]([\\w.]+)/,u=/(msie) ([\\w.]+)/,v=/(mozilla)(?:.*? rv:([\\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.charAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:\"\",jquery:\"1.6.1\",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),\"slice\",D.call(arguments).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"object\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger(\"ready\").unbind(\"ready\")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState===\"complete\")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",z,!1),a.addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"onreadystatechange\",z),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return e.type(a)===\"array\"},isWindow:function(a){return a&&typeof a==\"object\"&&\"setInterval\"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||\"object\"},isPlainObject:function(a){if(!a||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,\"constructor\")&&!B.call(a.constructor.prototype,\"isPrototypeOf\"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,\"@\").replace(q,\"]\").replace(r,\"\")))return(new Function(\"return \"+b))();e.error(\"Invalid JSON: \"+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,\"text/xml\")):(c=new ActiveXObject(\"Microsoft.XMLDOM\"),c.async=\"false\",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName===\"parsererror\")&&e.error(\"Invalid XML: \"+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a\",d=a.getElementsByTagName(\"*\"),e=a.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};f=c.createElement(\"select\"),g=f.appendChild(c.createElement(\"option\")),h=a.getElementsByTagName(\"input\")[0],j={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName(\"tbody\").length,htmlSerialize:!!a.getElementsByTagName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormalized:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:h.value===\"on\",optSelected:g.selected,getSetAttribute:a.className!==\"t\",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent(\"onclick\",function b(){j.noCloneEvent=!1,a.detachEvent(\"onclick\",b)}),a.cloneNode(!0).fireEvent(\"onclick\")),h=c.createElement(\"input\"),h.value=\"t\",h.setAttribute(\"type\",\"radio\"),j.radioValue=h.value===\"t\",h.setAttribute(\"checked\",\"checked\"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML=\"\",a.style.width=a.style.paddingLeft=\"1px\",l=c.createElement(\"body\"),m={visibility:\"hidden\",width:0,height:0,border:0,margin:0,background:\"none\"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,\"zoom\"in a.style&&(a.style.display=\"inline\",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display=\"\",a.innerHTML=\"
\",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML=\"
t
\",n=a.getElementsByTagName(\"td\"),r=n[0].offsetHeight===0,n[0].style.display=\"\",n[1].style.display=\"none\",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML=\"\",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement(\"div\"),i.style.width=\"0\",i.style.marginRight=\"0\",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML=\"\",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p=\"on\"+q,r=p in a,r||(a.setAttribute(p,\"return;\"),r=typeof a[p]==\"function\"),j[q+\"Bubbles\"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\\{.*\\}|\\[.*\\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c==\"string\",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c==\"object\"||typeof c==\"function\")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c===\"events\"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a==\"undefined\"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&\"get\"in c&&(d=c.get(e,\"value\"))!==b)return d;return(e.value||\"\").replace(p,\"\")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!(\"set\"in c)||c.set(this,h,\"value\")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type===\"select-one\";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:\"tabIndex\"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!(\"getAttribute\"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!=\"boolean\"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,\"form\")||u.test(c))&&(i=v):i=w);if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&\"set\"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,\"\"+d);return d}if(i&&\"get\"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,\"\"),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be changed\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabIndex\");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\":\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cellSpacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",usemap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&\"set\"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&\"get\"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,\"button\"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,\"button\"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==\"\"?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each([\"width\",\"height\"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAttribute(b,\"auto\");return c}}})})),f.support.hrefNormalized||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}}),f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=Object.prototype.hasOwnProperty,y=/\\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\\./g,B=/ /g,C=/[^\\w\\s.|`]/g,D=function(a){return a.replace(C,\"\\\\$&\")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(\" \");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(\".\")>-1?(n=l.split(\".\"),l=n.shift(),h.namespace=n.slice(0).sort().join(\".\")):(n=[],h.namespace=\"\"),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent(\"on\"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=E);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c==\"string\"&&c.charAt(0)===\".\"){c=c||\"\";for(h in t)f.event.remove(a,h+c);return}c=c.split(\" \");while(h=c[k++]){r=h,q=null,l=h.indexOf(\".\")<0,m=[],l||(m=h.split(\".\"),h=m.shift(),n=new RegExp(\"(^|\\\\.)\"+f.map(m.slice(0).sort(),D).join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c==\"object\"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join(\".\"),c.namespace_re=new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\\\\.)?\")+\"(\\\\.|$)\");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem\n)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(\":\")<0?\"on\"+h:\"\";do{var m=f._data(k,\"handle\");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!==\"click\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,\"events\")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join(\"-\"):\"\":f.nodeName(a,\"select\")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,\"_change_data\"),g=J(d),(c.type!==\"focusout\"||d.type!==\"radio\")&&f._data(d,\"_change_data\",g);if(e===b||g===e)return;if(e!=null||g)c.type=\"change\",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,\"input\")?b.type:\"\";(c===\"radio\"||c===\"checkbox\"||f.nodeName(b,\"select\"))&&K.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,\"input\")?b.type:\"\";(a.keyCode===13&&!f.nodeName(b,\"textarea\")||a.keyCode===32&&(c===\"checkbox\"||c===\"radio\")||c===\"select-multiple\")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,\"_change_data\",J(b))}},setup:function(a,b){if(this.type===\"file\")return!1;for(var c in I)f.event.add(this,c+\".specialChange\",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,\".specialChange\");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.beforeactivate}f.support.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each([\"bind\",\"one\"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a==\"object\"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c===\"one\"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a===\"unload\"&&c!==\"one\")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\\\/g,j=/\\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(\"\"),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]===\"~\"||x[0]===\"+\")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r=\"\",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)===\"[object Array]\")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e\":function(a,b){var c,d=typeof b==\"string\",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,\"\")},TAG:function(a,b){return a[1].replace(i,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.test(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,\"\");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(i,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerCase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b===\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e===\"contains\")return(a.textContent||a.innerText||k.getText([a])||\"\").indexOf(b[3])>=0;if(e===\"not\"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":f===\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return\"\\\\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+l.match[o].source.replace(/\\\\(\\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);else if(typeof a.length==\"number\")for(var f=a.length;c\",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefined\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChild(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&&a.firstChild.getAttribute(\"href\")!==\"#\"&&(l.attrHandle.href=function(a){return a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"

\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"object\"){var m=e,n=e.getAttribute(\"id\"),o=n||d,q=e.parentNode,r=/^\\s*[+~]/.test(b);n?o=o.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll(\"[id='\"+o+\"'] \"+b),f)}catch(s){}finally{n||m.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!='']:sizzle\")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement(\"div\");a.innerHTML=\"
\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\").length===1)return;l.order.splice(1,0,\"CLASS\"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!==\"HTML\":!1};var v=function(a,b){var c,d=[],e=\"\",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,\"\");a=l.relative[a]?a+\"*\":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"closest\",a)},index:function(a){if(!a||typeof a==\"string\")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(W(c[0])||W(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=T.call(arguments);P.test(a)||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(\",\"))}}),f.extend({filter:function(a,b,c){c&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y=/ jQuery\\d+=\"(?:\\d+|null)\"/g,Z=/^\\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,_=/<([\\w:]+)/,ba=/\",\"\"],legend:[1,\"
\",\"
\"],thead:[1,\"\",\"
\"],tr:[2,\"\",\"
\"],td:[3,\"\",\"
\"],col:[2,\"\",\"
\"],area:[1,\"\",\"\"],_default:[0,\"\",\"\"]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div
\",\"
\"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!=\"object\"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"after\",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Y,\"\"):null;if(typeof a==\"string\"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace($,\"<$1>\");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerDocument||\nb[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k==\"number\"&&(k+=\"\");if(!k)continue;if(typeof k==\"string\")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,\"<$1>\");var l=(_.exec(k)||[\"\",\"\"])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement(\"div\");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l===\"table\"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===\"\"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],\"tbody\")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)==\"number\")for(i=0;i=0)return b+\"px\"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?\"\":\"alpha(opacity=\"+b*100+\")\",g=d&&d.filter||c.filter||\"\";c.filter=bo.test(g)?g.replace(bo,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:\"inline-block\"},function(){b?c=bz(a,\"margin-right\",\"marginRight\"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,\"-$1\").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===\"\"&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b===\"fontSize\"?\"1em\":d||0,d=f.pixelLeft+\"px\",f.left=c,e&&(a.runtimeStyle.left=e));return d===\"\"?\"auto\":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bE=/%20/g,bF=/\\[\\]$/,bG=/\\r?\\n/g,bH=/#.*$/,bI=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\\-storage|.+\\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\\/\\//,bN=/\\?/,bO=/)<[^<]*)*<\\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\\s+/,bR=/([?&])_=[^&]*/,bS=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement(\"a\"),bW.href=\"\",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"string\"&&bT)return bT.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.traditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f(\"
\").append(c.replace(bO,\"\")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bP.test(this.nodeName)||bJ.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bG,\"\\r\\n\")}}):{name:b.name,value:c.replace(bG,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"script\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[1]),global:!0,type:\"GET\",contentType:\"application/x-www-form-urlencoded\",processData:!0,async:!0,accepts:{xml:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"application/json, text/javascript\",\"*\":\"*/*\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converters:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":f.parseXML}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||\"\",v.readyState=a?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader(\"Last-Modified\"))f.lastModified[k]=x;if(y=v.getResponseHeader(\"Etag\"))f.etag[k]=y}if(a===304)c=\"notmodified\",o=!0;else try{r=cb(d,w),c=\"success\",o=!0}catch(z){c=\"parsererror\",u=z}}else{u=c;if(!c||a)c=\"error\",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxStop\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bI.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"abort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\"\").replace(bH,\"\").replace(bM,bX[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\"*\").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]===\"http:\"?80:443))==(bX[3]||(bX[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.data!=\"string\"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?\"&\":\"?\")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,\"$1_=\"+x);d.url=y+(y===d.url?(bN.test(d.url)?\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModified[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequestHeader(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!==\"*\"?\", */*; q=0.01\":\"\"):d.accepts[\"*\"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bV,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readyState=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join(\"&\").replace(bE,\"+\")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cc++}}),f.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e=b.contentType===\"application/x-www-form-urlencoded\"&&typeof b.data==\"string\";if(b.dataTypes[0]===\"jsonp\"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecmascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElement;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requested-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,co,cp=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"],[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\"opacity\"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu(\"show\",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){d.style[\"overflow\"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
\";f.extend(b.style,{position:\"absolute\",top:0,left:0,margin:0,border:0,width:\"1px\",height:\"1px\",visibility:\"hidden\"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position=\"fixed\",e.style.top=\"20px\",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top=\"\",d.style.overflow=\"hidden\",d.style.position=\"relative\",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTopWidth\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"position\")===\"static\")a=a.offsetParent;return a})}}),f.each([\"Left\",\"Top\"],function(a,c){var d=\"scroll\"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?\"pageXOffset\"in g?g[a?\"pageYOffset\":\"pageXOffset\"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each([\"Height\",\"Width\"],function(a,c){var d=c.toLowerCase();f.fn[\"inner\"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,\"padding\")):null},f.fn[\"outer\"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?\"margin\":\"border\")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement[\"client\"+c];return e.document.compatMode===\"CSS1Compat\"&&g||e.document.body[\"client\"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement[\"client\"+c],e.body[\"scroll\"+c],e.documentElement[\"scroll\"+c],e.body[\"offset\"+c],e.documentElement[\"offset\"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a==\"string\"?a:a+\"px\")}}),a.jQuery=a.$=f})(window);" + }, + "redirectURL": "", + "headersSize": 324, + "bodySize": 31988 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 47, + "send": 0, + "wait": 41, + "receive": 29 + }, + "serverIPAddress": "72.21.91.19", + "connection": "80" + }, + { + "pageref": "page_62465", + "startedDateTime": "2011-12-22T19:05:35.943-08:00", + "time": 2985, + "request": { + "method": "GET", + "url": "http://localhost:3000/socket.io/socket.io.js", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Host", + "value": "localhost:3000" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:8.0) Gecko/20100101 Firefox/8.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "en-us,en;q=0.5" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate" + }, + { + "name": "Accept-Charset", + "value": "ISO-8859-1,utf-8;q=0.7,*;q=0.7" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Referer", + "value": "http://localhost:3000/" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + } + ], + "queryString": [], + "headersSize": 376, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [], + "headers": [ + { + "name": "Content-Type", + "value": "application/javascript" + }, + { + "name": "Content-Length", + "value": "63664" + }, + { + "name": "Connection", + "value": "keep-alive" + } + ], + "content": { + "mimeType": "application/javascript", + "size": 63664, + "text": "/*! Socket.IO.js build:0.8.7, development. Copyright(c) 2011 LearnBoost MIT Licensed */\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * IO namespace.\n *\n * @namespace\n */\n\n var io = exports;\n\n /**\n * Socket.IO version\n *\n * @api public\n */\n\n io.version = '0.8.7';\n\n /**\n * Protocol implemented.\n *\n * @api public\n */\n\n io.protocol = 1;\n\n /**\n * Available transports, these will be populated with the available transports\n *\n * @api public\n */\n\n io.transports = [];\n\n /**\n * Keep track of jsonp callbacks.\n *\n * @api private\n */\n\n io.j = [];\n\n /**\n * Keep track of our io.Sockets\n *\n * @api private\n */\n io.sockets = {};\n\n\n /**\n * Manages connections to hosts.\n *\n * @param {String} uri\n * @Param {Boolean} force creation of new socket (defaults to false)\n * @api public\n */\n\n io.connect = function (host, details) {\n var uri = io.util.parseUri(host)\n , uuri\n , socket;\n\n if (global && global.location) {\n uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n uri.host = uri.host || (global.document\n ? global.document.domain : global.location.hostname);\n uri.port = uri.port || global.location.port;\n }\n\n uuri = io.util.uniqueUri(uri);\n\n var options = {\n host: uri.host\n , secure: 'https' == uri.protocol\n , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n , query: uri.query || ''\n };\n\n io.util.merge(options, details);\n\n if (options['force new connection'] || !io.sockets[uuri]) {\n socket = new io.Socket(options);\n }\n\n if (!options['force new connection'] && socket) {\n io.sockets[uuri] = socket;\n }\n\n socket = socket || io.sockets[uuri];\n\n // if path is different from '' or /\n return socket.of(uri.path.length > 1 ? uri.path : '');\n };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, global) {\n\n /**\n * Utilities namespace.\n *\n * @namespace\n */\n\n var util = exports.util = {};\n\n /**\n * Parses an URI\n *\n * @author Steven Levithan (MIT license)\n * @api public\n */\n\n var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n 'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n 'anchor'];\n\n util.parseUri = function (str) {\n var m = re.exec(str || '')\n , uri = {}\n , i = 14;\n\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n\n return uri;\n };\n\n /**\n * Produces a unique url that identifies a Socket.IO connection.\n *\n * @param {Object} uri\n * @api public\n */\n\n util.uniqueUri = function (uri) {\n var protocol = uri.protocol\n , host = uri.host\n , port = uri.port;\n\n if ('document' in global) {\n host = host || document.domain;\n port = port || (protocol == 'https'\n && document.location.protocol !== 'https:' ? 443 : document.location.port);\n } else {\n host = host || 'localhost';\n\n if (!port && protocol == 'https') {\n port = 443;\n }\n }\n\n return (protocol || 'http') + '://' + host + ':' + (port || 80);\n };\n\n /**\n * Mergest 2 query strings in to once unique query string\n *\n * @param {String} base\n * @param {String} addition\n * @api public\n */\n\n util.query = function (base, addition) {\n var query = util.chunkQuery(base || '')\n , components = [];\n\n util.merge(query, util.chunkQuery(addition || ''));\n for (var part in query) {\n if (query.hasOwnProperty(part)) {\n components.push(part + '=' + query[part]);\n }\n }\n\n return components.length ? '?' + components.join('&') : '';\n };\n\n /**\n * Transforms a querystring in to an object\n *\n * @param {String} qs\n * @api public\n */\n\n util.chunkQuery = function (qs) {\n var query = {}\n , params = qs.split('&')\n , i = 0\n , l = params.length\n , kv;\n\n for (; i < l; ++i) {\n kv = params[i].split('=');\n if (kv[0]) {\n query[kv[0]] = decodeURIComponent(kv[1]);\n }\n }\n\n return query;\n };\n\n /**\n * Executes the given function when the page is loaded.\n *\n * io.util.load(function () { console.log('page loaded'); });\n *\n * @param {Function} fn\n * @api public\n */\n\n var pageLoaded = false;\n\n util.load = function (fn) {\n if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n return fn();\n }\n\n util.on(global, 'load', fn, false);\n };\n\n /**\n * Adds an event.\n *\n * @api private\n */\n\n util.on = function (element, event, fn, capture) {\n if (element.attachEvent) {\n element.attachEvent('on' + event, fn);\n } else if (element.addEventListener) {\n element.addEventListener(event, fn, capture);\n }\n };\n\n /**\n * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n *\n * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n * @api private\n */\n\n util.request = function (xdomain) {\n\n if (xdomain && 'undefined' != typeof XDomainRequest) {\n return new XDomainRequest();\n }\n\n if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n return new XMLHttpRequest();\n }\n\n if (!xdomain) {\n try {\n return new ActiveXObject('Microsoft.XMLHTTP');\n } catch(e) { }\n }\n\n return null;\n };\n\n /**\n * XHR based transport constructor.\n *\n * @constructor\n * @api public\n */\n\n /**\n * Change the internal pageLoaded value.\n */\n\n if ('undefined' != typeof window) {\n util.load(function () {\n pageLoaded = true;\n });\n }\n\n /**\n * Defers a function to ensure a spinner is not displayed by the browser\n *\n * @param {Function} fn\n * @api public\n */\n\n util.defer = function (fn) {\n if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n return fn();\n }\n\n util.load(function () {\n setTimeout(fn, 100);\n });\n };\n\n /**\n * Merges two objects.\n *\n * @api public\n */\n \n util.merge = function merge (target, additional, deep, lastseen) {\n var seen = lastseen || []\n , depth = typeof deep == 'undefined' ? 2 : deep\n , prop;\n\n for (prop in additional) {\n if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n if (typeof target[prop] !== 'object' || !depth) {\n target[prop] = additional[prop];\n seen.push(additional[prop]);\n } else {\n util.merge(target[prop], additional[prop], depth - 1, seen);\n }\n }\n }\n\n return target;\n };\n\n /**\n * Merges prototypes from objects\n *\n * @api public\n */\n \n util.mixin = function (ctor, ctor2) {\n util.merge(ctor.prototype, ctor2.prototype);\n };\n\n /**\n * Shortcut for prototypical and static inheritance.\n *\n * @api private\n */\n\n util.inherit = function (ctor, ctor2) {\n function f() {};\n f.prototype = ctor2.prototype;\n ctor.prototype = new f;\n };\n\n /**\n * Checks if the given object is an Array.\n *\n * io.util.isArray([]); // true\n * io.util.isArray({}); // false\n *\n * @param Object obj\n * @api public\n */\n\n util.isArray = Array.isArray || function (obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n\n /**\n * Intersects values of two arrays into a third\n *\n * @api public\n */\n\n util.intersect = function (arr, arr2) {\n var ret = []\n , longest = arr.length > arr2.length ? arr : arr2\n , shortest = arr.length > arr2.length ? arr2 : arr;\n\n for (var i = 0, l = shortest.length; i < l; i++) {\n if (~util.indexOf(longest, shortest[i]))\n ret.push(shortest[i]);\n }\n\n return ret;\n }\n\n /**\n * Array indexOf compatibility.\n *\n * @see bit.ly/a5Dxa2\n * @api public\n */\n\n util.indexOf = function (arr, o, i) {\n if (Array.prototype.indexOf) {\n return Array.prototype.indexOf.call(arr, o, i);\n }\n\n for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; \n i < j && arr[i] !== o; i++) {}\n\n return j <= i ? -1 : i;\n };\n\n /**\n * Converts enumerables to array.\n *\n * @api public\n */\n\n util.toArray = function (enu) {\n var arr = [];\n\n for (var i = 0, l = enu.length; i < l; i++)\n arr.push(enu[i]);\n\n return arr;\n };\n\n /**\n * UA / engines detection namespace.\n *\n * @namespace\n */\n\n util.ua = {};\n\n /**\n * Whether the UA supports CORS for XHR.\n *\n * @api public\n */\n\n util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n try {\n var a = new XMLHttpRequest();\n } catch (e) {\n return false;\n }\n\n return a.withCredentials != undefined;\n })();\n\n /**\n * Detect webkit.\n *\n * @api public\n */\n\n util.ua.webkit = 'undefined' != typeof navigator\n && /webkit/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.EventEmitter = EventEmitter;\n\n /**\n * Event emitter constructor.\n *\n * @api public.\n */\n\n function EventEmitter () {};\n\n /**\n * Adds a listener\n *\n * @api public\n */\n\n EventEmitter.prototype.on = function (name, fn) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = fn;\n } else if (io.util.isArray(this.$events[name])) {\n this.$events[name].push(fn);\n } else {\n this.$events[name] = [this.$events[name], fn];\n }\n\n return this;\n };\n\n EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n /**\n * Adds a volatile listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.once = function (name, fn) {\n var self = this;\n\n function on () {\n self.removeListener(name, on);\n fn.apply(this, arguments);\n };\n\n on.listener = fn;\n this.on(name, on);\n\n return this;\n };\n\n /**\n * Removes a listener.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeListener = function (name, fn) {\n if (this.$events && this.$events[name]) {\n var list = this.$events[name];\n\n if (io.util.isArray(list)) {\n var pos = -1;\n\n for (var i = 0, l = list.length; i < l; i++) {\n if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n pos = i;\n break;\n }\n }\n\n if (pos < 0) {\n return this;\n }\n\n list.splice(pos, 1);\n\n if (!list.length) {\n delete this.$events[name];\n }\n } else if (list === fn || (list.listener && list.listener === fn)) {\n delete this.$events[name];\n }\n }\n\n return this;\n };\n\n /**\n * Removes all listeners for an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.removeAllListeners = function (name) {\n // TODO: enable this when node 0.5 is stable\n //if (name === undefined) {\n //this.$events = {};\n //return this;\n //}\n\n if (this.$events && this.$events[name]) {\n this.$events[name] = null;\n }\n\n return this;\n };\n\n /**\n * Gets all listeners for a certain event.\n *\n * @api publci\n */\n\n EventEmitter.prototype.listeners = function (name) {\n if (!this.$events) {\n this.$events = {};\n }\n\n if (!this.$events[name]) {\n this.$events[name] = [];\n }\n\n if (!io.util.isArray(this.$events[name])) {\n this.$events[name] = [this.$events[name]];\n }\n\n return this.$events[name];\n };\n\n /**\n * Emits an event.\n *\n * @api public\n */\n\n EventEmitter.prototype.emit = function (name) {\n if (!this.$events) {\n return false;\n }\n\n var handler = this.$events[name];\n\n if (!handler) {\n return false;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n\n if ('function' == typeof handler) {\n handler.apply(this, args);\n } else if (io.util.isArray(handler)) {\n var listeners = handler.slice();\n\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n } else {\n return false;\n }\n\n return true;\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n \"use strict\";\n\n // use native JSON if it's available\n if (nativeJSON && nativeJSON.parse){\n return exports.JSON = {\n parse: nativeJSON.parse\n , stringify: nativeJSON.stringify\n }\n }\n\n var JSON = exports.JSON = {};\n\n function f(n) {\n // Format integers to have at least two digits.\n return n < 10 ? '0' + n : n;\n }\n\n function date(d, key) {\n return isFinite(d.valueOf()) ?\n d.getUTCFullYear() + '-' +\n f(d.getUTCMonth() + 1) + '-' +\n f(d.getUTCDate()) + 'T' +\n f(d.getUTCHours()) + ':' +\n f(d.getUTCMinutes()) + ':' +\n f(d.getUTCSeconds()) + 'Z' : null;\n };\n\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\n\n function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n }\n\n\n function str(key, holder) {\n\n// Produce a string from holder[key].\n\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value instanceof Date) {\n value = date(key);\n }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n\n// What happens next depends on the value's type.\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n if (!value) {\n return 'null';\n }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n gap += indent;\n partial = [];\n\n// Is the value an array?\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n if (typeof rep[i] === 'string') {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n var i;\n gap = '';\n indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n } else if (typeof space === 'string') {\n indent = space;\n }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n rep = replacer;\n if (replacer && typeof replacer !== 'function' &&\n (typeof replacer !== 'object' ||\n typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n return str('', {'': value});\n };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n JSON.parse = function (text, reviver) {\n // The parse method takes a text and an optional reviver function, and returns\n // a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n // The walk method is used to recursively walk the resulting structure so\n // that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n // Parsing happens in four stages. In the first stage, we replace certain\n // Unicode characters with escape sequences. JavaScript handles many characters\n // incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n // In the second stage, we run the text against regular expressions that look\n // for non-JSON patterns. We are especially concerned with '()' and 'new'\n // because they can cause invocation, and '=' because it can cause mutation.\n // But just to be safe, we want to reject all unexpected forms.\n\n // We split the second stage into 4 regexp operations in order to work around\n // crippling inefficiencies in IE's and Safari's regexp engines. First we\n // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n // replace all simple value tokens with ']' characters. Third, we delete all\n // open brackets that follow a colon or comma or that begin the text. Finally,\n // we look to see that the remaining characters are only whitespace or ']' or\n // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n // In the third stage we use the eval function to compile the text into a\n // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n // in JavaScript: it can begin a block or an object literal. We wrap the text\n // in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n // In the optional fourth stage, we recursively walk the new structure, passing\n // each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') : j;\n }\n\n // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Parser namespace.\n *\n * @namespace\n */\n\n var parser = exports.parser = {};\n\n /**\n * Packet types.\n */\n\n var packets = parser.packets = [\n 'disconnect'\n , 'connect'\n , 'heartbeat'\n , 'message'\n , 'json'\n , 'event'\n , 'ack'\n , 'error'\n , 'noop'\n ];\n\n /**\n * Errors reasons.\n */\n\n var reasons = parser.reasons = [\n 'transport not supported'\n , 'client not handshaken'\n , 'unauthorized'\n ];\n\n /**\n * Errors advice.\n */\n\n var advice = parser.advice = [\n 'reconnect'\n ];\n\n /**\n * Shortcuts.\n */\n\n var JSON = io.JSON\n , indexOf = io.util.indexOf;\n\n /**\n * Encodes a packet.\n *\n * @api private\n */\n\n parser.encodePacket = function (packet) {\n var type = indexOf(packets, packet.type)\n , id = packet.id || ''\n , endpoint = packet.endpoint || ''\n , ack = packet.ack\n , data = null;\n\n switch (packet.type) {\n case 'error':\n var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n if (reason !== '' || adv !== '')\n data = reason + (adv !== '' ? ('+' + adv) : '');\n\n break;\n\n case 'message':\n if (packet.data !== '')\n data = packet.data;\n break;\n\n case 'event':\n var ev = { name: packet.name };\n\n if (packet.args && packet.args.length) {\n ev.args = packet.args;\n }\n\n data = JSON.stringify(ev);\n break;\n\n case 'json':\n data = JSON.stringify(packet.data);\n break;\n\n case 'connect':\n if (packet.qs)\n data = packet.qs;\n break;\n\n case 'ack':\n data = packet.ackId\n + (packet.args && packet.args.length\n ? '+' + JSON.stringify(packet.args) : '');\n break;\n }\n\n // construct packet with required fragments\n var encoded = [\n type\n , id + (ack == 'data' ? '+' : '')\n , endpoint\n ];\n\n // data fragment is optional\n if (data !== null && data !== undefined)\n encoded.push(data);\n\n return encoded.join(':');\n };\n\n /**\n * Encodes multiple messages (payload).\n *\n * @param {Array} messages\n * @api private\n */\n\n parser.encodePayload = function (packets) {\n var decoded = '';\n\n if (packets.length == 1)\n return packets[0];\n\n for (var i = 0, l = packets.length; i < l; i++) {\n var packet = packets[i];\n decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n }\n\n return decoded;\n };\n\n /**\n * Decodes a packet\n *\n * @api private\n */\n\n var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n parser.decodePacket = function (data) {\n var pieces = data.match(regexp);\n\n if (!pieces) return {};\n\n var id = pieces[2] || ''\n , data = pieces[5] || ''\n , packet = {\n type: packets[pieces[1]]\n , endpoint: pieces[4] || ''\n };\n\n // whether we need to acknowledge the packet\n if (id) {\n packet.id = id;\n if (pieces[3])\n packet.ack = 'data';\n else\n packet.ack = true;\n }\n\n // handle different packet types\n switch (packet.type) {\n case 'error':\n var pieces = data.split('+');\n packet.reason = reasons[pieces[0]] || '';\n packet.advice = advice[pieces[1]] || '';\n break;\n\n case 'message':\n packet.data = data || '';\n break;\n\n case 'event':\n try {\n var opts = JSON.parse(data);\n packet.name = opts.name;\n packet.args = opts.args;\n } catch (e) { }\n\n packet.args = packet.args || [];\n break;\n\n case 'json':\n try {\n packet.data = JSON.parse(data);\n } catch (e) { }\n break;\n\n case 'connect':\n packet.qs = data || '';\n break;\n\n case 'ack':\n var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n if (pieces) {\n packet.ackId = pieces[1];\n packet.args = [];\n\n if (pieces[3]) {\n try {\n packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n } catch (e) { }\n }\n }\n break;\n\n case 'disconnect':\n case 'heartbeat':\n break;\n };\n\n return packet;\n };\n\n /**\n * Decodes data payload. Detects multiple messages\n *\n * @return {Array} messages\n * @api public\n */\n\n parser.decodePayload = function (data) {\n // IE doesn't like data[i] for unicode chars, charAt works fine\n if (data.charAt(0) == '\\ufffd') {\n var ret = [];\n\n for (var i = 1, length = ''; i < data.length; i++) {\n if (data.charAt(i) == '\\ufffd') {\n ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n i += Number(length) + 1;\n length = '';\n } else {\n length += data.charAt(i);\n }\n }\n\n return ret;\n } else {\n return [parser.decodePacket(data)];\n }\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.Transport = Transport;\n\n /**\n * This is the transport template for all supported transport methods.\n *\n * @constructor\n * @api public\n */\n\n function Transport (socket, sessid) {\n this.socket = socket;\n this.sessid = sessid;\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Transport, io.EventEmitter);\n\n /**\n * Handles the response from the server. When a new response is received\n * it will automatically update the timeout, decode the message and\n * forwards the response to the onMessage function for further processing.\n *\n * @param {String} data Response from the server.\n * @api private\n */\n\n Transport.prototype.onData = function (data) {\n this.clearCloseTimeout();\n \n // If the connection in currently open (or in a reopening state) reset the close \n // timeout since we have just received data. This check is necessary so\n // that we don't reset the timeout on an explicitly disconnected connection.\n if (this.connected || this.connecting || this.reconnecting) {\n this.setCloseTimeout();\n }\n\n if (data !== '') {\n // todo: we should only do decodePayload for xhr transports\n var msgs = io.parser.decodePayload(data);\n\n if (msgs && msgs.length) {\n for (var i = 0, l = msgs.length; i < l; i++) {\n this.onPacket(msgs[i]);\n }\n }\n }\n\n return this;\n };\n\n /**\n * Handles packets.\n *\n * @api private\n */\n\n Transport.prototype.onPacket = function (packet) {\n if (packet.type == 'heartbeat') {\n return this.onHeartbeat();\n }\n\n if (packet.type == 'connect' && packet.endpoint == '') {\n this.onConnect();\n }\n\n this.socket.onPacket(packet);\n\n return this;\n };\n\n /**\n * Sets close timeout\n *\n * @api private\n */\n \n Transport.prototype.setCloseTimeout = function () {\n if (!this.closeTimeout) {\n var self = this;\n\n this.closeTimeout = setTimeout(function () {\n self.onDisconnect();\n }, this.socket.closeTimeout);\n }\n };\n\n /**\n * Called when transport disconnects.\n *\n * @api private\n */\n\n Transport.prototype.onDisconnect = function () {\n if (this.close && this.open) this.close();\n this.clearTimeouts();\n this.socket.onDisconnect();\n return this;\n };\n\n /**\n * Called when transport connects\n *\n * @api private\n */\n\n Transport.prototype.onConnect = function () {\n this.socket.onConnect();\n return this;\n }\n\n /**\n * Clears close timeout\n *\n * @api private\n */\n\n Transport.prototype.clearCloseTimeout = function () {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n };\n\n /**\n * Clear timeouts\n *\n * @api private\n */\n\n Transport.prototype.clearTimeouts = function () {\n this.clearCloseTimeout();\n\n if (this.reopenTimeout) {\n clearTimeout(this.reopenTimeout);\n }\n };\n\n /**\n * Sends a packet\n *\n * @param {Object} packet object.\n * @api private\n */\n\n Transport.prototype.packet = function (packet) {\n this.send(io.parser.encodePacket(packet));\n };\n\n /**\n * Send the received heartbeat message back to server. So the server\n * knows we are still connected.\n *\n * @param {String} heartbeat Heartbeat response from the server.\n * @api private\n */\n\n Transport.prototype.onHeartbeat = function (heartbeat) {\n this.packet({ type: 'heartbeat' });\n };\n \n /**\n * Called when the transport opens.\n *\n * @api private\n */\n\n Transport.prototype.onOpen = function () {\n this.open = true;\n this.clearCloseTimeout();\n this.socket.onOpen();\n };\n\n /**\n * Notifies the base when the connection with the Socket.IO server\n * has been disconnected.\n *\n * @api private\n */\n\n Transport.prototype.onClose = function () {\n var self = this;\n\n /* FIXME: reopen delay causing a infinit loop\n this.reopenTimeout = setTimeout(function () {\n self.open();\n }, this.socket.options['reopen delay']);*/\n\n this.open = false;\n this.socket.onClose();\n this.onDisconnect();\n };\n\n /**\n * Generates a connection url based on the Socket.IO URL Protocol.\n * See for more details.\n *\n * @returns {String} Connection url\n * @api private\n */\n\n Transport.prototype.prepareUrl = function () {\n var options = this.socket.options;\n\n return this.scheme() + '://'\n + options.host + ':' + options.port + '/'\n + options.resource + '/' + io.protocol\n + '/' + this.name + '/' + this.sessid;\n };\n\n /**\n * Checks if the transport is ready to start a connection.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n Transport.prototype.ready = function (socket, fn) {\n fn.call(this);\n };\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports.Socket = Socket;\n\n /**\n * Create a new `Socket.IO client` which can establish a persistent\n * connection with a Socket.IO enabled server.\n *\n * @api public\n */\n\n function Socket (options) {\n this.options = {\n port: 80\n , secure: false\n , document: 'document' in global ? document : false\n , resource: 'socket.io'\n , transports: io.transports\n , 'connect timeout': 10000\n , 'try multiple transports': true\n , 'reconnect': true\n , 'reconnection delay': 500\n , 'reconnection limit': Infinity\n , 'reopen delay': 3000\n , 'max reconnection attempts': 10\n , 'sync disconnect on unload': true\n , 'auto connect': true\n , 'flash policy port': 10843\n };\n\n io.util.merge(this.options, options);\n\n this.connected = false;\n this.open = false;\n this.connecting = false;\n this.reconnecting = false;\n this.namespaces = {};\n this.buffer = [];\n this.doBuffer = false;\n\n if (this.options['sync disconnect on unload'] &&\n (!this.isXDomain() || io.util.ua.hasCORS)) {\n var self = this;\n\n io.util.on(global, 'beforeunload', function () {\n self.disconnectSync();\n }, false);\n }\n\n if (this.options['auto connect']) {\n this.connect();\n }\n};\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(Socket, io.EventEmitter);\n\n /**\n * Returns a namespace listener/emitter for this socket\n *\n * @api public\n */\n\n Socket.prototype.of = function (name) {\n if (!this.namespaces[name]) {\n this.namespaces[name] = new io.SocketNamespace(this, name);\n\n if (name !== '') {\n this.namespaces[name].packet({ type: 'connect' });\n }\n }\n\n return this.namespaces[name];\n };\n\n /**\n * Emits the given event to the Socket and all namespaces\n *\n * @api private\n */\n\n Socket.prototype.publish = function () {\n this.emit.apply(this, arguments);\n\n var nsp;\n\n for (var i in this.namespaces) {\n if (this.namespaces.hasOwnProperty(i)) {\n nsp = this.of(i);\n nsp.$emit.apply(nsp, arguments);\n }\n }\n };\n\n /**\n * Performs the handshake\n *\n * @api private\n */\n\n function empty () { };\n\n Socket.prototype.handshake = function (fn) {\n var self = this\n , options = this.options;\n\n function complete (data) {\n if (data instanceof Error) {\n self.onError(data.message);\n } else {\n fn.apply(null, data.split(':'));\n }\n };\n\n var url = [\n 'http' + (options.secure ? 's' : '') + ':/'\n , options.host + ':' + options.port\n , options.resource\n , io.protocol\n , io.util.query(this.options.query, 't=' + +new Date)\n ].join('/');\n\n if (this.isXDomain() && !io.util.ua.hasCORS) {\n var insertAt = document.getElementsByTagName('script')[0]\n , script = document.createElement('script');\n\n script.src = url + '&jsonp=' + io.j.length;\n insertAt.parentNode.insertBefore(script, insertAt);\n\n io.j.push(function (data) {\n complete(data);\n script.parentNode.removeChild(script);\n });\n } else {\n var xhr = io.util.request();\n\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty;\n\n if (xhr.status == 200) {\n complete(xhr.responseText);\n } else {\n !self.reconnecting && self.onError(xhr.responseText);\n }\n }\n };\n xhr.send(null);\n }\n };\n\n /**\n * Find an available transport based on the options supplied in the constructor.\n *\n * @api private\n */\n\n Socket.prototype.getTransport = function (override) {\n var transports = override || this.transports, match;\n\n for (var i = 0, transport; transport = transports[i]; i++) {\n if (io.Transport[transport]\n && io.Transport[transport].check(this)\n && (!this.isXDomain() || io.Transport[transport].xdomainCheck())) {\n return new io.Transport[transport](this, this.sessionid);\n }\n }\n\n return null;\n };\n\n /**\n * Connects to the server.\n *\n * @param {Function} [fn] Callback.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.connect = function (fn) {\n if (this.connecting) {\n return this;\n }\n\n var self = this;\n\n this.handshake(function (sid, heartbeat, close, transports) {\n self.sessionid = sid;\n self.closeTimeout = close * 1000;\n self.heartbeatTimeout = heartbeat * 1000;\n self.transports = io.util.intersect(\n transports.split(',')\n , self.options.transports\n );\n\n function connect (transports){\n if (self.transport) self.transport.clearTimeouts();\n\n self.transport = self.getTransport(transports);\n if (!self.transport) return self.publish('connect_failed');\n\n // once the transport is ready\n self.transport.ready(self, function () {\n self.connecting = true;\n self.publish('connecting', self.transport.name);\n self.transport.open();\n\n if (self.options['connect timeout']) {\n self.connectTimeoutTimer = setTimeout(function () {\n if (!self.connected) {\n self.connecting = false;\n\n if (self.options['try multiple transports']) {\n if (!self.remainingTransports) {\n self.remainingTransports = self.transports.slice(0);\n }\n\n var remaining = self.remainingTransports;\n\n while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n self.transport.name) {}\n\n if (remaining.length){\n connect(remaining);\n } else {\n self.publish('connect_failed');\n }\n }\n }\n }, self.options['connect timeout']);\n }\n });\n }\n\n connect();\n\n self.once('connect', function (){\n clearTimeout(self.connectTimeoutTimer);\n\n fn && typeof fn == 'function' && fn();\n });\n });\n\n return this;\n };\n\n /**\n * Sends a message.\n *\n * @param {Object} data packet.\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.packet = function (data) {\n if (this.connected && !this.doBuffer) {\n this.transport.packet(data);\n } else {\n this.buffer.push(data);\n }\n\n return this;\n };\n\n /**\n * Sets buffer state\n *\n * @api private\n */\n\n Socket.prototype.setBuffer = function (v) {\n this.doBuffer = v;\n\n if (!v && this.connected && this.buffer.length) {\n this.transport.payload(this.buffer);\n this.buffer = [];\n }\n };\n\n /**\n * Disconnect the established connect.\n *\n * @returns {io.Socket}\n * @api public\n */\n\n Socket.prototype.disconnect = function () {\n if (this.connected) {\n if (this.open) {\n this.of('').packet({ type: 'disconnect' });\n }\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n }\n\n return this;\n };\n\n /**\n * Disconnects the socket with a sync XHR.\n *\n * @api private\n */\n\n Socket.prototype.disconnectSync = function () {\n // ensure disconnection\n var xhr = io.util.request()\n , uri = this.resource + '/' + io.protocol + '/' + this.sessionid;\n\n xhr.open('GET', uri, true);\n\n // handle disconnection immediately\n this.onDisconnect('booted');\n };\n\n /**\n * Check if we need to use cross domain enabled transports. Cross domain would\n * be a different port or different domain name.\n *\n * @returns {Boolean}\n * @api private\n */\n\n Socket.prototype.isXDomain = function () {\n\n var port = global.location.port ||\n ('https:' == global.location.protocol ? 443 : 80);\n\n return this.options.host !== global.location.hostname \n || this.options.port != port;\n };\n\n /**\n * Called upon handshake.\n *\n * @api private\n */\n\n Socket.prototype.onConnect = function () {\n if (!this.connected) {\n this.connected = true;\n this.connecting = false;\n if (!this.doBuffer) {\n // make sure to flush the buffer\n this.setBuffer(false);\n }\n this.emit('connect');\n }\n };\n\n /**\n * Called when the transport opens\n *\n * @api private\n */\n\n Socket.prototype.onOpen = function () {\n this.open = true;\n };\n\n /**\n * Called when the transport closes.\n *\n * @api private\n */\n\n Socket.prototype.onClose = function () {\n this.open = false;\n };\n\n /**\n * Called when the transport first opens a connection\n *\n * @param text\n */\n\n Socket.prototype.onPacket = function (packet) {\n this.of(packet.endpoint).onPacket(packet);\n };\n\n /**\n * Handles an error.\n *\n * @api private\n */\n\n Socket.prototype.onError = function (err) {\n if (err && err.advice) {\n if (err.advice === 'reconnect' && this.connected) {\n this.disconnect();\n this.reconnect();\n }\n }\n\n this.publish('error', err && err.reason ? err.reason : err);\n };\n\n /**\n * Called when the transport disconnects.\n *\n * @api private\n */\n\n Socket.prototype.onDisconnect = function (reason) {\n var wasConnected = this.connected;\n\n this.connected = false;\n this.connecting = false;\n this.open = false;\n\n if (wasConnected) {\n this.transport.close();\n this.transport.clearTimeouts();\n this.publish('disconnect', reason);\n\n if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n this.reconnect();\n }\n }\n };\n\n /**\n * Called upon reconnection.\n *\n * @api private\n */\n\n Socket.prototype.reconnect = function () {\n this.reconnecting = true;\n this.reconnectionAttempts = 0;\n this.reconnectionDelay = this.options['reconnection delay'];\n\n var self = this\n , maxAttempts = this.options['max reconnection attempts']\n , tryMultiple = this.options['try multiple transports']\n , limit = this.options['reconnection limit'];\n\n function reset () {\n if (self.connected) {\n for (var i in self.namespaces) {\n if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n self.namespaces[i].packet({ type: 'connect' });\n }\n }\n self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n }\n\n self.removeListener('connect_failed', maybeReconnect);\n self.removeListener('connect', maybeReconnect);\n\n self.reconnecting = false;\n\n delete self.reconnectionAttempts;\n delete self.reconnectionDelay;\n delete self.reconnectionTimer;\n delete self.redoTransports;\n\n self.options['try multiple transports'] = tryMultiple;\n };\n\n function maybeReconnect () {\n if (!self.reconnecting) {\n return;\n }\n\n if (self.connected) {\n return reset();\n };\n\n if (self.connecting && self.reconnecting) {\n return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n }\n\n if (self.reconnectionAttempts++ >= maxAttempts) {\n if (!self.redoTransports) {\n self.on('connect_failed', maybeReconnect);\n self.options['try multiple transports'] = true;\n self.transport = self.getTransport();\n self.redoTransports = true;\n self.connect();\n } else {\n self.publish('reconnect_failed');\n reset();\n }\n } else {\n if (self.reconnectionDelay < limit) {\n self.reconnectionDelay *= 2; // exponential back off\n }\n\n self.connect();\n self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n }\n };\n\n this.options['try multiple transports'] = false;\n this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n this.on('connect', maybeReconnect);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io) {\n\n /**\n * Expose constructor.\n */\n\n exports.SocketNamespace = SocketNamespace;\n\n /**\n * Socket namespace constructor.\n *\n * @constructor\n * @api public\n */\n\n function SocketNamespace (socket, name) {\n this.socket = socket;\n this.name = name || '';\n this.flags = {};\n this.json = new Flag(this, 'json');\n this.ackPackets = 0;\n this.acks = {};\n };\n\n /**\n * Apply EventEmitter mixin.\n */\n\n io.util.mixin(SocketNamespace, io.EventEmitter);\n\n /**\n * Copies emit since we override it\n *\n * @api private\n */\n\n SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n /**\n * Creates a new namespace, by proxying the request to the socket. This\n * allows us to use the synax as we do on the server.\n *\n * @api public\n */\n\n SocketNamespace.prototype.of = function () {\n return this.socket.of.apply(this.socket, arguments);\n };\n\n /**\n * Sends a packet.\n *\n * @api private\n */\n\n SocketNamespace.prototype.packet = function (packet) {\n packet.endpoint = this.name;\n this.socket.packet(packet);\n this.flags = {};\n return this;\n };\n\n /**\n * Sends a message\n *\n * @api public\n */\n\n SocketNamespace.prototype.send = function (data, fn) {\n var packet = {\n type: this.flags.json ? 'json' : 'message'\n , data: data\n };\n\n if ('function' == typeof fn) {\n packet.id = ++this.ackPackets;\n packet.ack = true;\n this.acks[packet.id] = fn;\n }\n\n return this.packet(packet);\n };\n\n /**\n * Emits an event\n *\n * @api public\n */\n \n SocketNamespace.prototype.emit = function (name) {\n var args = Array.prototype.slice.call(arguments, 1)\n , lastArg = args[args.length - 1]\n , packet = {\n type: 'event'\n , name: name\n };\n\n if ('function' == typeof lastArg) {\n packet.id = ++this.ackPackets;\n packet.ack = 'data';\n this.acks[packet.id] = lastArg;\n args = args.slice(0, args.length - 1);\n }\n\n packet.args = args;\n\n return this.packet(packet);\n };\n\n /**\n * Disconnects the namespace\n *\n * @api private\n */\n\n SocketNamespace.prototype.disconnect = function () {\n if (this.name === '') {\n this.socket.disconnect();\n } else {\n this.packet({ type: 'disconnect' });\n this.$emit('disconnect');\n }\n\n return this;\n };\n\n /**\n * Handles a packet\n *\n * @api private\n */\n\n SocketNamespace.prototype.onPacket = function (packet) {\n var self = this;\n\n function ack () {\n self.packet({\n type: 'ack'\n , args: io.util.toArray(arguments)\n , ackId: packet.id\n });\n };\n\n switch (packet.type) {\n case 'connect':\n this.$emit('connect');\n break;\n\n case 'disconnect':\n if (this.name === '') {\n this.socket.onDisconnect(packet.reason || 'booted');\n } else {\n this.$emit('disconnect', packet.reason);\n }\n break;\n\n case 'message':\n case 'json':\n var params = ['message', packet.data];\n\n if (packet.ack == 'data') {\n params.push(ack);\n } else if (packet.ack) {\n this.packet({ type: 'ack', ackId: packet.id });\n }\n\n this.$emit.apply(this, params);\n break;\n\n case 'event':\n var params = [packet.name].concat(packet.args);\n\n if (packet.ack == 'data')\n params.push(ack);\n\n this.$emit.apply(this, params);\n break;\n\n case 'ack':\n if (this.acks[packet.ackId]) {\n this.acks[packet.ackId].apply(this, packet.args);\n delete this.acks[packet.ackId];\n }\n break;\n\n case 'error':\n if (packet.advice){\n this.socket.onError(packet);\n } else {\n if (packet.reason == 'unauthorized') {\n this.$emit('connect_failed', packet.reason);\n } else {\n this.$emit('error', packet.reason);\n }\n }\n break;\n }\n };\n\n /**\n * Flag interface.\n *\n * @api private\n */\n\n function Flag (nsp, name) {\n this.namespace = nsp;\n this.name = name;\n };\n\n /**\n * Send a message\n *\n * @api public\n */\n\n Flag.prototype.send = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.send.apply(this.namespace, arguments);\n };\n\n /**\n * Emit an event\n *\n * @api public\n */\n\n Flag.prototype.emit = function () {\n this.namespace.flags[this.name] = true;\n this.namespace.emit.apply(this.namespace, arguments);\n };\n\n})(\n 'undefined' != typeof io ? io : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n *\n * @api public\n */\n \n exports.XHR = XHR;\n\n /**\n * XHR constructor\n *\n * @costructor\n * @api public\n */\n\n function XHR (socket) {\n if (!socket) return;\n\n io.Transport.apply(this, arguments);\n this.sendBuffer = [];\n };\n\n /**\n * Inherits from Transport.\n */\n\n io.util.inherit(XHR, io.Transport);\n\n /**\n * Establish a connection\n *\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.open = function () {\n this.socket.setBuffer(false);\n this.onOpen();\n this.get();\n\n // we need to make sure the request succeeds since we have no indication\n // whether the request opened or not until it succeeded.\n this.setCloseTimeout();\n\n return this;\n };\n\n /**\n * Check if we need to send data to the Socket.IO server, if we have data in our\n * buffer we encode it and forward it to the `post` method.\n *\n * @api private\n */\n\n XHR.prototype.payload = function (payload) {\n var msgs = [];\n\n for (var i = 0, l = payload.length; i < l; i++) {\n msgs.push(io.parser.encodePacket(payload[i]));\n }\n\n this.send(io.parser.encodePayload(msgs));\n };\n\n /**\n * Send data to the Socket.IO server.\n *\n * @param data The message\n * @returns {Transport}\n * @api public\n */\n\n XHR.prototype.send = function (data) {\n this.post(data);\n return this;\n };\n\n /**\n * Posts a encoded message to the Socket.IO server.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n function empty () { };\n\n XHR.prototype.post = function (data) {\n var self = this;\n this.socket.setBuffer(true);\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n self.posting = false;\n\n if (this.status == 200){\n self.socket.setBuffer(false);\n } else {\n self.onClose();\n }\n }\n }\n\n function onload () {\n this.onload = empty;\n self.socket.setBuffer(false);\n };\n\n this.sendXHR = this.request('POST');\n\n if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n this.sendXHR.onload = this.sendXHR.onerror = onload;\n } else {\n this.sendXHR.onreadystatechange = stateChange;\n }\n\n this.sendXHR.send(data);\n };\n\n /**\n * Disconnects the established `XHR` connection.\n *\n * @returns {Transport} \n * @api public\n */\n\n XHR.prototype.close = function () {\n this.onClose();\n return this;\n };\n\n /**\n * Generates a configured XHR request\n *\n * @param {String} url The url that needs to be requested.\n * @param {String} method The method the request should use.\n * @returns {XMLHttpRequest}\n * @api private\n */\n\n XHR.prototype.request = function (method) {\n var req = io.util.request(this.socket.isXDomain())\n , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n req.open(method || 'GET', this.prepareUrl() + query, true);\n\n if (method == 'POST') {\n try {\n if (req.setRequestHeader) {\n req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n } else {\n // XDomainRequest\n req.contentType = 'text/plain';\n }\n } catch (e) {}\n }\n\n return req;\n };\n\n /**\n * Returns the scheme to use for the transport URLs.\n *\n * @api private\n */\n\n XHR.prototype.scheme = function () {\n return this.socket.options.secure ? 'https' : 'http';\n };\n\n /**\n * Check if the XHR transports are supported\n *\n * @param {Boolean} xdomain Check if we support cross domain requests.\n * @returns {Boolean}\n * @api public\n */\n\n XHR.check = function (socket, xdomain) {\n try {\n if (io.util.request(xdomain)) {\n return true;\n }\n } catch(e) {}\n\n return false;\n };\n\n /**\n * Check if the XHR transport supports corss domain requests.\n * \n * @returns {Boolean}\n * @api public\n */\n\n XHR.xdomainCheck = function () {\n return XHR.check(null, true);\n };\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n /**\n * Expose constructor.\n */\n\n exports['xhr-polling'] = XHRPolling;\n\n /**\n * The XHR-polling transport uses long polling XHR requests to create a\n * \"persistent\" connection with the server.\n *\n * @constructor\n * @api public\n */\n\n function XHRPolling () {\n io.Transport.XHR.apply(this, arguments);\n };\n\n /**\n * Inherits from XHR transport.\n */\n\n io.util.inherit(XHRPolling, io.Transport.XHR);\n\n /**\n * Merge the properties from XHR transport\n */\n\n io.util.merge(XHRPolling, io.Transport.XHR);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n XHRPolling.prototype.name = 'xhr-polling';\n\n /** \n * Establish a connection, for iPhone and Android this will be done once the page\n * is loaded.\n *\n * @returns {Transport} Chaining.\n * @api public\n */\n\n XHRPolling.prototype.open = function () {\n var self = this;\n\n io.Transport.XHR.prototype.open.call(self);\n return false;\n };\n\n /**\n * Starts a XHR request to wait for incoming messages.\n *\n * @api private\n */\n\n function empty () {};\n\n XHRPolling.prototype.get = function () {\n if (!this.open) return;\n\n var self = this;\n\n function stateChange () {\n if (this.readyState == 4) {\n this.onreadystatechange = empty;\n\n if (this.status == 200) {\n self.onData(this.responseText);\n self.get();\n } else {\n self.onClose();\n }\n }\n };\n\n function onload () {\n this.onload = empty;\n self.onData(this.responseText);\n self.get();\n };\n\n this.xhr = this.request();\n\n if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n this.xhr.onload = this.xhr.onerror = onload;\n } else {\n this.xhr.onreadystatechange = stateChange;\n }\n\n this.xhr.send(null);\n };\n\n /**\n * Handle the unclean close behavior.\n *\n * @api private\n */\n\n XHRPolling.prototype.onClose = function () {\n io.Transport.XHR.prototype.onClose.call(this);\n\n if (this.xhr) {\n this.xhr.onreadystatechange = this.xhr.onload = empty;\n try {\n this.xhr.abort();\n } catch(e){}\n this.xhr = null;\n }\n };\n\n /**\n * Webkit based browsers show a infinit spinner when you start a XHR request\n * before the browsers onload event is called so we need to defer opening of\n * the transport until the onload event is called. Wrapping the cb in our\n * defer method solve this.\n *\n * @param {Socket} socket The socket instance that needs a transport\n * @param {Function} fn The callback\n * @api private\n */\n\n XHRPolling.prototype.ready = function (socket, fn) {\n var self = this;\n\n io.util.defer(function () {\n fn.call(self);\n });\n };\n\n /**\n * Add the transport to your public io.transports array.\n *\n * @api private\n */\n\n io.transports.push('xhr-polling');\n\n})(\n 'undefined' != typeof io ? io.Transport : module.exports\n , 'undefined' != typeof io ? io : module.parent.exports\n , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost \n * MIT Licensed\n */\n\n(function (exports, io, global) {\n /**\n * There is a way to hide the loading indicator in Firefox. If you create and\n * remove a iframe it will stop showing the current loading indicator.\n * Unfortunately we can't feature detect that and UA sniffing is evil.\n *\n * @api private\n */\n\n var indicator = global.document && \"MozAppearance\" in\n global.document.documentElement.style;\n\n /**\n * Expose constructor.\n */\n\n exports['jsonp-polling'] = JSONPPolling;\n\n /**\n * The JSONP transport creates an persistent connection by dynamically\n * inserting a script tag in the page. This script tag will receive the\n * information of the Socket.IO server. When new information is received\n * it creates a new script tag for the new data stream.\n *\n * @constructor\n * @extends {io.Transport.xhr-polling}\n * @api public\n */\n\n function JSONPPolling (socket) {\n io.Transport['xhr-polling'].apply(this, arguments);\n\n this.index = io.j.length;\n\n var self = this;\n\n io.j.push(function (msg) {\n self._(msg);\n });\n };\n\n /**\n * Inherits from XHR polling transport.\n */\n\n io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n /**\n * Transport name\n *\n * @api public\n */\n\n JSONPPolling.prototype.name = 'jsonp-polling';\n\n /**\n * Posts a encoded message to the Socket.IO server using an iframe.\n * The iframe is used because script tags can create POST based requests.\n * The iframe is positioned outside of the view so the user does not\n * notice it's existence.\n *\n * @param {String} data A encoded message.\n * @api private\n */\n\n JSONPPolling.prototype.post = function (data) {\n var self = this\n , query = io.util.query(\n this.socket.options.query\n , 't='+ (+new Date) + '&i=' + this.index\n );\n\n if (!this.form) {\n var form = document.createElement('form')\n , area = document.createElement('textarea')\n , id = this.iframeId = 'socketio_iframe_' + this.index\n , iframe;\n\n form.className = 'socketio';\n form.style.position = 'absolute';\n form.style.top = '-1000px';\n form.style.left = '-1000px';\n form.target = id;\n form.method = 'POST';\n form.setAttribute('accept-charset', 'utf-8');\n area.name = 'd';\n form.appendChild(area);\n document.body.appendChild(form);\n\n this.form = form;\n this.area = area;\n }\n\n this.form.action = this.prepareUrl() + query;\n\n function complete () {\n initIframe();\n self.socket.setBuffer(false);\n };\n\n function initIframe () {\n if (self.iframe) {\n self.form.removeChild(self.iframe);\n }\n\n try {\n // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n iframe = document.createElement('