"""
Copyright (c) Jupyter Development Team.
Distributed under the terms of the Modified BSD License.
"""
import re
import subprocess
import sys
import threading

import tornado.web

from zmq.eventloop import ioloop
ioloop.install()

PORT = 8765


class MainPageHandler(tornado.web.RequestHandler):

    def initialize(self, base_url, ws_url):
        self.base_url = base_url
        self.ws_url = ws_url

    def get(self):
        return self.render("index.html", static=self.static_url,
                           base_url=self.base_url, ws_url=self.ws_url)


def main(argv):

    url = "http://localhost:%s" % PORT

    nb_command = [sys.executable, '-m', 'notebook', '--no-browser', '--debug',
                  '--NotebookApp.allow_origin="%s"' % url]
    nb_server = subprocess.Popen(nb_command, stderr=subprocess.STDOUT,
                                 stdout=subprocess.PIPE)

    # wait for notebook server to start up
    while 1:
        line = nb_server.stdout.readline().decode('utf-8').strip()
        if not line:
            continue
        print(line)
        if 'Jupyter Notebook is running at:' in line:
            base_url = re.search('(http.*?)$', line).groups()[0]
            ws_url = base_url.replace('http', 'ws')
            break

    while 1:
        line = nb_server.stdout.readline().decode('utf-8').strip()
        if not line:
            continue
        print(line)
        if 'Control-C' in line:
            break

    def print_thread():
        while 1:
            line = nb_server.stdout.readline().decode('utf-8').strip()
            if not line:
                continue
            print(line)

    thread = threading.Thread(target=print_thread)
    thread.setDaemon(True)
    thread.start()

    handlers = [
        (r"/", MainPageHandler, {'base_url': base_url, 'ws_url': ws_url }),
        (r'/(.*)', tornado.web.StaticFileHandler, {'path': '.'}),
    ]

    app = tornado.web.Application(handlers, static_path='build',
                                  template_path='.',
                                  compiled_template_cache=False)

    app.listen(PORT, 'localhost')
    loop = tornado.ioloop.IOLoop.instance()
    print('Browse to http://localhost:%s' % PORT)
    
    if sys.platform.startswith('win'):
            # add no-op to wake every 5s
            # to handle signals that may be ignored by the inner loop
            pc = ioloop.PeriodicCallback(lambda : None, 5000)
            pc.start()
    
    try:
        loop.start()
    except KeyboardInterrupt:
        print(" Shutting down on SIGINT")
    finally:
        nb_server.kill()
        loop.close()

if __name__ == '__main__':
    main(sys.argv)

@@ -175,16 +175,113 @@
 do.web%0A%0A
+# Install the pyzmq ioloop. This has to be done before anything else from%0A# tornado is imported.%0A
 from zmq
@@ -1918,17 +1918,16 @@
 : ws_url
- 
 %7D),%0A    
@@ -2217,106 +2217,8 @@
 t')%0A
-    loop = tornado.ioloop.IOLoop.instance()%0A    print('Browse to http://localhost:%25s' %25 PORT)%0A    
 %0A   
@@ -2261,20 +2261,16 @@
         
-    
 # add no
@@ -2298,20 +2298,16 @@
         
-   
- 
 # to han
@@ -2364,20 +2364,16 @@
         
-    
 pc = iol
@@ -2399,17 +2399,16 @@
 k(lambda
- 
 : None, 
@@ -2421,20 +2421,16 @@
         
-    
 pc.start
@@ -2432,20 +2432,101 @@
 start()%0A
+%0A
     
+loop = ioloop.IOLoop.current()%0A    print('Browse to http://localhost:%25s' %25 PORT)
 %0A    try

Clean up the example server