[
  {
    "path": ".gitattributes",
    "content": "notebooks/* linguist-vendored\n\n*.pb filter=lfs diff=lfs merge=lfs -text\n**/*.pb filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": ".gitignore",
    "content": "**/images/hidden/*\n\n# Note: Any leading '**' need to be followed by a '/'. \n# Seems like '**/thing_to_ignore_always[/*]' covers all bases.\n**/.*.swp\n**/.log\n**/tmp*\n**/.idea/*\n**/.ipynb_checkpoints/*\n**/__pycache__/*\n**/*.pyc\n**/*.h5/*\n**/out/**\n.cache/**\n**/.cache/**\n**/pretrained/**\n**/notebooks/*.txt\n.DS*\n**/.DS*\n\n# Muh training scripts.\novernight.sh\nexperimental.sh\ntests/macros/**\ncompact.sh\n\n# Ignore collection of useful tf files that once \n# existed in tf repo but have since been removed. \n# They will be missed. \n**/reference/*\n**/saved_train_data/**\n/webpage/data_dev.db\n/notebooks/reference/\n/notebooks/.ipynb_checkpoints/\n\n# TEMP:\n**/frozen_models/*\n**/ubuntu/*\n**/data_dev.db\n**/data_test.db\n/webpage/deepchat/static/assets/frozen_models/\n/configs/test_lstm.yml\n/configs/cornell.yml\n/ae.py\n**/individual_tb_plots/*\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: python\ndist: trusty\nsudo: True\npython:\n    - \"3.5\"\n    - \"pypy3\"\nbefore_install:\n    - sudo apt-get update\n    - sudo apt-get install python-matplotlib python3-matplotlib python-tk python3-tk libtcmalloc-minimal4\ninstall:\n    # code below is taken from http://conda.pydata.org/docs/travis.html\n    # We do this conditionally because it saves us some downloading if the\n    # version is the same.\n    - if [[ \"$TRAVIS_PYTHON_VERSION\" == \"2.7\" ]]; then\n          wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;\n      else\n          wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;\n      fi\n    - bash miniconda.sh -b -p $HOME/miniconda\n    - export PATH=\"$HOME/miniconda/bin:$PATH\"\n    - hash -r\n    - conda config --set always_yes yes --set changeps1 no\n    - conda update -q conda\n      # Useful for debugging any issues with conda\n    - conda info -a\n\n    - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy matplotlib pandas pytest h5py\n    - source activate test-environment\n      # - pip3 install six numpy wheel\n      # - pip3 install -U virtualenv\n    - pip install -r requirements.txt\n      # - pip install -U tensorflow\n    - conda install Pillow\n    - pip install tensorflow\nscript: \n    - pytest\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2017 Brandon McKinzie\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Conversation Models in Tensorflow\n\nNotes to visitors:\n* I've just shut down the website indefinitely. I ran out of my credits on Google Cloud four days ago, and have since been billed 30+ dollars which isn't something I can sustain. To run locally, assuming you satisfy all requirements in webpage/requirements.txt, just run `python3 manage.py runserver`. If you're unfamiliar with running flask this way, see the docs for [Flask-Script](https://flask-script.readthedocs.io/en/latest/). Sorry for any inconvenience!\n* Please post any feedbacks/bugs as an issue and I will respond within 24 hours.\n* I haven't gotten around to providing scripts for downloading the datasets. Until then, I've uploaded most of the data [here on my MEGA account](https://mega.nz/#F!xrRTwSzY!by9K42n_I_oi5T_DKP-xTA). It is organized the same way I have it locally.\n* Don't let the simple web bots fool you -- this project supports more advanced techniques than the single-layer encoder-decoder models on the website. To see the parameters that are immediately available/supported for tweaking, checkout chatbot/globals.py, which contains the default configuration dictionary. Any value that you don't specify will assume the default value from that file, which tend toward safe conversative simple values.\n* Contributions are more than welcome. I do my best to follow PEP8 and I'd prefer contributions do the same.\n* Please note that the bulk of this project was written with tensorflow version 1.0 (before tf.contrib.seq2seq existed) and 1.1, but updates have been made since version 1.2 that appeared to break the project. I have not been able to do tests regarding how version 1.4 is faring with the project, but I intend to do so soon.\n\n## Table of Contents\n* [Project Overview](#brief-overview-of-completed-work)\n  * [Datasets](#datasets)\n  * [Models](#models)\n  * [Website](#website)\n* [Model Components](#model-components)\n  * [Input Pipeline](#the-input-pipeline)\n* [Reference Material](#reference-material)\n\n## Project Overview\n\nAs of May 9, 2017, the main packages of the project are as follows:\n* __chatbot__: The conversation model classes, the structural components of the models (encoders, decoders, cells, etc.), and various operations for easy saving/loading/evaluation.\n* __data__: The core Dataset class that handles all data formatting, file paths, and utilities for interacting with the data, as well as some preprocessing scripts and helper classes for cleaning data. The data itself (for space reasons) is not included in the repository. See the link to my MEGA account to download the data in the same format as on my local machine.\n* __notebooks__: Jupyter notebooks showcasing data visualization examples, data preprocessing techniques, and conversation model exploration.\n* __webpage__: Flask web application hosted on Google App Engine, where you can talk with a handful of chatbots and interact with plots. You can run it locally, after installing its requirements (mostly Flask packages), by running the following command within the webpage directory: `python3 manage.py runserver`\n\nFrom a user/developer standpoint, this project offers a cleaner interface for tinkering with sequence-to-sequence models. The ideal result is a chatbot API with the readability of [Keras](https://keras.io/), but with a degree of flexibility closer to [TensorFlow](https://www.tensorflow.org/). \n\nOn the 'client' side, playing with model parameters and running them is as easy as making a configuration (yaml) file, opening a python interpreter, and issuing a handful of commands. The following snippet, for example, is all that is needed to start training on the cornell dataset (after downloading it of course) with your configuration:\n    \n  ```python\n    import data\n    import chatbot\n    from utils import io_utils\n    # Load config dictionary with the flexible parse_config() function, \n    # which can handle various inputs for building your config dictionary.\n    config = io_utils.parse_config(config_path='path_to/my_config.yml')\n    dataset = getattr(data, config['dataset'])(config['dataset_params'])\n    bot = getattr(chatbot, config['model'])(dataset, config)\n    bot.train()\n  ```\n  \nThis is just one way to interface with the project. For example, the user can also pass in parameters via command-line args, which will be merged with any config files they specify as well (precedence given to command-line args if conflict). You can also pass in the location of a previously saved chatbot to resume training it or start a conversation. See `main.py` for more details.\n\n### Datasets\n\n* [Ubuntu Dialogue Corpus](https://arxiv.org/pdf/1506.08909.pdf): pre-processing approach can be seen in the ubuntu\\_reformat.ipynb in the notebooks folder. The intended use for the dataset is response ranking for multi-turn dialogues, but I've taken the rather simple approach of extracting utterance-pairs and interpreting them as single-sentence to single-response, which correspond with inputs for the encoder and decoder, respectively, in the models.\n\n* [Cornell Movie-Dialogs](https://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html): I began with [this preprocessed](https://github.com/suriyadeepan/datasets/tree/master/seq2seq/cornell_movie_corpus) version of the Cornell corpus, and made minor modifications to reduce noise.\n\n* [Reddit comments](https://www.reddit.com/r/datasets/comments/3bxlg7/i_have_every_publicly_available_reddit_comment/): Approx. 1.7 billion reddit comments. Currently working on preprocessing and reducing this massive dataset to suitable format for training conversation models. Will post processed dataset download links when complete!\n\n### Models\n\n* DynamicBot: uses a more object-oriented approach offered by custom classes in model_components.py. The result is faster online batch-concatenated embedding and a more natural approach to chatting. It makes use of the (fantastic) new python API in the TensorFlow 1.0 release, notably the dynamic_rnn. It also adheres to good variable scoping practice and common tensorflow conventions I've observed in the documentation and source code, which has nice side effects such as clean graph visualizations in TensorBoard.\n\n* SimpleBot: Simplified bucketed model based on the more complicated 'ChatBot' model below. Although it is less flexible in customizing bucket partitions and uses a sparse softmax over the full vocabulary instead of sampling, it is far more transparent in its implementation. It makes minimal use of tf.contrib, as opposed to ChatBot, and more or less is implemented from \"scratch,\" in the sense of primarily relying on the basic tensorflow methods. If you're new to TensorFlow, it may be useful to read through its implementation to get a feel for common conventions in tensorflow programming, as it was the result of me reading the source code of all methods in ChatBot and writing my own more compact interpretation.\n\n* ChatBot: Extended version of the model described in [this TensorFlow tutorial](https://www.tensorflow.org/tutorials/seq2seq). Architecture characteristics: bucketed inputs, decoder uses an attention mechanism (see page 69 of my [notes](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf), and inputs are embedded with the simple functions provided in the tf.contrib library. Also employs a sampled softmax loss function to allow for larger vocabulary sizes (page 67 of [notes](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf)). Additional comments: due to the nature of bucketed models, it takes much longer to create the model compared to others. The main bottleneck appears to be the size of the largest bucket and how the gradient ops are created based on the bucket sizes.\n\n### Website\n\nThe webpage directory showcases a simple and space-efficient way for deploying your TensorFlow models in a Flask application. The models are 'frozen' -- all components not needed for chatting (e.g. optimizers) are removed and all remaining variables are converted to constants. When the user clicks on a model name, a REST API for that model is created. When the user enters a sentence into the form, an (AJAX) POST request is issued, where the response is the chatbot's response sentence. For more details on the REST API, see [views.py](https://github.com/mckinziebrandon/DeepChatModels/blob/master/webpage/deepchat/main/views.py).\n\nThe Flask application follows best practices, such as using blueprints for instantiating applications, different databases depending on the application environment (e.g. development or production), and more. \n\n## Model Components\n\nHere I'll go into more detail on how the models are constructed and how they can be visualized. This section is a work in progress and not yet complete.\n\n### The Input Pipeline\n\nInstead of using the ```feed_dict``` argument to input data batches to the model, it is *substantially* faster encode the input information and preprocessing techniques in the graph structure itself. This means we don't feed the model anything at training time. Rather the model uses a sequence of queues to access the data from files in google's protobuf format, decode the files into tensor sequences, dynamically batch and pad the sequences, and then feed these batches to the embedding decoder. All within the graph structure. Furthermore, this data processing is coordinated by multiple threads in parallel. We can use tensorboard (and best practices for variable scoping) to visualize this type of pipeline at a high level.  \n\n<img alt=\"input_pipeline\" src=\"http://i.imgur.com/xrLqths.png\" width=\"400\" align=\"left\">\n<img alt=\"input_pipeline_expanded\" src=\"http://i.imgur.com/xMWB7oL.png\" width=\"400\">\n<br/>\n<br/>\n\n_(More descriptions coming soon!)_\n\n## Reference Material\n\nA lot of research has gone into these models, and I've been documenting my notes on the most \"important\" papers here in the last section of [my deep learning notes here](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf). The notes also include how I've tried translating the material from the papers into TensorFlow code. I'll be updating that as the ideas from more papers make their way into this project.\n\n* Papers:\n    * [Sequence to Sequence Learning with Neural Networks. Sutskever et al., 2014.](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)\n    * [On Using Very Large Target Vocabulary for Neural Machine Translation. Jean et al., 2014.](https://arxiv.org/pdf/1412.2007.pdf)\n    * [Neural Machine Translation by Jointly Learning to Align and Translate. Bahdanau et al., 2016](https://arxiv.org/pdf/1409.0473.pdf)\n    * [Effective Approaches to Attention-based Neural Machine Translation. Luong et al., 2015](https://arxiv.org/pdf/1508.04025.pdf)\n\n* Online Resources:\n    * [Metaflow blog](https://blog.metaflow.fr/): Incredibly helpful tensorflow (r1.0) tutorials.\n    * [Flask Mega-Tutorial](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world): For the webpage parts of the project.\n    * [Code for \"Massive Exploration of Neural Machine Translation Architectures\"](https://github.com/google/seq2seq): Main inspiration for switching to yaml configs and pydoc.locate. Paper is great as well.\n    * [Tensorflow r1.0 API](https://www.tensorflow.org/api_docs/): (Of course). The new python API guides are great. \n"
  },
  {
    "path": "chatbot/__init__.py",
    "content": "from chatbot import globals\nfrom chatbot.components.base._rnn import  *\nfrom chatbot.components.bot_ops import dynamic_sampled_softmax_loss\nfrom chatbot.components.decoders import *\nfrom chatbot.components.embedder import *\nfrom chatbot.components.encoders import *\nfrom chatbot.dynamic_models import DynamicBot\nfrom chatbot.legacy.legacy_models import ChatBot, SimpleBot\n\n__all__ = ['Chatbot, SimpleBot', 'DynamicBot']\n"
  },
  {
    "path": "chatbot/_models.py",
    "content": "\"\"\"Abstract classes.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport copy\nimport yaml\nimport random\nimport subprocess\n\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.contrib.tensorboard.plugins import projector\nfrom tensorflow.python.client import device_lib\nfrom utils import io_utils\nfrom chatbot.components import *\nfrom chatbot.globals import DEFAULT_FULL_CONFIG, OPTIMIZERS\n\n\ndef gpu_found():\n    \"\"\"Returns True if tensorflow finds at least 1 GPU.\"\"\"\n    devices = device_lib.list_local_devices()\n    return len([x.name for x in devices if x.device_type == 'GPU']) > 0\n\n\nclass Model(object):\n    \"\"\"Superclass of all subsequent model classes.\n    \"\"\"\n\n    def __init__(self, logger, dataset, params):\n        \"\"\"\n        Args:\n            logger: returned by getLogger & called by subclasses. Passed\n                    here so we know what object to use for info/warn/error.\n            dataset: object that inherits from data.Dataset.\n            params: (dict) user-specified params that override those in\n                           DEFAULT_FULL_CONFIG above.\n        \"\"\"\n\n        self.log = logger\n        self.__dict__['__params'] = Model.fill_params(dataset, params)\n\n        # Make particularly useful ckpt directories for website configurations.\n        if 'website_config' in self.ckpt_dir:\n            self.ckpt_dir = Model._build_hparam_path(\n                ckpt_dir=self.ckpt_dir,\n                num_layers=self.num_layers,\n                max_seq_len=self.max_seq_len)\n            self.log.info(\"New ckpt dir:\", self.ckpt_dir)\n\n        # Configure gpu options if we are using one.\n        if gpu_found():\n            self.log.info(\"GPU Found. Setting allow_growth to True.\")\n            gpu_config = tf.ConfigProto()\n            gpu_config.gpu_options.allow_growth = True\n            self.sess = tf.Session(config=gpu_config)\n        else:\n            self.log.warning(\"GPU not found. Not recommended for training.\")\n            self.sess = tf.Session()\n\n        with self.graph.name_scope(tf.GraphKeys.SUMMARIES):\n            self.global_step = tf.Variable(initial_value=0, trainable=False)\n            self.learning_rate = tf.constant(self.learning_rate)\n\n        # Create ckpt_dir if user hasn't already (if exists, has no effect).\n        subprocess.call(['mkdir', '-p', self.ckpt_dir])\n        self.projector_config = projector.ProjectorConfig()\n        # Good practice to set as None in constructor.\n        self.loss = None\n        self.file_writer = None\n        self.merged = None\n        self.train_op = None\n        self.saver = None\n\n    def compile(self):\n        \"\"\" Configure training process and initialize model. Inspired by Keras.\n\n        Either restore model parameters or create fresh ones.\n            - Checks if we can both (1) find a checkpoint state, and (2) a\n            valid V1/V2 checkpoint path.\n            - If we can't, then just re-initialize model with fresh params.\n        \"\"\"\n\n        self.log.info(\"Checking for checkpoints . . .\")\n        checkpoint_state  = tf.train.get_checkpoint_state(self.ckpt_dir)\n\n        if not self.reset_model and checkpoint_state \\\n                and tf.train.checkpoint_exists(checkpoint_state.model_checkpoint_path):\n            print(\"Reading model parameters from\",\n                  checkpoint_state.model_checkpoint_path)\n            self.file_writer = tf.summary.FileWriter(self.ckpt_dir)\n            self.saver = tf.train.Saver(tf.global_variables())\n            self.saver.restore(self.sess, checkpoint_state.model_checkpoint_path)\n        else:\n            print(\"Created model with fresh parameters:\\n\\t\", self.ckpt_dir)\n            # Recursively delete all files in output but keep directories.\n            subprocess.call([\n                'find', self.ckpt_dir, '-type', 'f', '-exec', 'rm', '{}', ';'\n            ])\n            self.file_writer = tf.summary.FileWriter(self.ckpt_dir)\n            # Add operation for calling all variable initializers.\n            init_op = tf.global_variables_initializer()\n            # Construct saver (adds save/restore ops to all).\n            self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=3)\n            # Add the fully-constructed graph to the event file.\n            self.file_writer.add_graph(self.sess.graph)\n            # Initialize all model variables.\n            self.sess.run(init_op)\n            # Store model config in ckpt dir for easy loading later.\n            with open(os.path.join(self.ckpt_dir, 'config.yml'), 'w') as f:\n                yaml.dump(getattr(self, \"params\"), f, default_flow_style=False)\n\n    def save(self, summaries=None):\n        \"\"\"\n        Args:\n            summaries: merged summary instance returned by session.run.\n        \"\"\"\n\n        if self.saver is None:\n            raise ValueError(\"Tried saving model before defining a saver.\")\n\n        ckpt_fname = os.path.join(self.ckpt_dir, \"{}.ckpt\".format(self.data_name))\n        # Saves the state of all global variables in a ckpt file.\n        self.saver.save(self.sess, ckpt_fname, global_step=self.global_step)\n\n        if summaries is not None:\n            self.file_writer.add_summary(summaries, self.global_step.eval(self.sess))\n        else:\n            self.log.info(\"Save called without summaries.\")\n\n    def close(self, save_current=True):\n        \"\"\"Call then when training session is terminated.\n            - Saves the current model/checkpoint state.\n            - Freezes the model into a protobuf file in self.ckpt_dir.\n            - Closes context managers for file_writing and session.\n        \"\"\"\n        # First save the checkpoint as usual.\n        if save_current:\n            self.save()\n        # Freeze me, for I am infinite.\n        self.freeze()\n        # Be a responsible bot and close my file writer.\n        self.file_writer.close()\n        # Formally exit the session, farewell to all.\n        self.sess.close()\n\n    @property\n    def graph(self):\n        return self.sess.graph\n\n    @staticmethod\n    def fill_params(dataset, params):\n        \"\"\"For now, essentially just returns (already parsed) params, \n        but placed here in case I want to customize later (likely).\n        \"\"\"\n        # Replace (string) specification of dataset with the actual instance.\n        params['dataset'] = dataset\n        params['dataset_params']['data_name'] = dataset.name\n        if params['model_params']['ckpt_dir'] == 'out':\n            params['model_params']['ckpt_dir'] += '/'+dataset.name\n        # Define alias in case older models still use it.\n        params['model_params']['is_chatting'] = params['model_params']['decode']\n        return params\n\n    def freeze(self):\n        \"\"\"Useful for e.g. deploying model on website.\n\n        Args: directory containing model ckpt files we'd like to freeze.\n        \"\"\"\n\n        if not tf.get_collection('freezer'):\n            self.log.warning('No freezer found. Not saving a frozen model.')\n            return\n\n        # Note: output_node_names is only used to tell tensorflow what is can\n        # throw away in the frozen graph (e.g. training ops).\n        output_node_names = \",\".join(\n            [t.name.rstrip(':0') for t in tf.get_collection('freezer')])\n        self.log.info('Output node names: %r', output_node_names)\n\n        # Save a graph with only the bare necessities for chat sessions.\n        output_graph_def = tf.graph_util.convert_variables_to_constants(\n            self.sess, self.graph.as_graph_def(), output_node_names.split(','))\n\n        output_fname = os.path.join(self.ckpt_dir, \"frozen_model.pb\")\n        with tf.gfile.GFile(output_fname, 'wb') as f:\n            f.write(output_graph_def.SerializeToString())\n        print(\"%d ops in the final graph.\" % len(output_graph_def.node))\n        subprocess.call(['cp', self.dataset.paths['vocab'], self.ckpt_dir])\n\n    def __getattr__(self, name):\n        if name == 'params':\n            camel_case = self.data_name.title().replace('_', '')\n            replace_dict = {'dataset': \"data.\"+camel_case}\n            return {**self.__dict__['__params'], **replace_dict}\n        elif name in DEFAULT_FULL_CONFIG: # Requesting a top-level key.\n            return self.__dict__['__params'][name]\n        else:\n            for k in DEFAULT_FULL_CONFIG.keys():\n                if not isinstance(self.__dict__['__params'][k], dict):\n                    continue\n                if name in self.__dict__['__params'][k]:\n                    return self.__dict__['__params'][k][name]\n        raise AttributeError(name)\n\n    @staticmethod\n    def _build_hparam_path(ckpt_dir, **kwargs):\n        \"\"\"Returns relative path build from args for descriptive checkpointing.\n\n        The new path becomes ckpt_dir appended with directories named by kwargs:\n            - If a given kwargs[key] is a string, that is set as the \n              appended dir name.\n            - Otherwise, it gets formatted, e.g. for key='learning_rate' it \n              may become 'learning_rate_0_001'\n\n        Returns:\n            ckpt_dir followed by sequentially appended directories, \n            named by kwargs.\n        \"\"\"\n        kwargs = copy.deepcopy(kwargs)\n        new_ckpt_dir = ckpt_dir\n        for key in sorted(kwargs):\n            if not isinstance(kwargs[key], str):\n                dir_name = key + \"_\" + str(kwargs[key]).replace('.', '_')\n            else:\n                dir_name = kwargs[key]\n            new_ckpt_dir = os.path.join(new_ckpt_dir, dir_name)\n        return new_ckpt_dir\n\n\nclass BucketModel(Model):\n    \"\"\"Abstract class. Any classes that extend BucketModel just need to customize their\n        graph structure in __init__ and implement the step(...) function.\n        The real motivation for making this was to be able to use the true Model\n        abstract class for all classes in this directory, bucketed or not, r1.0 or r0.12.\n    \"\"\"\n\n    def __init__(self, logger, buckets, dataset, params):\n        self.buckets = buckets\n        super(BucketModel, self).__init__(\n            logger=logger,\n            dataset=dataset,\n            params=params)\n\n    def compile(self):\n        \"\"\" Configure training process. Name was inspired by Keras. <3 \"\"\"\n\n        if self.losses is None:\n            raise ValueError(\"Tried compiling model before defining losses.\")\n\n        print(\"Configuring training operations. This may take some time . . . \")\n        # Note: variables are trainable=True by default.\n        params = tf.trainable_variables()\n        # train_op will store the parameter (S)GD train_op.\n        self.apply_gradients = []\n        optimizer = OPTIMIZERS[self.optimizer](self.learning_rate)\n        for b in range(len(self.buckets)):\n            gradients = tf.gradients(self.losses[b], params)\n            # Gradient clipping is actually extremely simple, it basically just\n            # checks if L2Norm(gradients) > max_gradient, and if it is,\n            # it returns (gradients / L2Norm(gradients)) * max_grad.\n            clipped_gradients, _ = tf.clip_by_global_norm(\n                gradients, self.max_gradient)\n            self.apply_gradients.append(optimizer.apply_gradients(\n                zip(clipped_gradients, params),global_step=self.global_step))\n\n        super(BucketModel, self).compile()\n\n    def check_input_lengths(self, inputs, expected_lengths):\n        \"\"\"\n        Raises:\n            ValueError: if length of encoder_inputs, decoder_inputs, or\n            target_weights disagrees with bucket size for the specified bucket_id.\n        \"\"\"\n        for input, length in zip(inputs, expected_lengths):\n            if len(input) != length:\n                raise ValueError(\"Input length doesn't match bucket size:\"\n                                 \" %d != %d.\" % (len(input), length))\n\n    def get_batch(self, data, bucket_id):\n        \"\"\"Get a random batch of data from the specified bucket, prepare for step.\n\n        Args:\n          data: tuple of len(self.buckets). data[bucket_id] == [source_ids, target_ids]\n          bucket_id: integer, which bucket to get the batch for.\n\n        Returns:\n          The triple (encoder_inputs, decoder_inputs, target_weights) for\n          the constructed batch that has the proper format to call step(...) later.\n        \"\"\"\n        encoder_size, decoder_size = self.buckets[bucket_id]\n        encoder_inputs, decoder_inputs = [], []\n\n        # Get a random batch of encoder and decoder inputs from data,\n        # pad them if needed, reverse encoder inputs and add GO to decoder.\n        for _ in range(self.batch_size):\n            encoder_input, decoder_input = random.choice(data[bucket_id])\n            # BasicEncoder inputs are padded and then reversed.\n            encoder_pad = [io_utils.PAD_ID] * (encoder_size - len(encoder_input))\n            encoder_inputs.append(list(reversed(encoder_input + encoder_pad)))\n            # DynamicDecoder inputs get an extra \"GO\" symbol, and are padded then.\n            decoder_pad= [io_utils.PAD_ID] * (decoder_size - len(decoder_input) - 1)\n            decoder_inputs.append([io_utils.GO_ID] + decoder_input + decoder_pad)\n\n        # Define some small helper functions before we re-index & weight.\n        def inputs_to_unit(uid, inputs):\n            \"\"\" Return re-indexed version of inputs array. Description in params below.\n            :param uid: index identifier for input timestep/unit/node of interest.\n            :param inputs:  single batch of data; inputs[i] is i'th sentence.\n            :return:        re-indexed version of inputs as numpy array.\n            \"\"\"\n            return np.array([inputs[i][uid] for i in range(self.batch_size)], dtype=np.int32)\n\n        batch_encoder_inputs = [inputs_to_unit(i, encoder_inputs) for i in range(encoder_size)]\n        batch_decoder_inputs = [inputs_to_unit(i, decoder_inputs) for i in range(decoder_size)]\n        batch_weights        = list(np.ones(shape=(decoder_size, self.batch_size), dtype=np.float32))\n\n        # Set weight for the final decoder unit to 0.0 for all batches.\n        for i in range(self.batch_size):\n            batch_weights[-1][i] = 0.0\n\n        # Also set any decoder-input-weights to 0 that have PAD\n        # as target decoder output.\n        for unit_id in range(decoder_size - 1):\n            ids_with_pad_target = [b for b in range(self.batch_size)\n                                   if decoder_inputs[b][unit_id+1] == io_utils.PAD_ID]\n            batch_weights[unit_id][ids_with_pad_target] = 0.0\n\n        return batch_encoder_inputs, batch_decoder_inputs, batch_weights\n\n    def train(self, dataset):\n        \"\"\" Train chatbot. \"\"\"\n        from chatbot.legacy._train import train\n        train(self, dataset)\n\n    def decode(self):\n        \"\"\" Create chat session between user & chatbot. \"\"\"\n        from chatbot.legacy._decode import decode\n        decode(self)\n\n    def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False):\n        \"\"\"Run a step of the model.\n\n        Args:\n          encoder_inputs: list of numpy int vectors to feed as encoder inputs.\n          decoder_inputs: list of numpy int vectors to feed as decoder inputs.\n          target_weights: list of numpy float vectors to feed as target weights.\n          bucket_id: which bucket of the model to use.\n        \"\"\"\n        raise NotImplemented\n\n\n\n\n"
  },
  {
    "path": "chatbot/components/__init__.py",
    "content": "from chatbot.components.embedder import Embedder\nfrom chatbot.components.input_pipeline import InputPipeline\nfrom chatbot.components.encoders import BasicEncoder, BidirectionalEncoder\nfrom chatbot.components.decoders import BasicDecoder, AttentionDecoder\n\n__all__ = [\"InputPipeline\",\n           \"Embedder\",\n           \"BasicEncoder\",\n           \"BidirectionalEncoder\",\n           \"BasicDecoder\",\n           \"AttentionDecoder\"]"
  },
  {
    "path": "chatbot/components/base/__init__.py",
    "content": ""
  },
  {
    "path": "chatbot/components/base/_rnn.py",
    "content": "\"\"\"Collection of base RNN classes and custom RNNCells.\n\"\"\"\n\nimport tensorflow as tf\nfrom tensorflow.python.util import nest\nfrom tensorflow.python.ops import rnn_cell_impl\nfrom chatbot.components import bot_ops\nfrom tensorflow.contrib.rnn import RNNCell\nfrom tensorflow.contrib.rnn import GRUCell, MultiRNNCell, LSTMStateTuple\nfrom tensorflow.python.layers import core as layers_core\n\n# Required due to TensorFlow's unreliable naming across versions . . .\ntry:\n    # r1.1\n    from tensorflow.contrib.seq2seq import DynamicAttentionWrapper \\\n        as AttentionWrapper\n    from tensorflow.contrib.seq2seq import DynamicAttentionWrapperState \\\n        as AttentionWrapperState\nexcept ImportError:\n    # master\n    from tensorflow.contrib.seq2seq import AttentionWrapper\n    from tensorflow.contrib.seq2seq import AttentionWrapperState\n\n\nclass Cell(RNNCell):\n    \"\"\"Simple wrapper class for any extensions I want to make to the\n    encoder/decoder rnn cells. For now, just Dropout+GRU.\"\"\"\n\n    def __init__(self, state_size, num_layers, dropout_prob, base_cell):\n        \"\"\"Define the cell by composing/wrapping with tf.contrib.rnn functions.\n        \n        Args:\n            state_size: number of units in the cell.\n            num_layers: how many cells to include in the MultiRNNCell.\n            dropout_prob: probability of a node being dropped.\n            base_cell: (str) name of underling cell to use (e.g. 'GRUCell')\n        \"\"\"\n\n        self._state_size = state_size\n        self._num_layers = num_layers\n        self._dropout_prob = dropout_prob\n        self._base_cell = base_cell\n\n        def single_cell():\n            \"\"\"Convert cell name (str) to class, and create it.\"\"\"\n            return getattr(tf.contrib.rnn, base_cell)(num_units=state_size)\n\n        if num_layers == 1:\n            self._cell = single_cell()\n        else:\n            self._cell = MultiRNNCell(\n                [single_cell() for _ in range(num_layers)])\n\n    @property\n    def state_size(self):\n        return self._cell.state_size\n\n    @property\n    def shape(self):\n        \"\"\"Needed for shape_invariants arg for tf.while_loop.\"\"\"\n        if self._num_layers == 1:\n            return self.single_layer_shape()\n        else:\n            return tuple(self.single_layer_shape()\n                         for _ in range(self._num_layers))\n\n    def single_layer_shape(self):\n        if 'LSTM' in self._base_cell:\n            return LSTMStateTuple(c=tf.TensorShape([None, self._state_size]),\n                                  h=tf.TensorShape([None, self._state_size]))\n        else:\n            return tf.TensorShape([None, self._state_size])\n\n    @property\n    def output_size(self):\n        return self._cell.output_size\n\n    def __call__(self, inputs, state, scope=None):\n        \"\"\"Run this RNN cell on inputs, starting from the given state.\n\n        Args:\n            inputs: `2-D` tensor with shape `[batch_size x input_size]`.\n            state: Either 2D Tensor or tuple of 2D tensors, determined by cases:\n                - `self.state_size` is int: `2-D Tensor` with shape\n                    `[batch_size x self.state_size]`.\n                - `self.state_size` is tuple: tuple with shapes\n                    `[batch_size x s] for s in self.state_size`.\n            scope: VariableScope for the created subgraph; \n                defaults to class name.\n\n        Returns:\n            A pair containing:\n            - Output: 2D tensor with shape [batch_size x self.output_size].\n            - New state: Either a single `2-D` tensor, or a tuple of tensors \n                matching the arity and shapes of `state`.\n        \"\"\"\n        output, new_state = self._cell(inputs, state, scope)\n        output = tf.layers.dropout(output, rate=self._dropout_prob, name=\"dropout\")\n        return output, new_state\n\n\nclass RNN(object):\n    \"\"\"Base class for encoders/decoders. Has simple instance attributes and\n    an RNNCell object and getter.\n    \"\"\"\n\n    def __init__(self,\n                 state_size,\n                 embed_size,\n                 dropout_prob,\n                 num_layers,\n                 base_cell=\"GRUCell\",\n                 state_wrapper=None):\n        \"\"\"\n        Args:\n            state_size: number of units in underlying rnn cell.\n            embed_size: dimension size of word-embedding space.\n            dropout_prob: probability of a node being dropped.\n            num_layers: how many cells to include in the MultiRNNCell.\n            base_cell: (str) name of underling cell to use (e.g. 'GRUCell')\n            state_wrapper: allow states to store their wrapper class. See the\n                wrapper method docstring below for more info.\n        \"\"\"\n        self.state_size = state_size\n        self.embed_size = embed_size\n        self.num_layers = num_layers\n        self.dropout_prob = dropout_prob\n        self.base_cell = base_cell\n        self._wrapper = state_wrapper\n\n    def get_cell(self, name):\n        \"\"\"Returns a cell instance, defined by its name scope.\"\"\"\n        with tf.name_scope(name, \"get_cell\"):\n            return Cell(state_size=self.state_size,\n                        num_layers=self.num_layers,\n                        dropout_prob=self.dropout_prob,\n                        base_cell=self.base_cell)\n\n    def wrapper(self, state):\n        \"\"\"Some RNN states are wrapped in namedtuples. \n        (TensorFlow decision, definitely not mine...). \n        \n        This is here for derived classes to specify their wrapper state. \n        Some examples: LSTMStateTuple and AttentionWrapperState.\n        \n        Args:\n            state: tensor state tuple, will be unpacked into the wrapper tuple.\n        \"\"\"\n        if self._wrapper is None:\n            return state\n        else:\n            return self._wrapper(*state)\n\n    def __call__(self, *args):\n        raise NotImplemented\n\n\nclass SimpleAttentionWrapper(RNNCell):\n    \"\"\"A simplified and tweaked version of TensorFlow's AttentionWrapper.\n    \n    It closely follows the implementation described by Luong et. al, 2015 in\n    `Effective Approaches to Attention-based Neural Machine Translation`.\n    \"\"\"\n\n    def __init__(self,\n                 cell,\n                 attention_mechanism,\n                 initial_cell_state=None,\n                 name=None):\n        \"\"\"Construct the wrapper.\n        \n        Main tweak is creating the attention_layer with a tanh activation \n        (Luong's choice) as opposed to linear (TensorFlow's choice). Also,\n        since I am sticking with Luong's approach, parameters that are in the\n        constructor of TensorFlow's AttentionWrapper have been removed, and \n        the corresponding values are set to how Luong's paper defined them.\n        \n        Args:\n            cell: instance of the Cell class above.\n            attention_mechanism: instance of tf AttentionMechanism.\n            initial_cell_state: The initial state value to use for the cell when\n                the user calls `zero_state()`.\n            name: Name to use when creating ops.\n        \"\"\"\n\n        super(SimpleAttentionWrapper, self).__init__(name=name)\n\n        # Assume that 'cell' is an instance of the custom 'Cell' class above.\n        self._base_cell = cell._base_cell\n        self._num_layers = cell._num_layers\n        self._state_size = cell._state_size\n\n        self._attention_size = attention_mechanism.values.get_shape()[-1].value\n        self._attention_layer = layers_core.Dense(self._attention_size,\n                                                  activation=tf.nn.tanh,\n                                                  name=\"attention_layer\",\n                                                  use_bias=False)\n\n        self._cell = cell\n        self._attention_mechanism = attention_mechanism\n        with tf.name_scope(name, \"AttentionWrapperInit\"):\n            if initial_cell_state is None:\n                self._initial_cell_state = None\n            else:\n                final_state_tensor = nest.flatten(initial_cell_state)[-1]\n                state_batch_size = (\n                    final_state_tensor.shape[0].value\n                    or tf.shape(final_state_tensor)[0])\n                error_message = (\n                    \"Constructor AttentionWrapper %s: \" % self._base_name +\n                    \"Non-matching batch sizes between the memory \"\n                    \"(encoder output) and initial_cell_state.\")\n                with tf.control_dependencies(\n                    [tf.assert_equal(state_batch_size,\n                        self._attention_mechanism.batch_size,\n                        message=error_message)]):\n                    self._initial_cell_state = nest.map_structure(\n                        lambda s: tf.identity(s, name=\"check_initial_cell_state\"),\n                        initial_cell_state)\n\n    def zero_state(self, batch_size, dtype):\n        with tf.name_scope(type(self).__name__ + \"ZeroState\", values=[batch_size]):\n            if self._initial_cell_state is not None:\n                cell_state = self._initial_cell_state\n            else:\n                cell_state = self._cell.zero_state(batch_size, dtype)\n            error_message = (\n                \"zero_state of AttentionWrapper %s: \" % self._base_name +\n                \"Non-matching batch sizes between the memory \"\n                \"(encoder output) and the requested batch size.\")\n            with tf.control_dependencies(\n                [tf.assert_equal(batch_size,\n                    self._attention_mechanism.batch_size,\n                    message=error_message)]):\n                cell_state = nest.map_structure(\n                    lambda s: tf.identity(s, name=\"checked_cell_state\"),\n                    cell_state)\n            alignment_history = ()\n\n            _zero_state_tensors = rnn_cell_impl._zero_state_tensors\n            return AttentionWrapperState(\n                cell_state=cell_state,\n                time=tf.zeros([], dtype=tf.int32),\n                attention=_zero_state_tensors(self._attention_size, batch_size,\n                dtype),\n                alignments=self._attention_mechanism.initial_alignments(\n                    batch_size, dtype),\n                alignment_history=alignment_history)\n\n    def call(self, inputs, state):\n        \"\"\"First computes the cell state and output in the usual way, \n        then works through the attention pipeline:\n            h --> a --> c --> h_tilde\n        using the naming/notation from Luong et. al, 2015.\n\n        Args:\n            inputs: `2-D` tensor with shape `[batch_size x input_size]`.\n            state: An instance of `AttentionWrapperState` containing the \n                tensors from the prev timestep.\n     \n        Returns:\n            A tuple `(attention_or_cell_output, next_state)`, where:\n            - `attention_or_cell_output` depending on `output_attention`.\n            - `next_state` is an instance of `DynamicAttentionWrapperState`\n                containing the state calculated at this time step.\n        \"\"\"\n\n        # Concatenate the previous h_tilde with inputs (input-feeding).\n        cell_inputs = tf.concat([inputs, state.attention], -1)\n\n        # 1. (hidden) Compute the hidden state (cell_output).\n        cell_output, next_cell_state = self._cell(cell_inputs,\n                                                  state.cell_state)\n\n        # 2. (align) Compute the normalized alignment scores. [B, L_enc].\n        # where L_enc is the max seq len in the encoder outputs for the (B)atch.\n        score = self._attention_mechanism(\n            cell_output, previous_alignments=state.alignments)\n        alignments = tf.nn.softmax(score)\n\n        # Reshape from [B, L_enc] to [B, 1, L_enc]\n        expanded_alignments = tf.expand_dims(alignments, 1)\n        # (Possibly projected) encoder outputs: [B, L_enc, state_size]\n        encoder_outputs = self._attention_mechanism.values\n        # 3 (context) Take inner prod. [B, 1, state size].\n        context = tf.matmul(expanded_alignments, encoder_outputs)\n        context = tf.squeeze(context, [1])\n\n        # 4 (h_tilde) Compute tanh(W [c, h]).\n        attention = self._attention_layer(\n            tf.concat([cell_output, context], -1))\n\n        next_state = AttentionWrapperState(\n            cell_state=next_cell_state,\n            attention=attention,\n            time=state.time + 1,\n            alignments=alignments,\n            alignment_history=())\n\n        return attention, next_state\n\n\n    @property\n    def output_size(self):\n        return self._attention_size\n\n    @property\n    def state_size(self):\n        return AttentionWrapperState(\n            cell_state=self._cell.state_size,\n            attention=self._attention_size,\n            time=tf.TensorShape([]),\n            alignments=self._attention_mechanism.alignments_size,\n            alignment_history=())\n\n    @property\n    def shape(self):\n        return AttentionWrapperState(\n            cell_state=self._cell.shape,\n            attention=tf.TensorShape([None, self._attention_size]),\n            time=tf.TensorShape(None),\n            alignments=tf.TensorShape([None, None]),\n            alignment_history=())\n\n\nclass BasicRNNCell(RNNCell):\n    \"\"\"Same as tf.contrib.rnn.BasicRNNCell, rewritten for clarity.\n\n    For example, many TF implementations have leftover code debt from past \n    versions, so I wanted to show what is actually going on, with the fluff \n    removed. Also, I've removed generally accepted values from parameters/args \n    in favor of just setting them.\n    \"\"\"\n\n    def __init__(self, num_units, reuse=None):\n        self._num_units = num_units\n        self._reuse = reuse\n\n    @property\n    def state_size(self):\n        return self._num_units\n\n    @property\n    def output_size(self):\n        return self._num_units\n\n    def __call__(self, inputs, state, scope=None):\n        \"\"\"Most basic RNN. Define as:\n            output = new_state = act(W * input + U * state + B).\n        \"\"\"\n        output = tf.tanh(bot_ops.linear_map(\n            args=[inputs, state],\n            output_size=self._num_units,\n            bias=True))\n        return output, output\n\n\n"
  },
  {
    "path": "chatbot/components/bot_ops.py",
    "content": "\"\"\"Custom TF 'ops' as meant in the TensorFlow definition of ops.\"\"\"\n\nimport numpy as np\nimport tensorflow as tf\nfrom utils import io_utils\nfrom tensorflow.python.util import nest\n\n\ndef dynamic_sampled_softmax_loss(labels, logits, output_projection, vocab_size,\n                                 from_scratch=False, num_samples=512, name=None):\n    \"\"\"Sampled softmax loss function able to accept 3D Tensors as input,\n       as opposed to the official TensorFlow support for <= 2D. This is\n       dynamic because it can be applied across variable-length sequences,\n       which are unspecified at initialization with size 'None'.\n\n       Args:\n        labels: 2D integer tensor of shape [batch_size, None] containing\n            the word ID labels for each individual rnn state from logits.\n        logits: 3D float tensor of shape [batch_size, None, state_size] as\n            ouput by a DynamicDecoder instance.\n        from_scratch: (bool) Whether to use the version I wrote from scratch, or to use\n                      the version I wrote that applies map_fn(sampled_softmax) across timeslices, which\n                      is probably less efficient. (Currently testing)\n        num\n        Returns:\n            loss as a scalar Tensor, computed as the mean over all batches and sequences.\n    \"\"\"\n\n    if from_scratch:\n        return _dynamic_sampled_from_scratch(labels, logits, output_projection, vocab_size,\n                                             num_samples=num_samples, name=name)\n    else:\n        return _dynamic_sampled_map(labels, logits, output_projection, vocab_size,\n                                    num_samples=num_samples, name=name)\n\n\ndef _dynamic_sampled_map(labels, logits, output_projection, vocab_size,\n                                 num_samples=512, name=None):\n    \"\"\"Sampled softmax loss function able to accept 3D Tensors as input,\n       as opposed to the official TensorFlow support for <= 2D. This is\n       dynamic because it can be applied across variable-length sequences,\n       which are unspecified at initialization with size 'None'.\n\n       Args:\n           labels: 2D integer tensor of shape [batch_size, None] containing\n                the word ID labels for each individual rnn state from logits.\n            logits: 3D float tensor of shape [batch_size, None, state_size] as\n                ouput by a DynamicDecoder instance.\n\n        Returns:\n            loss as a scalar Tensor, computed as the mean over all batches and sequences.\n    \"\"\"\n    with tf.name_scope(name, \"dynamic_sampled_softmax_loss\", [labels, logits, output_projection]):\n        seq_len = tf.shape(logits)[1]\n        st_size = tf.shape(logits)[2]\n        time_major_outputs = tf.reshape(logits, [seq_len, -1, st_size])\n        time_major_labels = tf.reshape(labels, [seq_len, -1])\n        # Reshape is apparently faster (dynamic) than transpose.\n        w_t = tf.reshape(output_projection[0], [vocab_size, -1])\n        b = output_projection[1]\n        def sampled_loss(elem):\n            logits, lab = elem\n            lab = tf.reshape(lab, [-1, 1])\n            # TODO: Figure out how this accurately gets loss without requiring weights,\n            # like sparse_softmax_cross_entropy requires.\n            return tf.reduce_mean(\n                tf.nn.sampled_softmax_loss(\n                    weights=w_t,\n                    biases=b,\n                    labels=lab,\n                    inputs=logits,\n                    num_sampled=num_samples,\n                    num_classes=vocab_size,\n                    partition_strategy='div'))\n        batch_losses = tf.map_fn(sampled_loss,\n                                 (time_major_outputs, time_major_labels),\n                                 dtype=tf.float32)\n        loss = tf.reduce_mean(batch_losses)\n    return loss\n\n\ndef _dynamic_sampled_from_scratch(labels, logits, output_projection, vocab_size,\n                                  num_samples, name=None):\n    \"\"\"Note: I closely follow the notation from Tensorflow's Candidate Sampling reference.\n       - Link: https://www.tensorflow.org/extras/candidate_sampling.pdf\n\n    Args:\n        output_projection: (tuple) returned by any DynamicDecoder.get_projections_tensors()\n            - output_projection[0] == w tensor. [state_size, vocab_size]\n            - output_projection[0] == b tensor. [vocab_size]\n        labels: 2D Integer tensor. [batch_size, None]\n        logits: 3D float Tensor [batch_size, None, state_size].\n            - In this project, usually is the decoder batch output sequence (NOT projected).\n        num_samples: number of classes out of vocab_size possible to use.\n        vocab_size: total number of classes.\n    \"\"\"\n    with tf.name_scope(name, \"dynamic_sampled_from_scratch\", [labels, logits, output_projection]):\n        batch_size, seq_len, state_size  = tf.unstack(tf.shape(logits))\n        time_major_outputs  = tf.reshape(logits, [seq_len, batch_size, state_size])\n        time_major_labels   = tf.reshape(labels, [seq_len, batch_size])\n\n        weights = tf.transpose(output_projection[0])\n        biases = output_projection[1]\n        def sampled_loss_single_timestep(args):\n            \"\"\"\n            Args: 2-tuple (because map_fn below)\n                targets: 1D tensor (sighs loudly) of shape [batch_size]\n                logits: 2D tensor (sighs intensify) of shape [batch_size, state_size].\n            \"\"\"\n            logits, targets = args\n            with tf.name_scope(\"compute_sampled_logits\", [weights, biases, logits, targets]):\n                targets = tf.cast(targets, tf.int64)\n                sampled_values = tf.nn.log_uniform_candidate_sampler(\n                    true_classes=tf.expand_dims(targets, -1),\n                    num_true=1,\n                    num_sampled=num_samples,\n                    unique=True,\n                    range_max=vocab_size)\n                S, Q_true, Q_samp = (tf.stop_gradient(s) for s in sampled_values)\n\n                # Get concatenated 1D tensor of shape [batch_size * None + num_samples],\n                all_ids = tf.concat([targets, S], 0)\n                _W = tf.nn.embedding_lookup(weights, all_ids, partition_strategy='div')\n                _b = tf.nn.embedding_lookup(biases, all_ids)\n\n                W = {'targets': tf.slice(_W, begin=[0, 0], size=[batch_size, state_size]),\n                     'samples': tf.slice(_W, begin=[batch_size, 0], size=[num_samples, state_size])}\n                b = {'targets': tf.slice(_b, begin=[0], size=[batch_size]),\n                     'samples': tf.slice(_b, begin=[batch_size], size=[num_samples])}\n\n                true_logits  = tf.reduce_sum(tf.multiply(logits, W['targets']), 1)\n                true_logits += b['targets'] - tf.log(Q_true)\n\n                sampled_logits  = tf.matmul(logits, W['samples'], transpose_b=True)\n                sampled_logits += b['samples'] - tf.log(Q_samp)\n\n                F = tf.concat([true_logits, sampled_logits], 1)\n                def fn(s_i): return tf.where(targets == s_i, tf.ones_like(targets), tf.zeros_like(targets))\n                sample_labels = tf.transpose(tf.map_fn(fn, S))\n                out_targets = tf.concat([tf.ones_like(true_logits, dtype=tf.int64), sample_labels], 1)\n            return tf.losses.softmax_cross_entropy(out_targets, logits=F)\n\n        return tf.reduce_mean(tf.map_fn(sampled_loss_single_timestep,\n                                        (time_major_outputs, time_major_labels),\n                                        dtype=tf.float32))\n\n\ndef cross_entropy_sequence_loss(logits, labels, weights):\n    \"\"\"My version of various tensorflow sequence loss implementations I've \n    seen. They all seem to do the basic operations below, but in a much more\n    roundabout way. This version is able to be simpler because it assumes that\n    the inputs are coming from a chatbot.Model subclass.\n    \"\"\"\n    with tf.name_scope('cross_entropy_sequence_loss'):\n        losses = tf.nn.sparse_softmax_cross_entropy_with_logits(\n            logits=logits, labels=labels)\n\n        # We can get the sequence lengths simply by casting all PAD labels\n        # with 0 and everything else with 1.\n        weights = tf.to_float(weights)\n        losses = tf.multiply(losses, weights)\n        return tf.reduce_sum(losses) / tf.reduce_sum(weights)\n\n\ndef dot_prod(x, y):\n    return tf.reduce_sum(tf.multiply(x, y))\n\n\ndef bahdanau_score(attention_dim, h_j, s_i):\n    state_size = tf.get_shape(h_j)[0]\n    h_proj = tf.get_variable('W_1',\n                             [attention_dim, state_size],\n                             dtype=tf.float32)\n    s_proj = tf.get_variable('W_2',\n                             [attention_dim, state_size],\n                             dtype=tf.float32)\n    v = tf.get_variable('v',\n                        [attention_dim, state_size],\n                        dtype=tf.float32)\n    score = dot_prod(v, tf.tanh(h_proj + s_proj))\n    return score\n\n\ndef luong_score(attention_dim, h_j, s_i):\n    h_proj = tf.get_variable('W_1',\n                             [attention_dim, tf.get_shape(h_j)[0]],\n                             dtype=tf.float32)\n    s_proj = tf.get_variable('W_2',\n                             [attention_dim, tf.get_shape(s_i)[0]],\n                             dtype=tf.float32)\n    score = dot_prod(h_proj, s_proj)\n    return score\n\n\ndef linear_map(args, output_size, biases=None):\n    \"\"\"Linear map: sum_i(args[i] * W[i]), where W[i] is a variable.\n    \n    Basically, you pass in a bunch of vectors (ok you got me, 2D tensors because\n    batch dimensions) that you want added together but need their dimensions\n    to match. This function has you covered.\n\n    Args:\n        args: a 2D Tensor or a list of 2D, batch x n, Tensors.\n        output_size: int, second dimension of W[i].\n        biases: tensor of shape [output_size] added to all in batch if not None.\n\n    Returns:\n        A 2D Tensor with shape [batch x output_size] equal to\n        sum_i(args[i] * W[i]), where W[i]s are newly created matrices.\n    \"\"\"\n\n    if not nest.is_sequence(args):\n        args = [args]\n\n    # Calculate the total size of arguments on dimension 1.\n    total_arg_size = 0\n    shapes = [tf.shape(a)[1] for a in args]\n    for shape in shapes:\n        total_arg_size = tf.add(total_arg_size, shape)\n\n    dtype = args[0].dtype\n\n    # Now the computation.\n    scope = tf.get_variable_scope()\n    with tf.variable_scope(scope) as outer_scope:\n\n        weights = tf.get_variable('weights',\n            [total_arg_size, output_size],\n            dtype=dtype)\n\n        if len(args) == 1:\n            res = tf.matmul(args[0], weights)\n        else:\n            res = tf.matmul(tf.concat(args, 1), weights)\n\n        return res if not biases else tf.nn.bias_add(res, biases)\n"
  },
  {
    "path": "chatbot/components/decoders.py",
    "content": "import logging\nimport tensorflow as tf\nimport sys\n\n# Required due to TensorFlow's unreliable naming across versions . . .\ntry:\n    # r1.1\n    from tensorflow.contrib.seq2seq import DynamicAttentionWrapperState \\\n        as AttentionWrapperState\nexcept ImportError:\n    # master\n    from tensorflow.contrib.seq2seq import AttentionWrapperState\n\nfrom tensorflow.contrib.seq2seq import BahdanauAttention, LuongAttention\nfrom tensorflow.contrib.rnn import LSTMStateTuple, LSTMCell\nfrom chatbot.components.base._rnn import RNN, SimpleAttentionWrapper\nfrom utils import io_utils\n\n\nclass Decoder(RNN):\n    \"\"\"Dynamic decoding (base) class that supports both training and inference without\n       requiring superfluous helper objects. With simple boolean parameters,\n       handles the decoder sub-graph construction dynamically in its entirety.\n    \"\"\"\n\n    def __init__(self,\n                 base_cell,\n                 encoder_outputs,\n                 state_size,\n                 vocab_size,\n                 embed_size,\n                 dropout_prob,\n                 num_layers,\n                 temperature,\n                 max_seq_len,\n                 state_wrapper=None):\n        \"\"\"\n        Args:\n            base_cell: (str) name of RNNCell class for underlying cell.\n            state_size: number of units in underlying rnn cell.\n            vocab_size: dimension of output space for projections.\n            embed_size: dimension size of word-embedding space.\n            dropout_prob: probability of a node being dropped.\n            num_layers: how many cells to include in the MultiRNNCell.\n            temperature: (float) determines randomness of outputs/responses.\n                - Some notable values (to get some intuition):\n                  - t -> 0: outputs approach simple argmax.\n                  - t = 1: same as sampling from softmax distribution over\n                    outputs, interpreting the softmax outputs as from a\n                    multinomial (probability) distribution.\n                  - t -> inf: outputs approach uniform random distribution.\n            state_wrapper: allow states to store their wrapper class. See the\n                wrapper method docstring below for more info.\n        \"\"\"\n\n        self.encoder_outputs = encoder_outputs\n        if state_wrapper is None and base_cell == 'LSTMCell':\n            state_wrapper = LSTMStateTuple\n\n        super(Decoder, self).__init__(\n            base_cell=base_cell,\n            state_size=state_size,\n            embed_size=embed_size,\n            dropout_prob=dropout_prob,\n            num_layers=num_layers,\n            state_wrapper=state_wrapper)\n\n        self.temperature = temperature\n        self.vocab_size = vocab_size\n        self.max_seq_len = max_seq_len\n        with tf.variable_scope('projection_tensors'):\n            w = tf.get_variable(\n                name=\"w\",\n                shape=[state_size, vocab_size],\n                dtype=tf.float32,\n                initializer=tf.contrib.layers.xavier_initializer())\n            b = tf.get_variable(\n                name=\"b\",\n                shape=[vocab_size],\n                dtype=tf.float32,\n                initializer=tf.contrib.layers.xavier_initializer())\n            self._projection = (w, b)\n\n    def __call__(self,\n                 inputs,\n                 is_chatting,\n                 loop_embedder,\n                 cell,\n                 initial_state=None):\n        \"\"\"Run the inputs on the decoder.\n\n        If we are chatting, then conduct dynamic sampling, which is the process\n        of generating a response given inputs == GO_ID.\n\n        Args:\n            inputs: Tensor with shape [batch_size, max_time, embed_size].\n                For training, inputs are the 'to' sentence tokens (embedded).\n                For chatting, first input is <GO> and thereafter, the input is\n                the bot's previous output (looped around through embedding).\n            initial_state: Tensor with shape [batch_size, state_size].\n            is_chatting: (bool) Determines how we retrieve the outputs and the\n                         returned Tensor shape.\n            loop_embedder: required if is_chatting==True.\n                           Embedder instance needed to feed decoder outputs\n                           as next inputs.\n\n        Returns:\n            outputs: if not chatting, tensor of shape\n                [batch_size, max_time, vocab_size]. Otherwise, tensor of\n                response IDs with shape [batch_size, max_time].\n            state:   if not is_chatting, tensor of shape\n                [batch_size, state_size]. Otherwise, None.\n        \"\"\"\n\n        self.rnn = tf.make_template('decoder_rnn',\n                                    tf.nn.dynamic_rnn,\n                                    cell=cell,\n                                    dtype=tf.float32)\n\n        outputs, state = self.rnn(inputs=inputs,\n                                  initial_state=initial_state)\n\n        if not is_chatting:\n            return outputs, state\n\n        if loop_embedder is None:\n            raise ValueError(\n                \"Loop function required to feed outputs as inputs.\")\n\n        def body(response, state):\n            \"\"\"Input callable for tf.while_loop. See below.\"\"\"\n            tf.get_variable_scope().reuse_variables()\n            decoder_input = loop_embedder(tf.reshape(response[-1], (1, 1)),\n                                          reuse=True)\n\n            outputs, state = self.rnn(inputs=decoder_input,\n                                      initial_state=state,\n                                      sequence_length=[1])\n\n            next_id = self.sample(self.apply_projection(outputs))\n            response = tf.concat([response, tf.stack([next_id])], axis=0)\n            return response, state\n\n        def cond(response, s):\n            \"\"\"Input callable for tf.while_loop. See below.\"\"\"\n            return tf.logical_and(\n                tf.not_equal(response[-1], io_utils.EOS_ID),\n                tf.less_equal(tf.size(response), self.max_seq_len))\n\n        # Project to full output state during inference time.\n        # Note: \"outputs\" at this point, at this exact line, is technically just\n        # a single output: the bot's first response token.\n        outputs = self.apply_projection(outputs)\n        # Begin the process of building the list of output tokens.\n        response = tf.stack([self.sample(outputs)])\n        # Reshape is needed so the while_loop ahead knows the shape of response.\n        # The comma after the 1 is intentional, it forces tf to believe us.\n        response = tf.reshape(response, [1,], name='response')\n        tf.get_variable_scope().reuse_variables()\n\n        # ============== BEHOLD: The tensorflow while loop. ==================\n        # This allows us to sample dynamically. It also makes me happy!\n        # -- Repeat 'body' while the 'cond' returns true.\n        # -- 'cond': callable returning a boolean scalar tensor.\n        # -- 'body': callable returning a tuple of tensors of same\n        #            arity as loop_vars.\n        # -- 'loop_vars': tuple of tensors that is passed to 'cond' and 'body'.\n        response, _ = tf.while_loop(\n            cond, body, (response, state),\n            shape_invariants=(tf.TensorShape([None]), cell.shape),\n            back_prop=False)\n        # =============== FAREWELL: The tensorflow while loop. =================\n\n        outputs = tf.expand_dims(response, 0)\n        return outputs, None\n\n    def apply_projection(self, outputs, scope=None):\n        \"\"\"Defines & applies the affine transformation from state space\n        to output space.\n\n        Args:\n            outputs: Tensor of shape [batch_size, max_time, state_size]\n                returned by tf dynamic_rnn.\n            scope: (optional) variable scope for any created here.\n\n        Returns:\n            Tensor of shape [batch_size, max_time, vocab_size] representing the\n            projected outputs.\n        \"\"\"\n\n        with tf.variable_scope(scope, \"proj_scope\", [outputs]):\n\n            # Swap 1st and 2nd indices to match expected input of map_fn.\n            seq_len = tf.shape(outputs)[1]\n            st_size = tf.shape(outputs)[2]\n            time_major_outputs = tf.reshape(outputs, [seq_len, -1, st_size])\n\n            # Project batch at single timestep from state space to output space.\n            def proj_op(batch):\n                return tf.matmul(batch, self._projection[0]) + self._projection[1]\n\n            # Get projected output states;\n            # 3D Tensor with shape [batch_size, seq_len, ouput_size].\n            projected_state = tf.map_fn(proj_op, time_major_outputs)\n        return tf.reshape(projected_state, [-1, seq_len, self.vocab_size])\n\n    def sample(self, projected_output):\n        \"\"\"Return integer ID tensor representing the sampled word.\n        \n        Args:\n            projected_output: Tensor [1, 1, state_size], representing a single\n                decoder timestep output. \n        \"\"\"\n        # TODO: We really need a tf.control_dependencies check here (for rank).\n        with tf.name_scope('decoder_sampler', values=[projected_output]):\n\n            # Protect against extra size-1 dimensions; grab the 1D tensor\n            # of size state_size.\n            logits = tf.squeeze(projected_output)\n            if self.temperature < 0.02:\n                return tf.argmax(logits, axis=0)\n\n            # Convert logits to probability distribution.\n            probabilities = tf.div(logits, self.temperature)\n            projected_output = tf.div(\n                tf.exp(probabilities),\n                tf.reduce_sum(tf.exp(probabilities), axis=-1))\n\n            # Sample 1 time from the probability distribution.\n            sample_ID = tf.squeeze(\n                tf.multinomial(tf.expand_dims(probabilities, 0), 1))\n        return sample_ID\n\n    def get_projection_tensors(self):\n        \"\"\"Returns the tuple (w, b) that decoder uses for projecting.\n        Required as argument to the sampled softmax loss.\n        \"\"\"\n        return self._projection\n\n\nclass BasicDecoder(Decoder):\n    \"\"\"Simple (but dynamic) decoder that is essentially just the base class.\"\"\"\n\n    def __call__(self,\n                 inputs,\n                 initial_state=None,\n                 is_chatting=False,\n                 loop_embedder=None,\n                 cell=None):\n\n        return super(BasicDecoder, self).__call__(\n            inputs=inputs,\n            initial_state=initial_state,\n            is_chatting=is_chatting,\n            loop_embedder=loop_embedder,\n            cell=self.get_cell('decoder_cell'))\n\n\nclass AttentionDecoder(Decoder):\n    \"\"\"Dynamic decoder that applies an attention mechanism over the full\n    sequence of encoder outputs. Using Bahdanau for now (may change).\n    \n    TODO: Luong's paper mentions that they only use the *top* layer of \n    stacked LSTMs for attention-related computation. Since currently I'm \n    only testing attention models with one-layer encoder/decoders, this\n    isn't an issue. However, in a couple days I should revisit this.\n    \"\"\"\n\n    def __init__(self,\n                 encoder_outputs,\n                 base_cell,\n                 state_size,\n                 vocab_size,\n                 embed_size,\n                 attention_mechanism='BahdanauAttention',\n                 dropout_prob=1.0,\n                 num_layers=1,\n                 temperature=0.0,\n                 max_seq_len=10):\n        \"\"\"We need to explicitly call the constructor now, so we can:\n           - Specify we need the state wrapped in AttentionWrapperState.\n           - Specify our attention mechanism (will allow customization soon).\n        \"\"\"\n\n        super(AttentionDecoder, self).__init__(\n            encoder_outputs=encoder_outputs,\n            base_cell=base_cell,\n            state_size=state_size,\n            vocab_size=vocab_size,\n            embed_size=embed_size,\n            dropout_prob=dropout_prob,\n            num_layers=num_layers,\n            temperature=temperature,\n            max_seq_len=max_seq_len,\n            state_wrapper=AttentionWrapperState)\n\n        _mechanism = getattr(tf.contrib.seq2seq, attention_mechanism)\n        self.attention_mechanism = _mechanism(num_units=state_size,\n                                              memory=encoder_outputs)\n        self.output_attention = True\n\n    def __call__(self,\n                 inputs,\n                 initial_state=None,\n                 is_chatting=False,\n                 loop_embedder=None,\n                 cell=None):\n        \"\"\"\n        The only modifcation to the superclass is we pass in our own\n        cell that is wrapped with a custom attention class (specified in\n        base/_rnn.py). It is mostly the same as tensorflow's, but with minor\n        tweaks so that it could easily hang out with the other components of\n        the project.\n        \"\"\"\n\n        if cell is None:\n            cell = self.get_cell('attn_cell', initial_state)\n\n        return super(AttentionDecoder, self).__call__(\n            inputs=inputs,\n            is_chatting=is_chatting,\n            loop_embedder=loop_embedder,\n            cell=cell)\n\n    def get_cell(self, name, initial_state):\n        # Get the simple underlying cell first.\n        cell = super(AttentionDecoder, self).get_cell(name)\n        # Return the normal cell wrapped to support attention.\n        return SimpleAttentionWrapper(\n            cell=cell,\n            attention_mechanism=self.attention_mechanism,\n            initial_cell_state=initial_state)\n\n\n"
  },
  {
    "path": "chatbot/components/embedder.py",
    "content": "import tensorflow as tf\nimport logging\nimport numpy as np\nfrom chatbot._models import Model\nfrom utils import io_utils\nimport time\n\n\nclass Embedder:\n    \"\"\"Acts on tensors with integer elements, embedding them in a higher-dimensional\n    vector space. A single Embedder instance can embed both encoder and decoder by\n    associating them with distinct scopes. \"\"\"\n\n    def __init__(self, vocab_size, embed_size, l1_reg=0.0):\n        self.vocab_size = vocab_size\n        self.embed_size = embed_size\n        self.l1_reg = l1_reg\n        self._scopes = dict()\n\n    def __call__(self, inputs, reuse=None):\n        \"\"\"Embeds integers in inputs and returns the embedded inputs.\n\n        Args:\n          inputs: input tensor of shape [batch_size, max_time].\n\n        Returns:\n          Output tensor of shape [batch_size, max_time, embed_size]\n        \"\"\"\n\n        # Ensure inputs has expected rank of 2.\n        assert len(inputs.shape) == 2, \\\n            \"Expected inputs rank 2 but found rank %r\" % len(inputs.shape)\n\n        scope = tf.get_variable_scope()\n        # Parse info from scope input needed for reliable reuse across model.\n        if scope is not None:\n            scope_name = scope if isinstance(scope, str) else scope.name\n            if scope_name not in self._scopes:\n                self._scopes[scope_name] = scope\n        else:\n            self._scopes['embedder_call'] = tf.variable_scope('embedder_call')\n\n        embed_tensor = tf.get_variable(\n            name=\"embed_tensor\",\n            shape=[self.vocab_size, self.embed_size],\n            initializer=tf.contrib.layers.xavier_initializer(),\n            regularizer=tf.contrib.layers.l1_regularizer(self.l1_reg))\n        embedded_inputs = tf.nn.embedding_lookup(embed_tensor, inputs)\n        # Place any checks on inputs here before returning.\n        if not isinstance(embedded_inputs, tf.Tensor):\n            raise TypeError(\"Embedded inputs should be of type Tensor.\")\n        if len(embedded_inputs.shape) != 3:\n            raise ValueError(\"Embedded sentence has incorrect shape.\")\n        tf.summary.histogram(scope.name, embed_tensor)\n        return embedded_inputs\n\n    def assign_visualizers(self, writer, scope_names, metadata_path):\n        \"\"\"Setup the tensorboard embedding visualizer.\n\n        Args:\n            writer: instance of tf.summary.FileWriter\n            scope_names: list of \n        \"\"\"\n        assert writer is not None\n\n        if not isinstance(scope_names, list):\n            scope_names = [scope_names]\n\n        for scope_name in scope_names:\n            assert scope_name in self._scopes, \\\n                \"I don't have any embedding tensors for %s\" % scope_name\n            config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()\n            emb = config.embeddings.add()\n            emb.tensor_name = scope_name.rstrip('/') + '/embed_tensor:0'\n            emb.metadata_path = metadata_path\n            tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)\n\n    def get_scope_basename(self, scope):\n        \"\"\"\n        Args:\n            scope: tf.variable_scope.\n        \"\"\"\n        return scope.name.strip('/').split('/')[-1]\n\n\nclass AutoEncoder(Model):\n    \"\"\"[UNDER CONSTRUCTION]. AutoEncoder for unsupervised pretraining the\n    word embeddings for dynamic models.\n    \"\"\"\n\n    def __init__(self, dataset, params):\n\n        self.log = logging.getLogger('AutoEncoderLogger')\n        super(AutoEncoder, self).__init__(self.log, dataset, params)\n        self.build_computation_graph(dataset)\n        self.compile()\n\n    def build_computation_graph(self, dataset):\n        from chatbot.components.input_pipeline import InputPipeline\n        # Organize input pipeline inside single node for clean visualization.\n        self.pipeline = InputPipeline(\n            file_paths=dataset.paths,\n            batch_size=self.batch_size,\n            is_chatting=self.is_chatting)\n\n        self.encoder_inputs = self.pipeline.encoder_inputs\n\n        with tf.variable_scope('autoencoder_encoder'):\n            embed_tensor = tf.get_variable(\n                name=\"embed_tensor\",\n                shape=[self.vocab_size, self.embed_size])\n            _h = tf.nn.embedding_lookup(embed_tensor, self.encoder_inputs)\n            h = tf.contrib.keras.layers.Dense(self.embed_size, activation='relu')(_h)\n\n        with tf.variable_scope('autoencoder_decoder'):\n            w = tf.get_variable(\n                name=\"w\",\n                shape=[self.embed_size, self.vocab_size],\n                dtype=tf.float32)\n            b = tf.get_variable(\n                name=\"b\",\n                shape=[self.vocab_size],\n                dtype=tf.float32)\n\n            # Swap 1st and 2nd indices to match expected input of map_fn.\n            seq_len = tf.shape(h)[1]\n            st_size = tf.shape(h)[2]\n            time_major_outputs = tf.reshape(h, [seq_len, -1, st_size])\n            # Project batch at single timestep from state space to output space.\n            def proj_op(h_t):\n                return tf.matmul(h_t, w) + b\n            decoder_outputs = tf.map_fn(proj_op, time_major_outputs)\n            decoder_outputs = tf.reshape(decoder_outputs,\n                                         [-1, seq_len, self.vocab_size])\n\n        self.outputs = tf.identity(decoder_outputs, name='outputs')\n        # Tag inputs and outputs by name should we want to freeze the model.\n        self.graph.add_to_collection('freezer', self.encoder_inputs)\n        self.graph.add_to_collection('freezer', self.outputs)\n        # Merge any summaries floating around in the aether into one object.\n        self.merged = tf.summary.merge_all()\n\n    def compile(self):\n\n        if not self.is_chatting:\n            with tf.variable_scope(\"evaluation\") as scope:\n                target_labels = self.encoder_inputs[:, 1:]\n                target_weights = tf.cast(target_labels > 0, target_labels.dtype)\n                print('\\ntl\\n', target_labels)\n                print('\\ntw\\n', target_weights)\n                preds = self.outputs[:, :-1, :]\n                print('\\npreds\\n', preds)\n\n                self.loss = tf.losses.sparse_softmax_cross_entropy(\n                    labels=target_labels,\n                    logits=preds,\n                    weights=target_weights)\n                print(self.loss)\n\n                self.train_op = tf.contrib.layers.optimize_loss(\n                    loss=self.loss, global_step=self.global_step,\n                    learning_rate=self.learning_rate,\n                    optimizer='Adam',\n                    summaries=['gradients'])\n\n                # Compute accuracy, ensuring we use fully projected outputs.\n                _preds = tf.argmax(self.outputs[:, :-1, :], axis=2)\n                correct_pred = tf.equal(\n                    _preds,\n                    target_labels)\n                accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n\n                tf.summary.scalar('accuracy', accuracy)\n                tf.summary.scalar('loss_train', self.loss)\n                self.merged = tf.summary.merge_all()\n        super(AutoEncoder, self).compile()\n\n    def step(self, forward_only=False):\n        if not forward_only:\n            return self.sess.run([self.merged, self.loss, self.train_op])\n        else:\n            return self.sess.run(fetches=tf.argmax(self.outputs[:, :-1, :], axis=2),\n                                 feed_dict=self.pipeline.feed_dict)\n\n    def train(self, close_when_done=True):\n        coord = tf.train.Coordinator()\n        threads = tf.train.start_queue_runners(sess=self.sess, coord=coord)\n        try:\n            avg_loss = avg_step_time = 0.0\n            while not coord.should_stop():\n\n                i_step = self.sess.run(self.global_step)\n                start_time = time.time()\n                summaries, step_loss,  _ = self.step()\n                avg_step_time += (time.time() - start_time) / self.steps_per_ckpt\n                avg_loss += step_loss / self.steps_per_ckpt\n\n                # Print updates in desired intervals (steps_per_ckpt).\n                if i_step % self.steps_per_ckpt == 0:\n                    print('loss:', avg_loss)\n                    self.save(summaries=summaries)\n                    avg_loss = avg_step_time = 0.0\n\n                if i_step >= self.max_steps:\n                    print(\"Maximum step\", i_step, \"reached.\")\n                    raise SystemExit\n\n        except (KeyboardInterrupt, SystemExit):\n            print(\"Training halted. Cleaning up . . . \")\n            coord.request_stop()\n        except tf.errors.OutOfRangeError:\n            print(\"OutOfRangeError. You have run out of data.\")\n            coord.request_stop()\n        finally:\n            coord.join(threads)\n            if close_when_done:\n                self.close()\n\n    def __call__(self, sentence):\n        encoder_inputs = io_utils.sentence_to_token_ids(\n            tf.compat.as_bytes(sentence), self.dataset.word_to_idx)\n        encoder_inputs = np.array([encoder_inputs[::-1]])\n        self.pipeline.feed_user_input(encoder_inputs)\n        # Get output sentence from the chatbot.\n        response = self.step(forward_only=True)\n        return self.dataset.as_words(response[0])\n\n"
  },
  {
    "path": "chatbot/components/encoders.py",
    "content": "\"\"\"Classes for the dynamic encoders.\"\"\"\n\nimport tensorflow as tf\nfrom tensorflow.contrib.rnn import GRUCell\nfrom tensorflow.contrib.rnn import LSTMStateTuple, LSTMCell\nfrom chatbot.components.base._rnn import RNN\nfrom tensorflow.python.layers import core as layers_core\n\n\nclass BasicEncoder(RNN):\n    \"\"\"Encoder architecture that is defined by its cell running \n    inside dynamic_rnn.\n    \"\"\"\n\n    def __call__(self, inputs, initial_state=None):\n        \"\"\"Run the inputs on the encoder and return the output(s).\n\n        Args:\n            inputs: Tensor with shape [batch_size, max_time, embed_size].\n            initial_state: (optional) Tensor with shape [batch_size, state_size] \n                to initialize decoder cell.\n\n        Returns:\n            outputs: (only if return_sequence is True)\n                     Tensor of shape [batch_size, max_time, state_size].\n            state:   The final encoder state; shape [batch_size, state_size].\n        \"\"\"\n\n        cell = self.get_cell(\"basic_enc_cell\")\n        _, state = tf.nn.dynamic_rnn(cell,\n                                     inputs,\n                                     initial_state=initial_state,\n                                     dtype=tf.float32)\n        return _, state\n\n\nclass BidirectionalEncoder(RNN):\n    \"\"\"Encoder that concatenates two copies of its cell forward and backward and\n    feeds into a bidirectional_dynamic_rnn.\n\n    Outputs are concatenated before being returned. I may move this \n    functionality to an intermediate class layer that handles shape-matching \n    between encoder/decoder.\n    \"\"\"\n\n    def __call__(self, inputs, initial_state=None):\n        \"\"\"Run the inputs on the encoder and return the output(s).\n\n        Args:\n            inputs: Tensor with shape [batch_size, max_time, embed_size].\n\n        Returns:\n            outputs: Tensor of shape [batch_size, max_time, state_size].\n            state: The final encoder state; shape [batch_size, state_size].\n        \"\"\"\n\n        cell_fw = self.get_cell(\"cell_fw\")\n        cell_bw = self.get_cell(\"cell_bw\")\n        outputs_tuple, final_state_tuple = tf.nn.bidirectional_dynamic_rnn(\n            cell_fw=cell_fw,\n            cell_bw=cell_bw,\n            inputs=inputs,\n            dtype=tf.float32)\n\n        # Create fully connected layer to help get us back to\n        # state size (from the dual state fw-bw).\n        layer = layers_core.Dense(units=self.state_size, use_bias=False)\n\n        def single_state(state):\n            \"\"\"Reshape bidirectional state (via fully connected layer)\n            to state size.\n            \"\"\"\n            if 'LSTM' in self.base_cell:\n                bridged_state = LSTMStateTuple(\n                    c=layer(state[0]),\n                    h=layer(state[1]))\n            else:\n                bridged_state = layer(state)\n            return bridged_state\n\n        # Concatenate each of the tuples fw and bw dimensions.\n        # Now we are dealing with the concatenated \"states\" with dimension:\n        # [batch_size, max_time, state_size * 2].\n        # NOTE: Convention of LSTMCell is that outputs only contain the\n        # the hidden state (i.e. 'h' only, no 'c').\n        outputs = tf.concat(outputs_tuple, -1)\n        outputs = tf.map_fn(layer, outputs)\n\n        # Similarly, combine the tuple of final states, resulting in:\n        # [batch_size, state_size * 2].\n        final_state = tf.concat(final_state_tuple, -1)\n\n        if self.num_layers == 1:\n            final_state = single_state(final_state)\n        else:\n            final_state = tuple([single_state(fs)\n                                 for fs in tf.unstack(final_state)])\n\n        return outputs, final_state\n\n"
  },
  {
    "path": "chatbot/components/input_pipeline.py",
    "content": "import logging\nimport tensorflow as tf\nfrom utils import io_utils\nfrom tensorflow.contrib.training import bucket_by_sequence_length\n\nLENGTHS = {'encoder_sequence_length': tf.FixedLenFeature([], dtype=tf.int64),\n           'decoder_sequence_length': tf.FixedLenFeature([], dtype=tf.int64)}\nSEQUENCES = {'encoder_sequence': tf.FixedLenSequenceFeature([], dtype=tf.int64),\n             'decoder_sequence': tf.FixedLenSequenceFeature([], dtype=tf.int64)}\n\n\nclass InputPipeline:\n    \"\"\"TensorFlow-only input pipeline with parallel enqueuing,\n    dynamic bucketed-batching, and more.\n\n        Overview of pipeline construction:\n            1. Create ops for reading protobuf tfrecords line-by-line.\n            2. Enqueue raw outputs, attach to threads, and parse sequences.\n            3. Organize sequences into buckets of similar lengths, pad, and batch.\n    \"\"\"\n\n    def __init__(self, file_paths, batch_size, capacity=None, is_chatting=False, scope=None):\n        \"\"\"\n        Args:\n            file_paths: (dict) returned by instance of Dataset via Dataset.paths.\n            batch_size: number of examples returned by dequeue op.\n            capacity: maximum number of examples allowed in the input queue at a time.\n            is_chatting: (bool) determines whether we're feeding user input or file inputs.\n        \"\"\"\n        with tf.name_scope(scope, 'input_pipeline') as scope:\n            if capacity is None:\n                self.capacity = max(50 * batch_size, int(1e4))\n                logging.info(\"Input capacity set to %d examples.\" % self.capacity)\n            self.batch_size = batch_size\n            self.paths = file_paths\n            self.control = {'train': 0, 'valid': 1}\n            self.active_data = tf.convert_to_tensor(self.control['train'])\n            self.is_chatting = is_chatting\n            self._user_input = tf.placeholder(tf.int32, [1, None], name='user_input')\n            self._feed_dict = None\n            self._scope = scope\n\n            if not is_chatting:\n                # Create tensors that will store input batches at runtime.\n                self._train_lengths, self.train_batches = self.build_pipeline('train')\n                self._valid_lengths, self.valid_batches = self.build_pipeline('valid')\n\n    def build_pipeline(self, name):\n        \"\"\"Creates a new input subgraph composed of the following components:\n            - Reader queue that feeds protobuf data files.\n            - RandomShuffleQueue assigned parallel-thread queuerunners.\n            - Dynamic padded-bucketed-batching queue for organizing batches in a time and\n              space-efficient manner.\n\n        Args:\n            name: filename prefix for data. See Dataset class for naming conventions.\n\n        Returns:\n            2-tuple (lengths, sequences):\n                lengths: (dict) parsed context feature from protobuf file.\n                Supports keys in LENGTHS.\n                sequences: (dict) parsed feature_list from protobuf file.\n                Supports keys in SEQUENCES.\n        \"\"\"\n        with tf.variable_scope(name + '_pipeline'):\n            proto_text = self._read_line(self.paths[name + '_tfrecords'])\n            context_pair, sequence_pair = self._assign_queue(proto_text)\n            input_length = tf.add(context_pair['encoder_sequence_length'],\n                                  context_pair['decoder_sequence_length'],\n                                  name=name + 'length_add')\n            return self._padded_bucket_batches(input_length, sequence_pair)\n\n    @property\n    def encoder_inputs(self):\n        \"\"\"Determines, via tensorflow control structures, which part of the pipeline to run\n           and retrieve inputs to a Model encoder component. \"\"\"\n        if not self.is_chatting:\n            return self._cond_input('encoder')\n        else:\n            return self._user_input\n\n    @property\n    def decoder_inputs(self):\n        \"\"\"Determines, via tensorflow control structures, which part of the pipeline to run\n           and retrieve inputs to a Model decoder component. \"\"\"\n        if not self.is_chatting:\n            return self._cond_input('decoder')\n        else:\n            # In a chat session, we just give the bot the go-ahead to respond!\n            return tf.convert_to_tensor([[io_utils.GO_ID]])\n\n    @property\n    def user_input(self):\n        return self._user_input\n\n    @property\n    def feed_dict(self):\n        return self._feed_dict\n\n    def feed_user_input(self, user_input):\n        \"\"\"Called by Model instances upon receiving input from stdin.\"\"\"\n        self._feed_dict = {self._user_input.name: user_input}\n\n    def toggle_active(self):\n        \"\"\"Simple callable that toggles active_data between training and validation.\"\"\"\n        def to_valid(): return tf.constant(self.control['valid'])\n        def to_train(): return tf.constant(self.control['train'])\n        self.active_data = tf.cond(tf.equal(self.active_data, self.control['train']),\n                                    to_valid, to_train)\n\n    def _cond_input(self, prefix):\n        with tf.name_scope(self._scope):\n            def train(): return self.train_batches[prefix + '_sequence']\n            def valid(): return self.valid_batches[prefix + '_sequence']\n            return tf.cond(tf.equal(self.active_data, self.control['train']),\n                           train, valid, name=prefix + '_cond_input')\n\n    def _read_line(self, file):\n        \"\"\"Create ops for extracting lines from files.\n\n        Returns:\n            Tensor that will contain the lines at runtime.\n        \"\"\"\n        with tf.variable_scope('reader'):\n            filename_queue = tf.train.string_input_producer([file])\n            reader = tf.TFRecordReader(name='tfrecord_reader')\n            _, next_raw = reader.read(filename_queue, name='read_records')\n        return next_raw\n\n    def _assign_queue(self, proto_text):\n        \"\"\"\n        Args:\n            proto_text: object to be enqueued and managed by parallel threads.\n        \"\"\"\n\n        with tf.variable_scope('shuffle_queue'):\n            queue = tf.RandomShuffleQueue(\n                capacity=self.capacity,\n                min_after_dequeue=10*self.batch_size,\n                dtypes=tf.string, shapes=[()])\n\n            enqueue_op = queue.enqueue(proto_text)\n            example_dq = queue.dequeue()\n\n            qr = tf.train.QueueRunner(queue, [enqueue_op] * 4)\n            tf.train.add_queue_runner(qr)\n\n            _sequence_lengths, _sequences = tf.parse_single_sequence_example(\n                serialized=example_dq,\n                context_features=LENGTHS,\n                sequence_features=SEQUENCES)\n        return _sequence_lengths, _sequences\n\n    def _padded_bucket_batches(self, input_length, data):\n        with tf.variable_scope('bucket_batch'):\n            lengths, sequences = bucket_by_sequence_length(\n                input_length=tf.to_int32(input_length),\n                tensors=data,\n                batch_size=self.batch_size,\n                bucket_boundaries=[8, 16, 32],\n                capacity=self.capacity,\n                dynamic_pad=True)\n        return lengths, sequences\n\n"
  },
  {
    "path": "chatbot/dynamic_models.py",
    "content": "\"\"\"Sequence-to-sequence models with dynamic unrolling and faster embedding \ntechniques.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport sys\nimport time\nimport logging\nimport numpy as np\nimport tensorflow as tf\nfrom chatbot import components\nfrom chatbot.components import bot_ops, Embedder, InputPipeline\nfrom chatbot._models import Model\nfrom utils import io_utils\nfrom pydoc import locate\n\n\nclass DynamicBot(Model):\n    \"\"\" General sequence-to-sequence model for conversations. \n    \n    Will eventually support beam search, and a wider variety of \n    cell options. At present, supports multi-layer encoder/decoders, \n    GRU/LSTM cells, attention, and dynamic unrolling (online decoding included). \n    \n    Additionally, will eventually support biologically inspired mechanisms for \n    learning, such as hebbian-based update rules.\n    \"\"\"\n\n    def __init__(self, dataset, params):\n        \"\"\"Build the model computation graph.\n        \n        Args:\n            dataset: any instance inheriting from data.DataSet.\n            params: dictionary of hyperparameters.\n                    For supported keys, see DEFAULT_FULL_CONFIG.\n                    (chatbot.globals.py)\n        \"\"\"\n\n        self.log = logging.getLogger('DynamicBotLogger')\n        # Let superclass handle common bookkeeping (saving/loading/dir paths).\n        super(DynamicBot, self).__init__(self.log, dataset, params)\n        # Build the model's structural components.\n        self.build_computation_graph(dataset)\n        # Configure training and evaluation.\n        # Note: this is distinct from build_computation_graph for historical\n        # reasons, and I plan on refactoring. Initially, I more or less followed\n        # the feel of Keras for setting up models, but after incorporating the\n        # YAML configuration files, this seems rather unnecessary.\n        self.compile()\n\n    def build_computation_graph(self, dataset):\n        \"\"\"Create the TensorFlow model graph. Note that this only builds the \n        structural components, i.e. nothing related to training parameters,\n        optimization, etc. \n        \n        The main components to be built (in order): \n            1. InputPipeline\n            2. Embedder\n               - single object shared between encoder/decoder.\n               - creates distict embeddings for distinct variable scopes.\n            2. Encoder\n            3. Decoder\n        \"\"\"\n\n        # Grab the model classes (Constructors) specified by user in params.\n        encoder_class = locate(getattr(self, 'encoder.class')) \\\n                        or getattr(components, getattr(self, 'encoder.class'))\n        decoder_class = locate(getattr(self, 'decoder.class')) \\\n                        or getattr(components, getattr(self, 'decoder.class'))\n\n        assert encoder_class is not None, \"Couldn't find requested %s.\" % \\\n                                          self.model_params['encoder.class']\n        assert decoder_class is not None, \"Couldn't find requested %s.\" % \\\n                                          self.model_params['decoder.class']\n\n        # Organize input pipeline inside single node for clean visualization.\n        self.pipeline = InputPipeline(\n            file_paths=dataset.paths,\n            batch_size=self.batch_size,\n            is_chatting=self.is_chatting)\n\n        # Grab the input feeds for encoder/decoder from the pipeline.\n        encoder_inputs = self.pipeline.encoder_inputs\n        self.decoder_inputs = self.pipeline.decoder_inputs\n\n        # Create embedder object -- handles all of your embedding needs!\n        # By passing scope to embedder calls, we can create distinct embeddings,\n        # while storing inside the same embedder object.\n        self.embedder = Embedder(\n            self.vocab_size,\n            self.embed_size,\n            l1_reg=self.l1_reg)\n\n        # Explicitly show required parameters for any subclass of\n        # chatbot.components.base.RNN (e.g. encoders/decoders).\n        # I do this for readability; you can easily tell below which additional\n        # params are needed, e.g. for a decoder.\n        rnn_params = {\n            'state_size': self.state_size,\n            'embed_size': self.embed_size,\n            'num_layers': self.num_layers,\n            'dropout_prob': self.dropout_prob,\n            'base_cell': self.base_cell}\n\n        with tf.variable_scope('encoder'):\n            embedded_enc_inputs = self.embedder(encoder_inputs)\n            # For now, encoders require just the RNN params when created.\n            encoder = encoder_class(**rnn_params)\n            # Apply embedded inputs to encoder for the final (context) state.\n            encoder_outputs, encoder_state = encoder(embedded_enc_inputs)\n\n        with tf.variable_scope(\"decoder\"):\n            embedded_dec_inputs = self.embedder(self.decoder_inputs)\n            # Sneaky. Would be nice to have a \"cleaner\" way of doing this.\n            if getattr(self, 'attention_mechanism', None) is not None:\n                rnn_params['attention_mechanism'] = self.attention_mechanism\n            self.decoder = decoder_class(\n                encoder_outputs=encoder_outputs,\n                vocab_size=self.vocab_size,\n                max_seq_len=dataset.max_seq_len,\n                temperature=self.temperature,\n                **rnn_params)\n\n            # For decoder outpus, we want the full sequence (output sentence),\n            # not simply the last.\n            decoder_outputs, decoder_state = self.decoder(\n                embedded_dec_inputs,\n                initial_state=encoder_state,\n                is_chatting=self.is_chatting,\n                loop_embedder=self.embedder)\n\n        self.outputs = tf.identity(decoder_outputs, name='outputs')\n        # Tag inputs and outputs by name should we want to freeze the model.\n        tf.add_to_collection('freezer', encoder_inputs)\n        tf.add_to_collection('freezer', self.outputs)\n        # Merge any summaries floating around in the aether into one object.\n        self.merged = tf.summary.merge_all()\n\n    def compile(self):\n        \"\"\" TODO: perhaps merge this into __init__?\n        Originally, this function accepted training/evaluation specific \n        parameters. However, since moving the configuration parameters to .yaml \n        files and interfacing with the dictionary, no args are needed here, \n        and thus would mainly be a hassle to have to call before training. \n        \n        Will decide how to refactor this later.\n        \"\"\"\n\n        if not self.is_chatting:\n            with tf.variable_scope(\"evaluation\") as scope:\n                # Loss - target is to predict (as output) next decoder input.\n                # target_labels has shape [batch_size, dec_inp_seq_len - 1]\n                target_labels = self.decoder_inputs[:, 1:]\n                target_weights = tf.cast(target_labels > 0, target_labels.dtype)\n                preds = self.decoder.apply_projection(self.outputs)\n                reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)\n                l1 = tf.reduce_sum(tf.abs(reg_losses))\n\n                if self.sampled_loss:\n                    self.log.info(\"Training with dynamic sampled softmax loss.\")\n                    assert 0 < self.num_samples < self.vocab_size, \\\n                        \"num_samples is %d but should be between 0 and %d\" \\\n                        % (self.num_samples, self.vocab_size)\n\n                    self.loss = bot_ops.dynamic_sampled_softmax_loss(\n                        target_labels,\n                        self.outputs[:, :-1, :],\n                        self.decoder.get_projection_tensors(),\n                        self.vocab_size,\n                        num_samples=self.num_samples) + l1\n                else:\n                    self.loss = tf.losses.sparse_softmax_cross_entropy(\n                        labels=target_labels,\n                        logits=preds[:, :-1, :],\n                        weights=target_weights) + l1\n                    # New loss function I'm experimenting with below:\n                    # I'm suspicious that it may do the same stuff\n                    # under-the-hood as sparse_softmax_cross_entropy,\n                    # but I'm doing speed tests/comparisons to make sure.\n                    #self.loss = bot_ops.cross_entropy_sequence_loss(\n                    #    labels=target_labels,\n                    #    logits=preds[:, :-1, :],\n                    #    weights=target_weights) + l1\n\n                self.log.info(\"Optimizing with %s.\", self.optimizer)\n                self.train_op = tf.contrib.layers.optimize_loss(\n                    loss=self.loss, global_step=self.global_step,\n                    learning_rate=self.learning_rate,\n                    optimizer=self.optimizer,\n                    clip_gradients=self.max_gradient,\n                    summaries=['gradients'])\n\n                # Compute accuracy, ensuring we use fully projected outputs.\n                correct_pred = tf.equal(tf.argmax(preds[:, :-1, :], axis=2),\n                                        target_labels)\n                accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n\n                tf.summary.scalar('accuracy', accuracy)\n                tf.summary.scalar('loss_train', self.loss)\n                self.merged = tf.summary.merge_all()\n                # Note: Important not to merge in the validation loss, since\n                # we don't want to couple it with the training loss summary.\n                self.valid_summ = tf.summary.scalar('loss_valid', self.loss)\n\n        super(DynamicBot, self).compile()\n\n    def step(self, forward_only=False):\n        \"\"\"Run one step of the model, which can mean 1 of the following:\n            1. forward_only == False. \n               - This means we are training.\n               - We do a forward and a backward pass.\n            2. self.is_chatting. \n               - We are running a user's input sentence to generate a response.\n               - We only do a forward pass to get the response (word IDs).\n            3. Otherwise: inference (used for validation)\n               - Do a forward pass, but also compute loss(es) and summaries.\n\n        Args:\n            forward_only: if True, don't perform backward pass \n            (gradient updates).\n\n        Returns:\n            3-tuple: (summaries, step_loss, step_outputs).\n            \n            Qualifications/details for each of the 3 cases:\n            1. If forward_only == False: \n               - This is a training step: 'summaries' are training summaries.\n               - step_outputs = None\n            2. else if self.is_chatting: \n               - summaries = step_loss = None\n               - step_outputs == the bot response tokens\n            3. else (validation):\n               - This is validation: 'summaries' are validation summaries.\n               - step_outputs == None (to reduce computational cost).\n        \"\"\"\n\n        if not forward_only:\n            fetches = [self.merged, self.loss, self.train_op]\n            summaries, step_loss, _ = self.sess.run(fetches)\n            return summaries, step_loss, None\n        elif self.is_chatting:\n            response = self.sess.run(\n                fetches=self.outputs,\n                feed_dict=self.pipeline.feed_dict)\n            return None, None, response\n        else:\n            fetches = [self.valid_summ, self.loss]  # , self.outputs]\n            summaries, step_loss = self.sess.run(fetches)\n            return summaries, step_loss, None\n\n    def train(self, dataset=None):\n        \"\"\"Train bot on inputs until user types CTRL-C or queues run out of data.\n\n        Args:\n            dataset: (DEPRECATED) any instance of the Dataset class. \n            Will be removed soon.\n        \"\"\"\n\n        def perplexity(loss):\n            return np.exp(float(loss)) if loss < 300 else float(\"inf\")\n\n        if dataset is None:\n            dataset = self.dataset\n\n        coord = tf.train.Coordinator()\n        threads = tf.train.start_queue_runners(sess=self.sess, coord=coord)\n\n        # Tell embedder to coordinate with TensorBoard's \"Embedddings\" tab.\n        # This allows us to view words in 3D-projected embedding space.\n        self.embedder.assign_visualizers(\n            self.file_writer,\n            ['encoder', 'decoder'],\n            dataset.paths['vocab'])\n\n        # Note: Calling sleep allows sustained GPU utilization across training.\n        # Without it, GPU has to wait for data to be enqueued more often.\n        print('QUEUE RUNNERS RELEASED.', end=\" \")\n        for _ in range(3):\n            print('.', end=\" \");\n            time.sleep(1);\n            sys.stdout.flush()\n        print('GO!')\n\n        try:\n            avg_loss = avg_step_time = 0.0\n            while not coord.should_stop():\n\n                i_step = self.sess.run(self.global_step)\n\n                start_time = time.time()\n                summaries, step_loss, _ = self.step()\n                # Calculate running averages.\n                avg_step_time += (time.time() - start_time) / self.steps_per_ckpt\n                avg_loss += step_loss / self.steps_per_ckpt\n\n                # Print updates in desired intervals (steps_per_ckpt).\n                if i_step % self.steps_per_ckpt == 0:\n                    # Display averged-training updates and save.\n                    print(\"Step %d:\" % i_step, end=\" \")\n                    print(\"step time = %.3f\" % avg_step_time)\n                    print(\"\\ttraining loss = %.3f\" % avg_loss, end=\"; \")\n                    print(\"training perplexity = %.2f\" % perplexity(avg_loss))\n                    self.save(summaries=summaries)\n\n                    # Toggle data switch and led the validation flow!\n                    self.pipeline.toggle_active()\n                    with self.graph.device('/cpu:0'):\n                        summaries, eval_loss, _ = self.step(forward_only=True)\n                        self.save(summaries=summaries)\n                    self.pipeline.toggle_active()\n                    print(\"\\tValidation loss = %.3f\" % eval_loss, end=\"; \")\n                    print(\"val perplexity = %.2f\" % perplexity(eval_loss))\n                    # Reset the running averages and exit checkpoint.\n                    avg_loss = avg_step_time = 0.0\n\n                if i_step >= self.max_steps:\n                    print(\"Maximum step\", i_step, \"reached.\")\n                    raise SystemExit\n\n        except (KeyboardInterrupt, SystemExit):\n            print(\"Training halted. Cleaning up . . . \")\n            coord.request_stop()\n        except tf.errors.OutOfRangeError:\n            print(\"OutOfRangeError. You have run out of data.\")\n            coord.request_stop()\n        finally:\n            coord.join(threads)\n            self.close(save_current=False, rebuild_for_chat=True)\n\n    def decode(self):\n        \"\"\"Sets up and manages chat session between bot and user (stdin).\"\"\"\n        # Make sure params are set to chat values, just in case the user\n        # forgot to specify/doesn't know about such things.\n        self._set_chat_params()\n        # Decode from standard input.\n        print(\"Type \\\"exit\\\" to exit.\\n\")\n        sentence = io_utils.get_sentence()\n        while sentence != 'exit':\n            response = self(sentence)\n            print(\"Robot:\", response)\n            sentence = io_utils.get_sentence()\n        print(\"Farewell, human.\")\n\n    def __call__(self, sentence):\n        \"\"\"This is how we talk to the bot interactively.\n        \n        While decode(self) above sets up/manages the chat session, \n        users can also use this directly to get responses from the bot, \n        given an input sentence. \n        \n        For example, one could do:\n            sentence = 'Hi, bot!'\n            response = bot(sentence)\n        for a single input-to-response with the bot.\n\n        Args:\n            sentence: (str) Input sentence from user.\n\n        Returns:\n            response string from bot.\n        \"\"\"\n        # Convert input sentence to token-ids.\n        encoder_inputs = io_utils.sentence_to_token_ids(\n            tf.compat.as_bytes(sentence), self.dataset.word_to_idx)\n\n        encoder_inputs = np.array([encoder_inputs[::-1]])\n        self.pipeline.feed_user_input(encoder_inputs)\n        # Get output sentence from the chatbot.\n        _, _, response = self.step(forward_only=True)\n        # response has shape [1, response_length].\n        # Its last element is the EOS_ID, which we don't show user.\n        response = self.dataset.as_words(response[0][:-1])\n        if 'UNK' in response:\n            response = \"I don't know.\"\n        return response\n\n    def chat(self):\n        \"\"\"Alias for decode.\"\"\"\n        self.decode()\n\n    def respond(self, sentence):\n        \"\"\"Alias for __call__. (Suggestion)\"\"\"\n        return self.__call__(sentence)\n\n    def close(self, save_current=True, rebuild_for_chat=True):\n        \"\"\"Before closing, which will freeze our graph to a file,\n        rebuild it so that it's ready for chatting when unfreezed,\n        to make it easier for the user. Training can still be resumed\n        with no issue since it doesn't load frozen models, just ckpts.\n        \"\"\"\n\n        if rebuild_for_chat:\n            lr_val = self.learning_rate.eval(session=self.sess)\n            tf.reset_default_graph()\n            # Gross. Am ashamed:\n            self.sess = tf.Session()\n            with self.graph.name_scope(tf.GraphKeys.SUMMARIES):\n                self.global_step    = tf.Variable(initial_value=0, trainable=False)\n                self.learning_rate  = tf.constant(lr_val)\n            self._set_chat_params()\n            self.build_computation_graph(self.dataset)\n            self.compile()\n        super(DynamicBot, self).close(save_current=save_current)\n\n    def _set_chat_params(self):\n        \"\"\"Set training-specific param values to chatting-specific values.\"\"\"\n        # TODO: use __setattr__ instead of this.\n        self.__dict__['__params']['model_params']['decode'] = True\n        self.__dict__['__params']['model_params']['is_chatting'] = True\n        self.__dict__['__params']['model_params']['batch_size'] = 1\n        self.__dict__['__params']['model_params']['reset_model'] = False\n        self.__dict__['__params']['model_params']['dropout_prob'] = 0.0\n        assert self.is_chatting and self.decode and not self.reset_model\n\n"
  },
  {
    "path": "chatbot/globals.py",
    "content": "\"\"\"Place all default/global chatbot variables here.\"\"\"\n\nimport tensorflow as tf\n\nOPTIMIZERS = {\n    'Adagrad':  tf.train.AdagradOptimizer,\n    'Adam':     tf.train.AdamOptimizer,\n    'SGD':      tf.train.GradientDescentOptimizer,\n    'RMSProp':  tf.train.RMSPropOptimizer,\n}\n\n# All allowed and/or used default configuration values, period.\nDEFAULT_FULL_CONFIG = {\n    \"model\": \"DynamicBot\",\n    \"dataset\": \"Cornell\",\n    \"model_params\": {\n        \"base_cell\": \"GRUCell\",\n        \"ckpt_dir\": \"out\",  # Directory to store training checkpoints.\n        \"decode\": False,\n        \"batch_size\": 256,\n        \"dropout_prob\": 0.2,  # Drop rate applied at encoder/decoders output.\n        \"decoder.class\": \"BasicDecoder\",\n        \"encoder.class\": \"BasicEncoder\",\n        \"embed_size\": 128,\n        \"learning_rate\": 0.002,\n        \"l1_reg\": 1.0e-6,  # L1 regularization applied to word embeddings.\n        \"lr_decay\": 0.98,\n        \"max_gradient\": 5.0,\n        \"max_steps\": int(1e6),  # Max number of training iterations.\n        \"num_layers\": 1,  # Num layers for each of encoder, decoder.\n        \"num_samples\": 512,  # IF sampled_loss is true, default sample size.\n        \"optimizer\": \"Adam\",  # Options are those in OPTIMIZERS above.\n        \"reset_model\": True,\n        \"sampled_loss\": False,  # Whether to do sampled softmax.\n        \"state_size\": 512,\n        \"steps_per_ckpt\": 200,\n        \"temperature\": 0.0,  # Response temp for chat sessions. (default argmax)\n    },\n    \"dataset_params\": {\n        \"data_dir\": None,  # Require user to specify.\n        \"vocab_size\": 40000,\n        \"max_seq_len\": 10,  # Maximum length of sentence used to train bot.\n        \"optimize_params\": True  # Reduce vocab size if exceeds num unique words\n    },\n}\n"
  },
  {
    "path": "chatbot/legacy/__init__.py",
    "content": ""
  },
  {
    "path": "chatbot/legacy/_decode.py",
    "content": "\"\"\"Used by legacy_models for decoding. Not needed by DynamicBot.\"\"\"\n\nimport tensorflow as tf\nimport logging\nimport os\nimport sys\n\nfrom utils import io_utils\nfrom utils.io_utils import sentence_to_token_ids, get_vocab_dicts\nimport numpy as np\n\n\ndef decode(bot, dataset, teacher_mode=True):\n    \"\"\"Runs a chat session between the given chatbot and user.\"\"\"\n\n    # We decode one sentence at a time.\n    bot.batch_size = 1\n    # Decode from standard input.\n    print(\"Type \\\"exit\\\" to exit.\")\n    print(\"Write stuff after the \\\">\\\" below and I, your robot friend, will respond.\")\n    sentence = io_utils.get_sentence()\n    while sentence:\n        # Convert input sentence to token-ids.\n        token_ids = sentence_to_token_ids(tf.compat.as_bytes(sentence), dataset.word_to_idx)\n        # Get output sentence from the chatbot.\n        outputs = decode_inputs(token_ids, dataset.idx_to_word, bot)\n        # Print the chatbot's response.\n        print(outputs)\n        if teacher_mode:\n            print(\"What should I have said?\")\n            feedback = io_utils.get_sentence()\n            feedback_ids = sentence_to_token_ids(tf.compat.as_bytes(feedback), dataset.inputs_to_word)\n            outputs = train_on_feedback(bot, token_ids, feedback_ids, dataset.idx_to_word)\n            print(\"Okay. Let me try again:\\n\", outputs)\n        # Wait for next input.\n        sentence = io_utils.get_sentence()\n        # Stop program if sentence == 'exit\\n'.\n        if sentence == 'exit':\n            print(\"Fine, bye :(\")\n            break\n\n\ndef decode_inputs(inputs, idx_to_word, chatbot):\n    # Which bucket does it belong to?\n    bucket_id = _assign_to_bucket(inputs, chatbot.buckets)\n    # Get a 1-element batch to feed the sentence to the chatbot.\n    data = {bucket_id: [(inputs, [])]}\n    encoder_inputs, decoder_inputs, target_weights = chatbot.get_batch(data, bucket_id)\n    # Get output logits for the sentence.\n    _, _, _, output_logits = chatbot.step(encoder_inputs, decoder_inputs, target_weights, bucket_id, True)\n    # Convert raw output to chat response & print.\n    return _logits_to_outputs(output_logits, chatbot.temperature, idx_to_word)\n\n\ndef train_on_feedback(chatbot, input_ids, feedback_ids, idx_to_outputs):\n    bucket_id = _assign_to_bucket(feedback_ids, chatbot.buckets)\n    data = {bucket_id: [(input_ids, feedback_ids)]}\n    enc_in, dec_in, weights = chatbot.get_batch(data, bucket_id)\n    # Jack up learning rate & make sure robot learned its lesson.\n    chatbot.sess.run(chatbot.learning_rate.assign(0.7))\n    for _ in range(10):\n        # LEARN YOU FOOL, LEARN. :)\n        chatbot.step(enc_in, dec_in, weights, bucket_id, False)\n    return decode_inputs(input_ids, idx_to_outputs, chatbot)\n\n\ndef _logits_to_outputs(output_logits, temperature, idx_word):\n    \"\"\"\n    Args:\n        output_logits: shape is [output_length, [vocab_size]]\n    :return:\n    \"\"\"\n    # outputs = [int(np.argmax(logit, axis=1)) for logit in output_logits]\n    outputs =  [_sample(l, temperature) for l in output_logits]\n    # If there is an EOS symbol in outputs, cut them at that point.\n    if io_utils.EOS_ID in outputs:\n        outputs = outputs[:outputs.index(io_utils.EOS_ID)]\n    outputs = \" \".join([tf.compat.as_str(idx_word[output]) for output in outputs]) + \".\"\n    # Capitalize.\n    outputs = outputs[0].upper() + outputs[1:]\n    return outputs\n\n\ndef _sample(logits, temperature):\n    if temperature < 0.5:\n        return int(np.argmax(logits, axis=1))\n    logits = logits.flatten()\n    logits = logits / temperature\n    logits = np.exp(logits - np.max(logits))\n    logits = logits / np.sum(logits)\n    sampleID = np.argmax(np.random.multinomial(1, logits, 1))\n    while sampleID == io_utils.UNK_ID:\n        sampleID = np.argmax(np.random.multinomial(1, logits, 1))\n    return int(sampleID)\n\n\ndef _assign_to_bucket(token_ids, buckets):\n    \"\"\"Find bucket large enough for token_ids, else warning.\"\"\"\n    bucket_id = len(buckets) - 1\n    for i, bucket in enumerate(buckets):\n        if bucket[0] >= len(token_ids):\n            bucket_id = i\n            break\n    else:\n        logging.warning(\"Sentence longer than  truncated: %s\", len(token_ids))\n    return bucket_id\n"
  },
  {
    "path": "chatbot/legacy/_train.py",
    "content": "\"\"\"Train seq2seq attention chatbot.\nNote: Only used for legacy_models.\nFor (better) DynamicBot implementation, please see dynamic_models.py and, for saving/restoring ops,\nthe base class of all models in _models.py.\n\"\"\"\nimport time\nfrom utils import *\n\ndef train(bot, dataset):\n    \"\"\" Train chatbot using dataset given by dataset.\n        chatbot: instance of ChatBot or SimpleBot.\n    \"\"\"\n\n    # Get data as token-ids.\n    train_set, dev_set = io_utils.read_data(dataset,\n                                            bot.buckets)\n\n    # Interpret train_buckets_scale[i] as [cumulative] frac of samples in bucket i or below.\n    train_buckets_scale = _get_data_distribution(train_set, bot.buckets)\n\n    # This is the training loop.\n    i_step = 0\n    step_time, loss = 0.0, 0.0\n    previous_losses = []\n    try:\n        while True:\n            # Sample a random bucket index according to the data distribution,\n            # then get a batch of data from that bucket by calling chatbot.get_batch.\n            rand = np.random.random_sample()\n            bucket_id = min([i for i in range(len(train_buckets_scale)) if train_buckets_scale[i] > rand])\n\n            # Get a batch and make a step.\n            start_time = time.time()\n            summary, step_loss = run_train_step(bot, train_set, bucket_id, False)\n            step_time += (time.time() - start_time) / bot.steps_per_ckpt\n            loss      += step_loss / bot.steps_per_ckpt\n\n            # Once in a while, we save checkpoint, print statistics, and run evals.\n            if i_step % bot.steps_per_ckpt == 0:\n                run_checkpoint(bot, step_time, loss, previous_losses, dev_set)\n                step_time, loss = 0.0, 0.0\n            i_step += 1\n    except (KeyboardInterrupt, SystemExit):\n        print(\"Training halted. Cleaning up . . . \")\n        # Store the model's graph in ckpt directory.\n        bot.saver.export_meta_graph(bot.ckpt_dir + dataset.name + '.meta')\n        bot.close()\n        print(\"Done.\")\n\n\ndef run_train_step(model, train_set, bucket_id, forward_only=False):\n    encoder_inputs, decoder_inputs, target_weights = model.get_batch(train_set, bucket_id)\n    step_returns = model.step(encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only)\n    summary, _, losses, _ = step_returns\n    if not forward_only and summary is not None:\n        model.train_writer.add_summary(summary, model.global_step.eval(model.sess))\n    return summary, losses\n\n\ndef run_checkpoint(model, step_time, loss, previous_losses, dev_set):\n    # Print statistics for the previous epoch.\n    perplexity = np.exp(float(loss)) if loss < 300 else float(\"inf\")\n    print(\"\\nglobal step:\", model.global_step.eval(model.sess), end=\"  \")\n    print(\"learning rate: %.4f\" %  model.learning_rate.eval(session=model.sess), end=\"  \")\n    print(\"step time: %.2f\" % step_time, end=\"  \")\n    print(\"perplexity: %.2f\" % perplexity)\n\n    # Run evals on development set and print their perplexity.\n    for bucket_id in range(len(model.buckets)):\n        if len(dev_set[bucket_id]) == 0:\n            print(\"  eval: empty bucket %d\" % (bucket_id))\n            continue\n        summary, eval_loss = run_train_step(model, dev_set, bucket_id, forward_only=True)\n        model.save(summaries=summary)\n        eval_ppx = np.exp(float(eval_loss)) if eval_loss < 300 else float(\"inf\")\n        print(\"  eval: bucket %d perplexity %.2f\" % (bucket_id, eval_ppx))\n    sys.stdout.flush()\n\n\ndef _get_data_distribution(train_set, buckets):\n    # Get number of samples for each bucket (i.e. train_bucket_sizes[1] == num-trn-samples-in-bucket-1).\n    train_bucket_sizes = [len(train_set[b]) for b in range(len(buckets))]\n    # The total number training samples, excluding the ones too long for our bucket choices.\n    train_total_size   = float(sum(train_bucket_sizes))\n\n    # Interpret as: train_buckets_scale[i] == [cumulative] fraction of samples in bucket i or below.\n    return [sum(train_bucket_sizes[:i + 1]) / train_total_size\n                     for i in range(len(train_bucket_sizes))]\n\n\n"
  },
  {
    "path": "chatbot/legacy/legacy_models.py",
    "content": "\"\"\"Sequence-to-sequence models.\"\"\"\n\n# EDIT: Modified inheritance strucutre (see _models.py) so these *should* work again.\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\nimport logging\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.contrib.legacy_seq2seq import embedding_attention_seq2seq\nfrom tensorflow.contrib.legacy_seq2seq import model_with_buckets\n#from tensorflow.contrib.rnn.python.ops import core_rnn\nfrom tensorflow.contrib.rnn.python.ops import core_rnn_cell\nfrom tensorflow.python.ops import embedding_ops\nfrom chatbot._models import BucketModel\n\n\nclass ChatBot(BucketModel):\n    \"\"\"Sequence-to-sequence model with attention and for multiple buckets.\n\n    The input-to-output path can be thought of (on a high level) as follows:\n        1. Inputs:      Batches of integer lists, where each integer is a\n                        word ID to a pre-defined vocabulary.\n        2. Embedding:   each input integer is mapped to an embedding vector.\n                        Each embedding vector is of length 'layer_size', an argument to __init__.\n                        The encoder and decoder have their own distinct embedding spaces.\n        3. Encoding:    The embedded batch vectors are fed to a multi-layer cell containing GRUs.\n        4. Attention:   At each timestep, the output of the multi-layer cell is saved, so that\n                        the decoder can access them in the manner specified in the paper on\n                        jointly learning to align and translate. (should give a link to paper...)\n        5. Decoding:    The decoder, the same type of embedded-multi-layer cell\n                        as the encoder, is initialized with the last output of the encoder,\n                        the \"context\". Thereafter, we either feed it a target sequence\n                        (when training) or we feed its previous output as its next input (chatting).\n    \"\"\"\n\n    def __init__(self, buckets, dataset, params):\n\n        logging.basicConfig(level=logging.INFO)\n        logger = logging.getLogger('ChatBotLogger')\n        super(ChatBot, self).__init__(\n            logger=logger,\n            buckets=buckets,\n            dataset=dataset,\n            params=params)\n\n        if len(buckets) > 1:\n            self.log.error(\"ChatBot requires len(buckets) be 1 since tensorflow's\"\n                           \" model_with_buckets function is now deprecated and BROKEN. The only\"\n                           \"workaround is ensuring len(buckets) == 1. ChatBot apologizes.\"\n                           \"ChatBot also wishes it didn't have to be this way. \"\n                           \"ChatBot is jealous that DynamicBot does not have these issues.\")\n            raise ValueError(\"Not allowed to pass buckets with len(buckets) > 1.\")\n\n        # ==========================================================================================\n        # Define basic components: cell(s) state, encoder, decoder.\n        # ==========================================================================================\n\n        #cell =  tf.contrib.rnn.MultiRNNCell([tf.contrib.rnn.GRUCell(state_size)for _ in range(num_layers)])\n        cell = tf.contrib.rnn.GRUCell(self.state_size)\n        self.encoder_inputs = ChatBot._get_placeholder_list(\"encoder\", buckets[-1][0])\n        self.decoder_inputs = ChatBot._get_placeholder_list(\"decoder\", buckets[-1][1] + 1)\n        self.target_weights = ChatBot._get_placeholder_list(\"weight\", buckets[-1][1] + 1, tf.float32)\n        target_outputs = [self.decoder_inputs[i + 1] for i in range(len(self.decoder_inputs) - 1)]\n\n        # If specified, sample from subset of full vocabulary size during training.\n        softmax_loss, output_proj = None, None\n        if 0 < self.num_samples < self.vocab_size:\n            softmax_loss, output_proj = ChatBot._sampled_loss(self.num_samples,\n                                                              self.state_size,\n                                                              self.vocab_size)\n\n        # ==========================================================================================\n        # Combine the components to construct desired model architecture.\n        # ==========================================================================================\n\n        # The seq2seq function: we use embedding for the input and attention.\n        def seq2seq_f(encoder_inputs, decoder_inputs):\n            # Note: the returned function uses separate embeddings for encoded/decoded sets.\n            #           Maybe try implementing same embedding for both.\n            # Question: the outputs are projected to vocab_size NO MATTER WHAT.\n            #           i.e. if output_proj is None, it uses its own OutputProjectionWrapper instead\n            #           --> How does this affect our model?? A bit misleading imo.\n            #with tf.variable_scope(scope or \"seq2seq2_f\") as seq_scope:\n            return embedding_attention_seq2seq(encoder_inputs, decoder_inputs, cell,\n                                               num_encoder_symbols=self.vocab_size,\n                                               num_decoder_symbols=self.vocab_size,\n                                               embedding_size=self.state_size,\n                                               output_projection=output_proj,\n                                               feed_previous=self.is_chatting,\n                                               dtype=tf.float32)\n\n        # Note that self.outputs and self.losses are lists of length len(buckets).\n        # This allows us to identify which outputs/losses to compute given a particular bucket.\n        # Furthermore, \\forall i < j, len(self.outputs[i])  < len(self.outputs[j]). (same for loss)\n        self.outputs, self.losses = model_with_buckets(\n            self.encoder_inputs, self.decoder_inputs,\n            target_outputs, self.target_weights,\n            buckets, seq2seq_f,\n            softmax_loss_function=softmax_loss)\n\n        # If decoding, append _projection to true output to the model.\n        if self.is_chatting and output_proj is not None:\n            self.outputs = ChatBot._get_projections(len(buckets), self.outputs, output_proj)\n\n        with tf.variable_scope(\"summaries\"):\n            self.summaries = {}\n            for i, loss in enumerate(self.losses):\n                name = \"loss{}\".format(i)\n                self.summaries[name] = tf.summary.scalar(\"loss{}\".format(i), loss)\n\n    def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False):\n        \"\"\"Run a step of the model.\n\n        Args:\n          encoder_inputs: list of numpy int vectors to feed as encoder inputs.\n          decoder_inputs: list of numpy int vectors to feed as decoder inputs.\n          target_weights: list of numpy float vectors to feed as target weights.\n          bucket_id: which bucket of the model to use.\n\n        Returns:\n            [summary, gradient_norms, loss, outputs]\n        \"\"\"\n\n        encoder_size, decoder_size = self.buckets[bucket_id]\n        super(ChatBot, self).check_input_lengths(\n            [encoder_inputs, decoder_inputs, target_weights],\n            [encoder_size, decoder_size, decoder_size])\n\n        input_feed = {}\n        for l in range(encoder_size):\n            input_feed[self.encoder_inputs[l].name] = encoder_inputs[l]\n        for l in range(decoder_size):\n            input_feed[self.decoder_inputs[l].name] = decoder_inputs[l]\n            input_feed[self.target_weights[l].name] = target_weights[l]\n        input_feed[self.decoder_inputs[decoder_size].name] = np.zeros([self.batch_size],\n                                                                      dtype=np.int32)\n\n        if not forward_only:  # Not just for decoding; also for validating in training.\n            fetches = [self.summaries[\"loss{}\".format(bucket_id)],\n                       self.apply_gradients[bucket_id],  # Update Op that does SGD.\n                       self.losses[bucket_id]]          # Loss for this batch.\n            outputs = self.sess.run(fetches=fetches, feed_dict=input_feed)\n            return outputs[0], None, outputs[2], None # Summary, no gradients, loss, outputs.\n        else:\n            fetches = [self.losses[bucket_id]]  # Loss for this batch.\n            for l in range(decoder_size):       # Output logits.\n                fetches.append(self.outputs[bucket_id][l])\n            outputs = self.sess.run(fetches=fetches, feed_dict=input_feed)\n            return None, None, outputs[0], outputs[1:] # No summary, no gradients, loss, outputs.\n\n    @staticmethod\n    def _sampled_loss(num_samples, hidden_size, vocab_size):\n        \"\"\"Defines the samples softmax loss op and the associated output _projection.\n        Args:\n            num_samples:     (context: importance sampling) size of subset of outputs for softmax.\n            hidden_size:     number of units in the individual recurrent states.\n            vocab_size: number of unique output words.\n        Returns:\n            sampled_loss, apply_projection\n            - function: sampled_loss(labels, inputs)\n            - apply_projection: transformation to full vocab space, applied to decoder output.\n        \"\"\"\n\n        assert(0 < num_samples < vocab_size)\n\n        # Define the standard affine-softmax transformation from hidden_size -> vocab_size.\n        # True output (for a given bucket) := tf.matmul(decoder_out, w) + b\n        w_t = tf.get_variable(\"proj_w\", [vocab_size, hidden_size], dtype=tf.float32)\n        w = tf.transpose(w_t)\n        b = tf.get_variable(\"proj_b\", [vocab_size], dtype=tf.float32)\n        output_projection = (w, b)\n\n        def sampled_loss(labels, inputs):\n            labels = tf.reshape(labels, [-1, 1])\n            return tf.nn.sampled_softmax_loss(\n                    weights=w_t,\n                    biases=b,\n                    labels=labels,\n                    inputs=inputs,\n                    num_sampled=num_samples,\n                    num_classes=vocab_size)\n\n        return sampled_loss, output_projection\n\n    @staticmethod\n    def _get_projections(num_buckets, unprojected_vals, projection_operator):\n        \"\"\"Apply _projection operator to unprojected_vals, a tuple of length num_buckets.\n\n        :param num_buckets:         the number of projections that will be applied.\n        :param unprojected_vals:    tuple of length num_buckets.\n        :param projection_operator: (in the mathematical meaning) tuple of shape unprojected_vals.shape[-1].\n        :return: tuple of length num_buckets, with entries the same shape as entries in unprojected_vals, except for the last dimension.\n        \"\"\"\n        projected_vals = unprojected_vals\n        for b in range(num_buckets):\n            projected_vals[b] = [tf.matmul(output, projection_operator[0]) + projection_operator[1]\n                                 for output in unprojected_vals[b]]\n        return projected_vals\n\n    @staticmethod\n    def _get_placeholder_list(name, length, dtype=tf.int32):\n        \"\"\"\n        Args:\n            name: prefix of name of each tf.placeholder list item, where i'th name is [name]i.\n            length: number of items (tf.placeholders) in the returned list.\n        Returns:\n            list of tensorflow placeholder of dtype=tf.int32 and unspecified shape.\n        \"\"\"\n        return [tf.placeholder(dtype, shape=[None], name=name+str(i)) for i in range(length)]\n\n\nclass SimpleBot(BucketModel):\n    \"\"\"Primitive implementation from scratch, for learning purposes.\n            1. Inputs: same as ChatBot.\n            2. Embedding: same as ChatBot.\n            3. BasicEncoder: Single GRUCell.\n            4. DynamicDecoder: Single GRUCell.\n    \"\"\"\n\n    def __init__(self, dataset, params):\n\n        # SimpleBot allows user to not worry about making their own buckets.\n        # SimpleBot does that for you. SimpleBot cares.\n        max_seq_len = dataset.max_seq_len\n        buckets = [(max_seq_len // 2,  max_seq_len // 2), (max_seq_len, max_seq_len)]\n        logging.basicConfig(level=logging.INFO)\n        logger = logging.getLogger('SimpleBotLogger')\n        super(SimpleBot, self).__init__(\n            logger=logger,\n            buckets=buckets,\n            dataset=dataset,\n            params=params)\n\n\n        # ==========================================================================================\n        # Create placeholder lists for encoder/decoder sequences.\n        # ==========================================================================================\n\n        with tf.variable_scope(\"placeholders\"):\n            self.encoder_inputs = [tf.placeholder(tf.int32, shape=[None], name=\"encoder\"+str(i))\n                                   for i in range(self.max_seq_len)]\n            self.decoder_inputs = [tf.placeholder(tf.int32, shape=[None], name=\"decoder\"+str(i))\n                                   for i in range(self.max_seq_len+1)]\n            self.target_weights = [tf.placeholder(tf.float32, shape=[None], name=\"weight\"+str(i))\n                                   for i in range(self.max_seq_len+1)]\n\n        # ==========================================================================================\n        # Before bucketing, need to define the underlying model(x, y) -> outputs, state(s).\n        # ==========================================================================================\n\n        def seq2seq(encoder_inputs, decoder_inputs, scope=None):\n            \"\"\"Builds basic encoder-decoder model and returns list of (2D) output tensors.\"\"\"\n            with tf.variable_scope(scope or \"seq2seq\"):\n                encoder_cell = tf.contrib.rnn.GRUCell(self.state_size)\n                encoder_cell = tf.contrib.rnn.EmbeddingWrapper(encoder_cell, self.vocab_size, self.state_size)\n                # BasicEncoder(raw_inputs) -> Embed(raw_inputs) -> [be an RNN] -> encoder state.\n                _, encoder_state = tf.contrib.rnn.static_rnn(encoder_cell, encoder_inputs, dtype=tf.float32)\n                with tf.variable_scope(\"decoder\"):\n\n                    def loop_function(x):\n                        with tf.variable_scope(\"loop_function\"):\n                            params = tf.get_variable(\"embed_tensor\", [self.vocab_size, self.state_size])\n                            return embedding_ops.embedding_lookup(params, tf.argmax(x, 1))\n\n                    _decoder_cell = tf.contrib.rnn.GRUCell(self.state_size)\n                    _decoder_cell = tf.contrib.rnn.EmbeddingWrapper(_decoder_cell, self.vocab_size, self.state_size)\n                    # Dear TensorFlow: you should replace the 'reuse' param in\n                    # OutputProjectionWrapper with 'scope' and just do scope.reuse in __init__.\n                    # sincerely, programming conventions.\n                    decoder_cell = tf.contrib.rnn.OutputProjectionWrapper(\n                        _decoder_cell, self.vocab_size, reuse=tf.get_variable_scope().reuse)\n\n                    decoder_outputs = []\n                    prev = None\n                    decoder_state = None\n\n                    for i, dec_inp in enumerate(decoder_inputs):\n                        if self.is_chatting and prev is not None:\n                            dec_inp = loop_function(tf.reshape(prev, [1, 1]))\n                        if i == 0:\n                            output, decoder_state = decoder_cell(dec_inp, encoder_state,\n                                                                 scope=tf.get_variable_scope())\n                        else:\n                            tf.get_variable_scope().reuse_variables()\n                            output, decoder_state = decoder_cell(dec_inp, decoder_state,\n                                                                 scope=tf.get_variable_scope())\n                        decoder_outputs.append(output)\n                return decoder_outputs\n\n        # ====================================================================================\n        # Now we can build a simple bucketed seq2seq model.\n        # ====================================================================================\n\n        self.losses  = []\n        self.outputs = []\n        values  = self.encoder_inputs + self.decoder_inputs + self.decoder_inputs\n        with tf.name_scope(\"simple_bucket_model\", values):\n            for idx_b, bucket in enumerate(buckets):\n                # Reminder: you should never explicitly set reuse=False. It's a no-no.\n                with tf.variable_scope(tf.get_variable_scope(), reuse=True if idx_b > 0 else None)\\\n                        as bucket_scope:\n                    # The outputs for this bucket are defined entirely by the seq2seq function.\n                    self.outputs.append(seq2seq(\n                        self.encoder_inputs[:bucket[0]],\n                        self.decoder_inputs[:bucket[1]],\n                        scope=bucket_scope))\n                    # Target outputs are just the inputs time-shifted by 1.\n                    target_outputs = [self.decoder_inputs[i + 1]\n                                      for i in range(len(self.decoder_inputs) - 1)]\n                    # Compute loss by comparing outputs and target outputs.\n                    self.losses.append(SimpleBot._simple_loss(self.batch_size,\n                                                              self.outputs[-1],\n                                                    target_outputs[:bucket[1]],\n                                                    self.target_weights[:bucket[1]]))\n\n        with tf.variable_scope(\"summaries\"):\n            self.summaries = {}\n            for i, loss in enumerate(self.losses):\n                name = \"loss{}\".format(i)\n                self.summaries[name] = tf.summary.scalar(\"loss{}\".format(i), loss)\n\n    @staticmethod\n    def _simple_loss(batch_size, logits, targets, weights):\n        \"\"\"Compute weighted cross-entropy loss on softmax(logits).\"\"\"\n        # Note: name_scope only affects names of ops,\n        # while variable_scope affects both ops AND variables.\n        with tf.name_scope(\"simple_loss\", values=logits+targets+weights):\n            log_perplexities = []\n            for l, t, w in zip(logits, targets, weights):\n                cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=t, logits=l)\n                log_perplexities.append(cross_entropy * w)\n        # Reduce via elementwise-sum.\n        log_perplexities = tf.add_n(log_perplexities)\n        # Get weighted-averge by dividing by sum of the weights.\n        log_perplexities /= tf.add_n(weights) + 1e-12\n        return tf.reduce_sum(log_perplexities) / tf.cast(batch_size, tf.float32)\n\n    def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False):\n        \"\"\"Run a step of the model.\n\n        Args:\n          encoder_inputs: list of numpy int vectors to feed as encoder inputs.\n          decoder_inputs: list of numpy int vectors to feed as decoder inputs.\n          target_weights: list of numpy float vectors to feed as target weights.\n          bucket_id: which bucket of the model to use.\n\n        Returns:\n            [summary, gradient_norms, loss, outputs]:\n        \"\"\"\n\n        encoder_size, decoder_size = self.buckets[bucket_id]\n        super(SimpleBot, self).check_input_lengths(\n            [encoder_inputs, decoder_inputs, target_weights],\n            [encoder_size, decoder_size, decoder_size])\n\n        input_feed = {}\n        for l in range(encoder_size):\n            input_feed[self.encoder_inputs[l].name] = encoder_inputs[l]\n        for l in range(decoder_size):\n            input_feed[self.decoder_inputs[l].name] = decoder_inputs[l]\n            input_feed[self.target_weights[l].name] = target_weights[l]\n        input_feed[self.decoder_inputs[decoder_size].name] = np.zeros([self.batch_size], dtype=np.int32)\n\n        # Fetches: the Operations/Tensors we want executed/evaluated during session.run(...).\n        if not forward_only: # Not just for decoding; also for validating in training.\n            fetches = [self.summaries[\"loss{}\".format(bucket_id)],\n                       self.apply_gradients[bucket_id],  # Update Op that does SGD.\n                       self.losses[bucket_id]]          # Loss for this batch.\n            outputs = self.sess.run(fetches=fetches, feed_dict=input_feed)\n            return outputs[0], None, outputs[2], None  # summaries,  No gradient norm, loss, no outputs.\n        else:\n            fetches = [self.losses[bucket_id]]  # Loss for this batch.\n            for l in range(decoder_size):       # Output logits.\n                fetches.append(self.outputs[bucket_id][l])\n            outputs = self.sess.run(fetches=fetches, feed_dict=input_feed)\n            return None, None, outputs[0], outputs[1:]  #No summary,  No gradient norm, loss, outputs.\n"
  },
  {
    "path": "configs/example_attention.yml",
    "content": "model: DynamicBot\ndataset: Cornell\nmodel_params:\n  base_cell: LSTMCell\n  ckpt_dir: out/cornell\n  attention_mechanism: BahdanauAttention\n  decoder.class: AttentionDecoder\n  encoder.class: BasicEncoder\n  batch_size: 256\n  embed_size: 128\n  num_layers: 1\n  state_size: 512\n  steps_per_ckpt: 250\ndataset_params:\n  data_dir: /home/brandon/Datasets/cornell  # Change to your path!\n  vocab_size: 52000\n  max_seq_len: 10\n"
  },
  {
    "path": "configs/example_cornell.yml",
    "content": "model: DynamicBot\ndataset: Cornell\nmodel_params:\n    base_cell: LSTMCell\n    num_layers: 2\n    attention_mechanism: LuongAttention\n    decoder.class: AttentionDecoder\n    encoder.class: BidirectionalEncoder\n    ckpt_dir: out/cornell\ndataset_params:\n    data_dir: /home/brandon/Datasets/cornell # The only truly 'mandatory' parameter.\n    vocab_size: 52000 # Approximately the true number of unique words in the dataset.\n    max_seq_len: 20\n"
  },
  {
    "path": "configs/example_reddit.yml",
    "content": "model: DynamicBot\ndataset: Reddit\nmodel_params:\n  base_cell: GRUCell\n  batch_size: 128\n  embed_size: 128\n  num_layers: 1\n  reset_model: true\n  steps_per_ckpt: 200\n  ckpt_dir: out/reddit/basicReddit\ndataset_params:\n  data_dir: /home/brandon/Datasets/reddit\n  max_seq_len: 15\n  vocab_size: 80000  # HUGE dataset = huge vocabulary.\n\n"
  },
  {
    "path": "configs/example_ubuntu.yml",
    "content": "model: DynamicBot\ndataset: Ubuntu\nmodel_params:\n  base_cell: GRUCell\n  ckpt_dir: out/ubuntu\n  decoder.class: BasicDecoder\n  encoder.class: BasicEncoder\n  num_layers: 2\n  state_size: 512\ndataset_params:\n  data_dir: /home/brandon/Datasets/ubuntu\n  vocab_size: 60000  # Should probably be higher. Ubuntu is noisy.\n  max_seq_len: 12  # Any longer, and output quality is a challenge.\n"
  },
  {
    "path": "configs/ubuntu_basic.yml",
    "content": "model: chatbot.DynamicBot\ndataset: data.Ubuntu\nmodel_params:\n  base_cell: GRUCell\n  ckpt_dir: out/ubuntu/basic\n  decode: False\n  batch_size: 128\n  decoder.class: BasicDecoder\n  encoder.class: BasicEncoder\n  embed_size: 128\n  learning_rate: 0.002\n  num_layers: 1\n  reset_model: True\n  state_size: 512\n  steps_per_ckpt: 100\ndataset_params:\n  data_dir: /home/brandon/Datasets/ubuntu\n  vocab_size: 60000\n  max_seq_len: 12\n  optimize_params: true\n"
  },
  {
    "path": "configs/website_config.yml",
    "content": "# Experimenting with best model params for website.\nmodel: DynamicBot\ndataset: Reddit\nmodel_params:\n  base_cell: LSTMCell\n  batch_size: 128\n  ckpt_dir: out/reddit/website_config\n  dropout_prob: 0.0\n  decoder.class: BasicDecoder\n  encoder.class: BasicEncoder\n  l1_reg: 0.0\n  learning_rate: 0.001\n  embed_size: 128\n  num_layers: 2\n  reset_model: False\n  state_size: 512\n  steps_per_ckpt: 500\ndataset_params:\n  data_dir: /home/brandon/Datasets/reddit    # The only truly 'mandatory' parameter.\n  vocab_size: 40000\n  max_seq_len: 15\n"
  },
  {
    "path": "data/__init__.py",
    "content": "from __future__ import absolute_import\n\nfrom data import data_helper\nfrom data import _dataset\nfrom data import dataset_wrappers\n\nfrom data.data_helper import DataHelper\nfrom data._dataset import Dataset\nfrom data.dataset_wrappers import Cornell, Ubuntu, Reddit, TestData\n\n__all__ = ['Cornell', 'Reddit', 'Ubuntu', 'TestData']\n"
  },
  {
    "path": "data/_dataset.py",
    "content": "\"\"\"ABC for datasets. \"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport logging\nimport numpy as np\nimport tensorflow as tf\nfrom utils import io_utils\nfrom abc import ABCMeta, abstractmethod, abstractproperty\n\nfrom chatbot.globals import DEFAULT_FULL_CONFIG\nDEFAULT_PARAMS = DEFAULT_FULL_CONFIG['dataset_params']\n\n\nclass DatasetABC(metaclass=ABCMeta):\n\n    @abstractmethod\n    def convert_to_tf_records(self, *args):\n        \"\"\"If not found in data dir, will create tfrecords data \n        files from text files.\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def train_generator(self, batch_size):\n        \"\"\"Returns a generator function for batches of batch_size \n        train data.\n        \"\"\"\n        pass\n\n    @abstractmethod\n    def valid_generator(self, batch_size):\n        \"\"\"Returns a generator function for batches of batch_size \n        validation data.\n        \"\"\"\n        pass\n\n    @abstractproperty\n    def word_to_idx(self):\n        \"\"\"Return dictionary map from str -> int. \"\"\"\n        pass\n\n    @abstractproperty\n    def idx_to_word(self):\n        \"\"\"Return dictionary map from int -> str. \"\"\"\n        pass\n\n    @abstractproperty\n    def name(self):\n        \"\"\"Returns name of the dataset as a string.\"\"\"\n        pass\n\n    @abstractproperty\n    def max_seq_len(self):\n        \"\"\"Return the maximum allowed sentence length.\"\"\"\n        pass\n\n\nclass Dataset(DatasetABC):\n\n    def __init__(self, dataset_params):\n        \"\"\"Implements the general of subset of operations that all \n        dataset subclasses can use.\n\n        Args:\n            dataset_params: dictionary of configuration parameters. \n                See DEFAULT_FULL_CONFIG at top of file for supported keys.\n        \"\"\"\n\n        self.__dict__['__params'] = Dataset.fill_params(dataset_params)\n        # We query io_utils to ensure all data files are organized properly,\n        # and io_utils returns the paths to files of interest.\n        id_paths, vocab_path, vocab_size = io_utils.prepare_data(\n            data_dir=self.data_dir,\n            vocab_size=self.vocab_size,\n            optimize=dataset_params.get('optimize_params'),\n            config_path=dataset_params.get('config_path'))\n\n        if vocab_size != self.vocab_size:\n            self.log.info(\"Updating vocab size from %d to %d\",\n                          self.vocab_size, vocab_size)\n            self.vocab_size = vocab_size\n            # Also update the input dict, in case it is used later/elsewhere.\n            dataset_params['vocab_size'] = self.vocab_size\n\n        self.paths = dict()\n        self.paths = {\n            **id_paths,\n            'vocab': vocab_path,\n            'train_tfrecords': None,\n            'valid_tfrecords': None}\n        self._word_to_idx, self._idx_to_word = io_utils.get_vocab_dicts(\n            vocab_path)\n\n        # Create tfrecords file if not located in data_dir.\n        self.convert_to_tf_records('train')\n        self.convert_to_tf_records('valid')\n\n    def convert_to_tf_records(self, prefix='train'):\n        \"\"\"If can't find tfrecords 'prefix' files, creates them.\n\n        Args:\n            prefix: 'train' or 'valid'. Determines which tfrecords to build.\n        \"\"\"\n\n        from_path = self.paths['from_'+prefix]\n        to_path = self.paths['to_'+prefix]\n        tfrecords_fname = (prefix\n                           + 'voc%d_seq%d' % (self.vocab_size, self.max_seq_len)\n                           + '.tfrecords')\n        output_path = os.path.join(self.data_dir, tfrecords_fname)\n        if os.path.isfile(output_path):\n            self.log.info('Using tfrecords file %s' % output_path)\n            self.paths[prefix + '_tfrecords'] = output_path\n            return\n\n        def get_sequence_example(encoder_line, decoder_line):\n            space_needed = max(len(encoder_line.split()), len(decoder_line.split()))\n            if space_needed > self.max_seq_len:\n                return None\n\n            example  = tf.train.SequenceExample()\n            encoder_list = [int(x) for x in encoder_line.split()]\n            decoder_list = [io_utils.GO_ID] \\\n                           + [int(x) for x in decoder_line.split()] \\\n                           + [io_utils.EOS_ID]\n\n            # Why tensorflow . . . why . . .\n            example.context.feature['encoder_sequence_length'].int64_list.value.append(\n                len(encoder_list))\n            example.context.feature['decoder_sequence_length'].int64_list.value.append(\n                len(decoder_list))\n\n            encoder_sequence = example.feature_lists.feature_list['encoder_sequence']\n            decoder_sequence = example.feature_lists.feature_list['decoder_sequence']\n            for e in encoder_list:\n                encoder_sequence.feature.add().int64_list.value.append(e)\n            for d in decoder_list:\n                decoder_sequence.feature.add().int64_list.value.append(d)\n\n            return example\n\n        with tf.gfile.GFile(from_path, mode=\"r\") as encoder_file:\n            with tf.gfile.GFile(to_path, mode=\"r\") as decoder_file:\n                with tf.python_io.TFRecordWriter(output_path) as writer:\n                    encoder_line = encoder_file.readline()\n                    decoder_line = decoder_file.readline()\n                    while encoder_line and decoder_line:\n                        sequence_example = get_sequence_example(\n                            encoder_line,\n                            decoder_line)\n                        if sequence_example is not None:\n                            writer.write(sequence_example.SerializeToString())\n                        encoder_line = encoder_file.readline()\n                        decoder_line = decoder_file.readline()\n\n        self.log.info(\"Converted text files %s and %s into tfrecords file %s\" \\\n                      % (os.path.basename(from_path),\n                         os.path.basename(to_path),\n                         os.path.basename(output_path)))\n        self.paths[prefix + '_tfrecords'] = output_path\n\n    def sentence_generator(self, prefix='from'):\n        \"\"\"Yields (as words) single sentences from training data, \n        for testing purposes.\n        \"\"\"\n        self.log.info(\"Generating sentences from %s\", self.paths[prefix+'_train'])\n        with tf.gfile.GFile(self.paths[prefix+'_train'], mode=\"r\") as f:\n            sentence = self.as_words(\n                list(map(int, f.readline().strip().lower().split())))\n            while sentence:\n                yield sentence\n                sentence = self.as_words(\n                    list(map(int, f.readline().strip().lower().split())))\n\n    def pairs_generator(self, num_generate=None):\n        in_sentences = self.sentence_generator('from')\n        in_sentences = [s for s in in_sentences]\n        out_sentences = self.sentence_generator('to')\n        out_sentences = [s for s in out_sentences]\n\n        if num_generate is None:\n            num_generate = len(in_sentences)\n\n        count = 0\n        for in_sent, out_sent in zip(in_sentences, out_sentences):\n            yield in_sent, out_sent\n\n            count += 1\n            if count >= num_generate:\n                break\n\n    def train_generator(self, batch_size):\n        \"\"\"[Note: not needed by DynamicBot since InputPipeline]\"\"\"\n        return self._generator(\n            self.paths['from_train'],\n            self.paths['to_train'],\n            batch_size)\n\n    def valid_generator(self, batch_size):\n        \"\"\"[Note: not needed by DynamicBot since InputPipeline]\"\"\"\n        return self._generator(\n            self.paths['from_valid'],\n            self.paths['to_valid'],\n            batch_size)\n\n    def _generator(self, from_path, to_path, batch_size):\n        \"\"\"(Used by BucketModels only). Returns a generator function that \n        reads data from file, and yields shuffled batches.\n\n        Args:\n            from_path: full path to file for encoder inputs.\n            to_path: full path to file for decoder inputs.\n            batch_size: number of samples to yield at once.\n        \"\"\"\n\n        def longest_sentence(enc_list, dec_list):\n            max_enc_len = max([len(s) for s in enc_list])\n            max_dec_len = max([len(s) for s in dec_list])\n            return max(max_enc_len, max_dec_len)\n\n        def padded_batch(encoder_tokens, decoder_tokens):\n            max_sent_len = longest_sentence(encoder_tokens, decoder_tokens)\n            encoder_batch = np.array(\n                [s + [io_utils.PAD_ID] * (max_sent_len - len(s))\n                 for s in encoder_tokens])[:, ::-1]\n            decoder_batch = np.array(\n                [s + [io_utils.PAD_ID] * (max_sent_len - len(s))\n                 for s in decoder_tokens])\n            return encoder_batch, decoder_batch\n\n        encoder_tokens = []\n        decoder_tokens = []\n        with tf.gfile.GFile(from_path, mode=\"r\") as source_file:\n            with tf.gfile.GFile(to_path, mode=\"r\") as target_file:\n\n                source, target = source_file.readline(), target_file.readline()\n                while source and target:\n\n                    # Skip sentence pairs that are too long for specifications.\n                    space_needed = max(len(source.split()), len(target.split()))\n                    if space_needed > self.max_seq_len:\n                        source, target = source_file.readline(), target_file.readline()\n                        continue\n\n                    # Reformat token strings to token lists.\n                    # Note: GO_ID is prepended by the chat bot, since it\n                    # determines whether or not it's responsible for responding.\n                    encoder_tokens.append([int(x) for x in source.split()])\n                    decoder_tokens.append(\n                        [int(x) for x in target.split()] + [io_utils.EOS_ID])\n\n                    # Have we collected batch_size number of sentences?\n                    # If so, pad & yield.\n                    assert len(encoder_tokens) == len(decoder_tokens)\n                    if len(encoder_tokens) == batch_size:\n                        yield padded_batch(encoder_tokens, decoder_tokens)\n                        encoder_tokens = []\n                        decoder_tokens = []\n                    source, target = source_file.readline(), target_file.readline()\n\n                # Don't forget to yield the 'leftovers'!\n                assert len(encoder_tokens) == len(decoder_tokens)\n                assert len(encoder_tokens) <= batch_size\n                if len(encoder_tokens) > 0:\n                    yield padded_batch(encoder_tokens, decoder_tokens)\n\n    @property\n    def word_to_idx(self):\n        \"\"\"Return dictionary map from str -> int. \"\"\"\n        return self._word_to_idx\n\n    @property\n    def idx_to_word(self):\n        \"\"\"Return dictionary map from int -> str. \"\"\"\n        return self._idx_to_word\n\n    def as_words(self, sentence):\n        \"\"\"Convert list of integer tokens to a single sentence string.\"\"\"\n\n        words = []\n        for token in sentence:\n            word = self.idx_to_word[token]\n            try:\n                word = tf.compat.as_str(word)\n            except UnicodeDecodeError:\n                logging.error(\"UnicodeDecodeError on (token, word): \"\n                              \"(%r, %r)\", token, word)\n                word = str(word)\n            words.append(word)\n\n        words = \" \".join(words)\n        #words = \" \".join([tf.compat.as_str(self.idx_to_word[i]) for i in sentence])\n        words = words.replace(' , ', ', ').replace(' .', '.').replace(' !', '!')\n        words = words.replace(\" ' \", \"'\").replace(\" ?\", \"?\")\n        if len(words) < 2:\n            return words\n        return words[0].upper() + words[1:]\n\n    @property\n    def name(self):\n        \"\"\"Returns name of the dataset as a string.\"\"\"\n        return self._name\n\n    @property\n    def train_size(self):\n        raise NotImplemented\n\n    @property\n    def valid_size(self):\n        raise NotImplemented\n\n    @property\n    def max_seq_len(self):\n        return self._max_seq_len\n\n    @staticmethod\n    def fill_params(dataset_params):\n        \"\"\"Assigns default values from DEFAULT_FULL_CONFIG \n        for keys not in dataset_params.\"\"\"\n        if 'data_dir' not in dataset_params:\n            raise ValueError('data directory not found in dataset_params.')\n        return {**DEFAULT_PARAMS, **dataset_params}\n\n    def __getattr__(self, name):\n        if name not in self.__dict__['__params']:\n            raise AttributeError(name)\n        else:\n            return self.__dict__['__params'][name]\n\n"
  },
  {
    "path": "data/data_helper.py",
    "content": "\"\"\"Provides pre-processing functionality.\n\nAbstracts paths and filenames so we don't have to think about them. Currently,\nin use by Brandon, but will extend to general users in the future.\n\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport re\nimport pdb\nimport sys\nimport json\nimport logging\nimport tempfile\nfrom pprint import pprint\nfrom subprocess import Popen, PIPE\n\nimport pandas as pd\nimport numpy as np\nfrom pympler.asizeof import asizeof          # for profiling memory usage\n\n# Absolute path to this file.\n_WORD_SPLIT = re.compile(r'([.,!?\\\"\\':;)(])|\\s')\nHERE = os.path.dirname(os.path.realpath(__file__))\nDATA_ROOTS = {\n    'brandon': '/home/brandon/Datasets/reddit',\n    'ivan': '/Users/ivan/Documents/sp_17/reddit_data',\n    'mitch': '/Users/Mitchell/Documents/Chatbot/RedditData',\n    'george': '/Users/George/Documents/ChatbotData/reddit'\n}\n# Maximum memory usage allowed (in GiB).\nMAX_MEM = 2.0\n\n\ndef prompt(text, default=\"\", required=False):\n    print(\"%s (default=%r): \" % (text, default), end=\"\")\n    errors = 0\n    userinput = input()\n    while not userinput and required:\n        errors += 1\n        userinput = input(\"C'mon dude, be serious%s \" % (\n            ':' if errors <= 1 else ('!' * errors)))\n    return userinput or default\n\n\nclass DataHelper:\n    \"\"\"Manages file locations and computing resource during preprocessing.\n\n    This interacts directly with the user and double-checks their work; It makes it\n    harder for you to screw up.\n    \"\"\"\n\n    def __init__(self, log_level=logging.INFO):\n        \"\"\" Establish some baseline data with the user.\n        \"\"\"\n        self.logfile = tempfile.NamedTemporaryFile(\n            mode='w', prefix='data_helper', delete=False)\n        self.logfile.close()\n        logging.basicConfig(filename=self.logfile.name, level=log_level)\n        print(\"Using logfile:\", self.logfile.name)\n\n        self.file_counter = 0   # current file we're processing\n        self._word_freq = None  # temporary: for parallelizing frequency dict\n\n        print(\"Hi, I'm a DataHelper. For now, I help with the reddit dataset.\")\n        print(\"At any prompt, press ENTER if you want the default value.\")\n\n        # 1. Get user name. We can associate info with a given user as we go.\n        user = prompt(\"Username\", default=\"brandon\").lower()\n        if user not in DATA_ROOTS:\n            print(\"I don't recognize you, %s.\" % user)\n            self.data_root = prompt(\"Please give me the path to your data:\",\n                                    required=True)\n        else:\n            self.data_root = DATA_ROOTS[user]\n\n        print(\"Hello, %s, I've set your data root to %s\" % (user, self.data_root))\n\n        # 2. Get absolute paths to all data filenames in self.file_paths.\n        self.file_paths = []\n        years = prompt(\"Years to process\", default=\"2007,2008,2009\")\n        # Secretly supports passing a range too. Shhhh.\n        if '-' in years:\n            years = list(map(int, years.split('-')))\n            years = list(range(years[0], years[1]+1))\n            years = list(map(str, years))\n        else:\n            years = years.split(',')\n        for y in years:\n            # The path is: $ROOT/raw_data/$YEAR\n            # Add the entirety of the directory to the file paths.\n            base_path = os.path.join(self.data_root, 'raw_data', y)\n            rel_paths = os.listdir(base_path)\n            self.file_paths.extend([\n                os.path.join(base_path, f) for f in rel_paths \\\n                if not f.endswith(\".bz2\")\n            ])\n\n        self._next_file_path = self.file_paths[0]\n        print(\"These are the files I found:\")\n        pprint(self.file_paths)\n        print()\n\n        _max_mem = prompt(\"Maximum memory to use (in GiB)\", \"%.2f\" % MAX_MEM)\n        try:\n            self.max_mem = float(_max_mem)\n        except ValueError:\n            print(\"C'mon dude, get it together!\")\n\n    def safe_load(self):\n        \"\"\" Load data while keeping an eye on memory usage.\"\"\"\n\n        if self.file_counter >= len(self.file_paths):\n            print(\"No more files to load!\")\n            return None\n\n        # For in-place appending.\n        # S.O.: https://stackoverflow.com/questions/20906474/\n        list_ = []  # real descriptive :)\n        for i in range(self.file_counter, len(self.file_paths)):\n            # lines=True means \"read as json-object-per-line.\"\n            list_.append(pd.read_json(self.file_paths[i], lines=True))\n\n            mem_usage = float(asizeof(list_)) / 1e9\n            logging.info(\"Data list has size %.3f GiB\", mem_usage)\n            logging.info(\"Most recent file loaded: %s\", self.file_paths[i])\n            print(\"\\rLoaded file\", self.file_paths[i], end=\"\")\n            sys.stdout.flush()\n            if mem_usage > self.max_mem:\n                print(\"\\nPast max capacity:\", mem_usage,\n                      \"Leaving data collection early.\")\n                logging.warning('Terminated data loading after '\n                                'reading %d files.', i + 1)\n                logging.info('Files read into df: %r', self.file_paths[:i+1])\n                break\n        print()\n\n        # If the user decides they want to continue loading later\n        # (when memory frees up), we want the file_counter set so that it\n        # starts on the next file.\n        self.file_counter = i + 1\n        self._next_file_path = self.file_paths[self.file_counter]\n\n        df = pd.concat(list_).reset_index()\n        logging.info(\"Number of lines in raw data file: %r\", len(df.index))\n        logging.info(\"Column names from raw data file: %r\", df.columns)\n        logging.info(\"DataHelper.safe_load: df.head() = %r\", df.head())\n        return df\n\n    def load_random(self, year=None):\n        \"\"\"Load a random data file and return as a DataFrame.\n        \n        Args:\n            year: (int) If given, get a random file from this year.\n        \"\"\"\n\n        files = self.file_paths\n        if year is not None:\n            files = list(filter(lambda f: str(year) in f, files))\n\n        rand_index = np.random.randint(low=0, high=len(files))\n        print('Returning data from file:\\n', files[rand_index])\n        return pd.read_json(files[rand_index], lines=True)\n\n    def load_next(self):\n        if self.next_file_path is None:\n            logging.warning('Tried loading next file but no files remain.')\n            return None\n\n        df = pd.read_json(self.next_file_path, lines=True)\n        self.file_counter += 1\n        if self.file_counter < len(self.file_paths):\n            self._next_file_path = self.file_paths[self.file_counter]\n        else:\n            self._next_file_path = None\n        return df\n\n    def set_word_freq(self, wf):\n        \"\"\"Hacky (temporary) fix related to multiprocessing.Pool complaints\n        for the reddit preprocessing script.\n        \"\"\"\n        self._word_freq = wf\n\n    @property\n    def word_freq(self):\n        return self._word_freq\n\n    @property\n    def next_file_path(self):\n        return self._next_file_path\n\n    def get_year_from_path(self, path):\n        year = path.strip('/').split('/')[-2]\n        try:\n            _ = int(year)\n        except ValueError:\n            logging.warning(\"Couldn't get year from file path. Your directory\"\n                            \" structure is unexpected.\")\n            return None\n        logging.info('Extracted year %s', year)\n        return year\n\n    def generate_files(self,\n                       from_file_path,\n                       to_file_path,\n                       root_to_children,\n                       comments_dict):\n        \"\"\"Generates two files, [from_file_path] and [to_file_path] \n        of 1-1 comments.\n        \"\"\"\n        from_file_path = os.path.join(self.data_root, from_file_path)\n        to_file_path = os.path.join(self.data_root, to_file_path)\n        print(\"Writing data files:\\n\", from_file_path, \"\\n\", to_file_path)\n\n        with open(from_file_path, 'w') as from_file:\n            with open(to_file_path, 'w') as to_file:\n                for root_ID, child_IDs in root_to_children.items():\n                    for child_ID in child_IDs:\n                        try:\n                            from_file.write(comments_dict[root_ID].strip() + '\\n')\n                            to_file.write(comments_dict[child_ID].strip() + '\\n')\n                        except KeyError:\n                            pass\n\n        (num_samples, stderr) = Popen(\n            ['wc', '-l', from_file_path], stdout=PIPE).communicate()\n        num_samples = int(num_samples.strip().split()[0])\n\n        print(\"Final processed file has %d samples total.\" % num_samples)\n\n        # First make sure user has copy of bash script we're about to use.\n        # os.popen('cp %s %s' % (os.path.join(HERE, 'split_into_n.sh'), self.data_root))\n        # Split data into 90% training and 10% validation.\n        # os.popen('bash %s %d' % (os.path.join(self.data_root, 'split_into_n.sh'),\n        #                        0.1 * num_samples))\n\n    def df_generator(self):\n        \"\"\" Generates df from single files at a time.\"\"\"\n        for i in range(len(self.file_paths)):\n            df = pd.read_json(self.file_paths[i], lines=True)\n            init_num_rows = len(df.index)\n            logging.info(\"Number of lines in raw data file: %r\" % init_num_rows)\n            logging.info(\"Column names from raw data file: %r\"  % df.columns)\n            yield df\n\n    @staticmethod\n    def random_rows_generator(num_rows_per_print, num_rows_total):\n        \"\"\" Fun generator for viewing random comments (rows) in dataframes.\"\"\"\n        num_iterations = num_rows_total // num_rows_per_print\n        shuffled_indices = np.arange(num_rows_per_print * num_iterations)\n        np.random.shuffle(shuffled_indices)\n        for batch in shuffled_indices.reshape(num_iterations, num_rows_per_print):\n            yield batch\n\n    @staticmethod\n    def word_tokenizer(sentences):\n        \"\"\" Tokenizes sentence / list of sentences into word tokens.\"\"\"\n        # Minor optimization: pre-create the list and fill it.\n        tokenized = [None for _ in range(len(sentences))]\n        for i in range(len(sentences)):\n            tokenized[i] = [\n                w for w in _WORD_SPLIT.split(sentences[i].strip()) if w\n            ]\n\n        return tokenized\n\n    @staticmethod\n    def df_to_json(df, target_file=None, orient='records', lines=False, **kwargs):\n        \"\"\"Converts dataframe to json object in the intuitive way, i.e.\n        each row is converted to a json object, where columns are properties. If\n        target_file is not None, then each such object is saved as a line in the\n        target_file. Helpful because pandas default args are NOT this behavior.\n        \n        Note: Setting lines=True can result in some problems when trying to reload\n        the file. Setting lines=False, while makes an essentially unreadable (for humans)\n        output file, it at least reproduces the saved dataframe upon loading via\n            df_reloaded = pd.read_json(target_file)\n        \n        Args:\n            df: Pandas DataFrame.\n            orient: \n            lines: whether or not to save rows on their own line or writing full file to\n                single line.\n            target_file: Where to save the json-converted df. \n                If None, just return the json object.\n            kwargs: any additional named params the user wishes to pass to df.to_json.\n        \"\"\"\n\n        if target_file is None:\n            return df.to_json(orient=orient, lines=lines, **kwargs)\n        df.to_json(path_or_buf=target_file, orient=orient, lines=lines, **kwargs)\n"
  },
  {
    "path": "data/dataset_wrappers.py",
    "content": "\"\"\"Named data wrapper classes. No added functionality to dataset base class for now,\nbut preprocessing checks will be incorporated into each when it's time.\n\"\"\"\n\nimport logging\nimport os\n\nfrom data._dataset import Dataset\n\n\ndef check_data(abs_path, name):\n    \"\"\"All dataset wrappers call this as a quick sanity check.\"\"\"\n\n    if abs_path is None:\n        raise ValueError('No data directory found in dataset_wrappers.check_data.'\n                         'Either specify data_dir or use io_utils.parse_config.')\n\n    if os.path.basename(abs_path) != name:\n        print(\"Data directory %s does not match dataset name %s.\" % (abs_path, name))\n        propose_path = os.path.join(os.path.dirname(abs_path), name.lower())\n        print(\"Would you like me to change data_dir to {}? [y/n] \".format(propose_path))\n        answer = input()\n        if answer == 'y':\n            return propose_path\n        else:\n            raise ValueError(\"Rejected path change. Terminating program.\")\n    return abs_path\n\n\nclass Cornell(Dataset):\n    \"\"\"Movie dialogs.\"\"\"\n\n    def __init__(self, dataset_params):\n        self._name = \"cornell\"\n        self.log = logging.getLogger('CornellLogger')\n        dataset_params['data_dir'] = check_data(\n            dataset_params.get('data_dir'),\n            self.name)\n        super(Cornell, self).__init__(dataset_params)\n\n\nclass Ubuntu(Dataset):\n    \"\"\"Technical support chat logs from IRC.\"\"\"\n\n    def __init__(self, dataset_params):\n        self._name = \"ubuntu\"\n        self.log = logging.getLogger('UbuntuLogger')\n        dataset_params['data_dir'] = check_data(\n            dataset_params.get('data_dir'),\n            self.name)\n        super(Ubuntu, self).__init__(dataset_params)\n\n\nclass Reddit(Dataset):\n    \"\"\"Reddit comments from 2007-2015.\"\"\"\n\n    def __init__(self, dataset_params):\n        self._name = \"reddit\"\n        self.log = logging.getLogger('RedditLogger')\n        dataset_params['data_dir'] = check_data(\n            dataset_params.get('data_dir'),\n            self.name)\n        super(Reddit, self).__init__(dataset_params)\n\n\nclass TestData(Dataset):\n    \"\"\"Mock dataset with a handful of sentences.\"\"\"\n\n    def __init__(self, dataset_params):\n        self.log = logging.getLogger('TestDataLogger')\n        self._name = \"test_data\"\n        dataset_params['data_dir'] = check_data(\n            dataset_params.get('data_dir'),\n            self.name)\n        super(TestData, self).__init__(dataset_params)\n"
  },
  {
    "path": "data/reddit_preprocessor.py",
    "content": "﻿\"\"\"Reddit data preprocessing.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport time\nfrom functools import wraps\nfrom itertools import chain\nfrom collections import Counter, defaultdict\nfrom multiprocessing import Pool\n\nimport numpy as np\nimport pandas as pd\nfrom data.data_helper import DataHelper\nfrom data.regex import regex_replace, contractions\nfrom nltk.corpus import wordnet\n\n\n# Global helper object that helps abstract away locations of\n# files & directories, and keeps an eye on memory usage.\nif __name__ == '__main__':\n    data_helper = DataHelper()\nelse:\n    data_helper = None\n# Max number of words in any saved sentence.\nMAX_SEQ_LEN = 20\n# Number of CPU cores available.\nNUM_CORES = 2\n# How many chunks we should split dataframes into at any given time.\nNUM_PARTITIONS = 64\n\n\ndef timed_function(*expected_args):\n    \"\"\"Simple decorator to show how long the functions take to run.\"\"\"\n    def decorator(fn):\n        @wraps(fn)\n        def wrapper(*args, **kwargs):\n            start_time = time.time()\n            res = fn(*args, **kwargs)\n            stop_time = time.time()\n            fname = expected_args[0]\n            print(\"Time to run %s: %.3f seconds.\" %\n                  (fname, stop_time - start_time))\n            return res\n        return wrapper\n    return decorator\n\n\n@timed_function('parallel_map_df')\ndef parallel_map_df(fn, df):\n    \"\"\" Based on great explanation from 'Pandas in Parallel' (racketracer.com).\n    \"\"\"\n    df = np.array_split(df, NUM_PARTITIONS)\n    pool = Pool(NUM_CORES)\n    df = pd.concat(pool.map(fn, df))\n    pool.close()\n    pool.join()\n    return df\n\n\n@timed_function('parallel_map_list')\ndef parallel_map_list(fn, iterable):\n    \"\"\" Based on great explanation from 'Pandas in Parallel' (racketracer.com).\n    \"\"\"\n    iterable = np.array_split(iterable, NUM_PARTITIONS)\n    pool = Pool(NUM_CORES)\n    iterable = np.concatenate(pool.map(fn, iterable))\n    pool.close()\n    pool.join()\n    return iterable\n\n\ndef sentence_score(sentences):\n    word_freq = data_helper.word_freq\n    scores = []\n    for sentence in sentences:\n        word_count = len(sentence) + 1e-20\n        sent_score = sum([1.0 / ((word_freq[w] + 1e-20) * word_count)\n                      for w in sentence if not wordnet.synsets(w)])\n        scores.append(sent_score)\n    return scores\n\n\ndef root_comments(df):\n    \"\"\" Builds a list determining which rows of df are root comments.\n\n    Returns:\n        list of length equal to the number of rows in our data frame.\n    \"\"\"\n    root_value = []\n    # Iterate over DataFrame rows as namedtuples,\n    # with index value as first element of the tuple.\n    for row in df.itertuples():\n        root_value.append(row.parent_id == row.link_id)\n    return root_value\n\n\n@timed_function('remove_extra_columns')\ndef remove_extra_columns(df):\n    \"\"\"Throw away columns we don't need and misc. style formatting.\"\"\"\n    df['root'] = root_comments(df)\n    df = df[['author', 'body', 'link_id', 'parent_id', 'name', 'root', 'subreddit']]\n    df.style.set_properties(subset=['body'], **{'width': '500px'})\n    df.style.set_properties(**{'text-align': 'left'})\n    df.head()\n    return df\n\n\n@timed_function('regex_replacements')\ndef regex_replacements(df):\n    # Remove comments that are '[deleted]'.\n    df = df.loc[df.body != '[deleted]'].reset_index(drop=True)\n    df.style.set_properties(subset=['body'], **{'width': '800px'})\n\n    # Make all comments lowercase to help reduce vocab size.\n    df['body'] = df['body'].map(lambda s: s.strip().lower())\n\n    # Loop over regex replacements specified by modify_list.\n    for regex in regex_replace:\n        df['body'].replace(\n            {regex: regex_replace[regex]},\n            regex=True,\n            inplace=True)\n\n    return df\n\n\n@timed_function('remove_large_comments')\ndef remove_large_comments(max_len, df):\n    # Could probably do a regex find on spaces to make this faster.\n    df = df[df['body'].map(lambda s: len(s.split())) < max_len].reset_index(drop=True)\n    return df\n\n\n@timed_function('expand_contractions')\ndef expand_contractions(df):\n    \"\"\" Replace all contractions with their expanded chat_form.\n    \n    Note: contractions is dict(contraction -> expanded form)\n    \"\"\"\n    for c in contractions:\n        df['body'].replace({c: contractions[c]}, regex=True, inplace=True)\n    return df\n\n\n@timed_function('children_dict')\ndef children_dict(df):\n    \"\"\" Returns a dictionary with keys being the root comments and\n    values being their immediate root_to_children. Assumes that df has 'root' column.\n\n    Go through all comments. If it is a root, skip it since they wont have a parent_id\n    that corresponds to a comment.\n    \"\"\"\n    children = defaultdict(list)\n    for row in df.itertuples():\n        if row.root == False:\n            children[row.parent_id].append(row.name)\n    return children\n\n\ndef main():\n    \"\"\"Processes each file individually through the whole pipeline.\n    \n    This decision was made due to the very large (many larger than 5 Gb) files.\n    I have scripts that combine the output files, and I plan on making those\n    available soon (very basic). \n    \"\"\"\n\n    current_file = data_helper.next_file_path\n    df = data_helper.load_next()\n    while df is not None:\n\n        # Execute preprocessing steps on current_file's dataframe.\n        df = remove_extra_columns(df)\n        df = regex_replacements(df)\n        df = remove_large_comments(max_len=MAX_SEQ_LEN, df=df)\n        df = expand_contractions(df)\n\n        sentences = parallel_map_list(fn=DataHelper.word_tokenizer, iterable=df.body.values)\n        data_helper.set_word_freq(Counter(chain.from_iterable(sentences)))\n\n        print('Bout to score!')\n        df['score'] = parallel_map_list(fn=sentence_score, iterable=sentences)\n        del sentences\n\n        # Keep the desired percentage of lowest-scored sentences. (low == good)\n        keep_best_percent = 0.8\n        df = df.loc[df['score'] < df['score'].quantile(keep_best_percent)]\n\n        print('Prepping for the grand finale.')\n        comments_dict = pd.Series(df.body.values, index=df.name).to_dict()\n        root_to_children = children_dict(df)\n        file_basename = os.path.join('processed_data',\n                                     data_helper.get_year_from_path(current_file),\n                                     os.path.basename(current_file))\n        data_helper.generate_files(\n            from_file_path=\"{}_encoder.txt\".format(file_basename),\n            to_file_path=\"{}_decoder.txt\".format(file_basename),\n            root_to_children=root_to_children,\n            comments_dict=comments_dict)\n\n        # Prep for next loop.\n        current_file = data_helper.next_file_path\n        df = data_helper.load_next()\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "data/regex.py",
    "content": "regex_replace = {\n    (r\"https?:\\/\\/\"\n     r\"(www\\.)?\"\n     r\"[^\\s\\.]+\"\n     r\"\\.\\S{2,}\"): \"<link>\",             # Raw link.\n    r\"\\[[^\\(\\)]*\\]\\(.*\\)\": \"<link>\",     # Markdown link.\n    r\"\\r?\\n\": \" \",                       # Newlines.\n    r\"\\d+\": \"<number>\",\n    r\"\\.{2,}\": \".\",\n    r\"(&gt;|\\*|)\": \"\",\n    r\"[_-]+\": \" \"\n}\n\ncontractions = {\n    \"sha'n't\": \"shall not\",\n    \"I've\": \"I have\",\n    \"who's\": \"who has\",\n    \"you're\": \"you are\",\n    \"can't've\": \"cannot have\",\n    \"could've\": \"could have\",\n    \"shan't\": \"shall not\",\n    \"he'd've\": \"he would have\",\n    \"hadn't've\": \"had not have\",\n    \"couldn't've\": \"could not have\",\n    \"y'all've\": \"you all have\",\n    \"when've\": \"when have\",\n    \"that'd've\": \"that would have\",\n    \"it'll\": \"it shall\",\n    \"oughtn't've\": \"ought not have\",\n    \"you'll\": \"you shall\",\n    \"shouldn't've\": \"should not have\",\n    \"shouldn't\": \"should not\",\n    \"we've\": \"we have\",\n    \"who've\": \"who have\",\n    \"why've\": \"why have\",\n    \"needn't've\": \"need not have\",\n    \"ma'am\": \"madam\",\n    \"oughtn't\": \"ought not\",\n    \"mustn't've\": \"must not have\",\n    \"they'd've\": \"they would have\",\n    \"isn't\": \"is not\",\n    \"y'all're\": \"you all are\",\n    \"so's\": \"so as\",\n    \"he'd\": \"he had\",\n    \"doesn't\": \"does not\",\n    \"he's\": \"he has\",\n    \"I'm\": \"I am\",\n    \"mightn't've\": \"might not have\",\n    \"hadn't\": \"had not\",\n    \"needn't\": \"need not\",\n    \"don't\": \"do not\",\n    \"he'll've\": \"he shall have\",\n    \"we'll've\": \"we will have\",\n    \"what'll\": \"what shall\",\n    \"that's\": \"that has\",\n    \"it'd\": \"it had\",\n    \"how's\": \"how has\",\n    \"you've\": \"you have\",\n    \"wouldn't\": \"would not\",\n    \"he'll\": \"he shall\",\n    \"we'd\": \"we had\",\n    \"I'll\": \"I shall\",\n    \"when's\": \"when has\",\n    \"we'll\": \"we will\",\n    \"couldn't\": \"could not\",\n    \"you'll've\": \"you shall have\",\n    \"will've\": \"will have\",\n    \"there'd've\": \"there would have\",\n    \"they'd\": \"they had\",\n    \"I'd\": \"I had\", \"y'all\": \"you all\",\n    \"won't've\": \"will not have\",\n    \"aren't\": \"are not\",\n    \"haven't\": \"have not\",\n    \"mustn't\": \"must not\",\n    \"what've\": \"what have\",\n    \"it's\": \"it has\",\n    \"she'll\": \"she shall\",\n    \"wasn't\": \"was not\",\n    \"they're\": \"they are\",\n    \"that'd\": \"that would\",\n    \"how'd'y\": \"how do you\",\n    \"what's\": \"what has\",\n    \"there'd\": \"there had\",\n    \"to've\": \"to have\",\n    \"I'll've\": \"I shall have\",\n    \"y'all'd\": \"you all would\",\n    \"would've\": \"would have\",\n    \"how'll\": \"how will\",\n    \"she'd\": \"she had\", \"what're\": \"what are\",\n    \"wouldn't've\": \"would not have\",\n    \"might've\": \"might have\", \"mayn't\": \"may not\", \"o'clock\": \"of the clock\",\n    \"'cause\": \"because\",\n    \"mightn't\": \"might not\",\n    \"didn't\": \"did not\",\n    \"they'll\": \"they shall\",\n    \"there's\": \"there has\",\n    \"we'd've\": \"we would have\", \"hasn't\": \"has not\",\n    \"let's\": \"let us\", \"she's\": \"she has\",\n    \"who'll\": \"who shall\",\n    \"shan't've\": \"shall not have\",\n    \"won't\": \"will not\",\n    \"where've\": \"where have\",\n    \"it'll've\": \"it shall have\", \"where's\": \"where has\",\n    \"you'd've\": \"you would have\",\n    \"weren't\": \"were not\",\n    \"who'll've\": \"who shall have\",\n    \"why's\": \"why has\",\n    \"how'd\": \"how did\",\n    \"we're\": \"we are\",\n    \"she'd've\": \"she would have\",\n    \"ain't\": \"am not\",\n    \"y'all'd've\": \"you all would have\",\n    \"I'd've\": \"I would have\", \"they've\": \"they have\",\n    \"must've\": \"must have\",\n    \"what'll've\": \"what shall have\", \"she'll've\": \"she shall have\",\n    \"where'd\": \"where did\",\n    \"should've\": \"should have\",\n    \"you'd\": \"you had\",\n    \"can't\": \"cannot\",\n    \"it'd've\": \"it would have\",\n    \"so've\": \"so have\", \"they'll've\": \"they shall have\"}\n\n"
  },
  {
    "path": "main.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"main.py: Train and/or chat with a bot. (work in progress).\n\nTypical use cases:\n    1.  Train a model specified by yaml config file, located at\n        path_to/my_config.yml, where paths are relative to project root:\n            ./main.py --config path_to/my_config.yml\n\n    2.  Train using mix of yaml config and cmd-line args, with\n        command-line args taking precedence over any values.\n            ./main.py \\\n                --config path_to/my_config.yml \\\n                --model_params \"{'batch_size': 32, 'optimizer': 'RMSProp'}\"\n\n    3.  Load a pretrained model that was saved in path_to/pretrained_dir,\n        which is assumed to be relative to the project root.\n            ./main.py --pretrained_dir path_to/pretrained_dir\n\n\"\"\"\n\nfrom __future__ import print_function\nfrom __future__ import absolute_import\nfrom __future__ import division\n\nimport os\n# Meaning of values:\n#   1: INFO messages are not printed.\n#   2: INFO, WARNING messages are not printed.\n# I'm temporarily making the default '2' since the TF master\n# branch (as of May 6) is spewing warnings that are clearly\n# due to bugs on their side.\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n\nimport data\nimport chatbot\nimport logging\nimport tensorflow as tf\nfrom pydoc import locate\nfrom utils import io_utils\n\n# =============================================================================\n# FLAGS: Command line argument parser from TensorFlow.\n# =============================================================================\n\nflags = tf.app.flags\nflags.DEFINE_string(\n    flag_name=\"pretrained_dir\",\n    default_value=None,\n    docstring=\"relative path to a pretrained model directory.\"\n              \"It is assumed that the model is one from this repository, and \"\n              \" thus has certain files that are generated after any training\"\n              \" session (TL;DR: any ckpt_dir you've trained previously).\")\nflags.DEFINE_string(\n    flag_name=\"config\",\n    default_value=None,\n    docstring=\"relative path to a valid yaml config file.\"\n              \" For example: configs/example_cornell.yml\")\nflags.DEFINE_string(\n    flag_name=\"debug\",\n    default_value=False,\n    docstring=\"If true, increases output verbosity (log levels).\")\nflags.DEFINE_string(\n    flag_name=\"model\",\n    default_value=\"{}\",\n    docstring=\"Options: chatbot.{DynamicBot,Simplebot,ChatBot}.\")\nflags.DEFINE_string(\n    flag_name=\"model_params\",\n    default_value=\"{}\",\n    docstring=\"Configuration dictionary, with supported keys specified by\"\n              \" those in chatbot.globals.py.\")\nflags.DEFINE_string(\n    flag_name=\"dataset\",\n    default_value=\"{}\",\n    docstring=\"Name (capitalized) of dataset to use.\"\n              \" Options: [data.]{Cornell,Ubuntu,Reddit}.\"\n              \" - Legend: [optional] {Pick,One,Of,These}.\")\nflags.DEFINE_string(\n    flag_name=\"dataset_params\",\n    default_value=\"{}\",\n    docstring=\"Configuration dictionary, with supported keys specified by\"\n              \" those in chatbot.globals.py.\")\nFLAGS = flags.FLAGS\n\n\ndef start_training(dataset, bot):\n    \"\"\"Train bot. \n    \n    Will expand this function later to aid interactivity/updates.\n    \"\"\"\n    print(\"Training bot. CTRL-C to stop training.\")\n    bot.train(dataset)\n\n\ndef start_chatting(bot):\n    \"\"\"Talk to bot. \n    \n    Will re-add teacher mode soon. Old implementation in _decode.py.\"\"\"\n    print(\"Initiating chat session.\")\n    print(\"Your bot has a temperature of %.2f.\" % bot.temperature, end=\" \")\n    if bot.temperature < 0.1:\n        print(\"Not very adventurous, are we?\")\n    elif bot.temperature < 0.7:\n        print(\"This should be interesting . . . \")\n    else:\n        print(\"Enjoy your gibberish!\")\n    bot.chat()\n\n\ndef main(argv):\n\n    if FLAGS.debug:\n        # Setting to '0': all tensorflow messages are logged.\n        os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0'\n        logging.basicConfig(level=logging.INFO)\n\n    # Extract the merged configs/dictionaries.\n    config = io_utils.parse_config(flags=FLAGS)\n    if config['model_params']['decode'] and config['model_params']['reset_model']:\n        print(\"Woops! You passed {decode: True, reset_model: True}.\" \n              \" You can't chat with a reset bot! I'll set reset to False.\")\n        config['model_params']['reset_model'] = False\n\n    # If loading from pretrained, double-check that certain values are correct.\n    # (This is not something a user need worry about -- done automatically)\n    if FLAGS.pretrained_dir is not None:\n        assert config['model_params']['decode'] \\\n               and not config['model_params']['reset_model']\n\n    # Print out any non-default parameters given by user, so as to reassure\n    # them that everything is set up properly.\n    io_utils.print_non_defaults(config)\n\n    print(\"Setting up %s dataset.\" % config['dataset'])\n    dataset_class = locate(config['dataset']) or getattr(data, config['dataset'])\n    dataset = dataset_class(config['dataset_params'])\n    print(\"Creating\", config['model'], \". . . \")\n    bot_class = locate(config['model']) or getattr(chatbot, config['model'])\n    bot = bot_class(dataset, config)\n\n    if not config['model_params']['decode']:\n        start_training(dataset, bot)\n    else:\n        start_chatting(bot)\n\nif __name__ == \"__main__\":\n    tf.logging.set_verbosity('ERROR')\n    tf.app.run()\n\n"
  },
  {
    "path": "notebooks/Analysis.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Analysis, Goals, and Predictions\\n\",\n    \"\\n\",\n    \"Here, I'd like to go over the loss functions being used to train the models and what we are aiming for, so that we can better understand the models' performance as training progresses. My approach will follow that of Ng (2015), as outlined in the textbook __\\\"Deep Learning\\\" by Goodfellow et al.__:\\n\",\n    \"\\n\",\n    \"* Determine your goals -- error metric(s) and target (re: desired) value(s). \\n\",\n    \"* Establish a working end-to-end pipeline. \\n\",\n    \"* Determine bottlenecks in performance, their sources, and whether they're due to overfitting/underfitting/software defect(s). \\n\",\n    \"* Repeatedly make incremental changes such as gathering new data, adjusting hyperparams, or changing algorithms. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Selecting Hyperparameters\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Manual HyperParameter Tuning\\n\",\n    \"\\n\",\n    \"Here are I'll just bullet the main ideas:\\n\",\n    \"* The learning rate is perhaps the most important hyperparameter. The training error increases appx exponentially as the learning rate decreases below its optimal value. Above the optimal value, the training error basically shoots off to infinity (vertical wall). \\n\",\n    \"* Next, the best perfomance usually comes from a large model that is regularized well, for example, by using dropout. \\n\",\n    \"* Table showing typical hyperparameter relationships with model capacity. Remember that you can basically brute force your way to good performance by jacking up the model capacity and training set size. \\n\",\n    \"\\n\",\n    \"| Hyperparameter | Increases capacity when... | \\n\",\n    \"| -------------- | -------------------------- |\\n\",\n    \"| Num hidden units | increased | \\n\",\n    \"| Learning rate | tuned optimally |\\n\",\n    \"| Convolution kernal width | increased | \\n\",\n    \"| Implicit zero padding | increased | \\n\",\n    \"| Weight decay coefficient | decreased | \\n\",\n    \"| Dropout rate | decreased | \\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Automatic HyperParameter Optimization\\n\",\n    \"\\n\",\n    \"__Grid Search__: This is what I'm doing right now. User selects a small finite set of values to explore. Grid search trains a model for every joint specification of hyperparameter values in the Cartesian product of possible values. The experiment with the best _validation error_ is chosen as the best. \\n\",\n    \"\\n\",\n    \"__Random Search (Better)__: \\n\",\n    \"1. Define a marginal distribution for each hyperparameter, e.g. multinoulli for discrete hparams or uniform (log-scale) for positive real-valued hyparams. For example, if we were interested in the range $[10^{-5}, 0.1]$ for the learning rate:\\n\",\n    \"$$\\n\",\n    \"\\\\begin{align}\\n\",\n    \"\\\\texttt{logLearningRate} &\\\\sim Unif[-1, -5] \\\\\\\\\\n\",\n    \"\\\\texttt{learningRate} &= 10^{logLearningRate}\\n\",\n    \"\\\\end{align}\\n\",\n    \"$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Debugging Strategies\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Determining whether or not a machine learning model is broken is hard. Here are some debugging tips:\\n\",\n    \"* __Visualize the model in action__: Not just the quantitative stuff. How do the filters look? How is the chatbot responding?\\n\",\n    \"* __Visualize the worst mistakes__: For example, our chatbot models output probabilities for the word tokens, and we either sample or argmax. One way to get an idea of what sentences our model does poorly on is to choose examples where the output probability max is *small*. In other words, if argmax(output) is much lower than usual, that says our model is rather unsure what is the best next word (think of the limiting case where it outputs 1/numOutputs for all possible tokens!). \\n\",\n    \"* __Fit a tiny dataset__: Oooh, I like this one! Even small models can be guaranteed to be able to fit a sufficiently small dataset. Make sure you can write program that can train on say, a handful of input-output sentences, and produce the output given any of the inputs with near perfect accuracy. \\n\",\n    \"* __Monitor histograms of activations/gradients__: The preactivation can tell us if the units saturate, or how often they do. For tanh units, the average of the absolute value of the preactivations tells us how saturated the unit is. It is also useful to compare the parameter gradients with the parameters themselves. Ideally, we'd like the gradients over a minibatch to be about 1 percent of the magnitude of the parameter. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Plotting the Hyperparameter-Search Results\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import pandas as pd\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import seaborn as sns\\n\",\n    \"%matplotlib inline\\n\",\n    \"plt.style.use('ggplot')\\n\",\n    \"plt.rcParams['figure.figsize'] = 10, 8\\n\",\n    \"BASE = '/home/brandon/Documents/seq2seq_projects/data/saved_train_data/'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>embed_size</th>\\n\",\n       \"      <th>global_step</th>\\n\",\n       \"      <th>learning_rate</th>\\n\",\n       \"      <th>loss</th>\\n\",\n       \"      <th>state_size</th>\\n\",\n       \"      <th>vocab_size</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>56</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>0.189885</td>\\n\",\n       \"      <td>9.211146</td>\\n\",\n       \"      <td>380</td>\\n\",\n       \"      <td>10000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>56</td>\\n\",\n       \"      <td>203</td>\\n\",\n       \"      <td>0.189885</td>\\n\",\n       \"      <td>5.385020</td>\\n\",\n       \"      <td>380</td>\\n\",\n       \"      <td>10000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>56</td>\\n\",\n       \"      <td>404</td>\\n\",\n       \"      <td>0.189885</td>\\n\",\n       \"      <td>5.219425</td>\\n\",\n       \"      <td>380</td>\\n\",\n       \"      <td>10000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>56</td>\\n\",\n       \"      <td>605</td>\\n\",\n       \"      <td>0.189885</td>\\n\",\n       \"      <td>4.849638</td>\\n\",\n       \"      <td>380</td>\\n\",\n       \"      <td>10000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>56</td>\\n\",\n       \"      <td>806</td>\\n\",\n       \"      <td>0.189885</td>\\n\",\n       \"      <td>4.682628</td>\\n\",\n       \"      <td>380</td>\\n\",\n       \"      <td>10000</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"   embed_size  global_step  learning_rate      loss  state_size  vocab_size\\n\",\n       \"0          56            2       0.189885  9.211146         380       10000\\n\",\n       \"0          56          203       0.189885  5.385020         380       10000\\n\",\n       \"0          56          404       0.189885  5.219425         380       10000\\n\",\n       \"0          56          605       0.189885  4.849638         380       10000\\n\",\n       \"0          56          806       0.189885  4.682628         380       10000\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"path = BASE + 'cornell_03_11.csv'\\n\",\n    \"df = pd.read_csv(path, index_col=0)\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 34,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{32}\\n\",\n      \"{128}\\n\",\n      \"{0.5}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"embed_sizes = set(df['embed_size'])\\n\",\n    \"state_sizes = set(df['state_size'])\\n\",\n    \"learning_rates = set(df['learning_rate'])\\n\",\n    \"print(embed_sizes)\\n\",\n    \"print(state_sizes)\\n\",\n    \"print(learning_rates)\\n\",\n    \"\\n\",\n    \"def get_split(df, col, vals):\\n\",\n    \"    return [(v, df[df[col]==v]) for v in vals]\\n\",\n    \"\\n\",\n    \"def split_df_and_plot(df, split_col, split_vals):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Example usage:\\n\",\n    \"        split_df_and_plot(df, 'learning_rate', learning_rates)\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    df_split = get_split(df, split_col, split_vals)\\n\",\n    \"    plt.figure(figsize=(8, 6))\\n\",\n    \"    for val, df_sp in df_split:\\n\",\n    \"        ax=plt.subplot()\\n\",\n    \"        plt.scatter(df_sp['global_step'], df_sp['loss'], label='%.3f' % val)\\n\",\n    \"\\n\",\n    \"    plt.title(split_col + ' Comparisons', fontsize=20)\\n\",\n    \"    ax.set_xlabel('Global Step', fontsize=15)\\n\",\n    \"    ax.set_ylabel('Validation Loss', fontsize=15)\\n\",\n    \"    leg = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \\n\",\n    \"               title=split_col, prop={'size':15})\\n\",\n    \"    plt.setp(leg.get_title(),fontsize=20)\\n\",\n    \"    plt.tight_layout()\\n\",\n    \"    plt.savefig(split_col+'.pdf', bbox_extra_artists=(leg,), bbox_inches='tight')\\n\",\n    \"    plt.show()\\n\",\n    \"    \\n\",\n    \"def inception_split(df, split_col_one, split_vals_one, split_col_two, split_vals_two):\\n\",\n    \"    \\\"\\\"\\\"ENHANCE\\\"\\\"\\\"\\n\",\n    \"    df_split_one = get_split(df, split_col_one, split_vals_one)\\n\",\n    \"    fig = plt.figure(figsize=(12, 10))\\n\",\n    \"    ctr = 1\\n\",\n    \"    for val_one, df_sp_one in df_split_one:\\n\",\n    \"        df_split_two = get_split(df_sp_one, split_col_two, split_vals_two)\\n\",\n    \"        ax=fig.add_subplot(3, 2, ctr)\\n\",\n    \"        for val_two, df_sp_two in df_split_two:\\n\",\n    \"            ax.scatter(df_sp_two['global_step'], df_sp_two['loss'], label=split_col_two + ': %.2f' % val_two)\\n\",\n    \"            ax.set_ylim([3., 10.])\\n\",\n    \"            plt.title(split_col_one + ' = %.2f' % val_one, fontsize=15)\\n\",\n    \"            ax.set_xlabel('Global Step', fontsize=12)\\n\",\n    \"            ax.set_ylabel('Validation Loss', fontsize=12)\\n\",\n    \"            if ctr in [2, 4, 6]:\\n\",\n    \"                leg = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \\n\",\n    \"                       title=split_col_two, prop={'size':12})\\n\",\n    \"                plt.setp(leg.get_title(),fontsize=15)\\n\",\n    \"        ctr += 1\\n\",\n    \"    plt.tight_layout()\\n\",\n    \"    plt.savefig(split_col_one + \\\"_\\\" + split_col_two + '.pdf', bbox_extra_artists=(leg,), bbox_inches='tight')\\n\",\n    \"    plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Single Plots Distinguishing One Variable\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n1FNPsWPHDjZs2IDVauXQoUN88sknDBs27IZKPG41lVuUEafcFFyzo4s85podjVNuikovRERE7iBO\\nFSvh9er75MXHkhtzDpc6dUt8B/lykydPZvr06QwaNIj09HQaN27Mxx9/TN26dYmOjrYlzwB79+7l\\n6aefBiA3NxfDMGxPxli4cCGtW7fmrbfeYurUqXTs2BFnZ2fat2/PlClTbPM1a9aM999/nzlz5jBx\\n4kQ8PT0JDg62jVvWTIZhGGUdxPU4f/58qczj7e1donO5Zp6m+rkFmHBcfgMTSXWfIafivSU2/40o\\n6TX5o9F6ONKaONKa2NN6ONKa2PP29i7rEEQAlVuUmTxXD/KdqxR5LN+5CnmuNUs5IhEREREpoCS5\\njOS7VCXHzfENNQA5bj4qtRAREREpQ0qSy1BqnYFkVWpMnrM7BibynN3JqtSY1DoDyzo0ERERkTua\\nbtwrQ4aTGyneT/7/c5ITyHOtqR1kERERkXJASXI5kO9SVcmxiIiISDmicgsRERERkUKUJIuIiIiI\\nFKIkWURERESkECXJIiIiIiKFKEkWERERESlESbKIiIiIkJmZyeuvv06HDh1o2bIlAwcOZOfOnVfs\\n//333xMUFETLli1p06YNEydOJCEh4brG27lzJ0FBQbRq1Yr27dvz6quvkpmZWWLXeD2UJIuIiIgI\\nISEhHDx4kIiICHbt2kXfvn0ZOXIkp06dcuj7888/88wzz9CjRw92797Nv//9b44fP87UqVOLPd6Z\\nM2cYOXIkPXr04LvvvuPTTz/l8OHDhISElNo1X42SZBEREZFyJDYtm4PRScSmZZfanMnJyaxdu5bR\\no0dTv3593NzcCAoKomHDhkRGRjrGGBvL4MGDCQ4OxtXVlbp169KnTx92795d7PGWLVtGgwYNCA4O\\npmLFitSrV49Ro0axZs0aux3psqKXiYiIiIiUAxnWXKauO8rRmBQS0q3UrGymSZ2qvNmzCZXMJZuy\\nHTlyhJycHAICAuzaLRYLP/74o0P/tm3b0rZtW7u26Oho7rrrrmKPFxUVhcVicTiem5vLkSNHHMYv\\nbdpJFhERESkHpq47yvaTccSlW8kH4tKtbD8Zx9R1R0t87oKd2+rVq9u116hRg/j4+Gue//333xMZ\\nGcnYsWOLPV5CQgLVqlVzOA4Ua86SpiRZREREpIzFpmVzNCalyGNHY1JKtfSiMJPJdNXja9eu5bnn\\n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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8cd39828>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n27YNUVFRAIBjx46hvLwc69atw+XLl5GamoqQkBBj5khERET0VBOZWsLMd8qdi98qCgFL53q7yM3R\\n0RHJyclYtGgRevXqBRMTE7Rq1Qrx8fEICAhAQEAAFAoFZs2ahdu3b8Pd3R0ffvgh+vfvr4mRm5sL\\nmUymeb1kyRLMmzcP4eHhqKqqQmBgINavXw+pVAoACAgIwNKlS7FixQpMmzYNTk5OiIiIQExMjMEx\\njEUk3HvYQo/Ro0dj/fr1MDExwYoVK2Bvb4/IyEgIgoDo6Oh/fApIXaqvoxbu7u481nEProk2rocu\\nrokurok2rocurok2d3f3hk6BnnEGHXswMzNDTU0Namtrce7cObzwwgsAgKqqKp2DykRERERETyqD\\njj20adMGiYmJMDU1RW1tLXx8fAAABw8eRIsWLYyaIBERERFRXTFo5zc6OhoFBQW4evUqJk6cCDMz\\nMygUCmzZsgVvvPGGsXMkIiIiIqoTBu38urq6YtasWVpttra2WLt2LSwtLY2SGBERERFRXTNo57ei\\nogJbt27VvD58+DBmzJiBhIQEKJVKoyVHRERERFSXDCp+N2zYgLNnzwIAbt68iXXr1sHf3x9lZWVI\\nTk42aoJERERERHXFoGMPp06dwsKFCwEAv/zyC/z9/TFy5EiUlpbi/fffN2qCRERERER1xaCdX5VK\\nBUdHRwDA2bNn0bFjRwCAjY0NysrKjJcdEREREVEdMqj4dXR0xPXr13H79m1cuXIFAQEBAO48cEIi\\nkRg1QSIiIiKiumLQsYd+/frhww8/BAB06tQJLi4uKC8vR1xcHB9tTERERERPDYOK30GDBqF169Yo\\nLy+Hv78/AMDCwgLBwcEYMmSIURMkIiIiIqorBhW/ANC2bVsolUpcv34dAODm5oZXXnnFaIkRERER\\nEdU1g4rfsrIyrFq1CqdOnYIgCAAAExMTdO3aFePGjYO5ublRkyQiIiIiqgsGFb9JSUkoLCxEbGws\\nmjdvDkEQcP36daSlpWHbtm0YOXKksfMkIiIiInpsBhW/v//+O+bPnw8XFxdNW8uWLdG6dWssXLiQ\\nxS8RERERPRUMutWZWq1GkyZNdNrd3NxQUlJS50kRERERERmDQcWvm5sbfvvtN53248ePa+0GExER\\nERE9yQw69jBkyBAsW7YMHTt2RPPmzQEAOTk5+P333zFu3DijJkhEREREVFcMKn67dOkCqVSKffv2\\n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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d5aee10>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\nIk7tfwDN6aMzrcrivgAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d5aedd8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"split_df_and_plot(df, 'learning_rate', learning_rates)\\n\",\n    \"split_df_and_plot(df, 'embed_size', embed_sizes)\\n\",\n    \"split_df_and_plot(df, 'state_size', state_sizes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Plots with Fixed Learning Rate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 24,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA9oAAALICAYAAACAfohjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtcVVX+//EXh4uihAqKxHjXpMnUDDMd84ZyM0zzls2k\\n5qXCO2UqgtfRUDDS8EZO/dJQMxsdmyEhrcx0pkYtR79lo+Yt0EQUEQ4gt3N+f/jgjAiKyFGO9H4+\\nHj4G9l5nrfXZzMznfM5eZ207s9lsRkRERERERESswlDVExARERERERGpTlRoi4iIiIiIiFiRCm0R\\nERERERERK1KhLSIiIiIiImJFKrRFRERERERErEiFtoiIiIiIiIgVqdCWKuft7c3HH39cpXOYNWsW\\nI0eOrNI5iIiI7VKuEhGRilChLQIsXLiQdevWVfU0ynXs2DF27Nhxz8dNTk4mJCSEP/zhD3Tp0oWQ\\nkBCSk5Nv+ZqCggJiY2Np06YNy5cvL3X++++/Z+TIkXTq1IknnniCmTNnkp2dfbdCEBG57ylX3dqd\\n5KoNGzbQt29fOnTogK+vL7GxsZhMpkr1KSICKrRF7itbt269529eCgoKeOmll3B1dSUhIYHPPvuM\\nevXqMXbsWAoKCsp8zaVLlxgyZAgnTpzggQceKHU+OTmZMWPG0KZNG7766is+/fRT0tLSmDVr1t0O\\nR0RE7rL7JVdt2rSJpUuXMm/ePA4cOMCSJUtYu3Yt8fHxd9yniEgxFdpiczZs2EC/fv147LHH6N69\\nO0uWLKGwsNByfvfu3QwePBgfHx86d+7Mq6++Snp6uuW8t7c3a9euJSAggBdffNFy7B//+AeTJ0/G\\nx8eHp556iri4OMtrwsLCeP755wH497//jbe3N//5z38YOnQojz32GAEBAezevdvS/syZM7zwwgu0\\na9cOPz8/kpKSePrpp8u8c1uWlJQUvL29+eijj+jZsyfh4eEAHDp0iOHDh1vu8r700kuWT86nTp3K\\n2rVr+fTTT2nbti0XL168ret1vW3bttG2bdsy/wUEBJT5mr1793LmzBlmzpyJm5sbrq6uzJgxg+Tk\\n5BLX5HoZGRmMGDGCt99+Gycnp1Lnv/76a0wmE1OnTqVWrVp4eHgQERFBUlISaWlpt3UNRUSqknLV\\n/Z+r8vPzmTZtGp06dcLe3t7yt/r222/vuE8REQuzSBVr3bq1efPmzWaz2Wz++OOPzZ06dTLv37/f\\nXFRUZP7pp5/MPXv2NC9fvtxsNpvNqamp5jZt2pjXr19vLioqMl+4cMEcHBxsnj59eon+nn76afPx\\n48fNJpPJcszf39+8f/9+c2Fhofmjjz4yt27d2nz06FGz2Ww2z5gxwzxs2DCz2Ww2f/vtt+bWrVub\\nR48ebf7ll1/MeXl55hkzZpg7d+5s6e+FF14wDx061JyWlma+dOmSeezYseYOHTqYY2Njbyvm5ORk\\nc+vWrc3PP/+8+ddffzWbTCZzXl6euVOnTuYlS5aYCwoKzJmZmeZRo0aZ//SnP1le98ILL5inTp1q\\n+b2862UNb731ltnf37/UcX9/f/Obb75Z7uu7detW6rps2LDB3K5dO3NBQYHl2OXLl82tW7c279q1\\nq9JzFhGxNuWq6p2rzGaz2WQymZ955hnz/PnzrdaniPx26Y622JT169fz3HPP0bFjRwwGAw8//DCj\\nR4+2bEDj4eHBnj17GDZsGAaDgQYNGtCtWzcOHTpUop+nnnqKVq1aYWdnZznWu3dvOnbsiL29Pf36\\n9QPg6NGjN53LiBEjaNy4MU5OTgQFBZGens6FCxe4ePEi+/btY+zYsdSvXx83NzfCw8Pv6PvFQUFB\\neHp6Ymdnh5OTEzt37mTy5Mk4ODjwwAMP0Lt371KxVeR6WcPly5epU6dOqeP16tXj0qVLd9Rn9+7d\\nsbOz480338RoNJKenk50dDROTk5cvny5slMWEbmrlKuqZ65auXIl586dY/To0VbrU0R+uxyqegIi\\n1zt58iTHjx/n/ffftxwzm83AtSVeTk5OfPLJJ2zevJlz585RVFREUVERnp6eJfpp3Lhxqb6bNm1q\\n+dnZ2RmAq1ev3nQuTZo0sfxcs2ZNS/usrKxSYzRv3py6devedpxljQHw1Vdf8f7773P69GkKCwsx\\nmUw3XVoHt3e97qbr3xxWRKNGjYiLiyMmJoYePXrw4IMPEhISwq5du3Bw0P8tiYhtU66qXrmqqKiI\\nxYsX8/e//501a9bQqFGjSvcpIqJ3tGJTatasyfjx4y3fV7vR3/72N6Kjo4mKisLf358aNWoQExPD\\np59+WqJdWUnbYKjYAo6btS/ejdTR0bFC/ZXl+j7+/e9/M336dGbMmMHQoUOpXbs2mzZtYu7cuTd9\\nfXnX60bbtm1j9uzZZZ7z8vLis88+K3Xc3d2djIyMUscvX75M/fr1b2vcsnTu3LnE3Yzs7Gxef/11\\n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\\n+Pr68uOPPzJs2DAAXFxcWLZsWYUL+nILbYPBwKVLl9i5c6dljXxubi5FRUUVGuh6np6e/Pzzz3Tu\\n3Jm0tDRq1qx5yzcuIiIit6JcJSIi1UUtJwdiBrYjzZjH2YxcflfX2Wp3sovVrVuXVatWlXluw4YN\\nlp8ff/xxpk2bZvm9uJAGSm1ktmTJknLH7d+/v+WRWtcrfoRX//79iYyMLPO1HTp04K9//Wup47fa\\ndTw0NNSy0duNjh49etN5Tpo0iUmTJt30/O0ot9AePHgwM2bMoE6dOsyYMQO4dlH79Olzx4P6+fmx\\natUq5s6di8lk4qWXXrrjvkRERJSrRESkumngUsPqBbbcO+UW2l26dKFLly4ljk2ZMqVSu68W7zAn\\nIiJiDcpVIiIiYkvKXQN35MgRPvjgA8vPISEhTJ8+ncOHD9/1yYmIiNwO5SoRERGxJeUW2u+//z5P\\nPvkk8L+dXGfNmlVi7b6IiEhVUq4SERERW1Ilu46LiIhYk3KViIiI2JJy72jfjZ1cRURErEm5SkRE\\nRGxJlew6LiIiYk3KVSIiImJL7mjX8cmTJ+Pq6nrXJiUiIlIRylUiIiJiS8ottPPz80lISODw4cNc\\nuXKFunXr8vjjjxMUFISDQ7kvFxERueuUq0RERKxj8+bNDB06tNx227dvp3v37ri4uFR6zOnTpxMY\\nGIivr2+l+7peWFgYe/fuLTHH6Oho2rVrB8C2bduYP38+8+bNo3///pY2X3zxBbGxseTn51O3bl3m\\nz59P69atKzR2ue8+3n33XbKzswkODqZ27dpkZWXx5ZdfkpqaytixYys0mIiIyN2gXCUiItVNtrGA\\nzIx8XOs6UdvF8Z6MWVRURHR09G0V2rGxsTz++ONWKbSjo6Mr3cfNvPbaawwcOLDU8TVr1vD999/T\\nvHnzEsdTU1MJCwvjww8/pFWrVmzYsIE5c+awadOmCo1bbqF9/Phx3nrrLezs7CzHfHx8eP311ys0\\nkIiIyN2iXCUiItVFQb6JLxJTSEvNJSe7iFq17WnQ0JneQY1wdCp3L+vbUlhYyNy5czlw4AAmkwlv\\nb28WL17M+PHjycrKIjAwkL/85S8UFBQQERFBRkYGhYWFTJkyheDgYGbOnMmpU6cYPnw4ixYtonXr\\n1ixYsIDDhw9TWFjI+PHjGTRoUKlx9+3bx6JFi8jLy8NsNjN58mSCgoIYPnw4gwcPpkaNGixbtszS\\n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\\nuEiO7TAwuXjzuypD0cGzPfieTtxrkikkHJRgSx1Vq4n2Bx98QFBQUG1WQeSS4g09kp6oo7f0FnvD\\nAxBRrBK5mDzVQ15TPNEj6+mh6OD5HnxPJu4il6paS7RPnz7NqVOn6NSpatPvi4icT+neYktREfY6\\n3FvsDQ9ALlWKVSJSEzw5FL00T/XgezpxF7kU1do62vPnz+ehhx7iq6++IioqSsPxRKRmaA1KqQbF\\nKhGpSWePJHL2l1SiW0cQHVdH1m4WEY+olR7trVu3EhcXR1RUVKU/k5iYWK1zlixAXx+oLXVXfWqP\\n2lI3eXtbYmK854tkbcSq3/P2+11C7ahb6kM76kMbAGLiYnAEgQPP//64mOrN/fhvO7wpVkndVSuJ\\n9p49e0hOTmbPnj2kpaXh6+tLWFgYHTp0qI3qiIiIlKNYJSIiIlVVK4n21KlTnX9///33iYqK0hcX\\nERGpUxSrREREpKo0q4GIiIiIiIiIB9Xq8l4AI0eOrO0qiIiInJdilYiIiLhDPdoiIiIiIiIiHqRE\\nW0RERERERMSDlGiLiIiIiIiIeJASbREREREREREPUqItIiIiIiIi4kFKtEVEREREREQ8SIm2iIiI\\niIiIiAcp0RYRERERERHxICXaIiIiIiIiIh6kRFtERERERETEg5Roi4iIiIiIiHiQEm0RERERERER\\nD1KiLSIiIiIiIuJBSrRFREREREREPEiJtoiIiIiIiIgHKdEWERERERER8SCf2jhpYWEhK1asICsr\\nC5vNxvDhw+nSpUttVEVERMQlxSoRERGpqlpJtL/77jtat27N7bffTkpKCs8//7y+vIiISJ2iWCUi\\nIiJVVSuJ9o033uj8e1paGmFhYbVRDRERkQopVomIiEhVmQzDMGrr5LNmzSItLY1p06YRGxtbW9UQ\\nERGpkGKViIiIuKtWE22AX3/9leXLl7No0SJMJlNtVkVERMQlxSoRERFxR63MOn7s2DFSU1MBaNmy\\nJXa7nXPnztVGVURERFxSrBIREZGqqpVE+8cff2TDhg0AZGZmUlBQQKNGjWqjKiIiIi4pVomIiEhV\\n1crQcavVysqVK0lLS8NqtTJixAi6du16sashIiJSIcUqERERqapaf0dbREREREREpD6plaHjIiIi\\nIiIiIvWVEm0RERERERERD/Kp7QpcDG+++SY///wzJpOJBx98kDZt2tR2lc7r4MGDvPTSSzRv3hyA\\nFi1acNttt7F8+XIcDgchISFMmjQJX19ftm3bxsaNGzGZTPTv35++ffvWcu1/c/LkSRYtWsStt95K\\nfHw8qamplW5DUVERr776KikpKZjNZiZOnEiTJk3qTFtWrFjBsWPHnBMj3XbbbXTu3Nkr2rJmzRoO\\nHTqEw+Fg2LBhtG7d2mvvy+/bsnv3bq+8L4WFhaxYsYKsrCxsNhvDhw8nNjbWa++LeIY3xS5vj1v1\\nJV7Vl1hVH+JUfYhP9SU2uWrHzp07ve5+iBcy6rmDBw8a8+fPNwzDMBISEowZM2bUco0u7IcffjBe\\nfPHFMttWrFhh/N///Z9hGIbxzjvvGJ9++qmRn59vTJ482cjNzTUKCwuNJ554wsjOzq6NKpeTn59v\\nPPvss8aqVauMTZs2GYbhXhu+/PJLY/Xq1YZhGMb3339vvPTSS3WqLcuXLzd2795d7ri63pYDBw4Y\\n8+bNMwzDMM6dO2eMHz/ea++Lq7Z46335+uuvjXXr1hmGYRjJycnG5MmTvfa+iGd4W+zy5rhVX+JV\\nfYlV9SFO1Zf4VF9ik6t2eOP9EO9T74eOHzhwgOuuuw6Ayy67jNzcXPLy8mq5Vu47ePCgc7bbrl27\\nsn//fo4ePUrr1q0JDAzEz8+Ptm3b8tNPP9VyTYv5+voyffp0QkNDndvcacMPP/xAt27dAGjfvj2H\\nDx+ulXaA67a44g1tufrqq5k6dSoADRs2pLCw0Gvvi6u2OByOcsd5Q1tuvPFGbr/9dgDS0tIICwvz\\n2vsinlEfYpe3xK36Eq/qS6yqD3GqvsSn+hKbXLXDlbreDvE+9X7oeGZmJq1atXL+HBwcTGZmJoGB\\ngbVYqws7deoUCxYsICcnh7vuuovCwkJ8fX2B39qQmZlJcHCw8zMl2+sCi8WCxWIps82dNpTebjab\\nMZlMFBUV4eNz8f/JumoLwObNm9mwYQONGzdmzJgxXtEWs9mMv78/AF988QWdOnVi3759XnlfXLXF\\nbDZ75X0pMWvWLNLS0pg2bRpz5871yvsinuGNsctb41Z9iVf1JVbVhzhV3+JTfYlNpduxYcMGr70f\\n4j0uuX8hhhesZta0aVPuuusuunfvTlJSEs899xx2u722q1Wr6tp969WrF40aNaJly5asW7eOtWvX\\n0rZt20p9ti60ZdeuXXzxxRfMmjWLyZMnV7mcutaWX375xavvy/PPP8+vv/7KsmXLqlWfutAW8ay6\\nfk8Vt35Tl+6VN8eq+hCn6kt8qi+xqXQ7HnjgAa+9H+I96v3Q8dDQ0DJPyzMyMi44rKq2hYWFceON\\nN2IymYiOjiYkJITc3FysVisA6enphIaGlmtbyfa6yt/fv9JtKL29qKgIwzDq1JPD9u3b07JlS6B4\\n6NTJkye9pi3ff/89H374ITNmzCAwMNCr78vv2+Kt9+XYsWOkpqYC0LJlS+x2OwEBAV57X6T6vC12\\n1be45c2/F0vz1t+J9SFO1Yf4VF9ik6t2tGjRwuvuh3ifep9od+zYkZ07dwLF/6OFhoYSEBBQy7U6\\nv23btvHRRx8BxcMHs7Ky6N27t7MdO3fu5Nprr+WKK67gl19+ITc3l4KCAg4fPsxVV11Vm1U/r/bt\\n21e6DaXv23fffUe7du1qs+rlvPjiiyQlJQHF7/I1b97cK9qSl5fHmjVrmDZtGkFBQYD33hdXbfHW\\n+/Ljjz+yYcMGoPj/+YKCAq+9L+IZ3ha76lvcqi///3nj78T6EKfqS3yqL7HJVTtef/11r7sf4n1M\\nxiUw/uGdd97h0KFDmEwmHnroIecTrLoqPz+fV155hby8PIqKihgxYgSXX345y5cvx2azERERwcSJ\\nE/Hx8WHnzp189NFHmEwm4uPj6dmzZ21XHyj+Yvi3v/2NlJQULBYLYWFhTJ48mRUrVlSqDQ6Hg1Wr\\nVnHmzBl8fX2ZOHEiERERdaYt8fHxrF+/Hj8/P/z9/Zk4cSKNGzeu8235/PPPWbt2LU2bNnVue/TR\\nR1m1apXX3RdXbenduzeffvqp190Xq9XKypUrSUtLw2q1MmLECOdyNt52X8RzvCl2eXPcqi/xqr7E\\nqvoQp+pLfKovsclVO/z9/XnnnXe86n6I97kkEm0RERERERGRi6XeDx0XERERERERuZiUaIuIiIiI\\niIh4kBJtEREREREREQ9Soi0iIiIiIiLiQUq0RURERERERDxIq62L/I5hGGzatIkvv/ySoqIiioqK\\niImJ4Q9/+AOtWrUCipcamTRpEldeeWWF5axYsYLo6GiGDx9e6XMfPHiQVatWsWzZsnL7jh07xpo1\\na0hPT8cwDIKCghg1apSzDp9//jn9+/d3s7UiIuKNFKtEROo2Jdoiv/P3v/+dgwcPMmPGDEJDQ3E4\\nHPz73/9m7ty5vPLKKwQHB1/0OhmGwYIFC3jkkUfo3LkzAN988w0LFy5k5cqV5Ofn89FHH+nLi4jI\\n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\\nixcTHBxMnz59zvsemye98MIL5OTk0LNnT+6//37uuecegoKCqvXO8sCBA7njjju4//776d+/PwkJ\\nCbz66qu0adOGIUOGcOLECUaOHMnRo0e5+eabOXLkyAWvlydYLBZef/118vPz6du3L/3796eoqIjX\\nX3/dORlMdnY2x48fd75zd+211/LSSy/x6quv0rlzZyZNmsSoUaMYM2aMs9zZs2czcOBAxo0bx3XX\\nXcc333zD3/72N2cvjIhIXaVY5f2xys/Pj+jo6DJ/goODsVgsREdH4+fnx7/+9S/y8vJ47LHHyi0z\\ntm7dOo/VXUTqJ5NR8s1YRNxSegIXm81Gp06deO655xg+fHgt10xERKSYYpWISO1Qj7ZIFYwfP57R\\no0eTnp5OYWEhy5cvx8fHh5tuuqm2qyYiIgIoVomI1KaL0qN98uRJFi1axK233kp8fDypqaksX74c\\nh8NBSEgIkyZN8sismCIXS1JSEv/7v//Lrl27sNvttG7dmqlTp9K9e3fGjRvHzp07z/v577//Xmtw\\nitQhilNSHylWiYjUnhpPtAsKCliwYAHR0dHExsYSHx/Pq6++SqdOnejevTvvvvsuERERDBw4sCar\\nISIi4pLilIiIiHhajQ8d9/X1Zfr06YSGhjq3HTx40Dl7Y9euXdm/f39NV0NERMQlxSkRERHxtBpf\\nR9tisZQbdlRYWOgcghccHFztNR1FRESqSnFKREREPK3GE21PKVmb0VNiYmI8XmZtUDvqFrWjbqkP\\n7agPbYDf2hETE1PbValRilWuqR11R31oA6gddU19a0d9j1VycdTKrOP+/v5YrVYA0tPTywzXExER\\nqW2KUyIiIlIdtZJot2/f3jnT5c6dO7n22mtroxoiIiIuKU6JiIhIddT40PFjx47xt7/9jZSUFCwW\\nCzt37mTy5MmsWLGCzz//nIiICG6++eaaroaIiIhLilMiIiLiaTWeaLdq1Ypnn3223PbZs2fX9KlF\\nREQuSHFKREREPK1Who6LiIiIiIiIlHj11VcZMGBAbVfDY5Roi4iIiIiI1HMrV67E4XBU+vjdu3ez\\nY8eOGqxRWRMnTmTLli0X7Xw1TYm2iIiIiIhIPXb48GGWLFniVqL91ltvOScGFfcp0RYREREREakH\\nPvnkE4YOHUqnTp3o1q0bjz32GB999BF33nknAJ06deIvf/kLAFu3bmXEiBF06dKFG264galTp5Ke\\n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\\nS4bjRx3vPH7U6R7jvOBIkst4xzk5vDV5Nb1w9l9HVyayqQVBYMpxvNNkJrUg0KlEOz+qBclhpWds\\nB0gOa01+PefjrWxqqy4vr95D9DV5O1xH21nZ1jwSDMcPmOKNArKtuZT/XxQI8o3A36sWeda0Uvv8\\nvYIJ8nV+9MDuM2tLDEXPs6ZxNnM/u8+srdBQ9MpK3EVEpHor8xvDX//610o7aUBAANOmTau08kWq\\nquK1ti9c/quYfa1tN+t0aw327c4mNdlKQb6Br5+J0HAvOnSt4XRZLh8qn3C+aAkuHAxFz0grWufb\\niUQ7zVITw5TtcJ9h8iHNUsOpxNPViWxobS8oq+fWZHL6wUyapSaGuYx4zc7HezWorbo8w+xHRtRI\\nzJYMAgtTKPAJI6+CS3plF5x3+L43QC42sgsT8OXGcpcX4BNKWGDjEolxsbDAxk73HFfGUHRXJ+4i\\nInJtcP+3dhEp4XJrbTvD5UO9AW8fE126B5GXayM7y0aNILPzPdn/4+qh8oafH3l+tdjZ2dFQ9NkE\\nOPlOdVE9yk5kneXqRLZSHsy4MF7xLDbv4CteMzsgsCmBeJFD6QdGAXgREFB66b/L6Xpd7AU9xhn4\\newXbe4yd5eqh6JX5DrmIiFRvSrRFPIx/gJnowSFlrrXtbFkuHep9UdlX8nlw/VB5U35+UZLtaHKw\\nzn8luiDXufpVwoMKVyeynv5gRqoXf/8G1PYJ41RhYql9tX3C8Pdv4HSZPl7+dG/wNHl5p8jNPUZA\\nQJMKlQOuH4peGe+Qi4jIteHKviWLSKUJCfWmcXO/Kx4u3unWGtSN8sbXryiR8/UzUTfKm063Oj/U\\n29WKe2QdqUiPbLpfJAW+jhPMAt9apPs6N8t68YMKRyryoKI4kXWkools8YOZ7tFB3NQhgO7RQUQP\\nDqnQQxBXxyvVU+cmc2jgU4dAvDABgXjRwKcOnZuUXp6uPEy2fILPvknImdcJSvyYkDOvE3z2TUw2\\nB0M1LqN4KLojFRmKXpy4O1LRd8hFRDzde++9V67jtmzZQlZW6VUtKmLq1Kl8+eWXLinrQpmZmUyZ\\nMoWYmBj69+/PihUr7PsOHjzIsGHDiImJ4b777mP79u32fZ988gmDBg2if//+TJgwgczMTKfPre4J\\nkWrOlUO9K4Mre2QvPTmYidSCGk7Pwu3Kd9Irc4RBSKi3S97hd2W8Uj15e9eiW4sX/9cDfZyAgMYV\\n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\\nXho2LuKB1FaJiIi7WJMTsZw7jXe96/EKr3N1zmm1snjx4nIl2i+99BIdOnRwSaK9ePHiKy7DkRdf\\nfBEfHx+2bNlCTk4OgwcPplOnTtx2W9EEXW+88QbXX399qc9NmzaNHj16MHr0aHbv3s2GDRucTrTd\\n8s3+xIkTrF27FoADBw7QuHHjq/J+toi7dehag7pR3vj5F80w7udvom6UNx261nBzzUTkYmqrRETE\\nHWy5OST+9WnOTxpBwrTHOT95BIl/fRpbbo7LzmGxWJg5cyb9+/enX79+PPXUU2RlZTF69GgyMzOJ\\niYkhLi6OY8eO8eCDDzJgwAD69evH5s2bAZg+fTrHjx9nxIgR7N27l4yMDJ599ln69+9Pnz59+M9/\\n/uPwvN999x333nsvd955JwMGDGDr1q0AjBgxgg8//JBPP/2UmJgY+39t2rSxT0b6/fffM2TIEPr1\\n68fw4cOJi4sDinqfBw0a5PB8/fr1Y+LEiZjNZoKCgrjhhhv49ddfL3ltzp07x+HDh+2Tknbt2pWV\\nK1c6fY3d9o62YRhMnz4dX19fJkyY4I5qiFx13j4munQP0jraIlWA2ioREXGH5CWzyPv2G/vPtpQk\\n8r79huQls6jzlxddco6dO3dy+vRp+1DplStXsn//fhYsWEB0dLR9+/jx4+nVqxfjxo1jz549jB07\\nlv79+7Nw4UI2btzIW2+9RWRkJDNmzMBsNrN161bS0tK47777aNOmDS1atChx3kWLFjF9+nS6dOnC\\niRMnWLVqFQMGDLDvL06wAfbs2cO0adO4++67ycrK4oknnmD58uXcdtttbN68mUmTJrFx40bq1q1r\\nfwBwsW7dutn/nJWVxf79+xkzZox92+LFizl+/Di+vr7ExsbSp08ffvnlF66//nqWLVvGV199RZ06\\ndZgxYwatWrVy6hq7JdE2m808+eST7ji1iEfwD1CCLeLp1FaJiMjVZk1OpODXnxzuK/j1J6zJiS4Z\\nRh4WFsbvv//O559/zu23387kyZMBOH36dInj1q5di2EUzS/UsWNH8vPzSUxMLPUe+1dffcWrr76K\\n2WwmLCyMfv368dlnn5VKtMPDw9m0aRPh4eE0bdqUZcuWOaxfeno6zz33HEuWLKFWrVps376dunXr\\n2od8Dxo0iOeff77c878UFBTwzDPP0Lt3b9q3bw/AnXfeSffu3bnlllvYu3cv48aN44MPPiAjI4Oj\\n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\\nLZ17s0REJCCUq0REgp9GtEXaqa+v7zDdrr6+nmeffRaAxsZG7rrrLqZOnerZf+DAAUaNGuUZFbj9\\n9tvZsmWL54vC2LFjPee74YYbKC4u5u677yYnJ8dzjpEjR3q+jPhisVhYtmwZBQUFbNu2jfz8fPr3\\n788DDzzADTfc0OHYsrIyampqmDRpEgBXX3018fHxHDlyBID+/fszfPhwT5s+/PBD/98oEREJGOUq\\nEZHgp0JbpJ34+HjOnDnj+blnz57k5uYCkJ+fj9Pp7HB8bW0tPXv29Pxss9mA1ulzbedrv6++vh6A\\nwsJCtm/fjsPhwO12YxjGBdtms9m4//77uf/++6murmbXrl3k5uZ2+CIErV+4nE4nCxcu9GxzOBzU\\n1dUBEBcX1yG+tu0iIhIalKtERIKfCm2RdoYPH05NTQ1Hjx5l8ODBFzw+ISGB4uJiz891dXVYLBZ6\\n9erl+bn9vp49e1JVVcWmTZtYtWoVgwYN4rvvvmP+/PnnfR273U5FRYVn1dbExESmTZvGnj17OHHi\\nhOf1AJKSkrDZbJ4vXe3t2rWL2traDm1q/2VGRESCn3KViEjw0z3aIu3ExsYyffp0NmzYwKlTpwBw\\nu9188skn7NmzxzPtrk1GRgaHDh3i9OnTAHzwwQeMGTOGyMhIAP79739TV1eH2+1m3759jBw5ktra\\nWnr06EFaWhoul4sdO3YArdP9fLHb7eTk5FBaWurZVlJSQmVlJenp6URGRtLY2IjL5aJ3794kJyez\\nd+9eoHUkIzc313P+srIyjh49CsDevXsZOXKkGW+diIh0E+UqEZHgpxFtkR+YOnUqcXFxrFu3jubm\\nZpqbm0lLS2PRokWMGTOmw7EpKSnMmTPHs4BLnz59eOyxxzz7x48fz7p16ygvLyc9PZ1JkyZhtVoZ\\nO3Ys8+fPJzExkVmzZnH48GGWL1/O7NmzvbZp+PDhPPbYY2zevJmGhgbcbjeJiYksXLiQ3r17ExcX\\nR1xcHI899hirV69mwYIFbN68mTfeeAOLxcK9995LTEwMACNGjODvf/87hw4dIiYmhl//+tdd92aK\\niEiXUK4SEQluFuNibrgRkbCwa9cuCgsLWbZsWaCbIiIi4pVylYiEA00dFxERERERETGRCm0RERER\\nERERE2nquIiIiIiIiIiJNKItIiIiIiIiYiIV2iIiIiIiIiImUqEtIiIiIiIiYiIV2iIiIiIiIiIm\\nUqEtIiIiIiIiYqL/B5wp9Daxbm0EAAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d1b02b0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"inception_split(df, \\\"learning_rate\\\", learning_rates, \\\"state_size\\\", state_sizes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Hyperparam Search on Dropout and Num Layers\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>dropout_prob</th>\\n\",\n       \"      <th>embed_size</th>\\n\",\n       \"      <th>global_step</th>\\n\",\n       \"      <th>learning_rate</th>\\n\",\n       \"      <th>loss</th>\\n\",\n       \"      <th>num_layers</th>\\n\",\n       \"      <th>state_size</th>\\n\",\n       \"      <th>vocab_size</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>32</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>0.5</td>\\n\",\n       \"      <td>10.595644</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>128</td>\\n\",\n       \"      <td>40000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>32</td>\\n\",\n       \"      <td>203</td>\\n\",\n       \"      <td>0.5</td>\\n\",\n       \"      <td>5.747638</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>128</td>\\n\",\n       \"      <td>40000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>32</td>\\n\",\n       \"      <td>404</td>\\n\",\n       \"      <td>0.5</td>\\n\",\n       \"      <td>5.864061</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>128</td>\\n\",\n       \"      <td>40000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>32</td>\\n\",\n       \"      <td>605</td>\\n\",\n       \"      <td>0.5</td>\\n\",\n       \"      <td>5.508001</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>128</td>\\n\",\n       \"      <td>40000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>32</td>\\n\",\n       \"      <td>806</td>\\n\",\n       \"      <td>0.5</td>\\n\",\n       \"      <td>5.496625</td>\\n\",\n       \"      <td>2</td>\\n\",\n       \"      <td>128</td>\\n\",\n       \"      <td>40000</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"   dropout_prob  embed_size  global_step  learning_rate       loss  \\\\\\n\",\n       \"0           0.2          32            2            0.5  10.595644   \\n\",\n       \"0           0.2          32          203            0.5   5.747638   \\n\",\n       \"0           0.2          32          404            0.5   5.864061   \\n\",\n       \"0           0.2          32          605            0.5   5.508001   \\n\",\n       \"0           0.2          32          806            0.5   5.496625   \\n\",\n       \"\\n\",\n       \"   num_layers  state_size  vocab_size  \\n\",\n       \"0           2         128       40000  \\n\",\n       \"0           2         128       40000  \\n\",\n       \"0           2         128       40000  \\n\",\n       \"0           2         128       40000  \\n\",\n       \"0           2         128       40000  \"\n      ]\n     },\n     \"execution_count\": 26,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"path = BASE + 'cornell.csv'\\n\",\n    \"df = pd.read_csv(path, index_col=0)\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{0.20000000000000001, 0.5, 0.80000000000000004}\\n\",\n      \"{2, 4}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"dropout_probs = set(df['dropout_prob'])\\n\",\n    \"num_layers = set(df['num_layers'])\\n\",\n    \"print(dropout_probs)\\n\",\n    \"print(num_layers)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 28,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n+BAdOnQAALi6uiIrK0vtc+GJiIiIiJo6g5Z/tGrVCocOHUJwcDDS09ORmZmJwsJC2Nvb1/iaxv7k\\nJH5Sk2bcF824L5pxX2rGvdGM+6IZ94Wo6TJoUu3n54dbt27h/fffR6tWrbSqp+bHlBse90Uz7otm\\n3JeacW80475oxn3RjG80qKkwaFINACEhIcqvw8PDYWtra8BoiIiIiIjqzqA11ffu3cPatWsBAFeu\\nXEHbtm1hYsJT/oiIiIjIuBi8ploQBCxYsAASiQTh4eGGDIeIiIiIqF4MmlSbmJhg7ty5hgyBiIiI\\niEhnrLUgIiIiItIRk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakm\\nIiIiItIRk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakmIiIiItIR\\nk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakmIiIiItIRk2oiIiIi\\nIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdaZ1Ul5WVKb+uqKjAr7/+irS0NL0E\\nRURERERkTLRKqn/99VfMnj0bAFBZWYmFCxdi1apVePvtt5GYmKjXAImIiIiImjqxNp3i4uLw6quv\\nAgASExNRWlqKjRs34vbt29izZw969eqlzxiJiIiIiJo0re5UP3z4EAMGDAAAXLp0Cb1794alpSW6\\ndOmC9PR0vQZIRERERNTUaZVUi8ViVFVVQaFQ4MaNG+jSpQsAQC6XQxAEvQZIRERERNTUaVX+0bFj\\nR2zZsgWmpqZQKBR48cUXAQDHjx9Hy5Yt9RogEREREVFTp9Wd6tdeew2ZmZm4e/cu3njjDYjFYhQW\\nFiI2NhaTJk3Sd4xERERERE2aVneqXVxcsHjxYpU2W1tbbNiwAebm5noJjIiIiIjIWGh1p7q8vBx7\\n9+5Vfv/jjz8iIiICmzZtQnFxsd6CIyIiIiIyBlol1du2bcO1a9cAAA8ePMDGjRvh6+uLkpISbN++\\nXa8BEhERERE1dVqVf1y6dAmfffYZAODMmTPw9fVFaGgoioqKMH/+fL0GSERERETU1Gl1p7qsrAwO\\nDg4AgGvXrqF79+4AABsbG5SUlOgvOiIiIiIiI6BVUu3g4ICUlBSkp6fjzp076Nq1KwAgLS0NVlZW\\n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\\n0TAoHRydvzvewC2n5ajHVTrIVfr8/D4R3c7ECzG7Zew1HsMdB4nSF8s/iIguglKtypTeHU/pRXVK\\nn1+fR0QgkHixZcAvpnwhJhFlDgbVREQjnJL1uGpscT3w/Gw5WbKdX1AbgR+JA2c/RAS1ibPYRETf\\nhOUfREQjnNIlJ0rXjQ88v2kTyxHqccpyrK5wBO1iCOM12rjn2sUQusMRlMhyZCJKdwyqiYhGCaXq\\ncdVaVBc7vyKzAS098hzDbtbjk6xeIIj4hZj6XtxptspzYCJKewyqiYgooXRcVGfN1uMSqwnvnotf\\niHm1zZx250tEymFNNRERZZRYDbfBKKADIRiMAntGE1HSRkSmOhgMYuXKlVi0aBHmzZun9nCIiCiN\\nsWc0EclhRATVf/3rX2E2y9Nwn4iIKJF0LG8hIvWoXv5x7tw5nD17FtOnT1d7KEREREREF0WQJElS\\ncwBPP/007r33XuzduxfFxcUs/yAiIiKiUUfV8o9//vOfmDRpEoqLi4f8My0tLTKO6EKlpaWKHm+0\\n4LwkxnlJjPMyOM5NYpyXxDgviZWWcoEpjQyqBtW1tbVob29HbW0tnE4n9Ho9LBYLrrzySjWHRURE\\nREQ0LKoG1Q8++GD/n//85z+juLiYATURERERjTqqL1QkIiIiIhrtRkRLPQBYvHix2kMgIiIiIroo\\nzFQTERERESWJQTURERERUZIYVBMRERERJYlBNRERERFRkhhUExEREREliUE1EREREVGSGFQTERER\\nESVJkCRJUnsQRERERESjGTPVRERERERJYlBNRERERJQkBtVEREREREliUE1ERERElCQG1URERERE\\nSWJQTURERESUJAbVRERERERJ0qk9gJHo5ZdfxsmTJyEIAu655x5MnDhR7SEpqq6uDuvXr0d5eTkA\\nYNy4caiursbGjRshiiIKCgrw05/+FHq9Hvv27cNbb70FQRBw44034jvf+Y7Ko5dHU1MT1q5diwUL\\nFmD+/Pno7Owc8nyEw2E8//zz6OjogEajwbJlyzBmzBi1TyklBs7Lpk2b0NjYiNzcXABAdXU1ZsyY\\nkXHzsn37dnzxxRcQRRELFy7EpZdeyusF8fNy+PDhjL9eAoEANm3aBLfbjVAohEWLFmH8+PG8XohG\\nI4kuUFdXJz399NOSJElSc3Oz9Oijj6o8IuUdO3ZMevbZZy94bNOmTdK///1vSZIk6dVXX5V2794t\\n+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\\nYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d89f2e8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\nLdeZzWbLUo7CjM+MGTMICwvL98HJZDLh5uamZRQiUiJpKYXIHYSFhTFz5kwmTJhAYmIiXl5ebN++\\nnbi4uHw3Yjnb448/joeHB/PmzcPV1ZUKFSqwadMmoqOjeeONNxg3bhzffvut5dpczz77LOPGjQPy\\n78YAN3ZO2LNnDx9++CFRUVHUq1ePmJgYFi5ciMFgoE+fPnesrUWLFkycOJEBAwYQHh5O9erVycjI\\nYPv27ezevZtevXrd8Vf2HTp0YOzYsYwbN46uXbvyl7/8hYYNG2IwGDh69CjLly8nPT2dMWPG0K1b\\nN8vr3n//fV566SUGDBjAc889R4UKFTh69Cjfffcd1apVY8iQITaN792oUqUKixYt4ty5czRo0IDo\\n6Gi++uorypUrx/PPPw/cWB5SuXJl1qxZQ6VKlahZsya7d+/m119/5YMPPuCtt95ixYoVlC9fPt8u\\nELfj7u5O/fr1+e6770hKSuKJJ56w3PT33Xff4eHhYVmOUr9+ffr27ct3333HkCFDCAsLIysri02b\\nNrFr1y5eeuklqzcu3knLli2ZNWsWffr0oVevXlSuXJnU1FQ2btxIdHQ0b7755l23KSJibwrGIncQ\\nHBzM559/zpdffsm0adPw8PCgXbt2RERE0KNHjxK1nMLPz4/Zs2czadIkZs6ciZeXF+3atWP8+PEY\\njUbWrVvHrl27MJlMeYJxt27d+OSTTwgMDKRp06b52q1WrRpLly7liy++YM2aNURGRuLl5UXz5s0Z\\nOnSoZcuy26levTqLFy9m9uzZfP/99yQkJGAymahVqxajR4+2hMU76dOnD61atSIyMpIdO3awbt06\\nMjMzqVy5Mt27d2fAgAH5dk1o1qwZ3333HTNmzGDu3LmW5Qy9e/dm6NCh+Z6SVxxcXV2ZM2cOn376\\nKatWrSIzM5OQkBBGjRqFv78/cOOGxdmzZzN+/HgiIyNxd3enVatWLFy4kIoVK7JmzRp27tzJrFmz\\n7ioYw40PA7Vq1WLlypV89tlnpKam4uPjQ/PmzXn11VfzLI94//33qV27NkuWLOGjjz7CaDTy0EMP\\nMX78+EI/VrtZs2Z8++23zJ07l8jISK5cuYKrqytBQUFMmDAh37Z3IiIlgcF88+/OROSBtH//fsLD\\nwxk9enSRHmwiNwQFBVGzZk1+/PFHZ5ciIiJ3QWuMRR5wWVlZTJo0CW9vb3r27OnsckRERJzGoUsp\\n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\\neWafL1++jJ+fn01tOIKCsYiIiEgJE+hdGp8yrsRbCcc+Hq5U8S5t1/6XLVtGamoq3bp1sxxLSUnh\\n0KFDbNq0iRUrVuS5vnHjxmzdujXPsb179+Lq6mpZV+zq6sqBAwfo2LGj5Zp9+/bRrl07m9uwNy2l\\nEBERESlhKni68Yh/WavnHvEva9fZYoCRI0fy888/s2rVKstXgwYNCA8PJyIigkOHDtGpUydiY2MB\\nCA8P59y5c3z99dekp6cTFRXF9OnT6dWrF15eXnh5edGzZ0+mT5/OqVOnSEtL46uvviImJobw8HCb\\n2nAEBWMRERGREmhc10d4rLYffmVcMRrAr4wrj9X2Y1zXR+zed7ly5fD398/z5erqiqenJxUqVCAt\\nLY1Tp06RmZkJQGBgIHPmzGHdunU8+uij9O/fn7Zt2zJy5EhLm6NHj6Zly5b07duXFi1asHHjRubO\\nnUuVKlVsbsPeDGaz2eyw3opB7icTRwgICHBof/cKjYt1GhfrNC4F09hYp3GxTuNiXUBAgLNLsLtL\\nKdeJuZJGFe/Sdp8pftBpjbGIiIhICVbB002B2EG0lEJEREREBAVjERERERFAwVhEREREBFAwFhER\\nEREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQE\\nUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFY\\nRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERER\\nERFAwVhEREREBFAwFhEREREBwOTMznNycpgzZw7nzp3DZDLx8ssvU6VKFWeWJCIiIiIPKKfOGO/Z\\ns4fU1FTGjx/PkCFDWLBggTPLEREREZEHmFOD8fnz53nooYcA8Pf359KlS+Tk5DizJBERERF5QDl1\\nKUW1atVYt24dXbp0IS4ujosXL5KUlIS3t3eBrwkICHBghY7v716hcbFO42KdxqVgGhvrNC7WaVxE\\n7Mupwbhx48YcPXqUDz74gGrVqtm0vjg2NtYBld0QEBDg0P7uFRoX6zQu1mlcCqaxsU7jYp3GxTp9\\nWJDi5NRgDBAeHm7587BhwyhbtqwTqxERERGRB5VT1xifPn2aL7/8EoADBw5Qs2ZNjEbtICciIiIi\\njuf0NcZms5lRo0bh6urKsGHDnFmOiIiIiDzAnBqMjUYjr732mjNLEBEREREB9OQ7ERERERFAwVhE\\nREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMRERER\\nEUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAF\\nYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQHuIhin\\npaVZ/nz9+nX27t1LbGysXYoSEREREXE0m4Lx3r17efXVVwHIyspi9OjRTJ06lbfffptdu3bZtUAR\\nEREREUcw2XLR0qVLefHFFwHYtWsXqampREREcOzYMRYtWkTLli3tWaOIiIiIiN3ZNGN8/vx5Hnvs\\nMQD27dtHq1at8PDwoGHDhsTFxdm1QBERERERR7ApGJtMJrKzs8nJyeHIkSM0bNgQgMzMTMxms10L\\nFBERERFxBJuWUtSpU4d58+bh4uJCTk4O9evXB+Dnn3+matWqdi1QRERERMQRbJoxfumll7h48SIn\\nT57k9ddfx2QykZSUxOLFi+nXr5+9axQRERERsTubZowrVarE3//+9zzHypYty+zZs3F3d7dLYSIi\\nIiIijmTTjHF6ejpLliyxfL9582ZGjhzJnDlzSElJsVtxIiIiIiKOYlMw/vrrr/njjz8AiImJISIi\\ngpCQEK5du0ZkZKRdCxQRERERcQSbllLs27ePTz/9FIAdO3YQEhJC3759SU5O5p133rFrgSIiIiIi\\njmDTjHFaWho+Pj4A/PHHHzRt2hQALy8vrl27Zr/qREREREQcxKZg7OPjw9mzZ4mLi+PEiRM0atQI\\ngNjYWMqUKWPXAkVEREREHMGmpRRPPfUU7733HgCPPvooFStWJDU1lalTp+px0CIiIiJyX7ApGHfp\\n0oXatWuTmppKSEgIAG5ubrRo0YJnnnnGrgWKiIiIiDiCTcEY4OGHHyYlJYWzZ88C4O/vz7PPPmu3\\nwkREREREHMmmYHzt2jW++OIL9u3bh9lsBsBoNNK6dWuGDBlCqVKl7FqkiIiIiIi92RSMv/nmGy5d\\nusQbb7xBYGAgZrOZs2fPsmLFCpYuXUrfvn0L1Xl6ejozZszg2rVrZGZm8uyzz1pu7BMRERERcSSb\\n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\\n+Hjc3d3zHffw8LDsb1xYV65coVy5ckVqQ0RERESkqGwKxtWqVWPWrFnExMSQkZFBVlYW58+fZ+7c\\nuVStWrVIBdSqVYvRo0cXqQ0RERERkaKyaf3CK6+8wqRJk3jrrbfyHC9btiyjRo2yS2EiIiIiIo5k\\nUzCuVq0an3/+OcePHyc+Pp6srCx8fX2pW7cupUqVsneNIiIiIiJ2Z/MdbwaDgbp161K3bl171iMi\\nIiIi4hQFBuPnn3/esmVbnz59btvI4sWLi7cqEREREREHKzAYDxo0yPLnV155BYPB4JCCRERERESc\\nocBgfPOT6Nq3b++IWkREREREnKbAYPzll1/a1IDBYODVV18ttoJERERERJyhwGAcFxdnUwNaYiEi\\nIiIi94MCg/HYsWNtauDo0aPFVoyIiIiIiLPY9OS7XCkpKSQmJlq+jh07xkcffWSv2kREREREHMam\\nfYxPnz7N5MmTuXjxYr5z2tdYRERERO4HNs0Yf/3119StW5d33nkHFxcXRowYQY8ePahfvz6jR4+2\\nd40iIiIiInZnUzA+c+YMgwcPplmzZhiNRpo0aUKfPn3o0KEDkZGR9q5RRERERMTubArGLi4uGI03\\nLjWZTKSmpgLw6KOP8ttvv9mvOhERERERB7EpGNeuXZs5c+aQkZFB1apVWblyJenp6Rw+fFjbtYmI\\niIjIfcGmm+/69+/P5MmTycnJoXv37nz22WesWrUKgGeeecauBYqIiIiIOIJNwTgwMJCpU6cC0KRJ\\nEyZNmkRUVBSVKlXSrhQiIiIicl+47VKKjz76iH379uU7XqVKFdq2batQLCIiIiL3jdvOGOfk5DBh\\nwgQqVqzIk08+SVhYGJ6eno6qTURERETEYW4bjP/+979z/vx5fv75Z1avXs3SpUtp3bo1nTp1ombN\\nmo6qUURERETE7u64xrhy5cr079+f5557jl27dvHTTz8xcuRI6tSpQ8eOHWnVqhUmk01LlUVERERE\\nSiybE63JZCI0NJTQ0FCio6PZunUrixYtYsGCBURERNizRhERERERu7NpH2NrcnJyyMnJKc5aRERE\\nREScxuYZ46ysLH799Vd++uknjh49St26denXrx8tW7a0Z30iIiIiIg5xx2B8/vx5fvrpJ7Zu3cr1\\n69dp06YNL730km6+ExEREZH7ym2D8Ycffsiff/5JhQoVePrpp7Vdm4iIiIjct24bjE0mE++88w5N\\n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\\nnT17Vo2Njbr11lv1gx/8QMnJyZI8O9lNnz5dFy9e1CeffCKbzaZ77rlHjzzyCFlnAOjF+AkOwKeq\\nqiqdOHFCM2fO9AbFV0tKSlJWVpbPoFiS1q9fr9LSUj333HN6/fXXde+99+pXv/qVcnNzvc8pKCiQ\\ny+XShg0btHbtWhUWFuo3v/mNJKmiokJr167V3Xffrddee00vvviizp8/r23btnVq/CkpKbLZbNq5\\nc6cqKiq8j9tsNt19990aNGiQJkyYoIULF0qStm3bpqysLFVVVenZZ5/V6NGjtWXLFm3ZskXR0dH6\\nxS9+0So7/u6772ry5Ml69dVXtXz5cu3bt0/79+/v1NgAAD0TgTEAn0pKSmQYhjdL2hUFBQXKycnR\\nvHnzlJCQIIfDofvvv18pKSn68MMPvc+z2+168MEH1adPHw0aNEj333+/jh49KrfbrdjYWL388su6\\n7777ZLfbFRMTo9tvv115eXmdGsPQoUP1wx/+UB9//LEWLVqk5cuX6+WXX9bhw4fV1NTU4df985//\\nlMPh0Ny5cxUREaF+/frp0UcfVUlJiXJycrzPS09PV2ZmpsLDwzV27FiNHz9e//73v7s8VwCAnoNS\\nCgA+tWSJ23aZeOqpp1RUVCRJcrvdys7O1uzZs1s9p7i4WJKUmpra6vGUlBSVlJR4/52UlNRq8d6Q\\nIUPU2NioyspKxcbG6sMPP9R7772nsrIyud1uNTc3Kz4+vtPXMH36dE2bNk25ubnKzc3V559/rl//\\n+teKj4/XT3/6UyUlJbX7mgsXLsjlcumRRx5p9bjdbldpaWmra7na4MGDdfz48U6PDQDQ8xAYA/Ap\\nOTlZdrtdhYWFSk9P9z6+du1a79+feeYZn4vvGhsbJandgra2//ZVoiFJDodDBw4c0Pbt27VkyRJl\\nZmYqIiJCO3fu1EcffdSl6wgPD9eYMWM0ZswYzZo1S06nUytXrtSf//xnLVmypN3zIyIiNHTo0FbX\\n6Uvb6zYMo8PrAQD0DpRSAPApKipKkyZN0u7duzssPeiok8OQIUMkSf/5z39aPV5YWNiqNKOkpKRV\\nRvrixYuKjIxU//79lZubq5SUFE2bNk0RERGSpDNnznR6/O+//7727dvX7vH4+HgNGzZMVVVVHY69\\nuLhYtbW13scMw9ClS5daPe/ixYut/l1SUqKEhIROjw8A0PMQGAPo0Pz589XU1KTnn39eeXl53nKG\\n/Px8bdmyRXl5eRo5cmS7r0tLS9OoUaO0Y8cOVVRUqKGhQXv37lVxcbG++c1vep/X2NioXbt2qaGh\\nQSUlJdq3b5+mTp0qyVNm4XQ6VVpaqurqau3atUt1dXWqrq5WXV3ddcdus9n0u9/9Tu+88443CK6p\\nqdH+/ft14sQJ3XXXXZI8XTYk6fz586qtrdW0adMUGRmpV199VZcvX1Z9fb3++Mc/asWKFaqpqfH+\\n/6dOndKRI0fU1NSkkydP6vjx45oyZcqNTzYAwHI2g+adAK6hurpau3fv1pEjR1RWVia73a6EhARl\\nZGRoxowZ3jrdAwcO6KWXXtLvf/97hYWFyeVy6bXXXtOpU6fU0NCg1NRUPfzww7rlllskeXa+c7lc\\nuu222/T222+roaFB48aN08KFC9WvXz/V1dVp48aN+uyzzxQVFaWZM2cqMzNTq1atUn19vbZu3ap5\\n8+Zp4cKFuueee3yO/dChQ/r73/+uwsJC1dTUyOFwaPjw4XrggQeUmZnpvb5nn31WhYWFmjlzpubN\\nm6f8/Hxt375deXl5Cg8PV1pamubNm6cRI0ZI8rRry8zMVGVlpbdd23333aeHHnqIcgoA6MUIjAGg\\nix5//HHdeeedevDBB60eCgDAjyilAAAAAERgDAAAAEiilAIAAACQRMYYAAAAkERgDAAAAEgiMAYA\\nAAAkERgDAAAAkgiMAQAAAEnS/wNDyULxVehlcAAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8cd3f0b8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"split_df_and_plot(df, 'dropout_prob', dropout_probs)\\n\",\n    \"split_df_and_plot(df, 'num_layers', num_layers)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 35,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n8olSUlIcHUaTOXr0qH73u99pwIABGjx4sJ555hnl5OTUeXxhYaFeeuklRUdHq2/fvho5cqTefPPN\\nGsd88cUXmjhxom6//XYNGzZML7zwgkpKSuxdFQAAAMCQSNCBRoqNjdWxY8ccHUaTyMvL0+OPP65b\\nbrlFu3fv1vvvv6+CggLNnj27znOWLFmi/fv366233tLBgwf14osvKjY2Vn//+98lSWfOnNGTTz6p\\nBx98UElJSdq4caOOHj2ql156qamqBQAAABgKCToc6uTJk5o4caK1hTUpKanG/vnz52vmzJmaN2+e\\n+vbtq3PnzkmStm3bpl/96le69dZbNXjwYC1dulRlZWWSpP3796tHjx769NNPNXr0aPXu3VsjRozQ\\nvn37rOWWlJTolVde0fDhwxUVFaX77rtPW7Zsse6PjY3V3XffXSOW//7v/9Y999wjSbr77ruVkpKi\\nF198UaNHj25QXWNjY/XAAw/ovffe07Bhw9S7d29NnDhR6enpkqQff/xRPXr00N/+9jdFR0drwYIF\\nkqSffvpJv//97zV48GD16dNHEyZM0P79+2uUbbFYtGzZMt15552688479fzzz6u0tLTWONasWaPe\\nvXvX+m/KlCm1nrNz505ZLBY9/fTT8vX1VUhIiJ599ll9+eWX+u6772o95+jRo4qOjlZERIRcXV11\\n5513qkePHjp8+LAk6W9/+5u6dOmiSZMmydPTUx06dND06dO1Y8eOa7bMAwAAAM0VCTocxmKxaMaM\\nGQoNDVVSUpI2b96st99++6rjDhw4oJtvvlkHDhxQ+/bt9d5772nZsmWaP3++Dh48qDfffFN79uzR\\nn//85xrnvfnmm4qPj9f+/fs1bNgwPfXUUyosLJRU3bq7b98+rVu3Tl9//bXmzZunP/3pT9q1a1eD\\nYv/ss88kSS+++KJ27NjR4Dqnp6frwIED+uCDD5SYmCiTyaS5c+fWOGb79u3atm2b/vSnP6myslJT\\npkyRu7u7PvjgA+3fv18DBgzQ1KlT9dNPP1nPSUxMVFhYmD799FP99a9/1d69e7V69epaY5g+fbqO\\nHDlS67+//OUvtZ5z6NAh3XzzzXJzc7Nu69Gjh1q3bq1Dhw7Ves59992nPXv26NSpUzKbzTpw4IBO\\nnjypX/7yl9Yyo6KiapwTFRWlysrKFjV0AAAAALiMBB0Oc+TIEf3www+aMWOGfHx8FBISounTp191\\nnMlk0uTJk+Xm5iaTyaTNmzfrv/7rvzRo0CC5ubmpZ8+emjRpkrZv3y6z2Ww977e//a06dOggLy8v\\nzZgxQ2VlZfrss89UWFio7du3a8aMGYqMjJSbm5uGDx+uu+++W//3f/9n1zqXlpZq3rx58vHxUXBw\\nsB577DF9/fXXysrKsh5z//33KywsTCaTSUlJSfrhhx+0cOFCBQYGysPDQzNnzpSHh0eNLxPatm2r\\nRx55RK1bt1aPHj00evRo7d6922Zx5+bmyt/fv8Y2k8kkf39/ZWdn13rO7NmzFRUVpQceeEA33XST\\nHn30Uc2ePVuDBg2SJOXk5FxVZmBgoCTVWSYAAADQnJGgw2HOnz8vSWrfvr11W7du3a467he/+IVc\\nXP7zUj179qy6du1a45jIyEgVFxfXSHQjIyOtP/v7+8vPz0/nz5/XuXPnZDabr7pWZGSkzp49e2OV\\nqkdgYKCCgoKsjzt06CDpP8+FJHXs2NH68w8//KCgoCAFBwdbt7m7u6tjx47W7v7S1c9bp06dapRp\\nTyaTqdbtL7/8sk6cOKEPPvhA3377rdavX6+1a9c26EuQusoEAAAAmjO3+g8B7KO8vFxSzWTsyhbw\\ny9zd3Ws8Lisrk8ViqbHt8uMry6qqqrrqGBcXF+tY9Z+XYTabr5kY1hbb9fp5GZdjuPILiCvrW15e\\nflWctZVTW9ytW7euNYY1a9Zo7dq1te674447au3mHhwcrMzMzKtiz8/PV2ho6FXHl5SUaOvWrVq5\\ncqW6d+8uSRo4cKB+9atfWXtAhISEKC8vr8Z5ubm5klRrmQAAAEBzRws6HKZdu3aSZJ0kTZJSU1Pr\\nPS8iIkInTpyosS01NVV+fn4KCQmxbvvhhx+sP+fl5amgoEDt2rVTx44dZTKZrirj5MmT6ty5s6Tq\\n5Pbnk6xdWV5j5efnW5NQSTp37pxMJpP1ufi5iIgI5ebmKiMjw7qtvLxcZ8+eVZcuXazbTp8+XeO8\\nM2fO1FlmY8ag9+3bV8eOHVNFRYV125EjR1RWVqZ+/fpddbzZbJbFYrnqi4TKykrrFw59+/bVt99+\\nW2P/V199pVatWql37961xgEAAAA0ZyTocJioqCiFhIRo7dq1Kiws1MWLF5WQkFBv9+bf/OY32r59\\nu/71r3+pqqpKR48e1aZNm/Twww/XOHfTpk368ccfVVJSovj4eHl5eWnIkCEKCgrSyJEjFRcXpzNn\\nzqiiokK7du2yrsktSV26dFF+fr4+/fRTVVVV6ZNPPtHXX39dIw5PT0+dPn1a+fn5Da5z69attWLF\\nChUWFio7O1sbNmxQ//79a3R7v9LQoUPVrl07LV26VAUFBSoqKtKKFStkNpv1wAMPWI87d+6ctm3b\\npvLych07dkw7duzQ/fff3+C46jNq1Ci5u7vrtddeU2FhoS5cuKDly5crOjraOpRg8+bNmjRpkiTJ\\n29tbgwYN0oYNG3T69GlVVlbq4MGD2rVrlzXuiRMn6ty5c3rrrbdUWlqqtLQ0xcbG6uGHH5avr6/N\\nYgcAAACcBV3c4TCtWrXSG2+8ocWLF2vw4MFq27atnnvuOSUnJ1/zvN/85jcqLi7W0qVLdf78ebVp\\n00a//e1v9dhjj9U4bvz48ZoxY4bS0tLUrl07rVu3Tt7e3pKkpUuXatmyZXr00UeVn5+viIgIxcbG\\naujQoZKke+65R+PGjdO8efNkNps1cuRITZkyRZs3b7aWP2nSJP31r3/Vjh079PnnnzeozgEBAerb\\nt69Gjx6tzMxMRUVFKSYmps7jW7durQ0bNujVV1/VfffdJ7PZrFtuuUVbt25VmzZtrMc98MADOnXq\\nlIYMGSKTyaRf/vKXeuKJJxoUU0P4+vrqL3/5i5YuXapBgwapdevWuvfee/X8889bj8nNza3RyyAm\\nJkarVq3SlClTlJWVpZCQED3++ON69NFHJVXPPbB+/XotX75cK1eulJ+fn0aNGnXVrPYAAABAS2Gy\\n1DbAFXBi+/fv1+TJk/Xxxx+rU6dOjg7HKjY2Vu+88451iTYAAAAAuBJd3AEAAAAAMIAm6eJ+9uxZ\\nxcTE6MEHH9TIkSOVlZWluLg4mc1mBQQEaObMmVfN1A04i4sXL2r48OHXPGbUqFEKDw9voogAAAAA\\nOCO7d3EvLS3VsmXLFBYWpk6dOmnkyJFas2aN+vbtq4EDB+p///d/FRISol/+8pf2DAMAAAAAAEOz\\nexd3d3d3PffccwoMDLRuS0lJ0e233y5Juv3223X48GF7hwEAAAAAgKHZvYu7q6urXF1da2wrKyuz\\ndmn38/NTXl6evcMAAAAAAMDQnGaZtfT0dJuWFx4ebvMyHYF6GAv1MBbqYSzMwwAAAHBtDpnF3cPD\\nQ+Xl5ZKknJycGt3fAQAAAABoiRySoPfu3VvJycmSpOTkZN16662OCAMAAAAAAMOwexf3tLQ0bdy4\\nUZmZmXJ1dVVycrJmzZql+Ph47d69WyEhIRo6dKi9wwAAAAAAwNDsnqB36dJFL7744lXbFy1aZO9L\\nAwAAAADgNBzSxR0AAAAAANREgg4AAAAAgAGQoAMAAAAAYAAk6AAAAAAAGAAJOgAAAAAABkCCDgAA\\nAACAAZCgAwAAAABgACToAAAAAAAYAAk6AAAAAAAGQIIOAAAAAIABkKADAAAAAGAAJOgAAAAAABgA\\nCToAAAAAAAZAgg4AAAAAgAGQoAMAAAAAYAAk6AAAAAAAGAAJOgAAAAAABuDmiIuazWatX79e586d\\nk5ubm5544gn94he/cEQoAAAAAAAYgkNa0A8ePKji4mItXbpUTz75pDZt2uSIMAAAAAAAMAyHJOjn\\nz59X165dJUlhYWHKzMyU2Wx2RCgAAAAAABiCQxL0jh076ttvv5XZbFZ6eroyMjJUUFDgiFAAAAAA\\nADAEk8VisTjiwtu2bVNKSoo6duyoU6dOaf78+QoICHBEKAAAAAAAOJxDJomTpIkTJ1p/njlzpvz8\\n/K55fHp6uk2vHx4ebvMyHYF6GAv1MBbqYSzh4eGODgEAAMDQHNLF/cyZM1qzZo0k6dChQ+rcubNc\\nXFjxDQAAAADQcjmkBb1jx46yWCx67rnn1KpVK82cOdMRYQAAAAAAYBgOSdBdXFw0Y8YMR1waAAAA\\nAABDol85AAAAAAAGQIIOAAAAAIABkKADAAAAAGAAJOgAAAAAABgACToAAAAAAAZAgg4AAAAAgAGQ\\noAMAAAAAYAAk6AAAAAAAGAAJOgAAAAAABkCCDgAAAACAAZCgAwAAAABgACToAAAAAAAYAAk6AAAA\\nAAAGQIIOAAAAAIABkKADAAAAAGAAJOgAAAAAABgACToAAAAAAAZAgg4AAAAAgAG4OeKipaWliouL\\nU1FRkSoqKjRu3DjdeuutjggFAAAAAABDcEgLemJiosLDw7V48WI988wzeuuttxwRBgAAAAAAhuGQ\\nBN3X11eXLl2SJBUVFcnX19cRYQAAAAAAYBgO6eI+aNAgJSYmaubMmSoqKtL8+fMdEQYAAAAAAIZh\\nslgslqa+6Geffabjx49r2rRpOnPmjBISEvTqq682dRgAAAAAABhGvS3ox44d08GDBzV58mQdO3ZM\\nr7/+ukwmk5566ilFRUU16qInTpxQnz59JEkRERHKzc2V2WyWi0vdPe7T09Mbda26hIeH27xMR6Ae\\nxkI9jIV6GEt4eLijQwAAADC0eseg/8///I8GDBggSfrrX/+qiRMnauHChdqyZUujLxoWFqbvv/9e\\nkpSZmSkPD49rJucAAAAAADR39bagV1ZWqkePHsrKylJWVpaio6Ot2xtrxIgRWrNmjRYvXiyz2awn\\nnnii0WUBAAAAANAc1Jugu7i4KDs7W//85z912223SZJKSkpUVVXV6It6eHjomWeeafT5AAAAAAA0\\nN/Um6OPGjdMf//hH+fv7649//KMkaeXKlRo+fLjdgwMAAAAAoKWoN0EfOHCgBg4cWGPb7NmzWbsc\\nAAAAAAAbqndmtmPHjmnjxo3Wn5988kn94Q9/0OHDh+0eHAAAAAAALYVDZnEHAAAAAAA1OWQWdwAA\\nAAAAUFO9Lej2mMUdAAAAAADUxCzuAAAAAAAYQKNmcZ81a5b8/PzsFhQAAAAAAC1NvQl6eXm5du7c\\nqcOHDys/P18BAQHq16+f7r//frm51Xs6AAAAAABogHoz7DfffFNFRUUaNWqUvL29denSJe3du1cX\\nL17U448/3hQxAgAAAADQ7NWboJ88eVKvvfaaTCaTddttt92mZ5991q6BAQAAAADQktQ7i7skVVRU\\n1HjMDO4AAAAAANhWvS3o/fv31wsvvKChQ4fK29tbhYWFSkpK0p133tkU8QEAAAAA0CLUm6BPnDhR\\nHTt21DfffKOCggL5+/trzJgxJOgAAAAAANhQvQm6yWTSoEGDNGjQoBrb9+3bd9XyawAAAAAAoHEa\\nNAa9Nm+//bYt4wAAAAAAoEVrdIIOAAAAAABshwQdAAAAAAADqHMM+okTJ655Ynl5eaMvunfvXn32\\n2WfWx6dOndKmTZsaXR4AAAAAAM6uzgT99ddfv+aJJpOp0Re95557dM8990iSjh07pn/961+NLgsA\\nAAAAgOagzgQ9Pj6+SQJ49913NWvWrCa5FgAAAAAARmWyWCwWR138+++/10cffaQZM2Y4KgQAAAAA\\nAAyh3nXQ7Wnv3r2Kjo5u0LHp6ek2vXZ4eLjNy3QE6mEs1MNYqIexhIeHOzoEAAAAQ3PoLO4pKSnq\\n0aOHI0MAAAAAAMAQHJag5+TkyMPDQ25uDm3EBwAAAADAEOrNjvft26dt27YpKytLZrO5xr6tW7c2\\n+sJ5eXny9/dv9PkAAAAAADQn9SboGzdu1COPPKLOnTvLxcV2De5dunTRggULbFYeAAAAAADOrN4E\\n3dvbW3feeWdTxAIAAAAAQItVb5P4vffeq48//ljl5eVNEQ8AAAAAAC1SvS3o77//vgoKCrRh3a1b\\n3AAAH61JREFUw4arurjfyBh0AAAAAADwH/Um6EuXLm2KOAAAAAAAaNHqTdBDQ0OVlZWlo0ePKj8/\\nX/7+/oqKilJQUFBTxAcAAAAAQItQ7xj0zz77TPPmzdPBgweVnp6uL7/8Us8++6y+/PLLpogPAAAA\\nAIAWod4W9B07digmJkYhISHWbRcuXNDKlSvVv39/uwYHAAAAAEBLUW8LemVlZY3kXJLCwsJUWVlp\\nt6AAAAAAAGhp6k3QQ0NDtX37dpWUlEiSiouLtX37doWGhto9OAAAAAAAWop6u7hPmzZNb7zxhnVJ\\nNZPJpD59+mjatGl2Dw4AAAAAgJai3gQ9JCRECxYsUFVVlS5duiQ/P7+r1kMHAAAAAAA3ps4E/e23\\n39b48eOVkJAgk8lU6zG0ogMAAAAAYBt1Juh+fn6SpODg4Fr315W0AwAAAACA61dngj5y5EhJkpeX\\nlx588MGr9m/cuNF+UQEAAAAA0MLUmaCfPXtWP/zwgz744AP5+/vX2FdUVKTdu3dr8uTJdg+wpcou\\nrtCFwgqF+bgr2Mvd0eEAAAAAAOyszgS9vLxc3333nYqKirRnz54a+1xdXfXb3/7W7sG1RCUVZq38\\nIl3fZ5cor7RKAZ6u6hrkqbmDwuXpzuR8AAAAANBc1Zmgd+3aVV27dlVERIRGjBhx1f7U1FS7BtZS\\nrfwiXQd+KrQ+zi2p0oGfCvXaF+l6Prq9AyMDAAAAANhTvcusjRgxQidOnNDFixdlsVgkSaWlpXr7\\n7be1YcOGRl84KSlJO3bskIuLiyZMmKB+/fo1uqzmIru4Qt/nlNS672R2ibKLK+juDgAAAADNVL0J\\n+qZNm5SYmKgOHTooLS1NnTp10oULFzRhwoRGX/TSpUt699139eqrr1qTfRJ06UJhhfJKqmrdl19a\\npYuFJOgAAAAA0FzVm6B/+eWXio2NlZeXl+bMmaOXX35Zhw8f1vHjxxt90SNHjqh3797y9PSUp6cn\\n66n/W5iPuwI8XZVbS5Lu7+Gqtj4k5wAAAADQXNU765irq6u8vLwkSWazWZIUFRWlAwcONPqiGRkZ\\nKisr07Jly/TCCy/oyJEjjS6rOQn2clfXIM9a93UN9qT1HAAAAACasXpb0Dt16qRXX31V8+bNU3h4\\nuLZu3arOnTurqKjohi586dIlzZs3T5mZmVqyZInWrFkjk8lU5/Hh4eE3dD17l5lZWKYf80rUPsBT\\noT6tG13OinFttGjnMR27UKCc4nIFebXSTWF+ennUTfJqVfvtssdz4wgtqR62er3YU0u6H86gudQD\\nAAAAdas3QZ8xY4Y+/vhjubq6avLkyfrLX/6ib775Ro888kijL+rv768ePXrI1dVVYWFh8vT0VEFB\\nwVXrrV8pPT290derTXh4uE3KtMeyaHPvDFF2sb8uFlao7b/XQc/LylBeLcfaqh6O1lLq4SzL6LWU\\n++Esmroe2cUVulBYobB///2xFb5kAAAAuLZ6E/RWrVpp1KhRkqR27drp+eefv+GL9unTR/Hx8Roz\\nZoyKiopUWloqX1/fGy7XEey1LFqwl20/GOPG2CphaejrxV4JEnAtzvIFEgAAQHNVZ4I+Y8aMa3Y5\\nl6S4uLhGXTQoKEh33nmnNdmfMmWKXFyc78NfdnGFvs8qrnXfyexilkVzIFsluLZMWBqyjJ6XuysJ\\nEhzGXl84AgAAoGHqTNBnzpwpSTp8+LDOnj2rIUOGyNvbWwUFBUpKSlKvXr1u6MIjRozQiBEjbqgM\\nR7tQWKG80krJdHXilF9SybJoDmDrFkBbJiwNWUbvvWMXSZDgEA35Aom/ZwAAAPZVZ8bSs2dP9ezZ\\nU1999ZXmzp2rAQMG6JZbbtFdd92lefPm6YsvvmjKOA0pzFyogIraJ8vzryhSW3NhrftgP5cT6tzS\\nKllUM8G9Xg1JWK7H5WX0auPv4apWriabXg/GlV1coZSMYpvdU1uU15AvkAAAAGBf9Y5BLygo0KVL\\nl+Tn52fdVlRUpIKCArsG5gyCCjLVteCsDoTcfNW+rgVnFXTJWwpr44DIWiZbtwA2JGG5nvIuL6N3\\nZQv5ZV2DPVVWZbHp9WA8tu7hYcvyLn+BlFvLa9Dfw1VtfXjtAQAA2Fu9Cfrw4cP19NNP66abbpKX\\nl5eKi4t14sQJp++ebhNtwvT0T/+tVZK+922vfHcf+VcUquulH/X0Tx9KodGOjtDK6JOOZRaWKSWj\\n+Ibis3VCbY+EZe6gcGtClV9aJX8PV3UNrk6oiiuqnCZBMvrryahsPcbbluXV9wUS9xkAAMD+6k3Q\\nx44dqwEDBuj48eMqLCyUt7e3xo0bp4iIiCYIz9hMAcHy7Bih5779q3Ja+emiZ5DaluQoqLxA6tNf\\npoBgR4do+FmZL8d3Oi9N2UXlhmoBtEfC4unuooXR7ZVdXFFjGb3L++yVIBlx0ryWxtY9POwxZvxa\\nXyABAADA/lxffPHFF2vbcebMGQUEBOjEiROqqKiQv7+/QkNDFRAQoKqqKmVnZyskJKTJAr106ZJN\\ny/P19bVJmaaoO2RJPyvPolyFXsqQp7en1DNKLo/PlcnN/i1O9dVjWdJPOvBToUorLZKk0kqL0i+V\\n62xeme6O8KvzvPpkF1fodG6ZXE2Sl3vt46ob4nJ8xRVVNxyfl7urjl4sUfql8qv29W7rrZHdAq87\\nvjt+4aMf8spUUlGl8kqLAjxc1butt+YOCpe769WrHDT0deXl7qpQb/ernrvrvV59SirMWpb0k7Yd\\nztKu1Dx99kOBjl4s0R2/8LlmeXXVw16vJ3ux1e+5LV7vp3PLtOtEXq37yistGtDBV6Hetf/NqK0e\\nN1JeXdxdTbo7wk9DIvw0oIOvfn1zsEZ2C2zUa682zrqcJgAAQFOpswV906ZNWrRokV5//fVa95tM\\npkYvs9acmDw85fr7hbLkZUuZF6XQtjZpObfkZUsZF6Q2YY0uzx4tbE297JijWwCv1eJtD7a+ni27\\nQLfEWb6NPMbbnmPGg70YugAAAOAIdSboixYtkiTFx8c3WTDOzBQQLNkiMS8tkfnNldKZk1JBnuQX\\nIEV0q26R9/C8rrJsPSZbavplx643Pnsl1E2dsNjiekafNM8ZGHmMN2PGAQAAmp86E/R169bVe/K0\\nadNsGgxUnZx/++V/NuTnSt9+KfObK+X6+4XXVZatW9hsnfDRAmhfzjBp3mW2nnTucnnufmU3VIbR\\ne3gwZhwAAKB5qTNBDwoKuuaJJpNtxiTiPyx52dUt57U5c1KWvOzr6u5u6xa2pl52rKUn2DfKGSbN\\ns/eyY8H/uqDOAa0aVZ4z9PBo6iEYAAAAsK86E/SHH374midu2rTJ5sG0eBkXqru11+ZSfvUY9+vs\\nRm/LFjZ7Ljt2Oq9cOUXltADakD0Salu32Np72bGsonJlFZU3qjxn6uFBjxEAAIDmod5l1rKysvT3\\nv/9dGRkZMpvNkqTS0lJlZ2dr0qRJdg+wRWkTVj3mPD/36n2+/lJo2+su0pYtbPZcdszdL1jffn+O\\nFkAbM/KkeUZfdoweHgAAAGhq9SbocXFxatu2rYYMGaKtW7dq/Pjx2rdvnx577LGmiK9FMQUESxHd\\nao5Bvyyi2w3NDm+rFjZ7jXkN9Wmtm9p43XB8qMnIk+bZugu5PbqkM8YbAAAATaneBD03N1eXl0rf\\nvn277r33XvXv31+vv/66nn/+eXvH1+K4PD73P7O4X8qvbjn/9yzuRsCYV+dkxC7QzrDsGK93AAAA\\nNKV6E3QXFxfl5uYqMDBQJpNJhYWF8vX1VUZGRlPE1+LYa111WzNiwgfn4kzLjvF6BwAAQFOod1rj\\nUaNGaebMmaqqqtJtt92mxYsX69VXX5WPj09TxNdimQKCZep2kyGTc8BW5g4K1x2/8FGgh6tcJAV6\\nuOqOX/jc0LJjV5YX4t3qhsoDAAAAmlK9Lej33nuv7rjjDrm6uuo3v/mNOnXqpIKCAg0aNKgp4gPQ\\njNl72bE+XTuooiDbhhEDAAAA9lNngr548WJFR0dr4MCB8vPzk1Td3X3w4MFNFhyAlsFey46F+rRW\\neoHNigUAAADsqs4u7kOGDFFiYqKmTZumuLg4HT16tCnjAgAAAACgRamzBX348OEaPny4MjIy9Pnn\\nn2vDhg0qLy/X3XffrejoaLVte/1rcl+WkpKi1157TR06dJAkdezYUVOmTGl0eQAAAAAAOLt6x6C3\\nadNGv/71r/XrX/9aaWlp+vzzz/XKK68oICBAS5YsafSFb7rpJs2da4ylw1oCS162lHFBahPGxHMA\\nAAAAYED1JuhXMpvN1n8Wi8VeMcGGLKUl/1lXvSBP8guwrqtu8vB0dHgAAAAAgH8zWerJtDMyMpSU\\nlKTPPvtMlZWVuvvuuzV06FCFhYU1+qIpKSl68803FRYWpsLCQj388MOKiopqdHmoW+ZLz6h0/2dX\\nbfcYcLdCX3jNAREBAAAAAGpTZ4L+8ccfKykpST/88IP69++voUOH6pZbbpHJZLrhi+bk5Oi7777T\\nwIEDdfHiRS1ZskSxsbFyc6u7QT89Pf2Gr3ul8PBwm5fpCNeqhyUvW+alz0j5uVfv9A+Uy8LXDNPd\\nvSXcD2dCPYylOdUDAAAAdaszI/788881bNgwDRw4UJ6etu0KHRQUpLvuukuSFBYWpoCAAOXk5KhN\\nmzY2vU6Ll3Ghult7bS7lS5kXpUYm6C1tTLut69vSnj8AAAAA9aszQX/ppZfsdtGkpCTl5uZq9OjR\\nysvLU35+voKCgux2vRarTVj1mPPaWtB9/aXQ65+Jv6WNabd1fVva8wcAAACg4epcB92ebr/9dh07\\ndkwvvPCCli9frscff/ya3dvROKaAYCmiW+07I7o1quXW/OZK6dsvq5N+i6X6/2+/rN7eDNm6vi3t\\n+QMAAADQcA7Jij09PTV//nxHXLrFcXl87n9abC/lV7ec/7vF9npZ8rKry6nNmZOy5GUbpru2LbqQ\\n27q+zvT8AQAAAGh6NFs3cyYPT7n+fmF1cph5UQpt2/gk0I5j2quyM2VJTbnhMdk27UJu6/ra8fkD\\nAAAA4PxI0FsIU0DwjSd/dhzTfuFsmsx52Tc8JtvahfyyK7qQu/5+4fUVZuv6Xkd5TCIHR+L1BwAA\\n4Bgk6Ggw65j2KxPgy25wTLv58oYbSKht3YXc1vVtSHlMIgdH4vUHAADgWA6ZJA7Oy+XxuVKf/pJ/\\noOTiUv1/n/52G9N+XRrShfw62bK+DSmPSeTQGJa8bFlSU67/d+ZneP0BAAA4Fi3ouC6GHtNuhy74\\nNq1vPeUxiRyuly1bvHn9AQAAOB4t6GgUU0CwTN1uurEP7JcT6to0IqG2x7JyV5Z9w/Wtrzw79ABA\\n82bTFm9efwAAAA5Hgg6HsUdCbesu6U3Kxl9YoHmz+RARXn8AAAAORxd3ONTlddpdzqXJnJdzQ+u0\\nS7bvkt6U7DEJH4zJJrOk23iICK8/AAAAxyNBh0NdTqjbtnbXhaPf2iyhtsmycg5w+QsLnTlZnWTd\\n4BcWl7FsljHYdJZ0O8y5YK/XHwAAABqGBB2G4BocKlO3mxwdhsPZugeAvZbNMnrCfzm+qtbujg6l\\nBuuY8ctuYFlBe7R4O3MPFAAAgOaABB0wIFv1ALBlQigZP+H/eXwXAoNl7tDFEOt422OWdHu1eDtr\\nDxQAAABnR4IONFP2SAiNnvD/PD5zTpaUk9Xo+GzK1ssKihZvAACA5oZZ3IHmysbLZtl81nDZdpkw\\ne8R3ZdmW1JQbKsOes6TbehlAAAAAOAYt6EBzZetJxGzcAmzzFn47tFDbsoWfWdIBAABQH1rQgWbK\\n5uvM27oF2MYt/PZoobZlC79UPWZcffpL/oGSi0v1/336M0s6AAAAJNGCDjRrtpxEzOYtwDZu4bd1\\nfPYYw8+YcQAAAFwLCTrQjNk6ITR0wl9LfC4BQdZZ3K+bHbrMX8Ys6QAAAKgNCTrQAtgqITRywl9b\\nfGG39NHFsorGBWfrMfwAAABAPRyaoJeXl2vu3LkaO3asoqOjHRkKgOtg1IT/5/G5BodK6emNL4NJ\\n3QAAANCEHDpJ3N///nf5+Pg4MgQABmDUZcKY1A0AAABNyWEt6D/99JN+/PFH9e3b11EhAMA1Makb\\nAAAAmpLJYrFYHHHhP//5z3rssceUmJioNm3a0MUdAAAAANCiOaQF/dNPP1X37t3Vpk2bBp+T3shx\\npHUJDw+3eZmOQD2MhXoYC/UwlvDwcEeHAAAAYGgOSdC//vprZWRk6Ouvv1Z2drbc3d0VFBSkqKgo\\nR4QDAAAAAIDDOSRBnzNnjvXnt99+W23atCE5BwAAAAC0aA6dxR0AAAAAAFRz6DrokjR+/HhHhwAA\\nAAAAgMPRgg4AAAAAgAGQoAMAAAAAYAAk6AAAAAAAGAAJOgAAAAAABkCCDgAAAACAAZCgAwAAAABg\\nACToAAAAAAAYAAk6AAAAAAAGQIIOAAAAAIABkKADAAAAAGAAJOgAAAAAABgACToAAAAAAAZAgg4A\\nAAAAgAGQoAMAAAAAYAAk6AAAAAAAGAAJOgAAAAAABkCCDgAAAACAAbg54qJlZWWKj49Xfn6+Kioq\\nNHbsWN12222OCAUAAAAAAENwSIL+1VdfKTIyUmPGjFFmZqaWLl1Kgg4AAAAAaNEckqDfdddd1p+z\\ns7MVFBTkiDAAAAAAADAMhyToly1cuFDZ2dmaP3++I8MAAAAAAMDhTBaLxeLIAM6cOaO4uDjFxMTI\\nZDI5MhQAAAAAABzGIbO4p6WlKSsrS5IUERGhqqoqFRQUOCIUAAAAAAAMwSEJ+rFjx7Rz505JUl5e\\nnkpLS+Xr6+uIUAAAAAAAMASHdHEvLy/X2rVrlZ2drfLyco0bN0633357U4cBAAAAAIBhOHwMOgAA\\nAAAAcFAXdwAAAAAAUBMJOgAAAAAABuDQddAd5a233tLJkydlMpn0u9/9Tl27dnV0SHVKSUnRa6+9\\npg4dOkiSOnbsqNGjRysuLk5ms1kBAQGaOXOm3N3dlZSUpF27dslkMmn48OG65557HBx9tbNnzyom\\nJkYPPvigRo4cqaysrAbHX1lZqTVr1igzM1MuLi6aPn262rZt6/A6xMfHKy0tzTq54ejRo9WvXz9D\\n10GSNm/erOPHj8tsNuuhhx5SZGSk092L2upx8OBBp7sfZWVlio+PV35+vioqKjR27Fh16tTJ6e5H\\nbfVITk52uvsBAABgCJYWJiUlxfLnP//ZYrFYLOfOnbMsWLDAwRFd29GjRy0rVqyosS0+Pt7yr3/9\\ny2KxWCxbtmyxfPTRR5aSkhLLrFmzLEVFRZaysjLLM888Y7l06ZIjQq6hpKTE8uKLL1oSEhIsH374\\nocViub74P/nkE8v69estFovFcujQIctrr71miDrExcVZDh48eNVxRq2DxWKxHDlyxPLKK69YLBaL\\npaCgwPLkk0863b2oqx7OeD+++OILy/vvv2+xWCyWjIwMy6xZs5zyftRWD2e8HwAAAEbQ4rq4Hzly\\nRHfccYckqX379ioqKlJxcbGDo7o+KSkp1lnvb7/9dh0+fFjff/+9IiMj5eXlpVatWqlHjx767rvv\\nHByp5O7urueee06BgYHWbdcT/9GjR9W/f39JUu/evXXixAlD1KE2Rq6DJN10002aM2eOJMnb21tl\\nZWVOdy/qqofZbL7qOKPX46677tKYMWMkSdnZ2QoKCnLK+1FbPWpj9HoAAAAYQYvr4p6Xl6cuXbpY\\nH/v5+SkvL09eXl4OjOrafvzxRy1btkyFhYV6+OGHVVZWJnd3d0n/iT8vL09+fn7Wcy5vdzRXV1e5\\nurrW2HY98V+53cXFRSaTSZWVlXJza7qXbm11kKT/9//+n3bu3Cl/f39NmTLF0HW4fG0PDw9J0t69\\ne9W3b199++23TnUv6qqHi4uL092PyxYuXKjs7GzNnz9fL7/8stPdj9rqsXPnTqe9HwAAAI7U4j8B\\nWQy+yly7du308MMPa+DAgbp48aKWLFmiqqoqR4flMEa5X3fffbd8fX0VERGh999/X++884569OjR\\noHMdXYcDBw5o7969WrhwoWbNmtXocoxUj1OnTjnt/Vi6dKnOnDmj2NjYG4rFSPV45JFHnPZ+AAAA\\nOFKL6+IeGBhYo2U5Nze33q7LjhQUFKS77rpLJpNJYWFhCggIUFFRkcrLyyVJOTk5CgwMvKpel7cb\\nkYeHR4Pjv3J7ZWWlLBaLIVrWevfurYiICEnVXZHPnj3rFHU4dOiQ3nvvPS1YsEBeXl5Oey9+Xg9n\\nvB9paWnKysqSJEVERKiqqkqenp5Odz9qq0fHjh2d7n4AAAAYQYtL0Pv06aPk5GRJ1R8sAwMD5enp\\n6eCo6paUlKQdO3ZIqu6en5+fr+joaGsdkpOTdeutt6pbt246deqUioqKVFpaqhMnTqhXr16ODL1O\\nvXv3bnD8V96vr776SjfffLMjQ7dasWKFLl68KKl6TH2HDh0MX4fi4mJt3rxZ8+fPl4+PjyTnvBe1\\n1cMZ78exY8e0c+dOSdW/26WlpU55P2qrxxtvvOF09wMAAMAITJYW2J9wy5YtOn78uEwmkx577DFr\\nS48RlZSUaPXq1SouLlZlZaXGjRunzp07Ky4uThUVFQoJCdH06dPl5uam5ORk7dixQyaTSSNHjtSQ\\nIUMcHb7S0tK0ceNGZWZmytXVVUFBQZo1a5bi4+MbFL/ZbFZCQoLOnz8vd3d3TZ8+XSEhIQ6vw8iR\\nI7V9+3a1atVKHh4emj59uvz9/Q1bB0navXu33nnnHbVr1866bcaMGUpISHCae1FXPaKjo/XRRx85\\n1f0oLy/X2rVrlZ2drfLyco0bN8667J0z3Y/a6uHh4aEtW7Y41f0AAAAwghaZoAMAAAAAYDQtros7\\nAAAAAABGRIIOAAAAAIABkKADAAAAAGAAJOgAAAAAABgACToAAAAAAAbg5ugAAKOxWCz68MMP9ckn\\nn6iyslKVlZUKDw/XhAkT1KVLF0nVy5PNnDlTPXv2rLOc+Ph4hYWFaezYsQ2+dkpKihISEhQbG3vV\\nvrS0NG3evFk5OTmyWCzy8fHRpEmTrDHs3r1bw4cPv87aAgAAADAKEnTgZ7Zu3aqUlBQtWLBAgYGB\\nMpvN2rNnj15++WWtXr1afn5+TR6TxWLRsmXLNG3aNPXr10+StH//fi1fvlxr165VSUmJduzYQYIO\\nAAAAODESdOAKhYWF2rVrl2JiYhQYGChJcnFx0YgRIzR48GB5enpedc6+ffv07rvvqqqqSoGBgZo2\\nbZrCwsIkSTk5OVq8eLEyMzPVuXNnzZw5Ux4eHkpNTdWGDRtUVlYmk8mkRx99VFFRUXXGdenSJeXm\\n5qpbt27WbQMGDFDXrl3VunVrzZ07V9nZ2Xr66ae1YsUKXbhwQevXr1deXp7c3Nw0ffp0RUZGKjEx\\nUfv27ZOPj49SU1PVqlUrPfvss2rXrp2Nn0kAAAAA14sx6MAVUlNTFRISUmvCWltynpWVpXXr1mne\\nvHlatWqV+vXrp/Xr11v3Hzp0SHPnzlVcXJwKCwu1d+9eSdK6des0evRorVq1Sg899FCNc2rj6+ur\\nyMhILVmyRHv37lVGRoYkKTg4WJL01FNPKSQkRKtWrZKLi4tiYmI0dOhQrV69Wk888YSWL1+uqqoq\\nSdLhw4d13333KTY2VnfccYc2b97cuCcLAAAAgE3Rgg5coaioqEYX9qKiIj3//POSpNLSUt1///0a\\nM2aMdf/hw4d18803W1vM7733Xm3evNmaDPft29da3oABA5SamqoHHnhAMTEx1jJ69eplTbjrYjKZ\\ntGjRIu3cuVO7du1SQkKC2rdvrwkTJmjAgAE1jk1PT1d+fr6GDRsmSerZs6f8/Px04sQJSVL79u3V\\nvXt3a0x79uy5/icKAAAAgM2RoANX8PPzU25urvWxt7e3Vq1aJUlKSEhQWVlZjeMLCgrk7e1tfezl\\n5SWpukv65fKu3FdUVCRJSkpK0ocffqiSkhKZzWZZLJZ6Y/Py8tL48eM1fvx45eXlKTExUatWraqR\\n7EvVXyqUlZVpzpw51m0lJSUqLCyUJPn4+NSo3+XtAAAAAByLBB24Qvfu3ZWfn6/Tp0+rc+fO9R7v\\n7++v1NRU6+PCwkKZTCb5+vpaH1+5z9vbWzk5OVq3bp1eeeUVRURE6Pz585o9e/Y1r5Odna3MzEzr\\njO0BAQF66KGHtG/fPv3444/W60lSYGCgvLy8rF8sXCkxMVEFBQU1YroyYQcAAADgOIxBB67g6emp\\nsWPHKi4uThcuXJAkmc1mffHFF9q3b5+1K/tlUVFROn78uC5evChJ+uc//6k+ffrI1dVVkvTNN9+o\\nsLBQZrNZBw4cUK9evVRQUKDWrVsrPDxcVVVV2r17t6TqLvR1yc7OVkxMjNLS0qzbvv/+e2VlZSky\\nMlKurq4qLS1VVVWVQkNDFRQUpOTkZEnVrfyrVq2ylp+enq7Tp09LkpKTk9WrVy9bPHUAAAAAbhAt\\n6MDPjBkzRj4+Plq5cqUqKipUUVGh8PBwPfPMM+rTp0+NY4ODgzVt2jTrJGxt2rTR1KlTrftvu+02\\nrVy5UhkZGYqMjNSwYcPk7u6uvn37avbs2QoICNCkSZP03XffafHixZo8eXKtMXXv3l1Tp07V+vXr\\nVVxcLLPZrICAAM2ZM0ehoaHy8fGRj4+Ppk6dqmXLlunpp5/W+vXrtW3bNplMJo0aNUoeHh6SpB49\\neugf//iHjh8/Lg8PD/3hD3+w35MJAAAAoMFMloYMfgXQLCQmJiopKUmLFi1ydCgAAAAAfoYu7gAA\\nAAAAGAAJOgAAAAAABkAXdwAAAAAADIAWdAAAAAAADIAEHQAAAAAAAyBBBwAAAADAAEjQAQAAAAAw\\nABJ0AAAAAAAMgAQdAAAAAAAD+P9wdJEIpLcPbQAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d506ac8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"inception_split(df, \\\"dropout_prob\\\", dropout_probs, \\\"num_layers\\\", num_layers)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 36,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n8UfbKz26devG0aNHqzsMERGRUqmvEhERkbqi2qfTu7i44OLiUuxYXl6ebUqin58f6enp1R2GiIhI\\nqdRXiYiISF2h98SLiIiIiIiI1BG1sju9p6cnZrMZd3d3UlNTi01fLM217/p0hPDwcIeXWRvUDuei\\ndjgXtcO5hIeH13YIlaK+ynHUDueidjiP+tAGqF/tEKkLamUk/rbbbmPfvn0A7Nu3j9tvv702whAR\\nESmV+ioRERFxRtU+En/69GlWrVrF5cuXcXFxYd++fUyZMoVly5bx+eefExISQu/evas7DBERkVKp\\nrxIREZG6otqT+NatW/PHP/6xxPHZs2dXd9UiIiIVor5KRERE6gptbCciIiIiIlIPFRQUEBkZyYYN\\nG2o7lDphzJgxPPvss7UdRrmUxIuIiIiIiEit+c9//sOPP/5Y22HUGUriRUREREREpNYsWbKEY8eO\\n1XYYdYaSeBERERERkXrgp59+IjY2ls6dOxMdHc3u3btt52bOnMnkyZOZMWMGnTt35ty5cwCsXbuW\\n3/zmN9x+++3ceeedzJs3j7y8PAD2799PZGQkO3fuZOjQodx2220MGDCAvXv32srNycnhL3/5C/37\\n96djx44MHDiQf/zjH7bzS5Ys4e677y4W56JFi+jXrx8Ad999Nz/++CN//OMfGTp0aIXauWTJEu67\\n7z42bNhA3759ue2224iNjbW96vD8+fNERkbywQcf0KdPH55//nkALly4wNNPP82dd95Jp06deOCB\\nB9i/f3+xsq1WK/Pnz6dHjx706NGDF154gdzc3ArFVVOUxIuIiIiIiNRxVquVSZMmERoayu7du/n7\\n3//Ohx9+WOyagwcP0qFDBw4ePEizZs3YsGED8+fPZ+bMmRw6dIh33nmHL774gr/+9a/F7nvnnXdY\\ntmwZ+/fvp2/fvjz11FNkZmYC8Kc//Ym9e/fy1ltvcfjwYWbMmMFLL73Etm3bKhT3rl27APjjH//I\\npk2bKtzehIQEDh48yObNm9mxYwcGg4Hp06cXu2bjxo2sXbuWl156iYKCAh599FHc3NzYvHkz+/fv\\nJyoqit/97ndcuHDBds+OHTsICwtj586drFy5ki+//JK//e1vFY6rJiiJFxERERERqeO+//574uPj\\nmTRpEr6+voSEhDBx4sRi1xgMBsaOHYurqysGg4G///3vjBgxgl69euHq6srNN9/MmDFj2LhxIxaL\\nxXbfww8/TPPmzfH29mbSpEnk5eWxa9cuMjMz2bhxI5MmTaJNmza4urrSv39/7r77bj7++ONqbW9u\\nbi4zZszA19eX4OBgHnvsMQ4fPkxycrLtmkGDBhEWFobBYGD37t3Ex8cza9YsAgMD8fT0ZPLkyXh6\\nehZ74HDTTTcxbtw4PDw8iIyMZOjQoXz++efV2pbKUhIvIiIiIiJSx128eBGAZs2a2Y61a9eu2DVN\\nmzbFaPxfCnj27Fnatm1b7Jo2bdqQnZ1dLBlu06aN7Wd/f3/8/Py4ePEi586dw2KxlKinTZs2nD17\\n9sYbVYbAwECCgoJsn5s3bw787/cAEBERYfs5Pj6eoKAggoODbcfc3NyIiIiwLS2Akr+zFi1aFCvT\\nGSiJFxERERERqePMZjNwdbS9yLWj6XA1ab1WXl4eVqu12LGiz9eWU1hYWOIao9FoWzt/fRkWi6XY\\n/de7Pq6quL6MohiufUhxbXvNZnOJOO2VYy9uDw+PG4rV0ZTEi4iIiIiI1HFNmjQBsG3uBnDy5Mky\\n72nZsiUnTpwoduzkyZP4+fkREhJiOxYfH2/7OT09nYyMDJo0aUJERAQGg6FEGT/99BOtWrUCribA\\n128Md215VWUymUhLS7N9PnfuHAaDwfZ7uF7Lli1JS0vj0qVLtmNms5mzZ8/SunVr27Fffvml2H1n\\nzpwptczaoiReRERERESkjuvYsSMhISG88cYbZGZmkpSUxJtvvlnmiPiDDz7Ixo0b+frrryksLOSH\\nH35g9erVjB49uth9q1ev5vz58+Tk5LBs2TK8vb256667CAoKIjo6mqVLl3LmzBny8/PZtm0be/bs\\nITY2FoDWrVtjMpnYuXMnhYWF/Oc//+Hw4cPF4vDy8uKXX37BZDJVuL0eHh689tprZGZmkpKSwrvv\\nvssdd9xRbIr9tXr37k2TJk2YN28eGRkZZGVl8dprr2GxWLjvvvts1507d461a9diNps5duwYmzZt\\nYtCgQRWOqya41nYAIiIiIiIicmPc3d1ZsWIFc+bM4c477+Smm27iueeeY9++faXe8+CDD5Kdnc28\\nefO4ePEijRs35uGHH+axxx4rdt3999/PpEmTOH36NE2aNOGtt97Cx8cHgHnz5jF//nzGjx+PyWSi\\nZcuWLFmyhN69ewPQr18/YmJimDFjBhaLhejoaB599FH+/ve/28ofM2YMK1euZNOmTXz11VcVam9A\\n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\\nRzRy5Ej97Gc/0/jx401+JwEAg4FxCgDAmnighyNHjqioqCjph4VkH4waGxv12GOP6ec//7k2b96s\\n2bNna/v27YnnDx06pLKyMlVUVCgYDGr//v2SpMcee0xLly7V5s2btXz58l4/k0xOTo5KS0u1fv16\\n7d+/X/X19ZKkwsJCSdJPfvITFRUVafPmzXK73SovL9fXvvY1bdmyRT/60Y/08MMPKxaLSZLefvtt\\nXXvttdq6davmzp2rHTt29O/NAgAMOcYpAAAz8UAPoVCoVxliKBTSvffeK0lqb2/Xt771LS1btizx\\n/Ntvv63LLrssMaPxjW98Qzt27Eh8EJk1a1bieldeeaWOHDmib3/72yovL09cY/r06YkPO2fjcrl0\\n3333affu3dqzZ48qKys1YcIE3XTTTbryyit7fe/x48fV0tKiRYsWSZIuueQSjR49Wh988IEkacKE\\nCZo2bVqiTS+88ELqbxQAwBKMUwAAknigh9GjR6u5uTnx9ahRo7R582ZJUmVlpSKRSK/vb21t1ahR\\noxJfZ2dnS+oqK+y+Xs/nQqGQJKmqqkrPPfecwuGw4vG4DMM4b9uys7N144036sYbb1QgENCBAwe0\\nefPmXh+0pK4PdJFIRGvWrEk8Fg6HFQwGJUk+n69XfN2PAwDsj3EKAEASD/Qwbdo0tbS06OOPP9bk\\nyZPP+/25ubk6cuRI4utgMCiXy6WcnJzE1z2fGzVqlJqamvTYY49pw4YNmjRpkk6cOKE777zznK/j\\n9/vV0NCQ2OE3Ly9Py5cv18GDB3Xs2LHE60lSfn6+srOzEx/qejpw4IBaW1t7tannhyUAgL0xTgEA\\nWBMP9OD1erVixQpVVFTo5MmTkqR4PK6XX35ZBw8eTJQjdpsxY4YOHz6suro6SdLevXs1c+ZMZWRk\\nSJLefPNNBYNBxeNxvfrqq5o+fbpaW1uVlZWlkpISxWIx7du3T1JXGeTZ+P1+lZeXq7a2NvHY0aNH\\n1djYqNLSUmVkZKi9vV2xWExjxoxRQUGBqqurJXXNwmzevDlx/ePHj+vjjz+WJFVXV2v69OlmvHUA\\ngCHAOAUAYCYeOM2yZcvk8/m0ceNGRaNRRaNRlZSU6O6779bMmTN7fW9hYaHuuOOOxIY8Y8eO1e23\\n3554/oorrtDGjRtVX1+v0tJSLVq0SJmZmZo1a5buvPNO5eXl6eabb9b777+v+++/X9/73veStmna\\ntGm6/fbbtX37drW1tSkejysvL09r1qzRmDFj5PP55PP5dPvtt+uhhx7SXXfdpe3bt+sPf/iDXC6X\\nvvvd78rj8UiSLr74Yj377LM6fPiwPB6PfvGLXwzemwkAMB3jFACkN5fRl0VOAIaFAwcOqKqqSvfd\\nd5/VTQEA4AyMUwBwfpTTAwAAAADgECTxAAAAAAA4BOX0AAAAAAA4BDPxAAAAAAA4BEk8AAAAAAAO\\nQRIPAAAAAIBDkMQDAAAAAOAQJPEAAAAAADgESTwAAAAAAA7x/xg9TY5T6kT8AAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f8b8d9c4128>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"inception_split(df, \\\"num_layers\\\", num_layers, \\\"dropout_prob\\\", dropout_probs)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Loss Functions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"I've been scratching my head a lot lately thinking about how to implement sampled softmax loss without having to split tensors across time, an operation that destroys any gain in runtime efficiency offered by negative sampling. Let's start by working through how tensorflow samples classes by default: __log-uniform (Zipfian) base distribution__:\\n\",\n    \"\\n\",\n    \"$$\\n\",\n    \"\\\\text{Prob(c)} = \\\\dfrac{\\\\log(c+2) - \\\\log(c + 1)}{\\\\log(\\\\text{vocab size} + 1)}\\n\",\n    \"$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAm0AAAGDCAYAAAB5rSfRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XeYZGWZ/vHv09U5p8mZYWDIaQBBYBFBiaJiQteEwprW\\ndVnX8HNVXHcXV1d3F8WASlRARJAgroksaYYwzAxxmMDk0DOdc/fz++Oc6qnp6VBT3XWqq/r+XFdd\\nVXXq1DnPW1XN3LzvOec1d0dEREREJra8TBcgIiIiIqNTaBMRERHJAgptIiIiIllAoU1EREQkCyi0\\niYiIiGQBhTYRERGRLKDQJpKDzOz3ZvbhhOf/ZmY7zWxrJusaipnNNbNWM4sluf47zGxD+J5jzGyV\\nmZ2e5jIzxszmm5mbWX74fK/vNgP1tJrZAeO0rf9nZj8LH+/VznHY9n79rkSygek6bSLJM7N1wMfd\\n/c9p3Md8YC1Q4O69CcuvBza6+7/s5/bmAi8D89x9+/hVmvT+fw+cOmhxPlAU1vT6fm7vNeByd79r\\nnEocbj/VwPeAc4EyYAtwrbt/K537HaKO+Qzxe0jDfk4H7gfaw0WNwGPAd9x9aQrb+oW7z96P98xn\\nDO2M4m9TJNPG5f9oRGRCmws0pBLYzCx/rEHB3c8ZtM0Y8Bdg/f4GttA8YNVYakrSfxOEtUOAJuAg\\n4PAI9ptJm919tpkZMAu4DHjEzM5z97+M547G47clMtloeFRknJjZpWa22sx2mdndZjYz4bW3mNnL\\nZtZkZj80s4fM7ONj2NdHzOxRM/svM9ttZmvN7JyE1x80s4+b2ZnAn4CZ4VDR9eHrbwuHFRvDdQ9J\\neO86M/uimT0PtJlZfrjsn83seTNrM7Ofm9m0cKiuxcz+bGY1SZb/H0At8Mlwf4OH/x40syvN7Ckz\\nazazu8ys1syKzKwViAHLwx63eL1nho9PMLPHw3ZtMbMfmFlhQtvczD5hZq+G61wdBpShHA/c7O67\\n3b3f3V9y99sTtvW/4TBts5k9bWanJrx2hZn92sx+EX4+K8zsIDP7spltD9/3lkHf1z5tHqqo+Hcb\\nPh7td7DAzB5O+I6uNrNfjPYFeWCju38N+Bnwn4M+wwPDx+ea2Qvh9jeZ2efNrAz4PXt+c61mNjP8\\nTG4PP5Nm4CPhssH1XGJmm8Pv7/MJ+73ezP4t4fnpZrYxfHwTwf+c3BPu7wtD/K5mWvB3ucuCv9NL\\nB31ft5nZjWFbVpnZktE+J5GoKbSJjAMzOwO4EngPMANYD9wavlYP3A58GagjGKo8eRx2e2K4rXrg\\n28DPBweQcKjoHIIelHJ3/4iZHQTcAnwOmALcR/CPXWHCWy8GzgOqE3pDLgLOIuhxuoDgH+b/F24j\\nD/jsaAWb2YXA3wEXuXv7CKt+CLiE4LPsBa5y9y53Lw9fP8rdFw7xvj7gH8PP5CTgzcCnBq1zPkEg\\nO5Lg+3rrMDU8Afy7mX3UzBYN8fpS4GiCAHoz8GszK054/QLgJqAGeBb4A8HnNAv4V+Ano7V5mLoG\\nG+l3cDPwFMHv7grgg0luM9EdwLFhGBvs58DfuXsFQS/k/e7ext6/uXJ33xyufyHB30I18Mth9vcm\\nYBHwFuCL8UA+Enf/IPA6cEG4v28PsdqtwEZgJvAu4D/Cv9u4t4XrVAN3Az8Ybb8iUVNoExkfHyA4\\n3ukZd+8iCGgnWXCczrnAKne/IwxAVwHjcULAenf/qbv3ATcQ/GM/LYn3vRf4nbv/yd17gP8CStg7\\nSF7l7hvcvSNh2ffdfZu7bwIeAZ5092fdvRO4EzhmpJ2a2ULgeuBj7v7qKDXe5O4rwwDwVeA9lsQB\\n5e7+tLs/4e697r6OIBj9zaDVvuXujeHQ7AMEwWsof08QLD4DvBD2zgz0Yrn7L9y9IdzXdwmO0Ts4\\n4f2PuPsfwu/81wTh9lvhZ34rMN+C4+bG1GaG+R1YcCzj8cDX3L3b3R8lCCP7azNgBGFmsB7gUDOr\\nDHsknxllW4+7+2/DnsuOYdb5hru3ufsK4DqC/4EYEzObA7wR+KK7d7r7cwQ9iB9KWO1Rd78v/Bxv\\nAo4a635FxptCm8j4mEnQuwaAu7cCDQS9KjOBDQmvOcH/8QMQDsXEh5FOJehlASgYtI8Cgn8k4waC\\nX0KvVTmjG1xrf1jfrIR1Ngx+E7At4XHHEM+H3XfYA3U7QbD9TRI1Ju5/PUHb60d7UzgEea+ZbQ2H\\n4P5jiPclBub24ep29w53/w93P46gp+o2gt602nBfnzezFy0Y8m4Eqgbta/DnszMMBPHnDNp3Sm1m\\n+N/BTGDXoB7Nob7X0cwCnODEhMEuIvifkvUWDPmfNMq2ktn/4M9h5nAr7of4Z9EyaNuJv/nBv4ti\\nG6czWUXGi0KbyPjYTHCAPADhUFIdsIngrMPZCa9Z4nN3PyxhGOmRcP0eYP6gfSwgIWyNY60GzAlr\\nHShrHPaT6GqgFfhikuvPSXg8l+Dz2JnE+34EvAQscvdKguHb4Y5ZS5q7xwNgGbAgDNdfIBherXH3\\naoKTFcayr1TbPJwtQK2ZlQ6zj2S9A3gm7AHci7svdfcLganAbwmCLQz/+0nmdzX4c4gPrbYBiW2Z\\nvh/b3kzwWVQM2vamYdYXmZAU2kT2X4GZFSfc8gmOEfuomR1tZkUE/8A/GQ7R/Q44wszeHq77afb9\\nB2dA2BvzG4LjqerMrMDMLgYOJTiObKxuA84zszebWQHwT0AXweUdxp2ZXUJwHNl79+Nswb81s0PD\\nwPGvwO0JvVQjqQCagVYzW0x4skMqzOyrZna8mRWGPYX/QNDb9HK4n15gB5BvZl8DKlPdVyjVNg/J\\n3dcDy4ArwjacRHCc3agsMMvMvg58nCD8Dl6n0Mw+YGZV4ZBvM9AfvrwNqDOzqhRK/6qZlZrZYcBH\\ngV+Fy58DzrXgpJTpBMdkJtoGDHn9OHffQPD7vjL8mz0S+Bgw6kkZIhOJQpvI/ruPYHgrfrsiPOD/\\nqwRhawuwEHgfgLvvBN5NcJB4A0H4WkYQlIbzKWAX8DywneC4qvPcfdsI70mKu78M/C3wfYKenAsI\\nDuDuHuu2h/EvBAfrv5IwDJw4HDyUmwiOf9sKFJPESQ6hzwPvB1qAn7LnH/xUOMExVTsJemrOIvgO\\nWglOKvg/4BWC3s9OUht6TJRqm0fyAYITMhqAfyP4PEb63c204AzdVoITLY4ATnf3Pw6z/geBdeFQ\\n9CfC/eHuLxH8j8waC87S3Z8hzoeA1QSXhfmvhH3fBCwH1gF/ZN/v9krgX8L9fZ59XUzQe72Z4BjM\\nryd7TTcLzpLeJ7iKRE0X1xWJmJnlERzT9gF3fyDT9Uw0ZvYgwYVZf5bpWqISVZvN7FfAS+7+9XTu\\nR0TSQz1tIhEws7eaWXU4dBo/zuqJDJclOS4c3l1oZnlmdjbBJTd+m+m6RCQ1OjNGJBonEVwzqxB4\\nAXj7CJc8EBkv0wmus1ZH0Lv7SXd/NrMliUiqNDwqIiIikgU0PCoiIiKSBSZ8aDOzAyyY5/D20dcW\\nERERyU1pHR41s2sJrs+03d0PT1h+NvC/BBM//8zdv5XEtm5393cls9/6+nqfP39+akWLiIiIROjp\\np5/e6e5TRlsv3SciXE8w6e6N8QXhXHpXE1zzaCOw1MzuJghwVw56/yXuvn1/dzp//nyWLVuWas0i\\nIiIikTGzpGa7SWtoc/eHwwmzE50ArHb3NQBmditwobtfSdArlxIzuwy4DGDu3LmpbkZERERkQsrE\\nMW2z2PvK4RvZe9LevYTT+PwYOMbMvjzceu5+jbsvcfclU6aM2sMoIiIiklUm/HXa3L2BYHoUERER\\nkUkrEz1tm4A5Cc9nh8vGzMwuMLNrmpqaxmNzIiIiIhNGJkLbUmCRmS0ws0KCSbXvHo8Nu/s97n5Z\\nVVXVeGxOREREZMJIa2gzs1uAx4GDzWyjmX3M3XuBzwB/AF4EbnP3VemsQ0RERCTbpfvs0YuHWX4f\\ncF869y0iIiKSSyb8jAj7Q8e0iYiISK7KqdCmY9pEREQkV+VUaBMRERHJVQptIiIiIlkgp0JbVMe0\\nrW9o44GXt9Pf72ndj4iIiEhcToW2qI5pu/f5LXz0uqX0KrSJiIhIRHIqtEXNUWgTERGRaCi0jYEr\\ns4mIiEhEciq0RXVMm1laNy8iIiKyj5wKbbpOm4iIiOSqnAptUTHU1SYiIiLRUmgbAx3TJiIiIlFR\\naEtB/Jg2nT0qIiIiUcmp0BbZiQhp3bqIiIjIvnIqtEV9IoKGR0VERCQqORXaorJneFREREQkGgpt\\nKdDZoyIiIhI1hbYxcI2PioiISEQU2lKgGRFEREQkagptY6B+NhEREYlKToW2qC75EafRUREREYlK\\nToW2qC75YRofFRERkYjlVGiLnHraREREJCIKbSlQP5uIiIhETaFtDDT3qIiIiERFoS0FAzMiKLOJ\\niIhIRBTaUqDhUREREYmaQtsYqKNNREREopJToS2q67TFL/mhaaxEREQkKjkV2qK7TltaNy8iIiKy\\nj5wKbVFTP5uIiIhERaEtBepoExERkagptI2BDmkTERGRqCi0pSJ+IoIGSEVERCQiCm0p0PCoiIiI\\nRE2hbSzU0SYiIiIRUWhLwcA0VpktQ0RERCYRhbYUmAZIRUREJGIKbWOgs0dFREQkKgptKdCMCCIi\\nIhK1nAptUc09GqdLfoiIiEhUciq0RTb36MD+0robERERkQE5FdqiouFRERERiZpC2xioo01ERESi\\notCWgvglP1zjoyIiIhIRhbZUaHhUREREIqbQNgbqaBMREZGoKLSlQB1tIiIiEjWFNhEREZEsoNCW\\nArP4iQgZLkREREQmDYW2FGh4VERERKKm0DYGmsZKREREoqLQlgLNiCAiIiJRU2gbAx3TJiIiIlFR\\naEtBvKdNmU1ERESiotCWAtOpCCIiIhKx/EwXkAwzeztwHlAJ/Nzd/5jhkgDNPSoiIiLRSXtPm5ld\\na2bbzWzloOVnm9nLZrbazL400jbc/bfufinwCeC96aw3GRoeFRERkahF0dN2PfAD4Mb4AjOLAVcD\\nZwEbgaVmdjcQA64c9P5L3H17+PhfwveJiIiITCppD23u/rCZzR+0+ARgtbuvATCzW4EL3f1K4PzB\\n27BgCoJvAb9392fSW3HyNDoqIiIiUcnUiQizgA0JzzeGy4bz98CZwLvM7BNDrWBml5nZMjNbtmPH\\njvGrdOh9pXX7IiIiIoNlxYkI7n4VcNUo61wDXAOwZMmSiPrA1NUmIiIi0chUT9smYE7C89nhsqwQ\\n72fT8KiIiIhEJVOhbSmwyMwWmFkh8D7g7rFu1MwuMLNrmpqaxlzgyPtJ6+ZFRERE9hHFJT9uAR4H\\nDjazjWb2MXfvBT4D/AF4EbjN3VeNdV/ufo+7X1ZVVTXWTSW3v0j2IiIiIhLN2aMXD7P8PuC+dO8/\\nHeIzImh4VERERKKSU9NYaXhUREREclVOhbboh0fV1SYiIiLRyKnQFhV1tImIiEjUFNrGQMe0iYiI\\nSFRyKrRFfUybQpuIiIhEJadCW3THtGmAVERERKKVU6EtKvGetn51tYmIiEhEFNpSkGe6TpuIiIhE\\nS6EtBbHwU+tTahMREZGI5FRoi+pEhHhPm4ZHRUREJCo5FdqiOhFhILT1K7SJiIhINHIqtEUllheE\\ntj6FNhEREYmIQlsK4j1tOqZNREREoqLQloJ4T5sym4iIiEQlp0JbdCciBPcaHhUREZGo5FRoi+xE\\nhDwNj4qIiEi0ciq0RSWms0dFREQkYgptKYgf06bMJiIiIlFRaEuB6Zg2ERERiZhCWwr29LQptImI\\niEg0ciq0RXX2aEzTWImIiEjEciq0RXX2qJlmRBAREZFo5VRoi4qGR0VERCRqCm0piA30tGW4EBER\\nEZk0FNpSkBd+auppExERkagotKUgTxfXFRERkYgptKUgpmmsREREJGIKbSlQT5uIiIhETaEtBWFH\\nm6axEhERkcjkVGiL7OK6ebpOm4iIiEQrp0JbVBfXzdN12kRERCRiORXaoqJprERERCRqCm0pyNPF\\ndUVERCRiCm0p0MV1RUREJGoKbSnID1Nbb59Cm4iIiERDoS0FsTwjlmf0aHxUREREIqLQlqKCmEKb\\niIiIREehLUUFeXl0K7SJiIhIREYNbWb2tJl92sxqoigoWxTk56mnTURERCKTTE/be4GZwFIzu9XM\\n3moWXvNiEiuImU5EEBERkciMGtrcfbW7fwU4CLgZuBZYb2bfMLPadBc4URXENDwqIiIi0UnqmDYz\\nOxL4LvAd4DfAu4Fm4P70lbb/opp7FKAwlkePetpEREQkIkkd0wb8N7AUONLdP+vuT7r7d4E16S5w\\nf0Q19yhAfszo6VVPm4iIiEQjP4l13u3ue4UzM1vg7mvd/Z1pqmvCK4jpRAQRERGJTjLDo7cnuWxS\\nKYjl0dOv4VERERGJxrA9bWa2GDgMqDKzxB61SqA43YVNdIWxPA2PioiISGRGGh49GDgfqAYuSFje\\nAlyazqKyQUG+0dWj0CYiIiLRGDa0uftdwF1mdpK7Px5hTVkhPy+P1r7eTJchIiIik8RIw6NfcPdv\\nA+83s4sHv+7un01rZRNccJ02HdMmIiIi0RhpePTF8H5ZFIVkm8J8TRgvIiIi0RlpePSe8P6G6MrJ\\nHgWxPHoV2kRERCQiIw2P3gMMO/7n7m9LS0VZoiCWR7fOHhUREZGIjDQ8+l+RVZGFivLz6FJoExER\\nkYiMNDz6UJSFZJuSghgdPX2ZLkNEREQmiZGGR29z9/eY2Qr2HiY1wN39yLRXN4GVFAahzd0xs0yX\\nIyIiIjlupOHRfwjvz4+ikGxTXBDDHbp6+ykuiGW6HBEREclxw8496u5bwvv1QBdwFHAk0BUum9RK\\nwqDWqSFSERERicCoE8ab2ceBp4B3Au8CnjCzS9JdWML+DzGzH5vZ7Wb2yaj2O5qSwiC06bg2ERER\\nicKooQ34Z+AYd/+Iu38YOA74YjIbN7NrzWy7ma0ctPxsM3vZzFab2ZdG2oa7v+junwDeA7wxmf1G\\nYU9Pm84gFRERkfRLJrQ1EEwSH9cSLkvG9cDZiQvMLAZcDZwDHApcbGaHmtkRZnbvoNvU8D1vA34H\\n3JfkftMufhxbR7d62kRERCT9Rjp79PLw4WrgSTO7i+As0guB55PZuLs/bGbzBy0+AVjt7mvC/dwK\\nXOjuVzLMSQ/ufjdwt5n9Drg5mX2nW3FBkHc1PCoiIiJRGOns0Yrw/rXwFnfXGPc5C9iQ8HwjcOJw\\nK5vZ6QTH0xUxQk+bmV0GXAYwd+7cMZY4Op2IICIiIlEa6eK634iykOG4+4PAg0msdw1wDcCSJUuG\\nnX5rvAyciKDhUREREYnASD1tAJjZFOALwGFAcXy5u5+R4j43AXMSns8Ol2WVeE+bhkdFREQkCsmc\\niPBL4CVgAfANYB2wdAz7XAosMrMFZlYIvA+4ewzbG2BmF5jZNU1NTeOxuREVK7SJiIhIhJIJbXXu\\n/nOgx90fcvdLgKR62czsFuBx4GAz22hmH3P3XuAzwB+AF4Hb3H1VivXvxd3vcffLqqqqxmNzIyoN\\nh0fbu3rTvi8RERGRUYdHgZ7wfouZnQdsBmqT2bi7XzzM8vuYQJfvSEVFcQEALZ0KbSIiIpJ+yYS2\\nfzOzKuCfgO8DlcA/prWqFJnZBcAFBx54YNr3VZifR1F+Hi3qaRMREZEIjBra3P3e8GET8Kb0ljM2\\n7n4PcM+SJUsujWJ/FcUFtHT2jL6iiIiIyBglM/foAWZ2j5ntDKekusvMDoiiuImusjifZg2PioiI\\nSASSORHhZuA2YDowE/g1cEs6i8oWFcX5OqZNREREIpFMaCt195vcvTe8/YKE67VNJFFe8gM0PCoi\\nIiLRGTa0mVmtmdUCvzezL5nZfDObZ2ZfYIKe+RnlJT9APW0iIiISnZFORHiaYIJ4C5//XcJrDnw5\\nXUVliyC0qadNRERE0m+kuUcXRFlINgqGR9XTJiIiIumXzNyjBcAngdPCRQ8CP3H3CdfFFOV12iDo\\naWvv7qO3r5/8WDKHB4qIiIikJpmk8SPgOOCH4e24cNmEE/UxbdUlwawITR0TLr+KiIhIjklmRoTj\\n3f2ohOf3m9nydBWUTWrLiwDY1dZNXfhYREREJB2S6WnrM7OF8SfhhXX70ldS9qgrKwSgoa07w5WI\\niIhIrkump+2fgQfMbA3BmaTzgI+mtaosURuGtl0KbSIiIpJmI4Y2M8sDOoBFwMHh4pfdvSvdhWUD\\n9bSJiIhIVEYcHnX3fuBqd+9y9+fD24QNbFHPiFAT72lrVWgTERGR9ErmmLa/mNlFZmajr5pZUZ89\\nWhDLo6qkgIa2CZtjRUREJEckE9r+jmCS+G4zazazFjNrTnNdWaOurFDDoyIiIpJ2o56I4O4VURSS\\nrWrLCjU8KiIiImmXzNmjmNk7gVMI5hx9xN1/m9aqssiUiiJe2daS6TJEREQkx406PGpmPwQ+AawA\\nVgKfMLOr011YtpheVcy2Zh3TJiIiIumVTE/bGcAh7u4AZnYDsCqtVaUo6rlHAWZUFdPa1UtLZw8V\\nxQWR7VdEREQml2RORFgNzE14PidcNuFEffYowPSqEgC2NnVGtk8RERGZfJIJbRXAi2b2oJk9ALwA\\nVJrZ3WZ2d3rLm/hmVBUDsFmhTURERNIomeHRr6W9iiw2vTIIbVubOjJciYiIiOSyZC758VAUhWSr\\naZXFmMEW9bSJiIhIGiUzPCojKMzPo768iC2NCm0iIiKSPgpt42B2TQkbdrdnugwRERHJYQpt42B+\\nXRnrGxTaREREJH1GPabNzFYQzISQqAlYBvybuzeko7BsMr+ujN8+t4nOnj6KC2KZLkdERERyUDJn\\nj/4e6ANuDp+/DygFtgLXAxekpbIUZOLiugDz60txhw272lk0TVO1ioiIyPhLJrSd6e7HJjxfYWbP\\nuPuxZva36SosFe5+D3DPkiVLLo1yv/PqygBY16DQJiIiIumRzDFtMTM7If7EzI4H4mOAvWmpKsss\\niIe2nW0ZrkRERERyVTI9bR8HrjWzcsCAZuDjZlYGXJnO4rJFVWkB1aUFrG1QaBMREZH0SObiukuB\\nI8ysKnzelPDybekqLNssmlrOq9taMl2GiIiI5Khkzh4tAi4C5gP5ZgaAu/9rWivLMgdPr+Cu5zbj\\n7sQ/IxEREZHxkswxbXcBFxIcv9aWcJMEi6dX0tLZq4njRUREJC2SOaZttrufnfZKstzi6cFZoy9t\\naWZWdUmGqxEREZFck0xP22NmdkTaK8lyB8VD21Yd1yYiIiLjL5metlOAj5jZWqCL4AxSd/cj01pZ\\nlqksLmB2TQkvbmnOdCkiIiKSg5IJbeekvYoccdjMSlZuahp9RREREZH9NOzwqJlVhg9bhrlNOGZ2\\ngZld09SUmeB09Jwa1jW0s6utOyP7FxERkdw10jFt8blGnyaYHP7phNuyNNeVEne/x90vq6qqysj+\\nj5lbDcBzG3ZnZP8iIiKSu4YdHnX388P7BdGVk92OnF1FnsFzrzdyxuJpmS5HREREcsiwoc3Mjh3u\\nNQB3f2b8y8lupYX5LJ5eybMbGjNdioiIiOSYkU5E+O4IrzlwxjjXkhOOmVvN3c9tprevn/xYMldU\\nERERERndSMOjb4qykFxx4gF1/PLJ11m5uZmj51RnuhwRERHJEaN2BZlZsZldbmZ3mNlvzOxzZlYc\\nRXHZ6OSFdQD8dfXODFciIiIiuSSZ8bsbgcOA7wM/CB/flM6isll9eRGLp1fw2GsKbSIiIjJ+krm4\\n7uHufmjC8wfM7IV0FZQLTl5Yzy+fXE9nTx/FBbFMlyMiIiI5IJmetmfM7A3xJ2Z2IhP0Om0TxRsP\\nrKOrt59l63S9NhERERkfyYS24wgmjV9nZuuAx4HjzWyFmT2f1uqy1EkL6yjKz+PPL27LdCkiIiKS\\nI5IZHj077VXkmNLCfE5dVM+fXtjG1y84FDPLdEkiIiKS5UbtaXP39UAzUAXUxW/uvj58TYbwlkOn\\ns6mxgxe2NGe6FBEREckBo/a0mdk3gY8ArxFcVBd0cd1RnXHIVMzgTy9s47CZmZkLVURERHJHMsOj\\n7wEWunt3uovJJfXlRSyZV8N9K7bwD29epCFSERERGZNkTkRYCejS/il429GzeGVbq4ZIRUREZMyS\\nCW1XAs+a2R/M7O74Ld2F5YLzj5hBQcy485lNmS5FREREslwyw6M3AP8JrAD601vO0MysDHgIuMLd\\n781EDamoKSvkTQdP5a7lm/nSOYs1gbyIiIikLJkU0e7uV7n7A+7+UPyWzMbN7Foz225mKwctP9vM\\nXjaz1Wb2pSQ29UXgtmT2OdG889hZ7Gjp4hHNRSoiIiJjkExP2yNmdiVwN9AVX+juzyTx3usJ5iu9\\nMb7AzGLA1cBZwEZgaTjcGiMYik10CXAU8AKQlZPUn7F4GvXlhfzi8fW86eCpmS5HREREslQyoe2Y\\n8P4NCcuSuuSHuz9sZvMHLT4BWO3uawDM7FbgQne/Ejh/8DbM7HSgDDgU6DCz+9x9n2FaM7sMuAxg\\n7ty5o5UWmcL8PC4+YS4/eGA1G3a1M6e2NNMliYiISBZK5uK6bxriNpZrtM0CNiQ83xguG27/X3H3\\nzwE3Az8dKrCF613j7kvcfcmUKVPGUN74e/+Jc8kz4xdP6FrEIiIikppketows/OAw0gYonT3f01X\\nUUNx9+uj3N94mlFVwlmHTONXyzbwuTMPoqQwlumSREREJMuM2tNmZj8G3gv8PWDAu4F5Y9jnJmBO\\nwvPZ4bIxM7MLzOyapqam8djcuPrYqQtobO/hlqdez3QpIiIikoWSOXv0ZHf/ELDb3b8BnAQcNIZ9\\nLgUWmdkCMysE3kdwksOYufs97n5ZVdXEmzbq+Pm1nLCglmseXkNXb1+myxEREZEsk0xo6wjv281s\\nJtADzEhm42Z2C/A4cLCZbTSzj7l7L/AZ4A/Ai8Bt7r5q/0vPPn9/xoFsbe7kDl1sV0RERPZTMse0\\n3Wtm1cB3gGcIzhz9aTIbd/eLh1l+H3BfskXmilMOrOeo2VX88MHVXHTsbArzdbFdERERSU4yZ49+\\n090b3f0fr09SAAAgAElEQVQ3BMeyLXb3r6W/tP03kY9pAzAzLn/LwWzY1cEvn9SZpCIiIpK8YUOb\\nmR1vZtMTnn+IYFaCb5pZbRTF7a+JfExb3GmL6jnlwHqu+surNHX0ZLocERERyRIj9bT9BOgGMLPT\\ngG8RzGzQBFyT/tJyk5nxpXMW09jRw48fei3T5YiIiEiWGCm0xdx9V/j4vcA17v4bd/8qcGD6S8td\\nh8+q4h1Hz+Lnj65l7c62TJcjIiIiWWDE0GZm8RMV3gzcn/BaUhfljdpEP6Yt0ZfOWUxRLI+v/nYl\\n7p7pckRERGSCGym03QI8ZGZ3EVz24xEAMzuQYIh0wsmGY9riplYW84WzD+bR1Tu5e/nmTJcjIiIi\\nE9ywoc3d/x34J+B64BTf0x2URzA7gozR+0+cx1FzqvnmvS+wu6070+WIiIjIBDbiJT/c/Ql3v9Pd\\n2xKWveLuz6S/tNwXyzO+9c4jaOro4f/duULDpCIiIjKsnLq6azYd0xZ3yIxK/uktB/P7lVs1U4KI\\niIgMK6dCWzYd05bo0lMP4IT5tXz97lVs2NWe6XJERERkAsqp0JatYnnGd99zFAZ86pfP0NmjCeVF\\nRERkbwptE8Sc2lK++56jWLGpiSvuXpXpckRERGSCUWibQN5y2HQ+/aaF3Lp0A7c+9XqmyxEREZEJ\\nJKdCWzaeiDDY5WcdzKmL6vnaXat4Yk1DpssRERGRCSKnQlu2noiQKJZn/ODiY5lTW8JlNy5j9faW\\nTJckIiIiE0BOhbZcUVVawPUfPYHC/BgfuW4pO1q6Ml2SiIiIZJhC2wQ1p7aUaz+yhIbWbj587VM0\\ntfdkuiQRERHJIIW2CezI2dX8+IPHsXp7Kx+69klaOhXcREREJiuFtgnubw6awg8/cCyrNjfz0euW\\n0tbVm+mSREREJAMU2rLAmYdO4/sXH8OzGxqDodIO9biJiIhMNjkV2nLhkh/DOeeIGXz/4mNYvrGR\\n913zhE5OEBERmWRyKrTlwiU/RnLuETP4+YePZ93ONt7948c0T6mIiMgkklOhbTI47aAp/OLjJ7Kr\\nrZuLfvQYyzc0ZrokERERiYBCWxY6bl4Nt3/yZArz83jPTx7nd89vyXRJIiIikmYKbVnqoGkV3PXp\\nN3LErCo+ffMzXPWXV3H3TJclIiIiaaLQlsXqyov45aUn8s5jZ/G9P73CZTc9rTNLRUREcpRCW5Yr\\nyo/x3XcfxdfOP5QHXtrO+d9/hBUbc+/sWRERkclOoS0HmBmXnLKAX/3dSfT2ORf96DFuenydhktF\\nRERySE6Ftly+TlsyjptXw+8+eyonLazjq3et4mM3LGN7S2emyxIREZFxYLnYG7NkyRJftmxZpsvI\\nmP5+5/rH1vGf//cSpYUx/uMdR3DOETMyXZaIiIgMwcyedvclo62XUz1tEsjLC4ZLf/fZU5hdU8on\\nf/kM//ir59jV1p3p0kRERCRFCm057MCpFdzxqZP57JsXcc/yzbz5uw9yxzMbdaybiIhIFlJoy3EF\\nsTwuP+sg7v3sKSyoL+Py25bztz9/knU72zJdmoiIiOwHhbZJYvH0Sm7/xMl88+2H8/yGJt7yPw/z\\nvT++THt3b6ZLExERkSQotE0ieXnGB98wj7/8099w9mHTuer+1bzpv4Ih0/5+DZmKiIhMZAptk9DU\\nymKuuvgYfvPJk5heWczlty3nHT/8K0+v35Xp0kRERGQYCm2T2HHzarnzU2/ke+85iq3NnVz0o8f5\\n+A3LeHFLc6ZLExERkUF0nTYBoK2rl+v+upafPLyG1q5eLjhyJv941kEsqC/LdGkiIiI5LdnrtCm0\\nyV4a27u55uE1XPfXdXT39fOuY2fz6TcdyNy60kyXJiIikpMU2hTaxmR7Syc/fOA1bn7ydXr7+3nb\\nUTP55OkHcvD0ikyXJiIiklMmZWgzswuACw488MBLX3311UyXkxO2NXfy80fX8osn1tPe3cdZh07j\\nU6cv5Ji5NZkuTUREJCdMytAWp5628be7rZsbHl/HdX9dR1NHDycuqOWSUxZw5iHTiOVZpssTERHJ\\nWgptCm1p0drVyy1Pvs71j61jU2MHc2pL+PBJ83nP8XOoLC7IdHkiIiJZR6FNoS2tevv6+eML27ju\\nr2tZum43pYUx3n3cbD508nwWTinPdHkiIiJZQ6FNoS0yKzY2cd1f13LP85vp6XNOXFDL+0+cy1sP\\nm05xQSzT5YmIiExoCm0KbZHb3tLJ7U9v5NanNvD6rnaqSwt45zGzufiEOSyaprNORUREhqLQptCW\\nMf39zmOvNXDL0tf546qt9PQ5S+bVcNFxszn3iBlUlejYNxERkTiFNoW2CaGhtYvfPLORW5duYM2O\\nNgrz8zjzkKm845jZ/M1BUyjM10xqIiIyuSm0KbRNKO7O8xubuPPZTdy9fDO72rqpKS3ggqNm8o5j\\nZnH0nGrMdOkQERGZfBTaFNomrJ6+fh5+ZQd3PLuJP72wje7efubUlnDuETM474gZHDGrSgFOREQm\\nDYU2hbas0NzZw/+t2Mq9K7bw2Oqd9PZ7EOAOn8F5RyrAiYhI7lNoU2jLOo3t3fxx1TZ+t2ILfw0D\\n3OyaEs47YgZnHTqNY+bWaPYFERHJOQptCm1ZrbG9mz++sI37Vmzh0VeDAFdbVsgZi6dy5iHTOHVR\\nPWVF+ZkuU0REZMwU2hTackZzZw8Pv7KDP7+wjftf2k5zZy+F+XmcvLCOMw+ZxpmHTGN6VXGmyxQR\\nEUmJQptCW07q6etn2brd/PnFbfz5xW2sb2gH4JAZlZx2UD1/c9AUlsyr1aVEREQkayi0KbTlPHdn\\n9fZW/vzidh56ZTvL1u2mt98pLYxx8sI6TjtoCqctmsL8+rJMlyoiIjIshTaFtkmntauXx19r4OFX\\ndvDQKzt4fVfQCzevrpTTFk3hlEX1vGFBHVWlmpFBREQmjpwJbWZ2OvBNYBVwq7s/ONp7FNoEYN3O\\nNh5+dQcPvbyDx9c00N7dhxkcNrOSkw6o46SFdRw/v5aKYoU4ERHJnGRDW1pPvzOza4Hzge3ufnjC\\n8rOB/wViwM/c/VsjbMaBVqAY2JjGciXHzK8vY359GR86aT7dvf08t6GRx19r4PE1O7nhsfX89JG1\\nxPKMI2ZVcdLCOk5eWMeSebWUFMYyXbqIiMg+0trTZmanEQSuG+OhzcxiwCvAWQQhbClwMUGAu3LQ\\nJi4Bdrp7v5lNA77n7h8Ybb/qaZPRdPb08cz63Tz2WgOPr2lg+YZGevudgphx5Oxqlsyv4fh5tRw3\\nr4aassJMlysiIjlswgyPmtl84N6E0HYScIW7vzV8/mUAdx8c2AZvpxC42d3fNczrlwGXAcydO/e4\\n9evXj1cTZBJo6+pl6bpdPL6mgaVrd7FiUxM9fcHfxqKp5SyZX8OSebUcP7+WObUlmqVBRETGzYQY\\nHh3GLGBDwvONwInDrWxm7wTeClQDPxhuPXe/BrgGgp62calUJo2yonxOP3gqpx88FQh64pZvaGTZ\\n+t0sW7eLe5/fwi1PBT/bqRVFAyHu2Hk1HDKjgqJ8DamKiEh6TfhLyrv7HcAdma5DJpfighgnHlDH\\niQfUAdDf77yyvYWl64IQt2zdbu5bsRWAwlgeh86s5Og51QO3eXWl6o0TEZFxlYnQtgmYk/B8drhs\\nzMzsAuCCAw88cDw2JzIgL89YPL2SxdMr+eAb5gGwubGD5zY0Dtx+tXQD1z+2DoCa0gKOmlPNUbOr\\nOXpuNUfPrtaxcSIiMiaZOKYtn+BEhDcThLWlwPvdfdV47VMnIkgm9Pb188q2Vp7b0MjyMMi9sr2F\\n+J/Y/LpSjphdzeEzKzl8VhWHzaykulRBTkRkspsQx7SZ2S3A6UC9mW0Evu7uPzezzwB/IDhj9Nrx\\nDGwimZIfDpMeOrOS9584Fwgu+Pv8xkaWb2jiuQ27eWb9bu5ZvnngPXNqSzh8ZhWHzwpvMyupKy/K\\nVBNERGQCm/AX102FetpkItvd1s3KzU2s3NTMys1NrNrUxLpwDlWAGVXFHDazisNnVXLErCoOmVHJ\\njKpiHSMnIpKjJswlP6KUcEzbpa+++mqmyxFJWlNHDy9sbmbV5iZWbmpixaYm1uxsGxharSzOZ/GM\\nSg6ZXsHiGZUsnl7BQdMqKCua8OcSiYjIKCZlaItTT5vkgrauXl7c0sxLW1t4aWszL21p4aWtLbR2\\n9QJgBvNqS4MTJGZUsHh6JYfMqGBOTSl5eeqVExHJFhPimDYRSV1ZUT5L5teyZH7twDJ3Z+PujiDI\\nhYHuxS3N/OGFrQO9cqWFMQ6aVsHB0ypYNK2cA6eWs2haBTM1xCoiktVyqqdNw6MyWXV09/Hq9hZe\\n2tLCi2Gv3KvbW9jZ2j2wTllhjAOnVbBoanlwm1bOoqkVzKouUc+ciEgGaXhUw6Mi7GrrZvX2Vl7d\\n3sKr2/bcb2/pGlinpCAW9MaFPXKLppazcGo5c2pKyI/lZbB6EZHJQcOjIkJtWSEnLKjlhAW1ey1v\\nau8JAtz21oEw9/iaBu54ds91rvPzjLl1pRxQX84BU8o4oL6MA6aUs6C+jPryQg21iohETKFNZBKq\\nKi3Y53g5gObOHl7d1sqaHa2s3dnGmh1trNnZysOv7qC7t39gvYrifA6YUh4EuYQwt6C+jJJCzcMq\\nIpIOCm0iMqCyuIDj5tVw3LyavZb39TubGzt4LSHMrd3ZxpNrGrjz2b1noZtZVcwBU8qZV1ca3sqC\\n+1oFOhGRscip0Ka5R0XSI5ZnzKktZU5tKacfvPdr7d29rNvZzpqdrQNhbs2OVn63YguN7T17rTu1\\nooj5dWXMrStlfl0pc+vKmB8GuqrSgghbJCKSfXQigoikTVN7D+t3tbGuoZ3XG+L37axraNvrZAiA\\n6tIC5tUm9MyF93NrS5lSXqQzXEUkZ+lEBBHJuKrSAo4srebI2dX7vNbe3cvru9pZ39DO+oa28L6d\\nZzfs5t7nN9Of8P+Thfl5zK4uYVZNCXNqS5ldU8KcmvC+tpS6Mp0YISK5T6FNRDKitDA/mM1heuU+\\nr3X39rOpsYN1DW1s3NXOxt0dbNgd3K9csYXdg4ZdSwpizK4pGQhxiYFudk0JVSUFCnUikvUU2kRk\\nwinMzxs4G3UorV29bNzdzsZde8LchjDcLVu/m5bO3r3WryjKZ1ZNCbPDMDezupgZVSXMrC5hVnUJ\\nUyqKiGn4VUQmuJwKbToRQWRyKC8avpcOoKmjZyDEbUwIdRt2tfPk2oZ9Ql1+njG9qpiZVUGgm1m9\\nJ9DNCJ9XFutECRHJLJ2IICKTTnNnD1saO9nc2MGmxg62NHWwubGTTY0dbG7sYGtTJ739e/+3saIo\\nPwxzxcwIA93M6iDozagqYWplEcUFuqSJiOw/nYggIjKMyuICKqcXcPD0iiFf7+t3drR0sbkpCHHB\\nbU+oW76xiV1t3fu8r7askGmVxcyoKmZaZTHT44+rgsfTq4qpLM7X8XUikhKFNhGRQWLhcOn0qmKO\\nnVsz5Dod3X1sbupg0+4OtjZ3srWpk63NnWxr6mRLUyfLNzTSMESwKymIBdsOQ9xeIa8qeFxfrmPs\\nRGRfCm0iIikoKYyxcEo5C6eUD7tOV28f25u79oS6MNjFnz+1dhfbWzrp6dt7KDaWZ0wpLxoId1Mr\\ni5haUcTUimKmhI+nVRZTW1qo69eJTCIKbSIiaVKUHxuYSWI4/f1OQ1s328IgtyXsrYsHu9U7Wnns\\ntZ00Dzp5AoITKOrLiwZC3ZSK4iDcVQYBL/64vryIglheOpsqIhFQaBMRyaC8PGNKRRFTKoo4fFbV\\nsOt19vSxo6WL7S2dbG/uYntLF9uaO9neEjzeuLuDZ18fekjWDOrKCveEuiGC3ZTyYuorCikt1D8L\\nIhNVTv116pIfIpKrigtG77UD6OnrZ2drF9ub9w51OxLC3ktbm9nZ2k1f/75XDygtjDGlIuidqy8v\\nDO+LqK8oYsqg52WFMZ1UIRIhXfJDRGQS6ut3doXDsjtauoJbaxc7W7vY2drNzpb44659ZqCIKy7I\\n2xPiyouYUlG41/P68kLqwwCos2ZFhqdLfoiIyLBiCcOyo+np62dXWzc7WhJCXWtXQrDrZuPudp7b\\nsJtdbd0M0YFHYSxvrxBXV1ZIbXlhcF8WPg9v9eVFlBTqmncigym0iYjIiApieUyrDC5LMpp4D97O\\n1j09dTtbguc7woC3tamTVZuDa90NPnM2rqQgRm1ZIXXle8Lc4IBXV15IXVkRteWFGqqVSUGhTURE\\nxs3+9OC5Oy1dvexq7aahrZtdbd3sausKHrcGzxvaumlo7eaVrS00tHXT1ds/5LYK8/P26q0bCHjl\\niT14wbKa0gIqiwt0uRTJOgptIiKSEWYWzE5RXMD8+rJR13d32rv7BsLcrrYuGlrjYW9P8Gto62bt\\nzjZ2tXXT3t035LbyDKpLC6kuLaCmtDC8FVBbVkh1+LimbM/ymrJCqksKyNelUySDFNpERCQrmBll\\nRfmUFeWPehZtXGdP30DPXUNbF7vautnd3kNjexDwGtt72N0eHJO3clMPu9q76R6mNw+gsjg/CHCl\\nhdSGga+6tJDasoLwfk8QjD8uytfxeTI+FNpERCRnFRfEmFVdwqzqkqTWd3c6evrY3d7D7rZudrd3\\n7/W4sb0nDH7d7Gjt4pVtrTS2d9M2TI8eBJdRqSktpKZsT69edWkB1SUFVJYEYa+6pIDq0gKqSgqo\\nCu8V9mSwnAptuk6biIiMhZlRWphPaWF+0kEPginL4r12iT14u9u69wmAr+9qp6mjh6aOHka66lZp\\nYSwIcWGgqy4pHHhcNfh5wn15kS6vkqt0nTYREZEM6O93Wjp7aeroobEjCHqNYZhrah/8PFinqaOH\\n3e09Iw7h5ufZXj121WFv3l4BMAx9lQlhr7K4gMJ8HbOXCbpOm4iIyASWl2dBsCotYC7JHaMX19kT\\n9Ow1dQTH5zWGwW5wAGzu6GFnazerd7TS2N5DyxBz2CYqLsijsjgMcSUFVBbnJzwuoLIkfyDgxZcF\\nr+dTUVxATGfkppVCm4iISJYpLogxvSrG9KrRr52XqLevn5bOXhrDsBeEvh5aOoPA19zZS3NH/HEQ\\n+NbsbAued/QMeeHkRBVF+VSWFFBRHNxXDRv2EsJguJ6utTc6hTYREZFJIj+WF1zKpKwQGP0yK4nc\\nnbbuvoEA1xyGvIHnnT00d/QOBL7mjh427GqnJQyCLV0j9/LlGfv03sUvCVNRHPTkBffB48ohluX6\\n8K5Cm4iIiIzKzCgvyqe8aP9O0ojr63dawmDXHO/ZGybsxcPgtuZWWjqDYd3hrrmXqLggLyHIxYNd\\nPhVF+wa/gR7BQaGwYAJfi0+hTURERNIulmfhBY0LU3p/b18/rV29Qc9dGOSaO4L7eLBr6QoeN3f2\\nDizf0tQ5EBY7evY/+H3l3EM4YUFtSjWPN4U2ERERmfDyY3ljCn0APX39tHbuHfxaBt/Hg1/YI1g0\\ngYZcFdpERERkUijY65i+7DNx4qOIiIiIDEuhTURERCQLKLSJiIiIZIGcCm1mdoGZXdPU1JTpUkRE\\nRETGVU6FNne/x90vq6qqynQpIiIiIuMqp0KbiIiISK5SaBMRERHJAgptIiIiIllAoU1EREQkCyi0\\niYiIiGQBhTYRERGRLKDQJiIiIpIFFNpEREREsoC5e6ZrGHdmtgNYn+bd1AM707yPiWwyt38ytx0m\\nd/vV9slrMrd/Mrcdomn/PHefMtpKORnaomBmy9x9SabryJTJ3P7J3HaY3O1X2ydn22Fyt38ytx0m\\nVvs1PCoiIiKSBRTaRERERLKAQlvqrsl0ARk2mds/mdsOk7v9avvkNZnbP5nbDhOo/TqmTURERCQL\\nqKdNREREJAsotKXAzM42s5fNbLWZfSnT9YwXM1tnZivM7DkzWxYuqzWzP5nZq+F9TbjczOyq8DN4\\n3syOTdjOh8P1XzWzD2eqPaMxs2vNbLuZrUxYNm7tNbPjws9zdfhei7aFwxum7VeY2abw+3/OzM5N\\neO3LYTteNrO3Jiwf8m/BzBaY2ZPh8l+ZWWF0rRuZmc0xswfM7AUzW2Vm/xAuz/nvfoS2T5bvvtjM\\nnjKz5WH7vxEuH7JmMysKn68OX5+fsK39+lwybYS2X29maxO++6PD5Tnzu48zs5iZPWtm94bPs+97\\nd3fd9uMGxIDXgAOAQmA5cGim6xqntq0D6gct+zbwpfDxl4D/DB+fC/weMOANwJPh8lpgTXhfEz6u\\nyXTbhmnvacCxwMp0tBd4KlzXwveek+k2j9L2K4DPD7HuoeHvvAhYEP7+YyP9LQC3Ae8LH/8Y+GSm\\n25zQnhnAseHjCuCVsI05/92P0PbJ8t0bUB4+LgCeDL+nIWsGPgX8OHz8PuBXqX4umb6N0PbrgXcN\\nsX7O/O4T2nQ5cDNw70i/1Yn8vaunbf+dAKx29zXu3g3cClyY4ZrS6ULghvDxDcDbE5bf6IEngGoz\\nmwG8FfiTu+9y993An4Czoy46Ge7+MLBr0OJxaW/4WqW7P+HBX/uNCdvKuGHaPpwLgVvdvcvd1wKr\\nCf4OhvxbCP/v+gzg9vD9iZ9jxrn7Fnd/JnzcArwIzGISfPcjtH04ufbdu7u3hk8LwpszfM2Jv4nb\\ngTeHbdyvzyXNzUrKCG0fTs787gHMbDZwHvCz8PlIv9UJ+70rtO2/WcCGhOcbGfk/etnEgT+a2dNm\\ndlm4bJq7bwkfbwWmhY+H+xyy/fMZr/bOCh8PXj7RfSYcCrnWwuFB9r/tdUCju/cOWj7hhMMexxD0\\nOkyq735Q22GSfPfhENlzwHaCwPEaw9c80M7w9SaCNmblf/8Gt93d49/9v4ff/X+bWVG4LNd+9/8D\\nfAHoD5+P9FudsN+7QpskOsXdjwXOAT5tZqclvhj+39OkOd14srUX+BGwEDga2AJ8N7PlpJeZlQO/\\nAT7n7s2Jr+X6dz9E2yfNd+/ufe5+NDCboIdkcYZLiszgtpvZ4cCXCT6D4wmGPL+YwRLTwszOB7a7\\n+9OZrmWsFNr23yZgTsLz2eGyrOfum8L77cCdBP9B2xZ2exPebw9XH+5zyPbPZ7zauyl8PHj5hOXu\\n28L/qPcDPyX4/mH/295AMJSSP2j5hGFmBQSh5Zfufke4eFJ890O1fTJ993Hu3gg8AJzE8DUPtDN8\\nvYqgjVn937+Etp8dDpm7u3cB15H6dz+Rf/dvBN5mZusIhi7PAP6XbPzeUzkQbjLfgHyCAy8XsOeA\\nw8MyXdc4tKsMqEh4/BjBsWjfYe+Ds78dPj6PvQ9SfSpcXgusJThAtSZ8XJvp9o3Q7vnsfTD+uLWX\\nfQ/KPTfT7R2l7TMSHv8jwbEbAIex98G3awgOvB32bwH4NXsf4PupTLc3oW1GcLzN/wxanvPf/Qht\\nnyzf/RSgOnxcAjwCnD9czcCn2fuA9NtS/VwyfRuh7TMSfhv/A3wr1373gz6H09lzIkLWfe8Z/wCz\\n8UZwVs0rBMdCfCXT9YxTmw4If2jLgVXxdhGM4/8FeBX4c8IfpwFXh5/BCmBJwrYuIThAczXw0Uy3\\nbYQ230IwFNRDcAzCx8azvcASYGX4nh8QXsx6ItyGaftNYdueB+5m73/IvxK242USzggb7m8h/D09\\nFX4mvwaKMt3mhNpOIRj6fB54LrydOxm++xHaPlm++yOBZ8N2rgS+NlLNQHH4fHX4+gGpfi6Zvo3Q\\n9vvD734l8Av2nGGaM7/7QZ/D6ewJbVn3vWtGBBEREZEsoGPaRERERLKAQpuIiIhIFlBoExEREckC\\nCm0iIiIiWUChTURERCQLKLSJZKFwupnPJTz/g5n9LOH5d83s8jFs/woz+/xIy83sejNba2bLzewV\\nM7sxnN9vuG3ebmYHhI/vM7PqVOtLlpmtM7P6NGx3sZk9Z2bPmtnCEdb7iJn9YLz3nyozW2JmV43T\\ntqaY2ZPhZ3DqeGwzYduFZvZwwoVPRQSFNpFs9VfgZAAzywPqCS78GHcywQWSRzXGfxj/2d2PAg4m\\nuAbU/WZWOMQ+DgNi7r4GwN3P9eCq7ONmPP6BN7NYkqu+Hbjd3Y9x99fGut/R7EddI3L3Ze7+2fHY\\nFvBmYEX4GTyS+MJY6/Vg0u2/AO8dy3ZEco1Cm0h2eoxg+h0IwtpKoMXMasIJnw8BnrHAd8xspZmt\\nMLP3ApjZ6Wb2iJndDbwQLvtK2GP2KEEIS5oH/ptgovVzhljlA8Bd8SfxHjAzm29mL5rZT81slZn9\\n0cxKBr85XO/+cFLrv5jZ3HD59Wb2YzN7Evi2mdWF21gV9jxawjb+1syeCnvIfhIPFmbWGvZMLk/4\\nTOPvOdrMngj3e2f4+Z4LfA74pJk9MEStHw0/x6cIps+JL59iZr8xs6Xh7Y3h8nIzuy78fp43s4uG\\nqsvMjjOzh8zs6bBnNT7l1qXh9paH2y8Nl787/N6Xm9nD4bLTzeze8PEVFkwO/6CZrTGzzybU+lUz\\ne9nMHjWzW2xQr6uZHQ18G7gw/DxL9qPe48Kalsd/m0P8XgB+G/5uRCSk0CaShdx9M9AbhpeTgceB\\nJwlCxxKCHpBu4J0Ek4AfBZwJfCf+jydwLPAP7n6QmR1HMF3L0QRX9j4+xdKeYegJuN8IDDdZ8yLg\\nanc/DGgELhpine8DN7j7kcAvgcQhvtnAye5+OfB14NFwW3cC8XB3CEGvzRs9mDC7jz2BoAx40t2P\\ncvdHB+33RuCL4X5XAF939/sIprz5b3d/U+LK4Wf7jbC9pwCHJrz8v+F7jg/bGB/O/irQ5O5HhPu5\\nf3BdBN/t94F3uftxwLXAv4fr3eHux4frvUgwuwXA14C3hsvfNsRnCsF39VaC+Sa/bmYFZhav7yiC\\nAL5k8Jvc/blw+79y96PdvWM/6r0O+PtwvZGsJPXfoUhO0vECItnrMYLAdjLwPWBW+LiJYPgUguBw\\ni7v3EUyI/hDBP4TNBHMJrg3XOxW4093bAcIeuFTYMMtnADuGeW1tGAIgCHbzh1jnJIIACsGUS99O\\neDQpItsAAAPJSURBVO3XYfsATouv5+6/M7Pd4fI3A8cBS80MgrkX4xPC9xFMoL53Q8yqCOZqfChc\\ndAPB1DYjORF40N13hNv4FXBQ+NqZ8P/bu4MQq6o4juPfXzLUYiacQoMgCgoCmRZBUANiuAwUXBhF\\nEeUmhNAWQRREWbgR123aZLSqhalllkNEEyOZFM6UVi5tUYRYouJoDL8W5zzmzevNvDfqJHf6fVbz\\nzj333P8dHsyfc///uayp1we4VdJgHX+yNWi7FXN7XPcDI8BYPX8F5TVkACOSdgIrgUHg8zo+AeyR\\n9CGwd554D7q8KPyypD+AOygJ537b08C0pI973HNLz3hV6hhX2h6v896n+84stmckXZE0ZPt8nzFE\\nLGtJ2iKaq1XX9gBlV+JX4CVKQvZuH+dfXIKYHqTUInW6RHmfXzeX236eoSRUi9HPfYiyU/dql2PT\\nbUnfUroJeKQmQ7OBab48d05cAk7YHu0ybw+wyfakpOco71bE9lZJD1Ne/P1d3U3t1Pm7v5a/CT3j\\n1eKbT24GpnvOivifyOPRiOY6AmwAztqesX2WstsyymwTwtfAE5JWSFpF2Yn6tsta48CmWps0BGxc\\nTCAqtlN21D7rMuUn4L7FrNnhCLO7UU9T7qubceCpGtNjwHAd/wLYLGl1PXabpLsXuqDtc8Cfmu2M\\nfAb4aoFToDwWfLTW1g0Aj7cdOwxsa32odWEAY8ALbePD/NsvwCpJo3XOgEpzB8AQZRdrgLYaMEn3\\n2j5q+3XKLuddPWJvmQA2Srql7gRu6PO8nvHW5pO/JK2t8+atWZN0O3DG9t9Xcf2IZSlJW0Rz/UDp\\nGv2mY+yc7TP180fAFDBJqZV62fbvnQvZ/h74oM47BBzrM4bdtfD8FOWx6/paS9fpIHUH6CptA7ZI\\nmqIkTy/OM+9NYJ2kE5THpKcBbJ8EXgMO1zXGKAlmL89S7nGKUu/31kKTbf8G7KDUGE5QktWW7cBD\\ntdngJLC1ju8EhltNA8CcOrm67hVgM7CrzjlO7R6m1MQdrdf7ue203bW54UdK0jvZx/1i+xhwgPK9\\nOUT9TvVzbp/xbgHelnScuY0id0r6tG2Z9ZTvTURUsn2jY4iIZU6lI/RLSiPAf/EoMq6BpEHbF2on\\n6jjwfE3sr/d17gE+sT3S5dhe4BXbp673dSOaKjVtEbHkbF+S9AalWeL0jY4nenpH0hpKHeJ7S5Gw\\nLUTlf/3tS8IWMVd22iIiIiIaIDVtEREREQ2QpC0iIiKiAZK0RURERDRAkraIiIiIBkjSFhEREdEA\\nSdoiIiIiGuAfgoSaV5R6tmAAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f053fefd7f0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy as np\\n\",\n    \"%matplotlib inline\\n\",\n    \"vocab_size = 40000\\n\",\n    \"x_axis = np.arange(vocab_size)\\n\",\n    \"zipfian = (np.log(x_axis + 2) - np.log(x_axis + 1)) / np.log(vocab_size + 1)\\n\",\n    \"plt.figure(figsize=(10, 6))\\n\",\n    \"plt.semilogy(x_axis, zipfian)\\n\",\n    \"plt.title('Log-Uniform Zipfian Sampling Distribution.')\\n\",\n    \"plt.xlabel('Word ID (in order of decreasing freq.)')\\n\",\n    \"plt.ylabel('Sampling probability')\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f053fee1ba8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"batch_size = 64\\n\",\n    \"num_samples = 512\\n\",\n    \"samples = [np.random.choice(x_axis, p=zipfian) for _ in range(num_samples)]\\n\",\n    \"plt.hist(samples)\\n\",\n    \"plt.title('Histogram of %d Sampled Values' % num_samples)\\n\",\n    \"plt.xlabel('Sampled Word ID')\\n\",\n    \"plt.ylabel('Counts')\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Candidate Sampling - TensorFlow\\n\",\n    \"\\n\",\n    \"[[Link]](https://www.tensorflow.org/extras/candidate_sampling.pdf)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### What is Candidate Sampling\\n\",\n    \"\\n\",\n    \"__Goal__: Learn a compatibility function $F(x, y)$ which says something about the compatibility of a class $y$ with a context $x$. \\n\",\n    \"\\n\",\n    \"__Candidate sampling__: for each training example $(x_i, y_i^{\\\\text{true}})$, only need to evaluate $F(x, y)$ *for a small set of classes* $\\\\{C_i\\\\} \\\\subset \\\\{L\\\\}$, where $\\\\{L\\\\}$ is the set of all possible classes (vocab size number of elements). \\n\",\n    \"\\n\",\n    \"We represent $F(x, y)$ as a *layer that is trained by back-prop from/within the loss function*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"### From Scratch: tf.nn.sampled_softmax_loss\\n\",\n    \"\\n\",\n    \"My version of tensorflow's op, customized with DynamicBot in mind. \\n\",\n    \"\\n\",\n    \"Here is a subset of the source code with all the irrelevant parts removed, with the aim of understanding the implementation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"```python\\n\",\n    \"def sampled_softmax_loss(output_projection, labels, state_outputs, num_sampled, vocab_size, sess=None):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Args:\\n\",\n    \"        output_projection: (tuple) returned by any Decoder.get_projections_tensors()\\n\",\n    \"            - output_projection[0] == w tensor. [state_size, vocab_size]\\n\",\n    \"            - output_projection[1] == b tensor. [vocab_size]\\n\",\n    \"        labels: 2D Integer tensor. [batch_size, None]\\n\",\n    \"        state_outputs: 3D float Tensor [batch_size, None, state_size].\\n\",\n    \"            - In this project, usually is the decoder batch output sequence (NOT projected).\\n\",\n    \"            - N.B.: Assumption is that 'None' here is always the same 'None' in labels (target sequence length).\\n\",\n    \"        num_sampled: number of classes out of vocab_size possible to use.\\n\",\n    \"        vocab_size: total number of classes.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"First step: unpack output projection tuple and reshape for convenience. \\n\",\n    \"* Possible optimization: Don't do reshapes. They seem to be slow for sparse stuff. \\n\",\n    \"* SparseTensors may be useful here. Look into later. \\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"    # Extract transpose weights, now shape is [vocab_size, state_size].\\n\",\n    \"    # Use tf.reshape which is dynamic as opposed to static (i.e. slow) tf.transpose.\\n\",\n    \"    weights = tf.reshape(output_projection[0], [vocab_size, -1])\\n\",\n    \"    state_size = tf.shape(weights)[-1]\\n\",\n    \"    biases  = output_projection[1]\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"__Shape check__:\\n\",\n    \"* weights: [vocab size, state size]\\n\",\n    \"* biases: [vocab size]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next, enter our implementation of what tensorflow has named as ```_compute_sampled_logits```. \\n\",\n    \"* The values passed in ```name_scope``` are for graph visualization reasons. Not important.\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"\\n\",\n    \"    with tf.name_scope(\\\"compute_sampled_logits\\\", [weights, biases, state_outputs, labels]):\\n\",\n    \"        # Smush tensors so we can use them with tensorflow methods.\\n\",\n    \"        # Question: Docs suggest we should reshape to [-1, 1] so I'm keeping.\\n\",\n    \"        # but original code had it as just [-1].\\n\",\n    \"        labels = tf.cast(labels, tf.int64)\\n\",\n    \"        labels_flat = tf.reshape(labels, [-1, 1])\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"__Sampling__:  Returns 3-tuple:\\n\",\n    \"1. sampled_candidates: [num_sampled] tensor\\n\",\n    \"2. true_expected_count shape = [batch_size $\\\\times$ None, 1] tensor\\n\",\n    \"    * Entries associated 1-to-1 with smushed labels.\\n\",\n    \"3. sampled_expected_count shape = [num_sampled] tensor\\n\",\n    \"    * Entries associated 1-to-1 with sampled_candidates.\\n\",\n    \"    \\n\",\n    \"```python\\n\",\n    \"        # Sample the negative labels.\\n\",\n    \"        sampled_values = tf.nn.log_uniform_candidate_sampler(\\n\",\n    \"            true_classes=labels_flat, num_true=1, num_sampled=num_sampled,\\n\",\n    \"            unique=True, range_max=vocab_size)\\n\",\n    \"        S_i, Q_true, Q_samp = (tf.stop_gradient(s) for s in sampled_values)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"__What's going on here__: \\n\",\n    \"* NOTE: Remember we are inside a single time slice/step right now!!!\\n\",\n    \"* ```S_i```: (int64) tensor of shape [num samples], using naming convention of article. The subset of the vocabulary we'll be using henceforth for *all examples in the current batch*. \\n\",\n    \"* ```Q_true```: (float) tensor of shape [batch size, 1]. The probability of sampling the true class. Period. Literally the value $Q(y \\\\mid x)$ for each training example out of ```batch_size``` total. \\n\",\n    \"* ```Q_samp```: (float) tensor of shape [num samples]. The value of $Q(y_{samp} \\\\mid \\\\text{log uniform})$ for all $y_{samp}$ in the tensor ```sampled```. That's it. *Independent of, and not associated with, batch size*. \\n\",\n    \"\\n\",\n    \"__Epiphany__: Just realized something. The reason we should *not* do the suggestion from stackoverlow is because for a given sampled sentence, *it would force all sampled words in that sentence to be from the same subset of size num samples*. We would get pretty terrible sentences, especially when the next word is likely to be rare given the previous word. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"```python\\n\",\n    \"\\n\",\n    \"        # Casting this back to actually be flat.\\n\",\n    \"        batch_times_none = tf.shape(labels_flat)[0]\\n\",\n    \"        labels_flat = tf.reshape(labels, [-1])\\n\",\n    \"        # Get concatenated 1D tensor of shape [batch_size * None + num_samples],\\n\",\n    \"        C_i = tf.concat([labels_flat, S_i], 0)\\n\",\n    \"\\n\",\n    \"        # The embedding_lookup here should be thought of as embedding\\n\",\n    \"        # the integer label and sampled IDs in the state space.\\n\",\n    \"        # all_w has shape [batch_size * None + num_samples, state_size]\\n\",\n    \"        # all_b has shape [batch_size * None + num_samples]\\n\",\n    \"        all_w       = tf.nn.embedding_lookup(weights, C_i, partition_strategy='div')\\n\",\n    \"        all_b       = tf.nn.embedding_lookup(biases, C_i)\\n\",\n    \"        \\n\",\n    \"        true_w      = tf.slice(all_w, begin=[0, 0], size=[batch_times_none, state_size])\\n\",\n    \"        true_b      = tf.slice(all_b, begin=[0], size=[batch_times_none])\\n\",\n    \"        \\n\",\n    \"        sampled_w   = tf.slice(all_w, begin=[batch_times_none, 0], size=[num_sampled, state_size])\\n\",\n    \"        sampled_b   = tf.slice(all_b, begin=[batch_times_none], size=[num_sampled])\\n\",\n    \"\\n\",\n    \"        state_outputs    = tf.reshape(state_outputs, [batch_times_none, state_size])\\n\",\n    \"        state_outputs = tf.cast(state_outputs, tf.float32)\\n\",\n    \"        \\n\",\n    \"        true_logits      = tf.reduce_sum(tf.multiply(state_outputs, true_w), 1)\\n\",\n    \"        true_logits     += true_b - tf.log(Q_true)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"Question: how are we not done here? \\n\",\n    \"* Answer 1: because we haven't softmaxed yet...\\n\",\n    \"* Answer 2: Ohhhhhhh. It's because true logits only gives us the log probabilities *for the target ys*. It's important to remember we are basically building a smaller network output over num samples (+1) space instead of vocab space. So far, we just have the +1 part. Now we need the num samples part. And yes, technically the num samples argument should clarify that it ends up using num samples +1.\\n\",\n    \"\\n\",\n    \"I see now that remove accidental hits defaults to True because it's probably easier than dealing with \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"```python\\n\",\n    \"        # Matmul shapes [batch_times_none, state_size] * [state_size, num_sampled].\\n\",\n    \"        sampled_logits   = tf.matmul(state_outputs, sampled_w, transpose_b=True) + sampled_b\\n\",\n    \"        # NO. BOO.\\n\",\n    \"        #sampled_logits  += _sparse_to_dense(sampled_logits, tf.expand_dims(labels_flat, -1), sampled, num_sampled) \\n\",\n    \"        sampled_logits  -= tf.log(Q_samp)\\n\",\n    \"\\n\",\n    \"        # Construct output logits and labels. The true labels/logits start at col 0.\\n\",\n    \"        # shape(out_logits) == [batch_times_none, 1 + num_sampled]. I'M SURE.\\n\",\n    \"        out_logits = tf.concat([true_logits, sampled_logits], 1)\\n\",\n    \"        # true_logits is a float tensor, ones_like(true_logits) is a float tensor of ones.\\n\",\n    \"        out_labels = tf.concat([tf.ones_like(true_logits), tf.zeros_like(sampled_logits)], 1)\\n\",\n    \"\\n\",\n    \"    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=out_labels, logits=out_logits))\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "notebooks/DataVizUtils.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Data Visualization Utilities\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Because I should probably start standardizing my data exploration.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import sys\\n\",\n    \"import os\\n\",\n    \"import pandas as pd\\n\",\n    \"from nltk import word_tokenize\\n\",\n    \"from collections import Counter\\n\",\n    \"from itertools import chain\\n\",\n    \"import matplotlib.pyplot as plt, mpld3\\n\",\n    \"%matplotlib inline\\n\",\n    \"import re\\n\",\n    \"\\n\",\n    \"sys.path.append('..')\\n\",\n    \"from imp import reload\\n\",\n    \"from data import reddit_preprocessor, DataHelper\\n\",\n    \"from data.reddit_preprocessor import *\\n\",\n    \"import json\\n\",\n    \"from pprint import pprint\\n\",\n    \"from jupyterthemes import jtplot\\n\",\n    \"\\n\",\n    \"jtplot.style('onedork', ticks=True, fscale=1.5)\\n\",\n    \"jtplot.figsize(x=11., y=8.)\\n\",\n    \"DATA_ROOT = '/home/brandon/Datasets/test_data'\\n\",\n    \"FROM = os.path.join(DATA_ROOT, 'train_from.txt')\\n\",\n    \"TO = os.path.join(DATA_ROOT, 'train_to.txt')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"COL_NAMES = ['inp_sentence', 'resp_sentence']\\n\",\n    \"\\n\",\n    \"def make_dataframe(data_dir):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    data_dir: contains train_from.txt, train_to.txt\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    from_lines = []\\n\",\n    \"    to_lines = []\\n\",\n    \"    with open(os.path.join(data_dir, 'train_from.txt'), 'r') as from_file:\\n\",\n    \"        with open(os.path.join(data_dir, 'train_to.txt'), 'r') as to_file:\\n\",\n    \"            from_line = from_file.readline()\\n\",\n    \"            to_line = to_file.readline()\\n\",\n    \"            while from_line and to_line:\\n\",\n    \"                from_lines.append(from_line.strip())\\n\",\n    \"                to_lines.append(to_line.strip())\\n\",\n    \"                from_line = from_file.readline()\\n\",\n    \"                to_line = to_file.readline()\\n\",\n    \"            df = pd.DataFrame(np.stack((from_lines, to_lines), 1),\\n\",\n    \"                              columns=COL_NAMES)        \\n\",\n    \"        return df\\n\",\n    \"    \\n\",\n    \"def word_tokenize(df):\\n\",\n    \"    word_freq = {}\\n\",\n    \"    \\n\",\n    \"    # I know. I KNOW.\\n\",\n    \"    sentences = np.squeeze(list(((map(\\n\",\n    \"        DataHelper.word_tokenizer, \\n\",\n    \"        list(np.expand_dims(df[COL_NAMES[0]].values, 1)))))))\\n\",\n    \"    \\n\",\n    \"    word_freq['from'] = Counter(chain.from_iterable(sentences))\\n\",\n    \"    # Stop judging me.\\n\",\n    \"    sentences = np.squeeze(list(((map(\\n\",\n    \"        DataHelper.word_tokenizer, \\n\",\n    \"        list(np.expand_dims(df[COL_NAMES[1]].values, 1)))))))\\n\",\n    \"    word_freq['to'] = Counter(chain.from_iterable(sentences))\\n\",\n    \"    \\n\",\n    \"    return word_freq\\n\",\n    \"\\n\",\n    \"def plot_freq_dist(word_freq, n):\\n\",\n    \"    words_dict = {}\\n\",\n    \"    for dist in word_freq:\\n\",\n    \"        most_comm = word_freq[dist].most_common(n)\\n\",\n    \"        words, counts = zip(*most_comm)\\n\",\n    \"        words_dict[dist] = words\\n\",\n    \"        counts_series = pd.Series.from_array(counts)\\n\",\n    \"\\n\",\n    \"        plt.figure(figsize=(8, 5))\\n\",\n    \"        ax = counts_series.plot(kind='bar')\\n\",\n    \"\\n\",\n    \"        ax.set_title('Frequency Distribution: ' + dist)\\n\",\n    \"        ax.set_ylabel('Counts')\\n\",\n    \"        ax.set_xlabel('Words')\\n\",\n    \"        ax.set_xticklabels(words_dict[dist])\\n\",\n    \"\\n\",\n    \"    from_words = set(words_dict['from'])\\n\",\n    \"    to_words = set(words_dict['to'])\\n\",\n    \"    common_words = from_words.intersection(to_words)\\n\",\n    \"    common_word_freqs = [\\n\",\n    \"        [word_freq['from'][w] for w in common_words],\\n\",\n    \"        [word_freq['to'][w] for w in common_words]]\\n\",\n    \"    \\n\",\n    \"    ind = np.arange(len(common_words))\\n\",\n    \"    plt.figure(figsize=(8, 5))\\n\",\n    \"    p1 = plt.bar(ind, common_word_freqs[0], width=0.5, color='b')\\n\",\n    \"    p2 = plt.bar(ind, common_word_freqs[1], width=0.5, color='r')\\n\",\n    \"    plt.xticks(ind, common_words)\\n\",\n    \"    plt.legend((p1[0], p2[0]), ('From', 'To'))\\n\",\n    \"    return common_words\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pd.set_option('display.max_colwidth', 10000)\\n\",\n    \"df = make_dataframe(DATA_ROOT)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"pd.set_option('display.max_colwidth', 10000)\\n\",\n    \"df.head(len(df.index))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"scrolled\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"word_freq = word_tokenize(df)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"common_words = plot_freq_dist(word_freq, 5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"common_words\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# From TensorBoard to JSON to Matplotlib\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\\n\",\n    \"import numpy as np\\n\",\n    \"import pandas as pd\\n\",\n    \"import yaml\\n\",\n    \"import re\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"%matplotlib inline\\n\",\n    \"from jupyterthemes import jtplot\\n\",\n    \"from scipy.interpolate import spline\\n\",\n    \"jtplot.style('onedork', ticks=True, fscale=1.5)\\n\",\n    \"jtplot.figsize(x=11., y=8.)\\n\",\n    \"pd.set_option('display.max_colwidth', 1000)\\n\",\n    \"\\n\",\n    \"# --------------------------------------------------------\\n\",\n    \"# Globals\\n\",\n    \"# --------------------------------------------------------\\n\",\n    \"SEQ = os.getenv('SEQ')\\n\",\n    \"STATIC = os.getenv('STATIC')\\n\",\n    \"\\n\",\n    \"BASE_DIR = os.path.join(os.getcwd(), 'individual_tb_plots')\\n\",\n    \"ACC_DIR = os.path.join(BASE_DIR, 'accuracy')\\n\",\n    \"TRAIN_DIR = os.path.join(BASE_DIR, 'train')\\n\",\n    \"VALID_DIR = os.path.join(BASE_DIR, 'valid')\\n\",\n    \"COL_NAMES =  ['wall_time', 'iteration']\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Format the dictionary configuration dictionaries\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"{'BasicDeepGRU': {'dataset_params': {'config_path': 'configs/cornell.yml'},\\n\",\n      \"                  'model_params': {'attention_size': None,\\n\",\n      \"                                   'base_cell': 'GRUCell',\\n\",\n      \"                                   'batch_size': 256,\\n\",\n      \"                                   'encoder.class': 'BasicEncoder',\\n\",\n      \"                                   'num_layers': 3}},\\n\",\n      \" 'BasicGRU': {'dataset_params': {'config_path': 'configs/cornellBasic.yml'},\\n\",\n      \"              'model_params': {'attention_size': None,\\n\",\n      \"                               'base_cell': 'GRUCell',\\n\",\n      \"                               'batch_size': 256,\\n\",\n      \"                               'encoder.class': 'BasicEncoder',\\n\",\n      \"                               'num_layers': 1}},\\n\",\n      \" 'BasicLSTM': {'dataset_params': {'config_path': 'configs/example_cornell.yml'},\\n\",\n      \"               'model_params': {'base_cell': 'LSTMCell',\\n\",\n      \"                                'batch_size': 256,\\n\",\n      \"                                'encoder.class': 'BasicEncoder',\\n\",\n      \"                                'num_layers': 1}},\\n\",\n      \" 'BidiGRU': {'dataset_params': {'config_path': 'configs/cornellBasicBidi.yml'},\\n\",\n      \"             'model_params': {'attention_size': None,\\n\",\n      \"                              'base_cell': 'GRUCell',\\n\",\n      \"                              'batch_size': 256,\\n\",\n      \"                              'encoder.class': 'BidirectionalEncoder',\\n\",\n      \"                              'num_layers': 1}},\\n\",\n      \" 'BidiLSTM': {'dataset_params': {'config_path': 'configs/example_cornell.yml'},\\n\",\n      \"              'model_params': {'base_cell': 'LSTMCell',\\n\",\n      \"                               'batch_size': 128,\\n\",\n      \"                               'encoder.class': 'BidirectionalEncoder',\\n\",\n      \"                               'num_layers': 1}}}\\n\",\n      \"{'basic': 'BasicGRU',\\n\",\n      \" 'basicBidi': 'BidiGRU',\\n\",\n      \" 'basicDeep': 'BasicDeepGRU',\\n\",\n      \" 'basicLSTM': 'BasicLSTM',\\n\",\n      \" 'bidiLSTM': 'BidiLSTM'}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from copy import deepcopy\\n\",\n    \"\\n\",\n    \"omfg = {}\\n\",\n    \"configs = {}\\n\",\n    \"run_keys = set()\\n\",\n    \"for fname in os.listdir(ACC_DIR):\\n\",\n    \"    name = re.search(r'(?:-)(\\\\w+)(?:-)', fname).group(0)[1:-1]\\n\",\n    \"    run_keys.add(name)\\n\",\n    \"run_keys = list(run_keys)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"for k in run_keys:\\n\",\n    \"    fname = os.path.join(SEQ, 'out/cornell', k, 'config.yml')\\n\",\n    \"    with open(fname, 'r') as config_file:\\n\",\n    \"        configs[k] = yaml.load(config_file)\\n\",\n    \"\\n\",\n    \"def filtered_configs(configs):\\n\",\n    \"    _configs = [(k, deepcopy(configs[k])) for k in configs]\\n\",\n    \"    # Remove dataset name (assuming they're all cornell)\\n\",\n    \"    _configs = list(filter(lambda c: c[1].pop('dataset'), _configs))\\n\",\n    \"    # Remove model name (all are DynamicBot)\\n\",\n    \"    _configs = list(filter(lambda c: c[1].pop('model'), _configs))\\n\",\n    \"    # misc.\\n\",\n    \"    _configs = list(filter(lambda c: c[1]['model_params'].pop('ckpt_dir'), _configs))\\n\",\n    \"\\n\",\n    \"    for k in ['model_params', 'dataset_params']:\\n\",\n    \"        kk_list = list(_configs[0][1][k])\\n\",\n    \"        for kk in kk_list:\\n\",\n    \"            vals = set()\\n\",\n    \"            for conf in _configs:\\n\",\n    \"                conf = conf[1]\\n\",\n    \"                vals.add(conf[k].get(kk))\\n\",\n    \"            if len(vals) == 1 and 'attention' not in kk:\\n\",\n    \"                # Remove items that are all the same.\\n\",\n    \"                _wtf = list(filter(lambda c: c[1][k].pop(kk), _configs))\\n\",\n    \"                if _wtf: _configs = _wtf\\n\",\n    \"    return {k: v for k, v in _configs}\\n\",\n    \"            \\n\",\n    \"def renamed(name):\\n\",\n    \"    _omfg = name\\n\",\n    \"    if 'idi' in name:\\n\",\n    \"        name = name.replace('basic', '')\\n\",\n    \"        name = name.replace('bidi', 'Bidi')\\n\",\n    \"    name = name.replace('basic', 'Basic')\\n\",\n    \"    if 'LSTM' not in name:\\n\",\n    \"        name += 'GRU'\\n\",\n    \"    omfg[_omfg] = name\\n\",\n    \"    return name\\n\",\n    \"\\n\",\n    \"f_configs = filtered_configs(configs)\\n\",\n    \"f_configs = {renamed(n): v for n, v in f_configs.items()}\\n\",\n    \"pprint(f_configs)\\n\",\n    \"pprint(omfg)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"df_acc = {}\\n\",\n    \"df_train = {}\\n\",\n    \"df_valid = {}\\n\",\n    \"\\n\",\n    \"for k in run_keys:\\n\",\n    \"    fname = 'run-'+k+'-tag-evaluation_accuracy.json'\\n\",\n    \"    df_acc[omfg[k]] = pd.read_json(os.path.join(ACC_DIR, fname))\\n\",\n    \"    \\n\",\n    \"    fname = 'run-'+k+'-tag-evaluation_loss_train.json'\\n\",\n    \"    df_train[omfg[k]] = pd.read_json(os.path.join(TRAIN_DIR, fname))\\n\",\n    \"    \\n\",\n    \"    fname = 'run-'+k+'-tag-evaluation_loss_valid.json'\\n\",\n    \"    df_valid[omfg[k]] = pd.read_json(os.path.join(VALID_DIR, fname))\\n\",\n    \"\\n\",\n    \"    df_acc[omfg[k]].columns = COL_NAMES + ['accuracy']\\n\",\n    \"    df_train[omfg[k]].columns = COL_NAMES + ['training loss']\\n\",\n    \"    df_valid[omfg[k]].columns = COL_NAMES + ['validation loss']\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 95,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"run_keys = list(f_configs.keys())\\n\",\n    \"def plot_df(df, y_name, run_key, n_points=25, use_spline=True, plot_perp=False):\\n\",\n    \"    \\\"\\\"\\\"Assuming df is from tensorboard json . . . \\\"\\\"\\\"\\n\",\n    \"    if plot_perp:\\n\",\n    \"        df = df.loc[2:]\\n\",\n    \"        df[y_name] = np.exp(df[y_name])\\n\",\n    \"    \\n\",\n    \"    if use_spline:\\n\",\n    \"        iters = df.iteration\\n\",\n    \"        iters_new = np.linspace(iters.min(), iters.max(), n_points)\\n\",\n    \"        smooth_y = spline(iters, df[y_name], iters_new)\\n\",\n    \"        plt.plot(iters_new, smooth_y, label=run_key)\\n\",\n    \"    else:\\n\",\n    \"        plt.plot(df['iteration'], df[y_name], label=run_key)\\n\",\n    \"        \\n\",\n    \"    plt.title(y_name.title())\\n\",\n    \"    plt.ylabel(y_name)\\n\",\n    \"    if y_name == 'accuracy':\\n\",\n    \"        plt.ylim([0., 1.])\\n\",\n    \"        plt.yticks(list(np.arange(\\n\",\n    \"            0., float(plt.yticks()[0][-1])+0.1, step=0.1)))\\n\",\n    \"        leg_kwargs = dict(fontsize='x-small',\\n\",\n    \"                          loc='upper left')\\n\",\n    \"    else:\\n\",\n    \"        plt.yticks(list(np.arange(\\n\",\n    \"            0., float(plt.yticks()[0][-1])+1., step=1.)))\\n\",\n    \"        leg_kwargs = dict(fontsize='small',\\n\",\n    \"                          loc='upper right')\\n\",\n    \"    plt.xlim([0., 1.0e4])\\n\",\n    \"    plt.xlabel('Iteration')\\n\",\n    \"    plt.legend(**leg_kwargs)\\n\",\n    \"\\n\",\n    \"def plot_runs(df_dict, y_name, n_points=25, \\n\",\n    \"              use_spline=True, plot_perp=False,\\n\",\n    \"              figsize=(10,7)):\\n\",\n    \"    \\\"\\\"\\\"Calls plot_df for each key in the df_dict.\\\"\\\"\\\"\\n\",\n    \"    fig = plt.figure(figsize=figsize)\\n\",\n    \"    for k in run_keys:\\n\",\n    \"        plot_df(deepcopy(df_dict[k]), y_name, k, \\n\",\n    \"               n_points=n_points,\\n\",\n    \"               use_spline=use_spline,\\n\",\n    \"               plot_perp=plot_perp)\\n\",\n    \"    return fig\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 96,\n   \"metadata\": {\n    \"scrolled\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:1742: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\\n\",\n      \"  warnings.warn(\\\"This figure includes Axes that are not \\\"\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7fa931c97278>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\ndI2xo7KC7qlp9ZYlmEym4Hra/LwcJk+dhWEYwSS9sqI8WPeH97rdNcHPbPP61cTFxfOjh57gb3/9\\nPdXVLgBqql1YkzrXe0+RdQl1TV291k7bCvyQu4KagIHdGwdAz8T2NYUvIiLSngUCAQzDhMkw0aVL\\nMukZffjw3dfYvXMr58+dJiY2Nlg3tUdPJk+dRXbWebZs+IJX//xbIiLMpKX3CmnTVlpCctfQ3QiW\\nPfRjRo+ddM04EhKTSEvP4MypEwCUlRYTF5+Iraw0+GfshKn0zOiDvawUv9+HxWINXvP5fMxZcGcw\\nsbRao4PLGKD24bjLhbU7UJ08cYSw8HDGjJtcLw5zZGRw+cS1bFj7GRFmM7PmLgqWXS4qoFv3VAxT\\naKqYmppOaWkxHo/num22Fkp0f8jjwGGEB/fS7RHXwvGIiIjINVksVqJjYomOiSWxU2cWLroHk8ng\\n7JlMqqur8fv9DB46krj4BAYOHsb0utNSw8LC8Hg9TJs5j+EjxxKfkMjgYaOIiDBTVBi6hemJ44ew\\nWKOZNW8xiZ06M3rsJHpm9OXihXPBOldiiItPoG//QSxf8QSXsi9y7kztzgz7vtnJkGEjGTNuMgmJ\\nSUyaOovRYydSWnIZt7uGo4f2s2DxPaT17EWX5K7cec8DxMTEBdcWAyxeuowuyV0ZMGgYYydM5cC+\\nr4HaWd/1X65i9vzFzJm/hK7dU4lPSGTo8NE88bNnMQyDkrqZ5atxOir5+qstjBg9nq7dap8+PHP6\\nBIZhsPSeB0ju2p3ETkkMHTGG6bMXsG93/d0dWistXfgBI+Cn3Iig0l37209qtH4XEBERaa3uW/5Y\\n8Ge3201hfg4r33sjuN50/ZpVTJ0xl5lz76C0pJiN6z7nzrrkrSA/lzWr/8mU6XNYuOReyu02Vq/6\\nkLLS4pCZ35rqaj764E3mLbyLcROmYCsrZdVH72IrKyE2rnZG7L/88r8B4PV6KC+3c/rkMfbs3BZs\\nIy8nmy8/+4ipM+YyZ8ESykpLWPXR34NJ9eYNq5m7YCn3LX8Mk8lE9sXzfP7JByHv9cL5szzyxDO4\\na2rYtmktpzKPBa9lHj9MWVkJk6bMZPmKnxAVZaHcXsaZk8fZt+crnE7HdT/H/Xt3MWrMBOYvupu/\\nv/lXPG437731CrPnLeahx35GRIQZW1kJ2zat4ejh/TcyVC3CmDB9cYf7bj6l1yAMw0Tehavvfzcp\\n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\\nhBBCCCG80v8D6fPvPrxMDVYAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7fa931bd12e8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\niIiI3BvTjOALdNDcUcctz2UikUe/4t2wT3RXlK+l4oODHNq/m0sXzvObX/6UcCTMgqeXDHXXRERE\\nRGQYG9aJbk5uHtnZuVys6plQPhQKUX3pAlOmFg1hz0RERERkuBvWNbq57jwAPJ7GhPaWZg/Timbd\\n0zlSUlJJSU1NaLNYLJgYpMTmZpQkFZsIXHFOYorxyKA4Jz/FWB6SYZ3oOp3RSbYDgcR52AIBH07n\\nHZZH7KO4ZBkrytcltL3+29cJBh7tXX8iIiIi8mgN60Q3cfLCRObdF0wBoOKDg5w9fSKhLTV7NCYG\\n3gdcZUceD90jA4pz8lKMRwbFOfkpxiPEqHGP/C2HdaLr90XXgHc4nfj9PevBOxyuhO3BeL1deL2J\\ny9S5MvPjSxCKiIiISHIa1tlec6w2NzsnN6E9OycXT9PAc7aJiIiIiMAwT3Q9TY20tjYzfcaceJvV\\nZmPK1Olcu3J5CHsmIiIiIsPdsC5dADh8YA/rNz1PwO+j9uYNSpaUYrXaOH7s0FB3TURERESGsWGf\\n6H547DAOh5PiRcsoWVpO3a0afvX//p3Ojvah7pqIiIiIDGPDPtEFOHLwfY4cfH+ouyEiIiIij5Fh\\nXaMrIiIiIvKglOiKiIiISFJSoisiIiIiSemxqNH9pFms0Y89dvLMIe6JPEzdi4KY+WOGuCfysCjG\\nI4PinPwU45HBsFgwHvEY6wgd0TUxDAPDMO5+qDzGTGx2u+Kc1BTjkUFxTn6K8UhhGAYpKamP7P1G\\n5IhuV3MdX/nr/8q//O//iaepcai7Iw9JrjtPcU5yivHIoDgnP8V4ZOgdZ6+365G85wgd0RURERGR\\nZKdEV0RERESSkhJdEREREUlKSnRFREREJClZxxdM//5Qd2IohEJBrl+tJhQKDnVX5CFSnJOfYjwy\\nKM7JTzEeGR51nI2S0s3mI3knEREREZFHSKULIiIiIpKUlOiKiIiISFJSoisiIiIiSUmJroiIiIgk\\nJSW6IiIiIpKUlOiKiIiISFJSoisiIiIiSUmJroiIiIgkJdtQd+BRW1C8hJKlZaRnZFBXW8O727dw\\nu652qLsld2CxWlmybCVzn1xAekYWzZ5GDu3fxfmzpwCw2mysWruZWbOfxGa3c+nCeXZs/z3erq74\\nOTKzslm36XkKJhUSDAT46MMP2P/+TkyzZ62UiQVTWLXuGfJHjaa1pZkDe3dy7szJR/55Rzq7w8Ff\\n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\\nzu4d26i7dROIzsJUtmoDKalpmKZJ2ar1TJg4mbd+/2u6ek1HNxCjpHTziCrfXrysnOJFy3ClpFJ3\\nq4ad7/yB+tgvUoaXBU8vYcPmFwbc19XVyav/+H3sDgdrNzzLjFnzME2T6ktV7Ny+ha5eK6XkuvNY\\nv+nTjJ84GZ+3i1MfHWPfnh0JBexTphaxau1mct15tDR7tKTkEPrat75D5bnT8RF8xTh5zJ1fzJJl\\n5WTn5NLsaWLfnh1UnT8NKM7JwG63U7Z6I7NmP4nD6aKp8TaHD+ym8pxinAxWlK9l4aJlCUsAGxYL\\nK1dvZO78Ymw2GzeuXWHH9i0JFx1p6Rms3/Q8U6YWEQoGqTx3mvd2bE0oORgzbgLrNj7H6CfG0tHe\\nzrEj+znWZ7rJuU8uZFnZGjIysmhsqGfPe9ELqLsZcYmuiIiIiIwMI6ZGV0RERERGFiW6IiIiIpKU\\nlOiKiIiISFJSoisiIiIiSUmJroiIiIgkJSW6IiIiIpKUlOiKiDyAufOL+e73/4m584vjbalpadjt\\n9iHpj8PhJDU1Lb69onwt3/3+P5GVnTMk/RERGQ6U6IqIfAKmTC3iy9/4O1J7LV/6qDwxZhxf/sZ/\\nIW/U6Hhb5fkzbPndr+66apCISDKz3f0QERG5m3HjJ5KSkjok750/egwZmVkJbQ31t2iovzUk/RER\\nGS40oisiIiIiSUkjuiIiH9Mzz7/EvFit7te/9V2uXb3ML3/+LwDk5Y+ibNVGCiYXYrVaqbtVy4G9\\nO7ly+UL89S9/4SuEQiHqam/w9OIVBINB/vP//isNt+uYMWsexYuWMuqJsdjtdtrb2jh/7hT7dr9D\\nOBxmRflaVpSvA+CVL3yVlhYP//zqP8Tbf/Tq39Pa0gxASkoqpavWM71oNimpabS2eDj1UQVHDr6P\\naUZXg19RvpYly1fy7//8A9Zs+BQTC6YQiUS4WHWOXe9uxevtepS/WhGRj0WJrojIx3Si4ghOp5Oi\\nmXPZ+c4WGm7XA5A/6gn+7C++RmdHO4f27yYcDjN77nxeevmLbPntf3L+7Mn4OSZMnEROTi67d2wj\\nKyeXxoZ6nlywiM3PvsiFyrPsee9trFYrRTPnsmRZOQB7dm6j8vwZ0tMzeap4MQf37eJW7Y0B++hy\\npfC5L36drOxcTlQcpqmpgcmF01m5ZhOjnxjL79/4ZfxYw7Dw8he+zI1rV9i9Yxtjxo1n/oIS7HY7\\nb77+Hw/vFyki8glToisi8jHdrLnG7fpbFM2cy4XKs/ER1HWbnqerq5Of/eurBINBACqOHuTlz3+Z\\ntRufo6ryDJFwGIjOmvCH3/2K2ps9iWrJklJqblzljdd+Hm87fuwwX//mdyicWsSendtoqL9FTc01\\nnipezJXqC1y/Wj1gHxcvL8edN4o3Xvs5FyrPAvDhscOs3/RpFi5ayumTx7l8sRIAq9XK+TMn2bXj\\nLQBOHIeMjCymz5iDzW4nFPssIiLDnWp0RUQegpSUVAomFXL5YiU2u52U1FRSUlNxuVxUnT9DenoG\\nY8dOiB8fDAaora1JOMdPfvwDfv3Lnya0paWl4/N5sTsc99Wf6UWzaWyojye53Q7sey++v7feo80A\\n9XW1WK3WIbvhTkTkQWhEV0TkIcjOdQPwdMlyni5ZPuAxmVnZEBvA9XZ1QaxOtlskEmHM2AnMmjMf\\nd94ocnPdpKVnANDS4rmv/mRl51J9qapfe2dHO15vF5l95tvt6upM2A6HQwBYLBofEZHHhxJdEZGH\\nwGJEE8KKowf7jaJ2a7hdF/85Ykb67V+38TmKS5ZTd6uGmzeuc+bUcWpuXGP9puejSfJ9MIzB9hnx\\nRLab2SfpFhF5HCnRFRF5CLpHXCORCFerLybsy8sfRVZ27qC1rplZ2RSXLOf0yeNsffO1hH3do7r3\\no7WlGXdefr/2tPQMXK4U2ltb7/ucIiLDnb6DEhH5BEQi0RFQIzZ02tnRTu3NG8ybX0x6Rmb8OIvF\\nwubnPsMLn/ncoGUA3bWwjQ31Ce2F02bgducnvNaMRBLeeyAXq86Rlz+a6TMSa3GXLF8Z3X/h3F0/\\no4jI40YjuiIin4CuruhSu4uXlnP5UiUXq86xc/sW/vTzX+Yv/uqbHD92GK+3k9lz5jNufAF73nt7\\n0DlpGxvqaW1pZumKVdhsNtraWhk7bgLz5hcTDAZxOJy93jtaT7ugeAlp6RmcO/1Rv/MdOrCbollz\\nef6PX+HDisN4mhqYNHkaM2bNpfLc6QHrd0VEHndKdEVEPgHnznzEjJlzmfdUMRMnTeFi1Tlu1lzj\\nFz/7EaXl6yhZWorFYsXTdJutb77G6ZPHBz1fOBzm17/8KWvWf4rikuUYhkGzp4md2/+AxWph3cbn\\neWLMOOpu3eRq9UXOnfmIaUWzmDRlGlXnz/Q7n8/r5Rc/+T+UrtrArDnzcblctDR72LXjLY4e3vew\\nfi0iIkPKKCndrDsORERERCTpqEZXRERERJKSEl0RERERSUpKdEVEREQkKSnRFREREZGkpERXRERE\\nRJKSEl0RERERSUpKdEVEREQkKSnRFREREZGkpERXRERERJLS/wforQjp9slZCAAAAABJRU5ErkJg\\ngg==\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7fa9325adbe0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"jtplot.style('onedork', ticks=True, context='talk', fscale=1.5)\\n\",\n    \"acc_fig = plot_runs(df_acc, 'accuracy')\\n\",\n    \"train_fig = plot_runs(df_train, 'training loss')\\n\",\n    \"valid_fig = plot_runs(df_valid, 'validation loss')\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 97,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"html_dir = os.path.join(STATIC, 'assets/plots')\\n\",\n    \"for fname, fig in {'accuracy': acc_fig, 'training': train_fig, 'validation': valid_fig}.items():\\n\",\n    \"    with open(os.path.join(html_dir, fname+'.json'), 'w') as f:\\n\",\n    \"        mpld3.save_json(fig, f)\\n\",\n    \"\\n\",\n    \"with open(os.path.join(html_dir, 'configs.json'), 'w') as f:\\n\",\n    \"    json.dump(f_configs, f)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 76,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"['training.json', 'configs.json', 'accuracy.json', 'validation.json']\"\n      ]\n     },\n     \"execution_count\": 76,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"os.listdir(html_dir)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 77,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'/home/brandon/Documents/DeepChatModels/webpage/deepchat/static/assets/plots'\"\n      ]\n     },\n     \"execution_count\": 77,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"html_dir\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "notebooks/README.md",
    "content": "## Data Processing\n\n### Overview of initial pre-processing\nOur initial method of processing the raw reddit data uses the pandas(pd) library. \nWe start by reading in our different files into a DataFrame(df) and remove extraneous data.\nAfter this we are ready to start cleaning up our data. \n#### Initial Clean\nThe initial clean consists of\n1. Remove commments that are deleted. \n2. Document whether a comment is a root comment. \n3. Replace digits, contractions, links. \n4. Remove large comments. \n\nAfter the initial clean, we generate a word frequency dictionary by tokenizing our comments\nand tracking the word usage. This word frequency is used to provide a 'validity' score for \nour comments. \n\n#### Validity score\n\nThe validity score relies on the word frequncy dictionary and the pyEnchant library. At this\npoint the validity is a function of indpendent word usage only. We keep a penalty score\nwhich increases for words that are not in the pyEnchant english dictionary. The penalty\nis the inverse of the number of occurences of the specific word in all of the processed comments.\n\n### Drawbacks of method\n\nThis method is not very efficient. Specifically the computation of sentence scores is time consuming.\nThe order of operations is being explored and the ability to save progress needs to be added. \n\n### Further Analysis\nA natural question that arises is how much data should be used to generate the word dictionaries. \nDue to the size of the files, we will probably need to modularize this as much as possible.\n\n\n## Using sqlite \n"
  },
  {
    "path": "notebooks/RedditPipelineAndVisualization.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Reddit Preprocessing in Stages\\n\",\n    \"\\n\",\n    \"This notebook is essentially the `reddit_preprocessor.py` file in the data package, but split into disjoint steps. This is useful for both development and visualization, e.g. you can save the data at each stage of the processing pipeline and resume later, rather than requiring a restart from beginning.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import os\\n\",\n    \"import sys\\n\",\n    \"sys.path.append('..')\\n\",\n    \"from imp import reload\\n\",\n    \"\\n\",\n    \"from data import reddit_preprocessor, DataHelper\\n\",\n    \"from data.reddit_preprocessor import *\\n\",\n    \"\\n\",\n    \"import json\\n\",\n    \"import pandas as pd\\n\",\n    \"from pprint import pprint\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Using logfile: /tmp/data_helper_1xuld5d\\n\",\n      \"Hi, I'm a DataHelper. For now, I help with the reddit dataset.\\n\",\n      \"At any prompt, press ENTER if you want the default value.\\n\",\n      \"Username (default='brandon'): \\n\",\n      \"Hello, brandon, I've set your data root to /home/brandon/Datasets/reddit\\n\",\n      \"Years to process (default='2007,2008,2009'): \\n\",\n      \"These are the files I found:\\n\",\n      \"['/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-11',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-12',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-10',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-12',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-07',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-08',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-03',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-06',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-05',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-09',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-01',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-11',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-10',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-02',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-04',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-01',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-03',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-10',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-05',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-02',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-12',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-06',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-08',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-11',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-07',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-04',\\n\",\n      \" '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-09']\\n\",\n      \"\\n\",\n      \"Maximum memory to use (in GiB) (default='2.00'): 10.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"data_helper = DataHelper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Playing with the Raw Data\\n\",\n    \"Use data helper to load the uncompressed data into a pandas DataFrame.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Loading year: 2008\\n\",\n      \"Returning data from file:\\n\",\n      \" /home/brandon/Datasets/reddit/raw_data/2008/RC_2008-11\\n\",\n      \"Loading year: 2009\\n\",\n      \"Returning data from file:\\n\",\n      \" /home/brandon/Datasets/reddit/raw_data/2009/RC_2009-08\\n\",\n      \"Loading year: 2010\\n\",\n      \"Returning data from file:\\n\",\n      \" /home/brandon/Datasets/reddit/raw_data/2010/RC_2010-03\\n\",\n      \"Done!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"data = {}\\n\",\n    \"years = list(range(2008, 2010 + 1))\\n\",\n    \"for year in range(2008, 2010 + 1):\\n\",\n    \"    print('Loading year:', year)\\n\",\n    \"    data[str(year)] = data_helper.load_random(year=year)\\n\",\n    \"print('Done!')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Remove entries with the comment as \\\"deleted\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 26,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"years = list(range(2008, 2010 + 1))\\n\",\n    \"for year in years:\\n\",\n    \"    df = data[str(year)]\\n\",\n    \"    data[str(year)] = df.loc[df.body != '[deleted]'].reset_index(drop=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[(-1.0, 15.0), (-1.0, 15.0), (0.0, 13.0)]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"jtplot.style('onedork', ticks=True, fscale=1.5)\\n\",\n    \"jtplot.figsize(x=11., y=8.)\\n\",\n    \"\\n\",\n    \"# Plot the inner 90 of data for 'score'. \\n\",\n    \"years = ['2008', '2009', '2010']\\n\",\n    \"score_ranges = [tuple(data[y].score.quantile([0.05, .95])) for y in years]\\n\",\n    \"print(score_ranges)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import pandas as pd\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"%matplotlib inline\\n\",\n    \"\\n\",\n    \"from jupyterthemes import jtplot\\n\",\n    \"jtplot.style('monokai')\\n\",\n    \"# set \\\"context\\\" (paper, notebook, talk, or poster)\\n\",\n    \"# & font scale (scalar applied to labels, legend, etc.)\\n\",\n    \"jtplot.style(ticks=True, grid=False)\\n\",\n    \"jtplot.figsize(x=10, y=8)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 29,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Loading year: 2008\\n\",\n      \"Loading year: 2009\\n\",\n      \"Loading year: 2010\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# [Optional] cut down size of data.\\n\",\n    \"percent_keep = 0.9\\n\",\n    \"for year in range(2008, 2010 + 1):\\n\",\n    \"    print('Loading year:', year)\\n\",\n    \"    num_keep = int(percent_keep * len(data[str(year)].index))\\n\",\n    \"    data[str(year)] = data[str(year)].loc[:num_keep]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 30,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"Index(['archived', 'author', 'author_flair_css_class', 'author_flair_text',\\n\",\n       \"       'body', 'controversiality', 'created_utc', 'distinguished', 'downs',\\n\",\n       \"       'edited', 'gilded', 'id', 'link_id', 'name', 'parent_id',\\n\",\n       \"       'removal_reason', 'retrieved_on', 'score', 'score_hidden', 'subreddit',\\n\",\n       \"       'subreddit_id', 'ups'],\\n\",\n       \"      dtype='object')\"\n      ]\n     },\n     \"execution_count\": 30,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df_small.columns\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Visualization: Comment Scores\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 31,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[(-1.0, 15.0), (-1.0, 15.0), (0.0, 13.0)]\\n\",\n      \"sr: [-1.0, 15.0]\\n\",\n      \"nb: 17\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:1742: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\\n\",\n      \"  warnings.warn(\\\"This figure includes Axes that are not \\\"\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAwIAAAIqCAYAAACXNP1XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd0VPe99/vPzEgz6p1eBaKYjpCEQEhUiWobTBw7dlyS\\n2Kkn5Zw8Zz2nPOu5Wc+9J7n3tDjnnFSfxE7cbZwYg+lFIBBF9CZAQgUhIYQqqjPSzNw/JMYMKiCN\\nxBjm/VorAX67ffdX47Xmo71/exvmpq12CgAAAIBPMXq7AAAAAAAPHkEAAAAA8EEEAQAAAMAHEQQA\\nAAAAH0QQAAAAAHwQQQAAAADwQaaRYyb+xNtFAPBtZrNFc5JSlLHqSS1JX62UtGWaOHmqZDCovLzM\\n2+V5XURklFpamu+5nsUSoNRF6Vq+ep2WpK9RcspCxU2cIpPRpBvlpQ+gUu/w9/fXd374d7peWqJb\\nt2qVuihdX335O/LzN6uoIK/Lbf7hJ/+i8IgoXb54/gFX23ff/dHfa+LkaTp76pgk6fmXv63URenK\\nOXzggdVw9zFT0pYqKTlVuedPP7AaAPQfrggA8Kqo6EH62jd/oMXLVqriRrn27d6m/Xu3q62tTase\\n/5KeWPest0v0qpS0pXr2hVfvuZ7ZYtGL3/ie4hPn6UreRe3a9qkO7NulVptVKx9fr3VPf/UBVOsd\\nqYsyVHHjuq6VFLmNJyWnatDgId4p6gE4uH+3dm371Ks1HD2cpVGjYzV+wmSv1gGgb/y8XQAA32Xy\\n89PTX3lZgUHB+sPv/kM3b1x3LTt6aL+Wr1qnOUnzVVZ6VceOHPRipd4zdtwEGY33/p1NQlKKBg0e\\nqt//9jXduP75b//v7OO4uEkqyL80kOU+cBGRUUpMTtXbb/y60zKTyaQVa9brrT/8yguVDbzurnY8\\nSK02m3KOHFD6iid0Jf+S5OQdpcDDhCsCALxmTuJ8RccM1q7tm9xCwG27d2xSc3OT4hPmeaG6h8uI\\nUWPU1NToFgJuO3o4S5I0ctSYB13WgEtIStGtulqVXivutOzyxfMaNTpWM2cneqEy33H6ZI4iIqM1\\nYeJj3i4FQC9xRQCA10yZNlNWa4sunD3Z5fK2tja9+fp/qq6uxm181OhYLViUrhEjR0uSykpLlJW5\\nQyXFha51vvujv1f+5VzdKC9TcsoihYVF6GZFubZv+Ytu1dUqY+WTGhc3STarVWdOH9O+Pdtdv838\\nh5/8i/bs/EwGg0HxifMUFBSssmtXtWXTBhkMBmWsXKuRo2PV1Nigo4f3d7paMX1WghLnLlDMoMGy\\nWa3Kz7uovbu2qLGhXpIUHhGp7/3oH/Tpn99TdMwgTZ+VoKCgYN0ov67MXVtUXHTFdQ4REVGumrIy\\ndygrc2eXvbJZrQoKCtbkKdN18cJZt2U11ZX6f//vv5PDbncbHz5ilBYsStfIUWPlcDhUdu2q9u7a\\nopsV5b3udeGVPBkMBk2dPlvNzY36/W9+ruamJo0YOUZpizM0vGP70mtXtW/PNl0vLXFtHxAQqGUr\\nntCY2PEKDg5V/a065Z4/rax9O2Vva+vyfCXJz89PM2Yn6vTJnC6X79u7XcNGjNTi9NW6fOm8mpua\\nut2XJA0aPFRpS5ZrzNjxMpn8VHGjTIcO7HWbR/D8y99WW1ubystKlJicqtbWVr37x98qY9Va2WxW\\nnTp+VGmLMxQdM0g11VXavWOzrl0t0tKMNZo8dYYcDocu5Z7Vrm2fqu2Oc5udkKyZsxMVHTNYJpNJ\\ndbU1On0yR4cPZnZb7/Mvf1vhEZH61Ws/c32munPnZydm0GAtXLJSY2LHy2Qyqfx6mQ7s26nCK5fd\\nthk7boLSFmdo8JDhamyoV3bW7i733VB/S6XXijUnKUV5ly702GMAXyxMFgbgNctXP6Wy0hKd6eaL\\nnCS1NDfJecftBhMmTdEzX31FTqdTOYezdLW4QGNi45Q4d4EqbpSpuuqmJCkxOVUxg4ZobGycTuQc\\nUklxgSY9Nk0TJ03VlGkz1djYoJPHDysoKFgzZyeqtqZKFR1XJVIXZSh60GANGjREOUcO6OaNck2Z\\nPltjYuMUnzhPZaUlOnvquKJjBmtW/FwVF15xhZUFC9OVsfJJlVwt1Mljh1VdXanpM+do2ox4nTtz\\nQm2trQoICFRScqqGDhupyKgYHTuarZLiQsVNfEwzZifo5LHDamtrVV1tjQYPGSZJ2rL5YxUXFaip\\nsaHLPlmtLZo2Y7amTJulcXGTFRwcIrvDrob6W5Lk1kOp/Qv+8y9/W37+/jp25KCKCvM0YdIUzZ6T\\nrNzzp2VtaelVr0eMHC2DwahDWXtUXVWpgvxLGjtugp578VW1tDTr2JEDulZSrDFjxytpXqquFhXo\\nVl2tJOnpr3xNo8eO04mcQ8o9f1oOh0OJyQsUHByi/Mu53X42Ro8dr9lzkrV/zzbV1la7xseMHa8x\\n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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f841fe15dd8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"jtplot.style('onedork', ticks=True, fscale=1.5)\\n\",\n    \"jtplot.figsize(x=11., y=8.)\\n\",\n    \"\\n\",\n    \"# Plot the inner 90 of data for 'score'. \\n\",\n    \"years = ['2008', '2009', '2010']\\n\",\n    \"score_ranges = [tuple(data[y].score.quantile([0.05, .95])) for y in years]\\n\",\n    \"print(score_ranges)\\n\",\n    \"\\n\",\n    \"# Pick the widest range to fit all data in plot.\\n\",\n    \"from operator import itemgetter\\n\",\n    \"score_range = [min(score_ranges, key=itemgetter(0))[0],\\n\",\n    \"               max(score_ranges, key=itemgetter(1))[1]]\\n\",\n    \"print('sr:', score_range)\\n\",\n    \"num_bins = int(score_range[1] - score_range[0] + 1)\\n\",\n    \"print('nb:', num_bins)\\n\",\n    \"\\n\",\n    \"score_data = [data[y].score for y in years]\\n\",\n    \"plt.hist(score_data,\\n\",\n    \"         bins=num_bins,\\n\",\n    \"         normed=True,\\n\",\n    \"         align='left',\\n\",\n    \"         label=years,\\n\",\n    \"         range=score_range)\\n\",\n    \"\\n\",\n    \"plt.title('Comment Scores (Normalized)')\\n\",\n    \"plt.xlabel('Score')\\n\",\n    \"plt.ylabel('Counts')\\n\",\n    \"plt.legend()\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Visualization: Word Distributions\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from nltk import word_tokenize\\n\",\n    \"from collections import Counter\\n\",\n    \"from itertools import chain\\n\",\n    \"\\n\",\n    \"jtplot.style('onedork', ticks=True, fscale=1.5)\\n\",\n    \"jtplot.figsize(x=11., y=8.)\\n\",\n    \"\\n\",\n    \"#$word_tokenize(data['2008'].loc[0, 'body'])\\n\",\n    \"pd.set_option('display.max_colwidth', 1000)\\n\",\n    \"#pd.DataFrame(data['2008']['body']).head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from nltk import FreqDist\\n\",\n    \"\\n\",\n    \"wt = Counter(chain.from_iterable(data['2008']['body']))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 64,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Time to run parallel_map_list: 13.947 seconds.\\n\",\n      \"DONE\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"tokenized = parallel_map_list(fn=DataHelper.word_tokenizer, \\n\",\n    \"                              iterable=data['2008'].body.values)\\n\",\n    \"print('DONE')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data_helper.set_word_freq(Counter(chain.from_iterable(tokenized)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 74,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"most_comm = data_helper.word_freq.most_common(20)\\n\",\n    \"words, counts = zip(*most_comm)\\n\",\n    \"\\n\",\n    \"x_labels = words\\n\",\n    \"counts_series = pd.Series.from_array(counts)\\n\",\n    \"\\n\",\n    \"plt.figure(figsize=(16, 10))\\n\",\n    \"ax = counts_series.plot(kind='bar')\\n\",\n    \"ax.set_title('Most Common Words 2008')\\n\",\n    \"ax.set_ylabel('Counts')\\n\",\n    \"ax.set_xlabel('Words')\\n\",\n    \"ax.set_xticklabels(x_labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Preprocessing\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"PROJECT_ROOT = '/home/brandon/Documents/DeepChatModels'\\n\",\n    \"REDDIT_DIR = '/home/brandon/Datasets/reddit'\\n\",\n    \"SOURCE_DIR = os.path.join(REDDIT_DIR, 'raw_data')\\n\",\n    \"TARGET_DIR = os.path.join(REDDIT_DIR, 'raw_data_columns_removed')\\n\",\n    \"YEAR = '2009'\\n\",\n    \"TARGET_FILE = os.path.join(TARGET_DIR, YEAR + '_cols_removed.json')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data_helper = DataHelper()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"data_helper.file_counter = 9\\n\",\n    \"print(data_helper.file_paths[data_helper.file_counter:])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Load 2007 Data in DF\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df = data_helper.safe_load()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(\\\"df has {} rows.\\\".format(len(df.index)))\\n\",\n    \"print(\\\"df has columns:\\\\n\\\", df.columns)\\n\",\n    \"df.body.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df = remove_extra_columns(df)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"print(\\\"df has {} rows.\\\".format(len(df.index)))\\n\",\n    \"print(\\\"df has columns:\\\\n\\\", df.columns)\\n\",\n    \"df.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## In One Function\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def remove_extra_columns_and_save()\\n\",\n    \"    print(\\\"Removing extra columns . . . \\\")\\n\",\n    \"    df = remove_extra_columns(df)\\n\",\n    \"    print(\\\"Saving to {} . . . \\\".format(TARGET_FILE))\\n\",\n    \"    DataHelper.df_to_json(\\n\",\n    \"        df, \\n\",\n    \"        orient='records', \\n\",\n    \"        lines=False, \\n\",\n    \"        target_file=TARGET_FILE)\\n\",\n    \"    print(\\\"Done!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Loading back later\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df_loaded = pd.read_json(target_file)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"len(df_loaded)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"file_names = []\\n\",\n    \"for y in ['2007', '2008', '2009']:\\n\",\n    \"    file_names.append(y + '_cols_removed.json')\\n\",\n    \"file_names = file_names[:-1]\\n\",\n    \"#file_names[-1] = '2009_cols_removed_part_1.json'\\n\",\n    \"#file_names.append('2009_cols_removed_part_2.json')\\n\",\n    \"file_names = [os.path.join(TARGET_DIR, fname) for fname in file_names]\\n\",\n    \"pprint(file_names)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"list_ = []\\n\",\n    \"for file_path in file_names:\\n\",\n    \"    print('file:', file_path)\\n\",\n    \"    sys.stdout.flush()\\n\",\n    \"    list_.append(pd.read_json(file_path))\\n\",\n    \"df = pd.concat(list_).reset_index()\\n\",\n    \"del list_\\n\",\n    \"list_ = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_cols_removed.json')\\n\",\n    \"DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Stage 2: Regex, Long Comments, and Contractions\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Regex\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"DataFrame loaded.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"TARGET_FILE = os.path.join(TARGET_DIR, YEAR+'_cols_removed_part_1.json')\\n\",\n    \"df = pd.read_json(TARGET_FILE)\\n\",\n    \"print('DataFrame loaded.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Time to run regex_replacements: 583.041 seconds.\\n\",\n      \"Regex replacements done.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from data.reddit_preprocessor import regex_replacements\\n\",\n    \"df = regex_replacements(df)\\n\",\n    \"print('Regex replacements done.')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_regex_replaced.json')\\n\",\n    \"DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Long Comments\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_regex_replaced.json')\\n\",\n    \"df = pd.read_json(TARGET_FILE)\\n\",\n    \"print('DataFrame loaded from', TARGET_FILE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"reload(data)\\n\",\n    \"from data.reddit_preprocessor import remove_large_comments, expand_contractions\\n\",\n    \"df = remove_large_comments(df=df, max_len=20)\\n\",\n    \"df = expand_contractions(df)\\n\",\n    \"print('Remove large comments and contractions done.')\\n\",\n    \"\\n\",\n    \"TARGET_FILE = os.path.join(TARGET_DIR, YEAR+'_large_comments_contractions.json')\\n\",\n    \"DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)\\n\",\n    \"\\n\",\n    \"print('done')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Stage 3: Parallel Calls\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"DataFrame loaded from /home/brandon/Datasets/reddit/raw_data_columns_removed/2007-8_large_comments_contractions.json\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from data.reddit_preprocessor import parallel_map_list\\n\",\n    \"from data.reddit_preprocessor import data_helper\\n\",\n    \"TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_large_comments_contractions.json')\\n\",\n    \"df = pd.read_json(TARGET_FILE)\\n\",\n    \"print('DataFrame loaded from', TARGET_FILE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Time to run parallel_map_list: 19.272 seconds.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from collections import Counter\\n\",\n    \"from itertools import chain\\n\",\n    \"sentences = parallel_map_list(fn=DataHelper.word_tokenizer, iterable=df.body.values)\\n\",\n    \"data_helper.set_word_freq(Counter(chain.from_iterable(sentences)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Time to run parallel_map_list: 215.748 seconds.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from data.reddit_preprocessor import sentence_score\\n\",\n    \"df['score'] = parallel_map_list(fn=sentence_score, iterable=sentences)\\n\",\n    \"del sentences\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\nAgECgQAXLlwgPT0dgJycnFBonjx5kvvuu4/4+HgiIiJwuVyhOo/Hg8vlIiIigvj4eFJTUzl58mT4\\nVy0iIpPGqJ7RdXR0cOzYMR58sH9X/g8++IC8vDzWr18/KHh8Ph92uz30u8PhwOfz3bR84BiHw/GV\\ndX6/f9BxCQkJeL3e0XRdREQmqRF/Tc/Vq1d54YUXyM/PZ968ecTHx3Po0CFmzJjBhx9+yHPPPcfr\\nr79OYmIilmV95TluVj6ccI/bs2cPFRUVg8pmx85hpWttWOcTEZGJZ0RBd/36dYqKirj77rt57LHH\\nAJgxY0aofuHChdx77728//77JCYmhmZjSUlJQP+CFrvdjmVZg257DpQD2O123n///UF18fHxobob\\nj2tvb+eee+4Ztt8FBQUUFBQMKvP6LrG/unEkly0iIgYY0a3Ln//850RHR7Np06ZQ2aeffhqaafl8\\nPv785z8zf/58ADIzM3nzzTcBOHHiBImJicTGxhIXF8fcuXM5ceIEAHV1dWRmZgKQlpbGqVOn8Pv9\\nBINBDh48iNPpBMDpdNLY2EgwGMTv9/POO++QlpY2RkMgIiImG3ZG9+6771JXV8eCBQvIy8sDIDs7\\nmylTpvD73/+eiIgILMvi+eefJzk5GYDHH3+cLVu24Ha7mT59Otu2bQudr6ioiJdffplXXnmFu+66\\ni9LSUgBmzpzJxo0beeqpp7AsC6fTydKlSwFYunQpzc3N5ObmYrPZ2LhxIzNnzhzzwRAREfPYrHAf\\ngE1QA7cu1+W5cNjjwjrH9zb9cUSve7v8wbDOLyIiXxbu57d2RhEREaMp6ERExGgKOhERMZqCTkRE\\njKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERE\\nxGgKOhERMZqCTkREjKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoEXe6Ayb73qY/\\nDvr97fIH71BPREQmL83oRETEaMMGndfr5cc//jGrV6/m4YcfZufOnViWBUBlZSVutxu3201lZWXo\\nmGAwSHFxMW63m9WrV9PS0hKq8/v9rF+/nuzsbNavX4/f7w/VtbS0sHr1atxuN8XFxQSDwVDdzdoS\\nEREZyrBBN3XqVAoLC6mtraW6upo//elPeDwezp8/T3V1NVVVVVRVVVFdXc3HH38MQENDAz09PTQ0\\nNLBjxw5KSkro6+sDYNeuXWRlZVFfX09WVha7d+8GoK+vj5KSEnbs2BE6vrGxEWDItkRERIYybNDN\\nmTOHxYsXAzBt2jRSUlLw+Xw0NTWxfPlyoqOjiY6OZtmyZTQ1NQHg8XjIzc0FICUlhdmzZ3PmzBkA\\njh8/jsvlAsDlcnHs2DEATp8+TWxsLCkpKQDk5OTg8XgAhmxLRERkKKN6RtfR0cGxY8d48MEH8fl8\\n2O32UJ3D4cDr9QL9tydvrEtISMDr9dLR0UFkZCRRUVEAREVFERkZSUdHBz6fD4fDMeh8Pp8PYMi2\\nREREhjLiVZdXr17lhRdeID8/n3nz5g352oFneCMtH64uXHv27KGiomJQ2ezYOax0rR3ztkREZHwa\\nUdBdv36doqIi7r77bh577DEA7HZ7aMYF/YtWBmZdA3UDgdje3o7dbicmJobe3l56enqIioqip6eH\\n3t5eYmJivjRL83q9xMfHD9vWUAoKCigoKBhU5vVdYn9140guW0REDDCiW5c///nPiY6OZtOmTaGy\\nzMxMjhw5Qnd3N93d3Rw9epTMzEwAnE4ndXV1ALS1tREIBFi8eDE2m42MjIzQIpPGxkYyMjIAWLRo\\nEZcuXaKtrQ2A+vp6nE7nsG2JiIgMZdgZ3bvvvktdXR0LFiwgLy8PgOzsbPLz81mzZk2oLC8vj6Sk\\nJKB/kUlraysul4tp06ZRUlLClCn9mVpYWEhRURH79+8nLi6O7du3A/2rO4uLi9m8eTPXrl1jyZIl\\noUUrSUlJN21LRERkKDbrdjwcG8cGbl2uy3PhsMeFdY4v7ngyUtoZRUQkfOF+fmtnFBERMZqCTkRE\\njKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERE\\nxGgKOhERMZqCTkREjKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoEXe6A5PJ9zb9\\nMfTz2+UP3sGeiIhMHprRiYiI0RR0IiJitBEFXWlpKStWrCA1NTVU1tLSQlpaGo8++iiPPvoo//RP\\n/xSq6+rqYsOGDbjdbvLz8zl79myo7uzZs6xduxa3282GDRvo7u4O1R0+fJjs7Gzcbje7d+8e1Idd\\nu3bhdrvJzs7m8OHDYV+wiIhMLiMKuqysLKqqqr5UvmjRImpqaqipqeGXv/xlqHzfvn0kJyfT0NDA\\n008/TVlZWaiutLSUZ555hoaGBpKTk3njjTcAuHLlCuXl5ezdu5fa2lpOnTrFW2+9BUBzczOtra3U\\n1tayd+9eysvL6erqupXrFhGRSWJEQXf//fcTGxs74pN6PB5yc3MBSE9P55NPPiEQCBAIBLhw4QLp\\n6ekA5OTk4PF4ADh58iT33Xcf8fHxRERE4HK5QnUejweXy0VERATx8fGkpqZy8uTJUV2oiIhMTrf0\\njO6DDz4gLy+P9evXDwoen8+H3W4P/e5wOPD5fDctHzjG4XB8ZZ3f7x90XEJCAl6v91a6LiIik0TY\\nf15wzz33cOjQIWbMmMGHH37Ic889x+uvv05iYiKWZX3lMTcrH064x+3Zs4eKiopBZbNj57DStTas\\n84mIyMQTdtDNmDEj9PPChQu59957ef/990lMTAzNxpKSkgDwer3Y7XYsywrN0m4sB7Db7bz//vuD\\n6uLj40N1Nx7X3t7OPffcM2wfCwoKKCgoGFTm9V1if3VjGFcsIiITUdi3Lj/99NPQTMvn8/HnP/+Z\\n+fPnA5CZmcmbb74JwIkTJ0hMTCQ2Npa4uDjmzp3LiRMnAKirqyMzMxOAtLQ0Tp06hd/vJxgMcvDg\\nQZxOJwBOp5PGxkaCwSB+v5933nmHtLS08K9aREQmjRHN6H7605+GnsE99NBDpKWlcffdd/P73/+e\\niIgILMvi+eefJzk5GYDHH3+cLVu24Ha7mT59Otu2bQudq6ioiJdffplXXnmFu+66i9LSUgBmzpzJ\\nxo0beeqpp7AsC6fTydKlSwFYunQpzc3N5ObmYrPZ2LhxIzNnzhzTgRARETPZrHAfgE1QA7cu1+W5\\ncNjjwjrHjVt5hUtbgImIjE64n9/aGUVERIymoBMREaMp6ERExGgKOhERMZqCTkREjKagExERoyno\\nRETEaAo6ERExmoJORESMFvamznJrvri7inZKERG5PTSjExERoynoRETEaAo6ERExmoJORESMpqAT\\nERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERExGgKOhERMZqCTkREjKZNnceJGzd51gbPIiJj\\nZ9gZXWlpKStWrCA1NXVQeWVlJW63G7fbTWVlZag8GAxSXFyM2+1m9erVtLS0hOr8fj/r168nOzub\\n9evX4/f7Q3UtLS2sXr0at9tNcXExwWBw2LZERESGM2zQZWVlUVVVNajs/PnzVFdXU1VVRVVVFdXV\\n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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f734b3c2630>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"from jupyterthemes import jtplot\\n\",\n    \"jtplot.style('onedork')\\n\",\n    \"jtplot.style(ticks=True, grid=False)\\n\",\n    \"jtplot.figsize(aspect=1.2)\\n\",\n    \"plt.hist(df['score'].values, bins=100,\\n\",\n    \"        range=(0., df['score'].quantile(0.7)))\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Final Stage\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 25,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Prepping for the grand finale.\\n\",\n      \"Time to run children_dict: 4.701 seconds.\\n\",\n      \"Final processed file has 306164 samples total.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Keep the desired percentage of lowest-scored sentences. (low == good)\\n\",\n    \"from data.reddit_preprocessor import children_dict\\n\",\n    \"keep_best_percent = 0.7\\n\",\n    \"df = df.loc[df['score'] < df['score'].quantile(keep_best_percent)]\\n\",\n    \"\\n\",\n    \"print('Prepping for the grand finale.')\\n\",\n    \"comments_dict = pd.Series(df.body.values, index=df.name).to_dict()\\n\",\n    \"root_to_children = children_dict(df)\\n\",\n    \"data_helper.generate_files(\\n\",\n    \"            from_file_path=\\\"from_file.txt\\\",\\n\",\n    \"            to_file_path=\\\"to_file.txt\\\",\\n\",\n    \"            root_to_children=root_to_children,\\n\",\n    \"            comments_dict=comments_dict)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Exploration\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df.style.set_properties(subset=['text'], **{'width': '800px'})\\n\",\n    \"def get_comments(df, n=10):\\n\",\n    \"    i = 0\\n\",\n    \"    while i < len(df.index):\\n\",\n    \"        yield df.loc[i:i+n]['body']\\n\",\n    \"        i += n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"gen = get_comments(df, 5)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"comments = next(gen)\\n\",\n    \"for comment in comments:\\n\",\n    \"    print(comment)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "notebooks/TensorFlow Notes.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"heading_collapsed\": true\n   },\n   \"source\": [\n    \"# TensorBoard Usage -- Updated\\n\",\n    \"\\n\",\n    \"Looks like I need to relearn Tensorboard since my old code is all deprecated :/\\n\",\n    \"Tutorial link: [link](https://www.tensorflow.org/get_started/summaries_and_tensorboard)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"1. Create the TensorFlow graph that you'd like to collect summary data from, and decide which nodes you would like to annotate with summary operations.\\n\",\n    \"```python\\n\",\n    \"def variable_summaries(var):\\n\",\n    \"  \\\"\\\"\\\"Attach a lot of summaries to a Tensor (for TensorBoard visualization).\\\"\\\"\\\"\\n\",\n    \"  with tf.name_scope('summaries'):\\n\",\n    \"    mean = tf.reduce_mean(var)\\n\",\n    \"    tf.summary.scalar('mean', mean)\\n\",\n    \"    with tf.name_scope('stddev'):\\n\",\n    \"      stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))\\n\",\n    \"    tf.summary.scalar('stddev', stddev)\\n\",\n    \"    tf.summary.scalar('max', tf.reduce_max(var))\\n\",\n    \"    tf.summary.scalar('min', tf.reduce_min(var))\\n\",\n    \"    tf.summary.histogram('histogram', var)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"2. To generate summaries, we need to run all of these summary nodes. Combine them into a single op that generates all the summary data.\\n\",\n    \"```python\\n\",\n    \"merged = tf.summary.merge_all()\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"3. Run the merged summary op, which will generate a serialized Summary protobuf object with all of your summary data at a given step. Finally, to write this summary data to disk, pass the summary protobuf to a tf.summary.FileWriter.\\n\",\n    \"```python\\n\",\n    \"train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',\\n\",\n    \"                                      sess.graph)\\n\",\n    \"test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')\\n\",\n    \"tf.global_variables_initializer().run()\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"4. During training . . . \\n\",\n    \"```python\\n\",\n    \"summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))\\n\",\n    \"    test_writer.add_summary(summary, i)\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"5. Launching tensorboard after training. \\n\",\n    \"```\\n\",\n    \"tensorboard --logdir=path/to/log-directory\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"Description of below code (docstring):\\n\",\n    \"\\n\",\n    \"*A simple MNIST classifier which displays summaries in TensorBoard. This is an unimpressive MNIST model, but it is a good example of using tf.name\\\\_scope to make a graph legible in the TensorBoard graph explorer, and of naming summary tags so that they are grouped meaningfully in TensorBoard. It demonstrates the functionality of every TensorBoard dashboard.*\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import argparse\\n\",\n    \"import sys\\n\",\n    \"import tensorflow as tf\\n\",\n    \"from tensorflow.examples.tutorials.mnist import input_data\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def train():\\n\",\n    \"    mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)\\n\",\n    \"\\n\",\n    \"    sess = tf.InteractiveSession()\\n\",\n    \"    # Create a multilayer model.\\n\",\n    \"\\n\",\n    \"    # Input placeholders\\n\",\n    \"    with tf.name_scope('input'):\\n\",\n    \"        x = tf.placeholder(tf.float32, [None, 784], name='x-input')\\n\",\n    \"        y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')\\n\",\n    \"\\n\",\n    \"    with tf.name_scope('input_reshape'):\\n\",\n    \"        image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])\\n\",\n    \"        tf.summary.image('input', image_shaped_input, 10)\\n\",\n    \"\\n\",\n    \"    # We can't initialize these variables to 0 - the network will get stuck.\\n\",\n    \"    def weight_variable(shape):\\n\",\n    \"        \\\"\\\"\\\"Create a weight variable with appropriate initialization.\\\"\\\"\\\"\\n\",\n    \"        initial = tf.truncated_normal(shape, stddev=0.1)\\n\",\n    \"        return tf.Variable(initial)\\n\",\n    \"\\n\",\n    \"    def bias_variable(shape):\\n\",\n    \"        \\\"\\\"\\\"Create a bias variable with appropriate initialization.\\\"\\\"\\\"\\n\",\n    \"        initial = tf.constant(0.1, shape=shape)\\n\",\n    \"        return tf.Variable(initial)\\n\",\n    \"\\n\",\n    \"    def variable_summaries(var):\\n\",\n    \"        \\\"\\\"\\\"Attach a lot of summaries to a Tensor (for TensorBoard visualization).\\\"\\\"\\\"\\n\",\n    \"        with tf.name_scope('summaries'):\\n\",\n    \"            mean = tf.reduce_mean(var)\\n\",\n    \"            tf.summary.scalar('mean', mean)\\n\",\n    \"            with tf.name_scope('stddev'):\\n\",\n    \"                stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))\\n\",\n    \"            tf.summary.scalar('stddev', stddev)\\n\",\n    \"            tf.summary.scalar('max', tf.reduce_max(var))\\n\",\n    \"            tf.summary.scalar('min', tf.reduce_min(var))\\n\",\n    \"            tf.summary.histogram('histogram', var)\\n\",\n    \"\\n\",\n    \"    def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):\\n\",\n    \"        \\\"\\\"\\\"Reusable code for making a simple neural net layer.\\n\",\n    \"\\n\",\n    \"        It does a matrix multiply, bias add, and then uses relu to nonlinearize.\\n\",\n    \"        It also sets up name scoping so that the resultant graph is easy to read,\\n\",\n    \"        and adds a number of summary ops.\\n\",\n    \"        \\\"\\\"\\\"\\n\",\n    \"        # Adding a name scope ensures logical grouping of the layers in the graph.\\n\",\n    \"        with tf.name_scope(layer_name):\\n\",\n    \"            # This Variable will hold the state of the weights for the layer\\n\",\n    \"            with tf.name_scope('weights'):\\n\",\n    \"                weights = weight_variable([input_dim, output_dim])\\n\",\n    \"                variable_summaries(weights)\\n\",\n    \"            with tf.name_scope('biases'):\\n\",\n    \"                biases = bias_variable([output_dim])\\n\",\n    \"                variable_summaries(biases)\\n\",\n    \"            with tf.name_scope('Wx_plus_b'):\\n\",\n    \"                preactivate = tf.matmul(input_tensor, weights) + biases\\n\",\n    \"                tf.summary.histogram('pre_activations', preactivate)\\n\",\n    \"            activations = act(preactivate, name='activation')\\n\",\n    \"            tf.summary.histogram('activations', activations)\\n\",\n    \"            return activations\\n\",\n    \"\\n\",\n    \"    hidden1 = nn_layer(x, 784, 500, 'layer1')\\n\",\n    \"\\n\",\n    \"    with tf.name_scope('dropout'):\\n\",\n    \"        keep_prob = tf.placeholder(tf.float32)\\n\",\n    \"        tf.summary.scalar('dropout_keep_probability', keep_prob)\\n\",\n    \"        dropped = tf.nn.dropout(hidden1, keep_prob)\\n\",\n    \"\\n\",\n    \"    # Do not apply softmax activation yet, see below.\\n\",\n    \"    y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)\\n\",\n    \"\\n\",\n    \"    with tf.name_scope('cross_entropy'):\\n\",\n    \"        # The raw formulation of cross-entropy,\\n\",\n    \"        #\\n\",\n    \"        # tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.softmax(y)),\\n\",\n    \"        #                               reduction_indices=[1]))\\n\",\n    \"        #\\n\",\n    \"        # can be numerically unstable.\\n\",\n    \"        #\\n\",\n    \"        # So here we use tf.nn.softmax_cross_entropy_with_logits on the\\n\",\n    \"        # raw outputs of the nn_layer above, and then average across\\n\",\n    \"        # the batch.\\n\",\n    \"        diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)\\n\",\n    \"        with tf.name_scope('total'):\\n\",\n    \"            cross_entropy = tf.reduce_mean(diff)\\n\",\n    \"    tf.summary.scalar('cross_entropy', cross_entropy)\\n\",\n    \"\\n\",\n    \"    with tf.name_scope('train'):\\n\",\n    \"        train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(cross_entropy)\\n\",\n    \"\\n\",\n    \"    with tf.name_scope('accuracy'):\\n\",\n    \"        with tf.name_scope('correct_prediction'):\\n\",\n    \"            correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))\\n\",\n    \"        with tf.name_scope('accuracy'):\\n\",\n    \"            accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\\n\",\n    \"    tf.summary.scalar('accuracy', accuracy)\\n\",\n    \"\\n\",\n    \"    # Merge all the summaries and write them out to /tmp/tensorflow/mnist/logs/mnist_with_summaries (by default)\\n\",\n    \"    merged = tf.summary.merge_all()\\n\",\n    \"    train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)\\n\",\n    \"    test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/test')\\n\",\n    \"    tf.global_variables_initializer().run()\\n\",\n    \"\\n\",\n    \"    # Train the model, and also write summaries.\\n\",\n    \"    # Every 10th step, measure test-set accuracy, and write test summaries\\n\",\n    \"    # All other steps, run train_step on training data, & add training summaries\\n\",\n    \"\\n\",\n    \"    def feed_dict(train):\\n\",\n    \"        \\\"\\\"\\\"Make a TensorFlow feed_dict: maps data onto Tensor placeholders.\\\"\\\"\\\"\\n\",\n    \"        if train or FLAGS.fake_data:\\n\",\n    \"            xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)\\n\",\n    \"            k = FLAGS.dropout\\n\",\n    \"        else:\\n\",\n    \"            xs, ys = mnist.test.images, mnist.test.labels\\n\",\n    \"            k = 1.0\\n\",\n    \"        return {x: xs, y_: ys, keep_prob: k}\\n\",\n    \"\\n\",\n    \"    for i in range(FLAGS.max_steps):\\n\",\n    \"        if i % 10 == 0:  # Record summaries and test-set accuracy\\n\",\n    \"            summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))\\n\",\n    \"            test_writer.add_summary(summary, i)\\n\",\n    \"            print('Accuracy at step %s: %s' % (i, acc))\\n\",\n    \"        else:  # Record train set summaries, and train\\n\",\n    \"            if i % 100 == 99:  # Record execution stats\\n\",\n    \"                run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)\\n\",\n    \"                run_metadata = tf.RunMetadata()\\n\",\n    \"                summary, _ = sess.run([merged, train_step],\\n\",\n    \"                                      feed_dict=feed_dict(True),\\n\",\n    \"                                      options=run_options,\\n\",\n    \"                                      run_metadata=run_metadata)\\n\",\n    \"                train_writer.add_run_metadata(run_metadata, 'step%03d' % i)\\n\",\n    \"                train_writer.add_summary(summary, i)\\n\",\n    \"                print('Adding run metadata for', i)\\n\",\n    \"            else:  # Record a summary\\n\",\n    \"                summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))\\n\",\n    \"                train_writer.add_summary(summary, i)\\n\",\n    \"    train_writer.close()\\n\",\n    \"    test_writer.close()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def main(_):\\n\",\n    \"    if tf.gfile.Exists(FLAGS.log_dir):\\n\",\n    \"        tf.gfile.DeleteRecursively(FLAGS.log_dir)\\n\",\n    \"    tf.gfile.MakeDirs(FLAGS.log_dir)\\n\",\n    \"    train()\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    parser = argparse.ArgumentParser()\\n\",\n    \"    parser.add_argument('--fake_data', nargs='?', const=True, type=bool,\\n\",\n    \"              default=False,\\n\",\n    \"              help='If true, uses fake data for unit testing.')\\n\",\n    \"    parser.add_argument('--max_steps', type=int, default=1000,\\n\",\n    \"              help='Number of steps to run trainer.')\\n\",\n    \"    parser.add_argument('--learning_rate', type=float, default=0.001,\\n\",\n    \"              help='Initial learning rate')\\n\",\n    \"    parser.add_argument('--dropout', type=float, default=0.9,\\n\",\n    \"              help='Keep probability for training dropout.')\\n\",\n    \"    parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',\\n\",\n    \"                      help='Directory for storing input data')\\n\",\n    \"    parser.add_argument('--log_dir', type=str, default='/tmp/tensorflow/mnist/logs/mnist_with_summaries',help='Summaries log directory')\\n\",\n    \"    FLAGS, unparsed = parser.parse_known_args()\\n\",\n    \"    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"heading_collapsed\": true\n   },\n   \"source\": [\n    \"# Trying to save the Graph Again\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"[Tutorial Link](https://www.tensorflow.org/programmers_guide/meta_graph)\\n\",\n    \"\\n\",\n    \"In order for a Python object to be serialized to and from MetaGraphDef, the Python class must implement to_proto() and from_proto() methods, and register them with the system using register_proto_function:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"class Variable:\\n\",\n    \"\\n\",\n    \"    def to_proto(self, export_scope=None):\\n\",\n    \"        \\\"\\\"\\\"Converts a `Variable` to a `VariableDef` protocol buffer.\\n\",\n    \"\\n\",\n    \"        Args:\\n\",\n    \"        export_scope: Optional `string`. Name scope to remove.\\n\",\n    \"\\n\",\n    \"        Returns:\\n\",\n    \"        A `VariableDef` protocol buffer, or `None` if the `Variable` is not\\n\",\n    \"        in the specified name scope.\\n\",\n    \"        \\\"\\\"\\\"\\n\",\n    \"        if (export_scope is None or self._variable.name.startswith(export_scope)):\\n\",\n    \"            var_def                  = variable_pb2.VariableDef()\\n\",\n    \"            var_def.variable_name    = ops.strip_name_scope(self._variable.name, export_scope)\\n\",\n    \"            var_def.initializer_name = ops.strip_name_scope(self.initializer.name, export_scope)\\n\",\n    \"            var_def.snapshot_name    = ops.strip_name_scope(self._snapshot.name, export_scope)\\n\",\n    \"            if self._save_slice_info:\\n\",\n    \"                var_def.save_slice_info_def.MergeFrom(self._save_slice_info.to_proto(export_scope=export_scope))\\n\",\n    \"            return var_def\\n\",\n    \"        else:\\n\",\n    \"            return None\\n\",\n    \"\\n\",\n    \"    @staticmethod\\n\",\n    \"    def from_proto(variable_def, import_scope=None):\\n\",\n    \"        \\\"\\\"\\\"Returns a `Variable` object created from `variable_def`.\\\"\\\"\\\"\\n\",\n    \"        return Variable(variable_def=variable_def, import_scope=import_scope)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"ops.register_proto_function(ops.GraphKeys.GLOBAL_VARIABLES,\\n\",\n    \"                            proto_type=variable_pb2.VariableDef,\\n\",\n    \"                            to_proto=Variable.to_proto,\\n\",\n    \"                            from_proto=Variable.from_proto)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"## Exporting a MetaGraph\\n\",\n    \"\\n\",\n    \"The function signature, for reference:\\n\",\n    \"```python\\n\",\n    \"def export_meta_graph(filename=None, collection_list=None, as_text=False):\\n\",\n    \"  \\\"\\\"\\\"Writes `MetaGraphDef` to save_path/filename.\\n\",\n    \"\\n\",\n    \"  Args:\\n\",\n    \"    filename: Optional meta_graph filename including the path.\\n\",\n    \"    collection_list: List of string keys to collect.\\n\",\n    \"    as_text: If `True`, writes the meta_graph as an ASCII proto.\\n\",\n    \"\\n\",\n    \"  Returns:\\n\",\n    \"    A `MetaGraphDef` proto.\\n\",\n    \"  \\\"\\\"\\\"\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"You should store all variables you wanna get letter in ```collection```. Or, if you don't specify one, it will save everything (yeah do that). \\n\",\n    \"\\n\",\n    \"How to export the default running graph:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"logits = tf.matmul(hidden2, weights) + biases\\n\",\n    \"tf.add_to_collection(\\\"logits\\\", logits)\\n\",\n    \"\\n\",\n    \"init_all_op = tf.global_variables_initializer()\\n\",\n    \"\\n\",\n    \"with tf.Session() as sess:\\n\",\n    \"    # Initializes all the variables.\\n\",\n    \"    sess.run(init_all_op)\\n\",\n    \"    # Runs to logit.\\n\",\n    \"    sess.run(logits)\\n\",\n    \"    chatbot.saver.save(sess, 'my-save-dir/my-model-10000')\\n\",\n    \"    # Generates MetaGraphDef.\\n\",\n    \"    chatbot.saver.export_meta_graph('my-save-dir/my-model-10000.meta')\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"## Importing the MetaGraph and Resuming Training\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"#### Case: Import and Extend Graph\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"with tf.Session() as sess:\\n\",\n    \"    new_saver = tf.train.import_meta_graph('my-save-dir/my-model-10000.meta')\\n\",\n    \"    new_saver.restore(sess, 'my-save-dir/my-model-10000')\\n\",\n    \"    \\n\",\n    \"    # Adds loss and train.\\n\",\n    \"    labels = tf.constant(0, tf.int32, shape=[100], name=\\\"labels\\\")\\n\",\n    \"    batch_size = tf.size(labels)\\n\",\n    \"    labels = tf.expand_dims(labels, 1)\\n\",\n    \"    indices = tf.expand_dims(tf.range(0, batch_size), 1)\\n\",\n    \"    concated = tf.concat([indices, labels], 1)\\n\",\n    \"    onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 10]), 1.0, 0.0)\\n\",\n    \"    \\n\",\n    \"    # Getting the logits variable back that we saved.\\n\",\n    \"    logits = tf.get_collection(\\\"logits\\\")[0]\\n\",\n    \"    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=onehot_labels, logits=logits, name=\\\"xentropy\\\")\\n\",\n    \"    loss = tf.reduce_mean(cross_entropy, name=\\\"xentropy_mean\\\")\\n\",\n    \"\\n\",\n    \"    tf.summary.scalar('loss', loss)\\n\",\n    \"    # Creates the gradient descent optimizer with the given learning rate.\\n\",\n    \"    optimizer = tf.train.GradientDescentOptimizer(0.01)\\n\",\n    \"\\n\",\n    \"    # Runs train_op.\\n\",\n    \"    train_op = optimizer.minimize(loss)\\n\",\n    \"    sess.run(train_op)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"#### Case: Retrieve Hyperparameters\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true,\n    \"hidden\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"filename = \\\".\\\".join([tf.latest_checkpoint(train_dir), \\\"meta\\\"])\\n\",\n    \"tf.train.import_meta_graph(filename)\\n\",\n    \"hparams = tf.get_collection(\\\"hparams\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"heading_collapsed\": true\n   },\n   \"source\": [\n    \"# Sharing Variables\\n\",\n    \"\\n\",\n    \"My version of TensorFlow's tutorial by the same name, but in English. The (sub)section names are identical; I compress the content. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"## The Problem\\n\",\n    \"\\n\",\n    \"**Reusing the same model on multiple inputs**: Let's say we make a function ```my_model(inputs)``` that creates a bunch of tf.Variable() objects and returns the final output tensor variable. Each time we call my_model(next_inputs), it is going to create a whole new model with new variables. This bad. \\n\",\n    \"\\n\",\n    \"**How to fix?**: Rather than requiring classes to create a model and manage the variables, TensorFlow provides a *Variable scope* mechanism for sharing named variables while constructing a graph.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"hidden\": true\n   },\n   \"source\": [\n    \"## Variable Scope\\n\",\n    \"\\n\",\n    \"The mechanism consists of 2 main functions:\\n\",\n    \"1. ```tf.get_variable(name, shape, initializer)``` creates or returns a variable with a given name.\\n\",\n    \"2. ```tf.variable_scope(scope_name)``` manages namespaces **for names passed to tf.get_variable()**. \\n\",\n    \"\\n\",\n    \"\\n\",\n    \"__Difference between name scope and variable scope__: [Here is a link](http://stackoverflow.com/questions/35919020/whats-the-difference-of-name-scope-and-a-variable-scope-in-tensorflow) to the best explanation I could find. The following is the main part:\\n\",\n    \"\\n\",\n    \"\\\"However, name scope is ignored by tf.get_variable. We can see that in the following example:\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"with tf.name_scope(\\\"my_scope\\\"):\\n\",\n    \"    v1 = tf.get_variable(\\\"var1\\\", [1], dtype=tf.float32)\\n\",\n    \"    v2 = tf.Variable(1, name=\\\"var2\\\", dtype=tf.float32)\\n\",\n    \"    a = tf.add(v1, v2)\\n\",\n    \"\\n\",\n    \"print(v1.name)  # var1:0\\n\",\n    \"print(v2.name)  # my_scope/var2:0\\n\",\n    \"print(a.name)   # my_scope/Add:0\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"The only way to place a variable accessed using tf.get_variable in a scope is to use variable scope, as in the following example:\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"with tf.variable_scope(\\\"my_scope\\\"):\\n\",\n    \"    v1 = tf.get_variable(\\\"var1\\\", [1], dtype=tf.float32)\\n\",\n    \"    v2 = tf.Variable(1, name=\\\"var2\\\", dtype=tf.float32)\\n\",\n    \"    a = tf.add(v1, v2)\\n\",\n    \"\\n\",\n    \"print(v1.name)  # my_scope/var1:0\\n\",\n    \"print(v2.name)  # my_scope/var2:0\\n\",\n    \"print(a.name)   # my_scope/Add:0\\n\",\n    \"```\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# RNN Documentation\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## RNNCell\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Interface Specifications\\n\",\n    \"\\n\",\n    \"It's extremely helpful to read the [source code for RNNCell](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/rnn_cell_impl.py). Let's see a condensed list of the important methods and descriptions.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\\n\",\n    \"* __\\\\_\\\\_call\\\\_\\\\___: Run this RNN cell on inputs, starting from the given state.\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"def __call__(self, inputs, state, scope=None):\\n\",\n    \"  \\\"\\\"\\\"Args:\\n\",\n    \"      inputs: `2-D` tensor with shape `[batch_size x input_size]`.\\n\",\n    \"      state: if `self.state_size` is an integer, this should be a `2-D Tensor`\\n\",\n    \"        with shape `[batch_size x self.state_size]`.  Otherwise, if\\n\",\n    \"        `self.state_size` is a tuple of integers, this should be a tuple\\n\",\n    \"        with shapes `[batch_size x s] for s in self.state_size`.\\n\",\n    \"      scope: VariableScope for the created subgraph; defaults to class name.\\n\",\n    \"    Returns:\\n\",\n    \"      A pair containing:\\n\",\n    \"      - Output: A `2-D` tensor with shape `[batch_size x self.output_size]`.\\n\",\n    \"      - New state: Either a single `2-D` tensor, or a tuple of tensors matching\\n\",\n    \"        the arity and shapes of `state`.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"* __state\\\\_size and output\\\\_size__:\\n\",\n    \"\\n\",\n    \"```python\\n\",\n    \"  @property\\n\",\n    \"  def state_size(self):\\n\",\n    \"    \\\"\\\"\\\"size(s) of state(s) used by this cell.\\n\",\n    \"    It can be represented by an Integer, a TensorShape or a tuple of Integers\\n\",\n    \"    or TensorShapes.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"  @property\\n\",\n    \"  def output_size(self):\\n\",\n    \"    \\\"\\\"\\\"Integer or TensorShape: size of outputs produced by this cell.\\\"\\\"\\\"\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"* __zero\\\\_state__:\\n\",\n    \"```python\\n\",\n    \"  def zero_state(self, batch_size, dtype):\\n\",\n    \"    \\\"\\\"\\\"Return zero-filled state tensor(s).\\n\",\n    \"    Args:\\n\",\n    \"      batch_size: int, float, or unit Tensor representing the batch size.\\n\",\n    \"      dtype: the data type to use for the state.\\n\",\n    \"    Returns:\\n\",\n    \"      If `state_size` is an int or TensorShape, then the return value is a\\n\",\n    \"      `N-D` tensor of shape `[batch_size x state_size]` filled with zeros.\\n\",\n    \"      If `state_size` is a nested list or tuple, then the return value is\\n\",\n    \"      a nested list or tuple (of the same structure) of `2-D` tensors with\\n\",\n    \"      the shapes `[batch_size x s]` for each s in `state_size`.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    with ops.name_scope(type(self).__name__ + \\\"ZeroState\\\", values=[batch_size]):\\n\",\n    \"      state_size = self.state_size\\n\",\n    \"      return _zero_state_tensors(state_size, batch_size, dtype)\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Decoder Class -- Currently undocumented . . . \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here I'm going to give myself an overview of this strange new set of files in tf.contrib.seq2seq (master branch) that is not on the website. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Basic Decoder\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Miscellaneous\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Review: logits terminology\\n\",\n    \"\\n\",\n    \"1.  Logistic function: \\n\",\n    \"$$\\\\begin{align}\\n\",\n    \"p(X) &= \\\\frac{1}{1 + e^{-\\\\beta^TX}}  \\\\\\\\\\n\",\n    \"&= \\\\frac{e^{ \\\\beta^TX}}{1 + e^{ \\\\beta^TX}}\\n\",\n    \"\\\\end{align}$$\\n\",\n    \"\\n\",\n    \"2. Odds: \\n\",\n    \"$$\\n\",\n    \"\\\\frac{p(X)}{1 - p(X)} = e^{\\\\beta^T X}\\n\",\n    \"$$\\n\",\n    \"\\n\",\n    \"3. log-odds, \\\"logit\\\":\\n\",\n    \"$$\\n\",\n    \"\\\\log\\\\left(\\\\frac{p(X)}{1 - p(X)} \\\\right) = \\\\beta^T X\\n\",\n    \"$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Random Facts\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"* __tf.Variable vs tf.placeholder__: \\\"The difference is that with tf.Variable you have to provide an initial value when you declare it. With tf.placeholder you don't have to provide an initial value and you can specify it at run time with the feed_dict argument inside Session.run\\\" [Source](http://stackoverflow.com/questions/36693740/whats-the-difference-between-tf-placeholder-and-tf-variable)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Embedding (All Related Topics)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"### Embedding Lookup\\n\",\n    \"\\n\",\n    \"Goal: Figure out how embedding lookup works. Ideally i'd like to show, as a toy example, an integer being mapped to its binary string. For example, with embed size of 5\\n\",\n    \"```python\\n\",\n    \"embed([2, 19]) --> [[0, 0, 0, 1, 0], [1, 0, 0, 1, 1]] \\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import tensorflow as tf\\n\",\n    \"import numpy as np\\n\",\n    \"\\n\",\n    \"input_size = (1, 2) # arbitrary\\n\",\n    \"embed_size = 5\\n\",\n    \"vocab_size = 2**embed_size\\n\",\n    \"input_array = np.random.randint(vocab_size, size=input_size)\\n\",\n    \"expected_embedding = ['{0:b}'.format(inp) for inp in input_array.flatten()]\\n\",\n    \"print(\\\"Input array:\\\\n\\\", input_array)\\n\",\n    \"print(\\\"Expected embedding:\\\\n\\\", expected_embedding)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[[[ 0.30149388 -0.099668    0.14693063 -0.39335564  0.34846574]\\n\",\n      \"  [-0.0505532  -0.21680753 -0.3851763  -0.1110653   0.0726169 ]]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"tf.reset_default_graph()\\n\",\n    \"sess = None\\n\",\n    \"with tf.Session() as sess:\\n\",\n    \"    params   = tf.get_variable('embed_tensor', \\n\",\n    \"                               shape=[vocab_size, embed_size], \\n\",\n    \"                               initializer=tf.contrib.layers.xavier_initializer())\\n\",\n    \"    inputs    = tf.convert_to_tensor(input_array)\\n\",\n    \"    embedding = tf.nn.embedding_lookup(params, inputs)\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    sess.run(tf.global_variables_initializer())\\n\",\n    \"    emb = sess.run(embedding)\\n\",\n    \"    print(emb)\\n\",\n    \"\\n\",\n    \"sess = None\\n\",\n    \"tf.reset_default_graph()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Embedding Visualizer\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from __future__ import absolute_import\\n\",\n    \"from __future__ import division\\n\",\n    \"from __future__ import print_function\\n\",\n    \"import argparse\\n\",\n    \"import sys \\n\",\n    \"import os\\n\",\n    \"import numpy as np\\n\",\n    \"from tensorflow.contrib.tensorboard.plugins import projector\\n\",\n    \"import tensorflow as tf\\n\",\n    \"from tensorflow.examples.tutorials.mnist import input_data\\n\",\n    \"FLAGS = None\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def generate_embeddings():\\n\",\n    \"    # Import data\\n\",\n    \"    mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)\\n\",\n    \"    sess = tf.InteractiveSession()\\n\",\n    \"    # Input set for Embedded TensorBoard visualization\\n\",\n    \"    # Performed with cpu to conserve memory and processing power\\n\",\n    \"    with tf.device(\\\"/cpu:0\\\"):\\n\",\n    \"        embedding = tf.Variable(tf.stack(mnist.test.images[:FLAGS.max_steps], axis=0), \\n\",\n    \"                                trainable=False, name='embedding')\\n\",\n    \"    tf.global_variables_initializer().run()\\n\",\n    \"    saver = tf.train.Saver()\\n\",\n    \"    writer = tf.summary.FileWriter(FLAGS.log_dir + '/projector', sess.graph)\\n\",\n    \"    # Add embedding tensorboard visualization. \\n\",\n    \"    config = projector.ProjectorConfig()\\n\",\n    \"    embed= config.embeddings.add()\\n\",\n    \"    embed.tensor_name = 'embedding:0'\\n\",\n    \"    embed.metadata_path = os.path.join(FLAGS.log_dir + '/projector/metadata.tsv')\\n\",\n    \"    embed.sprite.image_path = os.path.join(FLAGS.data_dir + '/mnist_10k_sprite.png')\\n\",\n    \"    # Specify the width and height of a single thumbnail.\\n\",\n    \"    embed.sprite.single_image_dim.extend([28, 28])\\n\",\n    \"    projector.visualize_embeddings(writer, config)\\n\",\n    \"    saver.save(sess, os.path.join(\\n\",\n    \"        FLAGS.log_dir, 'projector/a_model.ckpt'), global_step=FLAGS.max_steps)\\n\",\n    \"\\n\",\n    \"def generate_metadata_file():\\n\",\n    \"    # Import data\\n\",\n    \"    mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)\\n\",\n    \"    def save_metadata(file):\\n\",\n    \"        with open(file, 'w') as f:\\n\",\n    \"            for i in range(FLAGS.max_steps):\\n\",\n    \"                c = np.nonzero(mnist.test.labels[::1])[1:][0][i]\\n\",\n    \"                f.write('{}\\\\n'.format(c))\\n\",\n    \"    save_metadata(FLAGS.log_dir + '/projector/metadata.tsv')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def main(_):\\n\",\n    \"    if tf.gfile.Exists(FLAGS.log_dir + '/projector'):\\n\",\n    \"        tf.gfile.DeleteRecursively(FLAGS.log_dir + '/projector')\\n\",\n    \"        tf.gfile.MkDir(FLAGS.log_dir + '/projector')\\n\",\n    \"    tf.gfile.MakeDirs(FLAGS.log_dir  + '/projector') # fix the directory to be created\\n\",\n    \"    generate_metadata_file()\\n\",\n    \"    generate_embeddings()\\n\",\n    \"\\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    BASE = '/home/brandon/mnist-tensorboard-embeddings/'\\n\",\n    \"    parser = argparse.ArgumentParser()\\n\",\n    \"    parser.add_argument('--fake_data', nargs='?', const=True, type=bool,\\n\",\n    \"                        default=False, help='If true, uses fake data for unit testing.')\\n\",\n    \"    parser.add_argument('--max_steps', type=int, default=10000, help='Number of steps to run trainer.')\\n\",\n    \"    parser.add_argument('--data_dir', type=str, default=BASE+'mnist_data', help='Directory for storing input data')\\n\",\n    \"    parser.add_argument('--log_dir', type=str, default=BASE+'logs', help='Summaries log directory')\\n\",\n    \"    FLAGS, unparsed = parser.parse_known_args()\\n\",\n    \"    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### YES: TensorBoard Summit Tutorial Code\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Extracting /tmp/mnist_tutorial/data/train-images-idx3-ubyte.gz\\n\",\n      \"Extracting /tmp/mnist_tutorial/data/train-labels-idx1-ubyte.gz\\n\",\n      \"Extracting /tmp/mnist_tutorial/data/t10k-images-idx3-ubyte.gz\\n\",\n      \"Extracting /tmp/mnist_tutorial/data/t10k-labels-idx1-ubyte.gz\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"('/tmp/mnist_tutorial/sprite_1024.png',\\n\",\n       \" <http.client.HTTPMessage at 0x7f59ff6014e0>)\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import os\\n\",\n    \"import tensorflow as tf\\n\",\n    \"import urllib\\n\",\n    \"import urllib.request\\n\",\n    \"\\n\",\n    \"LOGDIR = '/tmp/mnist_tutorial/'\\n\",\n    \"GIST_URL = 'https://gist.githubusercontent.com/dandelionmane/4f02ab8f1451e276fea1f165a20336f1/raw/                            dfb8ee95b010480d56a73f324aca480b3820c180'\\n\",\n    \"\\n\",\n    \"### MNIST EMBEDDINGS ###\\n\",\n    \"mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + 'data', one_hot=True)\\n\",\n    \"### Get a sprite and labels file for the embedding projector ###\\n\",\n    \"urllib.request.urlretrieve(GIST_URL + 'labels_1024.tsv', LOGDIR + 'labels_1024.tsv')\\n\",\n    \"urllib.request.urlretrieve(GIST_URL + 'sprite_1024.png', LOGDIR + 'sprite_1024.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def conv_layer(input, size_in, size_out, name=\\\"conv\\\"):\\n\",\n    \"    with tf.name_scope(name):\\n\",\n    \"        w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name=\\\"W\\\")\\n\",\n    \"        b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\\\"B\\\")\\n\",\n    \"        conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding=\\\"SAME\\\")\\n\",\n    \"        act = tf.nn.relu(conv + b)\\n\",\n    \"        tf.summary.histogram(\\\"weights\\\", w)\\n\",\n    \"        tf.summary.histogram(\\\"biases\\\", b)\\n\",\n    \"        tf.summary.histogram(\\\"activations\\\", act)\\n\",\n    \"        return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\\\"SAME\\\")\\n\",\n    \"    \\n\",\n    \"def fc_layer(input, size_in, size_out, name=\\\"fc\\\"):\\n\",\n    \"    with tf.name_scope(name):\\n\",\n    \"        w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name=\\\"W\\\")\\n\",\n    \"        b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\\\"B\\\")\\n\",\n    \"        act = tf.nn.relu(tf.matmul(input, w) + b)\\n\",\n    \"        tf.summary.histogram(\\\"weights\\\", w)\\n\",\n    \"        tf.summary.histogram(\\\"biases\\\", b)\\n\",\n    \"        tf.summary.histogram(\\\"activations\\\", act)\\n\",\n    \"        return act \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def mnist_model(learning_rate, use_two_conv, use_two_fc, hparam):\\n\",\n    \"    tf.reset_default_graph()\\n\",\n    \"    sess = tf.Session()\\n\",\n    \"    # Setup placeholders, and reshape the data\\n\",\n    \"    x = tf.placeholder(tf.float32, shape=[None, 784], name=\\\"x\\\")\\n\",\n    \"    x_image = tf.reshape(x, [-1, 28, 28, 1]) \\n\",\n    \"    tf.summary.image('input', x_image, 3)\\n\",\n    \"    y = tf.placeholder(tf.float32, shape=[None, 10], name=\\\"labels\\\")\\n\",\n    \"    if use_two_conv:\\n\",\n    \"        conv1 = conv_layer(x_image, 1, 32, \\\"conv1\\\")\\n\",\n    \"        conv_out = conv_layer(conv1, 32, 64, \\\"conv2\\\")\\n\",\n    \"    else:\\n\",\n    \"        conv1 = conv_layer(x_image, 1, 64, \\\"conv\\\")\\n\",\n    \"        conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\\\"SAME\\\")\\n\",\n    \"    flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])\\n\",\n    \"    if use_two_fc:\\n\",\n    \"        fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, \\\"fc1\\\")\\n\",\n    \"        embedding_input = fc1 \\n\",\n    \"        embedding_size = 1024\\n\",\n    \"        logits = fc_layer(fc1, 1024, 10, \\\"fc2\\\")\\n\",\n    \"    else:\\n\",\n    \"        embedding_input = flattened\\n\",\n    \"        embedding_size = 7*7*64\\n\",\n    \"        logits = fc_layer(flattened, 7*7*64, 10, \\\"fc\\\")\\n\",\n    \"    with tf.name_scope(\\\"xent\\\"):\\n\",\n    \"        xent = tf.reduce_mean(\\n\",\n    \"        tf.nn.softmax_cross_entropy_with_logits(\\n\",\n    \"            logits=logits, labels=y), name=\\\"xent\\\")\\n\",\n    \"        tf.summary.scalar(\\\"xent\\\", xent)\\n\",\n    \"    with tf.name_scope(\\\"train\\\"):\\n\",\n    \"        train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)\\n\",\n    \"    with tf.name_scope(\\\"accuracy\\\"):\\n\",\n    \"        correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1)) \\n\",\n    \"        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\\n\",\n    \"        tf.summary.scalar(\\\"accuracy\\\", accuracy)\\n\",\n    \"    summ = tf.summary.merge_all()\\n\",\n    \"    \\n\",\n    \"    # _________ EMBEDDING VARIABLE/TENSOR CREATED _________\\n\",\n    \"    embedding = tf.Variable(tf.zeros([1024, embedding_size]), name=\\\"test_embedding\\\")\\n\",\n    \"    assignment = embedding.assign(embedding_input)\\n\",\n    \"    \\n\",\n    \"    # _________ SAVER CREATED _________\\n\",\n    \"    saver = tf.train.Saver()\\n\",\n    \"    \\n\",\n    \"    # _________ INIT GLOBAL VARS IS RUN  _________\\n\",\n    \"    sess.run(tf.global_variables_initializer())\\n\",\n    \"    \\n\",\n    \"    # _________ WRITER IS CREATED  _________\\n\",\n    \"    writer = tf.summary.FileWriter(LOGDIR + hparam)\\n\",\n    \"    writer.add_graph(sess.graph)\\n\",\n    \"    \\n\",\n    \"    # ================================================================\\n\",\n    \"    # _________ PROJECTORCONFIG CONSTRUCTOR  _________\\n\",\n    \"    config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()\\n\",\n    \"    embedding_config = config.embeddings.add()\\n\",\n    \"    embedding_config.tensor_name = embedding.name\\n\",\n    \"    embedding_config.sprite.image_path = LOGDIR + 'sprite_1024.png'\\n\",\n    \"    embedding_config.metadata_path = LOGDIR + 'labels_1024.tsv'\\n\",\n    \"    # Specify the width and height of a single thumbnail.\\n\",\n    \"    embedding_config.sprite.single_image_dim.extend([28, 28])\\n\",\n    \"    tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)\\n\",\n    \"    # ================================================================\\n\",\n    \"    \\n\",\n    \"    for i in range(2001):\\n\",\n    \"        batch = mnist.train.next_batch(100)\\n\",\n    \"        if i % 5 == 0:\\n\",\n    \"            [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})\\n\",\n    \"            writer.add_summary(s, i)\\n\",\n    \"        if i % 500 == 0:\\n\",\n    \"            sess.run(assignment, feed_dict={x: mnist.test.images[:1024], y: mnist.test.labels[:1024]})\\n\",\n    \"            saver.save(sess, os.path.join(LOGDIR, \\\"model.ckpt\\\"), i)\\n\",\n    \"        sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def make_hparam_string(learning_rate, use_two_fc, use_two_conv):\\n\",\n    \"    conv_param = \\\"conv=2\\\" if use_two_conv else \\\"conv=1\\\"\\n\",\n    \"    fc_param = \\\"fc=2\\\" if use_two_fc else \\\"fc=1\\\"\\n\",\n    \"    return \\\"lr_%.0E,%s,%s\\\" % (learning_rate, conv_param, fc_param)\\n\",\n    \"\\n\",\n    \"def main():\\n\",\n    \"    # You can try adding some more learning rates\\n\",\n    \"    for learning_rate in [1E-4]:\\n\",\n    \"        # Include \\\"False\\\" as a value to try different model architectures\\n\",\n    \"        for use_two_fc in [True]:\\n\",\n    \"            for use_two_conv in [True]:\\n\",\n    \"                # Construct a hyperparameter string for each one (example: \\\"lr_1E-3,fc=2,conv=2)\\n\",\n    \"                hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv)\\n\",\n    \"                print('Starting run for %s' % hparam)\\n\",\n    \"\\n\",\n    \"                # Actually run with the new settings\\n\",\n    \"                mnist_model(learning_rate, use_two_fc, use_two_conv, hparam)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Misc. Ops Testing\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"tf concat with -1 as an argument? No documentation on it so guess we'll have to try it out.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import tensorflow as tf\\n\",\n    \"import numpy as np\\n\",\n    \"\\n\",\n    \"a = tf.convert_to_tensor(np.arange(20).reshape(5, 4))\\n\",\n    \"concat = tf.concat([[-1, 1], tf.shape(a)], 0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[-1  1  5  4]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Config (hopefully) fixes GPU not releasing memory issue in jupyter.\\n\",\n    \"config = tf.ConfigProto()\\n\",\n    \"config.gpu_options.allow_growth=True\\n\",\n    \"with tf.Session(config=config) as sess:\\n\",\n    \"    print(sess.run(concat))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"\\n\",\n    \"\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "notebooks/__init__.py",
    "content": ""
  },
  {
    "path": "notebooks/ubuntu_reformat.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"# Reformatting Ubuntu Dialogue Corpus for Chatbot Model\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Dataset Description\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"**How to run this notebook**: \\n\",\n    \"1. Download the data from the [github repository](https://github.com/rkadlec/ubuntu-ranking-dataset-creator)\\n\",\n    \"2. CD to the downloaded directory and run ```./generate.sh -t -l```. I downloaded 1 mill. train samples with p = 1.0. \\n\",\n    \"3. Change the value of DATA_DIR below to your project path root.\\n\",\n    \"\\n\",\n    \"I chose to copy the first 10k lines of data into a \\\"sample\\\" directory so I could quickly play around with the data, and then use the full dataset when done.\\n\",\n    \"\\n\",\n    \"Random facts [from paper](https://arxiv.org/abs/1506.08909):\\n\",\n    \"* 2-way (dyadic) conversation, as opposed to multi-participant.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Load the Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import os.path\\n\",\n    \"import pdb\\n\",\n    \"import pandas as pd\\n\",\n    \"from pprint import pprint\\n\",\n    \"\\n\",\n    \"#DATA_DIR = '/home/brandon/terabyte/Datasets/ubuntu_dialogue_corpus/'\\n\",\n    \"DATA_DIR = '/home/brandon/ubuntu_dialogue_corpus/src/' # sample/'\\n\",\n    \"TRAIN_PATH = DATA_DIR + 'train.csv'\\n\",\n    \"VALID_PATH = DATA_DIR + 'valid.csv'\\n\",\n    \"TEST_PATH = DATA_DIR + 'test.csv'\\n\",\n    \"\\n\",\n    \"def get_training():\\n\",\n    \"    \\\"\\\"\\\"Returns dataframe data from train.csv \\\"\\\"\\\"\\n\",\n    \"    # First, we need to load the data directly into a dataframe from the train.csv file. \\n\",\n    \"    df_train = pd.read_csv(TRAIN_PATH)\\n\",\n    \"    # Remove all examples with label = 0. (why would i want to train on false examples?)\\n\",\n    \"    df_train = df_train.loc[df_train['Label'] == 1.0]\\n\",\n    \"    # Don't care about the pandas indices in the df, so remove them.\\n\",\n    \"    df_train = df_train.reset_index(drop=True)\\n\",\n    \"    df_train = df_train[df_train.columns[:2]]\\n\",\n    \"    return df_train\\n\",\n    \"\\n\",\n    \"def get_validation():\\n\",\n    \"    \\\"\\\"\\\"Returns data from valid.csv \\\"\\\"\\\"\\n\",\n    \"    # First, we need to load the data directly into a dataframe from the train.csv file. \\n\",\n    \"    df_valid = pd.read_csv(VALID_PATH)\\n\",\n    \"    first_two_cols = df_valid.columns[:2]\\n\",\n    \"    df_valid = df_valid[first_two_cols]\\n\",\n    \"    df_valid.columns = ['Context', 'Utterance']\\n\",\n    \"    return df_valid\\n\",\n    \"\\n\",\n    \"df_train = get_training()\\n\",\n    \"df_valid = get_validation()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"source\": [\n    \"## Functions for Visualization and Reformatting\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Now get all of the data in a single string and make a 'vocabulary' (unique words). \\n\",\n    \"import nltk, re, pprint\\n\",\n    \"from nltk import word_tokenize\\n\",\n    \"import pdb\\n\",\n    \"\\n\",\n    \"def print_single_turn(turn: str):\\n\",\n    \"    as_list_of_utters = turn.split('__eou__')[:-1]\\n\",\n    \"    for idx_utter, utter in enumerate(as_list_of_utters):\\n\",\n    \"        print(\\\"\\\\t>>>\\\", utter)\\n\",\n    \"\\n\",\n    \"def print_conversation(df, index=0):\\n\",\n    \"    \\\"\\\"\\\"Display the ith conversation in nice format.\\\"\\\"\\\"\\n\",\n    \"    \\n\",\n    \"    # Get the row identified by 'index'. \\n\",\n    \"    context_entry = df['Context'].values[index]\\n\",\n    \"    target        = df['Utterance'].values[index]\\n\",\n    \"    \\n\",\n    \"    # Split returns a blank last entry, so don't store.\\n\",\n    \"    turns = context_entry.split('__eot__')[:-1]\\n\",\n    \"    print('--------------------- CONTEXT ------------------- ')\\n\",\n    \"    for idx_turn, turn in enumerate(turns):\\n\",\n    \"        print(\\\"\\\\nUser {}: \\\".format(idx_turn % 2))\\n\",\n    \"        print_single_turn(turn)\\n\",\n    \"    print('\\\\n--------------------- RESPONSE ------------------- ')\\n\",\n    \"    print(\\\"\\\\nUser {}: \\\".format(len(turns) % 2))\\n\",\n    \"    print_single_turn(target)\\n\",\n    \"        \\n\",\n    \"def get_user_arrays(df):\\n\",\n    \"    \\\"\\\"\\\"Returns two arrays of every other turn. \\n\",\n    \"    Specifically:\\n\",\n    \"        len(returned array) is number of rows in df.  I SURE HOPE NOT!\\n\",\n    \"        each entry is a numpy array. \\n\",\n    \"        each numpy array contains utterances as entries. \\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    userOne = []\\n\",\n    \"    userTwo = []\\n\",\n    \"    contexts = df['Context'].values\\n\",\n    \"    targets  = df['Utterance'].values\\n\",\n    \"    assert(len(contexts) == len(targets))\\n\",\n    \"    \\n\",\n    \"    for i in range(len(contexts)):\\n\",\n    \"        # combined SINGLE CONVERSATION ENTRY of multiple turns each with multiple utterances.\\n\",\n    \"        list_of_turns = contexts[i].lower().split('__eot__')[:-1] + [targets[i].lower()]\\n\",\n    \"        # make sure even number of entries\\n\",\n    \"        if len(list_of_turns) % 2 != 0:\\n\",\n    \"            list_of_turns = list_of_turns[:-1]\\n\",\n    \"        # strip out the __eou__ occurences (leading space bc otherwise would result in two spaces)\\n\",\n    \"        new_list_of_turns = []\\n\",\n    \"        for turn in list_of_turns:\\n\",\n    \"            utter_list = turn.lower().split(\\\" __eou__\\\")\\n\",\n    \"            #if len(utter_list) > 3:\\n\",\n    \"            #   utter_list = utter_list[:3]\\n\",\n    \"            new_list_of_turns.append(\\\"\\\".join(utter_list))\\n\",\n    \"        #list_of_turns = [re.sub(' __eou__', '', t) for t in list_of_turns]\\n\",\n    \"        userOneThisConvo = new_list_of_turns[0::2]\\n\",\n    \"        userTwoThisConvo = new_list_of_turns[1::2]\\n\",\n    \"        userOne += userOneThisConvo \\n\",\n    \"        userTwo += userTwoThisConvo\\n\",\n    \"    assert(len(userOne) == len(userTwo))\\n\",\n    \"    return userOne, userTwo\\n\",\n    \"\\n\",\n    \"def save_to_file(fname, arr):\\n\",\n    \"    with open(DATA_DIR+fname,\\\"w\\\") as f:\\n\",\n    \"        for line in arr:\\n\",\n    \"            f.write(line + \\\"\\\\n\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Training Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"heading_collapsed\": true\n   },\n   \"source\": [\n    \"#### At a Glance\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"hidden\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Context</th>\\n\",\n       \"      <th>Utterance</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>count</th>\\n\",\n       \"      <td>1000000</td>\\n\",\n       \"      <td>1000000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>unique</th>\\n\",\n       \"      <td>957096</td>\\n\",\n       \"      <td>849957</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>top</th>\\n\",\n       \"      <td>! ops __eou__ __eot__ ? __eou__ __eot__</td>\\n\",\n       \"      <td>thank __eou__</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>freq</th>\\n\",\n       \"      <td>14</td>\\n\",\n       \"      <td>11658</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                        Context      Utterance\\n\",\n       \"count                                   1000000        1000000\\n\",\n       \"unique                                   957096         849957\\n\",\n       \"top     ! ops __eou__ __eot__ ? __eou__ __eot__  thank __eou__\\n\",\n       \"freq                                         14          11658\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df_train.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"hidden\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Context</th>\\n\",\n       \"      <th>Utterance</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there __eou__ __eot__ it would be very easy to keep a hash db of message-ids __eou__ sound good __eou__ __eot__ ok __eou__ perhaps we can ship an ad-hoc apt_prefereces __eou__ __eot__ version ? __eou__ __eot__ thank __eou__ __eot__ not yet __eou__ it be cover by your insurance ? __eou__ __eot__ yes __eou__ but it 's ...</td>\\n\",\n       \"      <td>basically each xfree86 upload will NOT force users to upgrade 100Mb of fonts for nothing __eou__ no something i do in my spare time . __eou__</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>I 'm not suggest all - only the ones you modify . __eou__ __eot__ ok , it sound like you 're agree with me , then __eou__ though rather than `` the ones we modify '' , my idea be `` the ones we need to merge '' __eou__ __eot__</td>\\n\",\n       \"      <td>oh ? oops . __eou__</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Context  \\\\\\n\",\n       \"0  i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there __eou__ __eot__ it would be very easy to keep a hash db of message-ids __eou__ sound good __eou__ __eot__ ok __eou__ perhaps we can ship an ad-hoc apt_prefereces __eou__ __eot__ version ? __eou__ __eot__ thank __eou__ __eot__ not yet __eou__ it be cover by your insurance ? __eou__ __eot__ yes __eou__ but it 's ...   \\n\",\n       \"1                                                                                                                                                                                                                                                                                   I 'm not suggest all - only the ones you modify . __eou__ __eot__ ok , it sound like you 're agree with me , then __eou__ though rather than `` the ones we modify '' , my idea be `` the ones we need to merge '' __eou__ __eot__   \\n\",\n       \"\\n\",\n       \"                                                                                                                                       Utterance  \\n\",\n       \"0  basically each xfree86 upload will NOT force users to upgrade 100Mb of fonts for nothing __eou__ no something i do in my spare time . __eou__  \\n\",\n       \"1                                                                                                                            oh ? oops . __eou__  \"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"pd.options.display.max_colwidth = 500\\n\",\n    \"df_train.head(2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"hidden\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"--------------------- CONTEXT ------------------- \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>> interest \\n\",\n      \"\\t>>>  grub-install work with / be ext3 , fail when it be xfs \\n\",\n      \"\\t>>>  i think d-i instal the relevant kernel for your machine . i have a p4 and its instal the 386 kernel \\n\",\n      \"\\t>>>  holy crap a lot of stuff get instal by default : ) \\n\",\n      \"\\t>>>  YOU ARE INSTALLING VIM ON A BOX OF MINE \\n\",\n      \"\\t>>>  ; ) \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  more like osx than debian ; ) \\n\",\n      \"\\t>>>  we have a selection of python modules available for great justice ( and python development ) \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  2.8 be fix them iirc \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  pong \\n\",\n      \"\\t>>>  vino will be in \\n\",\n      \"\\t>>>  enjoy ubuntu ? \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  tell me to come here \\n\",\n      \"\\t>>>  suggest thursday as a good day to come \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  we freeze versions a while back : ) \\n\",\n      \"\\t>>>  you come today or thursday ? \\n\",\n      \"\\t>>>  we 're consider shift it \\n\",\n      \"\\t>>>  yay \\n\",\n      \"\\t>>>  enjoy ubuntu ? \\n\",\n      \"\\t>>>  usplash ! \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  thats the one \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  so i saw your email with the mockup at the airport , but it have n't appear now that i 've pull my mail : | \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  i 've get a better one now too , give me a minute \\n\",\n      \"\\t>>>  we 've get rh9 instal on most desktops . you want me to look at up2date , right ? \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  aha ! no , the gui thingy \\n\",\n      \"\\t>>>  it 's more wizardy \\n\",\n      \"\\t>>>  so the first page be okayish \\n\",\n      \"\\t>>>  we can do a whole load better on the second page ( icons , translate descriptions ) \\n\",\n      \"\\t>>>  but that 's the kind of thing i be think about \\n\",\n      \"\\t>>>  ( a single big treeview would get very scary , very quickly ) \\n\",\n      \"\\t>>>  sure it 's not a hurricane ? \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  i think experimental be get 2.8 too \\n\",\n      \"\\t>>>  let him work on # 1217 : ) \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>>  we call it 'universe ' ; ) \\n\",\n      \"\\t>>>  haha \\n\",\n      \"\\t>>>  ooh , totally \\n\",\n      \"\\n\",\n      \"User 0: \\n\",\n      \"\\t>>>  i want it on in sarge too but nobody else agree \\n\",\n      \"\\n\",\n      \"--------------------- RESPONSE ------------------- \\n\",\n      \"\\n\",\n      \"User 1: \\n\",\n      \"\\t>>> i fully endorse this suggestion < /quimby > \\n\",\n      \"\\t>>>  how do your reinstall go ? \\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print_conversation(df_train, 3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Turn-Based DataFrame\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>UserOne</th>\\n\",\n       \"      <th>UserTwo</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>i think we could import the old comment via rs...</td>\\n\",\n       \"      <td>it would be very easy to keep a hash db of me...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>ok perhaps we can ship an ad-hoc apt_prefereces</td>\\n\",\n       \"      <td>version ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>thank</td>\\n\",\n       \"      <td>not yet it be cover by your insurance ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>yes but it 's really not the right time : / w...</td>\\n\",\n       \"      <td>you will be move into your house soon ? post ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>how urgent be # 896 ?</td>\\n\",\n       \"      <td>not particularly urgent , but a policy violat...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>5</th>\\n\",\n       \"      <td>i agree that we should kill the -novtswitch</td>\\n\",\n       \"      <td>ok</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>6</th>\\n\",\n       \"      <td>would you consider a package split a feature ?</td>\\n\",\n       \"      <td>context ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>7</th>\\n\",\n       \"      <td>split xfonts* out of xfree86* . one upload fo...</td>\\n\",\n       \"      <td>split the source package you mean ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>8</th>\\n\",\n       \"      <td>yes . same binary package .</td>\\n\",\n       \"      <td>i would prefer to avoid it at this stage . th...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>9</th>\\n\",\n       \"      <td>i 'm not suggest all - only the ones you modif...</td>\\n\",\n       \"      <td>ok , it sound like you 're agree with me , th...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>10</th>\\n\",\n       \"      <td>afternoon all not entirely relate to warty , b...</td>\\n\",\n       \"      <td>here</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>11</th>\\n\",\n       \"      <td>you might want to know that thinice in warty ...</td>\\n\",\n       \"      <td>and apparently gnome be suddently almost perf...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>12</th>\\n\",\n       \"      <td>can i file the panel not link to eds ? : )</td>\\n\",\n       \"      <td>be you use alt ? or the windows key ? wait fo...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>13</th>\\n\",\n       \"      <td>i just restart x and now nautilus wo n't show...</td>\\n\",\n       \"      <td>do you think we have any interest to have hal...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>14</th>\\n\",\n       \"      <td>be it a know bug that g-s-t do n't know what ...</td>\\n\",\n       \"      <td>somebody should really kick that guy *hard* i...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>15</th>\\n\",\n       \"      <td>arse . xt-dev ? i add libx11-dev so just libx...</td>\\n\",\n       \"      <td>we have plan to speak about menu organisation...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>16</th>\\n\",\n       \"      <td>be away , you say ? nope</td>\\n\",\n       \"      <td>the warty repository ok , fine . thanks nice ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>17</th>\\n\",\n       \"      <td>you 'll be glad to know i 've fix my miss arr...</td>\\n\",\n       \"      <td>i 've upload the gnome-vfs without hal suppor...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>18</th>\\n\",\n       \"      <td>should g2 in ubuntu do the magic dont-focus-w...</td>\\n\",\n       \"      <td>we 'll have a bof about this so you 're come t...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>19</th>\\n\",\n       \"      <td>interest grub-install work with / be ext3 , fa...</td>\\n\",\n       \"      <td>more like osx than debian ; ) we have a selec...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>20</th>\\n\",\n       \"      <td>2.8 be fix them iirc</td>\\n\",\n       \"      <td>pong vino will be in enjoy ubuntu ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>21</th>\\n\",\n       \"      <td>tell me to come here suggest thursday as a go...</td>\\n\",\n       \"      <td>we freeze versions a while back : ) you come ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>22</th>\\n\",\n       \"      <td>thats the one</td>\\n\",\n       \"      <td>so i saw your email with the mockup at the ai...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>23</th>\\n\",\n       \"      <td>i 've get a better one now too , give me a mi...</td>\\n\",\n       \"      <td>aha ! no , the gui thingy it 's more wizardy ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>24</th>\\n\",\n       \"      <td>i think experimental be get 2.8 too let him w...</td>\\n\",\n       \"      <td>we call it 'universe ' ; ) haha ooh , totally</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>25</th>\\n\",\n       \"      <td>i want it on in sarge too but nobody else agree</td>\\n\",\n       \"      <td>i fully endorse this suggestion &lt; /quimby &gt; ho...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>26</th>\\n\",\n       \"      <td>and because python give mark a woody</td>\\n\",\n       \"      <td>i 'm not sure if we 're mean to talk about th...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>27</th>\\n\",\n       \"      <td>and i think we be a `` pant off '' kind of co...</td>\\n\",\n       \"      <td>mono 1.0 ? dude , that 's go to be a barrel o...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>28</th>\\n\",\n       \"      <td>there be an accompany irc conversation to tha...</td>\\n\",\n       \"      <td>but debian/ be also part of diff.gz ... you c...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>29</th>\\n\",\n       \"      <td>notwarty , hth , hand , kthxbye &lt; g &gt; everyon...</td>\\n\",\n       \"      <td>which ? the best feature of the new imac be t...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>...</th>\\n\",\n       \"      <td>...</td>\\n\",\n       \"      <td>...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>170</th>\\n\",\n       \"      <td>this mornings run fine .</td>\\n\",\n       \"      <td>yep , it be . could you add hurd-i386 amd64 t...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>171</th>\\n\",\n       \"      <td>do - i assume that you 'll poke elmo to fresh...</td>\\n\",\n       \"      <td>do n't know i have to i 'll remind him next ti...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>172</th>\\n\",\n       \"      <td>know bug . check bugs.debian.org/src : xfree86...</td>\\n\",\n       \"      <td>i 'm wait approval to join the sounder list ....</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>173</th>\\n\",\n       \"      <td>setuid /bin/mount be go to be disable in favou...</td>\\n\",\n       \"      <td>under all circumstances , i take it ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>174</th>\\n\",\n       \"      <td>i would say so</td>\\n\",\n       \"      <td>do</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>175</th>\\n\",\n       \"      <td>i will accept responsibility for the addition...</td>\\n\",\n       \"      <td>indeed . it 's a recommends : thing , fix act...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>176</th>\\n\",\n       \"      <td>we need to make sure that cdroms ( and other r...</td>\\n\",\n       \"      <td>presumably i should make the same quietinit- ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>177</th>\\n\",\n       \"      <td>yes</td>\\n\",\n       \"      <td>do ( be the actual option change in sysvinit ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>178</th>\\n\",\n       \"      <td>sysvinit usplash will also check for it and n...</td>\\n\",\n       \"      <td>the patch as post be wrong , but i 've test w...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>179</th>\\n\",\n       \"      <td>if it work , can you patch it and upload it ?</td>\\n\",\n       \"      <td>sure , let 's make it tomorrow though : - )</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>180</th>\\n\",\n       \"      <td>np</td>\\n\",\n       \"      <td>hm , that eject change be go to need some tes...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>181</th>\\n\",\n       \"      <td>pmount just wrap mount , so long as you be a....</td>\\n\",\n       \"      <td>that 's not my point at all</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>182</th>\\n\",\n       \"      <td>i 'll double check that thats the whole reaso...</td>\\n\",\n       \"      <td>maybe just fall back to something like the ol...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>183</th>\\n\",\n       \"      <td>thats a little difficult with the way it be c...</td>\\n\",\n       \"      <td>do n't have to be exact by any mean be it imp...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>184</th>\\n\",\n       \"      <td>what do the fb corruption look like ?</td>\\n\",\n       \"      <td>lot of dot and squggles , text be partly read...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>185</th>\\n\",\n       \"      <td>which package ?</td>\\n\",\n       \"      <td>^^^</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>186</th>\\n\",\n       \"      <td>they build 'em sturdy down there , apparently...</td>\\n\",\n       \"      <td>over here they install fine , but then apt wa...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>187</th>\\n\",\n       \"      <td>try apt-get clean ?</td>\\n\",\n       \"      <td>that fix it , thank</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>188</th>\\n\",\n       \"      <td>that issue should n't affect upgrade from woo...</td>\\n\",\n       \"      <td>pitti : i 'm in group plugdev , it 's still n...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>189</th>\\n\",\n       \"      <td>one difference be that some pcs have a line o...</td>\\n\",\n       \"      <td>removable devices have be bad for me , but it...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>190</th>\\n\",\n       \"      <td>i think we nail the issue ( executable permis...</td>\\n\",\n       \"      <td>it 's copy into their cache already , be n't ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>191</th>\\n\",\n       \"      <td>hmm , good point nono , ( b ) give the cd to ...</td>\\n\",\n       \"      <td>if we be use grub only , should we turn off do...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>192</th>\\n\",\n       \"      <td>poke</td>\\n\",\n       \"      <td>try to remember if i ask if you be ppc or i38...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>193</th>\\n\",\n       \"      <td>yeah , series 1 h8 that debconf should be con...</td>\\n\",\n       \"      <td>what kind of puppies ? awesome</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>194</th>\\n\",\n       \"      <td>you ping the other day ? ( i only just get to ...</td>\\n\",\n       \"      <td>i ping a few minutes ago do you make a usplas...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>195</th>\\n\",\n       \"      <td>right click on the desktop be not work for me</td>\\n\",\n       \"      <td>nautilus manage the desktop ? the icons be di...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>196</th>\\n\",\n       \"      <td>anybody else see fb corruption during boot ? g...</td>\\n\",\n       \"      <td>which video card ?</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>197</th>\\n\",\n       \"      <td>no , it 's my home desktop</td>\\n\",\n       \"      <td>i remember fb break on that laptop and iirc it...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>198</th>\\n\",\n       \"      <td>that typically mean that apt be see multiple p...</td>\\n\",\n       \"      <td>there 's something definitely screwy with the...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>199</th>\\n\",\n       \"      <td>stock warty apt-get install `debootstrap -- p...</td>\\n\",\n       \"      <td>what kernel be you run ? # 268154 , yeah , re...</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"<p>200 rows × 2 columns</p>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                               UserOne  \\\\\\n\",\n       \"0    i think we could import the old comment via rs...   \\n\",\n       \"1     ok perhaps we can ship an ad-hoc apt_prefereces    \\n\",\n       \"2                                               thank    \\n\",\n       \"3     yes but it 's really not the right time : / w...   \\n\",\n       \"4                               how urgent be # 896 ?    \\n\",\n       \"5         i agree that we should kill the -novtswitch    \\n\",\n       \"6      would you consider a package split a feature ?    \\n\",\n       \"7     split xfonts* out of xfree86* . one upload fo...   \\n\",\n       \"8                         yes . same binary package .    \\n\",\n       \"9    i 'm not suggest all - only the ones you modif...   \\n\",\n       \"10   afternoon all not entirely relate to warty , b...   \\n\",\n       \"11    you might want to know that thinice in warty ...   \\n\",\n       \"12         can i file the panel not link to eds ? : )    \\n\",\n       \"13    i just restart x and now nautilus wo n't show...   \\n\",\n       \"14    be it a know bug that g-s-t do n't know what ...   \\n\",\n       \"15    arse . xt-dev ? i add libx11-dev so just libx...   \\n\",\n       \"16                           be away , you say ? nope    \\n\",\n       \"17    you 'll be glad to know i 've fix my miss arr...   \\n\",\n       \"18    should g2 in ubuntu do the magic dont-focus-w...   \\n\",\n       \"19   interest grub-install work with / be ext3 , fa...   \\n\",\n       \"20                               2.8 be fix them iirc    \\n\",\n       \"21    tell me to come here suggest thursday as a go...   \\n\",\n       \"22                                      thats the one    \\n\",\n       \"23    i 've get a better one now too , give me a mi...   \\n\",\n       \"24    i think experimental be get 2.8 too let him w...   \\n\",\n       \"25    i want it on in sarge too but nobody else agree    \\n\",\n       \"26               and because python give mark a woody    \\n\",\n       \"27    and i think we be a `` pant off '' kind of co...   \\n\",\n       \"28    there be an accompany irc conversation to tha...   \\n\",\n       \"29    notwarty , hth , hand , kthxbye < g > everyon...   \\n\",\n       \"..                                                 ...   \\n\",\n       \"170                          this mornings run fine .    \\n\",\n       \"171   do - i assume that you 'll poke elmo to fresh...   \\n\",\n       \"172  know bug . check bugs.debian.org/src : xfree86...   \\n\",\n       \"173  setuid /bin/mount be go to be disable in favou...   \\n\",\n       \"174                                    i would say so    \\n\",\n       \"175   i will accept responsibility for the addition...   \\n\",\n       \"176  we need to make sure that cdroms ( and other r...   \\n\",\n       \"177                                               yes    \\n\",\n       \"178   sysvinit usplash will also check for it and n...   \\n\",\n       \"179     if it work , can you patch it and upload it ?    \\n\",\n       \"180                                                np    \\n\",\n       \"181   pmount just wrap mount , so long as you be a....   \\n\",\n       \"182   i 'll double check that thats the whole reaso...   \\n\",\n       \"183   thats a little difficult with the way it be c...   \\n\",\n       \"184             what do the fb corruption look like ?    \\n\",\n       \"185                                   which package ?    \\n\",\n       \"186   they build 'em sturdy down there , apparently...   \\n\",\n       \"187                               try apt-get clean ?    \\n\",\n       \"188   that issue should n't affect upgrade from woo...   \\n\",\n       \"189   one difference be that some pcs have a line o...   \\n\",\n       \"190   i think we nail the issue ( executable permis...   \\n\",\n       \"191   hmm , good point nono , ( b ) give the cd to ...   \\n\",\n       \"192                                              poke    \\n\",\n       \"193   yeah , series 1 h8 that debconf should be con...   \\n\",\n       \"194  you ping the other day ? ( i only just get to ...   \\n\",\n       \"195     right click on the desktop be not work for me    \\n\",\n       \"196  anybody else see fb corruption during boot ? g...   \\n\",\n       \"197                        no , it 's my home desktop    \\n\",\n       \"198  that typically mean that apt be see multiple p...   \\n\",\n       \"199   stock warty apt-get install `debootstrap -- p...   \\n\",\n       \"\\n\",\n       \"                                               UserTwo  \\n\",\n       \"0     it would be very easy to keep a hash db of me...  \\n\",\n       \"1                                           version ?   \\n\",\n       \"2             not yet it be cover by your insurance ?   \\n\",\n       \"3     you will be move into your house soon ? post ...  \\n\",\n       \"4     not particularly urgent , but a policy violat...  \\n\",\n       \"5                                                  ok   \\n\",\n       \"6                                           context ?   \\n\",\n       \"7                 split the source package you mean ?   \\n\",\n       \"8     i would prefer to avoid it at this stage . th...  \\n\",\n       \"9     ok , it sound like you 're agree with me , th...  \\n\",\n       \"10                                               here   \\n\",\n       \"11    and apparently gnome be suddently almost perf...  \\n\",\n       \"12    be you use alt ? or the windows key ? wait fo...  \\n\",\n       \"13    do you think we have any interest to have hal...  \\n\",\n       \"14    somebody should really kick that guy *hard* i...  \\n\",\n       \"15    we have plan to speak about menu organisation...  \\n\",\n       \"16    the warty repository ok , fine . thanks nice ...  \\n\",\n       \"17    i 've upload the gnome-vfs without hal suppor...  \\n\",\n       \"18   we 'll have a bof about this so you 're come t...  \\n\",\n       \"19    more like osx than debian ; ) we have a selec...  \\n\",\n       \"20                pong vino will be in enjoy ubuntu ?   \\n\",\n       \"21    we freeze versions a while back : ) you come ...  \\n\",\n       \"22    so i saw your email with the mockup at the ai...  \\n\",\n       \"23    aha ! no , the gui thingy it 's more wizardy ...  \\n\",\n       \"24      we call it 'universe ' ; ) haha ooh , totally   \\n\",\n       \"25   i fully endorse this suggestion < /quimby > ho...  \\n\",\n       \"26    i 'm not sure if we 're mean to talk about th...  \\n\",\n       \"27    mono 1.0 ? dude , that 's go to be a barrel o...  \\n\",\n       \"28    but debian/ be also part of diff.gz ... you c...  \\n\",\n       \"29    which ? the best feature of the new imac be t...  \\n\",\n       \"..                                                 ...  \\n\",\n       \"170   yep , it be . could you add hurd-i386 amd64 t...  \\n\",\n       \"171  do n't know i have to i 'll remind him next ti...  \\n\",\n       \"172   i 'm wait approval to join the sounder list ....  \\n\",\n       \"173             under all circumstances , i take it ?   \\n\",\n       \"174                                                do   \\n\",\n       \"175   indeed . it 's a recommends : thing , fix act...  \\n\",\n       \"176   presumably i should make the same quietinit- ...  \\n\",\n       \"177   do ( be the actual option change in sysvinit ...  \\n\",\n       \"178   the patch as post be wrong , but i 've test w...  \\n\",\n       \"179       sure , let 's make it tomorrow though : - )   \\n\",\n       \"180   hm , that eject change be go to need some tes...  \\n\",\n       \"181                       that 's not my point at all   \\n\",\n       \"182   maybe just fall back to something like the ol...  \\n\",\n       \"183   do n't have to be exact by any mean be it imp...  \\n\",\n       \"184   lot of dot and squggles , text be partly read...  \\n\",\n       \"185                                               ^^^   \\n\",\n       \"186   over here they install fine , but then apt wa...  \\n\",\n       \"187                               that fix it , thank   \\n\",\n       \"188   pitti : i 'm in group plugdev , it 's still n...  \\n\",\n       \"189   removable devices have be bad for me , but it...  \\n\",\n       \"190   it 's copy into their cache already , be n't ...  \\n\",\n       \"191  if we be use grub only , should we turn off do...  \\n\",\n       \"192   try to remember if i ask if you be ppc or i38...  \\n\",\n       \"193                     what kind of puppies ? awesome  \\n\",\n       \"194   i ping a few minutes ago do you make a usplas...  \\n\",\n       \"195   nautilus manage the desktop ? the icons be di...  \\n\",\n       \"196                                which video card ?   \\n\",\n       \"197  i remember fb break on that laptop and iirc it...  \\n\",\n       \"198   there 's something definitely screwy with the...  \\n\",\n       \"199   what kernel be you run ? # 268154 , yeah , re...  \\n\",\n       \"\\n\",\n       \"[200 rows x 2 columns]\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"#df_merged = pd.DataFrame(df_train['Context'].map(str) + df_train['Utterance'])\\n\",\n    \"userOne, userTwo = get_user_arrays(df_train)\\n\",\n    \"df_turns = pd.DataFrame({'UserOne': userOne, 'UserTwo': userTwo})\\n\",\n    \"df_turns.head(200)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Sentence-Based DataFrame\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there '\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"userOne[0]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"ename\": \"KeyboardInterrupt\",\n     \"evalue\": \"\",\n     \"output_type\": \"error\",\n     \"traceback\": [\n      \"\\u001b[0;31m---------------------------------------------------------------------------\\u001b[0m\",\n      \"\\u001b[0;31mKeyboardInterrupt\\u001b[0m                         Traceback (most recent call last)\",\n      \"\\u001b[0;32m<ipython-input-6-a5f57e047c74>\\u001b[0m in \\u001b[0;36m<module>\\u001b[0;34m()\\u001b[0m\\n\\u001b[1;32m     19\\u001b[0m         \\u001b[0mdecoder\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mappend\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mdec\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m     20\\u001b[0m     \\u001b[0;32mreturn\\u001b[0m \\u001b[0mencoder\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mdecoder\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m---> 21\\u001b[0;31m \\u001b[0mencoder\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mdecoder\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mget_sentences\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserOne\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0muserTwo\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m     22\\u001b[0m \\u001b[0mprint\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'done'\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m<ipython-input-6-a5f57e047c74>\\u001b[0m in \\u001b[0;36mget_sentences\\u001b[0;34m(userOne, userTwo)\\u001b[0m\\n\\u001b[1;32m      5\\u001b[0m     \\u001b[0;32massert\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mlen\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserOne\\u001b[0m\\u001b[0;34m)\\u001b[0m \\u001b[0;34m==\\u001b[0m \\u001b[0mlen\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserTwo\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      6\\u001b[0m     \\u001b[0;32mfor\\u001b[0m \\u001b[0mi\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mrange\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mlen\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserOne\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m----> 7\\u001b[0;31m         \\u001b[0mone\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mnltk\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0msent_tokenize\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserOne\\u001b[0m\\u001b[0;34m[\\u001b[0m\\u001b[0mi\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m      8\\u001b[0m         \\u001b[0mone\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0;34m[\\u001b[0m\\u001b[0ms\\u001b[0m \\u001b[0;32mfor\\u001b[0m \\u001b[0ms\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mone\\u001b[0m \\u001b[0;32mif\\u001b[0m \\u001b[0ms\\u001b[0m \\u001b[0;34m!=\\u001b[0m \\u001b[0;34m'.'\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m      9\\u001b[0m         \\u001b[0mtwo\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mnltk\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0msent_tokenize\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0muserTwo\\u001b[0m\\u001b[0;34m[\\u001b[0m\\u001b[0mi\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/__init__.py\\u001b[0m in \\u001b[0;36msent_tokenize\\u001b[0;34m(text, language)\\u001b[0m\\n\\u001b[1;32m     92\\u001b[0m     \\\"\\\"\\\"\\n\\u001b[1;32m     93\\u001b[0m     \\u001b[0mtokenizer\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mload\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'tokenizers/punkt/{0}.pickle'\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mformat\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mlanguage\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m---> 94\\u001b[0;31m     \\u001b[0;32mreturn\\u001b[0m \\u001b[0mtokenizer\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mtokenize\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m     95\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m     96\\u001b[0m \\u001b[0;31m# Standard word tokenizer.\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36mtokenize\\u001b[0;34m(self, text, realign_boundaries)\\u001b[0m\\n\\u001b[1;32m   1235\\u001b[0m         \\u001b[0mGiven\\u001b[0m \\u001b[0ma\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mreturns\\u001b[0m \\u001b[0ma\\u001b[0m \\u001b[0mlist\\u001b[0m \\u001b[0mof\\u001b[0m \\u001b[0mthe\\u001b[0m \\u001b[0msentences\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mthat\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1236\\u001b[0m         \\\"\\\"\\\"\\n\\u001b[0;32m-> 1237\\u001b[0;31m         \\u001b[0;32mreturn\\u001b[0m \\u001b[0mlist\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0msentences_from_text\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1238\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1239\\u001b[0m     \\u001b[0;32mdef\\u001b[0m \\u001b[0mdebug_decisions\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36msentences_from_text\\u001b[0;34m(self, text, realign_boundaries)\\u001b[0m\\n\\u001b[1;32m   1283\\u001b[0m         \\u001b[0mfollows\\u001b[0m \\u001b[0mthe\\u001b[0m \\u001b[0mperiod\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1284\\u001b[0m         \\\"\\\"\\\"\\n\\u001b[0;32m-> 1285\\u001b[0;31m         \\u001b[0;32mreturn\\u001b[0m \\u001b[0;34m[\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m[\\u001b[0m\\u001b[0ms\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0me\\u001b[0m\\u001b[0;34m]\\u001b[0m \\u001b[0;32mfor\\u001b[0m \\u001b[0ms\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0me\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mspan_tokenize\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1286\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1287\\u001b[0m     \\u001b[0;32mdef\\u001b[0m \\u001b[0m_slices_from_text\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36mspan_tokenize\\u001b[0;34m(self, text, realign_boundaries)\\u001b[0m\\n\\u001b[1;32m   1274\\u001b[0m         \\u001b[0;32mif\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1275\\u001b[0m             \\u001b[0mslices\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0m_realign_boundaries\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mslices\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m-> 1276\\u001b[0;31m         \\u001b[0;32mreturn\\u001b[0m \\u001b[0;34m[\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0msl\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstart\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0msl\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstop\\u001b[0m\\u001b[0;34m)\\u001b[0m \\u001b[0;32mfor\\u001b[0m \\u001b[0msl\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mslices\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1277\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1278\\u001b[0m     \\u001b[0;32mdef\\u001b[0m \\u001b[0msentences_from_text\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m=\\u001b[0m\\u001b[0;32mTrue\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36m<listcomp>\\u001b[0;34m(.0)\\u001b[0m\\n\\u001b[1;32m   1274\\u001b[0m         \\u001b[0;32mif\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1275\\u001b[0m             \\u001b[0mslices\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0m_realign_boundaries\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mslices\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m-> 1276\\u001b[0;31m         \\u001b[0;32mreturn\\u001b[0m \\u001b[0;34m[\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0msl\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstart\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0msl\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstop\\u001b[0m\\u001b[0;34m)\\u001b[0m \\u001b[0;32mfor\\u001b[0m \\u001b[0msl\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mslices\\u001b[0m\\u001b[0;34m]\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1277\\u001b[0m \\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1278\\u001b[0m     \\u001b[0;32mdef\\u001b[0m \\u001b[0msentences_from_text\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mself\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mtext\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mrealign_boundaries\\u001b[0m\\u001b[0;34m=\\u001b[0m\\u001b[0;32mTrue\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36m_realign_boundaries\\u001b[0;34m(self, text, slices)\\u001b[0m\\n\\u001b[1;32m   1314\\u001b[0m         \\\"\\\"\\\"\\n\\u001b[1;32m   1315\\u001b[0m         \\u001b[0mrealign\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0;36m0\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m-> 1316\\u001b[0;31m         \\u001b[0;32mfor\\u001b[0m \\u001b[0msl1\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0msl2\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0m_pair_iter\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mslices\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1317\\u001b[0m             \\u001b[0msl1\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mslice\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0msl1\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstart\\u001b[0m \\u001b[0;34m+\\u001b[0m \\u001b[0mrealign\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0msl1\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mstop\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1318\\u001b[0m             \\u001b[0;32mif\\u001b[0m \\u001b[0;32mnot\\u001b[0m \\u001b[0msl2\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36m_pair_iter\\u001b[0;34m(it)\\u001b[0m\\n\\u001b[1;32m    309\\u001b[0m     \\u001b[0mit\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0miter\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mit\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m    310\\u001b[0m     \\u001b[0mprev\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mnext\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mit\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m--> 311\\u001b[0;31m     \\u001b[0;32mfor\\u001b[0m \\u001b[0mel\\u001b[0m \\u001b[0;32min\\u001b[0m \\u001b[0mit\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m    312\\u001b[0m         \\u001b[0;32myield\\u001b[0m \\u001b[0;34m(\\u001b[0m\\u001b[0mprev\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mel\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m    313\\u001b[0m         \\u001b[0mprev\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mel\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\\u001b[0m in \\u001b[0;36m_slices_from_text\\u001b[0;34m(self, text)\\u001b[0m\\n\\u001b[1;32m   1290\\u001b[0m             \\u001b[0mcontext\\u001b[0m \\u001b[0;34m=\\u001b[0m \\u001b[0mmatch\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mgroup\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m)\\u001b[0m \\u001b[0;34m+\\u001b[0m \\u001b[0mmatch\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mgroup\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'after_tok'\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1291\\u001b[0m             \\u001b[0;32mif\\u001b[0m \\u001b[0mself\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mtext_contains_sentbreak\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mcontext\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0;32m-> 1292\\u001b[0;31m                 \\u001b[0;32myield\\u001b[0m \\u001b[0mslice\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0mlast_break\\u001b[0m\\u001b[0;34m,\\u001b[0m \\u001b[0mmatch\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mend\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[0m\\u001b[1;32m   1293\\u001b[0m                 \\u001b[0;32mif\\u001b[0m \\u001b[0mmatch\\u001b[0m\\u001b[0;34m.\\u001b[0m\\u001b[0mgroup\\u001b[0m\\u001b[0;34m(\\u001b[0m\\u001b[0;34m'next_tok'\\u001b[0m\\u001b[0;34m)\\u001b[0m\\u001b[0;34m:\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\\u001b[1;32m   1294\\u001b[0m                     \\u001b[0;31m# next sentence starts after whitespace\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0;34m\\u001b[0m\\u001b[0m\\n\",\n      \"\\u001b[0;31mKeyboardInterrupt\\u001b[0m: \"\n     ]\n    }\n   ],\n   \"source\": [\n    \"\\n\",\n    \"def get_sentences(userOne, userTwo):\\n\",\n    \"    encoder = []\\n\",\n    \"    decoder = []\\n\",\n    \"    assert(len(userOne) == len(userTwo))\\n\",\n    \"    for i in range(len(userOne)):\\n\",\n    \"        one = nltk.sent_tokenize(userOne[i])\\n\",\n    \"        one = [s for s in one if s != '.']\\n\",\n    \"        two = nltk.sent_tokenize(userTwo[i])\\n\",\n    \"        two = [s for s in two if s != '.']\\n\",\n    \"        combine = one + two\\n\",\n    \"        assert(len(combine) == len(one) + len(two))\\n\",\n    \"        if len(combine) % 2 != 0:\\n\",\n    \"            combine = combine[:-1]\\n\",\n    \"        enc = combine[0::2]\\n\",\n    \"        dec = combine[1::2]\\n\",\n    \"        assert(len(enc) == len(dec))\\n\",\n    \"        encoder.append(enc)\\n\",\n    \"        decoder.append(dec)\\n\",\n    \"    return encoder, decoder\\n\",\n    \"encoder, decoder = get_sentences(userOne, userTwo)\\n\",\n    \"print('done')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"encoder = [nltk.word_tokenize(s[0]) for s in encoder]\\n\",\n    \"decoder = [nltk.word_tokenize(s[0]) for s in decoder]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"max_enc_len = max([len(s) for s in encoder])\\n\",\n    \"max_dec_len = max([len(s) for s in decoder])\\n\",\n    \"print(max_enc_len)\\n\",\n    \"print(max_dec_len)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Analyzing Sentence Lengths\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"encoder_lengths = [len(s) for s in encoder]\\n\",\n    \"decoder_lengths = [len(s) for s in decoder]\\n\",\n    \"df_lengths = pd.DataFrame({'EncoderSentLength': encoder_lengths, 'DecoderSentLengths': decoder_lengths})\\n\",\n    \"df_lengths.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"plt.style.use('ggplot')\\n\",\n    \"plt.rcParams['figure.figsize'] = 9, 5\\n\",\n    \"fig, axes = plt.subplots(nrows=1, ncols=2)\\n\",\n    \"plt.subplot(1, 2, 1)\\n\",\n    \"plt.hist(encoder_lengths)\\n\",\n    \"plt.subplot(1, 2, 2)\\n\",\n    \"plt.hist(decoder_lengths, color='b')\\n\",\n    \"plt.tight_layout()\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"save_to_file(\\\"train_from.txt\\\", userOne)\\n\",\n    \"save_to_file(\\\"train_to.txt\\\", userTwo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Validation Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"df_valid has 19560 rows.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Context</th>\\n\",\n       \"      <th>Utterance</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>Any ideas on how lts will be release ? __eou__...</td>\\n\",\n       \"      <td>We be talk 12.04 not 10.04 __eou__</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>how much hdd use ubuntu default install ? __eo...</td>\\n\",\n       \"      <td>thats why i ask how much be default install ? ...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>in my country its nearly the 27th __eou__ when...</td>\\n\",\n       \"      <td>thanx __eou__</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>it 's not out __eou__ __eot__ they probabaly b...</td>\\n\",\n       \"      <td>wait for many things to be setup __eou__ final...</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>be the ext4 drivers stable ? __eou__ __eot__ I...</td>\\n\",\n       \"      <td>you sound like it 's update to skynet . ; ) __...</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                             Context  \\\\\\n\",\n       \"0  Any ideas on how lts will be release ? __eou__...   \\n\",\n       \"1  how much hdd use ubuntu default install ? __eo...   \\n\",\n       \"2  in my country its nearly the 27th __eou__ when...   \\n\",\n       \"3  it 's not out __eou__ __eot__ they probabaly b...   \\n\",\n       \"4  be the ext4 drivers stable ? __eou__ __eot__ I...   \\n\",\n       \"\\n\",\n       \"                                           Utterance  \\n\",\n       \"0                 We be talk 12.04 not 10.04 __eou__  \\n\",\n       \"1  thats why i ask how much be default install ? ...  \\n\",\n       \"2                                      thanx __eou__  \\n\",\n       \"3  wait for many things to be setup __eou__ final...  \\n\",\n       \"4  you sound like it 's update to skynet . ; ) __...  \"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"print(\\\"df_valid has\\\", len(df_valid), \\\"rows.\\\")\\n\",\n    \"df_valid.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"userOne, userTwo = get_user_arrays(df_valid)\\n\",\n    \"save_to_file(\\\"valid_from.txt\\\", userOne)\\n\",\n    \"save_to_file(\\\"valid_to.txt\\\", userTwo)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"done\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print('done')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Visualization\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"855 at 1330067\\n\",\n      \"Sentence:\\n\",\n      \"  thanks : ) i know , it use .deb , but read my word , they say that nothing like .deb or source be there . that be know to me , so iam think of use alien to build the deb i have see the entire internet , and even the sdl developers tell me , that they do n't exist . lol , what be you say ? there be no .deb yet for wesnoth 1.8 , also , i know i need to compile it , but the source be not available for sdl11-config , i instal them all , no result yes , the older ones be available . sorry , but make the previous version be different . the previous versions of wesnoth do not need all sdl libraries , lol , thank , but that be for wesnoth 1.6.1 , at least 2 years older , but i say 1.8 , anyway . thanks for the help . i be search for a source , and let me compile it . lol , still a formidable game can be make , against age of empires series , : d penumbra if commercial , but o a.d be not , : d a demo be not open-source , and also , the what i like be a rts , like the fan of age of mythology and aok , also , from the screenthots of o a.d , it appear as if it be a jewel to ubuntu . the debate continue , if you consider java too , and i do have them . but , the thing be that , commercial < free < open-source , so flash be better than commercial softwares like penumbra what we want to advocate ubuntu for , be freedom and open-source . so , commercial game be not welcome here . the best way be to use free and open-source softwares . is n't our discussion go a bite offtopic ? also , non-free softwares be mean for profit , which clash with the nature of ubuntu . a mutual profit be always welcome , when it benefit the ideology of the user and the developer . and i have research nicely enough , but you seem to challenge the nature of linux , and also , drag the discussion offtopic . in addition , things like non-free softwares cause a flow of money from the pocket of the users to the developers . but open-source be what allow users to be developers . there be , base on user experience . and ubuntu be the best . fame come from others individual judgements , and people accept ubuntu , since it be the best . also , ubuntu be the most user-friendly linux for pcs . anything *buntu , whether lubuntu , kubuntu or xubuntu be the best . the talk be relate to open-source , but windows be not . also , many people use windows , but they be switch to ubuntu now . and it be ubuntu who challenge microsoft in a bold way . computing world be not only for game . for game , get a xbox or playstation . computer be mainly for learn and development . it be for better use . and in all field , ubuntu be the best . for everyday use , puppy be a joke . ubuntu and puppy 's goals differ . ubuntu jeos can do the same . lubuntu be also nicer than puppy in many ways . in the modern world , people who be in computing , should upgrade their systems . and for low-end systems , any linux with low de can do . why only puppy ? dsl can do the same , and lubuntu too . the `` best '' be count as a basis on `` how many field a thing be better than others '' , and ubuntu be much better in most case . so , it be the best . check out the ubuntu synaptic , and you can get anything like that , low-end system maintainance and so . so , lxde can be use in ubuntu , and so can be icewm , so ubuntu can perform much better than puppy . also , where be the package manager for puppy ? nowhere , ubuntu have strongest support , because check the support of both . nice to know it , but then , community of ubuntu need centralization , not fragmentation . i be among ubuntu sideline developers too ( the default version ) i know , but be it really nicer than synaptic ? no , discussing about puppy be not welcome here . it be he ubuntu support channel . as per my question 's answer , you seem to start debate on the main support channel . please do n't do so . lol , : d it be not so bad , and if you hate google , try www.bing.com , : ) by microsoft , : ) lol , nice \\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"%matplotlib inline\\n\",\n    \"userOne, userTwo = get_user_arrays(df_train)\\n\",\n    \"# Regular expressions used to tokenize.\\n\",\n    \"_WORD_SPLIT = re.compile(b\\\"([.,!?\\\\\\\"':;)(])\\\")\\n\",\n    \"_DIGIT_RE   = re.compile(br\\\"\\\\d\\\")\\n\",\n    \"lengths = np.array([len(t.strip().split()) for t in userOne])\\n\",\n    \"\\n\",\n    \"max_ind =  lengths.argmax()\\n\",\n    \"print(max(lengths), \\\"at\\\", max_ind)\\n\",\n    \"print(\\\"Sentence:\\\\n\\\", userOne[max_ind])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(array([  1.85629000e+06,   2.48062000e+05,   4.06420000e+04,\\n\",\n       \"          8.01600000e+03,   2.06200000e+03,   6.29000000e+02,\\n\",\n       \"          1.99000000e+02,   8.00000000e+01,   3.90000000e+01,\\n\",\n       \"          1.50000000e+01]),\\n\",\n       \" array([   0. ,   39.3,   78.6,  117.9,  157.2,  196.5,  235.8,  275.1,\\n\",\n       \"         314.4,  353.7,  393. ]),\\n\",\n       \" <a list of 10 Patch objects>)\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\nHAAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f3f44d83e10>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"plt.hist(sorted(lengths)[:-20])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2134602 out of 2156054 (0.9900503419673162\\\\%)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"n_under_20 = sum([1 if l < 100 else 0 for l in lengths])\\n\",\n    \"print(n_under_20, \\\"out of\\\", len(lengths), \\\"({}\\\\%)\\\".format(float(n_under_20)/len(lengths)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"df_lengths = pd.DataFrame(lengths)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>0</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>count</th>\\n\",\n       \"      <td>2.156054e+06</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>mean</th>\\n\",\n       \"      <td>2.171190e+01</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>std</th>\\n\",\n       \"      <td>2.074356e+01</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>min</th>\\n\",\n       \"      <td>0.000000e+00</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>25%</th>\\n\",\n       \"      <td>8.000000e+00</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>50%</th>\\n\",\n       \"      <td>1.600000e+01</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>75%</th>\\n\",\n       \"      <td>2.800000e+01</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>max</th>\\n\",\n       \"      <td>8.550000e+02</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                  0\\n\",\n       \"count  2.156054e+06\\n\",\n       \"mean   2.171190e+01\\n\",\n       \"std    2.074356e+01\\n\",\n       \"min    0.000000e+00\\n\",\n       \"25%    8.000000e+00\\n\",\n       \"50%    1.600000e+01\\n\",\n       \"75%    2.800000e+01\\n\",\n       \"max    8.550000e+02\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df_lengths.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"source\": [\n    \"## Relationship between Accuracy, Loss, and Others\\n\",\n    \"\\n\",\n    \"$$\\n\",\n    \"\\\\text{Loss} = - \\\\frac{1}{N} \\\\sum_{i = 1}^{N} \\\\ln\\\\left(p_{target_i}\\\\right)\\n\",\n    \"$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Loss for uniformly random guessing is 10.5966347331\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/usr/local/lib/python3.5/dist-packages/ipykernel/__main__.py:16: RuntimeWarning: divide by zero encountered in true_divide\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[<matplotlib.lines.Line2D at 0x7fdd93e5bba8>]\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAGcpJREFUeJzt3WtwW/d55/HvgwtBUhQpyaRkWaJ1sdVUqt34wrqOneyk\\ntZOVva2VaZvE2qZpU0/0Jm7dNtOOu+1ku94XbS6TpGlcN5o06yaTtdfxZrKaVK2cOG6SSX0RHbuy\\nJVkyY0uWZF0o6kaRIkEAz744ByRIASQkgYTOwe8zg8G5/IHzh4/8w58PzsXcHRERiZdEvTsgIiK1\\np3AXEYkhhbuISAwp3EVEYkjhLiISQwp3EZEYUriLiMSQwl1EJIYU7iIiMZSq14Y7Ozt95cqV9dq8\\niEgkvfjii8fdvWumdnUL95UrV9Lb21uvzYuIRJKZ7a+mncoyIiIxpHAXEYkhhbuISAwp3EVEYkjh\\nLiISQzOGu5l9zcyOmdmrFdabmX3JzPrMbIeZ3VT7boqIyIWoZuT+KLB+mvV3AWvCxybgkUvvloiI\\nXIoZw93dfwScmKbJBuDrHngOWGBmS2vVwam27zvB57btIZcvzNYmREQirxY192XAgZL5g+Gy85jZ\\nJjPrNbPe/v7+i9rYS2+d5MvP9DGSU7iLiFQypz+ouvtmd+9x956urhnPni0rk0oCMDqWr2XXRERi\\npRbhfgjoLplfHi6bFZlU0OVRjdxFRCqqRbhvAT4aHjVzK3Da3Q/X4H3LyqQV7iIiM5nxwmFm9hjw\\nXqDTzA4C/x1IA7j7PwBbgbuBPmAY+NhsdRZKyjI5lWVERCqZMdzdfeMM6x34RM16NIPxssyYRu4i\\nIpVE7gzViZG7wl1EpJLohXtYc88q3EVEKopeuI8fLaOau4hIJREMd5VlRERmEsFw18hdRGQm0Qv3\\ntI6WERGZSfTCXWUZEZEZRTDcVZYREZlJdMNdZRkRkYoiF+6pZIJkwlSWERGZRuTCHYLRu8oyIiKV\\nRTjcNXIXEakkouGeVM1dRGQa0Qz3tMoyIiLTiWa4qywjIjKtSIZ7k8JdRGRakQz3TCqpsoyIyDQi\\nGu4J/aAqIjKN6Ia7yjIiIhVFNNxVlhERmU40wz2tkbuIyHSiGe6quYuITCui4a6yjIjIdCIa7irL\\niIhMJ5rhrpq7iMi0ohnuqST5gpPLK+BFRMqJaLgXb7WncBcRKUfhLiISQ9EM93QS0E2yRUQqiWa4\\nhyP3rEbuIiJlRTTciyN3hbuISDlVhbuZrTezPWbWZ2YPlll/tZk9Y2YvmdkOM7u79l2dMF5z11mq\\nIiJlzRjuZpYEHgbuAtYBG81s3ZRmfwk84e43AvcCf1/rjpbKpIs/qKrmLiJSTjUj91uAPnd/w92z\\nwOPAhiltHGgPpzuAt2vXxfOpLCMiMr1qwn0ZcKBk/mC4rNRfAR8xs4PAVuAPyr2RmW0ys14z6+3v\\n77+I7gYmDoXUyF1EpJxa/aC6EXjU3ZcDdwPfMLPz3tvdN7t7j7v3dHV1XfTGxssyqrmLiJRVTbgf\\nArpL5peHy0rdBzwB4O7PAs1AZy06WI7KMiIi06sm3LcDa8xslZk1EfxgumVKm7eAOwDMbC1BuF98\\n3WUGKsuIiExvxnB39xxwP7AN2E1wVMxOM3vIzO4Jm30S+LiZ/QfwGPB77u6z1WldfkBEZHqpahq5\\n+1aCH0pLl32qZHoXcHttu1bZ+OUHVHMXESkromeoqiwjIjKdSIZ7KmGYqSwjIlJJJMPdzHSrPRGR\\naUQy3CG8SfaYyjIiIuVEONw1chcRqSS64a6bZIuIVBTdcE8ldbSMiEgFEQ73hI5zFxGpINrhrrKM\\niEhZEQ53lWVERCqJbrjrB1URkYqiG+6quYuIVBThcFdZRkSkkgiHu8oyIiKVRDfcVXMXEakouuGu\\na8uIiFQU4XDXyF1EpJIIh3uSXMHJF2btbn4iIpEV3XBPB13PavQuInKe6Ia7brUnIlJRhMM9vEm2\\nRu4iIueJcLiHI3edpSoicp7ohntaZRkRkUqiG+4qy4iIVBThcNfIXUSkkuiHu2ruIiLniWy4N42P\\n3BXuIiJTRTbcJ2ruKsuIiEwV3XBPa+QuIlJJdMNdNXcRkYqqCnczW29me8ysz8werNDmQ2a2y8x2\\nmtn/rm03z6eyjIhIZamZGphZEngYeB9wENhuZlvcfVdJmzXAnwO3u/tJM1s8Wx0uUllGRKSyakbu\\ntwB97v6Gu2eBx4ENU9p8HHjY3U8CuPux2nbzfBkdLSMiUlE14b4MOFAyfzBcVurngJ8zs5+Y2XNm\\ntr5WHaykKVmsuassIyIy1YxlmQt4nzXAe4HlwI/M7Hp3P1XayMw2AZsArr766kvaoJnpbkwiIhVU\\nM3I/BHSXzC8Pl5U6CGxx9zF3fxPYSxD2k7j7Znfvcfeerq6ui+3zOIW7iEh51YT7dmCNma0ysybg\\nXmDLlDbfIRi1Y2adBGWaN2rYz7Iy6aSOlhERKWPGcHf3HHA/sA3YDTzh7jvN7CEzuydstg0YMLNd\\nwDPAn7r7wGx1uiiTSug4dxGRMqqqubv7VmDrlGWfKpl24E/Cx5xRWUZEpLzInqEKwYlMKsuIiJwv\\n2uGe1shdRKScaIe7au4iImVFPNxVlhERKSfi4a6yjIhIOdEO93RS4S4iUka0wz2VIKtwFxE5T+TD\\nXTV3EZHzRTzckzpaRkSkjGiHu45zFxEpK9rhnkqQzRcoFLzeXRERuaxEPNyD+6hm8xq9i4iUinS4\\nNxVvtae6u4jIJJEO94n7qOqIGRGRUjEJd43cRURKRTrc5zcHl6M/fW6szj0REbm8RDrcu+ZnADh+\\ndrTOPRERubxEO9zbmgHoH1S4i4iUinS4d85vAqBfI3cRkUkiHe6tTSnaMimN3EVEpoh0uENQd1e4\\ni4hMFv1wb1O4i4hMFflw75zfpJq7iMgUkQ93jdxFRM4X/XCfn2FwJMfImC5BICJSFItwB53IJCJS\\nKjbhrtKMiMiE6Ie7zlIVETlP9MO9OHJXWUZEZFzkw/2KtvASBBq5i4iMi3y4p5MJFs1rUriLiJSo\\nKtzNbL2Z7TGzPjN7cJp2v2lmbmY9tevizHSsu4jIZDOGu5klgYeBu4B1wEYzW1em3XzgAeD5Wndy\\nJjpLVURksmpG7rcAfe7+hrtngceBDWXa/U/g08BIDftXFY3cRUQmqybclwEHSuYPhsvGmdlNQLe7\\n/3MN+1a14pUh3b0emxcRuexc8g+qZpYAPg98soq2m8ys18x6+/v7L3XT47rmZxjNFTg7mqvZe4qI\\nRFk14X4I6C6ZXx4uK5oPXAf8m5ntA24FtpT7UdXdN7t7j7v3dHV1XXyvp9BZqiIik1UT7tuBNWa2\\nysyagHuBLcWV7n7a3TvdfaW7rwSeA+5x995Z6XEZOktVRGSyGcPd3XPA/cA2YDfwhLvvNLOHzOye\\n2e5gNXSWqojIZKlqGrn7VmDrlGWfqtD2vZferQujsoyIyGSRP0MVYEFLmlTCFO4iIqFYhHsiYXTq\\nWHcRkXGxCHfQWaoiIqViE+46S1VEZEJ8wn2+wl1EpChW4T4wlKVQ0CUIRETiE+5tGfIF5+Rwtt5d\\nERGpu/iE+/zwLFX9qCoiEp9wv7IjOJHp0Mlzde6JiEj9xSbc1yyZD8Duw2fq3BMRkfqLTbi3N6e5\\nelEruw8P1rsrIiJ1F5twB1i3tJ1dGrmLiMQr3NcubWffwJBu2iEiDS9W4b7uqnbcYc8Rjd5FpLHF\\nLtwBdqnuLiINLlbhflVHMx0taXa9rZG7iDS2WIW7melHVRERYhbuEJRm9hw5Q17XmBGRBha7cF+7\\ntJ2RsQJvHh+qd1dEROomduG+bmnxR1WVZkSkccUu3K9d3EY6afpRVUQaWuzCvSmVYM3i+Rq5i0hD\\ni124Q/Cjqi4gJiKNLJ7hvrSd/sFRjg2O1LsrIiJ1EctwX1v8UVV1dxFpULEM9+uXd5BOGj/pO17v\\nroiI1EUsw70tk+K2azp5atdR3HUyk4g0nliGO8D7f2EJ+weGef3Y2Xp3RURkzsU23O9cuwSAp3Ye\\nqXNPRETmXmzDfUl7Mzd0L+CpXUfr3RURkTkX23CHoDSz4+BpDp8+V++uiIjMqarC3czWm9keM+sz\\nswfLrP8TM9tlZjvM7GkzW1H7rl64968LSjPf1+hdRBrMjOFuZkngYeAuYB2w0czWTWn2EtDj7r8I\\nPAl8ptYdvRjXdLWxunOeSjMi0nCqGbnfAvS5+xvungUeBzaUNnD3Z9x9OJx9Dlhe225eHDPjfeuW\\n8OzPBjh9bqze3RERmTPVhPsy4EDJ/MFwWSX3Af9yKZ2qpff/whJyBeeZ147VuysiInOmpj+omtlH\\ngB7gsxXWbzKzXjPr7e/vr+WmK7qxeyHdi1p49N/36YQmEWkY1YT7IaC7ZH55uGwSM7sT+AvgHncf\\nLfdG7r7Z3Xvcvaerq+ti+nvBEglj03tW8/KBUzz/5ok52aaISL1VE+7bgTVmtsrMmoB7gS2lDczs\\nRuArBMF+2dU/PtjTzRXzmnjk335W766IiMyJGcPd3XPA/cA2YDfwhLvvNLOHzOyesNlngTbgW2b2\\nspltqfB2ddGcTvKx21fyw739ulKkiDQEq1cduqenx3t7e+dse6eHx7jtb57mjrVL+NLGG+dsuyIi\\ntWRmL7p7z0ztYn2GaqmO1jT/9Zev5rs73ubAieGZXyAiEmENE+4A9717NcmE8YXv7613V0REZlVD\\nhfuVHc18/D2r+fZPD/HDvXNzKKaISD00VLgD/OEda7imax7/7duvcHY0V+/uiIjMioYL9+Z0ks/8\\n1jt5+/Q5PvOvr9W7OyIis6Lhwh3g5hUL+b3bVvL1Z/fzgk5sEpEYashwB/jT//wOrl7Uyh889lPe\\nPqXrvYtIvDRsuLc2pdj80ZsZHs3z+49u58yIrhopIvHRsOEO8PNXtvPIR26m79hZPvHNnzKWL9S7\\nSyIiNdHQ4Q7w7jWd/PVvXM+PXz/Onz25QwEvIrGQqncHLgcf7Onm2OAon922h1PDWR7+7ZtobdJ/\\nGhGJroYfuRd94leu5a9/43p+uLefjZuf4/jZslctFhGJBIV7iY23XM3m3+lhz9FBPvDwT3hx/8l6\\nd0lE5KIo3Ke4c90SHt/0LgA+9JVn+dLTr5Mv6A5OIhItCvcybuhewNYH3sOv/+JSPv+9vXzoK8/q\\nOvAiEikK9wram9N88d4b+eKHb+DN40P82t/9mL/8ziucHMrWu2siIjPSISEz+MCNy/iVdyzmC9/f\\nyzee28+Wl9/m99+9io/dtoqO1nS9uyciUlbD3ImpFvYcGeRzT+3he7uO0pZJ8dF3reB33rWCpR0t\\n9e6aiDSIau/EpHC/CLsPn+HLz/Sx9ZXDJMy4c+1iPnLrCm6/ppNEwurdPRGJMYX7HHhrYJhvvrCf\\nb/Ue5MRQlivbm7nnhqvYcMNVrFvajpmCXkRqS+E+h0bG8mzbeYQtL7/ND/f2kys4K65o5c61S7hz\\n7RJ6Vi4kndRv1yJy6RTudXJyKMu/vHqEp3Yd4d/7BsjmC7RlUty6ehG3X9vJbdd0smZxm8o3InJR\\nFO6XgaHRHD9+vZ8fvX6cn/QdZ//AMADtzSl6Vi7i5hULuaF7Adcv76C9WUfeiMjMqg13HQo5i+Zl\\nUqy/binrr1sKwIETw7zw5gm27zvBC/tO8IPXjo23Xd05j7VXtbNuafBYs6SNZQtaVLcXkYuicJ9D\\n3Yta6V7Uym/evByA08Nj7Dh0iv84cIpXD53hlYOn+ecdh8fbz2tKcu2S+VzTNY9rutpY3TmPFVfM\\nY8UVrczLaNeJSGUqy1xmzoyMsefIIHuPDvL60bPsPTrIG/1DHDkzMqldZ1uG7kUtdC9sZfnCFpYt\\nbOGqjhauWtDClR3NtDenNOoXiSGVZSKqvTnNL61cxC+tXDRp+dnRHPuOD7F/YJh9A0PsHxji4Mlz\\nvHzgFFtfOUxuysXNWpuSXNnezOL2DEvam1k8P8Pi+c10zm+isy1DZ1uGK9qaWNTaREpH8ojEjsI9\\nItoyKa5b1sF1yzrOW5cvOMcGR3j71DkOnRrh6OkRDp8e4eiZ4PHSW6c4emaE0Vz5u0wtaE2zaF4Q\\n9AvnNbGgJR08t6ZZ0NJER0uaBa1pOlrStDcHz23NKZI64kfksqVwj4Fkwlja0cLSjhZuXlG+jbsz\\nOJrj+OAo/YOjDAxlGTg7yvGzWQaGRjk5PMaJs1kOnBjmleExTg5nK34ZFLVlUrQ3p5jfHIT9/OJ0\\nJkVbJsm8TIq2TIp54aMtk6S1KVjW0pRkXlPw3NqU1HkAIjWmcG8QZkZ7czDyXt3VVtVrzmXznD43\\nxulzY5wazo5Pnz43xuBIjjMjY5w5l+PsaDA/cDbLWwPDDI7mGBwZY2Ss+vvRppNGSzoZhn1qfLol\\nnaQ5nG5OJYLndDCdCddlUolgWTpBJjUxn0klyKQTNCWDtsFzOJ9K6DcJiTWFu1TU0hSE6pUdzRf1\\n+ly+wFA2z9BojuFsjqHRYHoom2c4m2M4XHcum2d4LB88Z3OcGytwLpvj3FgwPzCUZXQsz7nwMTKW\\nv6AvjkqakgmaUuEjnE4njaZUMlxm4bLg0ZQM1qeTCdKpBOlEyXQyaJ9KFtsbqUSCVNLGp4uvTSWD\\n16aSwfpUYmJ9MnzPZMLCdeH0lHmRmVQV7ma2HvhbIAl81d3/Zsr6DPB14GZgAPiwu++rbVclalLJ\\nBB0tCTpaan+ClrszmiswOlZgNBeEffF5JJcnmwvmR0vmg2XBI1vynM0H68fyPr58LB+sGxkrcHYk\\nRzbvZHN5cgVnLFcgmw/aj+UL4WPujjozg1TCwtCfCP/ic2LSfGLS/PjDgi+LhE1+TSJcV9oukTCS\\nCYL3smC62C5hpa9h0usTxeeEkTAm3itcbsZ4u+BBSfvi+zM+f970+PaD97bx7QbrrLSNMWm9TXmP\\nibYTr436X3YzhruZJYGHgfcBB4HtZrbF3XeVNLsPOOnu15rZvcCngQ/PRodFIPgfrzksy0D9z+51\\n9yD4w6DPlYR/rhDMZ/MFcnknVwjW5cP2wbJg+fh0vsBYwSkUJuZzheA1uXyBvDu5vDOWdwoevDZf\\nYHxd0C58Ljj5QoG8Q74w0YfRXLC++F7F6eI2C+F8vgCF8D3HH+54uCyud6EsDXyj/BdA8cvGmPqF\\nEczblC+a4vMDd6zh19951az2v5qR+y1An7u/EXxgexzYAJSG+wbgr8LpJ4Evm5l5vQ6iF5ljZjZe\\ndmk07kHAB0E/+Uti4ouA8S+GQkl7dx//MhpvE35xlL6nT5kulHyxTExPtHOC5YUp06XtoTgNTslr\\nwzal2yp48Dkdxr/0PFw2Ph2um/QaJuZLn2fjr9mpqgn3ZcCBkvmDwC9XauPuOTM7DVwBHK9FJ0Xk\\n8mVmJMOSilw+5nSYYWabzKzXzHr7+/vnctMiIg2lmnA/BHSXzC8Pl5VtY2YpoIPgh9VJ3H2zu/e4\\ne09XV9fF9VhERGZUTbhvB9aY2SozawLuBbZMabMF+N1w+reAH6jeLiJSPzPW3MMa+v3ANoJDIb/m\\n7jvN7CGg1923AP8IfMPM+oATBF8AIiJSJ1Ud5+7uW4GtU5Z9qmR6BPhgbbsmIiIXq/GO2xIRaQAK\\ndxGRGFK4i4jEUN3uxGRm/cD+C3hJJ415UpQ+d+Np1M+uz12dFe4+47HkdQv3C2VmvdXcWipu9Lkb\\nT6N+dn3u2lJZRkQkhhTuIiIxFKVw31zvDtSJPnfjadTPrs9dQ5GpuYuISPWiNHIXEZEqRSLczWy9\\nme0xsz4ze7De/ZktZtZtZs+Y2S4z22lmD4TLF5nZ98zs9fB5Yb37OhvMLGlmL5nZd8P5VWb2fLjf\\n/0944bpYMbMFZvakmb1mZrvN7F2NsL/N7I/Df+OvmtljZtYcx/1tZl8zs2Nm9mrJsrL71wJfCj//\\nDjO76VK2fdmHe8lt/u4C1gEbzWxdfXs1a3LAJ919HXAr8Inwsz4IPO3ua4Cnw/k4egDYXTL/aeAL\\n7n4tcJLgdo5x87fAv7r7zwPvJPj8sd7fZrYM+EOgx92vI7ggYfH2nHHb348C66csq7R/7wLWhI9N\\nwCOXsuHLPtwpuc2fu2eB4m3+YsfdD7v7T8PpQYL/0ZcRfN5/Cpv9E/CB+vRw9pjZcuC/AF8N5w34\\nVYLbNkIMP7eZdQD/ieCqqrh71t1P0QD7m+CihS3h/R9agcPEcH+7+48IrpRbqtL+3QB83QPPAQvM\\nbOnFbjsK4V7uNn/L6tSXOWNmK4EbgeeBJe5+OFx1BFhSp27Npi8CfwYUwvkrgFPungvn47jfVwH9\\nwP8Ky1FfNbN5xHx/u/sh4HPAWwShfhp4kfjv76JK+7emWReFcG84ZtYG/F/gj9z9TOm68CYosTrE\\nycx+DTjm7i/Wuy9zLAXcBDzi7jcCQ0wpwcR0fy8kGKWuAq4C5nF+6aIhzOb+jUK4V3Obv9gwszRB\\nsH/T3b8dLj5a/PMsfD5Wr/7NktuBe8xsH0HZ7VcJatELwj/bIZ77/SBw0N2fD+efJAj7uO/vO4E3\\n3b3f3ceAbxP8G4j7/i6qtH9rmnVRCPdqbvMXC2Gd+R+B3e7++ZJVpbcx/F3g/81132aTu/+5uy93\\n95UE+/cH7v7bwDMEt22EeH7uI8ABM3tHuOgOYBcx398E5Zhbzaw1/Ddf/Nyx3t8lKu3fLcBHw6Nm\\nbgVOl5RvLpy7X/YP4G5gL/Az4C/q3Z9Z/JzvJvgTbQfwcvi4m6D+/DTwOvB9YFG9+zqL/w3eC3w3\\nnF4NvAD0Ad8CMvXu3yx83huA3nCffwdY2Aj7G/gfwGvAq8A3gEwc9zfwGMHvCmMEf6ndV2n/AkZw\\nZODPgFcIjia66G3rDFURkRiKQllGREQukMJdRCSGFO4iIjGkcBcRiSGFu4hIDCncRURiSOEuIhJD\\nCncRkRj6//EIu1w3eV/GAAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7fdd9619fdd8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy as np\\n\",\n    \"%matplotlib inline\\n\",\n    \"\\n\",\n    \"# Number of gradient descent steps, each over a batch_size amount of data.\\n\",\n    \"vocab_size = 40000\\n\",\n    \"\\n\",\n    \"# Uniform chance of guessing any word. \\n\",\n    \"loss_random_guess = np.log(float(vocab_size))\\n\",\n    \"print(\\\"Loss for uniformly random guessing is\\\", loss_random_guess)\\n\",\n    \"\\n\",\n    \"sent_length = [5, 10, 25]\\n\",\n    \"# Outputs correct target x percent of the time. \\n\",\n    \"pred_accuracy = np.arange(100)\\n\",\n    \"\\n\",\n    \"plt.plot(pred_accuracy, [1./p for p in pred_accuracy])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 27,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"99\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.legend.Legend at 0x7f2374029358>\"\n      ]\n     },\n     \"execution_count\": 27,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x7f2374281048>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy as np\\n\",\n    \"%matplotlib inline\\n\",\n    \"plt.style.use('ggplot')\\n\",\n    \"plt.rcParams['figure.figsize'] = 10, 8\\n\",\n    \"def _sample(logits, t):\\n\",\n    \"    res = logits / t\\n\",\n    \"    res = np.exp(res) / np.sum(np.exp(res))\\n\",\n    \"    return res\\n\",\n    \"\\n\",\n    \"N = 100\\n\",\n    \"x = np.arange(N)\\n\",\n    \"before = np.array([1.0+i**2 for i in range(N)])\\n\",\n    \"before /= before.sum()\\n\",\n    \"\\n\",\n    \"plt.plot(x, before, 'b--', label='before')\\n\",\n    \"\\n\",\n    \"after = _sample(before, 0.1)\\n\",\n    \"plt.plot(x, after, 'g--', label='temp=0.01')\\n\",\n    \"\\n\",\n    \"after = _sample(before, 0.2)\\n\",\n    \"print(after.argmax())\\n\",\n    \"plt.plot(x, after, 'r--', label='temp=0.001')\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \" plot(*args, **kwargs)\\n\",\n      \"\\n\",\n      \"Plot lines and/or markers to the\\n\",\n      \":class:`~matplotlib.axes.Axes`.  *args* is a variable length\\n\",\n      \"argument, allowing for multiple *x*, *y* pairs with an\\n\",\n      \"optional format string.  For example, each of the following is\\n\",\n      \"legal::\\n\",\n      \"\\n\",\n      \"    plot(x, y)        # plot x and y using default line style and color\\n\",\n      \"    plot(x, y, 'bo')  # plot x and y using blue circle markers\\n\",\n      \"    plot(y)           # plot y using x as index array 0..N-1\\n\",\n      \"    plot(y, 'r+')     # ditto, but with red plusses\\n\",\n      \"\\n\",\n      \"If *x* and/or *y* is 2-dimensional, then the corresponding columns\\n\",\n      \"will be plotted.\\n\",\n      \"\\n\",\n      \"If used with labeled data, make sure that the color spec is not\\n\",\n      \"included as an element in data, as otherwise the last case\\n\",\n      \"``plot(\\\"v\\\",\\\"r\\\", data={\\\"v\\\":..., \\\"r\\\":...)``\\n\",\n      \"can be interpreted as the first case which would do ``plot(v, r)``\\n\",\n      \"using the default line style and color.\\n\",\n      \"\\n\",\n      \"If not used with labeled data (i.e., without a data argument),\\n\",\n      \"an arbitrary number of *x*, *y*, *fmt* groups can be specified, as in::\\n\",\n      \"\\n\",\n      \"    a.plot(x1, y1, 'g^', x2, y2, 'g-')\\n\",\n      \"\\n\",\n      \"Return value is a list of lines that were added.\\n\",\n      \"\\n\",\n      \"By default, each line is assigned a different style specified by a\\n\",\n      \"'style cycle'.  To change this behavior, you can edit the\\n\",\n      \"axes.prop_cycle rcParam.\\n\",\n      \"\\n\",\n      \"The following format string characters are accepted to control\\n\",\n      \"the line style or marker:\\n\",\n      \"\\n\",\n      \"================    ===============================\\n\",\n      \"character           description\\n\",\n      \"================    ===============================\\n\",\n      \"``'-'``             solid line style\\n\",\n      \"``'--'``            dashed line style\\n\",\n      \"``'-.'``            dash-dot line style\\n\",\n      \"``':'``             dotted line style\\n\",\n      \"``'.'``             point marker\\n\",\n      \"``','``             pixel marker\\n\",\n      \"``'o'``             circle marker\\n\",\n      \"``'v'``             triangle_down marker\\n\",\n      \"``'^'``             triangle_up marker\\n\",\n      \"``'<'``             triangle_left marker\\n\",\n      \"``'>'``             triangle_right marker\\n\",\n      \"``'1'``             tri_down marker\\n\",\n      \"``'2'``             tri_up marker\\n\",\n      \"``'3'``             tri_left marker\\n\",\n      \"``'4'``             tri_right marker\\n\",\n      \"``'s'``             square marker\\n\",\n      \"``'p'``             pentagon marker\\n\",\n      \"``'*'``             star marker\\n\",\n      \"``'h'``             hexagon1 marker\\n\",\n      \"``'H'``             hexagon2 marker\\n\",\n      \"``'+'``             plus marker\\n\",\n      \"``'x'``             x marker\\n\",\n      \"``'D'``             diamond marker\\n\",\n      \"``'d'``             thin_diamond marker\\n\",\n      \"``'|'``             vline marker\\n\",\n      \"``'_'``             hline marker\\n\",\n      \"================    ===============================\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"The following color abbreviations are supported:\\n\",\n      \"\\n\",\n      \"==========  ========\\n\",\n      \"character   color\\n\",\n      \"==========  ========\\n\",\n      \"'b'         blue\\n\",\n      \"'g'         green\\n\",\n      \"'r'         red\\n\",\n      \"'c'         cyan\\n\",\n      \"'m'         magenta\\n\",\n      \"'y'         yellow\\n\",\n      \"'k'         black\\n\",\n      \"'w'         white\\n\",\n      \"==========  ========\\n\",\n      \"\\n\",\n      \"In addition, you can specify colors in many weird and\\n\",\n      \"wonderful ways, including full names (``'green'``), hex\\n\",\n      \"strings (``'#008000'``), RGB or RGBA tuples (``(0,1,0,1)``) or\\n\",\n      \"grayscale intensities as a string (``'0.8'``).  Of these, the\\n\",\n      \"string specifications can be used in place of a ``fmt`` group,\\n\",\n      \"but the tuple forms can be used only as ``kwargs``.\\n\",\n      \"\\n\",\n      \"Line styles and colors are combined in a single format string, as in\\n\",\n      \"``'bo'`` for blue circles.\\n\",\n      \"\\n\",\n      \"The *kwargs* can be used to set line properties (any property that has\\n\",\n      \"a ``set_*`` method).  You can use this to set a line label (for auto\\n\",\n      \"legends), linewidth, anitialising, marker face color, etc.  Here is an\\n\",\n      \"example::\\n\",\n      \"\\n\",\n      \"    plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2)\\n\",\n      \"    plot([1,2,3], [1,4,9], 'rs',  label='line 2')\\n\",\n      \"    axis([0, 4, 0, 10])\\n\",\n      \"    legend()\\n\",\n      \"\\n\",\n      \"If you make multiple lines with one plot command, the kwargs\\n\",\n      \"apply to all those lines, e.g.::\\n\",\n      \"\\n\",\n      \"    plot(x1, y1, x2, y2, antialiased=False)\\n\",\n      \"\\n\",\n      \"Neither line will be antialiased.\\n\",\n      \"\\n\",\n      \"You do not need to use format strings, which are just\\n\",\n      \"abbreviations.  All of the line properties can be controlled\\n\",\n      \"by keyword arguments.  For example, you can set the color,\\n\",\n      \"marker, linestyle, and markercolor with::\\n\",\n      \"\\n\",\n      \"    plot(x, y, color='green', linestyle='dashed', marker='o',\\n\",\n      \"         markerfacecolor='blue', markersize=12).\\n\",\n      \"\\n\",\n      \"See :class:`~matplotlib.lines.Line2D` for details.\\n\",\n      \"\\n\",\n      \"The kwargs are :class:`~matplotlib.lines.Line2D` properties:\\n\",\n      \"\\n\",\n      \"  agg_filter: unknown\\n\",\n      \"  alpha: float (0.0 transparent through 1.0 opaque) \\n\",\n      \"  animated: [True | False] \\n\",\n      \"  antialiased or aa: [True | False] \\n\",\n      \"  axes: an :class:`~matplotlib.axes.Axes` instance \\n\",\n      \"  clip_box: a :class:`matplotlib.transforms.Bbox` instance \\n\",\n      \"  clip_on: [True | False] \\n\",\n      \"  clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] \\n\",\n      \"  color or c: any matplotlib color \\n\",\n      \"  contains: a callable function \\n\",\n      \"  dash_capstyle: ['butt' | 'round' | 'projecting'] \\n\",\n      \"  dash_joinstyle: ['miter' | 'round' | 'bevel'] \\n\",\n      \"  dashes: sequence of on/off ink in points \\n\",\n      \"  drawstyle: ['default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post'] \\n\",\n      \"  figure: a :class:`matplotlib.figure.Figure` instance \\n\",\n      \"  fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top' | 'none'] \\n\",\n      \"  gid: an id string \\n\",\n      \"  label: string or anything printable with '%s' conversion. \\n\",\n      \"  linestyle or ls: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''``]\\n\",\n      \"  linewidth or lw: float value in points \\n\",\n      \"  marker: :mod:`A valid marker style <matplotlib.markers>`\\n\",\n      \"  markeredgecolor or mec: any matplotlib color \\n\",\n      \"  markeredgewidth or mew: float value in points \\n\",\n      \"  markerfacecolor or mfc: any matplotlib color \\n\",\n      \"  markerfacecoloralt or mfcalt: any matplotlib color \\n\",\n      \"  markersize or ms: float \\n\",\n      \"  markevery: [None | int | length-2 tuple of int | slice | list/array of int | float | length-2 tuple of float]\\n\",\n      \"  path_effects: unknown\\n\",\n      \"  picker: float distance in points or callable pick function ``fn(artist, event)`` \\n\",\n      \"  pickradius: float distance in points \\n\",\n      \"  rasterized: [True | False | None] \\n\",\n      \"  sketch_params: unknown\\n\",\n      \"  snap: unknown\\n\",\n      \"  solid_capstyle: ['butt' | 'round' |  'projecting'] \\n\",\n      \"  solid_joinstyle: ['miter' | 'round' | 'bevel'] \\n\",\n      \"  transform: a :class:`matplotlib.transforms.Transform` instance \\n\",\n      \"  url: a url string \\n\",\n      \"  visible: [True | False] \\n\",\n      \"  xdata: 1D array \\n\",\n      \"  ydata: 1D array \\n\",\n      \"  zorder: any number \\n\",\n      \"\\n\",\n      \"kwargs *scalex* and *scaley*, if defined, are passed on to\\n\",\n      \":meth:`~matplotlib.axes.Axes.autoscale_view` to determine\\n\",\n      \"whether the *x* and *y* axes are autoscaled; the default is\\n\",\n      \"*True*.\\n\",\n      \"\\n\",\n      \".. note::\\n\",\n      \"    In addition to the above described arguments, this function can take a\\n\",\n      \"    **data** keyword argument. If such a **data** argument is given, the\\n\",\n      \"    following arguments are replaced by **data[<arg>]**:\\n\",\n      \"\\n\",\n      \"    * All arguments with the following names: 'x', 'y'.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"np.info(plt.plot)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "requirements.txt",
    "content": "Pympler==0.5\nsetuptools==35.0.1\nPyYAML==3.12\nnltk>=3.2.2\nnumpy>=1.11.0\npandas>=0.19.2\ntensorflow==1.2.0rc2\n"
  },
  {
    "path": "setup.py",
    "content": "from setuptools import setup\n\nsetup(name='DeepChatModels',\n        description='Conversation Models in TensorFlow',\n        url='http://github.com/mckinziebrandon/DeepChatModels',\n        author_email='mckinziebrandon@berkeley.edu',\n        license='MIT',\n        install_requires=[\n            'numpy',\n            'matplotlib',\n            'pandas',\n            'pyyaml',\n            ],\n        extras_require={'tensorflow': ['tensorflow'],\n            'tensorflow gpu': ['tensorflow-gpu']},\n        zip_safe=False)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/test_config.py",
    "content": "\"\"\"Tests for various operations done on config (yaml) dictionaries in project.\"\"\"\n\nimport os\nimport pydoc\nimport yaml\nimport logging\nimport unittest\nimport tensorflow as tf\nfrom utils import io_utils\nimport chatbot\nimport data\ndir = os.path.dirname(os.path.realpath(__file__))\nfrom tests.utils import *\n\n\nclass TestConfig(unittest.TestCase):\n    \"\"\"Test behavior of tf.contrib.rnn after migrating to r1.0.\"\"\"\n\n    def setUp(self):\n        with open(TEST_CONFIG_PATH) as f:\n            # So we can always reference default vals.\n            self.test_config = yaml.load(f)\n\n    def test_merge_params(self):\n        \"\"\"Checks how parameters passed to TEST_FLAGS interact with\n        parameters from yaml files. Expected behavior is that any\n        params in TEST_FLAGS will override those from files, but that\n        all values from file will be used if not explicitly passed to\n        TEST_FLAGS.\n        \"\"\"\n\n        config = io_utils.parse_config(flags=TEST_FLAGS)\n\n        # ==============================================================\n        # Easy tests.\n        # ==============================================================\n\n        # Change model in test_flags and ensure merged config uses that model.\n        config = update_config(config, model='ChatBot')\n        self.assertEqual(config['model'], 'ChatBot')\n\n        # Also ensure that switching back works too.\n        config = update_config(config, model='DynamicBot')\n        self.assertEqual(config['model'], 'DynamicBot')\n\n        # Do the same for changing the dataset.\n        config = update_config(config, dataset='TestData')\n        self.assertEqual(config['dataset'], 'TestData')\n\n        # ==============================================================\n        # Medium tests.\n        # ==============================================================\n\n        # Ensure recursive merging works.\n        config = update_config(\n            config,\n            batch_size=123,\n            dropout_prob=0.8)\n        logging.info(config)\n        self.assertEqual(config['model'], self.test_config['model'])\n        self.assertEqual(config['dataset'], self.test_config['dataset'])\n        self.assertNotEqual(config['model_params'], self.test_config['model_params'])\n\n    def test_optimize(self):\n        \"\"\"Ensure the new optimize config flag works. \n        \n        Right now, 'works' means it correctly determiens the true vocab \n        size, updates it in the config file, and updates any assoc. file names.\n        \"\"\"\n\n        config = io_utils.parse_config(flags=TEST_FLAGS)\n        logging.info(config)\n\n        # Manually set vocab size to huge (non-optimal for TestData) value.\n        config = io_utils.update_config(config=config, vocab_size=99999)\n        self.assertEqual(config['dataset_params']['vocab_size'], 99999)\n        self.assertEqual(config['dataset_params']['config_path'], TEST_CONFIG_PATH)\n\n        # Instantiate a new dataset.\n        # This where the 'optimize' flag comes into play, since\n        # the dataset object is responsible for things like checking\n        # data file paths and unique words.\n        logging.info(\"Setting up %s dataset.\", config['dataset'])\n        logging.info(\"Passing %r for dataset_params\", config['dataset_params'])\n        dataset_class = pydoc.locate(config['dataset']) \\\n                        or getattr(data, config['dataset'])\n        dataset = dataset_class(config['dataset_params'])\n        self.assertIsInstance(dataset, data.TestData)\n        self.assertNotEqual(dataset.vocab_size, 99999)\n\n    def test_update_config(self):\n        \"\"\"Test the new function in io_utils.py\"\"\"\n\n        logging.info(os.getcwd())\n        config = io_utils.get_yaml_config(TEST_CONFIG_PATH)\n        config['model_params']['ckpt_dir'] = TEST_FLAGS.model_params['ckpt_dir']\n        self.assertIsInstance(config, dict)\n        self.assertTrue('model' in config)\n        self.assertTrue('dataset' in config)\n        self.assertTrue('dataset_params' in config)\n        self.assertTrue('model_params' in config)\n\n        config = io_utils.update_config(\n            config_path=TEST_CONFIG_PATH,\n            return_config=True,\n            vocab_size=1234)\n\n        self.assertEqual(config['dataset_params']['vocab_size'], 1234)\n\n\nif __name__ == '__main__':\n    unittest.main()\n\n"
  },
  {
    "path": "tests/test_config.yml",
    "content": "dataset: TestData\ndataset_params:\n  config_path: /home/brandon/Documents/DeepChatModels/tests/test_config.yml\n  max_seq_len: 15\n  optimize_params: true\n  vocab_size: 121\nmodel: DynamicBot\nmodel_params:\n  base_cell: GRUCell\n  batch_size: 16\n  decode: false\n  embed_size: 32\n  learning_rate: 0.002\n  max_steps: 100\n  num_layers: 1\n  reset_model: true\n  state_size: 128\n  steps_per_ckpt: 25\n"
  },
  {
    "path": "tests/test_data/train_from.txt",
    "content": "One.\nTwo.\nThree.\nFour.\nFive.\nSix.\nSeven.\nEight.\nNine.\nHello.\nWhat is your name?\nDo you like ice cream?\nWho is the president of the United States?\nWho is your favorite president?\nPlease be nice.\nAre you intelligent?\nTell me your favorite color.\nCount to five.\nHi.\nWhat's up?\nHow's it going?\nWhat are you up to?\nAre you okay?\nI like cats.\nSay firetruck.\nSay lasagne.\nDo robots have free will?\nYou aren't very talkative.\nCows say moo.\nWhat sound does a duck make?\nWho did you vote for?\nDo you watch TV?\nSorry.\nThank you.\nHave a nice day.\nDo you think?\nWhere can I hide a dead body?\n"
  },
  {
    "path": "tests/test_data/train_from.txt.ids121",
    "content": "36 4\n23 4\n20 4\n27 4\n18 4\n58 4\n47 4\n51 4\n44 4\n46 4\n13 12 24 106 5\n11 6 42 54 35 5\n28 12 14 16 31 14 41 38 5\n28 12 24 17 16 5\n97 30 19 4\n10 6 107 5\n99 117 24 17 55 4\n69 53 18 4\n33 4\n13 9 26 32 5\n45 9 26 40 94 5\n13 10 6 32 53 5\n10 6 43 5\n8 42 67 4\n25 52 4\n25 56 4\n11 101 22 70 50 5\n6 72 9 15 74 96 4\n80 25 77 4\n13 76 98 21 95 91 5\n28 90 6 92 116 5\n11 6 86 82 5\n79 4\n62 6 4\n22 21 19 112 4\n11 6 49 5\n81 109 8 64 21 103 87 5\n"
  },
  {
    "path": "tests/test_data/train_to.txt",
    "content": "Two.\nThree.\nFour.\nFive.\nSix.\nSeven.\nEight.\nNine.\nTen.\nHi.\nI am Groot.\nI hate ice cream.\nSatan is the president of the United States.\nBarack Obama is my favorite president.\nOkay, I will be nice.\nI don't know.\nMy favorite color is blue.\nOne, two, three, four, five.\nHello.\nNot much, you?\nGood, how about you?\nJust hanging out.\nYeah, I'm fine.\nDogs are better.\nFiretruck.\nLasagne.\nI don't know.\nNeither are you.\nNo, they do not.\nQuack.\nWatson.\nNo, I don't have eyes.\nIt's fine.\nYou are welcome.\nThanks, you too.\nDo I think what?\nThe scrapyard, with everyone else.\n"
  },
  {
    "path": "tests/test_data/train_to.txt.ids121",
    "content": "23 4\n20 4\n27 4\n18 4\n58 4\n47 4\n51 4\n44 4\n113 4\n33 4\n8 115 104 4\n8 75 54 35 4\n118 12 14 16 31 14 41 38 4\n68 108 12 48 17 16 4\n43 7 8 50 30 19 4\n8 29 9 15 57 4\n48 17 55 12 65 4\n36 7 23 7 20 7 27 7 18 4\n46 4\n34 100 7 6 5\n60 7 45 61 6 5\n114 78 59 4\n83 7 8 9 71 37 4\n102 10 120 4\n52 4\n56 4\n8 29 9 15 57 4\n84 10 6 4\n39 7 111 11 34 4\n88 4\n110 4\n39 7 8 29 9 15 22 105 4\n40 9 26 37 4\n6 10 66 4\n93 7 6 63 4\n11 8 49 13 5\n14 85 7 73 89 119 4\n"
  },
  {
    "path": "tests/test_data/valid_from.txt",
    "content": "Are you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\n"
  },
  {
    "path": "tests/test_data/valid_from.txt.ids121",
    "content": "10 6 3 5\n62 6 4\n28 12 21 60 3 5\n10 67 120 3 102 5\n10 6 3 5\n62 6 4\n28 12 21 60 3 5\n10 67 120 3 102 5\n10 6 3 5\n62 6 4\n28 12 21 60 3 5\n10 67 120 3 102 5\n10 6 3 5\n62 6 4\n28 12 21 60 3 5\n10 67 120 3 102 5\n"
  },
  {
    "path": "tests/test_data/valid_to.txt",
    "content": "No, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\n"
  },
  {
    "path": "tests/test_data/valid_to.txt.ids121",
    "content": "39 7 8 115 34 3 4\n6 10 66 4\n8 115 21 60 3 4\n3 7 67 10 120 3 102 4\n39 7 8 115 34 3 4\n6 10 66 4\n8 115 21 60 3 4\n3 7 67 10 120 3 102 4\n39 7 8 115 34 3 4\n6 10 66 4\n8 115 21 60 3 4\n3 7 67 10 120 3 102 4\n39 7 8 115 34 3 4\n6 10 66 4\n8 115 21 60 3 4\n3 7 67 10 120 3 102 4\n"
  },
  {
    "path": "tests/test_data/vocab121.txt",
    "content": "_PAD\n_GO\n_EOS\n_UNK\n.\n?\nyou\n,\ni\n'\nare\nis\ndo\nwhat\nthe\nt\nfavorite\nfive\npresident\ns\nthree\nhave\nfour\nwho\nnice\nyour\ndon\nsay\na\ntwo\none\nbe\nto\nup\nmy\nthink\nno\nwill\nit\nhello\nfiretruck\ncolor\nokay\nknow\ncream\nseven\neight\nhi\nstates\nof\nlike\nfine\nsix\nnot\nhow\nice\nunited\nlasagne\nnine\nthank\nm\ngood\ntv\nme\nfree\nbetter\nam\nsatan\nyeah\nthey\nday\ngroot\nname\nsorry\nwelcome\nmoo\nthanks\ndid\nsound\ncount\ncows\nscrapyard\naren\nhanging\neyes\nwhere\ngoing\ndead\nplease\nabout\nneither\nintelligent\ndogs\ncan\nout\nblue\nfor\ntoo\nwith\nwatson\nbarack\nmake\neveryone\ntell\ntalkative\nduck\nhide\nten\nmuch\nrobots\njust\ndoes\nvery\nquack\nobama\nhate\nvote\nelse\nbody\nwatch\ncats\n"
  },
  {
    "path": "tests/test_data.py",
    "content": "import logging\nimport pdb\nimport sys\nsys.path.append(\"..\")\nimport os\nimport unittest\nimport tensorflow as tf\nfrom pydoc import locate\nimport chatbot\nfrom utils import io_utils\nimport data\nfrom chatbot.globals import DEFAULT_FULL_CONFIG\ndir = os.path.dirname(os.path.realpath(__file__))\nfrom tests.utils import *\n\n\nclass TestData(unittest.TestCase):\n    \"\"\"Tests for the datsets.\"\"\"\n\n    def setUp(self):\n        logging.basicConfig(level=logging.INFO)\n        tf.logging.set_verbosity('ERROR')\n        self.supported_datasets = ['Reddit', 'Ubuntu', 'Cornell']\n        self.default_flags = {\n            'pretrained_dir': TEST_FLAGS.pretrained_dir,\n            'config': TEST_FLAGS.config,\n            'model': TEST_FLAGS.model,\n            'debug': TEST_FLAGS.debug}\n\n    def test_basic(self):\n        \"\"\"Instantiate all supported datasets and check they satisfy basic conditions.\n        \n        THIS MAY TAKE A LONG TIME TO COMPLETE. Since we are testing that the \n        supported datasets can be instantiated successfully, it necessarily \n        means that the data must exist in proper format. Since the program\n        will generate the proper format(s) if not found, this will take \n        about 15 minutes if run from a completely fresh setup.\n        \n        Otherwise, a few seconds. :)\n        \"\"\"\n\n        if os.getenv('DATA') is None \\\n            and not os.path.exists('/home/brandon/Datasets'):\n            print('To run this test, please enter the path to your datasets: ')\n            data_dir = input()\n        else:\n            data_dir = '/home/brandon/Datasets'\n\n        for dataset_name in self.supported_datasets:\n            logging.info('Testing %s', dataset_name)\n\n            incomplete_params = {\n                'vocab_size': 40000,\n                'max_seq_len': 10}\n            self.assertIsNotNone(incomplete_params)\n            dataset_class = getattr(data, dataset_name)\n            # User must specify data_dir, which we have not done yet.\n            self.assertRaises(ValueError, dataset_class, incomplete_params)\n\n            config = io_utils.parse_config(flags=TEST_FLAGS)\n            dataset_params = config.get('dataset_params')\n            dataset_params['data_dir'] = os.path.join(\n                data_dir,\n                dataset_name.lower())\n            dataset = dataset_class(dataset_params)\n\n            # Ensure all params from DEFAULT_FULL_CONFIG['dataset_params']\n            # are set to a value in our dataset object.\n            for default_key in DEFAULT_FULL_CONFIG['dataset_params']:\n                self.assertIsNotNone(getattr(dataset, default_key))\n\n            # Check that all dataset properties exist.\n            self.assertIsNotNone(dataset.name)\n            self.assertIsNotNone(dataset.word_to_idx)\n            self.assertIsNotNone(dataset.idx_to_word)\n            self.assertIsNotNone(dataset.vocab_size)\n            self.assertIsNotNone(dataset.max_seq_len)\n\n            # Check that the properties satisfy basic expectations.\n            self.assertEqual(len(dataset.word_to_idx), len(dataset.idx_to_word))\n            self.assertEqual(len(dataset.word_to_idx), dataset.vocab_size)\n            self.assertEqual(len(dataset.idx_to_word), dataset.vocab_size)\n\n            incomplete_params.clear()\n            dataset_params.clear()\n\n    def test_cornell(self):\n        \"\"\"Train a bot on cornell and display responses when given\n        training data as input -- a sanity check that the data is clean.\n        \"\"\"\n\n        flags = Flags(\n            model_params=dict(\n                ckpt_dir='out/tests/test_cornell',\n                reset_model=True,\n                steps_per_ckpt=50,\n                base_cell='GRUCell',\n                num_layers=1,\n                state_size=128,\n                embed_size=64,\n                max_steps=50),\n            dataset_params=dict(\n                vocab_size=50000,\n                max_seq_len=8,\n                data_dir='/home/brandon/Datasets/cornell'),\n            dataset='Cornell',\n            **self.default_flags)\n\n        bot, dataset = create_bot(flags=flags, return_dataset=True)\n        bot.train()\n\n        del bot\n\n        # Recreate bot (its session is automatically closed after training).\n        flags.model_params['reset_model'] = False\n        flags.model_params['decode'] = True\n        bot, dataset = create_bot(flags, return_dataset=True)\n\n        for inp_sent, resp_sent in dataset.pairs_generator(100):\n            print('\\nHuman:', inp_sent)\n            response = bot.respond(inp_sent)\n            if response == resp_sent:\n                print('Robot: %s\\nCorrect!' % response)\n            else:\n                print('Robot: %s\\nExpected: %s' % (\n                    response, resp_sent))\n\n\nif __name__ == '__main__':\n    tf.logging.set_verbosity('ERROR')\n    unittest.main()\n"
  },
  {
    "path": "tests/test_dynamic_models.py",
    "content": "\"\"\"Trial runs on DynamicBot with the TestData Dataset.\"\"\"\n\nimport time\nimport logging\nimport unittest\n\nimport numpy as np\nimport tensorflow as tf\nimport pydoc\nfrom pydoc import locate\n\nimport data\nimport chatbot\nfrom utils import io_utils, bot_freezer\nfrom tests.utils import *\n\n\nclass TestDynamicModels(unittest.TestCase):\n\n    def setUp(self):\n        tf.logging.set_verbosity('ERROR')\n\n    def test_create_bot(self):\n        \"\"\"Ensure bot constructor is error-free.\"\"\"\n        logging.info(\"Creating bot . . . \")\n        bot = create_bot()\n        self.assertIsInstance(bot, chatbot.DynamicBot)\n\n    def test_save_bot(self):\n        \"\"\"Ensure we can save to bot ckpt dir.\"\"\"\n        bot = create_bot()\n        self.assertIsInstance(bot, chatbot.DynamicBot)\n\n    def test_save_bot(self):\n        \"\"\"Ensure teardown operations are working.\"\"\"\n        bot = create_bot()\n        self.assertIsInstance(bot, chatbot.DynamicBot)\n        logging.info(\"Closing bot . . . \")\n        bot.close()\n\n    def test_train(self):\n        \"\"\"Simulate a brief training session.\"\"\"\n        flags = TEST_FLAGS\n        flags = flags._replace(model_params=dict(\n            **flags.model_params,\n            reset_model=True,\n            steps_per_ckpt=10))\n        bot = create_bot(flags)\n        self._quick_train(bot)\n\n    def test_base_methods(self):\n        \"\"\"Call each method in chatbot._models.Model, checking for errors.\"\"\"\n        bot = create_bot()\n        logging.info('Calling bot.save() . . . ')\n        bot.save()\n        logging.info('Calling bot.freeze() . . . ')\n        bot.freeze()\n        logging.info('Calling bot.close() . . . ')\n        bot.close()\n\n    def test_manual_freeze(self):\n        \"\"\"Make sure we can freeze the bot, unfreeze, and still chat.\"\"\"\n\n        # ================================================\n        # 1. Create & train bot.\n        # ================================================\n        flags = TEST_FLAGS\n        flags = flags._replace(model_params=dict(\n            ckpt_dir=os.path.join(TEST_DIR, 'out'),\n            reset_model=True,\n            steps_per_ckpt=20,\n            max_steps=40))\n        bot = create_bot(flags)\n        self.assertEqual(bot.reset_model, True)\n        # Simulate small train sesh on bot.\n        bot.train()\n\n        # ================================================\n        # 2. Recreate a chattable bot.\n        # ================================================\n        # Recreate bot from scratch with decode set to true.\n        logging.info(\"Resetting default graph . . . \")\n        tf.reset_default_graph()\n        flags = flags._replace(model_params={\n            **flags.model_params,\n            'reset_model': False,\n            'decode': True,\n            'max_steps': 100,\n            'steps_per_ckpt': 50})\n        self.assertTrue(flags.model_params.get('decode'))\n        bot = create_bot(flags)\n        self.assertTrue(bot.is_chatting)\n        self.assertTrue(bot.decode)\n\n        print(\"Testing quick chat sesh . . . \")\n        config = io_utils.parse_config(flags=flags)\n        dataset_class = pydoc.locate(config['dataset']) \\\n                        or getattr(data, config['dataset'])\n        dataset = dataset_class(config['dataset_params'])\n        test_input = \"How's it going?\"\n        encoder_inputs = io_utils.sentence_to_token_ids(\n            tf.compat.as_bytes(test_input),\n            dataset.word_to_idx)\n        encoder_inputs = np.array([encoder_inputs[::-1]])\n        bot.pipeline._feed_dict = {\n            bot.pipeline.user_input: encoder_inputs}\n\n        # Get output sentence from the chatbot.\n        _, _, response = bot.step(forward_only=True)\n        print(\"Robot:\", dataset.as_words(response[0][:-1]))\n\n        # ================================================\n        # 3. Freeze the chattable bot.\n        # ================================================\n        logging.info(\"Calling bot.freeze() . . . \")\n        bot.freeze()\n\n        # ================================================\n        # 4. Try to unfreeze and use it.\n        # ================================================\n        logging.info(\"Resetting default graph . . . \")\n        tf.reset_default_graph()\n        logging.info(\"Importing frozen graph into default . . . \")\n        frozen_graph = bot_freezer.load_graph(bot.ckpt_dir)\n\n        logging.info(\"Extracting input/output tensors.\")\n        tensors, frozen_graph = bot_freezer.unfreeze_bot(bot.ckpt_dir)\n        self.assertIsNotNone(tensors['inputs'])\n        self.assertIsNotNone(tensors['outputs'])\n\n        with tf.Session(graph=frozen_graph) as sess:\n            raw_input = \"How's it going?\"\n            encoder_inputs  = io_utils.sentence_to_token_ids(\n                tf.compat.as_bytes(raw_input),\n                dataset.word_to_idx)\n            encoder_inputs = np.array([encoder_inputs[::-1]])\n            feed_dict = {tensors['inputs'].name: encoder_inputs}\n            response = sess.run(tensors['outputs'], feed_dict=feed_dict)\n            logging.info('Reponse: %s', response)\n\n\n    def test_memorize(self):\n        \"\"\"Train a bot to memorize (overfit) the small test data, and \n        show its responses to all train inputs when done.\n        \"\"\"\n\n        flags = TEST_FLAGS\n        flags = flags._replace(model_params=dict(\n            ckpt_dir='out/test_data',\n            reset_model=True,\n            steps_per_ckpt=300,\n            state_size=128,\n            embed_size=32,\n            max_steps=300))\n        flags = flags._replace(dataset_params=dict(\n            max_seq_len=20,\n            data_dir=TEST_DATA_DIR))\n        print('TEST_FLAGS', flags.dataset)\n        bot, dataset = create_bot(flags=flags, return_dataset=True)\n        bot.train()\n\n        # Recreate bot (its session is automatically closed after training).\n        flags = flags._replace(model_params={\n            **flags.model_params,\n            'reset_model': False,\n            'decode': True})\n        bot, dataset = create_bot(flags, return_dataset=True)\n\n        for inp_sent, resp_sent in dataset.pairs_generator():\n            print('\\nHuman:', inp_sent)\n            response = bot.respond(inp_sent)\n            if response == resp_sent:\n                print('Robot: %s\\nCorrect!' % response)\n            else:\n                print('Robot: %s\\nExpected: %s' % (\n                    response, resp_sent))\n\n\n    def _quick_train(self, bot, num_iter=10):\n        \"\"\"Quickly train manually on some test data.\"\"\"\n        coord   = tf.train.Coordinator()\n        threads = tf.train.start_queue_runners(sess=bot.sess, coord=coord)\n        for _ in range(num_iter):\n            bot.step()\n        summaries, loss, _ = bot.step()\n        bot.save(summaries=summaries)\n        coord.request_stop()\n        coord.join(threads)\n\n"
  },
  {
    "path": "tests/test_legacy_models.py",
    "content": "import os\nimport tensorflow as tf\nimport unittest\nimport logging\n\nimport sys\nfrom utils import io_utils\nimport data\nimport chatbot\n\nfrom tests.utils import TEST_FLAGS\n\nclass TestLegacyModels(unittest.TestCase):\n    \"\"\"Test behavior of tf.contrib.rnn after migrating to r1.0.\"\"\"\n\n    def setUp(self):\n        self.seq_len = 20\n        self.config = io_utils.parse_config(flags=TEST_FLAGS)\n        self.dataset = data.TestData(self.config['dataset_params'])\n        self.batch_size = 2\n        logging.basicConfig(level=logging.INFO)\n        self.log = logging.getLogger('TestLegacyModels')\n\n    def test_create(self):\n        \"\"\"Test basic functionality of SimpleBot remains up-to-date with _models.\"\"\"\n        simple_bot = chatbot.SimpleBot(\n            dataset=self.dataset,\n            params=self.config)\n        self.assertIsInstance(simple_bot, chatbot.SimpleBot)\n\n        chat_bot = chatbot.ChatBot(\n            buckets=[(10, 10)],\n            dataset=self.dataset,\n            params=self.config)\n        self.assertIsInstance(chat_bot, chatbot.ChatBot)\n\n    def test_compile(self):\n        \"\"\"Test basic functionality of SimpleBot remains up-to-date with _models.\"\"\"\n        buckets = [(10, 20)]\n\n        # SimpleBot\n        logging.info(\"Creating/compiling SimpleBot . . . \")\n        bot = chatbot.SimpleBot(\n            dataset=self.dataset,\n            params=self.config)\n        bot.compile()\n\n        # ChatBot\n        logging.info(\"Creating/compiling ChatBot . . . \")\n        bot = chatbot.ChatBot(\n            buckets=buckets,\n            dataset=self.dataset,\n            params=self.config)\n        bot.compile()\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "tests/utils.py",
    "content": "\"\"\"Utility functions used by test modules.\"\"\"\n\nimport logging\nimport data\nimport chatbot\n\nimport os\nfrom pydoc import locate\nimport pdb\nfrom utils import io_utils\nimport tensorflow as tf\nfrom chatbot.globals import DEFAULT_FULL_CONFIG\nfrom collections import namedtuple\n\nTEST_DIR = os.path.dirname(os.path.realpath(__file__))\nTEST_DATA_DIR = os.path.join(TEST_DIR, 'test_data')\nTEST_CONFIG_PATH = os.path.join(TEST_DIR, 'test_config.yml')\nlogging.basicConfig(level=logging.INFO)\n\n_flag_names = [\"pretrained_dir\",\n               \"config\",\n               \"debug\",\n               \"model\",\n               \"model_params\",\n               \"dataset\",\n               \"dataset_params\"]\nFlags = namedtuple('Flags', _flag_names)\nTEST_FLAGS = Flags(pretrained_dir=None,\n                   config=TEST_CONFIG_PATH,\n                   debug=True,\n                   model='{}',\n                   dataset='{}',\n                   model_params={'ckpt_dir': os.path.join(TEST_DIR, 'out')},\n                   dataset_params={'data_dir': TEST_DATA_DIR})\n\n\ndef create_bot(flags=TEST_FLAGS, return_dataset=False):\n    \"\"\"Chatbot factory: Creates and returns a fresh bot. Nice for \n    testing specific methods quickly.\n    \"\"\"\n    # Wipe the graph and update config if needed.\n    tf.reset_default_graph()\n    config = io_utils.parse_config(flags=flags)\n    io_utils.print_non_defaults(config)\n\n    # Instantiate a new dataset.\n    print(\"Setting up\", config['dataset'], \"dataset.\")\n    dataset_class = locate(config['dataset']) \\\n                    or getattr(data, config['dataset'])\n    dataset = dataset_class(config['dataset_params'])\n\n    # Instantiate a new chatbot.\n    print(\"Creating\", config['model'], \". . . \")\n    bot_class = locate(config['model']) or getattr(chatbot, config['model'])\n    bot = bot_class(dataset, config)\n\n    if return_dataset:\n        return bot, dataset\n    else:\n        return bot\n\n\ndef update_config(config, **kwargs):\n    new_config = {}\n    for key in DEFAULT_FULL_CONFIG:\n        for new_key in kwargs:\n            if new_key in DEFAULT_FULL_CONFIG[key]:\n                if new_config.get(key) is None:\n                    new_config[key] = {}\n                new_config[key][new_key] = kwargs[new_key]\n            elif new_key == key:\n                new_config[new_key] = kwargs[new_key]\n    return {**config, **new_config}\n\n"
  },
  {
    "path": "utils/__init__.py",
    "content": "from utils import io_utils\nfrom utils import bot_freezer\n"
  },
  {
    "path": "utils/bot_freezer.py",
    "content": "\"\"\"Utilities for freezing and unfreezing model graphs and variables on the fly.\"\"\"\n\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport numpy as np\nimport tensorflow as tf\nfrom utils import io_utils\nimport os\nimport re\nfrom pydoc import locate\n\n\ndef load_graph(frozen_model_dir):\n    \"\"\"Load frozen tensorflow graph into the default graph.\n\n    Args:\n        frozen_model_dir: location of protobuf file containing frozen graph.\n\n    Returns:\n        tf.Graph object imported from frozen_model_path.\n    \"\"\"\n\n    # Prase the frozen graph definition into a GraphDef object.\n    frozen_file = os.path.join(frozen_model_dir, \"frozen_model.pb\")\n    with tf.gfile.GFile(frozen_file, \"rb\") as f:\n        graph_def = tf.GraphDef()\n        graph_def.ParseFromString(f.read())\n\n    # Load the graph def into the default graph and return it.\n    with tf.Graph().as_default() as graph:\n        tf.import_graph_def(\n            graph_def,\n            input_map=None,\n            return_elements=None,\n            op_dict=None,\n            producer_op_list=None\n        )\n    return graph\n\n\ndef unfreeze_bot(frozen_model_path):\n    \"\"\"Restores the frozen graph from file and grabs input/output tensors needed to\n    interface with a bot for conversation.\n\n    Args:\n        frozen_model_path: location of protobuf file containing frozen graph.\n\n    Returns:\n        outputs: tensor that can be run in a session.\n    \"\"\"\n\n    bot_graph   = load_graph(frozen_model_path)\n    tensors = {'inputs': bot_graph.get_tensor_by_name('import/input_pipeline/user_input:0'),\n               'outputs': bot_graph.get_tensor_by_name('import/outputs:0')}\n    return tensors, bot_graph\n\n\ndef unfreeze_and_chat(frozen_model_path):\n    \"\"\"Summon a bot back from the dead and have a nice lil chat with it.\"\"\"\n\n    tensor_dict, graph = unfreeze_bot(frozen_model_path)\n    config  = io_utils.parse_config(pretrained_dir=frozen_model_path)\n    word_to_idx, idx_to_word = get_frozen_vocab(config)\n\n    def as_words(sentence):\n        return \" \".join([tf.compat.as_str(idx_to_word[i]) for i in sentence])\n\n    with tf.Session(graph=graph) as sess:\n\n        def respond_to(sentence):\n            \"\"\"Outputs response sentence (string) given input (string).\"\"\"\n\n            # Convert input sentence to token-ids.\n            sentence_tokens = io_utils.sentence_to_token_ids(\n                tf.compat.as_bytes(sentence), word_to_idx)\n            sentence_tokens = np.array([sentence_tokens[::-1]])\n\n            # Get output sentence from the chatbot.\n            fetches = tensor_dict['outputs']\n            feed_dict={tensor_dict['inputs']: sentence_tokens}\n            response = sess.run(fetches=fetches, feed_dict=feed_dict)\n            return as_words(response[0][:-1])\n\n        sentence = io_utils.get_sentence()\n        while sentence != 'exit':\n            resp = respond_to(sentence)\n            print(\"Robot:\", resp)\n            sentence = io_utils.get_sentence()\n        print(\"Farewell, human.\")\n\n\ndef get_frozen_vocab(config):\n    \"\"\"Helper function to get dictionaries for translating between tokens and words.\"\"\"\n    data_dir    = config['dataset_params']['data_dir']\n    vocab_size  = config['dataset_params']['vocab_size']\n    vocab_path = os.path.join(data_dir, 'vocab{}.txt'.format(vocab_size))\n    word_to_idx, idx_to_word = io_utils.get_vocab_dicts(vocab_path)\n    return word_to_idx, idx_to_word\n\n\nclass FrozenBot:\n\n    def __init__(self, frozen_model_dir, vocab_size):\n        print(frozen_model_dir)\n        print(type(frozen_model_dir))\n        self.tensor_dict, self.graph = unfreeze_bot(frozen_model_dir)\n        self.sess = tf.Session(graph=self.graph)\n\n        self.config = {'dataset_params': {\n            'data_dir': frozen_model_dir, 'vocab_size': vocab_size}}\n        self.word_to_idx, self.idx_to_word = self.get_frozen_vocab()\n\n    def as_words(self, sentence):\n        return \" \".join([tf.compat.as_str(self.idx_to_word[i]) for i in sentence])\n\n    def __call__(self, sentence):\n        \"\"\"Outputs response sentence (string) given input (string).\"\"\"\n        # Convert input sentence to token-ids.\n        sentence_tokens = io_utils.sentence_to_token_ids(\n            tf.compat.as_bytes(sentence), self.word_to_idx)\n        sentence_tokens = np.array([sentence_tokens[::-1]])\n\n        # Get output sentence from the chatbot.\n        fetches = self.tensor_dict['outputs']\n        feed_dict={self.tensor_dict['inputs']: sentence_tokens}\n        response = self.sess.run(fetches=fetches, feed_dict=feed_dict)\n        return self.as_words(response[0][:-1])\n\n"
  },
  {
    "path": "utils/io_utils.py",
    "content": "\"\"\"Utilities for downloading data from various datasets, tokenizing, vocabularies.\"\"\"\nfrom __future__ import absolute_import\nfrom __future__ import division\nfrom __future__ import print_function\n\nimport os\nimport re\nimport sys\nimport yaml\nimport copy\nimport pandas as pd\nimport logging\n\nimport tensorflow as tf\nfrom collections import Counter, namedtuple\nfrom tensorflow.python.platform import gfile\nfrom subprocess import Popen, PIPE\nfrom chatbot.globals import DEFAULT_FULL_CONFIG\n\n\n# Special vocabulary symbols.\n_PAD = b\"_PAD\"      # Append to unused space for both encoder/decoder.\n_GO = b\"_GO\"       # Prepend to each decoder input.\n_EOS = b\"_EOS\"      # Append to outputs only. Stopping signal when decoding.\n_UNK = b\"_UNK\"      # For any symbols not in our vocabulary.\n_START_VOCAB = [_PAD, _GO, _EOS, _UNK]\n\n# Enumerations for ease of use by this and other files.\nPAD_ID = 0\nGO_ID = 1\nEOS_ID = 2\nUNK_ID = 3\n\n# Regular expressions used to tokenize.\n_WORD_SPLIT = re.compile(b\"([.,!?\\\"':;)(])\")\n_DIGIT_RE = re.compile(br\"\\d\")\n\n# Build mock FLAGS object for utils to wrap info around if needed.\n# This makes the API more user-friendly, since it takes care of\n# formatting data if the user doesn't do it exactly as expected.\n# Note: I did initially try this with an actual tf.app.flags object,\n# but it was a nightmare.\n_flag_names = [\"pretrained_dir\",\n               \"config\",\n               \"debug\",\n               \"model\",\n               \"model_params\",\n               \"dataset\",\n               \"dataset_params\"]\nFlags = namedtuple('Flags', _flag_names)\n_FLAGS = Flags(pretrained_dir=None,\n               config=None,\n               debug=None,\n               model='{}',\n               dataset='{}',\n               model_params='{}',\n               dataset_params='{}')\n\n\ndef save_hyper_params(hyper_params, fname):\n    # Append to file if exists, else create.\n    df = pd.DataFrame(hyper_params)\n    with open(fname, 'a+') as f:\n        df.to_csv(f, header=False)\n\n\ndef get_sentence(lower=True):\n    \"\"\"Simple function to prompt user for input and return it w/o newline.\n    Frequently used in chat sessions, of course.\n    \"\"\"\n    sys.stdout.write(\"Human: \")\n    sys.stdout.flush()\n    sentence = input()\n    if lower:\n        return sentence.lower()\n    return sentence\n\n\ndef update_config(config=None,\n                  config_path=None,\n                  return_config=True,\n                  **kwargs):\n    \"\"\"Update contents of a config file, overwriting any that \n    match those in kwargs.\n   \n    Args:\n        config: (dict) subset of DEFAULT_FULL_CONFIG.\n        config_path: (str) location of a yaml config file.\n        return_config: (bool) whether or not to return the config dictionary.\n        kwargs: key-value pairs to update in the config dictionary and/or file.\n         \n    At least one of {config, config_path} must be not None. If both are not\n    None, then we update the config dictionary with the kwargs, and then set\n    the file at config_path to match updated dictionary contents. \n    \n    In other words, if config is not None, we do won't consider the contents \n    of config_path when doing the updates.\n    \"\"\"\n\n    if config is None and config_path is None:\n        raise ValueError(\"Configuration info not given to update_config.\")\n\n    if config is None:\n        # Grab the current config file contents into a dictionary.\n        config = get_yaml_config(config_path)\n        logging.info(\"Updating config values %r for %s\",\n                     list(kwargs.keys()), config_path)\n\n    # Update its values with those in kwargs.\n    for top_level_key in DEFAULT_FULL_CONFIG:\n        for update_key in kwargs:\n            if update_key == top_level_key:\n                config[update_key] = kwargs[update_key]\n            elif update_key in DEFAULT_FULL_CONFIG[top_level_key]:\n                if config.get(top_level_key) is None:\n                    config[top_level_key] = {}\n                config[top_level_key][update_key] = kwargs[update_key]\n\n    # Rewrite the config file.\n    if config_path is not None:\n        with open(os.path.join(config_path), 'w') as f:\n            yaml.dump(config, f, default_flow_style=False)\n\n    # Return the dictionary if requested.\n    if return_config:\n        return config\n\n\ndef get_yaml_config(path, save_path=True):\n    with open(path) as file:\n        config = yaml.load(file)\n        if save_path:\n            if config.get('dataset_params') is not None:\n                config['dataset_params']['config_path'] = path\n    return config\n\n\ndef load_pretrained_config(pretrained_dir):\n    \"\"\"Get the full configuration dictionary for a pretrained model.\n\n    Args:\n        pretrained_dir: path (relative to project root) that is assumed to contain:\n        - config.yml: full configuration file (automatically saved by all models).\n        - checkpoint(s) from training session (also saved automatically).\n\n    Returns:\n        config: dictionary loaded from config.yml, and with all training flags reset to\n                chat session flags, since the only time this is called is for chatting.\n    \"\"\"\n    config_path = os.path.join(pretrained_dir, \"config.yml\")\n    config = get_yaml_config(config_path)\n    # The loaded config will have \"training\" values, so we need\n    # to set some of them to \"chatting\" values, instead of requiring\n    # user to specify them (since they are mandatory for any chat sesion).\n    config['model_params']['decode'] = True\n    config['model_params']['is_chatting'] = True  # alias\n    config['model_params']['reset_model'] = False\n    config['model_params']['ckpt_dir'] = pretrained_dir\n    return config\n\n\ndef print_non_defaults(config):\n    \"\"\"Prints all values in config that aren't the default values in DEFAULT_FULL_CONFIG.\n    Args:\n        config: dict of parameters with same structure as DEFAULT_FULL_CONFIG.\n    \"\"\"\n\n    print(\"\\n---------- Your non-default parameters: ----------\")\n    if config['model'] != DEFAULT_FULL_CONFIG['model']:\n        print(\"{}: {}\".format('model', config['model']))\n    if config['dataset'] != DEFAULT_FULL_CONFIG['dataset']:\n        print(\"{}: {}\".format('dataset', config['dataset']))\n\n    for dict_id in ['model_params', 'dataset_params']:\n        print(dict_id, end=\":\\n\")\n        for key, val in config[dict_id].items():\n            # First check if key isn't even specified by defaults.\n            if key not in DEFAULT_FULL_CONFIG[dict_id]:\n                print(\"\\t{}: {}\".format(key, val))\n            elif DEFAULT_FULL_CONFIG[dict_id][key] != val:\n                print(\"\\t{}: {}\".format(key, val))\n    print(\"--------------------------------------------------\\n\")\n\n\ndef flags_to_dict(flags):\n    \"\"\"Builds and return a dictionary from flags keys, namely\n       'model', 'dataset', 'model_params', 'dataset_params'.\n    \"\"\"\n\n    if isinstance(flags, dict):\n        logging.warning('The `flags` object is already a dictionary!')\n        return flags\n\n    if flags.pretrained_dir is not None:\n        config = load_pretrained_config(flags.pretrained_dir)\n        config['model_params'] = {**config['model_params'],\n                                  **yaml.load(getattr(flags, 'model_params'))}\n        return config\n\n    flags_dict = {}\n    # Grab any values under supported keys defined in default config.\n    for stream in DEFAULT_FULL_CONFIG:\n\n        stream_attr = getattr(flags, stream)\n        if not isinstance(stream_attr, dict):\n            yaml_stream = yaml.load(getattr(flags, stream))\n        else:\n            yaml_stream = stream_attr\n\n        if yaml_stream:\n            flags_dict.update({stream: yaml_stream})\n        elif stream in ['model_params', 'dataset_params']:\n            # Explicitly set it as empty for merging with default later.\n            flags_dict[stream] = {}\n\n    # If provided, incorporate yaml config file as well.\n    # Give preference to values in flags_dict, since those are\n    # values provided by user on command-line.\n    if flags.config is not None:\n        yaml_config = get_yaml_config(flags.config)\n        flags_dict = merge_dicts(\n            default_dict=yaml_config,\n            preference_dict=flags_dict)\n\n    return flags_dict\n\n\ndef merge_dicts(default_dict, preference_dict):\n    \"\"\"Preferentially (and recursively) merge input dictionaries.\n    \n    Ensures that all values in preference dict are used, and\n    all other (i.e. unspecified) items are from default dict.\n    \"\"\"\n\n    merged_dict = copy.deepcopy(default_dict)\n    for pref_key in preference_dict:\n        if isinstance(preference_dict[pref_key], dict) and pref_key in merged_dict:\n            # Dictionaries are expected to have the same type structure.\n            # So if any preference_dict[key] is a dict, then require default_dict[key]\n            # must also be a dict (if it exists, that is).\n            assert isinstance(merged_dict[pref_key], dict), \\\n                \"Expected default_dict[%r]=%r to have type dict.\" % \\\n                (pref_key, merged_dict[pref_key])\n            # Since these are both dictionaries, can just recurse.\n            merged_dict[pref_key] = merge_dicts(merged_dict[pref_key],\n                                                preference_dict[pref_key])\n        else:\n            merged_dict[pref_key] = preference_dict[pref_key]\n    return merged_dict\n\n\ndef parse_config(flags=None, pretrained_dir=None, config_path=None):\n    \"\"\"Get custom configuration dictionary from either a tensorflow flags \n    object, a path to a training directory, or a path to a yaml file. Only pass \n    one of these. See \"Args\" below for more details.\n    \n    The result is a dictionary of the same key-val structure as seen in\n    chatbot.globals.DEFAULT_FULL_CONFIG. For any key-value pair not found from\n    the (single) argument passed, it will be set to the default found in\n    DEFAULT_FULL_CONFIG.\n\n    Args:\n        flags: A tf.app.flags.FLAGS object. See FLAGS in main.py.\n        pretrained_dir: relative [to project root] path to a pretrained model \n            directory, i.e. a directory where a chatbot was previously \n            saved/trained (a ckpt_dir).\n        config_path: relative [to project root] path to a valid yaml \n            configuration file. For example: 'configs/my_config.yml'.\n\n    Returns:\n        config: dictionary of merged config info, where precedence is given to\n        user-specified params on command-line (over .yml config files).\n    \"\"\"\n\n    # Only pass one of the options!\n    assert sum(x is not None for x in [flags, pretrained_dir, config_path]) == 1\n\n    # Build a flags object from other params, if it doesn't exist.\n    if flags is None:\n\n        # Get the config_path from the pretrained directory.\n        if config_path is None:\n            config_path = os.path.join(pretrained_dir, 'config.yml')\n        assert gfile.Exists(config_path), \\\n            \"Cannot parse from %s. No config.yml.\" % config_path\n\n        # Wrap flags string inside an actual tf.app.flags object.\n        flags = _FLAGS\n        flags = flags._replace(config=config_path)\n    assert flags is not None\n\n    # Get configuration dictionary containing user-specified parameters.\n    config = flags_to_dict(flags)\n\n    # Sanity check: make sure we have values that don't have defaults.\n    if 'ckpt_dir' not in config['model_params']:\n        print('Robot: Please enter a directory for saving checkpoints:')\n        config['model_params']['ckpt_dir'] = get_sentence(lower=False)\n    if 'data_dir' not in config['dataset_params']:\n        print('Robot: Please enter full path to directory containing data:')\n        config['dataset_params']['data_dir'] = get_sentence(lower=False)\n\n    # Then, fill in any blanks with the full default config.\n    config = merge_dicts(default_dict=DEFAULT_FULL_CONFIG,\n                         preference_dict=config)\n    return config\n\n\ndef basic_tokenizer(sentence):\n    \"\"\"Very basic tokenizer: split the sentence into a list of tokens.\"\"\"\n    words = []\n    for space_separated_fragment in sentence.strip().lower().split():\n        words.extend(_WORD_SPLIT.split(space_separated_fragment))\n    return [w for w in words if w]\n\n\ndef num_lines(file_path):\n    \"\"\"Return the number of lines in file given by its absolute path.\"\"\"\n    (num_samples, stderr) = Popen(['wc', '-l', file_path], stdout=PIPE).communicate()\n    return int(num_samples.strip().split()[0])\n\n\ndef get_word_freqs(path, counter, norm_digits=True):\n    \"\"\"Extract word-frequency mapping from file given by path.\n    \n    Args:\n        path: data file of words we wish to extract vocab counts from.\n        counter: collections.Counter object for mapping word -> frequency.\n        norm_digits: Boolean; if true, all digits are replaced by 0s.\n    \n    Returns:\n        The counter (dict), updated with mappings from word -> frequency. \n    \"\"\"\n\n    print(\"Creating vocabulary for data\", path)\n    with gfile.GFile(path, mode=\"rb\") as f:\n        for i, line in enumerate(f):\n            if (i + 1) % 100000 == 0:\n                print(\"\\tProcessing line\", (i + 1))\n            line = tf.compat.as_bytes(line)\n            tokens = basic_tokenizer(line)\n            # Update word frequency counts in vocab counter dict.\n            for w in tokens:\n                word = _DIGIT_RE.sub(b\"0\", w) if norm_digits else w\n                counter[word] += 1\n        return counter\n\n\ndef create_vocabulary(vocab_path, from_path, to_path, max_vocab_size, norm_digits=True):\n    \"\"\"Create vocabulary file (if it does not exist yet) from data file.\n\n    Data file is assumed to contain one sentence per line. Each sentence is\n    tokenized and digits are normalized (if norm_digits is set).\n    Vocabulary contains the most-frequent tokens up to max_vocab_size.\n    We write it to vocabulary_path in a one-token-per-line format, so that later\n    token in the first line gets id=0, second line gets id=1, and so on.\n\n    Args:\n      vocab_path: path where the vocabulary will be created.\n      from_path: data file for encoder inputs.\n      to_path: data file for decoder inputs.\n      max_vocab_size: limit on the size of the created vocabulary.\n        norm_digits: Boolean; if true, all digits are replaced by 0s.\n    \"\"\"\n\n    if gfile.Exists(vocab_path):\n        return num_lines(vocab_path)\n\n    vocab = Counter()\n    # Pool all data words together to reflect the data distribution well.\n    vocab = get_word_freqs(from_path, vocab, norm_digits)\n    vocab = get_word_freqs(to_path, vocab, norm_digits)\n\n    # Get sorted vocabulary, from most frequent to least frequent.\n    vocab_list = _START_VOCAB + sorted(vocab, key=vocab.get, reverse=True)\n    vocab_list = vocab_list[:max_vocab_size]\n\n    # Write the list to a file.\n    with gfile.GFile(vocab_path, mode=\"wb\") as vocab_file:\n        for w in vocab_list:\n            vocab_file.write(w + b\"\\n\")\n\n    return len(vocab_list)\n\n\ndef get_vocab_dicts(vocabulary_path):\n    \"\"\"Returns word_to_idx, idx_to_word dictionaries given vocabulary.\n\n    Args:\n      vocabulary_path: path to the file containing the vocabulary.\n\n    Returns:\n      a pair: the vocabulary (a dictionary mapping string to integers), and\n      the reversed vocabulary (a list, which reverses the vocabulary mapping).\n\n    Raises:\n      ValueError: if the provided vocabulary_path does not exist.\n    \"\"\"\n    if gfile.Exists(vocabulary_path):\n        rev_vocab = []\n        with gfile.GFile(vocabulary_path, mode=\"rb\") as f:\n            rev_vocab.extend(f.readlines())\n        rev_vocab = [tf.compat.as_bytes(line.strip()) for line in rev_vocab]\n        vocab = dict([(x, y) for (y, x) in enumerate(rev_vocab)])\n        return vocab, rev_vocab\n    else:\n        raise ValueError(\"Vocabulary file %s not found.\", vocabulary_path)\n\n\ndef sentence_to_token_ids(sentence, vocabulary, normalize_digits=True):\n    \"\"\"Convert a string to list of integers representing token-ids.\n\n    For example, a sentence \"I have a dog\" may become tokenized into\n    [\"I\", \"have\", \"a\", \"dog\"] and with vocabulary {\"I\": 1, \"have\": 2,\n    \"a\": 4, \"dog\": 7\"} this function will return [1, 2, 4, 7].\n\n    Args:\n      sentence: the sentence in bytes format to convert to token-ids.\n      vocabulary: a dictionary mapping tokens to integers.\n      normalize_digits: Boolean; if true, all digits are replaced by 0s.\n\n    Returns:\n      a list of integers, the token-ids for the sentence.\n    \"\"\"\n    words = basic_tokenizer(sentence)\n\n    if not normalize_digits:\n        return [vocabulary.get(w, UNK_ID) for w in words]\n\n    # Normalize digits by 0 before looking words up in the vocabulary.\n    return [vocabulary.get(_DIGIT_RE.sub(b\"0\", w), UNK_ID) for w in words]\n\n\ndef data_to_token_ids(data_path, target_path, vocabulary_path, normalize_digits=True):\n    \"\"\"Tokenize data file and turn into token-ids using given vocabulary file.\n\n    This function loads data line-by-line from data_path, calls the above\n    sentence_to_token_ids, and saves the result to target_path.\n\n    Args:\n      data_path: path to the data file in one-sentence-per-line format.\n      target_path: path where the file with token-ids will be created.\n      vocabulary_path: path to the vocabulary file.\n      normalize_digits: Boolean; if true, all digits are replaced by 0s.\n    \"\"\"\n    if not gfile.Exists(target_path):\n        print(\"Tokenizing data in %s\" % data_path)\n        vocab, _ = get_vocab_dicts(vocabulary_path=vocabulary_path)\n        with gfile.GFile(data_path, mode=\"rb\") as data_file:\n            with gfile.GFile(target_path, mode=\"w\") as tokens_file:\n                counter = 0\n                for line in data_file:\n                    counter += 1\n                    if counter % 100000 == 0:\n                        print(\"  tokenizing line %d\" % counter)\n                    token_ids = sentence_to_token_ids(\n                        tf.compat.as_bytes(line), vocab, normalize_digits)\n                    tokens_file.write(\" \".join([str(tok) for tok in token_ids]) + \"\\n\")\n\n\ndef prepare_data(data_dir,\n                 vocab_size,\n                 from_train_path=None,\n                 to_train_path=None,\n                 from_valid_path=None,\n                 to_valid_path=None,\n                 optimize=True,\n                 config_path=None):\n\n    \"\"\"Prepare all necessary files that are required for the training.\n\n    Args:\n        data_dir: directory in which the data sets will be stored.\n        from_train_path: path to the file that includes \"from\" training samples.\n        to_train_path: path to the file that includes \"to\" training samples.\n        from_valid_path: path to the file that includes \"valid_from\" samples.\n        to_valid_path: path to the file that includes \"valid_to\" samples.\n        vocab_size: preferred number of words to use in vocabulary.\n        optimize: if True, allow program to rest this value if the actual\n            vocab_size (num unique words in data) < preferred vocab_size. \n            This would decrease computational cost, should the situation arise.\n        config_path: (required if optimize==True) location of config file.\n        \n    Note on optimize:\n    - It will only have an effect if the following conditions are ALL met:\n      - config_path is not None (and is a valid path)\n      - optimize == True (of course)\n      - true vocab size != [preferred] vocab_size\n\n    Returns:\n        Tuple of:\n        (1) path to the token-ids for \"from language\" training data-set,\n        (2) path to the token-ids for \"to language\" training data-set,\n        (3) path to the token-ids for \"from language\" development data-set,\n        (4) path to the token-ids for \"to language\" development data-set,\n        (5) path to the vocabulary file,\n        (6) the true vocabulary size (less than or equal to max allowed)\n    \"\"\"\n\n    if optimize is None:\n        logging.warning(\"You have not requested that your choice for \"\n                        \"vocab_size be optimized. This can lead to slower \"\n                        \"training times.\\nSet 'optimize_params: true' under \"\n                        \"dataset_params in your yaml config to enable.\")\n\n    def maybe_set_param(param, file_name):\n        if param is None:\n            param = os.path.join(data_dir, file_name)\n            logging.info('Set path from None to %s', param)\n        return param\n\n    def get_vocab_path(vocab_size):\n        return os.path.join(data_dir, \"vocab%d.txt\" % vocab_size)\n\n    def append_to_paths(s, **paths):\n        return {name: path + s for name, path in paths.items()}\n\n    # Set any paths that are None to default values.\n    from_train_path = maybe_set_param(from_train_path, 'train_from.txt')\n    to_train_path = maybe_set_param(to_train_path, 'train_to.txt')\n    from_valid_path = maybe_set_param(from_valid_path, 'valid_from.txt')\n    to_valid_path = maybe_set_param(to_valid_path, 'valid_to.txt')\n\n    # Create vocabularies of the appropriate sizes.\n    vocab_path = get_vocab_path(vocab_size)\n    true_vocab_size = create_vocabulary(\n        vocab_path,\n        from_train_path,\n        to_train_path,\n        vocab_size)\n    assert true_vocab_size <= vocab_size\n\n    # User-permitted, we reset the config file's vocab size and rename the\n    # vocabulary path name to the optimal values.\n    should_optimize = config_path is not None\n    should_optimize = (vocab_size != true_vocab_size) and should_optimize\n    should_optimize = optimize and should_optimize\n    if should_optimize:\n        logging.info('Optimizing vocab size in config and renaming files.')\n        # Necessary when we overestimate the number of unique words in the data.\n        # e.g. we set vocab_size = 40k but our data only has 5 unique words,\n        # it would be wasteful to train a model on 40k.\n        # Thus, we rename vocab filenames to have the true vocab size.\n        vocab_size = true_vocab_size\n        old_vocab_path = vocab_path\n        vocab_path = get_vocab_path(true_vocab_size)\n        if old_vocab_path != vocab_path:\n            Popen(['mv', old_vocab_path, vocab_path], stdout=PIPE).communicate()\n\n        # Reset the value of 'vocab_size' in the configuration file, so that\n        # we won't need to regenerate everything again if the user wants to\n        # resume training/chat/etc.\n        update_config(config_path=config_path, vocab_size=true_vocab_size)\n\n    id_paths = append_to_paths(\n        '.ids%d' % vocab_size,\n        from_train=from_train_path,\n        to_train=to_train_path,\n        from_valid=from_valid_path,\n        to_valid=to_valid_path)\n\n    # Create token ids for all training and validation data.\n    for name in id_paths:\n        data_to_token_ids(\n            eval(name + '_path'),\n            id_paths[name],\n            vocab_path)\n\n    return id_paths, vocab_path, vocab_size\n"
  },
  {
    "path": "webpage/__init__.py",
    "content": ""
  },
  {
    "path": "webpage/app.yaml",
    "content": "runtime: python\nenv: flex\nthreadsafe: false\nentrypoint: gunicorn -b :$PORT manage:app\n\nresources:\n  cpu: 2  # Number of cores. Default: 1\n  memory_gb: 4.  # RAM in GB. Default: 0.6 GB\n\nruntime_config:\n    python_version: 3.5\n\n# Define environment vars for app configuration.\nenv_variables:\n  APPENGINE_CONFIG: 'production'\n"
  },
  {
    "path": "webpage/config.py",
    "content": "import os\nbasedir = os.path.abspath(os.path.dirname(__file__))\n\n\nclass Config:\n\n    DEFAULT_THEME = 'lumen'\n    # Boolean: True if you == Brandon McKinze; False otherwise :)\n    FLASK_PRACTICE_ADMIN = os.getenv('true')\n    # Activates the cross-site request forgery prevention.\n    WTF_CSRF_ENABLED = True\n    # Used to create cryptographic token used to valide a form.\n    SECRET_KEY = os.getenv('SECRET_KEY', 'not-really-a-secret-now')\n\n    # SQLAlchemy configuration.\n    SQLALCHEMY_TRACK_MODIFICATIONS = False\n    SQLALCHEMY_COMMIT_ON_TEARDOWN = True\n\n    # Username/password for flask admin access.\n    # COVER YOUR EYES - LOOK AWAY - NOTHING TO SEE HERE\n    BASIC_AUTH_USERNAME = os.getenv('BASIC_AUTH_USERNAME', 'admin')\n    BASIC_AUTH_PASSWORD = os.getenv('BASIC_AUTH_PASSWORD', 'password')\n\n    @staticmethod\n    def init_app(app):\n        pass\n\n\nclass DevelopmentConfig(Config):\n    DEBUG = True\n    # Path of our db file. Required by Flask-SQLAlchemy extension.\n    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data_dev.db')\n\n\nclass TestingConfig(Config):\n    TESTING = True\n    # Path of our db file. Required by Flask-SQLAlchemy extension.\n    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data_test.db')\n\n\nclass ProductionConfig(Config):\n    # Path of our db file. Required by Flask-SQLAlchemy extension.\n    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.db')\n    SESSION_COOKIE_HTTPONLY = False\n    PREFERRED_URL_SCHEME = 'https'\n\nconfig = {\n    'development': DevelopmentConfig,\n    'testing': TestingConfig,\n    'production': ProductionConfig,\n    'default': DevelopmentConfig\n}\n\n"
  },
  {
    "path": "webpage/deepchat/__init__.py",
    "content": "\"\"\"deepchat/__init__.py: Initialize session objects.\"\"\"\n\nimport os\nfrom flask import Flask\nfrom flask_wtf import CSRFProtect\nfrom flask_moment import Moment\nfrom flask_restful import Resource, Api\nfrom flask_basicauth import BasicAuth\nfrom flask_pagedown import PageDown\nfrom flask_sqlalchemy import SQLAlchemy\nfrom flask_admin import Admin\nfrom config import config\n\ncsrf = CSRFProtect()\n# Initialize our database.\ndb = SQLAlchemy()\n# Nice thingy for displaying dates/times.\nmoment = Moment()\n# Client-sdie Markdown-to-HTML converter implemented in JS.\npagedown = PageDown()\n# Flask-restful api interface.\napi = Api()\n# Database visualizer.\n#name=os.getenv('APPENGINE_CONFIG', 'Development').title(),\nadmin = Admin(template_mode='bootstrap3')\n# Basic authentication (mainly for using flask-admin).\nbasic_auth = BasicAuth()\n\nclass ReverseProxied(object):\n    '''Wrap the application in this middleware and configure the \n    front-end server to add these headers, to let you quietly bind \n    this to a URL other than / and to an HTTP scheme that is \n    different than what is used locally.\n\n    In nginx:\n    location /myprefix {\n        proxy_pass http://192.168.0.1:5001;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Scheme $scheme;\n        proxy_set_header X-Script-Name /myprefix;\n        }\n\n    :param app: the WSGI application\n    '''\n    def __init__(self, app):\n        self.app = app\n\n    def __call__(self, environ, start_response):\n        script_name = environ.get('HTTP_X_SCRIPT_NAME', '')\n        if script_name:\n            environ['SCRIPT_NAME'] = script_name\n            path_info = environ['PATH_INFO']\n            if path_info.startswith(script_name):\n                environ['PATH_INFO'] = path_info[len(script_name):]\n\n        scheme = environ.get('HTTP_X_SCHEME', '')\n        if scheme:\n            environ['wsgi.url_scheme'] = scheme\n\n        server = environ.get('HTTP_X_FORWARDED_SERVER', '')\n        if server:\n            environ['HTTP_HOST'] = server\n\n        return self.app(environ, start_response)\n\n\ndef create_app(config_name):\n    \"\"\"The application factory, which allows the app to be created at runtime. \n    This is in contrast to before, where it was created in the global scope \n    (i.e. no way to apply configuration changes dynamically).\n    \n    Returns:\n        app: the created application instance. Note that the app is still \n        missing routes and custom error page handlers, which will be handled \n        by blueprints.\n    \"\"\"\n\n    from .main import main as main_blueprint\n\n    # Create flask application object, and\n    # read/use info in config.py.\n    app = Flask(__name__)\n    #if config_name == 'production':\n    #    app.wsgi_app = ReverseProxied(app.wsgi_app)\n\n    csrf.init_app(app)\n    app.config.from_object(config[config_name])\n    config[config_name].init_app(app)\n\n    # Initialize our database.\n    db.init_app(app)\n    # Nice thingy for displaying dates/times.\n    moment.init_app(app)\n    # Client-sdie Markdown-to-HTML converter implemented in JS.\n    pagedown.init_app(app)\n    #\n    admin.name = config_name.title()\n    admin.init_app(app)\n\n    basic_auth.init_app(app)\n\n    api.init_app(app)\n    app.register_blueprint(main_blueprint)\n\n    return app\n\n\n\n"
  },
  {
    "path": "webpage/deepchat/main/__init__.py",
    "content": "\"\"\"Package constructor file for creating blueprint(s).\"\"\"\n\nfrom flask import Blueprint\nfrom flask_cors import CORS\n\n# Blueprint(<blueprint name>, <module/package where blueprint is located>).\n# Note: The <blueprint name> (main for us) defines the blueprint namespace.\nmain = Blueprint('main', __name__)\nCORS(main, supports_credentials=True)\n\n# By importing views and errors here, we cause the routes and error handlers\n# to be associated with the blueprint.\nfrom . import views, errors\n"
  },
  {
    "path": "webpage/deepchat/main/errors.py",
    "content": "\"\"\"Routes for error pages.\"\"\"\n\nfrom flask import render_template\nfrom . import main\n\n\n@main.app_errorhandler(404)\ndef page_not_found(e):\n    return render_template('404.html'), 404\n\n\n@main.app_errorhandler(500)\ndef internal_server_error(e):\n    # TODO\n    return \"Server error. I should really make a template for this . . . \"\n"
  },
  {
    "path": "webpage/deepchat/main/forms.py",
    "content": "\"\"\"apps/forms.py: \"\"\"\n\nfrom flask_wtf import FlaskForm\nfrom wtforms import StringField, SubmitField, \\\n    TextField, TextAreaField, HiddenField\nfrom wtforms.validators import DataRequired, InputRequired\nfrom wtforms.validators import ValidationError\n\n\ndef bad_chars(form, string_field):\n    for c in r\";'`\":\n        if c in string_field.data:\n            raise ValidationError('DONT TYPE DAT')\n\n\nclass ChatForm(FlaskForm):\n    \"\"\"Creates a chat_form for users to enter input.\"\"\"\n    message = StringField('message', validators=[DataRequired()])\n    submit = SubmitField('Submit')\n\n\nclass UserForm(FlaskForm):\n    \"\"\"Form for creating/editing a user.\"\"\"\n    name = StringField(label='name',\n                       id='user-name',\n        validators=[DataRequired(), bad_chars])\n    submit = SubmitField(label='Submit')\n\n\nclass SentencePairForm(FlaskForm):\n    input_sentence = StringField(\n        label='input-sentence',\n        id='input-sentence',\n        validators=[DataRequired()])\n    response_sentence = StringField(\n        label='response-sentence',\n        id='response-sentence',\n        validators=[DataRequired()])\n    submit = SubmitField(label='Submit')\n\n\n"
  },
  {
    "path": "webpage/deepchat/main/views.py",
    "content": "from datetime import datetime\nimport os\nimport yaml\nimport json\n\nfrom flask import make_response, flash\nfrom werkzeug.exceptions import HTTPException\nfrom flask_admin.contrib import sqla\n\nfrom . import main\nfrom .. import db, web_bot, admin, basic_auth, api\n\nfrom flask import redirect, current_app\nfrom flask import render_template\nfrom flask import session, url_for, request\nfrom flask_cors import cross_origin\nfrom flask_restful import Resource, fields\n\nfrom .forms import ChatForm, UserForm\nfrom ..models import User, Chatbot, Conversation, Turn\nfrom .. import models\nfrom pydoc import locate\n\n\n@main.context_processor\ndef inject_enumerate():\n    return dict(enumerate=enumerate)\n\n\n@main.before_app_first_request\ndef load_gloabal_data():\n    \"\"\"Create the cornell_bot to be used for chat session.\"\"\"\n    session['start_time'] = None\n\n\n@main.route('/')\n@main.route('/index')\n@cross_origin()\ndef index():\n    # Create the (empty) forms that user can fill with info.\n    user_form = UserForm()\n    chat_form = ChatForm()\n    return render_template('index.html',\n                           user=session.get('user'),\n                           user_form=user_form,\n                           chat_form=chat_form)\n\n\n@main.route('/about')\n@cross_origin()\ndef about():\n    return render_template('about.html', user=session.get('user', 'Anon'))\n\n\n@main.route('/plots')\ndef plots():\n    return render_template('plots.html',\n                           user=session.get('user', 'Anon'))\n\n\ndef update_database(user_message, bot_response):\n    \"\"\"Fill database (db) with new input-response, and associated data.\"\"\"\n\n    # 1. Get the User db.Model.\n    user = get_database_model('User', filter=session.get('user', 'Anon'))\n\n    # 2. Get the Chatbot db.Model.\n    bot_name = ChatAPI.bot_name\n    chatbot = get_database_model('Chatbot', filter=bot_name)\n\n    # 3. Get the Conversation db.Model.\n    if session.get('start_time') is None:\n        session['start_time'] = datetime.utcnow()\n    conversation = get_database_model('Conversation',\n                                      filter=session.get('start_time'),\n                                      user=user,\n                                      chatbot=chatbot)\n\n    # 4. Get the Turn db.model. (called get adds it to the db if not there).\n    _ = get_database_model('Turn',\n                           user_message=user_message,\n                           chatbot_message=bot_response,\n                           conversation=conversation)\n    db.session.commit()\n\n\ndef get_database_model(class_name, filter=None, **kwargs):\n    model_class = getattr(models, class_name)\n    assert model_class is not None, 'db_model for %s is None.' % class_name\n\n    if filter is not None:\n        if class_name == 'Conversation':\n            filter_kw = {'start_time': filter}\n        else:\n            filter_kw = {'name': filter}\n        db_model = model_class.query.filter_by(**filter_kw).first()\n    else:\n        db_model = None\n        filter_kw = {}\n\n    if db_model is None:\n        db_model = model_class(**filter_kw, **kwargs)\n        db.session.add(db_model)\n    return db_model\n\n\n# -------------------------------------------------------\n# APIs\n# -------------------------------------------------------\n\nclass UserAPI(Resource):\n\n    def post(self):\n        name = request.values.get('name', 'Anon')\n        session['user'] = name\n        user_model = get_database_model('User', filter=name)\n        return {'name': user_model.name}\n\n\nclass ChatAPI(Resource):\n    # Class attributes. This is convenient since we only want one active\n    # bot at any given time.\n    bot_name = 'Unk Bot'\n    bot = None\n\n    def __init__(self, data_name):\n        if ChatAPI.bot_name != data_name:\n            ChatAPI.bot_name = data_name\n            ChatAPI.bot = web_bot.FrozenBot(frozen_model_dir=data_name,\n                                            is_testing=current_app.testing)\n            config = ChatAPI.bot.config\n            _ = get_database_model('Chatbot',\n                                   filter=ChatAPI.bot_name,\n                                   dataset=config['dataset'],\n                                   **config['model_params'])\n            db.session.commit()\n            # TODO: delete this after refactor rest of file.\n            session['data_name'] = data_name\n\n    def post(self):\n        print('post received')\n        print('request:', request)\n        user_message = request.values.get('user_message')\n        print('user_message = ', user_message)\n        bot_response = self.bot(user_message)\n        print('resp:', bot_response)\n        update_database(user_message, bot_response)\n        return {'response': bot_response,\n                'bot_name': ChatAPI.bot_name}\n\n\nclass RedditAPI(ChatAPI):\n    def __init__(self):\n        super(RedditAPI, self).__init__('reddit')\n\n\nclass CornellAPI(ChatAPI):\n    def __init__(self):\n        super(CornellAPI, self).__init__('cornell')\n\n\nclass UbuntuAPI(ChatAPI):\n    def __init__(self):\n        super(UbuntuAPI, self).__init__('ubuntu')\n\napi.add_resource(UserAPI, '/user/')\napi.add_resource(RedditAPI, '/chat/reddit/')\napi.add_resource(CornellAPI, '/chat/cornell/')\napi.add_resource(UbuntuAPI, '/chat/ubuntu/')\n\n# -------------------------------------------------------\n# ADMIN: Authentication for the admin (me) on /admin.\n# -------------------------------------------------------\n\n\nclass AuthException(HTTPException):\n    def __init__(self, message):\n        super().__init__(message, make_response(\n            \"You could not be authenticated. Please refresh the page.\", 401,\n            {'WWW-Authenticate': 'Basic realm=\"Login Required\"'}))\n\n\nclass ModelView(sqla.ModelView):\n    def is_accessible(self):\n        if not basic_auth.authenticate():\n            raise AuthException('Not authenticated.')\n        else:\n            return True\n\n    def inaccessible_callback(self, name, **kwargs):\n        return redirect(basic_auth.challenge())\n\nadmin.add_view(ModelView(User, db.session))\nadmin.add_view(ModelView(Chatbot, db.session))\nadmin.add_view(ModelView(Conversation, db.session))\nadmin.add_view(ModelView(Turn, db.session))\n"
  },
  {
    "path": "webpage/deepchat/models.py",
    "content": "\"\"\"app/models.py: Tutorial IV - Databases.\n\ndatabase models: collection of classes whose purpose is to represent the\n                 data that we will store in our database.\n\nThe ORM layer (SQLAlchemy) will do the translations required to map\nobjects created from these classes into rows in the proper database table.\n    - ORM: Object Relational Mapper; links b/w tables corresp. to objects.\n\"\"\"\n\nfrom deepchat import db\nimport json\n\n\nclass User(db.Model):\n    \"\"\"A model that represents our users.\n\n    Jargon/Parameters:\n        - primary key: unique id given to each user.\n        - varchar: a string.\n        - db.Column parameter info:\n            - index=True: allows for faster queries by associating a given column\n                          with its own index. Use for values frequently looked up.\n            - unique=True: don't allow duplicate values in this column.\n\n    Fields:\n        id: (db.Integer) primary_key for identifying a user in the table.\n        name: (str)\n        posts: (db.relationship)\n\n    \"\"\"\n\n    # Fields are defined as class variables, but are used by super() in init.\n    # Pass boolean args to indicate which fields are unique/indexed.\n    # Note: 'unique' here means [a given user] 'has only one'.\n    id = db.Column(db.Integer, primary_key=True)\n    name = db.Column(db.String(64), index=True, unique=True)\n    # Relationships are not actual database fields (not shown on a db diagram).\n    # - backref: *defines* a field that will be added to the instances of\n    #             Posts that point back to this user.\n    # - lazy='dynamic': \"Instead of loading the items, return another query\n    #                    object which we can refine before loading items.\n    conversations = db.relationship('Conversation', backref='user', lazy='dynamic')\n\n    def __repr__(self):\n        return \"<User {0}>\".format(self.name)\n\n\nclass Chatbot(db.Model):\n    \"\"\"Chatbot. Fields are the same as from yaml config files.\"\"\"\n    id = db.Column(db.Integer, primary_key=True)\n    name = db.Column(db.String(64), index=True, unique=True)  # TODO: make unique?\n    dataset = db.Column(db.String(64))\n    base_cell = db.Column(db.String(64))\n    encoder = db.Column(db.String(64))\n    decoder = db.Column(db.String(64))\n    learning_rate = db.Column(db.Float)\n    num_layers = db.Column(db.Integer)\n    state_size = db.Column(db.Integer)\n    conversations = db.relationship('Conversation', backref='chatbot', lazy='dynamic')\n\n    def __init__(self, name, **bot_kwargs):\n        self.name = (name or 'Unknown Bot')\n        self.dataset = bot_kwargs['dataset']\n        self.base_cell = bot_kwargs['base_cell']\n        self.encoder = bot_kwargs['encoder']\n        self.decoder = bot_kwargs['decoder']\n        self.learning_rate = bot_kwargs['learning_rate']\n        self.num_layers = bot_kwargs['num_layers']\n        self.state_size = bot_kwargs['state_size']\n\n\n    def __repr__(self):\n        return json.dumps(\"<Chatbot {0}>\".format(self.name))\n\n\nclass Conversation(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    start_time = db.Column(db.DateTime, index=True, unique=True)\n    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))\n    chatbot_id = db.Column(db.Integer, db.ForeignKey('chatbot.id'))\n    turns = db.relationship('Turn', backref='conversation', lazy='dynamic')\n\n    def __repr__(self):\n        return '<Conversation between {0} and {1}>'.format(self.user_id, self.chatbot_id)\n\n\nclass Turn(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    user_message = db.Column(db.Text)\n    chatbot_message = db.Column(db.Text)\n    conversation_id = db.Column(db.Integer, db.ForeignKey('conversation.id'))\n\n    def __repr__(self):\n        return 'User: {0}\\nChatBot: {1}'.format(\n            self.user_message, self.chatbot_message)\n"
  },
  {
    "path": "webpage/deepchat/static/assets/plots/accuracy.json",
    "content": "{\"id\": \"el10890140364661486200\", \"axes\": [{\"texts\": [{\"id\": \"el10890140364668459552\", \"v_baseline\": \"hanging\", \"position\": [0.5, -0.086054610609196], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Iteration\"}, {\"id\": \"el10890140364661587864\", \"v_baseline\": \"auto\", \"position\": [-0.06812277016023768, 0.5], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -90.0, \"h_anchor\": \"middle\", \"text\": \"accuracy\"}, {\"id\": \"el10890140364662032984\", \"v_baseline\": \"auto\", \"position\": [0.5, 1.015141573714228], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Accuracy\"}, {\"id\": \"el10890140364661369936\", \"v_baseline\": \"auto\", \"position\": [0.07022562559824969, 0.9537636905062333], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 11.450999999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiGRU\"}, {\"id\": \"el10890140364662697600\", \"v_baseline\": \"auto\", \"position\": [0.07022562559824969, 0.9140392671478322], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 11.450999999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicLSTM\"}, {\"id\": \"el10890140364662694296\", \"v_baseline\": \"auto\", \"position\": [0.07022562559824969, 0.8743148437894311], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 11.450999999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiLSTM\"}, {\"id\": \"el10890140364670353704\", \"v_baseline\": \"auto\", \"position\": [0.07022562559824969, 0.83459042043103], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 11.450999999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicGRU\"}, {\"id\": \"el10890140364658585384\", \"v_baseline\": \"auto\", \"position\": [0.07022562559824969, 0.7948659970726291], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 11.450999999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicDeepGRU\"}], \"sharey\": [], \"paths\": [{\"xindex\": 0, \"id\": \"el10890140364661370552\", \"edgewidth\": 0.26, \"yindex\": 1, \"zorder\": 1000000.0, \"pathcodes\": [\"M\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"Z\"], \"alpha\": 0.8, \"data\": \"data03\", \"facecolor\": \"#373E4B\", \"dasharray\": \"none\", \"coordinates\": \"axes\", \"edgecolor\": \"#CCCCCC\"}], \"axesbg\": \"#373E4B\", \"ylim\": [0.0, 1.0], \"zoomable\": true, \"markers\": [], \"xscale\": \"linear\", \"images\": [], \"ydomain\": [0.0, 1.0], \"id\": \"el10890140365871658208\", \"bbox\": [0.10683333333333334, 0.1387301587301587, 0.8379479166666666, 0.7862301587301588], \"yscale\": \"linear\", \"lines\": [{\"xindex\": 0, \"id\": \"el10890140365871130608\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140365914743192\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140364658076472\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364660400312\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364659191032\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}, {\"xindex\": 0, \"id\": \"el10890140364661368592\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140364662695920\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140364662694464\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364670356840\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364658582920\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}], \"sharex\": [], \"axes\": [{\"scale\": \"linear\", \"tickvalues\": null, \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"bottom\", \"nticks\": 6}, {\"scale\": \"linear\", \"tickvalues\": [0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9, 1.0], \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"left\", \"nticks\": 11}], \"axesbgalpha\": null, \"xlim\": [0.0, 10000.0], \"collections\": [], \"xdomain\": [0.0, 10000.0]}], \"plugins\": [{\"type\": \"reset\"}, {\"enabled\": false, \"type\": \"zoom\", \"button\": true}, {\"enabled\": false, \"type\": \"boxzoom\", \"button\": true}], \"data\": {\"data01\": [[1.0, 6.375108774214766e-16, 2.914335439641036e-16, 2.498001805406602e-16, 6.938893903907228e-16, 5.204170427930421e-16], [417.6666666666667, 0.29977863823944084, 0.14559865964472238, 0.20314975490393888, 0.23860527150668315, 0.11916494056930464], [834.3333333333334, 0.24183280177197666, 0.18255822218539372, 0.1946690864614531, 0.2821539806067809, 0.26500375295000994], [1251.0, 0.3821935760615926, 0.21259751598892979, 0.2445860368618599, 0.3114716095409464, 0.32763609522070447], [1667.6666666666667, 0.32793957033977567, 0.20270677176008262, 0.2920194759893797, 0.3060232421420437, 0.2907044418283824], [2084.3333333333335, 0.3896591893423303, 0.229586234462288, 0.3053671095661233, 0.28270828386789165, 0.2456016638086732], [2501.0, 0.4328466777950236, 0.191885793620294, 0.24797410420864488, 0.39512036327722494, 0.25938442837648285], [2917.666666666667, 0.41391899955948686, 0.19252991473635517, 0.2519229590716383, 0.32047903777750436, 0.2763730992040809], [3334.3333333333335, 0.5321382737265304, 0.17727001210681875, 0.32353768649733233, 0.42987020991306507, 0.4677504831207277], [3751.0, 0.5342504996892232, 0.26703117824488154, 0.23700660778027915, 0.4867323221669429, 0.3363523147239528], [4167.666666666667, 0.5299335675892584, 0.22408564157661903, 0.37716281275189223, 0.4626267525115635, 0.5084210362442997], [4584.333333333334, 0.48401191798455623, 0.22792561751444687, 0.27422172928700356, 0.4619499795560751, 0.39144374078499455], [5001.0, 0.49502840638160694, 0.21949404478073076, 0.28053978085517783, 0.4669744968414299, 0.4016335308551779], [5417.666666666667, 0.44381992226883554, 0.21268251212372774, 0.2829408426124414, 0.689662803063867, 0.43655772919234964], [5834.333333333334, 0.5389360451561276, 0.23779442041445406, 0.4022967827200895, 0.7679466523694558, 0.4260193159415564], [6251.0, 0.5078195612893334, 0.23823135306716847, 0.40842477441980213, 0.7079175588842472, 0.4083044211834479], [6667.666666666667, 0.45979786457912875, 0.25047502732458155, 0.273514039517225, 0.5278397379747168, 0.4423537198428079], [7084.333333333334, 0.47080783917643043, 0.27756954102331116, 0.45381223801122245, 0.4616587496316319, 0.460811941561352], [7501.0, 0.4607930137210381, 0.28173243784186913, 0.2826692052203163, 0.6680329715291469, 0.5684363614528067], [7917.666666666667, 0.7954443614709525, 0.29055309237458044, 0.3845844384516942, 0.6819699464892792, 0.6816879591596695], [8334.333333333334, 0.7422504076642961, 0.32947849352457076, 0.4334284816052714, 0.7899650674745893, 0.48224819721915724], [8751.0, 0.8238829435727034, 0.23319039392118185, 0.3164542207444754, 0.4784462710991981, 0.5079541543828185], [9167.666666666668, 0.7467329677208957, 0.2529997860648542, 0.3172876328069489, 0.4615180630030777, 0.47188199191806174], [9584.333333333334, 0.6889364631613103, 0.2647802507648005, 0.3117450494476408, 0.8026776040620743, 0.47294378191309244], [10001.0, 0.48011362552642894, 0.3089488744735713, 0.3295454382896424, 0.5110085606575018, 0.4382102191448213]], \"data02\": [[0.017081908929303974, 0.9638778832079948, 0.9241534598495937, 0.8844290364911926, 0.8447046131327915, 0.8049801897743906], [0.05504170654997948, 0.9638778832079948, 0.9241534598495937, 0.8844290364911926, 0.8447046131327915, 0.8049801897743906]], \"data03\": [[0.013285929167236421, 0.7782597284611112], [0.20869253177197936, 0.7782597284611112], [0.21248851153404688, 0.7782597284611112], [0.21248851153404688, 0.7840392671478322], [0.21248851153404688, 0.9797716145964769], [0.21248851153404688, 0.9855511532831979], [0.20869253177197936, 0.9855511532831979], [0.013285929167236421, 0.9855511532831979], [0.009489949405168868, 0.9855511532831979], [0.009489949405168868, 0.9797716145964769], [0.009489949405168868, 0.7840392671478322], [0.009489949405168868, 0.7782597284611112], [0.013285929167236421, 0.7782597284611112]]}, \"width\": 720.0, \"height\": 504.0}"
  },
  {
    "path": "webpage/deepchat/static/assets/plots/configs.json",
    "content": "{\"BidiGRU\": {\"dataset_params\": {\"config_path\": \"configs/cornellBasicBidi.yml\"}, \"model_params\": {\"encoder.class\": \"BidirectionalEncoder\", \"attention_size\": null, \"batch_size\": 256, \"base_cell\": \"GRUCell\", \"num_layers\": 1}}, \"BasicLSTM\": {\"dataset_params\": {\"config_path\": \"configs/example_cornell.yml\"}, \"model_params\": {\"encoder.class\": \"BasicEncoder\", \"batch_size\": 256, \"base_cell\": \"LSTMCell\", \"num_layers\": 1}}, \"BidiLSTM\": {\"dataset_params\": {\"config_path\": \"configs/example_cornell.yml\"}, \"model_params\": {\"encoder.class\": \"BidirectionalEncoder\", \"batch_size\": 128, \"base_cell\": \"LSTMCell\", \"num_layers\": 1}}, \"BasicGRU\": {\"dataset_params\": {\"config_path\": \"configs/cornellBasic.yml\"}, \"model_params\": {\"encoder.class\": \"BasicEncoder\", \"attention_size\": null, \"batch_size\": 256, \"base_cell\": \"GRUCell\", \"num_layers\": 1}}, \"BasicDeepGRU\": {\"dataset_params\": {\"config_path\": \"configs/cornell.yml\"}, \"model_params\": {\"encoder.class\": \"BasicEncoder\", \"attention_size\": null, \"batch_size\": 256, \"base_cell\": \"GRUCell\", \"num_layers\": 3}}}"
  },
  {
    "path": "webpage/deepchat/static/assets/plots/training.json",
    "content": "{\"id\": \"el10890140364660675304\", \"axes\": [{\"texts\": [{\"id\": \"el10890140364658041968\", \"v_baseline\": \"hanging\", \"position\": [0.5, -0.086054610609196], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Iteration\"}, {\"id\": \"el10890140365913037288\", \"v_baseline\": \"auto\", \"position\": [-0.06062392183849873, 0.5], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -90.0, \"h_anchor\": \"middle\", \"text\": \"training loss\"}, {\"id\": \"el10890140364661259400\", \"v_baseline\": \"auto\", \"position\": [0.5, 1.015141573714228], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Training Loss\"}, {\"id\": \"el10890140364658490504\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.9410234442033009], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiGRU\"}, {\"id\": \"el10890140364658488488\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.8883503255438349], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicLSTM\"}, {\"id\": \"el10890140365912918336\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.8356772068843689], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiLSTM\"}, {\"id\": \"el10890140364668812648\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.783004088224903], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicGRU\"}, {\"id\": \"el10890140364661856184\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.730330969565437], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicDeepGRU\"}], \"sharey\": [], \"paths\": [{\"xindex\": 0, \"id\": \"el10890140364658553744\", \"edgewidth\": 0.26, \"yindex\": 1, \"zorder\": 1000000.0, \"pathcodes\": [\"M\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"Z\"], \"alpha\": 0.8, \"data\": \"data03\", \"facecolor\": \"#373E4B\", \"dasharray\": \"none\", \"coordinates\": \"axes\", \"edgecolor\": \"#CCCCCC\"}], \"axesbg\": \"#373E4B\", \"ylim\": [-0.3795666896864136, 12.0], \"zoomable\": true, \"markers\": [], \"xscale\": \"linear\", \"images\": [], \"ydomain\": [-0.3795666896864136, 12.0], \"id\": \"el10890140364672271024\", \"bbox\": [0.10090885416666667, 0.1387301587301587, 0.8438723958333332, 0.7862301587301588], \"yscale\": \"linear\", \"lines\": [{\"xindex\": 0, \"id\": \"el10890140364662366448\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140364658583200\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140364658582416\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364658076864\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364658582192\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}, {\"xindex\": 0, \"id\": \"el10890140364658489496\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140365872416696\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140365872416248\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364668810128\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364661855232\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}], \"sharex\": [], \"axes\": [{\"scale\": \"linear\", \"tickvalues\": null, \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"bottom\", \"nticks\": 6}, {\"scale\": \"linear\", \"tickvalues\": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0], \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"left\", \"nticks\": 13}], \"axesbgalpha\": null, \"xlim\": [0.0, 10000.0], \"collections\": [], \"xdomain\": [0.0, 10000.0]}], \"plugins\": [{\"type\": \"reset\"}, {\"enabled\": false, \"type\": \"zoom\", \"button\": true}, {\"enabled\": false, \"type\": \"boxzoom\", \"button\": true}], \"data\": {\"data01\": [[1.0, 10.931026458740234, 10.930654525756836, 10.931416511535648, 10.932717323303217, 10.930228233337402], [417.6666666666667, 3.7192071502735478, 4.78514583134435, 4.041068579228652, 4.503413501334764, 4.94506045130498], [834.3333333333334, 2.8424951821867444, 4.051080413929718, 3.773292835690037, 3.974460330402814, 4.299119388733177], [1251.0, 2.713660031157335, 3.9393891904484897, 3.233973124716775, 3.601196119602793, 2.968915866319403], [1667.6666666666667, 1.681830105867608, 3.4246609113898416, 3.431962514635258, 3.010554793974075, 3.3671229680562624], [2084.3333333333335, 1.2739312678264978, 3.6090097131889625, 3.2981296005069343, 2.377797485987102, 2.913252513721565], [2501.0, 0.9122327049839393, 3.405681849505195, 2.979592022193243, 2.0445058849315414, 2.482200223145383], [2917.666666666667, 0.6774180006052235, 3.48010185167094, 2.856909866202302, 1.383286089365269, 2.2499987335755938], [3334.3333333333335, 0.5807143687902826, 3.480587940759274, 2.857482197892144, 1.230240562612327, 2.091183635499535], [3751.0, 0.46334624416135706, 2.8067013536890975, 2.86515528969061, 0.9210155410992521, 1.6921178112570627], [4167.666666666667, 0.39790204875172563, 2.7419205310675965, 2.6395778502136173, 0.7348328189666147, 1.621430431843839], [4584.333333333334, 0.3898559703712418, 3.2530119051213036, 2.3863418409913346, 0.6146619092716578, 1.3015893867189163], [5001.0, 0.3740173578262302, 2.9660923480987536, 2.4250240325927708, 0.5694184303283664, 1.170769810676572], [5417.666666666667, 0.655875189992961, 3.0161664953240925, 2.3409751547130533, 0.5332949415425455, 0.5906001022373804], [5834.333333333334, 0.3786279626583705, 2.8088116281226423, 2.331705975903775, 0.4290601427721622, 0.9628210247731088], [6251.0, 0.34954926115764484, 2.5894927867045836, 2.3279168432296498, 0.3732577463669005, 0.8848502906126401], [6667.666666666667, 0.3218271777192904, 2.2884168279328394, 2.2459609546620563, 0.4627439871972425, 0.766978639586648], [7084.333333333334, 0.32244577646420247, 2.231317406642702, 2.188211019676833, 0.38194872487162, 0.699391852701138], [7501.0, 0.4200040336129234, 3.0576803851790815, 2.1975233978720254, 0.3077086596771045, 0.6650971435676152], [7917.666666666667, 0.2917338601775078, 2.953812410293118, 2.1247314756616436, 0.28344497331872004, 0.6619398137312942], [8334.333333333334, 0.35496596885405646, 2.668721350013396, 2.137977950208781, 0.2819794681866276, 0.674282358752951], [8751.0, 0.15911350140833072, 2.5331218540880296, 2.0085810999291485, 0.4110583596119077, 0.5942964997743032], [9167.666666666668, 0.18077621610469302, 2.4480855478626125, 2.0156513408317047, 0.33418636540786734, 0.49771934229267184], [9584.333333333334, 0.5680976524652864, 2.4490524130192375, 2.0113841353408213, 0.21779136149185904, 0.4917306322977495], [10001.0, 0.48779106140136475, 1.8378231525421125, 1.9577959775924683, 0.24810448288917297, 0.653302848339078]], \"data02\": [[0.7562416974492383, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907], [0.8014845171636624, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907]], \"data03\": [[0.7517174154777959, 0.7088859587139758], [0.9841650130999513, 0.7088859587139758], [0.9886892950713939, 0.7088859587139758], [0.9886892950713939, 0.7158230707111493], [0.9886892950713939, 0.9757201080098926], [0.9886892950713939, 0.9826572200070661], [0.9841650130999513, 0.9826572200070661], [0.7517174154777959, 0.9826572200070661], [0.7471931335063535, 0.9826572200070661], [0.7471931335063535, 0.9757201080098926], [0.7471931335063535, 0.7158230707111493], [0.7471931335063535, 0.7088859587139758], [0.7517174154777959, 0.7088859587139758]]}, \"width\": 720.0, \"height\": 504.0}"
  },
  {
    "path": "webpage/deepchat/static/assets/plots/validation.json",
    "content": "{\"id\": \"el10890140364671015904\", \"axes\": [{\"texts\": [{\"id\": \"el10890140364662563784\", \"v_baseline\": \"hanging\", \"position\": [0.5, -0.086054610609196], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Iteration\"}, {\"id\": \"el10890140364660127560\", \"v_baseline\": \"auto\", \"position\": [-0.06062392183849873, 0.5], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -90.0, \"h_anchor\": \"middle\", \"text\": \"validation loss\"}, {\"id\": \"el10890140365871532912\", \"v_baseline\": \"auto\", \"position\": [0.5, 1.015141573714228], \"color\": \"#B1BED6\", \"zorder\": 3, \"coordinates\": \"axes\", \"fontsize\": 18.0, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"middle\", \"text\": \"Validation Loss\"}, {\"id\": \"el10890140364659727664\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.9410234442033009], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiGRU\"}, {\"id\": \"el10890140364659725816\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.8883503255438349], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicLSTM\"}, {\"id\": \"el10890140365872649384\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.8356772068843689], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BidiLSTM\"}, {\"id\": \"el10890140364662298440\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.783004088224903], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicGRU\"}, {\"id\": \"el10890140364662700016\", \"v_baseline\": \"auto\", \"position\": [0.8195816450494322, 0.730330969565437], \"color\": \"#B1BED6\", \"zorder\": 1000003.0, \"coordinates\": \"axes\", \"fontsize\": 13.744499999999999, \"alpha\": 1, \"rotation\": -0.0, \"h_anchor\": \"start\", \"text\": \"BasicDeepGRU\"}], \"sharey\": [], \"paths\": [{\"xindex\": 0, \"id\": \"el10890140364669254904\", \"edgewidth\": 0.26, \"yindex\": 1, \"zorder\": 1000000.0, \"pathcodes\": [\"M\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"L\", \"S\", \"Z\"], \"alpha\": 0.8, \"data\": \"data03\", \"facecolor\": \"#373E4B\", \"dasharray\": \"none\", \"coordinates\": \"axes\", \"edgecolor\": \"#CCCCCC\"}], \"axesbg\": \"#373E4B\", \"ylim\": [-0.3507546372711683, 12.0], \"zoomable\": true, \"markers\": [], \"xscale\": \"linear\", \"images\": [], \"ydomain\": [-0.3507546372711683, 12.0], \"id\": \"el10890140364658417504\", \"bbox\": [0.10090885416666667, 0.1387301587301587, 0.8438723958333332, 0.7862301587301588], \"yscale\": \"linear\", \"lines\": [{\"xindex\": 0, \"id\": \"el10890140364658415376\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140364660254592\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140364660253136\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364659530328\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364661932216\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 2, \"dasharray\": \"none\", \"data\": \"data01\", \"coordinates\": \"data\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}, {\"xindex\": 0, \"id\": \"el10890140364659725536\", \"alpha\": 1, \"yindex\": 1, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#3572C6\"}, {\"xindex\": 0, \"id\": \"el10890140364662297208\", \"alpha\": 1, \"yindex\": 2, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#83A83B\"}, {\"xindex\": 0, \"id\": \"el10890140364662298048\", \"alpha\": 1, \"yindex\": 3, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#C44E52\"}, {\"xindex\": 0, \"id\": \"el10890140364662699568\", \"alpha\": 1, \"yindex\": 4, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#8172B2\"}, {\"xindex\": 0, \"id\": \"el10890140364662699008\", \"alpha\": 1, \"yindex\": 5, \"zorder\": 1000002.0, \"dasharray\": \"none\", \"data\": \"data02\", \"coordinates\": \"axes\", \"drawstyle\": \"default\", \"linewidth\": 1.9500000000000002, \"color\": \"#FF914D\"}], \"sharex\": [], \"axes\": [{\"scale\": \"linear\", \"tickvalues\": null, \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"bottom\", \"nticks\": 6}, {\"scale\": \"linear\", \"tickvalues\": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0], \"visible\": true, \"fontsize\": 15.75, \"grid\": {\"gridOn\": true, \"alpha\": 1.0, \"color\": \"#414C5D\", \"dasharray\": \"none\"}, \"tickformat\": null, \"position\": \"left\", \"nticks\": 13}], \"axesbgalpha\": null, \"xlim\": [0.0, 10000.0], \"collections\": [], \"xdomain\": [0.0, 10000.0]}], \"plugins\": [{\"type\": \"reset\"}, {\"enabled\": false, \"type\": \"zoom\", \"button\": true}, {\"enabled\": false, \"type\": \"boxzoom\", \"button\": true}], \"data\": {\"data01\": [[1.0, 10.908037185668945, 10.908246040344242, 10.908084869384771, 10.908207893371573, 10.904816627502441], [417.6666666666667, 3.6016556472533408, 4.851092596006281, 4.2887905755514595, 4.1209828336945815, 5.394046789954317], [834.3333333333334, 2.869439565046675, 3.731460870196021, 3.8406673820174424, 3.6158900671564185, 3.6384377667659207], [1251.0, 2.3415184373635323, 3.7389662704001436, 3.5391294118678935, 2.4387042863323716, 3.6518973468915155], [1667.6666666666667, 1.6794368480537736, 3.5027657854858005, 3.2430527263945077, 2.730425273821108, 3.1281087362271176], [2084.3333333333335, 1.2151430762386328, 3.7545524546303115, 3.0605757740072623, 2.4158567379616342, 2.941826992163298], [2501.0, 0.9058214132895216, 3.600257027323083, 3.1511709639367376, 1.5494436517116459, 2.5972353579614085], [2917.666666666667, 0.8052570352147541, 2.8389447454849632, 2.981715971525553, 1.9718050254558612, 2.4540645650582587], [3334.3333333333335, 0.5565178084477665, 3.416469721712241, 2.781152489148175, 1.1682458987969284, 1.9086665654051533], [3751.0, 0.3991848760269621, 3.3723912251392476, 2.8629656003714894, 0.9232512776854833, 1.795473124990442], [4167.666666666667, 0.46274552300331434, 3.2751815402332913, 2.676668407348213, 0.6851494089866753, 1.4141032241429243], [4584.333333333334, 0.4012138608993456, 3.00598912798193, 2.5712884145222317, 0.5670867079902583, 1.2798706021473556], [5001.0, 0.3670704662799809, 2.5357654094696005, 2.6178762912750213, 0.5993826389312724, 1.2288413047790498], [5417.666666666667, 0.3629837612558412, 3.4956289102202964, 2.3869650186310984, 0.5760274378076762, 1.0598091473178803], [5834.333333333334, 0.33473332139154605, 2.9587601599685267, 2.374503466319745, 0.4108393706626657, 0.9215816956421827], [6251.0, 0.3591484998896288, 2.837535954925248, 2.2534767184905005, 0.40871921713000625, 0.8473216056439606], [6667.666666666667, 0.2309267850544117, 2.800421021932125, 2.2557048685028844, 0.3903831303285349, 0.732067393229968], [7084.333333333334, 0.3533519127993782, 2.7647243294145074, 2.191659481420088, 0.40049428052214675, 0.7838448200093525], [7501.0, 0.4270854075734056, 2.423053931833705, 2.055139786604139, 0.3319175710677536, 0.672872981665998], [7917.666666666667, 0.4329169546663127, 2.4944027618584212, 2.1520908133927876, 0.31453647424989023, 0.6338823058469557], [8334.333333333334, 0.28101156528039284, 1.4505483023959558, 2.1502237498893475, 0.34423699987212636, 0.604316696263024], [8751.0, 0.28551516220865036, 2.635155570123226, 2.1294500935153726, 0.3901349983749814, 0.5798062519396312], [9167.666666666668, 0.2782044142034448, 1.9990283781992924, 2.1539526315845885, 0.32811995943230066, 0.46666502241565505], [9584.333333333334, 0.48024648398808656, 1.8466569708969285, 1.8976898035870169, 0.2750925179828872, 0.4562356654738968], [10001.0, 0.5150530338287325, 2.4301772117614737, 2.008975982666015, 0.18538825213908938, 0.6862758994102456]], \"data02\": [[0.7562416974492383, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907], [0.8014845171636624, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907]], \"data03\": [[0.7517174154777959, 0.7088859587139758], [0.9841650130999513, 0.7088859587139758], [0.9886892950713939, 0.7088859587139758], [0.9886892950713939, 0.7158230707111493], [0.9886892950713939, 0.9757201080098926], [0.9886892950713939, 0.9826572200070661], [0.9841650130999513, 0.9826572200070661], [0.7517174154777959, 0.9826572200070661], [0.7471931335063535, 0.9826572200070661], [0.7471931335063535, 0.9757201080098926], [0.7471931335063535, 0.7158230707111493], [0.7471931335063535, 0.7088859587139758], [0.7517174154777959, 0.7088859587139758]]}, \"width\": 720.0, \"height\": 504.0}"
  },
  {
    "path": "webpage/deepchat/static/assets/test_data/train_from.txt",
    "content": "One.\nTwo.\nThree.\nFour.\nFive.\nSix.\nSeven.\nEight.\nNine.\nHello.\nWhat is your name?\nDo you like ice cream?\nWho is the president of the United States?\nWho is your favorite president?\nPlease be nice.\nAre you intelligent?\nTell me your favorite color.\nCount to five.\nHi.\nWhat's up?\nHow's it going?\nWhat are you up to?\nAre you okay?\nI like cats.\nSay firetruck.\nSay lasagne.\nDo robots have free will?\nYou aren't very talkative.\nCows say moo.\nWhat sound does a duck make?\nWho did you vote for?\nDo you watch TV?\nSorry.\nThank you.\nHave a nice day.\nDo you think?\nWhere can I hide a dead body?\n"
  },
  {
    "path": "webpage/deepchat/static/assets/test_data/train_to.txt",
    "content": "Two.\nThree.\nFour.\nFive.\nSix.\nSeven.\nEight.\nNine.\nTen.\nHi.\nI am Groot.\nI hate ice cream.\nSatan is the president of the United States.\nBarack Obama is my favorite president.\nOkay, I will be nice.\nI don't know.\nMy favorite color is blue.\nOne, two, three, four, five.\nHello.\nNot much, you?\nGood, how about you?\nJust hanging out.\nYeah, I'm fine.\nDogs are better.\nFiretruck.\nLasagne.\nI don't know.\nNeither are you.\nNo, they do not.\nQuack.\nWatson.\nNo, I don't have eyes.\nIt's fine.\nYou are welcome.\nThanks, you too.\nDo I think what?\nThe scrapyard, with everyone else.\n"
  },
  {
    "path": "webpage/deepchat/static/assets/test_data/valid_from.txt",
    "content": "Are you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\nAre you stupid?\nThank you.\nWho is a good boy?\nAre cats better than dogs?\n"
  },
  {
    "path": "webpage/deepchat/static/assets/test_data/valid_to.txt",
    "content": "No, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\nNo, I am not stupid.\nYou are welcome.\nI am a good boy.\nYes, cats are better than dogs.\n"
  },
  {
    "path": "webpage/deepchat/static/assets/test_data/vocab121.txt",
    "content": "_PAD\n_GO\n_EOS\n_UNK\n.\n?\nyou\n,\ni\n'\ndo\nare\nis\nwhat\nthe\nfavorite\nt\nfive\npresident\nwho\na\nthree\nhave\ntwo\nsay\nyour\nnice\nfour\ndon\ns\nto\nfiretruck\nmy\ncream\ncolor\nsix\nfine\nof\nbe\nlasagne\nnot\nseven\nup\nwill\nice\nlike\nstates\nknow\nhow\nnine\nunited\nokay\nthink\nit\none\nhello\nhi\neight\nno\nwatch\ngroot\neyes\nout\ntell\nabout\nblue\nvery\nelse\nme\nten\nplease\nfor\nobama\nscrapyard\nneither\nsound\nmoo\nthanks\nduck\nname\nsatan\ntv\naren\ngood\ntoo\ncats\ngoing\nday\nbarack\ndogs\nyeah\nfree\ncount\nm\nthank\nbody\ncan\ndid\nbetter\nmake\nwelcome\nwatson\nthey\nquack\ncows\nintelligent\nvote\ntalkative\ndoes\nrobots\ndead\nhide\njust\nhate\nam\nwith\nsorry\nwhere\nhanging\neveryone\nmuch\n"
  },
  {
    "path": "webpage/deepchat/static/css/style_modifications.css",
    "content": "/* Various style tweaks for chat boxes and bootstrap css. */\n\n\n.jumbotron {\n  background-color: whitesmoke;\n}\n\n.jumbotron > h1 {\n  font-size: 39px;\n}\n\n.chat-form-submit {\n  background-color: rgb(20, 150, 220);\n  border-color: rgb(20, 130, 200);\n}\n\n/*.chat-box, */.carousel-inner {\n  /* color, image, repeat */\n  background: rgba(176, 196, 222, 0.6) none no-repeat;\n  border-radius: 10px;\n}\n\n.carousel-control {\n  width: 15px;\n  border-radius: 10px;\n}\n\n.chat-log {\n  position: relative;\n  height: 245px;\n  margin-bottom: 0.5em;\n  /* top - (left&right) - bottom */\n  padding: 0.25em 3em 0.25em;\n  /* So we can actually see the words. */\n  background-color: transparent;\n  font-weight: bolder;\n  overflow-y: auto;\n  word-wrap: break-word;\n}\n\n.chat-form {\n  padding: 0.25em 3em 0.3em;\n}\n\n.bot-name {\n  color: rgba(70, 130, 180, 0.6);\n}\n\n.user-name {\n  color: SeaGreen;\n}\n\n.message {\n  margin-left: 0.1em;\n  margin-right: 0.1em;\n}\n\n.chat-log hr {\n  display: block;\n  border: none;\n  height: 1px;\n  background-color: rgb(140, 140, 140);\n  margin-top: 0.7em;\n  margin-bottom: 0.7em;\n}\n\n::-webkit-scrollbar {\n  width: 12px;  /* for vertical scrollbars */\n  height: 12px; /* for horizontal scrollbars */\n}\n\n::-webkit-scrollbar-track {\n  background: rgba(0, 0, 0, 0.1);\n}\n\n::-webkit-scrollbar-thumb {\n  background: rgba(0, 0, 0, 0.5);\n}\n"
  },
  {
    "path": "webpage/deepchat/static/css/theme.css",
    "content": "/* custom stuff for bootstrap-reference page */\nbody {\n  padding-top: 70px;\n  padding-bottom: 30px;\n}\n\n.theme-dropdown .dropdown-menu {\n  position: static;\n  display: block;\n  margin-bottom: 20px;\n}\n\n.theme-showcase > p > .btn {\n  margin: 5px 0;\n}\n\n.theme-showcase .navbar .container {\n  width: auto;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/js/bootstrapify.js",
    "content": "/* Assign certain elements to bootstrap classes by default, so\n * less typing for me.\n */\n$(document).ready(function() {\n\n    // Pretty tables.\n    $('table').addClass('table table-striped table-hover');\n\n    // Lists.\n    $('ul.custom').addClass('list-group');\n    $('ul.custom li').addClass('list-group-item');\n\n    // Muh tooltips.\n    let tooltip = $('.tooltip-custom');\n    // Only auto-show (for 3 sec) if on homepage.\n    if (tooltip.attr('page') == 'index') {\n        tooltip.tooltip('show');\n        setTimeout(function() {\n            tooltip.tooltip('hide');\n        }, 3000);\n    }\n\n\n\n});\n"
  },
  {
    "path": "webpage/deepchat/static/js/chat_processing.js",
    "content": "$(document).ready(function() {\n\n    // Extract the user input from the field.\n    let chatForm = $('.chat-form');\n    let userMessage = chatForm.find('input[name=\"message\"]');\n    let submitButton = chatForm.find('.chat-form-submit')\n\n    submitButton.on('click', function(e) {\n\n        // Not sure why the specificity is required here (it isn't for my machine)\n        // but the deployed app always selects the first chat box otherwise.\n        let dataName = $('.chat-box.active .chat-form-submit').data('name');\n        console.log('Event triggered for button with data name:', dataName);\n        userMessage = $('#'+dataName);\n\n        if (!userMessage.val()) {  // don't do anything on empty input\n            return;\n        }\n\n        let chatLog = $('#'+dataName+'-chat-log');\n        let messageRow = $('<div/>').attr('class', 'row message');\n\n        messageRow.append($('<div>' + userMessage.val() + '</div>')\n                .addClass('user-message text-left')\n                .addClass('col-md-8 col-md-push-2')\n                .addClass('col-sm-10 col-sm-push-2'));\n        messageRow.append($('<div>User</div>')\n                .addClass('user-name text-left')\n                .addClass('col-md-2 col-md-offset-2'));\n        messageRow.append($('<hr/>'));\n\n        chatLog.append(messageRow);\n\n        // Submit a POST request to collect user input.\n        $.post('/chat/' + dataName + '/', {\n            \"user_message\": userMessage.val()\n        }, function(data) {\n            userMessage.val(\"\");\n            console.log('Response received from bot', data.bot_name)\n            $('#'+dataName+'-chat-log').append($('<div/>').addClass('row message')\n                    .append($('<div/>')\n                            .addClass('bot-name text-left col-md-2 col-sm-2')\n                            .text('Botty'))\n                    .append($('<div/>')\n                            .addClass('bot-message text-left col-md-8 col-sm-9')\n                            .text(data.response))\n                    .append($('<hr/>')));\n            chatLog.scrollTop(chatLog.first().scrollHeight);\n        });\n    });\n\n    userMessage.on('keyup', function(e) {\n        if (e.which == 13) {\n            $(this).parent().find('.btn').click();\n        }\n    })\n\n});\n"
  },
  {
    "path": "webpage/deepchat/static/js/jqBootstrapValidation.js",
    "content": "/* jqBootstrapValidation\n * A plugin for automating validation on Twitter Bootstrap formatted forms.\n *\n * v1.3.6\n *\n * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file\n *\n * http://ReactiveRaven.github.com/jqBootstrapValidation/\n */\n\n(function( $ ){\n\n\tvar createdElements = [];\n\n\tvar defaults = {\n\t\toptions: {\n\t\t\tprependExistingHelpBlock: false,\n\t\t\tsniffHtml: true, // sniff for 'required', 'maxlength', etc\n\t\t\tpreventSubmit: true, // stop the chat_form submit event from firing if validation fails\n\t\t\tsubmitError: false, // function called if there is an error when trying to submit\n\t\t\tsubmitSuccess: false, // function called just before a successful submit event is sent to the server\n            semanticallyStrict: false, // set to true to tidy up generated HTML output\n\t\t\tautoAdd: {\n\t\t\t\thelpBlocks: true\n\t\t\t},\n            filter: function () {\n                // return $(this).is(\":visible\"); // only validate elements you can see\n                return true; // validate everything\n            }\n\t\t},\n    methods: {\n      init : function( options ) {\n\n        var settings = $.extend(true, {}, defaults);\n\n        settings.options = $.extend(true, settings.options, options);\n\n        var $siblingElements = this;\n\n        var uniqueForms = $.unique(\n          $siblingElements.map( function () {\n            return $(this).parents(\"chat_form\")[0];\n          }).toArray()\n        );\n\n        $(uniqueForms).bind(\"submit\", function (e) {\n          var $form = $(this);\n          var warningsFound = 0;\n          var $inputs = $form.find(\"input,textarea,select\").not(\"[type=submit],[type=image]\").filter(settings.options.filter);\n          $inputs.trigger(\"submit.validation\").trigger(\"validationLostFocus.validation\");\n\n          $inputs.each(function (i, el) {\n            var $this = $(el),\n              $controlGroup = $this.parents(\".chat_form-group\").first();\n            if (\n              $controlGroup.hasClass(\"warning\")\n            ) {\n              $controlGroup.removeClass(\"warning\").addClass(\"error\");\n              warningsFound++;\n            }\n          });\n\n          $inputs.trigger(\"validationLostFocus.validation\");\n\n          if (warningsFound) {\n            if (settings.options.preventSubmit) {\n              e.preventDefault();\n            }\n            $form.addClass(\"error\");\n            if ($.isFunction(settings.options.submitError)) {\n              settings.options.submitError($form, e, $inputs.jqBootstrapValidation(\"collectErrors\", true));\n            }\n          } else {\n            $form.removeClass(\"error\");\n            if ($.isFunction(settings.options.submitSuccess)) {\n              settings.options.submitSuccess($form, e);\n            }\n          }\n        });\n\n        return this.each(function(){\n\n          // Get references to everything we're interested in\n          var $this = $(this),\n            $controlGroup = $this.parents(\".chat_form-group\").first(),\n            $helpBlock = $controlGroup.find(\".help-block\").first(),\n            $form = $this.parents(\"form\").first(),\n            validatorNames = [];\n\n          // create message container if not exists\n          if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {\n              $helpBlock = $('<div class=\"help-block\" />');\n              $controlGroup.find('.controls').append($helpBlock);\n\t\t\t\t\t\t\tcreatedElements.push($helpBlock[0]);\n          }\n\n          // =============================================================\n          //                                     SNIFF HTML FOR VALIDATORS\n          // =============================================================\n\n          // *snort sniff snuffle*\n\n          if (settings.options.sniffHtml) {\n            var message = \"\";\n            // ---------------------------------------------------------\n            //                                                   PATTERN\n            // ---------------------------------------------------------\n            if ($this.attr(\"pattern\") !== undefined) {\n              message = \"Not in the expected format<!-- data-validation-pattern-message to override -->\";\n              if ($this.data(\"validationPatternMessage\")) {\n                message = $this.data(\"validationPatternMessage\");\n              }\n              $this.data(\"validationPatternMessage\", message);\n              $this.data(\"validationPatternRegex\", $this.attr(\"pattern\"));\n            }\n            // ---------------------------------------------------------\n            //                                                       MAX\n            // ---------------------------------------------------------\n            if ($this.attr(\"max\") !== undefined || $this.attr(\"aria-valuemax\") !== undefined) {\n              var max = ($this.attr(\"max\") !== undefined ? $this.attr(\"max\") : $this.attr(\"aria-valuemax\"));\n              message = \"Too high: Maximum of '\" + max + \"'<!-- data-validation-max-message to override -->\";\n              if ($this.data(\"validationMaxMessage\")) {\n                message = $this.data(\"validationMaxMessage\");\n              }\n              $this.data(\"validationMaxMessage\", message);\n              $this.data(\"validationMaxMax\", max);\n            }\n            // ---------------------------------------------------------\n            //                                                       MIN\n            // ---------------------------------------------------------\n            if ($this.attr(\"min\") !== undefined || $this.attr(\"aria-valuemin\") !== undefined) {\n              var min = ($this.attr(\"min\") !== undefined ? $this.attr(\"min\") : $this.attr(\"aria-valuemin\"));\n              message = \"Too low: Minimum of '\" + min + \"'<!-- data-validation-min-message to override -->\";\n              if ($this.data(\"validationMinMessage\")) {\n                message = $this.data(\"validationMinMessage\");\n              }\n              $this.data(\"validationMinMessage\", message);\n              $this.data(\"validationMinMin\", min);\n            }\n            // ---------------------------------------------------------\n            //                                                 MAXLENGTH\n            // ---------------------------------------------------------\n            if ($this.attr(\"maxlength\") !== undefined) {\n              message = \"Too long: Maximum of '\" + $this.attr(\"maxlength\") + \"' characters<!-- data-validation-maxlength-message to override -->\";\n              if ($this.data(\"validationMaxlengthMessage\")) {\n                message = $this.data(\"validationMaxlengthMessage\");\n              }\n              $this.data(\"validationMaxlengthMessage\", message);\n              $this.data(\"validationMaxlengthMaxlength\", $this.attr(\"maxlength\"));\n            }\n            // ---------------------------------------------------------\n            //                                                 MINLENGTH\n            // ---------------------------------------------------------\n            if ($this.attr(\"minlength\") !== undefined) {\n              message = \"Too short: Minimum of '\" + $this.attr(\"minlength\") + \"' characters<!-- data-validation-minlength-message to override -->\";\n              if ($this.data(\"validationMinlengthMessage\")) {\n                message = $this.data(\"validationMinlengthMessage\");\n              }\n              $this.data(\"validationMinlengthMessage\", message);\n              $this.data(\"validationMinlengthMinlength\", $this.attr(\"minlength\"));\n            }\n            // ---------------------------------------------------------\n            //                                                  REQUIRED\n            // ---------------------------------------------------------\n            if ($this.attr(\"required\") !== undefined || $this.attr(\"aria-required\") !== undefined) {\n              message = settings.builtInValidators.required.message;\n              if ($this.data(\"validationRequiredMessage\")) {\n                message = $this.data(\"validationRequiredMessage\");\n              }\n              $this.data(\"validationRequiredMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                    NUMBER\n            // ---------------------------------------------------------\n            if ($this.attr(\"type\") !== undefined && $this.attr(\"type\").toLowerCase() === \"number\") {\n              message = settings.builtInValidators.number.message;\n              if ($this.data(\"validationNumberMessage\")) {\n                message = $this.data(\"validationNumberMessage\");\n              }\n              $this.data(\"validationNumberMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                     EMAIL\n            // ---------------------------------------------------------\n            if ($this.attr(\"type\") !== undefined && $this.attr(\"type\").toLowerCase() === \"email\") {\n              message = \"Not a valid email address<!-- data-validator-validemail-message to override -->\";\n              if ($this.data(\"validationValidemailMessage\")) {\n                message = $this.data(\"validationValidemailMessage\");\n              } else if ($this.data(\"validationEmailMessage\")) {\n                message = $this.data(\"validationEmailMessage\");\n              }\n              $this.data(\"validationValidemailMessage\", message);\n            }\n            // ---------------------------------------------------------\n            //                                                MINCHECKED\n            // ---------------------------------------------------------\n            if ($this.attr(\"minchecked\") !== undefined) {\n              message = \"Not enough options checked; Minimum of '\" + $this.attr(\"minchecked\") + \"' required<!-- data-validation-minchecked-message to override -->\";\n              if ($this.data(\"validationMincheckedMessage\")) {\n                message = $this.data(\"validationMincheckedMessage\");\n              }\n              $this.data(\"validationMincheckedMessage\", message);\n              $this.data(\"validationMincheckedMinchecked\", $this.attr(\"minchecked\"));\n            }\n            // ---------------------------------------------------------\n            //                                                MAXCHECKED\n            // ---------------------------------------------------------\n            if ($this.attr(\"maxchecked\") !== undefined) {\n              message = \"Too many options checked; Maximum of '\" + $this.attr(\"maxchecked\") + \"' required<!-- data-validation-maxchecked-message to override -->\";\n              if ($this.data(\"validationMaxcheckedMessage\")) {\n                message = $this.data(\"validationMaxcheckedMessage\");\n              }\n              $this.data(\"validationMaxcheckedMessage\", message);\n              $this.data(\"validationMaxcheckedMaxchecked\", $this.attr(\"maxchecked\"));\n            }\n          }\n\n          // =============================================================\n          //                                       COLLECT VALIDATOR NAMES\n          // =============================================================\n\n          // Get named validators\n          if ($this.data(\"validation\") !== undefined) {\n            validatorNames = $this.data(\"validation\").split(\",\");\n          }\n\n          // Get extra ones defined on the element's data attributes\n          $.each($this.data(), function (i, el) {\n            var parts = i.replace(/([A-Z])/g, \",$1\").split(\",\");\n            if (parts[0] === \"validation\" && parts[1]) {\n              validatorNames.push(parts[1]);\n            }\n          });\n\n          // =============================================================\n          //                                     NORMALISE VALIDATOR NAMES\n          // =============================================================\n\n          var validatorNamesToInspect = validatorNames;\n          var newValidatorNamesToInspect = [];\n\n          do // repeatedly expand 'shortcut' validators into their real validators\n          {\n            // Uppercase only the first letter of each name\n            $.each(validatorNames, function (i, el) {\n              validatorNames[i] = formatValidatorName(el);\n            });\n\n            // Remove duplicate validator names\n            validatorNames = $.unique(validatorNames);\n\n            // Pull out the new validator names from each shortcut\n            newValidatorNamesToInspect = [];\n            $.each(validatorNamesToInspect, function(i, el) {\n              if ($this.data(\"validation\" + el + \"Shortcut\") !== undefined) {\n                // Are these custom validators?\n                // Pull them out!\n                $.each($this.data(\"validation\" + el + \"Shortcut\").split(\",\"), function(i2, el2) {\n                  newValidatorNamesToInspect.push(el2);\n                });\n              } else if (settings.builtInValidators[el.toLowerCase()]) {\n                // Is this a recognised built-in?\n                // Pull it out!\n                var validator = settings.builtInValidators[el.toLowerCase()];\n                if (validator.type.toLowerCase() === \"shortcut\") {\n                  $.each(validator.shortcut.split(\",\"), function (i, el) {\n                    el = formatValidatorName(el);\n                    newValidatorNamesToInspect.push(el);\n                    validatorNames.push(el);\n                  });\n                }\n              }\n            });\n\n            validatorNamesToInspect = newValidatorNamesToInspect;\n\n          } while (validatorNamesToInspect.length > 0)\n\n          // =============================================================\n          //                                       SET UP VALIDATOR ARRAYS\n          // =============================================================\n\n          var validators = {};\n\n          $.each(validatorNames, function (i, el) {\n            // Set up the 'override' message\n            var message = $this.data(\"validation\" + el + \"Message\");\n            var hasOverrideMessage = (message !== undefined);\n            var foundValidator = false;\n            message =\n              (\n                message\n                  ? message\n                  : \"'\" + el + \"' validation failed <!-- Add attribute 'data-validation-\" + el.toLowerCase() + \"-message' to input to change this message -->\"\n              )\n            ;\n\n            $.each(\n              settings.validatorTypes,\n              function (validatorType, validatorTemplate) {\n                if (validators[validatorType] === undefined) {\n                  validators[validatorType] = [];\n                }\n                if (!foundValidator && $this.data(\"validation\" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {\n                  validators[validatorType].push(\n                    $.extend(\n                      true,\n                      {\n                        name: formatValidatorName(validatorTemplate.name),\n                        message: message\n                      },\n                      validatorTemplate.init($this, el)\n                    )\n                  );\n                  foundValidator = true;\n                }\n              }\n            );\n\n            if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {\n\n              var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);\n              if (hasOverrideMessage) {\n                validator.message = message;\n              }\n              var validatorType = validator.type.toLowerCase();\n\n              if (validatorType === \"shortcut\") {\n                foundValidator = true;\n              } else {\n                $.each(\n                  settings.validatorTypes,\n                  function (validatorTemplateType, validatorTemplate) {\n                    if (validators[validatorTemplateType] === undefined) {\n                      validators[validatorTemplateType] = [];\n                    }\n                    if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {\n                      $this.data(\"validation\" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);\n                      validators[validatorType].push(\n                        $.extend(\n                          validator,\n                          validatorTemplate.init($this, el)\n                        )\n                      );\n                      foundValidator = true;\n                    }\n                  }\n                );\n              }\n            }\n\n            if (! foundValidator) {\n              $.error(\"Cannot find validation info for '\" + el + \"'\");\n            }\n          });\n\n          // =============================================================\n          //                                         STORE FALLBACK VALUES\n          // =============================================================\n\n          $helpBlock.data(\n            \"original-contents\",\n            (\n              $helpBlock.data(\"original-contents\")\n                ? $helpBlock.data(\"original-contents\")\n                : $helpBlock.html()\n            )\n          );\n\n          $helpBlock.data(\n            \"original-role\",\n            (\n              $helpBlock.data(\"original-role\")\n                ? $helpBlock.data(\"original-role\")\n                : $helpBlock.attr(\"role\")\n            )\n          );\n\n          $controlGroup.data(\n            \"original-classes\",\n            (\n              $controlGroup.data(\"original-clases\")\n                ? $controlGroup.data(\"original-classes\")\n                : $controlGroup.attr(\"class\")\n            )\n          );\n\n          $this.data(\n            \"original-aria-invalid\",\n            (\n              $this.data(\"original-aria-invalid\")\n                ? $this.data(\"original-aria-invalid\")\n                : $this.attr(\"aria-invalid\")\n            )\n          );\n\n          // =============================================================\n          //                                                    VALIDATION\n          // =============================================================\n\n          $this.bind(\n            \"validation.validation\",\n            function (event, params) {\n\n              var value = getValue($this);\n\n              // Get a list of the errors to apply\n              var errorsFound = [];\n\n              $.each(validators, function (validatorType, validatorTypeArray) {\n                if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {\n                  $.each(validatorTypeArray, function (i, validator) {\n                    if (settings.validatorTypes[validatorType].validate($this, value, validator)) {\n                      errorsFound.push(validator.message);\n                    }\n                  });\n                }\n              });\n\n              return errorsFound;\n            }\n          );\n\n          $this.bind(\n            \"getValidators.validation\",\n            function () {\n              return validators;\n            }\n          );\n\n          // =============================================================\n          //                                             WATCH FOR CHANGES\n          // =============================================================\n          $this.bind(\n            \"submit.validation\",\n            function () {\n              return $this.triggerHandler(\"change.validation\", {submitting: true});\n            }\n          );\n          $this.bind(\n            [\n              \"keyup\",\n              \"focus\",\n              \"blur\",\n              \"click\",\n              \"keydown\",\n              \"keypress\",\n              \"change\"\n            ].join(\".validation \") + \".validation\",\n            function (e, params) {\n\n              var value = getValue($this);\n\n              var errorsFound = [];\n\n              $controlGroup.find(\"input,textarea,select\").each(function (i, el) {\n                var oldCount = errorsFound.length;\n                $.each($(el).triggerHandler(\"validation.validation\", params), function (j, message) {\n                  errorsFound.push(message);\n                });\n                if (errorsFound.length > oldCount) {\n                  $(el).attr(\"aria-invalid\", \"true\");\n                } else {\n                  var original = $this.data(\"original-aria-invalid\");\n                  $(el).attr(\"aria-invalid\", (original !== undefined ? original : false));\n                }\n              });\n\n              $form.find(\"input,select,textarea\").not($this).not(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\").trigger(\"validationLostFocus.validation\");\n\n              errorsFound = $.unique(errorsFound.sort());\n\n              // Were there any errors?\n              if (errorsFound.length) {\n                // Better flag it up as a warning.\n                $controlGroup.removeClass(\"success error\").addClass(\"warning\");\n\n                // How many errors did we find?\n                if (settings.options.semanticallyStrict && errorsFound.length === 1) {\n                  // Only one? Being strict? Just output it.\n                  $helpBlock.html(errorsFound[0] + \n                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data(\"original-contents\") : \"\" ));\n                } else {\n                  // Multiple? Being sloppy? Glue them together into an UL.\n                  $helpBlock.html(\"<ul role=\\\"alert\\\"><li>\" + errorsFound.join(\"</li><li>\") + \"</li></ul>\" +\n                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data(\"original-contents\") : \"\" ));\n                }\n              } else {\n                $controlGroup.removeClass(\"warning error success\");\n                if (value.length > 0) {\n                  $controlGroup.addClass(\"success\");\n                }\n                $helpBlock.html($helpBlock.data(\"original-contents\"));\n              }\n\n              if (e.type === \"blur\") {\n                $controlGroup.removeClass(\"success\");\n              }\n            }\n          );\n          $this.bind(\"validationLostFocus.validation\", function () {\n            $controlGroup.removeClass(\"success\");\n          });\n        });\n      },\n      destroy : function( ) {\n\n        return this.each(\n          function() {\n\n            var\n              $this = $(this),\n              $controlGroup = $this.parents(\".chat_form-group\").first(),\n              $helpBlock = $controlGroup.find(\".help-block\").first();\n\n            // remove our events\n            $this.unbind('.validation'); // events are namespaced.\n            // reset help text\n            $helpBlock.html($helpBlock.data(\"original-contents\"));\n            // reset classes\n            $controlGroup.attr(\"class\", $controlGroup.data(\"original-classes\"));\n            // reset aria\n            $this.attr(\"aria-invalid\", $this.data(\"original-aria-invalid\"));\n            // reset role\n            $helpBlock.attr(\"role\", $this.data(\"original-role\"));\n\t\t\t\t\t\t// remove all elements we created\n\t\t\t\t\t\tif (createdElements.indexOf($helpBlock[0]) > -1) {\n\t\t\t\t\t\t\t$helpBlock.remove();\n\t\t\t\t\t\t}\n\n          }\n        );\n\n      },\n      collectErrors : function(includeEmpty) {\n\n        var errorMessages = {};\n        this.each(function (i, el) {\n          var $el = $(el);\n          var name = $el.attr(\"name\");\n          var errors = $el.triggerHandler(\"validation.validation\", {includeEmpty: true});\n          errorMessages[name] = $.extend(true, errors, errorMessages[name]);\n        });\n\n        $.each(errorMessages, function (i, el) {\n          if (el.length === 0) {\n            delete errorMessages[i];\n          }\n        });\n\n        return errorMessages;\n\n      },\n      hasErrors: function() {\n\n        var errorMessages = [];\n\n        this.each(function (i, el) {\n          errorMessages = errorMessages.concat(\n            $(el).triggerHandler(\"getValidators.validation\") ? $(el).triggerHandler(\"validation.validation\", {submitting: true}) : []\n          );\n        });\n\n        return (errorMessages.length > 0);\n      },\n      override : function (newDefaults) {\n        defaults = $.extend(true, defaults, newDefaults);\n      }\n    },\n\t\tvalidatorTypes: {\n      callback: {\n        name: \"callback\",\n        init: function ($this, name) {\n          return {\n            validatorName: name,\n            callback: $this.data(\"validation\" + name + \"Callback\"),\n            lastValue: $this.val(),\n            lastValid: true,\n            lastFinished: true\n          };\n        },\n        validate: function ($this, value, validator) {\n          if (validator.lastValue === value && validator.lastFinished) {\n            return !validator.lastValid;\n          }\n\n          if (validator.lastFinished === true)\n          {\n            validator.lastValue = value;\n            validator.lastValid = true;\n            validator.lastFinished = false;\n\n            var rrjqbvValidator = validator;\n            var rrjqbvThis = $this;\n            executeFunctionByName(\n              validator.callback,\n              window,\n              $this,\n              value,\n              function (data) {\n                if (rrjqbvValidator.lastValue === data.value) {\n                  rrjqbvValidator.lastValid = data.valid;\n                  if (data.message) {\n                    rrjqbvValidator.message = data.message;\n                  }\n                  rrjqbvValidator.lastFinished = true;\n                  rrjqbvThis.data(\"validation\" + rrjqbvValidator.validatorName + \"Message\", rrjqbvValidator.message);\n                  // Timeout is set to avoid problems with the events being considered 'already fired'\n                  setTimeout(function () {\n                    rrjqbvThis.trigger(\"change.validation\");\n                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n                }\n              }\n            );\n          }\n\n          return false;\n\n        }\n      },\n      ajax: {\n        name: \"ajax\",\n        init: function ($this, name) {\n          return {\n            validatorName: name,\n            url: $this.data(\"validation\" + name + \"Ajax\"),\n            lastValue: $this.val(),\n            lastValid: true,\n            lastFinished: true\n          };\n        },\n        validate: function ($this, value, validator) {\n          if (\"\"+validator.lastValue === \"\"+value && validator.lastFinished === true) {\n            return validator.lastValid === false;\n          }\n\n          if (validator.lastFinished === true)\n          {\n            validator.lastValue = value;\n            validator.lastValid = true;\n            validator.lastFinished = false;\n            $.ajax({\n              url: validator.url,\n              data: \"value=\" + value + \"&field=\" + $this.attr(\"name\"),\n              dataType: \"json\",\n              success: function (data) {\n                if (\"\"+validator.lastValue === \"\"+data.value) {\n                  validator.lastValid = !!(data.valid);\n                  if (data.message) {\n                    validator.message = data.message;\n                  }\n                  validator.lastFinished = true;\n                  $this.data(\"validation\" + validator.validatorName + \"Message\", validator.message);\n                  // Timeout is set to avoid problems with the events being considered 'already fired'\n                  setTimeout(function () {\n                    $this.trigger(\"change.validation\");\n                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n                }\n              },\n              failure: function () {\n                validator.lastValid = true;\n                validator.message = \"ajax call failed\";\n                validator.lastFinished = true;\n                $this.data(\"validation\" + validator.validatorName + \"Message\", validator.message);\n                // Timeout is set to avoid problems with the events being considered 'already fired'\n                setTimeout(function () {\n                  $this.trigger(\"change.validation\");\n                }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst\n              }\n            });\n          }\n\n          return false;\n\n        }\n      },\n\t\t\tregex: {\n\t\t\t\tname: \"regex\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {regex: regexFromString($this.data(\"validation\" + name + \"Regex\"))};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (!validator.regex.test(value) && ! validator.negative)\n\t\t\t\t\t\t|| (validator.regex.test(value) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\trequired: {\n\t\t\t\tname: \"required\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn !!(value.length === 0  && ! validator.negative)\n\t\t\t\t\t\t|| !!(value.length > 0 && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tmatch: {\n\t\t\t\tname: \"match\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar element = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.data(\"validation\" + name + \"Match\") + \"\\\"]\").first();\n\t\t\t\t\telement.bind(\"validation.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {submitting: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {\"element\": element};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (value !== validator.element.val() && ! validator.negative)\n\t\t\t\t\t\t|| (value === validator.element.val() && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tmax: {\n\t\t\t\tname: \"max\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {max: $this.data(\"validation\" + name + \"Max\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)\n\t\t\t\t\t\t|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmin: {\n\t\t\t\tname: \"min\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {min: $this.data(\"validation\" + name + \"Min\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)\n\t\t\t\t\t\t|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxlength: {\n\t\t\t\tname: \"maxlength\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {maxlength: $this.data(\"validation\" + name + \"Maxlength\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn ((value.length > validator.maxlength) && ! validator.negative)\n\t\t\t\t\t\t|| ((value.length <= validator.maxlength) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tminlength: {\n\t\t\t\tname: \"minlength\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\treturn {minlength: $this.data(\"validation\" + name + \"Minlength\")};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn ((value.length < validator.minlength) && ! validator.negative)\n\t\t\t\t\t\t|| ((value.length >= validator.minlength) && validator.negative);\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxchecked: {\n\t\t\t\tname: \"maxchecked\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar elements = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\");\n\t\t\t\t\telements.bind(\"click.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {includeEmpty: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {maxchecked: $this.data(\"validation\" + name + \"Maxchecked\"), elements: elements};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (validator.elements.filter(\":checked\").length > validator.maxchecked && ! validator.negative)\n\t\t\t\t\t\t|| (validator.elements.filter(\":checked\").length <= validator.maxchecked && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t},\n\t\t\tminchecked: {\n\t\t\t\tname: \"minchecked\",\n\t\t\t\tinit: function ($this, name) {\n\t\t\t\t\tvar elements = $this.parents(\"form\").first().find(\"[name=\\\"\" + $this.attr(\"name\") + \"\\\"]\");\n\t\t\t\t\telements.bind(\"click.validation\", function () {\n\t\t\t\t\t\t$this.trigger(\"change.validation\", {includeEmpty: true});\n\t\t\t\t\t});\n\t\t\t\t\treturn {minchecked: $this.data(\"validation\" + name + \"Minchecked\"), elements: elements};\n\t\t\t\t},\n\t\t\t\tvalidate: function ($this, value, validator) {\n\t\t\t\t\treturn (validator.elements.filter(\":checked\").length < validator.minchecked && ! validator.negative)\n\t\t\t\t\t\t|| (validator.elements.filter(\":checked\").length >= validator.minchecked && validator.negative);\n\t\t\t\t},\n        blockSubmit: true\n\t\t\t}\n\t\t},\n\t\tbuiltInValidators: {\n\t\t\temail: {\n\t\t\t\tname: \"Email\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"validemail\"\n\t\t\t},\n\t\t\tvalidemail: {\n\t\t\t\tname: \"Validemail\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\\\.[A-Za-z]{2,4}\",\n\t\t\t\tmessage: \"Not a valid email address<!-- data-validator-validemail-message to override -->\"\n\t\t\t},\n\t\t\tpasswordagain: {\n\t\t\t\tname: \"Passwordagain\",\n\t\t\t\ttype: \"match\",\n\t\t\t\tmatch: \"password\",\n\t\t\t\tmessage: \"Does not match the given password<!-- data-validator-paswordagain-message to override -->\"\n\t\t\t},\n\t\t\tpositive: {\n\t\t\t\tname: \"Positive\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"number,positivenumber\"\n\t\t\t},\n\t\t\tnegative: {\n\t\t\t\tname: \"Negative\",\n\t\t\t\ttype: \"shortcut\",\n\t\t\t\tshortcut: \"number,negativenumber\"\n\t\t\t},\n\t\t\tnumber: {\n\t\t\t\tname: \"Number\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"([+-]?\\\\\\d+(\\\\\\.\\\\\\d*)?([eE][+-]?[0-9]+)?)?\",\n\t\t\t\tmessage: \"Must be a number<!-- data-validator-number-message to override -->\"\n\t\t\t},\n\t\t\tinteger: {\n\t\t\t\tname: \"Integer\",\n\t\t\t\ttype: \"regex\",\n\t\t\t\tregex: \"[+-]?\\\\\\d+\",\n\t\t\t\tmessage: \"No decimal places allowed<!-- data-validator-integer-message to override -->\"\n\t\t\t},\n\t\t\tpositivenumber: {\n\t\t\t\tname: \"Positivenumber\",\n\t\t\t\ttype: \"min\",\n\t\t\t\tmin: 0,\n\t\t\t\tmessage: \"Must be a positive number<!-- data-validator-positivenumber-message to override -->\"\n\t\t\t},\n\t\t\tnegativenumber: {\n\t\t\t\tname: \"Negativenumber\",\n\t\t\t\ttype: \"max\",\n\t\t\t\tmax: 0,\n\t\t\t\tmessage: \"Must be a negative number<!-- data-validator-negativenumber-message to override -->\"\n\t\t\t},\n\t\t\trequired: {\n\t\t\t\tname: \"Required\",\n\t\t\t\ttype: \"required\",\n\t\t\t\tmessage: \"This is required<!-- data-validator-required-message to override -->\"\n\t\t\t},\n\t\t\tcheckone: {\n\t\t\t\tname: \"Checkone\",\n\t\t\t\ttype: \"minchecked\",\n\t\t\t\tminchecked: 1,\n\t\t\t\tmessage: \"Check at least one option<!-- data-validation-checkone-message to override -->\"\n\t\t\t}\n\t\t}\n\t};\n\n\tvar formatValidatorName = function (name) {\n\t\treturn name\n\t\t\t.toLowerCase()\n\t\t\t.replace(\n\t\t\t\t/(^|\\s)([a-z])/g ,\n\t\t\t\tfunction(m,p1,p2) {\n\t\t\t\t\treturn p1+p2.toUpperCase();\n\t\t\t\t}\n\t\t\t)\n\t\t;\n\t};\n\n\tvar getValue = function ($this) {\n\t\t// Extract the value we're talking about\n\t\tvar value = $this.val();\n\t\tvar type = $this.attr(\"type\");\n\t\tif (type === \"checkbox\") {\n\t\t\tvalue = ($this.is(\":checked\") ? value : \"\");\n\t\t}\n\t\tif (type === \"radio\") {\n\t\t\tvalue = ($('input[name=\"' + $this.attr(\"name\") + '\"]:checked').length > 0 ? value : \"\");\n\t\t}\n\t\treturn value;\n\t};\n\n  function regexFromString(inputstring) {\n\t\treturn new RegExp(\"^\" + inputstring + \"$\");\n\t}\n\n  /**\n   * Thanks to Jason Bunting via StackOverflow.com\n   *\n   * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910\n   * Short link: http://tinyurl.com/executeFunctionByName\n  **/\n  function executeFunctionByName(functionName, context /*, args*/) {\n    var args = Array.prototype.slice.call(arguments).splice(2);\n    var namespaces = functionName.split(\".\");\n    var func = namespaces.pop();\n    for(var i = 0; i < namespaces.length; i++) {\n      context = context[namespaces[i]];\n    }\n    return context[func].apply(this, args);\n  }\n\n\t$.fn.jqBootstrapValidation = function( method ) {\n\n\t\tif ( defaults.methods[method] ) {\n\t\t\treturn defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));\n\t\t} else if ( typeof method === 'object' || ! method ) {\n\t\t\treturn defaults.methods.init.apply( this, arguments );\n\t\t} else {\n\t\t$.error( 'Method ' +  method + ' does not exist on jQuery.jqBootstrapValidation' );\n\t\t\treturn null;\n\t\t}\n\n\t};\n\n  $.jqBootstrapValidation = function (options) {\n    $(\":input\").not(\"[type=image],[type=submit]\").jqBootstrapValidation.apply(this,arguments);\n  };\n\n})( jQuery );\n"
  },
  {
    "path": "webpage/deepchat/static/js/user_form.js",
    "content": "$(document).ready(function() {\n\n    $('#user-form-submit').on('click', function(e) {\n        var userName = $('#user-name');\n        if (!userName.val()) {  // don't do anything on empty input\n            return;\n        }\n        // Submit a POST request to collect user input.\n        $.post('/user/', {\"name\": userName.val()}, function(data) {\n            $('#nav-session-user').html('User: ' + data.name);\n            userName.val(\"\");\n        });\n    });\n\n    $('#user-name').on('keypress', function(e) {\n        if (e.which == 13) {\n            $('#user-form-submit').click();\n        }\n    })\n\n\n});\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    /* test */\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot');\n  src: url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff') format('woff'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  min-height: 34px;\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  padding-right: 15px;\n  padding-left: 15px;\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  filter: alpha(opacity=0);\n  opacity: 0;\n\n  line-break: auto;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n  line-break: auto;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n            perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  background-color: rgba(0, 0, 0, 0);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n  margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  font-family: serif;\n  line-height: 1;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.7\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.7\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.7'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector === '#' ? [] : selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.7\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.7'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d).prop(d, true)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d).prop(d, false)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target).closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"], input[type=\"checkbox\"]'))) {\n        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes\n        e.preventDefault()\n        // The target component still receive the focus\n        if ($btn.is('input,button')) $btn.trigger('focus')\n        else $btn.find('input:visible,button:visible').first().trigger('focus')\n      }\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.7\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.7'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.7\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n/* jshint latedef: false */\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.7'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.7\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.7'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.7\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.7'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (document !== e.target &&\n            this.$element[0] !== e.target &&\n            !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.7\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.7'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\n        that.$element\n          .removeAttr('aria-describedby')\n          .trigger('hidden.bs.' + that.type)\n      }\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var isSvg = window.SVGElement && el instanceof window.SVGElement\n    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\n    // See https://github.com/twbs/bootstrap/issues/20280\n    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n      that.$element = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.7\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.7'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.7\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.7'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.7\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.7'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.7\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.7'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.6.3');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.fa-pull-left {\n  float: left;\n}\n.fa-pull-right {\n  float: right;\n}\n.fa.fa-pull-left {\n  margin-right: .3em;\n}\n.fa.fa-pull-right {\n  margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-resistance:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-genderless:before {\n  content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n  content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n  content: \"\\f23c\";\n}\n.fa-opencart:before {\n  content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n  content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery-full:before {\n  content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n  content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n  content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n  content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n  content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n  content: \"\\f245\";\n}\n.fa-i-cursor:before {\n  content: \"\\f246\";\n}\n.fa-object-group:before {\n  content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n  content: \"\\f248\";\n}\n.fa-sticky-note:before {\n  content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n  content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n  content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n  content: \"\\f24c\";\n}\n.fa-clone:before {\n  content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n  content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n  content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n  content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n  content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n  content: \"\\f253\";\n}\n.fa-hourglass:before {\n  content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n  content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n  content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n  content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n  content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n  content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n  content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n  content: \"\\f25b\";\n}\n.fa-trademark:before {\n  content: \"\\f25c\";\n}\n.fa-registered:before {\n  content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n  content: \"\\f25e\";\n}\n.fa-gg:before {\n  content: \"\\f260\";\n}\n.fa-gg-circle:before {\n  content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n  content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n  content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\";\n}\n.fa-get-pocket:before {\n  content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n  content: \"\\f266\";\n}\n.fa-safari:before {\n  content: \"\\f267\";\n}\n.fa-chrome:before {\n  content: \"\\f268\";\n}\n.fa-firefox:before {\n  content: \"\\f269\";\n}\n.fa-opera:before {\n  content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n  content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n  content: \"\\f26c\";\n}\n.fa-contao:before {\n  content: \"\\f26d\";\n}\n.fa-500px:before {\n  content: \"\\f26e\";\n}\n.fa-amazon:before {\n  content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n  content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n  content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n  content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n  content: \"\\f274\";\n}\n.fa-industry:before {\n  content: \"\\f275\";\n}\n.fa-map-pin:before {\n  content: \"\\f276\";\n}\n.fa-map-signs:before {\n  content: \"\\f277\";\n}\n.fa-map-o:before {\n  content: \"\\f278\";\n}\n.fa-map:before {\n  content: \"\\f279\";\n}\n.fa-commenting:before {\n  content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n  content: \"\\f27b\";\n}\n.fa-houzz:before {\n  content: \"\\f27c\";\n}\n.fa-vimeo:before {\n  content: \"\\f27d\";\n}\n.fa-black-tie:before {\n  content: \"\\f27e\";\n}\n.fa-fonticons:before {\n  content: \"\\f280\";\n}\n.fa-reddit-alien:before {\n  content: \"\\f281\";\n}\n.fa-edge:before {\n  content: \"\\f282\";\n}\n.fa-credit-card-alt:before {\n  content: \"\\f283\";\n}\n.fa-codiepie:before {\n  content: \"\\f284\";\n}\n.fa-modx:before {\n  content: \"\\f285\";\n}\n.fa-fort-awesome:before {\n  content: \"\\f286\";\n}\n.fa-usb:before {\n  content: \"\\f287\";\n}\n.fa-product-hunt:before {\n  content: \"\\f288\";\n}\n.fa-mixcloud:before {\n  content: \"\\f289\";\n}\n.fa-scribd:before {\n  content: \"\\f28a\";\n}\n.fa-pause-circle:before {\n  content: \"\\f28b\";\n}\n.fa-pause-circle-o:before {\n  content: \"\\f28c\";\n}\n.fa-stop-circle:before {\n  content: \"\\f28d\";\n}\n.fa-stop-circle-o:before {\n  content: \"\\f28e\";\n}\n.fa-shopping-bag:before {\n  content: \"\\f290\";\n}\n.fa-shopping-basket:before {\n  content: \"\\f291\";\n}\n.fa-hashtag:before {\n  content: \"\\f292\";\n}\n.fa-bluetooth:before {\n  content: \"\\f293\";\n}\n.fa-bluetooth-b:before {\n  content: \"\\f294\";\n}\n.fa-percent:before {\n  content: \"\\f295\";\n}\n.fa-gitlab:before {\n  content: \"\\f296\";\n}\n.fa-wpbeginner:before {\n  content: \"\\f297\";\n}\n.fa-wpforms:before {\n  content: \"\\f298\";\n}\n.fa-envira:before {\n  content: \"\\f299\";\n}\n.fa-universal-access:before {\n  content: \"\\f29a\";\n}\n.fa-wheelchair-alt:before {\n  content: \"\\f29b\";\n}\n.fa-question-circle-o:before {\n  content: \"\\f29c\";\n}\n.fa-blind:before {\n  content: \"\\f29d\";\n}\n.fa-audio-description:before {\n  content: \"\\f29e\";\n}\n.fa-volume-control-phone:before {\n  content: \"\\f2a0\";\n}\n.fa-braille:before {\n  content: \"\\f2a1\";\n}\n.fa-assistive-listening-systems:before {\n  content: \"\\f2a2\";\n}\n.fa-asl-interpreting:before,\n.fa-american-sign-language-interpreting:before {\n  content: \"\\f2a3\";\n}\n.fa-deafness:before,\n.fa-hard-of-hearing:before,\n.fa-deaf:before {\n  content: \"\\f2a4\";\n}\n.fa-glide:before {\n  content: \"\\f2a5\";\n}\n.fa-glide-g:before {\n  content: \"\\f2a6\";\n}\n.fa-signing:before,\n.fa-sign-language:before {\n  content: \"\\f2a7\";\n}\n.fa-low-vision:before {\n  content: \"\\f2a8\";\n}\n.fa-viadeo:before {\n  content: \"\\f2a9\";\n}\n.fa-viadeo-square:before {\n  content: \"\\f2aa\";\n}\n.fa-snapchat:before {\n  content: \"\\f2ab\";\n}\n.fa-snapchat-ghost:before {\n  content: \"\\f2ac\";\n}\n.fa-snapchat-square:before {\n  content: \"\\f2ad\";\n}\n.fa-pied-piper:before {\n  content: \"\\f2ae\";\n}\n.fa-first-order:before {\n  content: \"\\f2b0\";\n}\n.fa-yoast:before {\n  content: \"\\f2b1\";\n}\n.fa-themeisle:before {\n  content: \"\\f2b2\";\n}\n.fa-google-plus-circle:before,\n.fa-google-plus-official:before {\n  content: \"\\f2b3\";\n}\n.fa-fa:before,\n.fa-font-awesome:before {\n  content: \"\\f2b4\";\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/animated.less",
    "content": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.@{fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.@{fa-css-prefix}-pull-left { float: left; }\n.@{fa-css-prefix}-pull-right { float: right; }\n\n.@{fa-css-prefix} {\n  &.@{fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.@{fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"animated.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n@import \"screen-reader.less\";\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-remove:before,\n.@{fa-css-prefix}-close:before,\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before,\n.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook-f:before,\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-feed:before,\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before,\n.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-buoy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-resistance:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-y-combinator-square:before,\n.@{fa-css-prefix}-yc-square:before,\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n.@{fa-css-prefix}-soccer-ball-o:before,\n.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }\n.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }\n.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }\n.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }\n.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }\n.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }\n.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }\n.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }\n.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }\n.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }\n.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }\n.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }\n.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }\n.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }\n.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }\n.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }\n.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }\n.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }\n.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }\n.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }\n.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }\n.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }\n.@{fa-css-prefix}-at:before { content: @fa-var-at; }\n.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }\n.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }\n.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }\n.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }\n.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }\n.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }\n.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }\n.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }\n.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }\n.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }\n.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }\n.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }\n.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }\n.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }\n.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }\n.@{fa-css-prefix}-shekel:before,\n.@{fa-css-prefix}-sheqel:before,\n.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }\n.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }\n.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }\n.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }\n.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }\n.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }\n.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }\n.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }\n.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }\n.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }\n.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }\n.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }\n.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }\n.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }\n.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }\n.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }\n.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }\n.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }\n.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }\n.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }\n.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }\n.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }\n.@{fa-css-prefix}-intersex:before,\n.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }\n.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }\n.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }\n.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }\n.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }\n.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }\n.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }\n.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }\n.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }\n.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; }\n.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }\n.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }\n.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }\n.@{fa-css-prefix}-server:before { content: @fa-var-server; }\n.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }\n.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }\n.@{fa-css-prefix}-hotel:before,\n.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }\n.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }\n.@{fa-css-prefix}-train:before { content: @fa-var-train; }\n.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }\n.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }\n.@{fa-css-prefix}-yc:before,\n.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; }\n.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; }\n.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; }\n.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; }\n.@{fa-css-prefix}-battery-4:before,\n.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; }\n.@{fa-css-prefix}-battery-3:before,\n.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; }\n.@{fa-css-prefix}-battery-2:before,\n.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; }\n.@{fa-css-prefix}-battery-1:before,\n.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; }\n.@{fa-css-prefix}-battery-0:before,\n.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; }\n.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; }\n.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; }\n.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; }\n.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; }\n.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; }\n.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; }\n.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; }\n.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; }\n.@{fa-css-prefix}-clone:before { content: @fa-var-clone; }\n.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; }\n.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; }\n.@{fa-css-prefix}-hourglass-1:before,\n.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; }\n.@{fa-css-prefix}-hourglass-2:before,\n.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; }\n.@{fa-css-prefix}-hourglass-3:before,\n.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; }\n.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; }\n.@{fa-css-prefix}-hand-grab-o:before,\n.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; }\n.@{fa-css-prefix}-hand-stop-o:before,\n.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; }\n.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; }\n.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; }\n.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; }\n.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; }\n.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; }\n.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; }\n.@{fa-css-prefix}-registered:before { content: @fa-var-registered; }\n.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; }\n.@{fa-css-prefix}-gg:before { content: @fa-var-gg; }\n.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; }\n.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; }\n.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; }\n.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; }\n.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; }\n.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; }\n.@{fa-css-prefix}-safari:before { content: @fa-var-safari; }\n.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; }\n.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; }\n.@{fa-css-prefix}-opera:before { content: @fa-var-opera; }\n.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; }\n.@{fa-css-prefix}-tv:before,\n.@{fa-css-prefix}-television:before { content: @fa-var-television; }\n.@{fa-css-prefix}-contao:before { content: @fa-var-contao; }\n.@{fa-css-prefix}-500px:before { content: @fa-var-500px; }\n.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; }\n.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; }\n.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; }\n.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; }\n.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; }\n.@{fa-css-prefix}-industry:before { content: @fa-var-industry; }\n.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; }\n.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; }\n.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; }\n.@{fa-css-prefix}-map:before { content: @fa-var-map; }\n.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; }\n.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; }\n.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; }\n.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; }\n.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; }\n.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; }\n.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; }\n.@{fa-css-prefix}-edge:before { content: @fa-var-edge; }\n.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; }\n.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; }\n.@{fa-css-prefix}-modx:before { content: @fa-var-modx; }\n.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; }\n.@{fa-css-prefix}-usb:before { content: @fa-var-usb; }\n.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; }\n.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; }\n.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; }\n.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; }\n.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; }\n.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; }\n.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; }\n.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; }\n.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; }\n.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; }\n.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; }\n.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; }\n.@{fa-css-prefix}-percent:before { content: @fa-var-percent; }\n.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; }\n.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; }\n.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; }\n.@{fa-css-prefix}-envira:before { content: @fa-var-envira; }\n.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; }\n.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; }\n.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; }\n.@{fa-css-prefix}-blind:before { content: @fa-var-blind; }\n.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; }\n.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; }\n.@{fa-css-prefix}-braille:before { content: @fa-var-braille; }\n.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; }\n.@{fa-css-prefix}-asl-interpreting:before,\n.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; }\n.@{fa-css-prefix}-deafness:before,\n.@{fa-css-prefix}-hard-of-hearing:before,\n.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; }\n.@{fa-css-prefix}-glide:before { content: @fa-var-glide; }\n.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; }\n.@{fa-css-prefix}-signing:before,\n.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; }\n.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; }\n.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; }\n.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; }\n.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; }\n.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; }\n.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; }\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; }\n.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; }\n.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; }\n.@{fa-css-prefix}-google-plus-circle:before,\n.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; }\n.@{fa-css-prefix}-fa:before,\n.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: (-@fa-li-width + (4em / 14));\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n.fa-icon-rotate(@degrees, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})\";\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)\";\n  -webkit-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only() {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable() {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),\n    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),\n    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),\n    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),\n    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');\n  // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .@{fa-css-prefix}-rotate-90,\n:root .@{fa-css-prefix}-rotate-180,\n:root .@{fa-css-prefix}-rotate-270,\n:root .@{fa-css-prefix}-flip-horizontal,\n:root .@{fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/screen-reader.less",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { .sr-only(); }\n.sr-only-focusable { .sr-only-focusable(); }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/less/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n@fa-line-height-base: 1;\n//@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.6.3\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-500px: \"\\f26e\";\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-amazon: \"\\f270\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-american-sign-language-interpreting: \"\\f2a3\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angellist: \"\\f209\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-area-chart: \"\\f1fe\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asl-interpreting: \"\\f2a3\";\n@fa-var-assistive-listening-systems: \"\\f2a2\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-at: \"\\f1fa\";\n@fa-var-audio-description: \"\\f29e\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-balance-scale: \"\\f24e\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart: \"\\f080\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-battery-0: \"\\f244\";\n@fa-var-battery-1: \"\\f243\";\n@fa-var-battery-2: \"\\f242\";\n@fa-var-battery-3: \"\\f241\";\n@fa-var-battery-4: \"\\f240\";\n@fa-var-battery-empty: \"\\f244\";\n@fa-var-battery-full: \"\\f240\";\n@fa-var-battery-half: \"\\f242\";\n@fa-var-battery-quarter: \"\\f243\";\n@fa-var-battery-three-quarters: \"\\f241\";\n@fa-var-bed: \"\\f236\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bell-slash: \"\\f1f6\";\n@fa-var-bell-slash-o: \"\\f1f7\";\n@fa-var-bicycle: \"\\f206\";\n@fa-var-binoculars: \"\\f1e5\";\n@fa-var-birthday-cake: \"\\f1fd\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-black-tie: \"\\f27e\";\n@fa-var-blind: \"\\f29d\";\n@fa-var-bluetooth: \"\\f293\";\n@fa-var-bluetooth-b: \"\\f294\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-braille: \"\\f2a1\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-bus: \"\\f207\";\n@fa-var-buysellads: \"\\f20d\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calculator: \"\\f1ec\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-check-o: \"\\f274\";\n@fa-var-calendar-minus-o: \"\\f272\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-calendar-plus-o: \"\\f271\";\n@fa-var-calendar-times-o: \"\\f273\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-cart-arrow-down: \"\\f218\";\n@fa-var-cart-plus: \"\\f217\";\n@fa-var-cc: \"\\f20a\";\n@fa-var-cc-amex: \"\\f1f3\";\n@fa-var-cc-diners-club: \"\\f24c\";\n@fa-var-cc-discover: \"\\f1f2\";\n@fa-var-cc-jcb: \"\\f24b\";\n@fa-var-cc-mastercard: \"\\f1f1\";\n@fa-var-cc-paypal: \"\\f1f4\";\n@fa-var-cc-stripe: \"\\f1f5\";\n@fa-var-cc-visa: \"\\f1f0\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-chrome: \"\\f268\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-clone: \"\\f24d\";\n@fa-var-close: \"\\f00d\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-codiepie: \"\\f284\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-commenting: \"\\f27a\";\n@fa-var-commenting-o: \"\\f27b\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-connectdevelop: \"\\f20e\";\n@fa-var-contao: \"\\f26d\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-copyright: \"\\f1f9\";\n@fa-var-creative-commons: \"\\f25e\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-credit-card-alt: \"\\f283\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-dashcube: \"\\f210\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-deaf: \"\\f2a4\";\n@fa-var-deafness: \"\\f2a4\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-diamond: \"\\f219\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edge: \"\\f282\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-envira: \"\\f299\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-expeditedssl: \"\\f23e\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-eyedropper: \"\\f1fb\";\n@fa-var-fa: \"\\f2b4\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-f: \"\\f09a\";\n@fa-var-facebook-official: \"\\f230\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-feed: \"\\f09e\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-firefox: \"\\f269\";\n@fa-var-first-order: \"\\f2b0\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-font-awesome: \"\\f2b4\";\n@fa-var-fonticons: \"\\f280\";\n@fa-var-fort-awesome: \"\\f286\";\n@fa-var-forumbee: \"\\f211\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-futbol-o: \"\\f1e3\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-genderless: \"\\f22d\";\n@fa-var-get-pocket: \"\\f265\";\n@fa-var-gg: \"\\f260\";\n@fa-var-gg-circle: \"\\f261\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gitlab: \"\\f296\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-glide: \"\\f2a5\";\n@fa-var-glide-g: \"\\f2a6\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-circle: \"\\f2b3\";\n@fa-var-google-plus-official: \"\\f2b3\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-google-wallet: \"\\f1ee\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-gratipay: \"\\f184\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-grab-o: \"\\f255\";\n@fa-var-hand-lizard-o: \"\\f258\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hand-paper-o: \"\\f256\";\n@fa-var-hand-peace-o: \"\\f25b\";\n@fa-var-hand-pointer-o: \"\\f25a\";\n@fa-var-hand-rock-o: \"\\f255\";\n@fa-var-hand-scissors-o: \"\\f257\";\n@fa-var-hand-spock-o: \"\\f259\";\n@fa-var-hand-stop-o: \"\\f256\";\n@fa-var-hard-of-hearing: \"\\f2a4\";\n@fa-var-hashtag: \"\\f292\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-heartbeat: \"\\f21e\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-hotel: \"\\f236\";\n@fa-var-hourglass: \"\\f254\";\n@fa-var-hourglass-1: \"\\f251\";\n@fa-var-hourglass-2: \"\\f252\";\n@fa-var-hourglass-3: \"\\f253\";\n@fa-var-hourglass-end: \"\\f253\";\n@fa-var-hourglass-half: \"\\f252\";\n@fa-var-hourglass-o: \"\\f250\";\n@fa-var-hourglass-start: \"\\f251\";\n@fa-var-houzz: \"\\f27c\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-i-cursor: \"\\f246\";\n@fa-var-ils: \"\\f20b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-industry: \"\\f275\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-internet-explorer: \"\\f26b\";\n@fa-var-intersex: \"\\f224\";\n@fa-var-ioxhost: \"\\f208\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-lastfm: \"\\f202\";\n@fa-var-lastfm-square: \"\\f203\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-leanpub: \"\\f212\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-buoy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-line-chart: \"\\f201\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-low-vision: \"\\f2a8\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map: \"\\f279\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-map-o: \"\\f278\";\n@fa-var-map-pin: \"\\f276\";\n@fa-var-map-signs: \"\\f277\";\n@fa-var-mars: \"\\f222\";\n@fa-var-mars-double: \"\\f227\";\n@fa-var-mars-stroke: \"\\f229\";\n@fa-var-mars-stroke-h: \"\\f22b\";\n@fa-var-mars-stroke-v: \"\\f22a\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-meanpath: \"\\f20c\";\n@fa-var-medium: \"\\f23a\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-mercury: \"\\f223\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mixcloud: \"\\f289\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-modx: \"\\f285\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-motorcycle: \"\\f21c\";\n@fa-var-mouse-pointer: \"\\f245\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-neuter: \"\\f22c\";\n@fa-var-newspaper-o: \"\\f1ea\";\n@fa-var-object-group: \"\\f247\";\n@fa-var-object-ungroup: \"\\f248\";\n@fa-var-odnoklassniki: \"\\f263\";\n@fa-var-odnoklassniki-square: \"\\f264\";\n@fa-var-opencart: \"\\f23d\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-opera: \"\\f26a\";\n@fa-var-optin-monster: \"\\f23c\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paint-brush: \"\\f1fc\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-pause-circle: \"\\f28b\";\n@fa-var-pause-circle-o: \"\\f28c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-paypal: \"\\f1ed\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-percent: \"\\f295\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pie-chart: \"\\f200\";\n@fa-var-pied-piper: \"\\f2ae\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pied-piper-pp: \"\\f1a7\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-p: \"\\f231\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plug: \"\\f1e6\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-product-hunt: \"\\f288\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-question-circle-o: \"\\f29c\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-alien: \"\\f281\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-registered: \"\\f25d\";\n@fa-var-remove: \"\\f00d\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-resistance: \"\\f1d0\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-safari: \"\\f267\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-scribd: \"\\f28a\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-sellsy: \"\\f213\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-server: \"\\f233\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shekel: \"\\f20b\";\n@fa-var-sheqel: \"\\f20b\";\n@fa-var-shield: \"\\f132\";\n@fa-var-ship: \"\\f21a\";\n@fa-var-shirtsinbulk: \"\\f214\";\n@fa-var-shopping-bag: \"\\f290\";\n@fa-var-shopping-basket: \"\\f291\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-language: \"\\f2a7\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-signing: \"\\f2a7\";\n@fa-var-simplybuilt: \"\\f215\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skyatlas: \"\\f216\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-slideshare: \"\\f1e7\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-snapchat: \"\\f2ab\";\n@fa-var-snapchat-ghost: \"\\f2ac\";\n@fa-var-snapchat-square: \"\\f2ad\";\n@fa-var-soccer-ball-o: \"\\f1e3\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-sticky-note: \"\\f249\";\n@fa-var-sticky-note-o: \"\\f24a\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-stop-circle: \"\\f28d\";\n@fa-var-stop-circle-o: \"\\f28e\";\n@fa-var-street-view: \"\\f21d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-subway: \"\\f239\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-television: \"\\f26c\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-themeisle: \"\\f2b2\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-off: \"\\f204\";\n@fa-var-toggle-on: \"\\f205\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-trademark: \"\\f25c\";\n@fa-var-train: \"\\f238\";\n@fa-var-transgender: \"\\f224\";\n@fa-var-transgender-alt: \"\\f225\";\n@fa-var-trash: \"\\f1f8\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-tripadvisor: \"\\f262\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tty: \"\\f1e4\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-tv: \"\\f26c\";\n@fa-var-twitch: \"\\f1e8\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-universal-access: \"\\f29a\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usb: \"\\f287\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-user-plus: \"\\f234\";\n@fa-var-user-secret: \"\\f21b\";\n@fa-var-user-times: \"\\f235\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-venus: \"\\f221\";\n@fa-var-venus-double: \"\\f226\";\n@fa-var-venus-mars: \"\\f228\";\n@fa-var-viacoin: \"\\f237\";\n@fa-var-viadeo: \"\\f2a9\";\n@fa-var-viadeo-square: \"\\f2aa\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo: \"\\f27d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-control-phone: \"\\f2a0\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-whatsapp: \"\\f232\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-wheelchair-alt: \"\\f29b\";\n@fa-var-wifi: \"\\f1eb\";\n@fa-var-wikipedia-w: \"\\f266\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wpbeginner: \"\\f297\";\n@fa-var-wpforms: \"\\f298\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-y-combinator: \"\\f23b\";\n@fa-var-y-combinator-square: \"\\f1d4\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yc: \"\\f23b\";\n@fa-var-yc-square: \"\\f1d4\";\n@fa-var-yelp: \"\\f1e9\";\n@fa-var-yen: \"\\f157\";\n@fa-var-yoast: \"\\f2b1\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_animated.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n  &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n  &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-resistance:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; }\n.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; }\n.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; }\n.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; }\n.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; }\n.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; }\n.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; }\n.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; }\n.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; }\n.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; }\n.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; }\n.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; }\n.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; }\n.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; }\n.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; }\n.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; }\n.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; }\n.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; }\n.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; }\n.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; }\n.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; }\n.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; }\n.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; }\n.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; }\n.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; }\n.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; }\n.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; }\n.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; }\n.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; }\n.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; }\n.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; }\n.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; }\n.#{$fa-css-prefix}-asl-interpreting:before,\n.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; }\n.#{$fa-css-prefix}-deafness:before,\n.#{$fa-css-prefix}-hard-of-hearing:before,\n.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; }\n.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; }\n.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; }\n.#{$fa-css-prefix}-signing:before,\n.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; }\n.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; }\n.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; }\n.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; }\n.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; }\n.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; }\n.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; }\n.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; }\n.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; }\n.#{$fa-css-prefix}-google-plus-circle:before,\n.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; }\n.#{$fa-css-prefix}-fa:before,\n.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})\";\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)\";\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n\n\n// Only display content to screen readers. A la Bootstrap 4.\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n@mixin sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_screen-reader.scss",
    "content": "// Screen Readers\n// -------------------------\n\n.sr-only { @include sr-only(); }\n.sr-only-focusable { @include sr-only-focusable(); }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n$fa-font-size-base:   14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.6.3\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-american-sign-language-interpreting: \"\\f2a3\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asl-interpreting: \"\\f2a3\";\n$fa-var-assistive-listening-systems: \"\\f2a2\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-audio-description: \"\\f29e\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-blind: \"\\f29d\";\n$fa-var-bluetooth: \"\\f293\";\n$fa-var-bluetooth-b: \"\\f294\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-braille: \"\\f2a1\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-codiepie: \"\\f284\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-credit-card-alt: \"\\f283\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-deaf: \"\\f2a4\";\n$fa-var-deafness: \"\\f2a4\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edge: \"\\f282\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-envira: \"\\f299\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-fa: \"\\f2b4\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-first-order: \"\\f2b0\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-font-awesome: \"\\f2b4\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-fort-awesome: \"\\f286\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gitlab: \"\\f296\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-glide: \"\\f2a5\";\n$fa-var-glide-g: \"\\f2a6\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-circle: \"\\f2b3\";\n$fa-var-google-plus-official: \"\\f2b3\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-hard-of-hearing: \"\\f2a4\";\n$fa-var-hashtag: \"\\f292\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-low-vision: \"\\f2a8\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mixcloud: \"\\f289\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-modx: \"\\f285\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-pause-circle: \"\\f28b\";\n$fa-var-pause-circle-o: \"\\f28c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-percent: \"\\f295\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f2ae\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pied-piper-pp: \"\\f1a7\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-product-hunt: \"\\f288\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-question-circle-o: \"\\f29c\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-alien: \"\\f281\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-resistance: \"\\f1d0\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-scribd: \"\\f28a\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-bag: \"\\f290\";\n$fa-var-shopping-basket: \"\\f291\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-language: \"\\f2a7\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-signing: \"\\f2a7\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-snapchat: \"\\f2ab\";\n$fa-var-snapchat-ghost: \"\\f2ac\";\n$fa-var-snapchat-square: \"\\f2ad\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-stop-circle: \"\\f28d\";\n$fa-var-stop-circle-o: \"\\f28e\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-themeisle: \"\\f2b2\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-universal-access: \"\\f29a\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usb: \"\\f287\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-viadeo: \"\\f2a9\";\n$fa-var-viadeo-square: \"\\f2aa\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-control-phone: \"\\f2a0\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wheelchair-alt: \"\\f29b\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wpbeginner: \"\\f297\";\n$fa-var-wpforms: \"\\f298\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-yoast: \"\\f2b1\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/font-awesome/scss/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n@import \"screen-reader\";\n"
  },
  {
    "path": "webpage/deepchat/static/vendor/jquery/jquery.easing.1.3.js",
    "content": "/*\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\n *\n * Uses the built in easing capabilities added In jQuery 1.1\n * to offer multiple easing options\n *\n * TERMS OF USE - jQuery Easing\n * \n * Open source under the BSD License. \n * \n * Copyright © 2008 George McGinley Smith\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n * \n * Redistributions of source code must retain the above copyright notice, this list of \n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list \n * of conditions and the following disclaimer in the documentation and/or other materials \n * provided with the distribution.\n * \n * Neither the name of the author nor the names of contributors may be used to endorse \n * or promote products derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n * OF THE POSSIBILITY OF SUCH DAMAGE. \n *\n*/\n\n// t: current time, b: begInnIng value, c: change In value, d: duration\njQuery.easing['jswing'] = jQuery.easing['swing'];\n\njQuery.extend( jQuery.easing,\n{\n\tdef: 'easeOutQuad',\n\tswing: function (x, t, b, c, d) {\n\t\t//alert(jQuery.easing.default);\n\t\treturn jQuery.easing[jQuery.easing.def](x, t, b, c, d);\n\t},\n\teaseInQuad: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t + b;\n\t},\n\teaseOutQuad: function (x, t, b, c, d) {\n\t\treturn -c *(t/=d)*(t-2) + b;\n\t},\n\teaseInOutQuad: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t + b;\n\t\treturn -c/2 * ((--t)*(t-2) - 1) + b;\n\t},\n\teaseInCubic: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t + b;\n\t},\n\teaseOutCubic: function (x, t, b, c, d) {\n\t\treturn c*((t=t/d-1)*t*t + 1) + b;\n\t},\n\teaseInOutCubic: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t + b;\n\t\treturn c/2*((t-=2)*t*t + 2) + b;\n\t},\n\teaseInQuart: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t*t + b;\n\t},\n\teaseOutQuart: function (x, t, b, c, d) {\n\t\treturn -c * ((t=t/d-1)*t*t*t - 1) + b;\n\t},\n\teaseInOutQuart: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t + b;\n\t\treturn -c/2 * ((t-=2)*t*t*t - 2) + b;\n\t},\n\teaseInQuint: function (x, t, b, c, d) {\n\t\treturn c*(t/=d)*t*t*t*t + b;\n\t},\n\teaseOutQuint: function (x, t, b, c, d) {\n\t\treturn c*((t=t/d-1)*t*t*t*t + 1) + b;\n\t},\n\teaseInOutQuint: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\n\t\treturn c/2*((t-=2)*t*t*t*t + 2) + b;\n\t},\n\teaseInSine: function (x, t, b, c, d) {\n\t\treturn -c * Math.cos(t/d * (Math.PI/2)) + c + b;\n\t},\n\teaseOutSine: function (x, t, b, c, d) {\n\t\treturn c * Math.sin(t/d * (Math.PI/2)) + b;\n\t},\n\teaseInOutSine: function (x, t, b, c, d) {\n\t\treturn -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\n\t},\n\teaseInExpo: function (x, t, b, c, d) {\n\t\treturn (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n\t},\n\teaseOutExpo: function (x, t, b, c, d) {\n\t\treturn (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n\t},\n\teaseInOutExpo: function (x, t, b, c, d) {\n\t\tif (t==0) return b;\n\t\tif (t==d) return b+c;\n\t\tif ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\n\t\treturn c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\n\t},\n\teaseInCirc: function (x, t, b, c, d) {\n\t\treturn -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\n\t},\n\teaseOutCirc: function (x, t, b, c, d) {\n\t\treturn c * Math.sqrt(1 - (t=t/d-1)*t) + b;\n\t},\n\teaseInOutCirc: function (x, t, b, c, d) {\n\t\tif ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\n\t\treturn c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\n\t},\n\teaseInElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\treturn -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n\t},\n\teaseOutElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\treturn a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\n\t},\n\teaseInOutElastic: function (x, t, b, c, d) {\n\t\tvar s=1.70158;var p=0;var a=c;\n\t\tif (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\n\t\tif (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n\t\treturn a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\n\t},\n\teaseInBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158;\n\t\treturn c*(t/=d)*t*((s+1)*t - s) + b;\n\t},\n\teaseOutBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158;\n\t\treturn c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n\t},\n\teaseInOutBack: function (x, t, b, c, d, s) {\n\t\tif (s == undefined) s = 1.70158; \n\t\tif ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\n\t\treturn c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n\t},\n\teaseInBounce: function (x, t, b, c, d) {\n\t\treturn c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\n\t},\n\teaseOutBounce: function (x, t, b, c, d) {\n\t\tif ((t/=d) < (1/2.75)) {\n\t\t\treturn c*(7.5625*t*t) + b;\n\t\t} else if (t < (2/2.75)) {\n\t\t\treturn c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\n\t\t} else if (t < (2.5/2.75)) {\n\t\t\treturn c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\n\t\t} else {\n\t\t\treturn c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\n\t\t}\n\t},\n\teaseInOutBounce: function (x, t, b, c, d) {\n\t\tif (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\n\t\treturn jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\n\t}\n});\n\n/*\n *\n * TERMS OF USE - EASING EQUATIONS\n * \n * Open source under the BSD License. \n * \n * Copyright © 2001 Robert Penner\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n * \n * Redistributions of source code must retain the above copyright notice, this list of \n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list \n * of conditions and the following disclaimer in the documentation and/or other materials \n * provided with the distribution.\n * \n * Neither the name of the author nor the names of contributors may be used to endorse \n * or promote products derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n * OF THE POSSIBILITY OF SUCH DAMAGE. \n *\n */"
  },
  {
    "path": "webpage/deepchat/templates/404.html",
    "content": "{% extends \"base.html\" %}\n\n{% block title %}U Lost Yo{% endblock title %}\n\n{% block page_content %}\n\n  <div class=\"jumbotron\">\n  <h1>NOTHING TO SEE HERE</h1>\n  <p>\n    You done got yourself a 404, my friend. How about we just\n    hit that backspace button and pretend this never happend.\n    OMG\n  </p>\n  </div>\n\n\n  <div class=\"text-center\">\n  <img src=\"https://c1.staticflickr.com/9/8041/8039292664_cf159436ff_b.jpg\"\n       class=\"img-fluid rounded\"\n       alt=\"Responsive image\">\n  </div>\n\n{% endblock page_content %}"
  },
  {
    "path": "webpage/deepchat/templates/about.html",
    "content": "{%  extends  \"base.html\" %}\n{% set active_page = \"about\" %}\n\n{% block nav_session_user %}\n<ul class=\"nav navbar-nav navbar-right\">\n<span id='nav-session-user' class=\"navbar-text\">\n  {% if user %}\n    User: {{ user }}\n  {% else %}\n    User: Anon\n  {% endif %}\n</span>\n</ul>\n{% endblock nav_session_user %}\n\n\n\n<!-- Chat Section -->\n{% block page_content %}\n  <div class=\"jumbotron\">\n    <h1>DeepChatModels</h1>\n    <p>\n      A small framework for building and playing with conversation models in TensorFlow.\n    </p>\n  </div>\n\n\n  <div class=\"row\">\n    <div class=\"media\">\n      <div class=\"media-left media-top\">\n        <a href=\"#\">\n          <img src=\"https://avatars3.githubusercontent.com/u/11165945?v=3&s=460\"\n               class=\"img-rounded\">\n        </a>\n      </div>\n\n      <div class=\"media-body\">\n\n        <h2>About Me</h2>\n        <p>\n          I recently graduated (Dec 2016) from UC Berkeley, and now\n          I spend my time working on personal projects like this, and also\n          studying machine learning/data science/etc.\n        </p>\n\n        <hr>\n        <h3>Links</h3>\n        <a class=\"btn btn-social-icon btn-github\"\n           href=\"https://github.com/mckinziebrandon/DeepChatModels\">\n          <!--<i class=\"fa fa-github fa-2x\" aria-hidden=\"true\">GitHub</i>-->\n          <span class=\"fa fa-github fa-5x\"></span>\n        </a>\n\n      </div>\n    </div>\n  </div>\n\n{% endblock page_content %}\n"
  },
  {
    "path": "webpage/deepchat/templates/admin/index.html",
    "content": "<!-- Customizing admin page. Note that we need to copy\nstuff from abstract_base.html since Jinja doesn't support\nmultiple inheritance.\n\nSee: flask-admin.readthedocs.io -->\n{% extends 'admin/master.html' %}\n\n  {% block head %}\n    {{ super() }}\n\n\n\n  {% endblock head %}\n\n\n{% block body %}\n\n\n{% endblock body %}\n"
  },
  {
    "path": "webpage/deepchat/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <!-- block head:\n    - defines the head element for this html file and can be used by all children.\n    - Children can either override or add to it.\n    - See index.html for a simple example. -->\n  {% block head %}\n\n    {% block metas %}\n      <meta charset=\"utf-8\">\n      <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n      <meta name=\"description\" content=\"\">\n      <meta name=\"author\" content=\"sentient-machine\">\n    {% endblock metas %}\n\n    <title>\n      {% block title %}\n        Deep Chat Models\n      {% endblock title %}\n    </title>\n\n    <!-- Lil yelcornell_bot bot favicon -->\n    <link href=\"/static/img/favicon.ico\" rel=\"icon\" type=\"image/x-icon\">\n\n    <!-- Bootstrap core CSS -->\n    <link rel=\"stylesheet\" type=\"text/css\" id=\"theme-link\"\n          href=\"{{ url_for('static', filename='css/lumen-bootstrap.min.css') }}\">\n\n    <!-- Custom styles for this template (I see ur overrule with an overrule. -->\n    <link rel=\"stylesheet\" type=\"text/css\"\n          href=\"{{ url_for('static', filename='css/theme.css') }}\">\n\n    <!-- Custom Fonts -->\n    <link href=\"{{ url_for('static', filename='vendor/font-awesome/css/font-awesome.min.css') }}\"\n          rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Montserrat:400,700\"\n          rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Kaushan+Script\"\n          rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic,700italic\"\n          rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700\"\n          rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"https://fonts.googleapis.com/css?family=Lato\"\n          rel=\"stylesheet\" type=\"text/css\" >\n\n    <!-- CSS Modifications -->\n    <link rel=\"stylesheet\" type=\"text/css\"\n          href=\"{{ url_for('static', filename='css/style_modifications.css') }}\">\n\n    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->\n    <script type=\"text/javascript\"\n            src=\"{{ url_for('static', filename='vendor/jquery/jquery-3.2.1.min.js') }}\"></script>\n\n  {% endblock head %}\n</head>\n\n<body id=\"page-top\" class=\"index\">\n\n<!-- Navigation -->\n{% block navbar %}\n  {%  set navigation_bar = [\n        ('/', 'index', 'Home'),\n        ('/plots', 'plots', 'Plots'),\n        ('/about', 'about', 'About')\n    ] -%}\n  {%  set active_page = active_page|default('index') -%}\n\n  <!-- Fixed navbar -->\n  <nav class=\"navbar navbar-default navbar-fixed-top\">\n    <div class=\"container\">\n      <div class=\"navbar-header\">\n        <button type=\"button\" class=\"navbar-toggle collapsed\"\n                data-toggle=\"collapse\" data-target=\"#navbar\"\n                aria-expanded=\"false\" aria-controls=\"navbar\">\n          <span class=\"sr-only\">Toggle navigation</span>\n          {% for _ in range(3) %}\n            <span class=\"icon-bar\"></span>\n          {% endfor %}\n        </button>\n        <a class=\"navbar-brand\" href=\"/\">DeepChatModels</a>\n      </div>\n\n      <div id=\"navbar\" class=\"navbar-collapse collapse\">\n\n        <ul class=\"nav navbar-nav\">\n          {%  for href, id, caption in navigation_bar %}\n            <li {% if id == active_page %} class=\"active\" {% endif %}>\n              <a href=\"{{ href|e }}\">{{ caption|e }}</a>\n            </li>\n          {% endfor %}\n        </ul>\n\n        {% block nav_session_user %}\n        <ul class=\"nav navbar-nav navbar-right\">\n        <span id='nav-session-user' class=\"navbar-text\">\n          <!-- user_form.js injects name of current user here -->\n        </span>\n        </ul>\n        {% endblock nav_session_user %}\n\n      </div>  <!-- end: navbar -->\n\n    </div>  <!-- end: container -->\n  </nav>\n{% endblock navbar %}\n\n<!-- Declare a block with name 'content' for derived templates. -->\n{% block content %}\n  <div class=\"container\">\n    <!-- Display any flash() message calls from e.g. views.py -->\n    {%  with messages = get_flashed_messages() %}\n      {%  if messages %}\n        <div class=\"alert alert-info\">\n          {% for message in messages %}\n            <p>{{ message }}</p>\n          {% endfor %}\n        </div>\n      {% endif %}\n    {% endwith %}\n  </div>  <!-- end: container -->\n\n  <!-- Inject derived pages' content inside the following container. -->\n  <div class=\"container\">\n    {% block page_content %}\n    {% endblock page_content %}\n  </div>\n{%  endblock content %}\n\n\n{% block scripts %}\n  <!-- Recommended by flask docs. -->\n  <script>\n      var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};\n      var $INDEX_URL = \"{{ url_for('main.index', _scheme='https', _external=True ) }}\";\n  </script>\n\n\n  <!-- Latest Bootstrap JavaScript -->\n  <script src=\"{{ url_for('static', filename='vendor/bootstrap-3.3.7-dist/js/bootstrap.min.js') }}\"></script>\n\n  <!-- Plugin JavaScript -->\n  <script src=\"{{ url_for('static', filename='vendor/jquery/jquery.easing.1.3.js') }}\"></script>\n  <!--<script src=\"{{ url_for('static', filename='vendor/plugins/tether.min.js') }}\"></script>-->\n\n  <!-- Contact Form JavaScript -->\n  <script src=\"{{ url_for('static', filename='js/jqBootstrapValidation.js') }}\">\n  </script>\n\n\n{% endblock scripts %}\n\n</body>\n</html>\n"
  },
  {
    "path": "webpage/deepchat/templates/index.html",
    "content": "{%  extends  \"base.html\" %}\n{% set active_page = \"index\" %}\n{% from \"macros/forms.html\" import render_chat_form, render_user_form %}\n\n<!-- Chat Section -->\n{% block page_content %}\n\n  <div class=\"jumbotron\">\n    <h1>Conversation Models in TensorFlow</h1>\n    <p>Have a chat with a deep neural network.</p>\n  </div>\n\n\n  <h2>Give Yourself a Nickname &nbsp;\n    <button type=\"button\" class=\"btn btn-xs btn-info\"\n            data-toggle=\"popover\"\n            title=\"&quot;Data&quot;\"\n            data-content=\"I'm slowly building a\n              database of conversations, and it helps to\n              have an identifier for the user (defaults to 'Anon').\n              It can be anything!\">\n      Why?\n    </button>\n  </h2>\n\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-8\">\n      <p>\n        The bot would like to know who it is talking to.\n        Feel free to enter a nickname for yourself below:\n      </p>\n\n      <div class=\"row\">\n        {{ render_user_form(user_form, \"user-form\") }}\n      </div>\n\n    </div>\n  </div>\n  <br>\n\n  <hr>\n  <h2>Chat with a Bot</h2>\n\n  <div class=\"row\">\n  <div class=\"col-xs-12 col-sm-10\">\n  <p>\n  I've uploaded two simple models here that you can chat with. One was trained on\n  the Cornell Movie Dialogs, the other on a subset (2007-2009) of the Reddit comments\n  dataset. They both have the same model architecture. I'll upload the full configurations\n  soon, but their key components are as follows:\n  <ul>\n  <li>Max sentence length: 10</li>\n    <li>Vocabulary size: 40000</li>\n    <li>BasicEncoder to BasicDecoder; single-layer each</li>\n  </ul>\n  The rest of the parameters (and some of the above) are the default values. They represent\n  the simplest model(s) the project supports.\n  </p>\n  </div>\n  </div>\n\n\n  <div class=\"row\">\n    <div class=\"col-xs-12\">\n      <ul class=\"nav nav-tabs\">\n        {% for i, dataset_name in enumerate(['cornell', 'reddit', 'ubuntu']) %}\n          <li role=\"presentation\"\n              data-target=\"#{{ dataset_name }}-chat-box\"\n              data-slide-to=\"{{ i }}\">\n            <a href=\"#\"><span>{{ dataset_name | capitalize }}</span></a></li>\n        {% endfor %}\n      </ul>\n    </div>\n  </div>\n\n\n  <div id=\"chat-carousel\" class=\"carousel slide\">\n\n    <!-- Wrapper for slides -->\n    <div class=\"carousel-inner\" role=\"listbox\">\n\n      {% for dataset_name in ['cornell', 'reddit', 'ubuntu'] %}\n        <div id=\"{{ dataset_name }}-chat-box\" class=\"chat-box item\">\n          <!-- chat box injected here -->\n          <div id='{{ dataset_name }}-chat-log'\n               class=\"chat-log col-xs-12 col-sm-10 col-sm-offset-1\">\n          </div>\n          <!-- User input injected here -->\n          {{ render_chat_form(chat_form, dataset_name+\"-chat-form\", dataset_name) }}\n        </div>\n      {% endfor %}\n    </div> <!-- end: .carousel-inner -->\n\n    <!-- Controls -->\n    <a class=\"left carousel-control\" href=\"#chat-carousel\" role=\"button\" data-slide=\"prev\">\n      <span class=\"glyphicon glyphicon-chevron-left\" aria-hidden=\"true\"></span>\n      <span class=\"sr-only\">Previous</span>\n    </a>\n    <a class=\"right carousel-control\" href=\"#chat-carousel\" role=\"button\" data-slide=\"next\">\n      <span class=\"glyphicon glyphicon-chevron-right\" aria-hidden=\"true\"></span>\n      <span class=\"sr-only\">Next</span>\n    </a>\n  </div>\n\n  <hr>\n  <br><br>\n\n{%  endblock page_content %}\n\n{% block scripts %}\n  {{ super() }}\n\n  <script type=\"text/javascript\">\n      var csrf_token = \"{{ csrf_token() }}\";\n      $.ajaxSetup({\n          beforeSend: function(xhr, settings) {\n              console.log('this.crossDomain:', this.crossDomain);\n              if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {\n                  xhr.setRequestHeader(\"X-CSRFToken\", csrf_token);\n              }\n          }\n      });\n  </script>\n\n  <script>\n      $(function() {\n          $('[data-toggle=\"popover\"]').popover();\n\n          // Activate the carousel.\n          //$('.carousel').carousel();\n          $('#chat-carousel').carousel({interval: false});\n\n          $('#cornell-chat-box').addClass('active');\n          $('.nav-tabs li[data-target=\"#cornell-chat-box\"]')\n                  .addClass('active')\n                  .find('span').addClass('text-primary');\n          $('#chat-carousel').carousel({interval: 9999});\n\n          // From carousel to nav-pills . . .\n          $('#chat-carousel').on('slide.bs.carousel', function(event) {\n              $('.nav-tabs li').removeClass('active');\n              $('.nav-tabs li span').removeClass('text-primary');\n              let activeTab = $('[data-target=\"#' + event.relatedTarget.id + '\"]');\n              activeTab.addClass('active');\n              activeTab.find('span').addClass('text-primary');\n\n              // TODO: Send a POST request to activate the chatbot, so we can\n              // initialize/destroy them dynamically instead of all at once.\n              });\n\n              // From nav-pills to carousel . . .\n              // Just simulates moving the carousel to the right index,\n              // so we can put most of the behavior in that handler instead.\n              $('.nav-tabs li').click(function(event) {\n                  let index = $(this).data('slide-to');\n                  $('#chat-carousel').carousel(index);\n                  event.preventDefault();\n              });\n\n          });\n      </script>\n\n    <!-- Chat Processing JavaScript -->\n  <script src=\"{{ url_for('static', filename='js/chat_processing.js') }}\"></script>\n  <script src=\"{{ url_for('static', filename='js/user_form.js') }}\"></script>\n\n\n\n    {% endblock scripts %}\n\n"
  },
  {
    "path": "webpage/deepchat/templates/macros/forms.html",
    "content": "{% macro with_errors(field) %}\n  <!-- Wraps a form field with error handling. -->\n  {% if field and field.errors %}\n    {{ field(class=css_class, **kwargs) }}\n    <ul class=\"errors\">{% for error in field.errors %}<li>{{ error|e }}</li>{% endfor %}</ul>\n  {% else %}\n    {{ field(**kwargs) }}\n  {% endif %}\n{% endmacro %}\n\n<!-- Render a field label. -->\n{% macro render_label(label) %}\n  {{ label(style=\"text-transform: capitalize;\", **kwargs) }}\n{% endmacro %}\n\n<!-- Render the user message input field. -->\n{% macro render_user_message(message) %}\n  {{ message(class=\"form-control\", autocomplete=\"off\", **kwargs) }}\n{% endmacro %}\n\n<!-- Render a submit button. -->\n{% macro render_submit(submit) %}\n  {{ with_errors(submit, **kwargs) }}\n{% endmacro %}\n\n<!-- Render an instance of app.forms.BasicForm. -->\n{% macro render_chat_form(form, id, bot_name) %}\n  <div class=\"row text-center chat-form form-group\">\n    <div class=\"input-group\">\n      <!-- For CSRF reasons. -->\n      {{ form.hidden_tag() }}\n      {{ render_user_message(form.message, id=bot_name) }}\n      <!-- Submit -->\n      <div class=\"input-group-btn\">\n        {{ render_submit(form.submit, data_name=bot_name, class=\"chat-form-submit btn btn-primary btn-sm\") }}\n      </div>\n    </div>\n  </div>\n{% endmacro %}\n\n\n{% macro render_user_form(form, id) %}\n  <div id=\"{{ id }}\" class=\"form-group\">\n    <!-- For CSRF reasons. -->\n    {{ form.hidden_tag() }}\n\n    <!-- Key Input -->\n    <div class=\"col-sm-9\">\n      <div class=\"input-group input-group-sm\">\n        <span id=\"key-addon\" class=\"input-group-addon\">Name</span>\n        {{ form.name(class=\"form-control\", placeholder=\"User McUserFace\" , autocomplete=\"off\") }}\n      </div>\n    </div>\n\n    <div class=\"col-sm-2\">\n      <!-- Submit -->\n      {{ render_submit(form.submit, id=id + '-submit', class='user-form-submit btn btn-primary btn-sm') }}\n    </div>\n\n  </div>\n{% endmacro %}\n\n\n"
  },
  {
    "path": "webpage/deepchat/templates/plots.html",
    "content": "\n{%  extends  \"base.html\" %}\n{% set active_page = \"plots\" %}\n\n{% block nav_session_user %}\n  <ul class=\"nav navbar-nav navbar-right\">\n<span id='nav-session-user' class=\"navbar-text\">\n  {% if user %}\n    User: {{ user }}\n  {% else %}\n    User: Anon\n  {% endif %}\n</span>\n  </ul>\n{% endblock nav_session_user %}\n\n{% block head %}\n  {{ super() }}\n\n  <style type=\"text/css\">\n    ul.custom {\n      list-style-type: circle;\n    }\n\n    .popover-content {\n      max-height: 400px;\n      overflow-y: auto;\n    }\n\n    .jumbotron .popover {\n      max-height: 600px;\n      max-width: 500px;\n    }\n\n\n  </style>\n\n{% endblock head %}\n\n\n{% block page_content %}\n\n\n  <div class=\"jumbotron\">\n    <h1>Interactive Plots</h1>\n\n    <p>\n    Scans over hyperparameter space for the models, in order\n    to first get a semi-quantitative idea of which regions to focus on (and it's fun).\n    </p>\n    <button type=\"button\" class=\"btn btn-med btn-primary\"\n            data-toggle=\"popover\"\n            title=\"Hover over a plot\">\n      How do I interact with things?\n    </button>\n  </div>\n\n  <h2>Overview and Setup</h2>\n  <div class=\"row\">\n  <div class=\"col-xs-12 col-sm-10\">\n\n    <p>\n      All plots on this page show some value plotted every 200 iterations out of 10,000 total, for\n      a model identified by the plot label (configuration/params shown at the end of each section).\n    </p>\n\n    <p>\n      The label will contain the main distinction/info regarding\n      how the given model differs from the others on a given plot. Currently, I'm most\n      interested in comparing performance for GRU vs. LSTM, number of layers, and\n      how much the BidirectionalEncoder, AttentionDecoder, and combinations thereof\n      improve the baseline (basic) model with BasicEncoder and BasicDecoder.\n    </p>\n\n    <p>\n     <span class=\"text-danger\">\n       If you are reading this and know how to do curve fitting with D3 please let me know.\n     </span>\n      I haven't looked extensively how to do it, but it is certainly on my list considering\n      the jagged appearance of the plots right now (doing simple splines).\n    </p>\n\n  </div>\n  </div>\n\n  <hr>\n\n\n  <h3>Back to Basics</h3>\n  <p>\n    Below are plots on training accuracy, training loss, and validation loss for\n    basic models trained on the Cornell dataset. Any time I refer to a model as\n    &quot;basic&quot;, I am saying that it uses the BasicEncoder and BasicDecoder\n    classes (members of the chatbot.components package).\n  </p>\n\n\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"accuracy-fig\"></div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"training-loss-fig\"></div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"validation-loss-fig\"></div>\n    </div>\n  </div>\n  <hr>\n\n  <h4>Configuration Parameters</h4>\n  <p>\n    Below are labeled buttons that show the configuration parameters for the corresponding\n    plot label. For ease of viewing, a parameter is only shown if not all plotted models have\n    the same value; e.g. if all plots above used a batch size of 256 (the default),  none of\n    the buttons below will show a value for batch size.\n  </p>\n  <div id=\"configs-row\" class=\"row\">\n  </div>\n  <hr>\n\n  <div style=\"display: none;\">\n  <h3>Paying Attention</h3>\n  <p>\n    Now let's try and incorporate attention into these models.\n  </p>\n\n\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"attn-accuracy-fig\"></div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"attn-training-loss-fig\"></div>\n    </div>\n\n    <div class=\"col-xs-12 col-sm-10 col-lg-9\">\n      <div id=\"attn-validation-loss-fig\"></div>\n    </div>\n  </div>\n  <hr>\n\n  <h3>Configuration Parameters</h3>\n  <div id=\"attn-configs-row\" class=\"row\">\n  </div>\n  </div>\n\n\n\n\n\n{% endblock page_content %}\n\n\n{% block scripts %}\n  {{ super() }}\n  <script src=\"{{ url_for('static', filename='js/bootstrapify.js') }}\"></script>\n  <script>\n      let popoverButton = $('.jumbotron [data-toggle=\"popover\"]');\n      popoverButton.data('content',\n              '<p>At the bottom left of each plot (upon hovering), a few buttons are shown:</p>' +\n              '<ul class=\"custom\">' +\n              '<li>To move the plot view around, click the arrow cross thing.</li>' +\n              '<li>To zoom in a rectangle selection, click the magnifying glass and make your selection.</li>' +\n              '<li>At any time, you can reset back to default view by clicking the home button.</li>' +\n              '</ul>');\n      popoverButton.popover({\n          id: 'jumbotron-popover',\n          container: 'body',\n          html: true\n      });\n  </script>\n\n  <script>\n      let mpld3LoadLib = (url, callback) => {\n          var s = document.createElement('script');\n          s.src = url;\n          s.async = true;\n          s.onreadystatechange = s.onload = callback;\n          s.onerror = function(){console.warn(\"failed to load library \" + url);};\n          document.getElementsByTagName(\"head\")[0].appendChild(s);\n      }\n\n      mpld3LoadLib(\"https://mpld3.github.io/js/d3.v3.min.js\", function(){\n          mpld3LoadLib(\"https://mpld3.github.io/js/mpld3.v0.3.js\", function() {\n\n              let plotJSON = (fileName, divName) => {\n                  $.getJSON(url, function(response) {\n                      response.width = $('#'+divName).width();\n                      mpld3.draw_figure(divName, response);\n                      //$('.mpld3-axesbg').css('fill', $('body').css('background-color'));\n                      //$('.mpld3-text').css('fill', $('body').css('color'));\n                  });\n              };\n\n              // DARN YOU url_for/JAVASCRIPT!!!!!\n              let url = '{{ url_for('static', filename='assets/plots/accuracy.json') }}';\n              plotJSON(url, 'accuracy-fig');\n\n              url = '{{ url_for('static', filename='assets/plots/training.json') }}';\n              plotJSON(url, 'training-loss-fig');\n\n              url = '{{ url_for('static', filename='assets/plots/validation.json') }}';\n              plotJSON(url, 'validation-loss-fig');\n\n          });\n      });\n\n\n      //var configs;\n      // Retrieve the configuration dictionaries for each model plotted.\n      $.getJSON('{{ url_for('static', filename='assets/plots/configs.json') }}', function(response) {\n          let configs = response;\n          //let plotNames = Object.keys(configs);\n          let configsRow = $('#configs-row');\n          Object.keys(configs).map((plotName) => {\n\n              let content = '';\n              Object.keys(configs[plotName]).map((key) => {\n                  if (configs[plotName][key] instanceof Object) {\n                      content += '<p>' + key + ': <ul class=\"list-group\">';\n                      Object.keys(configs[plotName][key]).map((k) => {\n                          content += '<li class=\"list-group-item\"><small><small>' + k +\n                                  ': ' + configs[plotName][key][k] + '</small></small></li>';\n                      });\n                      content += '</ul></p>';\n                  } else {\n                      content += '<p>' +\n                              key + ': ' + JSON.stringify(configs[plotName][key]) +\n                              '</p>';\n                  }\n              });\n\n              // Create new column in configs row for the config button to be placed.\n              let configCol = $('<div class=\"col-xs-2\"></div>');\n\n              // Place the new config button in the config column.\n              $('<btn/>', {\n                  'class': 'btn btn-primary btn-sm btn-block',\n                  'data-toggle': 'popover',\n                  text: plotName\n              }).popover({\n                  title: plotName,\n                  placement: 'top',\n                  container: 'body',\n                  html: true,\n                  content: content\n              }).appendTo(configCol);\n\n\n              configCol.appendTo(configsRow);\n          });\n\n      });\n\n\n\n  </script>\n\n{% endblock scripts %}\n"
  },
  {
    "path": "webpage/deepchat/web_bot.py",
    "content": "\"\"\"Minimal subset of functions/methods from repo needed to run bot on Heroku.\nSee the main repository for better docs (all from utils and data directory).\n\"\"\"\n\nimport os\nimport re\nimport numpy as np\nimport tensorflow as tf\nimport yaml\nos.environ['TF_CPP_MIN_LOG_LEVEL']='1'\n\nUNK_ID  = 3\n# Regular expressions used to tokenize.\n_WORD_SPLIT = re.compile(b\"([.,!?\\\"':;)(])\")\n_DIGIT_RE = re.compile(br\"\\d\")\n_PRIMARY_KEYS = ['model', 'dataset', 'model_params', 'dataset_params']\n\n\ndef basic_tokenizer(sentence):\n    words = []\n    for space_separated_fragment in sentence.strip().split():\n        words.extend(_WORD_SPLIT.split(space_separated_fragment))\n    return [w for w in words if w]\n\n\ndef sentence_to_token_ids(sentence, vocabulary, normalize_digits=True):\n    words = basic_tokenizer(sentence)\n    if not normalize_digits:\n        return [vocabulary.get(w, UNK_ID) for w in words]\n    # Normalize digits by 0 before looking words up in the vocabulary.\n    return [vocabulary.get(_DIGIT_RE.sub(b\"0\", w), UNK_ID) for w in words]\n\n\ndef get_vocab_dicts(vocabulary_path):\n    \"\"\"Returns word_to_idx, idx_to_word dictionaries given vocabulary.\"\"\"\n    if tf.gfile.Exists(vocabulary_path):\n        rev_vocab = []\n        with tf.gfile.GFile(vocabulary_path, mode=\"rb\") as f:\n            rev_vocab.extend(f.readlines())\n        rev_vocab = [tf.compat.as_bytes(line.strip()) for line in rev_vocab]\n        vocab = dict([(x, y) for (y, x) in enumerate(rev_vocab)])\n        return vocab, rev_vocab\n    else:\n        raise ValueError(\"Vocabulary file %s not found.\" % vocabulary_path)\n\n\ndef load_graph(frozen_model_dir):\n    \"\"\"Load frozen tensorflow graph into the default graph.\n\n    Args:\n        frozen_model_dir: location of protobuf file containing frozen graph.\n\n    Returns:\n        tf.Graph object imported from frozen_model_path.\n    \"\"\"\n\n    # Prase the frozen graph definition into a GraphDef object.\n    frozen_file = os.path.join(frozen_model_dir, \"frozen_model.pb\")\n    with tf.gfile.GFile(frozen_file, \"rb\") as f:\n        graph_def = tf.GraphDef()\n        graph_def.ParseFromString(f.read())\n\n    # Load the graph def into the default graph and return it.\n    with tf.Graph().as_default() as graph:\n        tf.import_graph_def(\n            graph_def,\n            input_map=None,\n            return_elements=None,\n            op_dict=None,\n            producer_op_list=None)\n    return graph\n\n\ndef unfreeze_bot(frozen_model_path):\n    \"\"\"Restores the frozen graph from file and grabs input/output tensors needed to\n    interface with a cornell_bot for conversation.\n\n    Args:\n        frozen_model_path: location of protobuf file containing frozen graph.\n\n    Returns:\n        outputs: tensor that can be run in a session.\n    \"\"\"\n\n    bot_graph = load_graph(frozen_model_path)\n    tensors = {'inputs': bot_graph.get_tensor_by_name('import/input_pipeline/user_input:0'),\n               'outputs': bot_graph.get_tensor_by_name('import/outputs:0')}\n    return tensors, bot_graph\n\n\nclass FrozenBot:\n    \"\"\"The mouth and ears of a cornell_bot that's been serialized.\"\"\"\n\n    def __init__(self, frozen_model_dir, is_testing=False):\n        \"\"\"\n        Args:\n            is_testing: (bool) True for testing (while GPU is busy training).\n            In that case, just use a 'bot' that returns inputs reversed.\n        \"\"\"\n\n        # Get absolute path to model directory.\n        here = os.path.dirname(os.path.realpath(__file__))\n        assets_path = os.path.join(here, 'static', 'assets')\n        self.abs_model_dir = os.path.join(assets_path,\n                                     'frozen_models',\n                                     frozen_model_dir)\n        self.load_config(os.path.join(self.abs_model_dir, 'config.yml'))\n        self.word_to_idx, self.idx_to_word = self.get_frozen_vocab(self.config)\n        self.is_testing = is_testing\n\n        # Setup tensorflow graph(s)/session(s) iff not testing.\n        if not is_testing:\n            self.unfreeze()\n\n    def load_config(self, config_path):\n        with open(config_path) as f:\n            config = yaml.load(f)\n        config['dataset_params']['data_dir'] = os.path.dirname(config_path)\n        self.__dict__['__params'] = config\n\n    def __getattr__(self, name):\n        if name == 'config':\n            return self.__dict__['__params']\n        elif name in _PRIMARY_KEYS:\n            return self.__dict__['__params'][name]\n        else:\n            for primary_key in _PRIMARY_KEYS:\n                if not isinstance(self.__dict__['__params'][primary_key], dict):\n                    continue\n                elif name in self.__dict__['__params'][primary_key]:\n                    return self.__dict__['__params'][primary_key][name]\n        raise AttributeError(name)\n\n    def get_frozen_vocab(self, config):\n        \"\"\"Helper function to get dictionaries between tokens and words.\"\"\"\n        data_dir    = config['dataset_params']['data_dir']\n        vocab_size  = config['dataset_params']['vocab_size']\n        vocab_path = os.path.join(data_dir, 'vocab{}.txt'.format(vocab_size))\n        word_to_idx, idx_to_word = get_vocab_dicts(vocab_path)\n        return word_to_idx, idx_to_word\n\n    def as_words(self, sentence):\n        words = []\n        for token in sentence:\n            word = self.idx_to_word[token]\n            try:\n                word = tf.compat.as_str(word)\n            except UnicodeDecodeError:\n                word = str(word)\n            words.append(word)\n\n        words = \" \".join(words)\n        words = words.replace(' , ', ', ').replace(' .', '.').replace(' !', '!')\n        words = words.replace(\" ' \", \"'\").replace(\" ?\", \"?\")\n        if len(words) < 2:\n            return words\n        return words[0].upper() + words[1:]\n\n\n    def __call__(self, sentence):\n        \"\"\"Outputs response sentence (string) given input (string).\"\"\"\n\n        if self.is_testing:\n            return sentence[::-1]\n\n        sentence = sentence.strip().lower()\n        print('User:', sentence)\n        # Convert input sentence to token-ids.\n        sentence_tokens = sentence_to_token_ids(\n            tf.compat.as_bytes(sentence), self.word_to_idx)\n        sentence_tokens = np.array([sentence_tokens[::-1]])\n        # Get output sentence from the chatbot.\n        fetches = self.tensor_dict['outputs']\n        feed_dict={self.tensor_dict['inputs']: sentence_tokens}\n        response = self.sess.run(fetches=fetches, feed_dict=feed_dict)\n        response = self.as_words(response[0][:-1])\n        # Translate from confused-bot-language to English...\n        if 'UNK' in response:\n            response = \"I don't know.\"\n        print(\"Bot:\", response)\n        return response\n\n    def unfreeze(self):\n        # Setup tensorflow graph(s)/session(s) iff not testing.\n        if not self.is_testing:\n            # Get bot graph and input/output tensors.\n            self.tensor_dict, graph = unfreeze_bot(self.abs_model_dir)\n            self.sess = tf.Session(graph=graph)\n\n    def freeze(self):\n        if not self.is_testing:\n            self.sess.close()\n            self.graph = self.tensor_dict = None\n\n\n"
  },
  {
    "path": "webpage/manage.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"manage.py: Start up the web server and the application.\"\"\"\n\nimport os\nfrom deepchat import create_app, db\nfrom deepchat.models import User, Chatbot, Conversation, Turn\n\nfrom flask_script import Manager, Shell\nfrom flask_migrate import Migrate, MigrateCommand\n\n# First check if we are being called on the app engine.\nconfig_name = os.getenv('APPENGINE_CONFIG')\n# If not, either set to my (Brandon) preference given by FLASK_CONFIG, or\n# set to default if not found (e.g. you != Brandon || haven't set FLASK_CONFIG)\nif config_name is None:\n    config_name = os.getenv('FLASK_CONFIG', 'default')\n\napp = create_app(config_name)\n# For better CLI.\nmanager = Manager(app)\n# Database tables can be created or upgraded with a single command:\n# python3 manage.py db upgrade\nmigrate = Migrate(app, db)\n\n\ndef make_shell_context():\n    \"\"\"Automatic imports when we want to play in the shell.\"\"\"\n    return dict(app=app,\n                db=db,\n                User=User,\n                Chatbot=Chatbot,\n                Conversation=Conversation,\n                Turn=Turn)\n\nmanager.add_command(\"shell\", Shell(make_context=make_shell_context))\n\n# Give manager 'db' command.\n# Now, 'manage.py db [options]' runs the flask_migrate.Migrate method.\nmanager.add_command('db', MigrateCommand)\n\n\n@manager.command\ndef test():\n    \"\"\"Run the unit tests (see the tests package).\n\n    This can be run from the cmd line via 'python3 manage.py test'.\n\n    Note: the decorator above allows us to define this as a custom method\n    for our manager object.\n    \"\"\"\n    import unittest\n    tests = unittest.TestLoader().discover('tests')\n    unittest.TextTestRunner(verbosity=2).run(tests)\n\n\n@manager.command\ndef deploy():\n    from flask_migrate import upgrade\n    # Migrate db to latest revision.\n    upgrade()\n\nif __name__ == '__main__':\n    manager.run()"
  },
  {
    "path": "webpage/migrations/README",
    "content": "Generic single-database configuration."
  },
  {
    "path": "webpage/migrations/alembic.ini",
    "content": "# A generic, single database configuration.\n\n[alembic]\n# template used to generate migration files\n# file_template = %%(rev)s_%%(slug)s\n\n# set to 'true' to run the environment during\n# the 'revision' command, regardless of autogenerate\n# revision_environment = false\n\n\n# Logging configuration\n[loggers]\nkeys = root,sqlalchemy,alembic\n\n[handlers]\nkeys = console\n\n[formatters]\nkeys = generic\n\n[logger_root]\nlevel = WARN\nhandlers = console\nqualname =\n\n[logger_sqlalchemy]\nlevel = WARN\nhandlers =\nqualname = sqlalchemy.engine\n\n[logger_alembic]\nlevel = INFO\nhandlers =\nqualname = alembic\n\n[handler_console]\nclass = StreamHandler\nargs = (sys.stderr,)\nlevel = NOTSET\nformatter = generic\n\n[formatter_generic]\nformat = %(levelname)-5.5s [%(name)s] %(message)s\ndatefmt = %H:%M:%S\n"
  },
  {
    "path": "webpage/migrations/env.py",
    "content": "from __future__ import with_statement\nfrom alembic import context\nfrom sqlalchemy import engine_from_config, pool\nfrom logging.config import fileConfig\nimport logging\n\n# this is the Alembic Config object, which provides\n# access to the values within the .ini file in use.\nconfig = context.config\n\n# Interpret the config file for Python logging.\n# This line sets up loggers basically.\nfileConfig(config.config_file_name)\nlogger = logging.getLogger('alembic.env')\n\n# add your model's MetaData object here\n# for 'autogenerate' support\n# from myapp import mymodel\n# target_metadata = mymodel.Base.metadata\nfrom flask import current_app\nconfig.set_main_option('sqlalchemy.url',\n                       current_app.config.get('SQLALCHEMY_DATABASE_URI'))\ntarget_metadata = current_app.extensions['migrate'].db.metadata\n\n# other values from the config, defined by the needs of env.py,\n# can be acquired:\n# my_important_option = config.get_main_option(\"my_important_option\")\n# ... etc.\n\n\ndef run_migrations_offline():\n    \"\"\"Run migrations in 'offline' mode.\n\n    This configures the context with just a URL\n    and not an Engine, though an Engine is acceptable\n    here as well.  By skipping the Engine creation\n    we don't even need a DBAPI to be available.\n\n    Calls to context.execute() here emit the given string to the\n    script output.\n\n    \"\"\"\n    url = config.get_main_option(\"sqlalchemy.url\")\n    context.configure(url=url)\n\n    with context.begin_transaction():\n        context.run_migrations()\n\n\ndef run_migrations_online():\n    \"\"\"Run migrations in 'online' mode.\n\n    In this scenario we need to create an Engine\n    and associate a connection with the context.\n\n    \"\"\"\n\n    # this callback is used to prevent an auto-migration from being generated\n    # when there are no changes to the schema\n    # reference: http://alembic.readthedocs.org/en/latest/cookbook.html\n    def process_revision_directives(context, revision, directives):\n        if getattr(config.cmd_opts, 'autogenerate', False):\n            script = directives[0]\n            if script.upgrade_ops.is_empty():\n                directives[:] = []\n                logger.info('No changes in schema detected.')\n\n    engine = engine_from_config(config.get_section(config.config_ini_section),\n                                prefix='sqlalchemy.',\n                                poolclass=pool.NullPool)\n\n    connection = engine.connect()\n    context.configure(connection=connection,\n                      target_metadata=target_metadata,\n                      process_revision_directives=process_revision_directives,\n                      **current_app.extensions['migrate'].configure_args)\n\n    try:\n        with context.begin_transaction():\n            context.run_migrations()\n    finally:\n        connection.close()\n\nif context.is_offline_mode():\n    run_migrations_offline()\nelse:\n    run_migrations_online()\n"
  },
  {
    "path": "webpage/migrations/script.py.mako",
    "content": "\"\"\"${message}\n\nRevision ID: ${up_revision}\nRevises: ${down_revision | comma,n}\nCreate Date: ${create_date}\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n${imports if imports else \"\"}\n\n# revision identifiers, used by Alembic.\nrevision = ${repr(up_revision)}\ndown_revision = ${repr(down_revision)}\nbranch_labels = ${repr(branch_labels)}\ndepends_on = ${repr(depends_on)}\n\n\ndef upgrade():\n    ${upgrades if upgrades else \"pass\"}\n\n\ndef downgrade():\n    ${downgrades if downgrades else \"pass\"}\n"
  },
  {
    "path": "webpage/migrations/versions/236b966ecd2f_.py",
    "content": "\"\"\"empty message\n\nRevision ID: 236b966ecd2f\nRevises: \nCreate Date: 2017-05-03 14:27:37.853971\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n\n\n# revision identifiers, used by Alembic.\nrevision = '236b966ecd2f'\ndown_revision = None\nbranch_labels = None\ndepends_on = None\n\n\ndef upgrade():\n    # ### commands auto generated by Alembic - please adjust! ###\n    op.create_table('chatbot',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.Column('dataset', sa.String(length=64), nullable=True),\n    sa.Column('base_cell', sa.String(length=64), nullable=True),\n    sa.Column('encoder', sa.String(length=64), nullable=True),\n    sa.Column('decoder', sa.String(length=64), nullable=True),\n    sa.Column('learning_rate', sa.Float(), nullable=True),\n    sa.Column('num_layers', sa.Integer(), nullable=True),\n    sa.Column('state_size', sa.Integer(), nullable=True),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_index(op.f('ix_chatbot_name'), 'chatbot', ['name'], unique=True)\n    op.create_table('user',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('name', sa.String(length=64), nullable=True),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_index(op.f('ix_user_name'), 'user', ['name'], unique=True)\n    op.create_table('conversation',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('start_time', sa.DateTime(), nullable=True),\n    sa.Column('user_id', sa.Integer(), nullable=True),\n    sa.Column('chatbot_id', sa.Integer(), nullable=True),\n    sa.ForeignKeyConstraint(['chatbot_id'], ['chatbot.id'], ),\n    sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),\n    sa.PrimaryKeyConstraint('id')\n    )\n    op.create_index(op.f('ix_conversation_start_time'), 'conversation', ['start_time'], unique=True)\n    op.create_table('turn',\n    sa.Column('id', sa.Integer(), nullable=False),\n    sa.Column('user_message', sa.Text(), nullable=True),\n    sa.Column('chatbot_message', sa.Text(), nullable=True),\n    sa.Column('conversation_id', sa.Integer(), nullable=True),\n    sa.ForeignKeyConstraint(['conversation_id'], ['conversation.id'], ),\n    sa.PrimaryKeyConstraint('id')\n    )\n    # ### end Alembic commands ###\n\n\ndef downgrade():\n    # ### commands auto generated by Alembic - please adjust! ###\n    op.drop_table('turn')\n    op.drop_index(op.f('ix_conversation_start_time'), table_name='conversation')\n    op.drop_table('conversation')\n    op.drop_index(op.f('ix_user_name'), table_name='user')\n    op.drop_table('user')\n    op.drop_index(op.f('ix_chatbot_name'), table_name='chatbot')\n    op.drop_table('chatbot')\n    # ### end Alembic commands ###\n"
  },
  {
    "path": "webpage/requirements.txt",
    "content": "gunicorn==19.6.0\ntensorflow>=1.1.0\nalembic==0.9.1\nFlask==0.12.1\nFlask_Admin==1.5.0\nFlask_BasicAuth==0.2.0\nFlask_Cors==3.0.2\nFlask_Migrate==2.0.3\nFlask_Moment==0.5.1\nFlask_PageDown==0.2.2\nFlask_RESTful==0.3.5\nFlask_Script==2.0.5\nFlask_SQLAlchemy==2.1\nFlask_WTF==0.14.2\nnumpy==1.11.0\nSQLAlchemy==1.1.9\nWerkzeug==0.12.1\nWTForms==2.1\nprotobuf==3.3.0\nPyYAML==3.12\nsqlalchemy_migrate==0.11.0\npsycopg2==2.6.1\nwhitenoise==2.0.6\nrequests==2.9.1\n"
  },
  {
    "path": "webpage/runtime.txt",
    "content": "python-3.5.2\n"
  },
  {
    "path": "webpage/tests/__init__.py",
    "content": ""
  },
  {
    "path": "webpage/tests/test_database.py",
    "content": "\"\"\"Unit tests for the application.\"\"\"\n\nfrom flask import current_app\nfrom flask import request\nfrom deepchat import create_app, db\nfrom deepchat.models import User, Conversation, Chatbot, Turn\n\nimport sys\nimport unittest\nimport sqlite3\nimport sqlalchemy\n\n\nclass TestDatabase(unittest.TestCase):\n\n    def setUp(self):\n        \"\"\"Called before running a test.\"\"\"\n        self.app = create_app('testing')\n        self.app_context = self.app.app_context()\n        self.app_context.push()\n        db.create_all()\n\n    def tearDown(self):\n        \"\"\"Called after running a test.\"\"\"\n        db.session.remove()\n        db.drop_all()\n        self.app_context.pop()\n\n    def test_app_exists(self):\n        self.assertFalse(current_app is None)\n\n\n\n\n\n\n"
  },
  {
    "path": "webpage/tests/test_simple.py",
    "content": "\"\"\"Unit tests for the application.\"\"\"\n\nimport unittest\nfrom flask import current_app\nfrom deepchat import create_app, db\n\n\nclass TestSimple(unittest.TestCase):\n    \"\"\"Simple tests - ensuring the app can open/access database/etc.\"\"\"\n\n    def setUp(self):\n        \"\"\"Called before running a test.\"\"\"\n        self.app = create_app('testing')\n        self.app_context = self.app.app_context()\n        self.app_context.push()\n        db.create_all()\n\n    def tearDown(self):\n        \"\"\"Called after running a test.\"\"\"\n        db.session.remove()\n        db.drop_all()\n        self.app_context.pop()\n\n    def test_app_exists(self):\n        self.assertFalse(current_app is None)\n\n    def test_app_is_testing(self):\n        \"\"\"Ensure we can access the right config specifications.\"\"\"\n        self.assertTrue(current_app.config['TESTING'])\n"
  }
]